diff options
8 files changed, 144 insertions, 97 deletions
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index af2d44ea2b..f8487c020e 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -8464,7 +8464,7 @@ <key>Type</key> <string>F32</string> <key>Value</key> - <real>0.8</real> + <real>0.7</real> </map> <key>RenderShadowGaussian</key> @@ -14170,6 +14170,17 @@ <key>Value</key> <integer>0</integer> </map> + <key>MPRenderShadowOpti</key> + <map> + <key>Comment</key> + <string>Shadows Optimisations</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>S32</string> + <key>Value</key> + <integer>0</integer> + </map> <key>MPVCameraCollapsed</key> <map> <key>Comment</key> diff --git a/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl b/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl index a4f144faba..63ab0b9b38 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl @@ -438,9 +438,10 @@ float geometricOcclusion(PBRInfo pbrInputs) float NdotL = pbrInputs.NdotL; float NdotV = pbrInputs.NdotV; float r = pbrInputs.alphaRoughness; + float r2 = r * r; - float attenuationL = 2.0 * NdotL / (NdotL + sqrt(r * r + (1.0 - r * r) * (NdotL * NdotL))); - float attenuationV = 2.0 * NdotV / (NdotV + sqrt(r * r + (1.0 - r * r) * (NdotV * NdotV))); + float attenuationL = 2.0 * NdotL / (NdotL + sqrt(r2 + (1.0 - r2) * (NdotL * NdotL))); + float attenuationV = 2.0 * NdotV / (NdotV + sqrt(r2 + (1.0 - r2) * (NdotV * NdotV))); return attenuationL * attenuationV; } @@ -625,24 +626,11 @@ vec3 pbrBaseLight(vec3 diffuseColor, vec3 specularColor, float metallic, vec3 v, uniform vec4 waterPlane; uniform float waterSign; -// discard if given position in eye space is on the wrong side of the waterPlane according to waterSign void waterClip(vec3 pos) { - // TODO: make this less branchy - if (waterSign > 0.0) + if (((dot(pos.xyz, waterPlane.xyz) + waterPlane.w) * waterSign) < 0.0) { - if ((dot(pos.xyz, waterPlane.xyz) + waterPlane.w) < 0.0) - { - discard; - } - } - else - { - if ((dot(pos.xyz, waterPlane.xyz) + waterPlane.w) > 0.0) - { - discard; - } + discard; } - } diff --git a/indra/newview/app_settings/shaders/class1/deferred/luminanceF.glsl b/indra/newview/app_settings/shaders/class1/deferred/luminanceF.glsl index 4acab159cb..4331418b33 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/luminanceF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/luminanceF.glsl @@ -37,14 +37,10 @@ uniform sampler2D emissiveRect; uniform sampler2D normalMap; uniform float diffuse_luminance_scale; -float lum(vec3 col) -{ - vec3 l = vec3(0.2126, 0.7152, 0.0722); - return dot(l, col); -} void main() { + const vec3 l = vec3(0.2126, 0.7152, 0.0722); vec2 tc = vary_fragcoord*0.6+0.2; tc.y -= 0.1; // HACK - nudge exposure sample down a little bit to favor ground over sky vec3 c = texture(diffuseRect, tc).rgb; @@ -62,7 +58,7 @@ void main() c += texture(emissiveRect, tc).rgb; - float L = lum(c); + float L = dot(l, c); frag_color = vec4(max(L, 0.0)); } diff --git a/indra/newview/app_settings/shaders/class1/objects/simpleColorF.glsl b/indra/newview/app_settings/shaders/class1/objects/simpleColorF.glsl index dea76da5a5..30d70122cb 100644 --- a/indra/newview/app_settings/shaders/class1/objects/simpleColorF.glsl +++ b/indra/newview/app_settings/shaders/class1/objects/simpleColorF.glsl @@ -33,20 +33,9 @@ uniform float waterSign; void waterClip(vec3 pos) { - // TODO: make this less branchy - if (waterSign > 0) + if (((dot(pos.xyz, waterPlane.xyz) + waterPlane.w) * waterSign) < 0.0) { - if ((dot(pos.xyz, waterPlane.xyz) + waterPlane.w) < 0.0) - { - discard; - } - } - else - { - if ((dot(pos.xyz, waterPlane.xyz) + waterPlane.w) > 0.0) - { - discard; - } + discard; } } diff --git a/indra/newview/llfloaterpreferencesgraphicsadvanced.cpp b/indra/newview/llfloaterpreferencesgraphicsadvanced.cpp index a8a1e507a8..94b95b21c2 100644 --- a/indra/newview/llfloaterpreferencesgraphicsadvanced.cpp +++ b/indra/newview/llfloaterpreferencesgraphicsadvanced.cpp @@ -274,7 +274,9 @@ void LLFloaterPreferenceGraphicsAdvanced::setMaxNonImpostorsText(U32 value, LLTe void LLFloaterPreferenceGraphicsAdvanced::disableUnavailableSettings() { LLComboBox* ctrl_shadows = getChild<LLComboBox>("ShadowDetail"); + LLComboBox* ctrl_shadows_quality = getChild<LLComboBox>("MPShadowQuality"); LLTextBox* shadows_text = getChild<LLTextBox>("RenderShadowDetailText"); + LLTextBox* shadows_quality_text = getChild<LLTextBox>("RenderShadowQualityText"); LLCheckBoxCtrl* ctrl_ssao = getChild<LLCheckBoxCtrl>("UseSSAO"); LLCheckBoxCtrl* ctrl_dof = getChild<LLCheckBoxCtrl>("UseDoF"); LLSliderCtrl* sky = getChild<LLSliderCtrl>("SkyMeshDetail"); @@ -290,7 +292,9 @@ void LLFloaterPreferenceGraphicsAdvanced::disableUnavailableSettings() //deferred needs windlight, disable deferred ctrl_shadows->setEnabled(false); ctrl_shadows->setValue(0); + ctrl_shadows_quality->setEnabled(false); shadows_text->setEnabled(false); + shadows_quality_text->setEnabled(false); ctrl_ssao->setEnabled(false); ctrl_ssao->setValue(false); @@ -304,7 +308,9 @@ void LLFloaterPreferenceGraphicsAdvanced::disableUnavailableSettings() { ctrl_shadows->setEnabled(false); ctrl_shadows->setValue(0); + ctrl_shadows_quality->setEnabled(false); shadows_text->setEnabled(false); + shadows_quality_text->setEnabled(false); ctrl_ssao->setEnabled(false); ctrl_ssao->setValue(false); @@ -325,7 +331,9 @@ void LLFloaterPreferenceGraphicsAdvanced::disableUnavailableSettings() { ctrl_shadows->setEnabled(false); ctrl_shadows->setValue(0); + ctrl_shadows_quality->setEnabled(false); shadows_text->setEnabled(false); + shadows_quality_text->setEnabled(false); } // Vintage mode @@ -355,7 +363,9 @@ void LLFloaterPreferenceGraphicsAdvanced::refreshEnabledState() LLCheckBoxCtrl* ctrl_ssao = getChild<LLCheckBoxCtrl>("UseSSAO"); LLCheckBoxCtrl* ctrl_dof = getChild<LLCheckBoxCtrl>("UseDoF"); LLComboBox* ctrl_shadow = getChild<LLComboBox>("ShadowDetail"); + LLComboBox* ctrl_shadow_quality = getChild<LLComboBox>("MPShadowQuality"); LLTextBox* shadow_text = getChild<LLTextBox>("RenderShadowDetailText"); + LLTextBox* shadows_quality_text = getChild<LLTextBox>("RenderShadowQualityText"); // note, okay here to get from ctrl_deferred as it's twin, ctrl_deferred2 will alway match it enabled = enabled && LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferredSSAO");// && ctrl_deferred->get(); @@ -368,7 +378,9 @@ void LLFloaterPreferenceGraphicsAdvanced::refreshEnabledState() enabled = enabled && LLFeatureManager::getInstance()->isFeatureAvailable("RenderShadowDetail"); ctrl_shadow->setEnabled(enabled); + ctrl_shadow_quality->setEnabled(enabled); shadow_text->setEnabled(enabled); + shadows_quality_text->setEnabled(enabled); // Hardware settings diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index b40c9fa6db..b9fe9cd343 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -144,6 +144,7 @@ U32 LLPipeline::RenderFSAAType; U32 LLPipeline::RenderResolutionDivisor; bool LLPipeline::RenderUIBuffer; S32 LLPipeline::RenderShadowDetail; +S32 LLPipeline::MPRenderShadowOpti; S32 LLPipeline::RenderShadowSplits; bool LLPipeline::RenderDeferredSSAO; F32 LLPipeline::RenderShadowResolutionScale; @@ -526,6 +527,7 @@ void LLPipeline::init() connectRefreshCachedSettingsSafe("RenderResolutionDivisor"); connectRefreshCachedSettingsSafe("RenderUIBuffer"); connectRefreshCachedSettingsSafe("RenderShadowDetail"); + connectRefreshCachedSettingsSafe("MPRenderShadowOpti"); connectRefreshCachedSettingsSafe("RenderShadowSplits"); connectRefreshCachedSettingsSafe("RenderDeferredSSAO"); connectRefreshCachedSettingsSafe("RenderShadowResolutionScale"); @@ -729,7 +731,9 @@ void LLPipeline::resizeShadowTexture() { releaseSunShadowTargets(); releaseSpotShadowTargets(); - allocateShadowBuffer(mRT->width, mRT->height); + GLuint resX = gViewerWindow->getWorldViewWidthRaw(); + GLuint resY = gViewerWindow->getWorldViewHeightRaw(); + allocateShadowBuffer(resX, resY); gResizeShadowTexture = false; } @@ -946,7 +950,7 @@ bool LLPipeline::allocateShadowBuffer(U32 resX, U32 resY) LL_PROFILE_ZONE_SCOPED_CATEGORY_DISPLAY; S32 shadow_detail = RenderShadowDetail; - F32 scale = gCubeSnapshot ? 1.0f : llmax(0.f, RenderShadowResolutionScale); // Don't scale probe shadow maps + F32 scale = gCubeSnapshot ? 1.0f : llmax(0.5f, RenderShadowResolutionScale); // Don't scale probe shadow maps U32 sun_shadow_map_width = BlurHappySize(resX, scale); U32 sun_shadow_map_height = BlurHappySize(resY, scale); @@ -1058,6 +1062,7 @@ void LLPipeline::refreshCachedSettings() RenderResolutionDivisor = gSavedSettings.getU32("RenderResolutionDivisor"); RenderUIBuffer = gSavedSettings.getBOOL("RenderUIBuffer"); RenderShadowDetail = gSavedSettings.getS32("RenderShadowDetail"); + MPRenderShadowOpti = gSavedSettings.getS32("MPRenderShadowOpti"); RenderShadowSplits = gSavedSettings.getS32("RenderShadowSplits"); RenderDeferredSSAO = gSavedSettings.getBOOL("RenderDeferredSSAO"); RenderShadowResolutionScale = gSavedSettings.getF32("RenderShadowResolutionScale"); @@ -1450,7 +1455,7 @@ void LLPipeline::createLUTBuffers() } U32 pix_format = GL_R16F; -#if LL_DARWIN +#if 0 && LL_DARWIN // Need to work around limited precision with 10.6.8 and older drivers // pix_format = GL_R32F; @@ -3968,12 +3973,10 @@ void LLPipeline::renderGeomDeferred(LLCamera& camera, bool do_occlusion) llassert(!sRenderingHUDs); -#if GL_VERSION_1_1 if (gUseWireframe) { glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); } -#endif if (&camera == LLViewerCamera::getInstance()) { // a bit hacky, this is the start of the main render frame, figure out delta between last modelview matrix and @@ -4093,12 +4096,10 @@ void LLPipeline::renderGeomDeferred(LLCamera& camera, bool do_occlusion) } // Tracy ZoneScoped -#if GL_VERSION_1_1 if (gUseWireframe) { glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); } -#endif } // Render all of our geometry that's required after our deferred pass. @@ -4108,12 +4109,10 @@ void LLPipeline::renderGeomPostDeferred(LLCamera& camera) LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWPOOL; LL_PROFILE_GPU_ZONE("renderGeomPostDeferred"); -#if GL_VERSION_1_1 if (gUseWireframe) { glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); } -#endif U32 cur_type = 0; @@ -4241,12 +4240,10 @@ void LLPipeline::renderGeomPostDeferred(LLCamera& camera) renderDebug(); } -#if GL_VERSION_1_1 if (gUseWireframe) { glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); } -#endif } void LLPipeline::renderGeomShadow(LLCamera& camera) @@ -4339,9 +4336,7 @@ void LLPipeline::renderPhysicsDisplay() gGL.flush(); gDebugProgram.bind(); -#if GL_VERSION_1_1 LLGLEnable(GL_POLYGON_OFFSET_LINE); -#endif glPolygonOffset(3.f, 3.f); glLineWidth(3.f); LLGLEnable blend(GL_BLEND); @@ -4357,12 +4352,10 @@ void LLPipeline::renderPhysicsDisplay() bool wireframe = (pass == 2); -#if GL_VERSION_1_1 if (wireframe) { glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); } -#endif for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin(); iter != LLWorld::getInstance()->getRegionList().end(); ++iter) @@ -4382,12 +4375,10 @@ void LLPipeline::renderPhysicsDisplay() } gGL.flush(); -#if GL_VERSION_1_1 if (wireframe) { glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); } -#endif } glLineWidth(1.f); gDebugProgram.unbind(); @@ -4467,9 +4458,7 @@ void LLPipeline::renderDebug() glClearColor(clearColor.mV[0],clearColor.mV[1],clearColor.mV[2],0); glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); // no stencil -- deprecated | GL_STENCIL_BUFFER_BIT); gGL.setColorMask(true, false); -#if GL_VERSION_1_1 glPolygonMode( GL_FRONT_AND_BACK, GL_FILL ); -#endif } //NavMesh @@ -4499,9 +4488,7 @@ void LLPipeline::renderDebug() gPathfindingProgram.bind(); gGL.flush(); -#if GL_VERSION_1_1 glPolygonMode( GL_FRONT_AND_BACK, GL_FILL ); -#endif glLineWidth(1.0f); gGL.flush(); } @@ -4558,9 +4545,8 @@ void LLPipeline::renderDebug() LLGLDisable cull(i >= 2 ? GL_CULL_FACE : 0); gGL.flush(); -#if GL_VERSION_1_1 + glPolygonMode( GL_FRONT_AND_BACK, GL_FILL ); -#endif //get rid of some z-fighting LLGLEnable polyOffset(GL_POLYGON_OFFSET_FILL); @@ -4585,10 +4571,8 @@ void LLPipeline::renderDebug() gGL.flush(); } -#if GL_VERSION_1_1 LLGLEnable lineOffset(GL_POLYGON_OFFSET_LINE); glPolygonMode( GL_FRONT_AND_BACK, GL_LINE ); -#endif F32 offset = gSavedSettings.getF32("PathfindingLineOffset"); @@ -4608,14 +4592,10 @@ void LLPipeline::renderDebug() } else { -#if GL_VERSION_1_1 glPolygonMode( GL_FRONT_AND_BACK, GL_FILL ); -#endif gPathfindingProgram.uniform1f(sAmbiance, ambiance); llPathingLibInstance->renderNavMeshShapesVBO( render_order[i] ); -#if GL_VERSION_1_1 glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); -#endif } } @@ -4632,9 +4612,7 @@ void LLPipeline::renderDebug() glLineWidth(1.f); } -#if GL_VERSION_1_1 glPolygonMode( GL_FRONT_AND_BACK, GL_FILL ); -#endif } } } @@ -4645,9 +4623,7 @@ void LLPipeline::renderDebug() { //render navmesh xray F32 ambiance = gSavedSettings.getF32("PathfindingAmbiance"); -#if GL_VERSION_1_1 LLGLEnable lineOffset(GL_POLYGON_OFFSET_LINE); -#endif LLGLEnable polyOffset(GL_POLYGON_OFFSET_FILL); F32 offset = gSavedSettings.getF32("PathfindingLineOffset"); @@ -4664,14 +4640,10 @@ void LLPipeline::renderDebug() if (gSavedSettings.getBOOL("PathfindingXRayWireframe")) { //draw hidden wireframe as darker and less opaque -#if GL_VERSION_1_1 glPolygonMode( GL_FRONT_AND_BACK, GL_LINE ); -#endif gPathfindingProgram.uniform1f(sAmbiance, 1.f); llPathingLibInstance->renderNavMesh(); -#if GL_VERSION_1_1 glPolygonMode( GL_FRONT_AND_BACK, GL_FILL ); -#endif } else { @@ -4711,9 +4683,7 @@ void LLPipeline::renderDebug() gGL.getTexUnit(0)->bind(LLViewerFetchedTexture::sWhiteImagep, true); -#if GL_VERSION_1_1 glPointSize(8.f); -#endif LLGLDepthTest depth(GL_TRUE, GL_TRUE, GL_ALWAYS); gGL.begin(LLRender::POINTS); @@ -4738,9 +4708,7 @@ void LLPipeline::renderDebug() } gGL.end(); gGL.flush(); -#if GL_VERSION_1_1 glPointSize(1.f); -#endif } // Debug stuff. @@ -4944,9 +4912,7 @@ void LLPipeline::renderDebug() { //render visible point cloud gGL.flush(); -#if GL_VERSION_1_1 glPointSize(8.f); -#endif gGL.begin(LLRender::POINTS); F32* c = col+i*4; @@ -4960,9 +4926,7 @@ void LLPipeline::renderDebug() gGL.end(); gGL.flush(); -#if GL_VERSION_1_1 glPointSize(1.f); -#endif LLVector3* ext = mShadowExtents[i]; LLVector3 pos = (ext[0]+ext[1])*0.5f; @@ -7584,7 +7548,8 @@ void LLPipeline::applyFXAA(LLRenderTarget* src, LLRenderTarget* dst) void LLPipeline::generateSMAABuffers(LLRenderTarget* src) { llassert(!gCubeSnapshot); - bool multisample = RenderFSAAType == 2 && gSMAAEdgeDetectProgram[0].isComplete() && mFXAAMap.isComplete() && mSMAABlendBuffer.isComplete(); + if(RenderFSAAType < 2) return; + bool multisample = gSMAAEdgeDetectProgram[0].isComplete() && mFXAAMap.isComplete() && mSMAABlendBuffer.isComplete(); // Present everything. if (multisample) @@ -7702,7 +7667,13 @@ void LLPipeline::generateSMAABuffers(LLRenderTarget* src) void LLPipeline::applySMAA(LLRenderTarget* src, LLRenderTarget* dst) { llassert(!gCubeSnapshot); - bool multisample = RenderFSAAType == 2 && gSMAAEdgeDetectProgram[0].isComplete() && mFXAAMap.isComplete() && mSMAABlendBuffer.isComplete(); + + bool multisample = false; + + if(RenderFSAAType > 1) + { + multisample = gSMAAEdgeDetectProgram[0].isComplete() && mFXAAMap.isComplete() && mSMAABlendBuffer.isComplete(); + } // Present everything. if (multisample) @@ -9325,13 +9296,9 @@ void LLPipeline::bindReflectionProbes(LLGLSLShader& shader) return; } -#if GL_VERSION_4_0 S32 channel = shader.enableTexture(LLShaderMgr::REFLECTION_PROBES, LLTexUnit::TT_CUBE_MAP_ARRAY); -#else - S32 channel; -#endif bool bound = false; -#if GL_VERSION_4_0 + if (channel > -1 && mReflectionMapManager.mTexture.notNull()) { mReflectionMapManager.mTexture->bind(channel); @@ -9362,7 +9329,6 @@ void LLPipeline::bindReflectionProbes(LLGLSLShader& shader) setEnvMat(shader); } -#endif // reflection probe shaders generally sample the scene map as well for SSR channel = shader.enableTexture(LLShaderMgr::SCENE_MAP); @@ -9528,7 +9494,6 @@ void LLPipeline::renderShadow(const glm::mat4& view, const glm::mat4& proj, LLCa } }; - LLVertexBuffer::unbind(); for (int j = 0; j < 2; ++j) // 0 -- static, 1 -- rigged { @@ -9570,6 +9535,7 @@ void LLPipeline::renderShadow(const glm::mat4& view, const glm::mat4& proj, LLCa renderGeomShadow(shadow_cam); } + if(MPRenderShadowOpti < 3) { LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("shadow alpha"); LL_PROFILE_GPU_ZONE("shadow alpha"); @@ -9900,7 +9866,7 @@ public: void LLPipeline::generateSunShadow(LLCamera& camera) { - if (!sRenderDeferred || RenderShadowDetail <= 0) + if (!sRenderDeferred || RenderShadowDetail <= 0 || (MPRenderShadowOpti > 0 && gCubeSnapshot)) { return; } @@ -10182,8 +10148,12 @@ void LLPipeline::generateSunShadow(LLCamera& camera) std::vector<LLVector3> fp; + U32 splits = 3; + if(MPRenderShadowOpti == 1) splits = 2; + else if(MPRenderShadowOpti >= 2) splits = 1; + if (!gPipeline.getVisiblePointCloud(shadow_cam, min, max, fp, lightDir) - || j > RenderShadowSplits) + || j > splits) { //no possible shadow receivers if (!gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_SHADOW_FRUSTA) && !gCubeSnapshot) diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h index 315e38ed8c..da9b8189e2 100644 --- a/indra/newview/pipeline.h +++ b/indra/newview/pipeline.h @@ -702,7 +702,7 @@ public: LLRenderTarget shadow[4]; }; - // main full resoltuion render target + // main full resolution render target RenderTargetPack mMainRT; // auxillary 512x512 render target pack @@ -1011,6 +1011,7 @@ public: static U32 RenderResolutionDivisor; static bool RenderUIBuffer; static S32 RenderShadowDetail; + static S32 MPRenderShadowOpti; static S32 RenderShadowSplits; static bool RenderDeferredSSAO; static F32 RenderShadowResolutionScale; diff --git a/indra/newview/skins/default/xui/en/floater_preferences_graphics_advanced.xml b/indra/newview/skins/default/xui/en/floater_preferences_graphics_advanced.xml index d6cb3928cc..88d6ae1bc2 100644 --- a/indra/newview/skins/default/xui/en/floater_preferences_graphics_advanced.xml +++ b/indra/newview/skins/default/xui/en/floater_preferences_graphics_advanced.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <floater - height="452" + height="492" layout="topleft" name="prefs_graphics_advanced" help_topic="Preferences_Graphics_Advanced" @@ -744,7 +744,7 @@ text_readonly_color="LabelDisabledColor" top_delta="22" width="128"> - Shadows: + Shadows source: </text> <combo_box control_name="RenderShadowDetail" @@ -768,6 +768,86 @@ value="2"/> </combo_box> + <text + type="string" + length="1" + follows="left|top" + height="16" + layout="topleft" + left="420" + name="RenderShadowQualityText" + text_readonly_color="LabelDisabledColor" + top_delta="22" + width="128"> + Shadows Optimisations + </text> + + <combo_box + control_name="MPRenderShadowOpti" + height="18" + layout="topleft" + left_delta="130" + top_delta="0" + name="MPShadowQuality" + width="150"> + <combo_box.item + label="No optimisation" + name="0" + value="0"/> + <combo_box.item + label="Medium" + name="1" + value="1"/> + <combo_box.item + label="Faster" + name="2" + value="2"/> + <combo_box.item + label="Fastest" + name="3" + value="3"/> + </combo_box> + + <text + type="string" + length="1" + follows="left|top" + height="16" + layout="topleft" + left="420" + name="RenderShadowResolutionScaleText" + text_readonly_color="LabelDisabledColor" + top_delta="22" + width="128"> + Shadows Resolution + </text> + + <combo_box + control_name="RenderShadowResolutionScale" + height="18" + layout="topleft" + left_delta="130" + top_delta="0" + name="RenderShadowResolutionScale" + width="150"> + <combo_box.item + label="Default" + name="Default" + value="1.0"/> + <combo_box.item + label="High" + name="High" + value="1.5"/> + <combo_box.item + label="Ultra" + name="Ultra" + value="2.0"/> + <combo_box.item + label="Crazy" + name="Crazy" + value="3.0"/> + </combo_box> + <check_box control_name="RenderScreenSpaceReflections" height="16" @@ -1095,7 +1175,7 @@ layout="topleft" left="13" name="horiz_border" - top="415" + top="448" top_delta="5" width="774"/> <button |