Add new setting values for increased view distances

Add 3 new setting values, increasing the distance at which a lower level of detail is used by factors of 1.6, 2.0 and 3.0 (default is 1.25). This allows players for which getting enough FPS is not an issue to reduce pop-in and improve the looks of tracks.

In local testing with a strong CPU and a weak GPU, the performance impact of increasing the view distances is small and well worth it, but this may vary from system to system. More testing is needed on different systems, but this suggests room to increase minimum, default and maximum values in future releases.

This patch also slightly changes the auto-computation of LoD distance, making the transition around a distance of 250 smoother.
This commit is contained in:
Alayan 2024-04-15 01:48:58 +02:00
parent 31bdb52bfd
commit 6cf094ab78
No known key found for this signature in database
4 changed files with 36 additions and 14 deletions

View File

@ -164,7 +164,7 @@
<div layout="horizontal-row" width="100%" proportion="1">
<label text="Geometry detail" I18N="Video settings" width="40%"/>
<spacer width="10" height="10"/>
<gauge id="geometry_detail" min_value="0" max_value="2" width="50%" />
<gauge id="geometry_detail" min_value="0" max_value="5" width="50%" />
</div>
<spacer height="10" width="10" />

View File

@ -194,25 +194,33 @@ void LODNode::OnRegisterSceneNode()
scene::ISceneNode::OnRegisterSceneNode();
}
/* Each model with LoD has specific distances beyond which it is rendered at a lower
* detail level. This function compute the distances associated with the various
* LoD levels for a given model.
* @param scale The model's scale*/
void LODNode::autoComputeLevel(float scale)
{
m_area *= scale;
// Amount of details based on user's input
float agressivity = 1.0;
if(UserConfigParams::m_geometry_level == 0) agressivity = 1.25;
if(UserConfigParams::m_geometry_level == 1) agressivity = 1.0;
if(UserConfigParams::m_geometry_level == 2) agressivity = 0.75;
if( UserConfigParams::m_geometry_level == 0) agressivity = 1.25;
else if(UserConfigParams::m_geometry_level == 1) agressivity = 1.0;
else if(UserConfigParams::m_geometry_level == 2) agressivity = 0.75;
else if(UserConfigParams::m_geometry_level == 3) agressivity = 1.6;
else if(UserConfigParams::m_geometry_level == 4) agressivity = 2.0;
else if(UserConfigParams::m_geometry_level == 5) agressivity = 3.0;
// First we try to estimate how far away we need to draw
float max_draw = 0.0;
max_draw = sqrtf((0.5 * m_area + 10) * 200) - 10;
// This first formula is equivalent to the one used up to STK 1.4
float max_draw = 10*(sqrtf(m_area + 20) - 1);
// If the draw distance is too big we artificially reduce it
// The formulas are still experimental and improvable.
if(max_draw > 250)
{
max_draw = 250 + (max_draw * 0.06);
}
max_draw = 230 + (max_draw * 0.08);
// This effecte is cumulative
if (max_draw > 500)
max_draw = 200 + (max_draw * 0.6);
max_draw *= agressivity;

View File

@ -76,11 +76,21 @@ void CustomVideoSettingsDialog::beforeAddingWidgets()
geometry_level->addLabel(_("Very Low"));
//I18N: Geometry level low : few details are displayed
geometry_level->addLabel(_("Low"));
//I18N: Geometry level high : everything is displayed
//I18N: Geometry level medium : everything is displayed, Level-of-Details distances are medium
geometry_level->addLabel(_("Medium"));
//I18N: Geometry level high : everything is displayed, Level-of-Details distances are high
geometry_level->addLabel(_("High"));
//I18N: Geometry level very high : everything is displayed, Level-of-Details distances are very high
geometry_level->addLabel(_("Very High"));
//I18N: Geometry level ultra : everything is displayed, Level-of-Details distances are extremely high
geometry_level->addLabel(_("Ultra"));
// This strange code is needed because a lower geometry level value
// used to be better. The values are now from best to worst: 5, 4, 3, 0, 1, 2.
// This keeps compatibility with 1.X installs.
// FIXME when profile-compatibility is not a concern.
geometry_level->setValue(
UserConfigParams::m_geometry_level == 2 ? 0 :
UserConfigParams::m_geometry_level == 0 ? 2 : 1);
UserConfigParams::m_geometry_level == 0 ? 2 : UserConfigParams::m_geometry_level);
SpinnerWidget* filtering = getWidget<SpinnerWidget>("image_quality");
filtering->addLabel(_("Very Low"));
@ -188,7 +198,10 @@ GUIEngine::EventPropagation CustomVideoSettingsDialog::processEvent(const std::s
const int val =
getWidget<SpinnerWidget>("geometry_detail")->getValue();
UserConfigParams::m_geometry_level = val == 2 ? 0 : val == 0 ? 2 : 1;
// This strange code is needed because a lower geometry level value
// used to be better. This keeps compatibility with 1.X installs.
UserConfigParams::m_geometry_level = val == 2 ? 0 :
val == 0 ? 2 : val;
int quality = getWidget<SpinnerWidget>("image_quality")->getValue();
user_config->saveConfig();

View File

@ -2357,7 +2357,8 @@ void Track::loadObjects(const XMLNode* root, const std::string& path,
{
int geo_level = 0;
node->get("geometry-level", &geo_level);
if (UserConfigParams::m_geometry_level + geo_level - 2 > 0 &&
if (UserConfigParams::m_geometry_level <= 2 &&
UserConfigParams::m_geometry_level + geo_level - 2 > 0 &&
!NetworkConfig::get()->isNetworking())
continue;
m_track_object_manager->add(*node, parent, model_def_loader, parent_library);