# Conflicts:
#	indra/newview/CMakeLists.txt
#	indra/newview/app_settings/settings.xml
#	indra/newview/featuretable.txt
#	indra/newview/featuretable_mac.txt
#	indra/newview/llfloaterpreference.cpp
#	indra/newview/llviewerdisplay.cpp
#	indra/newview/skins/default/xui/en/floater_preferences_graphics_advanced.xml
master
Ansariel 2022-10-13 13:33:56 +02:00
commit b80fefa0ab
36 changed files with 175 additions and 850 deletions

View File

@ -487,7 +487,7 @@ inline const LLColor3 srgbColor3(const LLColor3 &a) {
return srgbColor;
}
inline const LLColor3 linearColor3(const F32* v) {
inline const LLColor3 linearColor3p(const F32* v) {
LLColor3 linearColor;
linearColor.mV[0] = sRGBtoLinear(v[0]);
linearColor.mV[1] = sRGBtoLinear(v[1]);
@ -498,12 +498,12 @@ inline const LLColor3 linearColor3(const F32* v) {
template<class T>
inline const LLColor3 linearColor3(const T& a) {
return linearColor3(a.mV);
return linearColor3p(a.mV);
}
template<class T>
inline const LLVector3 linearColor3v(const T& a) {
return LLVector3(linearColor3(a.mV).mV);
return LLVector3(linearColor3p(a.mV).mV);
}
#endif

View File

@ -1368,6 +1368,7 @@ void LLShaderMgr::initAttribsAndUniforms()
mReservedUniforms.push_back("specular");
mReservedUniforms.push_back("lightExp");
mReservedUniforms.push_back("waterFogColor");
mReservedUniforms.push_back("waterFogColorLinear");
mReservedUniforms.push_back("waterFogDensity");
mReservedUniforms.push_back("waterFogKS");
mReservedUniforms.push_back("refScale");

View File

@ -210,6 +210,7 @@ public:
WATER_SPECULAR, // "specular"
WATER_SPECULAR_EXP, // "lightExp"
WATER_FOGCOLOR, // "waterFogColor"
WATER_FOGCOLOR_LINEAR, // "waterFogColorLinear"
WATER_FOGDENSITY, // "waterFogDensity"
WATER_FOGKS, // "waterFogKS"
WATER_REFSCALE, // "refScale"

View File

@ -2116,14 +2116,11 @@ set(viewer_APPSETTINGS_FILES
app_settings/grass.xml
app_settings/grids.xml
app_settings/growl_notifications.xml
app_settings/high_graphics.xml
app_settings/ignorable_dialogs.xml
app_settings/key_bindings.xml
app_settings/keywords.ini
app_settings/keywords_lsl_default.xml
app_settings/logcontrol.xml
app_settings/low_graphics.xml
app_settings/mid_graphics.xml
app_settings/posestand.xml
app_settings/quick_preferences.xml
app_settings/scriptlibrary_aa.xml
@ -2141,7 +2138,6 @@ set(viewer_APPSETTINGS_FILES
app_settings/std_bump.ini
#app_settings/toolbars.xml FS:AO moved to skins
app_settings/trees.xml
app_settings/ultra_graphics.xml
app_settings/viewerart.xml
${CMAKE_SOURCE_DIR}/../etc/message.xml
${CMAKE_SOURCE_DIR}/../scripts/messages/message_template.msg

View File

@ -33,7 +33,6 @@
<string>RenderLocalLights</string>
<string>RenderMaxPartCount</string>
<string>RenderQualityPerformance</string>
<string>RenderReflectionDetail</string>
<string>RenderReflectionProbeDetail</string>
<string>RenderShaderLightingMaxLevel</string>
<string>RenderShadowDetail</string>

View File

@ -1,41 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<settings version = "101">
<!--NO SHADERS-->
<RenderAvatarCloth value="FALSE"/>
<!--Default for now-->
<RenderAvatarLODFactor value="1.0"/>
<!--Default for now-->
<RenderAvatarPhysicsLODFactor value="0.9"/>
<!--Short Range-->
<RenderFarClip value="128"/>
<!--Default for now-->
<RenderFlexTimeFactor value="1"/>
<!--256... but they do not use this-->
<RenderGlowResolutionPow value="9"/>
<!--Low number-->
<RenderMaxPartCount value="4096"/>
<!--bump okay-->
<RenderObjectBump value="TRUE"/>
<!--NO SHADERS-->
<RenderReflectionDetail value="2"/>
<!--Simple-->
<RenderTerrainDetail value="1"/>
<!--Default for now-->
<RenderTerrainLODFactor value="2"/>
<!--Default for now-->
<RenderTreeLODFactor value="0.5"/>
<!--Avater Impostors and Visual Muting Limits-->
<RenderAvatarMaxNonImpostors value="20"/>
<RenderAvatarMaxComplexity value="350000"/>
<RenderAutoMuteSurfaceAreaLimit value="1250.0"/>
<!--Default for now-->
<RenderVolumeLODFactor value="1.125"/>
<!--NO SHADERS-->
<WindLightUseAtmosShaders value="TRUE"/>
<!--Deferred Shading-->
<RenderDeferred value="FALSE"/>
<!--SSAO Disabled-->
<RenderDeferredSSAO value="FALSE"/>
<!--Sun Shadows-->
<RenderShadowDetail value="0"/>
</settings>

View File

@ -1,41 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<settings version = "101">
<!--NO SHADERS-->
<RenderAvatarCloth value="FALSE"/>
<!--Default for now-->
<RenderAvatarLODFactor value="0.5"/>
<!--Default for now-->
<RenderAvatarPhysicsLODFactor value="0.0"/>
<!--Short Range-->
<RenderFarClip value="64"/>
<!--Default for now-->
<RenderFlexTimeFactor value="0.5"/>
<!--256... but they do not use this-->
<RenderGlowResolutionPow value="8"/>
<!--Low number-->
<RenderMaxPartCount value="1024"/>
<!--bump okay-->
<RenderObjectBump value="FALSE"/>
<!--NO SHADERS-->
<RenderReflectionDetail value="0"/>
<!--Simple-->
<RenderTerrainDetail value="0"/>
<!--Default for now-->
<RenderTerrainLODFactor value="1.0"/>
<!--Default for now-->
<RenderTreeLODFactor value="0.5"/>
<!--Avater Impostors and Visual Muting Limits-->
<RenderAvatarMaxNonImpostors value="12"/>
<RenderAvatarMaxComplexity value="80000"/>
<RenderAutoMuteSurfaceAreaLimit value="750.0"/>
<!--Default for now-->
<RenderVolumeLODFactor value="1.125"/>
<!--NO SHADERS-->
<WindLightUseAtmosShaders value="FALSE"/>
<!--No Deferred Shading-->
<RenderDeferred value="FALSE"/>
<!--SSAO Disabled-->
<RenderDeferredSSAO value="FALSE"/>
<!--No Shadows-->
<RenderShadowDetail value="0"/>
</settings>

View File

@ -1,41 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<settings version = "101">
<!--NO SHADERS-->
<RenderAvatarCloth value="FALSE"/>
<!--Default for now-->
<RenderAvatarLODFactor value="0.5"/>
<!--Default for now-->
<RenderAvatarPhysicsLODFactor value="0.75"/>
<!--Short Range-->
<RenderFarClip value="96"/>
<!--Default for now-->
<RenderFlexTimeFactor value="1"/>
<!--256... but they do not use this-->
<RenderGlowResolutionPow value="8"/>
<!--Low number-->
<RenderMaxPartCount value="2048"/>
<!--bump okay-->
<RenderObjectBump value="TRUE"/>
<!--NO SHADERS-->
<RenderReflectionDetail value="0"/>
<!--Simple-->
<RenderTerrainDetail value="1"/>
<!--Default for now-->
<RenderTerrainLODFactor value="1.0"/>
<!--Default for now-->
<RenderTreeLODFactor value="0.5"/>
<!--Avater Impostors and Visual Muting Limits-->
<RenderAvatarMaxNonImpostors value="18"/>
<RenderAvatarMaxComplexity value="150000"/>
<RenderAutoMuteSurfaceAreaLimit value="1000.0"/>
<!--Default for now-->
<RenderVolumeLODFactor value="1.125"/>
<!--NO SHADERS-->
<WindLightUseAtmosShaders value="FALSE"/>
<!--No Deferred Shading-->
<RenderDeferred value="FALSE"/>
<!--SSAO Disabled-->
<RenderDeferredSSAO value="FALSE"/>
<!--No Shadows-->
<RenderShadowDetail value="0"/>
</settings>

View File

@ -13392,7 +13392,7 @@ Change of this parameter will affect the layout of buttons in notification toast
<key>RenderReflectionDetail</key>
<map>
<key>Comment</key>
<string>Detail of reflection render pass.</string>
<string>DEPRECATED -- use RenderTransparentWater and RenderReflectionProbeDetail -- Detail of reflection render pass.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@ -26079,17 +26079,6 @@ Change of this parameter will affect the layout of buttons in notification toast
<key>Value</key>
<integer>0</integer>
</map>
<key>FSUserTargetReflections</key>
<map>
<key>Comment</key>
<string>Set by auto tune floater on build</string>
<key>Persist</key>
<integer>0</integer>
<key>Type</key>
<string>S32</string>
<key>Value</key>
<integer>4</integer>
</map>
<key>FSReportRegionRestartToChat</key>
<map>
<key>Comment</key>

View File

@ -72,7 +72,7 @@ uniform vec3 light_diffuse[8];
void waterClip(vec3 pos);
#ifdef WATER_FOG
vec4 applyWaterFogView(vec3 pos, vec4 color);
vec4 applyWaterFogViewLinear(vec3 pos, vec4 color);
#endif
vec3 srgb_to_linear(vec3 c);
@ -293,7 +293,7 @@ void main()
#endif // !defined(LOCAL_LIGHT_KILL)
#ifdef WATER_FOG
color = applyWaterFogView(pos.xyz, color);
color = applyWaterFogViewLinear(pos.xyz, color);
#endif // WATER_FOG
#endif // #else // FOR_IMPOSTOR

View File

@ -26,10 +26,12 @@
out vec4 frag_color;
uniform sampler2D diffuseMap;
uniform sampler2D bumpMap;
uniform sampler2D bumpMap;
#ifdef TRANSPARENT_WATER
uniform sampler2D screenTex;
uniform sampler2D refTex;
uniform sampler2D screenDepth;
#endif
uniform vec4 fogCol;
uniform vec3 lightDir;
@ -43,6 +45,7 @@ uniform float kd;
uniform vec4 waterPlane;
uniform vec3 eyeVec;
uniform vec4 waterFogColor;
uniform vec3 waterFogColorLinear;
uniform float waterFogKS;
uniform vec2 screenRes;
@ -57,8 +60,8 @@ vec4 applyWaterFogViewLinear(vec3 pos, vec4 color);
void main()
{
vec4 color;
//get detail normals
//get detail normals
vec3 wave1 = texture2D(bumpMap, vec2(refCoord.w, view.w)).xyz*2.0-1.0;
vec3 wave2 = texture2D(bumpMap, littleWave.xy).xyz*2.0-1.0;
vec3 wave3 = texture2D(bumpMap, littleWave.zw).xyz*2.0-1.0;
@ -67,8 +70,12 @@ void main()
//figure out distortion vector (ripply)
vec2 distort = (refCoord.xy/refCoord.z) * 0.5 + 0.5;
distort = distort+wavef.xy*refScale;
#ifdef TRANSPARENT_WATER
vec4 fb = texture2D(screenTex, distort);
#else
vec4 fb = vec4(waterFogColorLinear, 0.0);
#endif
frag_color = applyWaterFogViewLinear(vary_position, fb);
}

View File

@ -55,8 +55,10 @@ vec3 pbrPunctual(vec3 diffuseColor, vec3 specularColor,
uniform sampler2D bumpMap;
uniform sampler2D bumpMap2;
uniform float blend_factor;
#ifdef TRANSPARENT_WATER
uniform sampler2D screenTex;
uniform sampler2D screenDepth;
#endif
uniform sampler2D refTex;
@ -73,6 +75,7 @@ uniform float fresnelScale;
uniform float fresnelOffset;
uniform float blurMultiplier;
uniform vec4 waterFogColor;
uniform vec3 waterFogColorLinear;
//bigWave is (refCoord.w, view.w);
@ -174,6 +177,7 @@ void main()
vec2 distort2 = distort + waver.xy * refScale / max(dmod * df1, 1.0);
distort2 = clamp(distort2, vec2(0), vec2(0.99));
#ifdef TRANSPARENT_WATER
vec4 fb = texture2D(screenTex, distort2);
float depth = texture2D(screenDepth, distort2).r;
vec3 refPos = getPositionWithNDC(vec3(distort2*2.0-vec2(1.0), depth*2.0-1.0));
@ -188,6 +192,9 @@ void main()
}
fb = applyWaterFogViewLinear(refPos, fb);
#else
vec4 fb = vec4(waterFogColorLinear.rgb, 0.0);
#endif
vec3 sunlit;
vec3 amblit;

View File

@ -1,42 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<settings version = "101">
<!--NO SHADERS-->
<RenderAvatarCloth value="TRUE"/>
<!--Default for now-->
<RenderAvatarLODFactor value="1.0"/>
<!--Default for now-->
<RenderAvatarPhysicsLODFactor value="1.0"/>
<!--Short Range-->
<RenderFarClip value="256"/>
<!--Default for now-->
<RenderFlexTimeFactor value="1"/>
<!--256... but they do not use this-->
<RenderGlowResolutionPow value="9"/>
<!--Low number-->
<RenderMaxPartCount value="4096"/>
<!--bump okay-->
<RenderObjectBump value="TRUE"/>
<!--NO SHADERS-->
<RenderReflectionDetail value="4"/>
<!--Simple-->
<RenderTerrainDetail value="1"/>
<!--Default for now-->
<RenderTerrainLODFactor value="2.0"/>
<!--Default for now-->
<RenderTreeLODFactor value="1.0"/>
<!--Avater Impostors and Visual Muting Limits (real defaults set
based on default graphics setting -->
<RenderAvatarMaxNonImpostors value="0"/>
<RenderAvatarMaxComplexity value="350000"/>
<RenderAutoMuteSurfaceAreaLimit value="1500.0"/>
<!--Default for now-->
<RenderVolumeLODFactor value="2.0"/>
<!--NO SHADERS-->
<WindLightUseAtmosShaders value="TRUE"/>
<!--Deferred Shading-->
<RenderDeferred value="TRUE"/>
<!--SSAO Enabled-->
<RenderDeferredSSAO value="TRUE"/>
<!--Full Shadows-->
<RenderShadowDetail value="2"/>
</settings>

View File

@ -45,11 +45,10 @@ RenderGround 1 1
RenderMaxPartCount 1 8192
RenderObjectBump 1 1
RenderLocalLights 1 1
RenderReflectionDetail 1 4
RenderTransparentWater 1 1
RenderReflectionProbeDetail 1 2
RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 2.0
RenderTransparentWater 1 1
RenderTreeLODFactor 1 1.0
RenderVBOEnable 1 1
RenderVBOMappingDisable 1 1
@ -89,11 +88,10 @@ RenderFlexTimeFactor 1 0
RenderGlowResolutionPow 1 8
RenderLocalLights 1 0
RenderMaxPartCount 1 256
RenderReflectionDetail 1 0
RenderTransparentWater 1 0
RenderReflectionProbeDetail 1 -1
RenderTerrainDetail 1 0
RenderTerrainLODFactor 1 1
RenderTransparentWater 1 0
RenderTreeLODFactor 1 0
RenderVolumeLODFactor 1 1.5
RenderDeferredSSAO 1 0
@ -115,11 +113,10 @@ RenderFlexTimeFactor 1 1.0
RenderGlowResolutionPow 1 8
RenderMaxPartCount 1 2048
RenderLocalLights 1 1
RenderReflectionDetail 1 0
RenderTransparentWater 1 0
RenderReflectionProbeDetail 1 -1
RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 1.0
RenderTransparentWater 1 1
RenderTreeLODFactor 1 0.5
RenderVolumeLODFactor 1 2.0
RenderDeferredSSAO 1 0
@ -141,10 +138,9 @@ RenderFlexTimeFactor 1 1.0
RenderGlowResolutionPow 1 9
RenderMaxPartCount 1 4096
RenderLocalLights 1 1
RenderReflectionDetail 1 0
RenderTransparentWater 1 0
RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 2.0
RenderTransparentWater 1 1
RenderTreeLODFactor 1 0.5
RenderVolumeLODFactor 1 2.0
RenderDeferredSSAO 1 0
@ -167,10 +163,9 @@ RenderFlexTimeFactor 1 1.0
RenderGlowResolutionPow 1 9
RenderMaxPartCount 1 4096
RenderLocalLights 1 1
RenderReflectionDetail 1 0
RenderTransparentWater 1 1
RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 2.0
RenderTransparentWater 1 1
RenderTreeLODFactor 1 0.5
RenderVolumeLODFactor 1 2.0
RenderDeferredSSAO 1 0
@ -193,10 +188,9 @@ RenderFlexTimeFactor 1 1.0
RenderGlowResolutionPow 1 9
RenderMaxPartCount 1 4096
RenderLocalLights 1 1
RenderReflectionDetail 1 0
RenderTransparentWater 1 1
RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 2.0
RenderTransparentWater 1 1
RenderTreeLODFactor 1 0.5
RenderVolumeLODFactor 1 2.0
RenderDeferredSSAO 1 1
@ -219,7 +213,6 @@ RenderFlexTimeFactor 1 1.0
RenderGlowResolutionPow 1 9
RenderMaxPartCount 1 4096
RenderLocalLights 1 1
RenderReflectionDetail 1 0
RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 2.0
RenderTransparentWater 1 1
@ -244,7 +237,6 @@ RenderFlexTimeFactor 1 1.0
RenderGlowResolutionPow 1 9
RenderLocalLights 1 1
RenderMaxPartCount 1 8192
RenderReflectionDetail 1 4
RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 2.0
RenderTransparentWater 1 1
@ -282,7 +274,7 @@ RenderAvatarMaxComplexity 1 80000
RenderLocalLights 1 0
RenderMaxPartCount 1 1024
RenderTerrainDetail 1 0
RenderReflectionDetail 0 0
RenderTransparentWater 1 0
RenderDeferredSSAO 0 0
RenderShadowDetail 0 0
RenderReflectionProbeDetail 0 -1

View File

@ -1,4 +1,4 @@
version 32
version 33
// The version number above should be incremented IF AND ONLY IF some
// change has been made that is sufficiently important to justify
// resetting the graphics preferences of all users to the recommended
@ -45,11 +45,10 @@ RenderGround 1 1
RenderMaxPartCount 1 8192
RenderObjectBump 1 1
RenderLocalLights 1 1
RenderReflectionDetail 1 4
RenderTransparentWater 1 1
RenderReflectionProbeDetail 1 2
RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 2.0
RenderTransparentWater 1 1
RenderTreeLODFactor 1 1.0
RenderVBOEnable 1 1
RenderVBOMappingDisable 1 1
@ -89,11 +88,10 @@ RenderFlexTimeFactor 1 0
RenderGlowResolutionPow 1 8
RenderLocalLights 1 0
RenderMaxPartCount 1 256
RenderReflectionDetail 1 0
RenderTransparentWater 1 0
RenderReflectionProbeDetail 1 -1
RenderTerrainDetail 1 0
RenderTerrainLODFactor 1 1
RenderTransparentWater 1 0
RenderTreeLODFactor 1 0
RenderVolumeLODFactor 1 1.5
RenderDeferredSSAO 1 0
@ -115,11 +113,10 @@ RenderFlexTimeFactor 1 1.0
RenderGlowResolutionPow 1 8
RenderMaxPartCount 1 2048
RenderLocalLights 1 1
RenderReflectionDetail 1 0
RenderTransparentWater 1 0
RenderReflectionProbeDetail 1 -1
RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 1.0
RenderTransparentWater 1 1
RenderTreeLODFactor 1 0.5
RenderVolumeLODFactor 1 2.0
RenderDeferredSSAO 1 0
@ -141,10 +138,9 @@ RenderFlexTimeFactor 1 1.0
RenderGlowResolutionPow 1 9
RenderMaxPartCount 1 4096
RenderLocalLights 1 1
RenderReflectionDetail 1 0
RenderTransparentWater 1 0
RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 2.0
RenderTransparentWater 1 1
RenderTreeLODFactor 1 0.5
RenderVolumeLODFactor 1 2.0
RenderDeferredSSAO 1 0
@ -167,10 +163,9 @@ RenderFlexTimeFactor 1 1.0
RenderGlowResolutionPow 1 9
RenderMaxPartCount 1 4096
RenderLocalLights 1 1
RenderReflectionDetail 1 0
RenderTransparentWater 1 1
RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 2.0
RenderTransparentWater 1 1
RenderTreeLODFactor 1 0.5
RenderVolumeLODFactor 1 2.0
RenderDeferredSSAO 1 0
@ -193,10 +188,9 @@ RenderFlexTimeFactor 1 1.0
RenderGlowResolutionPow 1 9
RenderMaxPartCount 1 4096
RenderLocalLights 1 1
RenderReflectionDetail 1 0
RenderTransparentWater 1 1
RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 2.0
RenderTransparentWater 1 1
RenderTreeLODFactor 1 0.5
RenderVolumeLODFactor 1 2.0
RenderDeferredSSAO 1 1
@ -219,7 +213,6 @@ RenderFlexTimeFactor 1 1.0
RenderGlowResolutionPow 1 9
RenderMaxPartCount 1 4096
RenderLocalLights 1 1
RenderReflectionDetail 1 0
RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 2.0
RenderTransparentWater 1 1
@ -244,7 +237,6 @@ RenderFlexTimeFactor 1 1.0
RenderGlowResolutionPow 1 9
RenderLocalLights 1 1
RenderMaxPartCount 1 8192
RenderReflectionDetail 1 4
RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 2.0
RenderTransparentWater 1 1
@ -282,7 +274,7 @@ RenderAvatarMaxComplexity 1 80000
RenderLocalLights 1 0
RenderMaxPartCount 1 1024
RenderTerrainDetail 1 0
RenderReflectionDetail 0 0
RenderTransparentWater 1 0
RenderDeferredSSAO 0 0
RenderShadowDetail 0 0
RenderReflectionProbeDetail 0 -1

View File

@ -45,7 +45,6 @@ RenderGround 1 1
RenderMaxPartCount 1 8192
RenderObjectBump 1 1
RenderLocalLights 1 1
RenderReflectionDetail 1 4
RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 2.0
RenderTransparentWater 1 1
@ -87,7 +86,6 @@ RenderFlexTimeFactor 1 0
RenderGlowResolutionPow 1 8
RenderLocalLights 1 0
RenderMaxPartCount 1 256
RenderReflectionDetail 1 0
RenderTerrainDetail 1 0
RenderTerrainLODFactor 1 1
RenderTransparentWater 1 0
@ -113,7 +111,6 @@ RenderFlexTimeFactor 1 1.0
RenderGlowResolutionPow 1 8
RenderMaxPartCount 1 2048
RenderLocalLights 1 1
RenderReflectionDetail 1 0
RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 1.0
RenderTransparentWater 1 1
@ -139,7 +136,6 @@ RenderFlexTimeFactor 1 1.0
RenderGlowResolutionPow 1 9
RenderMaxPartCount 1 4096
RenderLocalLights 1 1
RenderReflectionDetail 1 0
RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 2.0
RenderTransparentWater 1 1
@ -165,7 +161,6 @@ RenderFlexTimeFactor 1 1.0
RenderGlowResolutionPow 1 9
RenderMaxPartCount 1 4096
RenderLocalLights 1 1
RenderReflectionDetail 1 0
RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 2.0
RenderTransparentWater 1 1
@ -191,7 +186,6 @@ RenderFlexTimeFactor 1 1.0
RenderGlowResolutionPow 1 9
RenderMaxPartCount 1 4096
RenderLocalLights 1 1
RenderReflectionDetail 1 0
RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 2.0
RenderTransparentWater 1 1
@ -217,7 +211,6 @@ RenderFlexTimeFactor 1 1.0
RenderGlowResolutionPow 1 9
RenderMaxPartCount 1 4096
RenderLocalLights 1 1
RenderReflectionDetail 1 0
RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 2.0
RenderTransparentWater 1 1
@ -242,7 +235,6 @@ RenderFlexTimeFactor 1 1.0
RenderGlowResolutionPow 1 9
RenderLocalLights 1 1
RenderMaxPartCount 1 8192
RenderReflectionDetail 1 4
RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 2.0
RenderTransparentWater 1 1
@ -281,7 +273,6 @@ RenderAvatarMaxComplexity 1 80000
RenderLocalLights 1 0
RenderMaxPartCount 1 1024
RenderTerrainDetail 1 0
RenderReflectionDetail 0 0
RenderDeferredSSAO 0 0
RenderUseAdvancedAtmospherics 0 0
RenderShadowDetail 0 0

View File

@ -164,7 +164,6 @@ BOOL FSFloaterPerformance::postBuild()
LLAvatarComplexityControls::setIndirectMaxArc();
// store the current setting as the users desired reflection detail and DD
gSavedSettings.setS32("FSUserTargetReflections", LLPipeline::RenderReflectionDetail);
if(!FSPerfStats::tunables.userAutoTuneEnabled)
{
if (gSavedDrawDistance)

View File

@ -79,7 +79,6 @@ namespace FSPerfStats
if( tuningFlag & UserAutoTuneEnabled ){ gSavedSettings.setBOOL("FSAutoTuneFPS", userAutoTuneEnabled); };
if( tuningFlag & UserAutoTuneLock ){ gSavedSettings.setBOOL("FSAutoTuneLock", userAutoTuneLock); };
if( tuningFlag & UserTargetFPS ){ gSavedSettings.setU32("FSTargetFPS", userTargetFPS); };
if( tuningFlag & UserTargetReflections ){ gSavedSettings.setS32("FSUserTargetReflections", userTargetReflections); };
// Note: The Max ART slider is logarithmic and thus we have an intermediate proxy value
if( tuningFlag & UserARTCutoff ){ gSavedSettings.setF32("FSRenderAvatarMaxART", userARTCutoffSliderValue); };
resetChanges();
@ -125,7 +124,6 @@ namespace FSPerfStats
FSPerfStats::tunables.userImpostorDistanceTuningEnabled = gSavedSettings.getBOOL("FSAutoTuneImpostorByDistEnabled");
FSPerfStats::tunables.userFPSTuningStrategy = gSavedSettings.getU32("FSTuningFPSStrategy");
FSPerfStats::tunables.userTargetFPS = gSavedSettings.getU32("FSTargetFPS");
FSPerfStats::tunables.userTargetReflections = gSavedSettings.getS32("FSUserTargetReflections");
FSPerfStats::tunables.userAutoTuneEnabled = gSavedSettings.getBOOL("FSAutoTuneFPS");
FSPerfStats::tunables.userAutoTuneLock = gSavedSettings.getBOOL("FSAutoTuneLock");
// Note: The Max ART slider is logarithmic and thus we have an intermediate proxy value
@ -378,25 +376,14 @@ namespace FSPerfStats
{
if(tunables.userFPSTuningStrategy == TUNE_SCENE_AND_AVATARS)
{
// 1 - hack the water to opaque. all non opaque have a significant hit, this is a big boost for (arguably) a minor visual hit.
// the other reflection options make comparatively little change and if this overshoots we'll be stepping back up later
if(LLPipeline::RenderReflectionDetail != -2)
// step down the DD by 10m per update
auto new_dd = (LLPipeline::RenderFarClip - DD_STEP > tunables.userMinDrawDistance)?(LLPipeline::RenderFarClip - DD_STEP) : tunables.userMinDrawDistance;
if(new_dd != LLPipeline::RenderFarClip)
{
FSPerfStats::tunables.updateReflectionDetail(-2);
FSPerfStats::tunables.updateFarClip( new_dd );
FSPerfStats::lastGlobalPrefChange = gFrameCount;
return;
}
else // deliberately "else" here so we only do one of these in any given frame
{
// step down the DD by 10m per update
auto new_dd = (LLPipeline::RenderFarClip - DD_STEP > tunables.userMinDrawDistance)?(LLPipeline::RenderFarClip - DD_STEP) : tunables.userMinDrawDistance;
if(new_dd != LLPipeline::RenderFarClip)
{
FSPerfStats::tunables.updateFarClip( new_dd );
FSPerfStats::lastGlobalPrefChange = gFrameCount;
return;
}
}
}
// if we reach here, we've no more changes to make to tune scenery so we'll resort to agressive Avatar tuning
// Note: moved from outside "if changefrequency elapsed" to stop fallthrough and allow scenery changes time to take effect.
@ -471,11 +458,6 @@ namespace FSPerfStats
FSPerfStats::lastGlobalPrefChange = gFrameCount;
return;
}
if( (tot_frame_time_raw * 1.5) < target_frame_time_raw )
{
// if everything else is "max" and we have >50% headroom let's knock the water quality up a notch at a time.
FSPerfStats::tunables.updateReflectionDetail( std::min(LLPipeline::RenderReflectionDetail + 1, tunables.userTargetReflections) );
}
}
}
}

View File

@ -135,7 +135,6 @@ namespace FSPerfStats
static constexpr U32 UserAutoTuneEnabled{256};
static constexpr U32 UserTargetFPS{512};
static constexpr U32 UserARTCutoff{1024};
static constexpr U32 UserTargetReflections{2048};
static constexpr U32 UserAutoTuneLock{4096};
U32 tuningFlag{0}; // bit mask for changed settings
@ -153,7 +152,6 @@ namespace FSPerfStats
bool userAutoTuneLock{true};
U32 userTargetFPS{0};
F32 userARTCutoffSliderValue{0};
S32 userTargetReflections{0};
void updateNonImposters(U32 nv){nonImpostors=nv; tuningFlag |= NonImpostors;};
void updateReflectionDetail(S32 nv){reflectionDetail=nv; tuningFlag |= ReflectionDetail;};
@ -167,7 +165,6 @@ namespace FSPerfStats
void updateUserARTCutoffSlider(F32 nv){userARTCutoffSliderValue=nv; tuningFlag |= UserARTCutoff;};
void updateUserAutoTuneEnabled(bool nv){userAutoTuneEnabled=nv; tuningFlag |= UserAutoTuneEnabled;};
void updateUserAutoTuneLock(bool nv){userAutoTuneLock=nv; tuningFlag |= UserAutoTuneLock;};
void updateUserTargetReflections(S32 nv){userTargetReflections=nv; tuningFlag |= UserTargetReflections;};
void resetChanges(){tuningFlag=Nothing;};
void initialiseFromSettings();

View File

@ -2579,6 +2579,19 @@ bool LLAppViewer::initThreads()
LLLFSThread::initClass(enable_threads && true); // TODO: fix crashes associated with this shutdo
//auto configure thread count
LLSD threadCounts = gSavedSettings.getLLSD("ThreadPoolSizes");
// get the number of concurrent threads that can run
S32 cores = std::thread::hardware_concurrency();
// The only configurable thread count right now is ImageDecode
// The viewer typically starts around 8 threads not including image decode,
// so try to leave at least one core free
S32 image_decode_count = llclamp(cores - 9, 1, 8);
threadCounts["ImageDecode"] = image_decode_count;
gSavedSettings.setLLSD("ThreadPoolSizes", threadCounts);
// Image decoding
LLAppViewer::sImageDecodeThread = new LLImageDecodeThread(enable_threads && true);
LLAppViewer::sTextureCache = new LLTextureCache(enable_threads && true);

View File

@ -148,6 +148,11 @@ extern BOOL gCubeSnapshot;
void LLDrawPoolAlpha::renderPostDeferred(S32 pass)
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWPOOL;
if ((!LLPipeline::sRenderTransparentWater || gCubeSnapshot) && getType() == LLDrawPool::POOL_ALPHA_PRE_WATER)
{ // don't render alpha objects on the other side of the water plane if water is opaque
return;
}
deferred_render = TRUE;
F32 water_sign = 1.f;

View File

@ -57,6 +57,8 @@ BOOL LLDrawPoolWater::sNeedsReflectionUpdate = TRUE;
BOOL LLDrawPoolWater::sNeedsDistortionUpdate = TRUE;
F32 LLDrawPoolWater::sWaterFogEnd = 0.f;
extern BOOL gCubeSnapshot;
LLDrawPoolWater::LLDrawPoolWater() : LLFacePool(POOL_WATER)
{
// <FS:Zi> Render speedup for water parameters
@ -128,15 +130,19 @@ S32 LLDrawPoolWater::getNumPostDeferredPasses()
void LLDrawPoolWater::beginPostDeferredPass(S32 pass)
{
// copy framebuffer contents so far to a texture to be used for
// reflections and refractions
LLRenderTarget& src = gPipeline.mRT->screen;
LLRenderTarget& dst = gPipeline.mWaterDis;
dst.copyContents(src,
0, 0, src.getWidth(), src.getHeight(),
0, 0, dst.getWidth(), dst.getHeight(),
GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT,
GL_NEAREST);
LL_PROFILE_GPU_ZONE("water beginPostDeferredPass")
if (LLPipeline::sRenderTransparentWater && !gCubeSnapshot)
{
// copy framebuffer contents so far to a texture to be used for
// reflections and refractions
LLRenderTarget& src = gPipeline.mRT->screen;
LLRenderTarget& dst = gPipeline.mWaterDis;
dst.copyContents(src,
0, 0, src.getWidth(), src.getHeight(),
0, 0, dst.getWidth(), dst.getHeight(),
GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT,
GL_NEAREST);
}
}
void LLDrawPoolWater::renderPostDeferred(S32 pass)
@ -155,6 +161,7 @@ S32 LLDrawPoolWater::getNumDeferredPasses()
//===============================
void LLDrawPoolWater::renderDeferred(S32 pass)
{
#if 0
LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWPOOL; //LL_RECORD_BLOCK_TIME(FTM_RENDER_WATER);
if (!LLPipeline::sRenderTransparentWater)
@ -167,6 +174,7 @@ void LLDrawPoolWater::renderDeferred(S32 pass)
deferred_render = TRUE;
renderWater();
deferred_render = FALSE;
#endif
}
//=========================================
@ -514,6 +522,8 @@ void LLDrawPoolWater::renderWater()
//bool has_normal_mips = gSavedSettings.getBOOL("RenderWaterMipNormal");
bool has_normal_mips = mRenderWaterMipNormal;
bool underwater = LLViewerCamera::getInstance()->cameraUnderWater();
LLColor4 fog_color = LLColor4(pwater->getWaterFogColor(), 0.f);
LLColor3 fog_color_linear = linearColor3(fog_color);
if (sun_up)
{
@ -549,7 +559,7 @@ void LLDrawPoolWater::renderWater()
for( int edge = 0 ; edge < 2; edge++ )
{
// select shader
if (underwater && LLPipeline::sWaterReflections)
if (underwater)
{
shader = deferred_render ? &gDeferredUnderWaterProgram : &gUnderWaterProgram;
}
@ -625,7 +635,6 @@ void LLDrawPoolWater::renderWater()
shader->uniform2fv(LLShaderMgr::DEFERRED_SCREEN_RES, 1, screenRes);
shader->uniform1f(LLShaderMgr::BLEND_FACTOR, blend_factor);
LLColor4 fog_color(pwater->getWaterFogColor(), 0.0f);
F32 fog_density = pwater->getModifiedWaterFogDensity(underwater);
if (screentex > -1)
@ -652,6 +661,7 @@ void LLDrawPoolWater::renderWater()
shader->uniform4fv(LLShaderMgr::SPECULAR_COLOR, 1, specular.mV);
shader->uniform4fv(LLShaderMgr::WATER_FOGCOLOR, 1, fog_color.mV);
shader->uniform3fv(LLShaderMgr::WATER_FOGCOLOR_LINEAR, 1, fog_color_linear.mV);
shader->uniform3fv(LLShaderMgr::WATER_SPECULAR, 1, light_diffuse.mV);
shader->uniform1f(LLShaderMgr::WATER_SPECULAR_EXP, light_exp);

View File

@ -2124,12 +2124,6 @@ void LLFloaterPreference::refreshEnabledState()
fsaa_ctrl->setValue((LLSD::Integer) 0);
}
LLComboBox* ctrl_reflections = getChild<LLComboBox>("Reflections");
// Reflections
BOOL reflections = LLCubeMap::sUseCubeMaps;
ctrl_reflections->setEnabled(reflections);
// WindLight
LLSliderCtrl* sky = getChild<LLSliderCtrl>("SkyMeshDetail");
sky->setEnabled(TRUE);
@ -2220,30 +2214,22 @@ void LLAvatarComplexityControls::setIndirectMaxArc()
void LLFloaterPreference::disableUnavailableSettings()
{
LLComboBox* ctrl_reflections = getChild<LLComboBox>("Reflections");
LLComboBox* ctrl_shadows = getChild<LLComboBox>("ShadowDetail");
LLCheckBoxCtrl* ctrl_ssao = getChild<LLCheckBoxCtrl>("UseSSAO");
// disabled deferred SSAO
if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferredSSAO"))
{
ctrl_ssao->setEnabled(FALSE);
ctrl_ssao->setEnabled(FALSE);
ctrl_ssao->setValue(FALSE);
}
// disabled deferred shadows
if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderShadowDetail"))
{
ctrl_shadows->setEnabled(FALSE);
ctrl_shadows->setValue(0);
}
// disabled reflections
if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderReflectionDetail"))
{
ctrl_reflections->setEnabled(FALSE);
ctrl_reflections->setValue(FALSE);
}
if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderShadowDetail"))
{
ctrl_shadows->setEnabled(FALSE);
ctrl_shadows->setValue(0);
}
}
void LLFloaterPreference::refresh()

View File

@ -119,10 +119,23 @@ std::string USE_TEXTURE;
LLRender::eTexIndex LLPanelFace::getTextureChannelToEdit()
{
LLRadioGroup* radio_mat_type = getChild<LLRadioGroup>("radio_material_type");
LLRender::eTexIndex channel_to_edit = (mComboMatMedia && mComboMatMedia->getCurrentIndex() == MATMEDIA_MATERIAL) ?
(radio_mat_type ? (LLRender::eTexIndex)radio_mat_type->getSelectedIndex() : LLRender::DIFFUSE_MAP) : LLRender::DIFFUSE_MAP;
LLRender::eTexIndex channel_to_edit = LLRender::DIFFUSE_MAP;
if (mComboMatMedia)
{
U32 matmedia_selection = mComboMatMedia->getCurrentIndex();
if (matmedia_selection == MATMEDIA_MATERIAL)
{
LLRadioGroup* radio_mat_type = getChild<LLRadioGroup>("radio_material_type");
channel_to_edit = (LLRender::eTexIndex)radio_mat_type->getSelectedIndex();
}
if (matmedia_selection == MATMEDIA_PBR)
{
LLRadioGroup* radio_mat_type = getChild<LLRadioGroup>("radio_pbr_type");
channel_to_edit = (LLRender::eTexIndex)radio_mat_type->getSelectedIndex();
}
}
channel_to_edit = (channel_to_edit == LLRender::NORMAL_MAP) ? (getCurrentNormalMap().isNull() ? LLRender::DIFFUSE_MAP : channel_to_edit) : channel_to_edit;
channel_to_edit = (channel_to_edit == LLRender::SPECULAR_MAP) ? (getCurrentSpecularMap().isNull() ? LLRender::DIFFUSE_MAP : channel_to_edit) : channel_to_edit;
@ -629,20 +642,42 @@ struct LLPanelFaceSetTEFunctor : public LLSelectedTEFunctor
{
BOOL valid;
F32 value;
LLRadioGroup * radio_mat_type = mPanel->getChild<LLRadioGroup>("radio_material_type");
std::string prefix;
switch (radio_mat_type->getSelectedIndex())
U32 materials_media = mPanel->getChild<LLComboBox>("combobox matmedia")->getCurrentIndex();
if (MATMEDIA_PBR == materials_media)
{
case MATTYPE_DIFFUSE:
prefix = "Tex";
break;
case MATTYPE_NORMAL:
prefix = "bumpy";
break;
case MATTYPE_SPECULAR:
prefix = "shiny";
break;
LLRadioGroup * radio_pbr_type = mPanel->getChild<LLRadioGroup>("radio_pbr_type");
switch (radio_pbr_type->getSelectedIndex())
{
case PBRTYPE_BASE_COLOR:
prefix = "Tex";
break;
case PBRTYPE_NORMAL:
prefix = "bumpy";
break;
case PBRTYPE_METALLIC:
prefix = "shiny";
break;
}
}
else
{
// Effectively the same as MATMEDIA_PBR sans using different radio,
// separate for the sake of clarity
LLRadioGroup * radio_mat_type = mPanel->getChild<LLRadioGroup>("radio_material_type");
switch (radio_mat_type->getSelectedIndex())
{
case MATTYPE_DIFFUSE:
prefix = "Tex";
break;
case MATTYPE_NORMAL:
prefix = "bumpy";
break;
case MATTYPE_SPECULAR:
prefix = "shiny";
break;
}
}
LLSpinCtrl * ctrlTexScaleS = mPanel->getChild<LLSpinCtrl>(prefix + "ScaleU");
@ -3626,11 +3661,20 @@ void LLPanelFace::onCommitRepeatsPerMeter(LLUICtrl* ctrl, void* userdata)
LLPanelFace* self = (LLPanelFace*) userdata;
LLUICtrl* repeats_ctrl = self->getChild<LLUICtrl>("rptctrl");
LLRadioGroup* radio_mat_type = self->getChild<LLRadioGroup>("radio_material_type");
U32 materials_media = self->mComboMatMedia->getCurrentIndex();
U32 material_type = 0;
if (materials_media == MATMEDIA_PBR)
{
LLRadioGroup* radio_mat_type = self->getChild<LLRadioGroup>("radio_pbr_type");
material_type = radio_mat_type->getSelectedIndex();
}
if (materials_media == MATMEDIA_MATERIAL)
{
LLRadioGroup* radio_mat_type = self->getChild<LLRadioGroup>("radio_material_type");
material_type = radio_mat_type->getSelectedIndex();
}
U32 material_type = (materials_media == MATMEDIA_MATERIAL) ? radio_mat_type->getSelectedIndex() : 0;
F32 repeats_per_meter = repeats_ctrl->getValue().asReal();
F32 obj_scale_s = 1.0f;

View File

@ -965,9 +965,11 @@ void LLSettingsVOWater::applySpecial(void *ptarget, bool force)
F32 waterFogDensity = env.getCurrentWater()->getModifiedWaterFogDensity(underwater);
shader->uniform1f(LLShaderMgr::WATER_FOGDENSITY, waterFogDensity);
LLColor4 fog_color(env.getCurrentWater()->getWaterFogColor(), 0.0f);
LLColor4 fog_color(env.getCurrentWater()->getWaterFogColor());
shader->uniform4fv(LLShaderMgr::WATER_FOGCOLOR, fog_color.mV);
shader->uniform3fv(LLShaderMgr::WATER_FOGCOLOR_LINEAR, linearColor3(fog_color).mV);
F32 blend_factor = env.getCurrentWater()->getBlendFactor();
shader->uniform1f(LLShaderMgr::BLEND_FACTOR, blend_factor);

View File

@ -1117,12 +1117,6 @@ void handleUserTargetDrawDistanceChanged(const LLSD& newValue)
FSPerfStats::tunables.userTargetDrawDistance = newval;
}
void handleUserTargetReflectionsChanged(const LLSD& newValue)
{
const auto newval = gSavedSettings.getS32("FSUserTargetReflections");
FSPerfStats::tunables.userTargetReflections = newval;
}
void handlePerformanceStatsEnabledChanged(const LLSD& newValue)
{
const auto newval = gSavedSettings.getBOOL("FSPerfStatsCaptureEnabled");
@ -1413,7 +1407,6 @@ void settings_setup_listeners()
gSavedSettings.getControl("FSAutoTuneLock")->getSignal()->connect(boost::bind(&handleAutoTuneLockChanged, _2));
gSavedSettings.getControl("FSRenderAvatarMaxART")->getSignal()->connect(boost::bind(&handleRenderAvatarMaxARTChanged, _2));
gSavedSettings.getControl("FSPerfStatsCaptureEnabled")->getSignal()->connect(boost::bind(&handlePerformanceStatsEnabledChanged, _2));
gSavedSettings.getControl("FSUserTargetReflections")->getSignal()->connect(boost::bind(&handleUserTargetReflectionsChanged, _2));
gSavedSettings.getControl("FSAutoTuneRenderFarClipTarget")->getSignal()->connect(boost::bind(&handleUserTargetDrawDistanceChanged, _2));
gSavedSettings.getControl("FSAutoTuneImpostorFarAwayDistance")->getSignal()->connect(boost::bind(&handleUserImpostorDistanceChanged, _2));
gSavedSettings.getControl("FSAutoTuneImpostorByDistEnabled")->getSignal()->connect(boost::bind(&handleUserImpostorByDistEnabledChanged, _2));

View File

@ -906,7 +906,6 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
{
LL_PROFILE_ZONE_NAMED_CATEGORY_DISPLAY("display - 3")
LLAppViewer::instance()->pingMainloopTimeout("Display:Imagery");
gPipeline.generateWaterReflection(camera); // <FS:Ansariel> Factor out calls to getInstance
gPipeline.generateHighlight(camera); // <FS:Ansariel> Factor out calls to getInstance
gPipeline.renderPhysicsDisplay();
}
@ -1393,7 +1392,7 @@ void render_hud_attachments()
gPipeline.stateSort(hud_cam, result);
gPipeline.renderGeom(hud_cam);
gPipeline.renderGeomPostDeferred(hud_cam);
LLSpatialGroup::sNoDelete = FALSE;
//gPipeline.clearReferences();

View File

@ -470,7 +470,6 @@ void LLViewerShaderMgr::setShaders()
initAttribsAndUniforms();
gPipeline.releaseGLBuffers();
LLPipeline::sWaterReflections = LLPipeline::sRenderTransparentWater;
LLPipeline::sRenderGlow = gSavedSettings.getBOOL("RenderGlow");
LLPipeline::updateRenderDeferred();
@ -1037,6 +1036,11 @@ BOOL LLViewerShaderMgr::loadShadersWater()
gWaterProgram.mShaderFiles.clear();
gWaterProgram.mShaderFiles.push_back(make_pair("environment/waterV.glsl", GL_VERTEX_SHADER));
gWaterProgram.mShaderFiles.push_back(make_pair("environment/waterF.glsl", GL_FRAGMENT_SHADER));
gWaterProgram.clearPermutations();
if (LLPipeline::sRenderTransparentWater)
{
gWaterProgram.addPermutation("TRANSPARENT_WATER", "1");
}
gWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
gWaterProgram.mShaderLevel = mShaderLevel[SHADER_WATER];
success = gWaterProgram.createShader(NULL, NULL);
@ -1058,6 +1062,11 @@ BOOL LLViewerShaderMgr::loadShadersWater()
gWaterEdgeProgram.mShaderFiles.push_back(make_pair("environment/waterV.glsl", GL_VERTEX_SHADER));
gWaterEdgeProgram.mShaderFiles.push_back(make_pair("environment/waterF.glsl", GL_FRAGMENT_SHADER));
gWaterEdgeProgram.addPermutation("WATER_EDGE", "1");
gWaterEdgeProgram.clearPermutations();
if (LLPipeline::sRenderTransparentWater)
{
gWaterEdgeProgram.addPermutation("TRANSPARENT_WATER", "1");
}
gWaterEdgeProgram.mShaderGroup = LLGLSLShader::SG_WATER;
gWaterEdgeProgram.mShaderLevel = mShaderLevel[SHADER_WATER];
success = gWaterEdgeProgram.createShader(NULL, NULL);
@ -1075,6 +1084,11 @@ BOOL LLViewerShaderMgr::loadShadersWater()
gUnderWaterProgram.mShaderFiles.push_back(make_pair("environment/underWaterF.glsl", GL_FRAGMENT_SHADER));
gUnderWaterProgram.mShaderLevel = mShaderLevel[SHADER_WATER];
gUnderWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
gUnderWaterProgram.clearPermutations();
if (LLPipeline::sRenderTransparentWater)
{
gUnderWaterProgram.addPermutation("TRANSPARENT_WATER", "1");
}
success = gUnderWaterProgram.createShader(NULL, NULL);
llassert(success);
}

View File

@ -6384,7 +6384,7 @@ BOOL LLViewerWindow::simpleSnapshot(LLImageRaw* raw, S32 image_width, S32 image_
LLRenderTarget scratch_space;
U32 color_fmt = GL_RGBA;
const bool use_depth_buffer = true;
const bool use_stencil_buffer = true;
const bool use_stencil_buffer = false;
if (scratch_space.allocate(image_width, image_height, color_fmt, use_depth_buffer, use_stencil_buffer))
{
if (gPipeline.allocateScreenBuffer(image_width, image_height))

View File

@ -221,7 +221,6 @@ F32 LLPipeline::RenderEdgeNormCutoff;
LLVector3 LLPipeline::RenderShadowGaussian;
F32 LLPipeline::RenderShadowBlurDistFactor;
bool LLPipeline::RenderDeferredAtmospheric;
S32 LLPipeline::RenderReflectionDetail;
F32 LLPipeline::RenderHighlightFadeTime;
LLVector3 LLPipeline::RenderShadowClipPlanes;
LLVector3 LLPipeline::RenderShadowOrthoClipPlanes;
@ -334,7 +333,6 @@ bool LLPipeline::sNoAlpha = false;
bool LLPipeline::sUseTriStrips = true;
bool LLPipeline::sUseFarClip = true;
bool LLPipeline::sShadowRender = false;
bool LLPipeline::sWaterReflections = false;
bool LLPipeline::sRenderGlow = false;
bool LLPipeline::sReflectionRender = false;
bool LLPipeline::sDistortionRender = false;
@ -625,7 +623,6 @@ void LLPipeline::init()
connectRefreshCachedSettingsSafe("RenderShadowGaussian");
connectRefreshCachedSettingsSafe("RenderShadowBlurDistFactor");
connectRefreshCachedSettingsSafe("RenderDeferredAtmospheric");
connectRefreshCachedSettingsSafe("RenderReflectionDetail");
connectRefreshCachedSettingsSafe("RenderHighlightFadeTime");
connectRefreshCachedSettingsSafe("RenderShadowClipPlanes");
connectRefreshCachedSettingsSafe("RenderShadowOrthoClipPlanes");
@ -1220,7 +1217,6 @@ void LLPipeline::refreshCachedSettings()
RenderShadowGaussian = gSavedSettings.getVector3("RenderShadowGaussian");
RenderShadowBlurDistFactor = gSavedSettings.getF32("RenderShadowBlurDistFactor");
RenderDeferredAtmospheric = gSavedSettings.getBOOL("RenderDeferredAtmospheric");
RenderReflectionDetail = gSavedSettings.getS32("RenderReflectionDetail");
RenderHighlightFadeTime = gSavedSettings.getF32("RenderHighlightFadeTime");
RenderShadowClipPlanes = gSavedSettings.getVector3("RenderShadowClipPlanes");
RenderShadowOrthoClipPlanes = gSavedSettings.getVector3("RenderShadowOrthoClipPlanes");
@ -1343,10 +1339,9 @@ void LLPipeline::createGLBuffers()
assertInitialized();
updateRenderDeferred();
if (LLPipeline::sWaterReflections)
if (LLPipeline::sRenderTransparentWater)
{ //water reflection texture
U32 res = (U32) llmax(gSavedSettings.getS32("RenderWaterRefResolution"), 512);
mWaterRef.allocate(res,res,GL_RGBA,TRUE,FALSE);
mWaterDis.allocate(res,res,GL_RGBA,TRUE,FALSE,LLTexUnit::TT_TEXTURE);
}
@ -2592,17 +2587,6 @@ void LLPipeline::updateCull(LLCamera& camera, LLCullResult& result, LLPlane* pla
stop_glerror();
}
if (hasRenderType(LLPipeline::RENDER_TYPE_GROUND) &&
!gPipeline.canUseWindLightShaders() &&
gSky.mVOGroundp.notNull() &&
gSky.mVOGroundp->mDrawable.notNull() &&
!LLPipeline::sWaterReflections)
{
gSky.mVOGroundp->mDrawable->setVisible(camera);
sCull->pushDrawable(gSky.mVOGroundp->mDrawable);
}
if (hasRenderType(LLPipeline::RENDER_TYPE_WL_SKY) &&
gPipeline.canUseWindLightShaders() &&
gSky.mVOWLSkyp.notNull() &&
@ -9698,350 +9682,6 @@ inline float sgn(float a)
return (0.0F);
}
void LLPipeline::generateWaterReflection(LLCamera& camera_in)
{
#if 0
LL_PROFILE_ZONE_SCOPED_CATEGORY_PIPELINE;
LL_PROFILE_GPU_ZONE("generateWaterReflection");
if (!assertInitialized() || gCubeSnapshot)
{
return;
}
if (LLPipeline::sWaterReflections && LLDrawPoolWater::sNeedsReflectionUpdate)
{
//disable occlusion culling for reflection/refraction passes (save setting to restore later)
S32 occlude = LLPipeline::sUseOcclusion;
LLPipeline::sUseOcclusion = 0;
bool skip_avatar_update = false;
if (!isAgentAvatarValid() || gAgentCamera.getCameraAnimating() || gAgentCamera.getCameraMode() != CAMERA_MODE_MOUSELOOK || !LLVOAvatar::sVisibleInFirstPerson)
{
skip_avatar_update = true;
}
LLCamera camera = camera_in;
camera.setFar(camera_in.getFar() * 0.75f);
bool camera_is_underwater = LLViewerCamera::getInstance()->cameraUnderWater();
LLPipeline::sReflectionRender = true;
gPipeline.pushRenderTypeMask();
glh::matrix4f saved_modelview = get_current_modelview();
glh::matrix4f saved_projection = get_current_projection();
glh::matrix4f mat;
#if 1 // relies on forward rendering, which is deprecated -- TODO - make a deferred implementation of transparent/reflective water
S32 reflection_detail = RenderReflectionDetail;
#else
S32 reflection_detail = WATER_REFLECT_NONE_WATER_TRANSPARENT;
#endif
F32 water_height = gAgent.getRegion()->getWaterHeight();
F32 camera_height = camera_in.getOrigin().mV[VZ];
F32 distance_to_water = (water_height < camera_height) ? (camera_height - water_height) : (water_height - camera_height);
LLVector3 reflection_offset = LLVector3(0, 0, distance_to_water * 2.0f);
LLVector3 camera_look_at = camera_in.getAtAxis();
LLVector3 reflection_look_at = LLVector3(camera_look_at.mV[VX], camera_look_at.mV[VY], -camera_look_at.mV[VZ]);
LLVector3 reflect_origin = camera_in.getOrigin() - reflection_offset;
LLVector3 reflect_interest_point = reflect_origin + (reflection_look_at * 5.0f);
camera.setOriginAndLookAt(reflect_origin, LLVector3::z_axis, reflect_interest_point);
//plane params
LLPlane plane;
LLVector3 pnorm;
if (camera_is_underwater)
{
//camera is below water, cull above water
pnorm.setVec(0, 0, 1);
}
else
{
//camera is above water, cull below water
pnorm = LLVector3(0, 0, -1);
}
plane.setVec(LLVector3(0, 0, water_height), pnorm);
if (!camera_is_underwater)
{
//generate planar reflection map
LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_WATER0;
gGL.matrixMode(LLRender::MM_MODELVIEW);
gGL.pushMatrix();
mat.set_scale(glh::vec3f(1, 1, -1));
mat.set_translate(glh::vec3f(0,0,water_height*2.f));
mat = saved_modelview * mat;
mReflectionModelView = mat;
set_current_modelview(mat);
gGL.loadMatrix(mat.m);
LLViewerCamera::updateFrustumPlanes(camera, FALSE, TRUE);
glh::vec3f origin(0, 0, 0);
glh::matrix4f inv_mat = mat.inverse();
inv_mat.mult_matrix_vec(origin);
camera.setOrigin(origin.v);
glCullFace(GL_FRONT);
if (LLDrawPoolWater::sNeedsReflectionUpdate)
{
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
glClearColor(0,0,0,0);
mWaterRef.bindTarget();
gGL.setColorMask(true, true);
mWaterRef.clear();
gGL.setColorMask(true, false);
mWaterRef.getViewport(gGLViewport);
//initial sky pass (no user clip plane)
//mask out everything but the sky
gPipeline.pushRenderTypeMask();
{
if (reflection_detail >= WATER_REFLECT_MINIMAL)
{
gPipeline.andRenderTypeMask(
LLPipeline::RENDER_TYPE_SKY,
LLPipeline::RENDER_TYPE_WL_SKY,
LLPipeline::RENDER_TYPE_CLOUDS,
LLPipeline::END_RENDER_TYPES);
}
else
{
gPipeline.andRenderTypeMask(
LLPipeline::RENDER_TYPE_SKY,
LLPipeline::RENDER_TYPE_WL_SKY,
LLPipeline::END_RENDER_TYPES);
}
updateCull(camera, mSky);
stateSort(camera, mSky);
renderGeom(camera, TRUE);
}
gPipeline.popRenderTypeMask();
if (reflection_detail >= WATER_REFLECT_NONE_WATER_TRANSPARENT)
{
gPipeline.pushRenderTypeMask();
{
clearRenderTypeMask(
LLPipeline::RENDER_TYPE_WATER,
LLPipeline::RENDER_TYPE_VOIDWATER,
LLPipeline::RENDER_TYPE_GROUND,
LLPipeline::RENDER_TYPE_SKY,
LLPipeline::RENDER_TYPE_CLOUDS,
LLPipeline::END_RENDER_TYPES);
if (reflection_detail > WATER_REFLECT_MINIMAL)
{ //mask out selected geometry based on reflection detail
if (reflection_detail < WATER_REFLECT_EVERYTHING)
{
clearRenderTypeMask(LLPipeline::RENDER_TYPE_PARTICLES, END_RENDER_TYPES);
if (reflection_detail < WATER_REFLECT_AVATARS)
{
clearRenderTypeMask(
LLPipeline::RENDER_TYPE_AVATAR,
LLPipeline::RENDER_TYPE_CONTROL_AV,
END_RENDER_TYPES);
if (reflection_detail < WATER_REFLECT_STATIC_OBJECTS)
{
clearRenderTypeMask(LLPipeline::RENDER_TYPE_VOLUME, END_RENDER_TYPES);
}
}
}
LLGLUserClipPlane clip_plane(plane, mReflectionModelView, saved_projection);
LLGLDisable cull(GL_CULL_FACE);
updateCull(camera, mReflectedObjects, &plane);
stateSort(camera, mReflectedObjects);
renderGeom(camera);
}
}
gPipeline.popRenderTypeMask();
}
mWaterRef.flush();
}
glCullFace(GL_BACK);
gGL.matrixMode(LLRender::MM_MODELVIEW);
gGL.popMatrix();
set_current_modelview(saved_modelview);
}
camera.setOrigin(camera_in.getOrigin());
//render distortion map
static bool last_update = true;
if (last_update)
{
gPipeline.pushRenderTypeMask();
camera.setFar(camera_in.getFar());
clearRenderTypeMask(
LLPipeline::RENDER_TYPE_WATER,
LLPipeline::RENDER_TYPE_VOIDWATER,
LLPipeline::RENDER_TYPE_GROUND,
END_RENDER_TYPES);
// intentionally inverted so that distortion map contents (objects under the water when we're above it)
// will properly include water fog effects
LLPipeline::sUnderWaterRender = !camera_is_underwater;
if (LLPipeline::sUnderWaterRender)
{
clearRenderTypeMask(
LLPipeline::RENDER_TYPE_GROUND,
LLPipeline::RENDER_TYPE_SKY,
LLPipeline::RENDER_TYPE_CLOUDS,
LLPipeline::RENDER_TYPE_WL_SKY,
END_RENDER_TYPES);
}
LLViewerCamera::updateFrustumPlanes(camera);
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
if (LLPipeline::sUnderWaterRender || LLDrawPoolWater::sNeedsDistortionUpdate)
{
LLPipeline::sDistortionRender = true;
LLColor3 col = LLEnvironment::instance().getCurrentWater()->getWaterFogColor();
glClearColor(col.mV[0], col.mV[1], col.mV[2], 0.f);
// HACK FIX -- pretend underwater camera is the world camera to fix weird visibility artifacts
// during distortion render (doesn't break main render because the camera is the same perspective
// as world camera and occlusion culling is disabled for this pass)
//LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_WATER1;
LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_WORLD;
mWaterDis.bindTarget();
mWaterDis.getViewport(gGLViewport);
gGL.setColorMask(true, true);
mWaterDis.clear();
gGL.setColorMask(true, false);
F32 water_dist = water_height;
//clip out geometry on the same side of water as the camera w/ enough margin to not include the water geo itself,
// but not so much as to clip out parts of avatars that should be seen under the water in the distortion map
LLPlane plane;
if (camera_is_underwater)
{
//nudge clip plane below water to avoid visible holes in objects intersecting water surface
water_dist /= LLPipeline::sDistortionWaterClipPlaneMargin;
//camera is below water, clip plane points up
pnorm.setVec(0, 0, -1);
}
else
{
//nudge clip plane above water to avoid visible holes in objects intersecting water surface
water_dist *= LLPipeline::sDistortionWaterClipPlaneMargin;
//camera is above water, clip plane points down
pnorm = LLVector3(0, 0, 1);
}
plane.setVec(LLVector3(0, 0, water_dist), pnorm);
LLGLUserClipPlane clip_plane(plane, saved_modelview, saved_projection);
gGL.setColorMask(true, true);
mWaterDis.clear();
gGL.setColorMask(true, false);
#if 0 // DEPRECATED - requires forward rendering, TODO - make a deferred implementation
if (reflection_detail >= WATER_REFLECT_NONE_WATER_TRANSPARENT)
{
updateCull(camera, mRefractedObjects, &plane);
stateSort(camera, mRefractedObjects);
renderGeom(camera);
}
#endif
gUIProgram.bind();
LLWorld::getInstance()->renderPropertyLines();
gUIProgram.unbind();
mWaterDis.flush();
}
LLPipeline::sDistortionRender = false;
gPipeline.popRenderTypeMask();
}
last_update = LLDrawPoolWater::sNeedsReflectionUpdate && LLDrawPoolWater::sNeedsDistortionUpdate;
gPipeline.popRenderTypeMask();
LLPipeline::sUnderWaterRender = false;
LLPipeline::sReflectionRender = false;
LLDrawPoolWater::sNeedsReflectionUpdate = FALSE;
LLDrawPoolWater::sNeedsDistortionUpdate = FALSE;
if (!LLRenderTarget::sUseFBO)
{
glClear(GL_DEPTH_BUFFER_BIT);
}
glClearColor(0.f, 0.f, 0.f, 0.f);
gViewerWindow->setup3DViewport();
LLGLState::checkStates();
if (!skip_avatar_update)
{
gAgentAvatarp->updateAttachmentVisibility(gAgentCamera.getCameraMode());
}
LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_WORLD;
// restore occlusion culling
LLPipeline::sUseOcclusion = occlude;
}
else
{
// Initial sky pass is still needed even if water reflection is not rendering
bool camera_is_underwater = LLViewerCamera::getInstance()->cameraUnderWater();
if (!camera_is_underwater)
{
gPipeline.pushRenderTypeMask();
{
gPipeline.andRenderTypeMask(
LLPipeline::RENDER_TYPE_SKY,
LLPipeline::RENDER_TYPE_WL_SKY,
LLPipeline::END_RENDER_TYPES);
LLCamera camera = camera_in;
camera.setFar(camera_in.getFar() * 0.75f);
updateCull(camera, mSky);
stateSort(camera, mSky);
renderGeom(camera, TRUE);
}
gPipeline.popRenderTypeMask();
}
}
#endif
}
glh::matrix4f look(const LLVector3 pos, const LLVector3 dir, const LLVector3 up)
{
glh::matrix4f ret;

View File

@ -309,7 +309,6 @@ public:
void renderDeferredLighting();
void postDeferredGammaCorrect(LLRenderTarget* screen_target);
void generateWaterReflection(LLCamera& camera);
void generateSunShadow(LLCamera& camera);
LLRenderTarget* getSunShadowTarget(U32 i);
LLRenderTarget* getSpotShadowTarget(U32 i);
@ -645,7 +644,6 @@ public:
static bool sUseTriStrips;
static bool sUseFarClip;
static bool sShadowRender;
static bool sWaterReflections;
static bool sDynamicLOD;
static bool sPickAvatar;
static bool sReflectionRender;
@ -1058,7 +1056,6 @@ public:
static LLVector3 RenderShadowGaussian;
static F32 RenderShadowBlurDistFactor;
static bool RenderDeferredAtmospheric;
static S32 RenderReflectionDetail;
static F32 RenderHighlightFadeTime;
static LLVector3 RenderShadowClipPlanes;
static LLVector3 RenderShadowOrthoClipPlanes;

View File

@ -595,7 +595,6 @@ BOOL FloaterQuickPrefs::postBuild()
mCtrlUseSSAO = getChild<LLCheckBoxCtrl>("UseSSAO");
mCtrlUseDoF = getChild<LLCheckBoxCtrl>("UseDepthofField");
mCtrlShadowDetail = getChild<LLComboBox>("ShadowDetail");
mCtrlReflectionDetail = getChild<LLComboBox>("Reflections");
// Vignette UI controls
mSpinnerVignetteX = getChild<LLSpinCtrl>("VignetteSpinnerX");
@ -1044,9 +1043,6 @@ void FloaterQuickPrefs::setSelectedDayCycle(const std::string& preset_name)
// Phototools additions
void FloaterQuickPrefs::refreshSettings()
{
BOOL reflections = LLCubeMap::sUseCubeMaps;
mCtrlReflectionDetail->setEnabled(reflections);
LLTextBox* sky_label = getChild<LLTextBox>("T_Sky_Detail");
LLSlider* sky_slider = getChild<LLSlider>("SB_Sky_Detail");
LLSpinCtrl* sky_spinner = getChild<LLSpinCtrl>("S_Sky_Detail");
@ -1080,13 +1076,6 @@ void FloaterQuickPrefs::refreshSettings()
mCtrlShadowDetail->setValue(0);
}
// disabled reflections
if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderReflectionDetail"))
{
mCtrlReflectionDetail->setEnabled(FALSE);
mCtrlReflectionDetail->setValue(FALSE);
}
// <FS:CR> FIRE-9630 - Vignette UI controls
if (getIsPhototools())
{

View File

@ -122,8 +122,7 @@ private:
LLCheckBoxCtrl* mCtrlUseSSAO;
LLCheckBoxCtrl* mCtrlUseDoF;
LLComboBox* mCtrlShadowDetail;
LLComboBox* mCtrlReflectionDetail;
// Vignette UI controls
LLSpinCtrl* mSpinnerVignetteX;
LLSpinCtrl* mSpinnerVignetteY;

View File

@ -474,59 +474,6 @@
</text>
</panel>
<panel
name="P_W_R_Types"
follows="top|left"
layout="topleft"
top_pad="5"
left="4"
width="275"
height="36"
border_visible="true"
background_visible="true">
<text
name="T_W_R_Types"
follows="left|top"
height="15"
left="10"
top_pad="13"
width="75"
layout="topleft"
tool_tip="Determines what will show up in water reflections.">
Type
</text>
<combo_box
control_name="RenderReflectionDetail"
height="22"
layout="topleft"
left_pad="20"
top_delta="-5"
name="Reflections"
width="165"
follows="left|right">
<combo_box.item
label="Minimal"
name="0"
value="0"/>
<combo_box.item
label="Terrain and trees"
name="1"
value="1"/>
<combo_box.item
label="All static objects"
name="2"
value="2"/>
<combo_box.item
label="All avatars and objects"
name="3"
value="3"/>
<combo_box.item
label="Everything"
name="4"
value="4"/>
</combo_box>
</panel>
<panel
name="P_R_Res"
follows="top|left"

View File

@ -550,57 +550,6 @@
top_delta="16"
width="300" />
<text
type="string"
length="1"
follows="left|top"
height="16"
layout="topleft"
name="ReflectionsText"
text_readonly_color="LabelDisabledColor"
top_delta="16"
left="420"
width="128">
Water Reflections:
</text>
<combo_box
control_name="RenderReflectionDetail"
height="18"
layout="topleft"
left_delta="170"
top_delta="0"
name="Reflections"
width="150">
<combo_box.item
label="None; opaque"
name="-2"
value="-2"/>
<combo_box.item
label="None; transparent"
name="-1"
value="-1"/>
<combo_box.item
label="Minimal"
name="0"
value="0"/>
<combo_box.item
label="Terrain and trees"
name="1"
value="1"/>
<combo_box.item
label="All static objects"
name="2"
value="2"/>
<combo_box.item
label="All avatars and objects"
name="3"
value="3"/>
<combo_box.item
label="Everything"
name="4"
value="4"/>
</combo_box>
<slider
control_name="WLSkyDetail"
decimal_digits="0"

View File

@ -355,56 +355,6 @@
name="2"
value="2"/>
</combo_box>
<text
type="string"
length="1"
top_pad="4"
follows="top|left"
height="12"
width="110"
word_wrap="true"
layout="topleft"
left_delta="-5"
name="reflection_label">
Water Reflections:
</text>
<combo_box
control_name="RenderReflectionDetail"
height="23"
layout="topleft"
left_delta="5"
top_pad ="3"
name="Reflections"
width="150">
<combo_box.item
label="None (opaque)"
name="-2"
value="-2"/>
<combo_box.item
label="None (transparent)"
name="-1"
value="-1"/>
<combo_box.item
label="Minimal"
name="0"
value="0"/>
<combo_box.item
label="Terrain and trees"
name="1"
value="1"/>
<combo_box.item
label="All static objects"
name="2"
value="2"/>
<combo_box.item
label="All avatars and objects"
name="3"
value="3"/>
<combo_box.item
label="Everything"
name="4"
value="4"/>
</combo_box>
<!-- FS:TM Avatar Physics was moved down to LOD section-->
<!-- FS:TM Point Lighting added instead of above-->
<text