Showing the changes to interface/src/Menu.cpp (1 of 4 files). Show all
Unified · Split
| @@ -79,6 +79,9 @@ Menu::Menu() : · 78 unmodified lines | ||
| 79 | 79 | _lodToolsDialog(NULL), |
| 80 | 80 | _maxVoxels(DEFAULT_MAX_VOXELS_PER_SYSTEM), |
| 81 | 81 | _voxelSizeScale(DEFAULT_OCTREE_SIZE_SCALE), |
| 82 | + _automaticAvatarLOD(true), | |
| 83 | + _avatarLODDecreaseFPS(DEFAULT_ADJUST_AVATAR_LOD_DOWN_FPS), | |
| 84 | + _avatarLODIncreaseFPS(ADJUST_LOD_UP_FPS), | |
| 82 | 85 | _avatarLODDistanceMultiplier(DEFAULT_AVATAR_LOD_DISTANCE_MULTIPLIER), |
| 83 | 86 | _boundaryLevelAdjust(0), |
| 84 | 87 | _maxVoxelPacketsPerSecond(DEFAULT_MAX_VOXEL_PPS), |
| @@ -273,7 +276,7 @@ Menu::Menu() : · 188 unmodified lines | ||
| 273 | 276 | addCheckableActionToQMenuAndActionHash(renderOptionsMenu, MenuOption::Metavoxels, 0, true); |
| 274 | 277 | addCheckableActionToQMenuAndActionHash(renderOptionsMenu, MenuOption::BuckyBalls, 0, true); |
| 275 | 278 | addCheckableActionToQMenuAndActionHash(renderOptionsMenu, MenuOption::Particles, 0, true); |
| 276 | − | |
| 279 | + addActionToQMenuAndActionHash(renderOptionsMenu, MenuOption::LodTools, Qt::SHIFT | Qt::Key_L, this, SLOT(lodTools())); | |
| 277 | 280 | |
| 278 | 281 | QMenu* voxelOptionsMenu = developerMenu->addMenu("Voxel Options"); |
| 279 | 282 | |
| @@ -286,7 +289,6 @@ Menu::Menu() : · 6 unmodified lines | ||
| 286 | 289 | |
| 287 | 290 | addCheckableActionToQMenuAndActionHash(voxelOptionsMenu, MenuOption::VoxelTextures); |
| 288 | 291 | addCheckableActionToQMenuAndActionHash(voxelOptionsMenu, MenuOption::AmbientOcclusion); |
| 289 | − addActionToQMenuAndActionHash(voxelOptionsMenu, MenuOption::LodTools, Qt::SHIFT | Qt::Key_L, this, SLOT(lodTools())); | |
| 290 | 292 | addCheckableActionToQMenuAndActionHash(voxelOptionsMenu, MenuOption::DontFadeOnVoxelServerChanges); |
| 291 | 293 | addCheckableActionToQMenuAndActionHash(voxelOptionsMenu, MenuOption::DisableAutoAdjustLOD); |
| 292 | 294 | |
| @@ -415,6 +417,11 @@ void Menu::loadSettings(QSettings* settings) { · 122 unmodified lines | ||
| 415 | 417 | _maxVoxels = loadSetting(settings, "maxVoxels", DEFAULT_MAX_VOXELS_PER_SYSTEM); |
| 416 | 418 | _maxVoxelPacketsPerSecond = loadSetting(settings, "maxVoxelsPPS", DEFAULT_MAX_VOXEL_PPS); |
| 417 | 419 | _voxelSizeScale = loadSetting(settings, "voxelSizeScale", DEFAULT_OCTREE_SIZE_SCALE); |
| 420 | + _automaticAvatarLOD = settings->value("automaticAvatarLOD", true).toBool(); | |
| 421 | + _avatarLODDecreaseFPS = loadSetting(settings, "avatarLODDecreaseFPS", DEFAULT_ADJUST_AVATAR_LOD_DOWN_FPS); | |
| 422 | + _avatarLODIncreaseFPS = loadSetting(settings, "avatarLODIncreaseFPS", ADJUST_LOD_UP_FPS); | |
| 423 | + _avatarLODDistanceMultiplier = loadSetting(settings, "avatarLODDistanceMultiplier", | |
| 424 | + DEFAULT_AVATAR_LOD_DISTANCE_MULTIPLIER); | |
| 418 | 425 | _boundaryLevelAdjust = loadSetting(settings, "boundaryLevelAdjust", 0); |
| 419 | 426 | |
| 420 | 427 | settings->beginGroup("View Frustum Offset Camera"); |
| @@ -454,6 +461,10 @@ void Menu::saveSettings(QSettings* settings) { · 33 unmodified lines | ||
| 454 | 461 | settings->setValue("maxVoxels", _maxVoxels); |
| 455 | 462 | settings->setValue("maxVoxelsPPS", _maxVoxelPacketsPerSecond); |
| 456 | 463 | settings->setValue("voxelSizeScale", _voxelSizeScale); |
| 464 | + settings->setValue("automaticAvatarLOD", _automaticAvatarLOD); | |
| 465 | + settings->setValue("avatarLODDecreaseFPS", _avatarLODDecreaseFPS); | |
| 466 | + settings->setValue("avatarLODIncreaseFPS", _avatarLODIncreaseFPS); | |
| 467 | + settings->setValue("avatarLODDistanceMultiplier", _avatarLODDistanceMultiplier); | |
| 457 | 468 | settings->setValue("boundaryLevelAdjust", _boundaryLevelAdjust); |
| 458 | 469 | settings->beginGroup("View Frustum Offset Camera"); |
| 459 | 470 | settings->setValue("viewFrustumOffsetYaw", _viewFrustumOffset.yaw); |
| @@ -1165,27 +1176,27 @@ void Menu::autoAdjustLOD(float currentFPS) { · 705 unmodified lines | ||
| 1165 | 1176 | |
| 1166 | 1177 | quint64 now = usecTimestampNow(); |
| 1167 | 1178 | |
| 1168 | − const float ADJUST_AVATAR_LOD_DOWN_FPS = 30.0f; | |
| 1169 | 1179 | const quint64 ADJUST_AVATAR_LOD_DOWN_DELAY = 1000 * 1000; |
| 1170 | − if (_fastFPSAverage.getAverage() < ADJUST_AVATAR_LOD_DOWN_FPS) { | |
| 1171 | − if (now - _lastAvatarDetailDrop > ADJUST_AVATAR_LOD_DOWN_DELAY) { | |
| 1172 | − // attempt to lower the detail in proportion to the fps difference | |
| 1173 | − float targetFps = (ADJUST_AVATAR_LOD_DOWN_FPS + ADJUST_LOD_UP_FPS) * 0.5f; | |
| 1174 | − float averageFps = _fastFPSAverage.getAverage(); | |
| 1175 | − const float MAXIMUM_MULTIPLIER_SCALE = 2.0f; | |
| 1176 | − const float MAXIMUM_DISTANCE_MULTIPLIER = 15.0f; | |
| 1177 | − _avatarLODDistanceMultiplier = qMin(MAXIMUM_DISTANCE_MULTIPLIER, _avatarLODDistanceMultiplier * | |
| 1178 | − (averageFps < EPSILON ? MAXIMUM_MULTIPLIER_SCALE : qMin(MAXIMUM_MULTIPLIER_SCALE, targetFps / averageFps))); | |
| 1179 | − _lastAvatarDetailDrop = now; | |
| 1180 | + if (_automaticAvatarLOD) { | |
| 1181 | + if (_fastFPSAverage.getAverage() < _avatarLODDecreaseFPS) { | |
| 1182 | + if (now - _lastAvatarDetailDrop > ADJUST_AVATAR_LOD_DOWN_DELAY) { | |
| 1183 | + // attempt to lower the detail in proportion to the fps difference | |
| 1184 | + float targetFps = (_avatarLODDecreaseFPS + _avatarLODIncreaseFPS) * 0.5f; | |
| 1185 | + float averageFps = _fastFPSAverage.getAverage(); | |
| 1186 | + const float MAXIMUM_MULTIPLIER_SCALE = 2.0f; | |
| 1187 | + _avatarLODDistanceMultiplier = qMin(MAXIMUM_AVATAR_LOD_DISTANCE_MULTIPLIER, _avatarLODDistanceMultiplier * | |
| 1188 | + (averageFps < EPSILON ? MAXIMUM_MULTIPLIER_SCALE : | |
| 1189 | + qMin(MAXIMUM_MULTIPLIER_SCALE, targetFps / averageFps))); | |
| 1190 | + _lastAvatarDetailDrop = now; | |
| 1191 | + } | |
| 1192 | + } else if (_fastFPSAverage.getAverage() > _avatarLODIncreaseFPS) { | |
| 1193 | + // let the detail level creep slowly upwards | |
| 1194 | + const float DISTANCE_DECREASE_RATE = 0.05f; | |
| 1195 | + _avatarLODDistanceMultiplier = qMax(MINIMUM_AVATAR_LOD_DISTANCE_MULTIPLIER, | |
| 1196 | + _avatarLODDistanceMultiplier - DISTANCE_DECREASE_RATE); | |
| 1180 | 1197 | } |
| 1181 | − } else if (_fastFPSAverage.getAverage() > ADJUST_LOD_UP_FPS) { | |
| 1182 | − // let the detail level creep slowly upwards | |
| 1183 | − const float DISTANCE_DECREASE_RATE = 0.05f; | |
| 1184 | − const float MINIMUM_DISTANCE_MULTIPLIER = 0.1f; | |
| 1185 | − _avatarLODDistanceMultiplier = qMax(MINIMUM_DISTANCE_MULTIPLIER, | |
| 1186 | − _avatarLODDistanceMultiplier - DISTANCE_DECREASE_RATE); | |
| 1187 | 1198 | } |
| 1188 | − | |
| 1199 | + | |
| 1189 | 1200 | bool changed = false; |
| 1190 | 1201 | quint64 elapsed = now - _lastAdjust; |
| 1191 | 1202 | |