diff options
33 files changed, 229 insertions, 129 deletions
diff --git a/indra/llinventory/llsettingssky.cpp b/indra/llinventory/llsettingssky.cpp index 46a48e601f..8e801db2dc 100644 --- a/indra/llinventory/llsettingssky.cpp +++ b/indra/llinventory/llsettingssky.cpp @@ -1443,7 +1443,10 @@ F32 LLSettingsSky::getTotalReflectionProbeAmbiance(F32 cloud_shadow_scale) const      // without brightening dark/interior spaces      F32 probe_ambiance = getReflectionProbeAmbiance(); -    probe_ambiance += (1.f - probe_ambiance) * getCloudShadow()*cloud_shadow_scale; +    if (probe_ambiance > 0.f) +    { +        probe_ambiance += (1.f - probe_ambiance) * getCloudShadow() * cloud_shadow_scale; +    }      return probe_ambiance;  } diff --git a/indra/llprimitive/lltextureentry.cpp b/indra/llprimitive/lltextureentry.cpp index 17b1f4cf5c..71caff1686 100644 --- a/indra/llprimitive/lltextureentry.cpp +++ b/indra/llprimitive/lltextureentry.cpp @@ -536,7 +536,7 @@ void LLTextureEntry::setGLTFMaterial(LLGLTFMaterial* material, bool local_origin          // whether or not mGLTFMaterial is null, any existing override should have been cleared          // before calling setGLTFMaterial          // NOTE: if you're hitting this assert, try to make sure calling code is using LLViewerObject::setRenderMaterialID -        llassert(!local_origin || getGLTFMaterialOverride() == nullptr || getGLTFMaterialOverride()->isClearedForBaseMaterial()); +        //llassert(!local_origin || getGLTFMaterialOverride() == nullptr || getGLTFMaterialOverride()->isClearedForBaseMaterial());          if (mGLTFMaterial)          { diff --git a/indra/llrender/llglslshader.cpp b/indra/llrender/llglslshader.cpp index d213aa05ed..b12de563e4 100644 --- a/indra/llrender/llglslshader.cpp +++ b/indra/llrender/llglslshader.cpp @@ -1098,8 +1098,13 @@ S32 LLGLSLShader::bindTexture(S32 uniform, LLRenderTarget* texture, bool depth,      if (uniform > -1)      { -        gGL.getTexUnit(uniform)->bind(texture, depth); - +        if (depth) { +            gGL.getTexUnit(uniform)->bind(texture, true); +        } +        else { +            bool has_mips = mode == LLTexUnit::TFO_TRILINEAR || mode == LLTexUnit::TFO_ANISOTROPIC; +            gGL.getTexUnit(uniform)->bindManual(texture->getUsage(), texture->getTexture(0), has_mips); +        }          gGL.getTexUnit(uniform)->setTextureFilteringOption(mode);      } diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 7d15214ccb..3d8cbc9527 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -10358,17 +10358,6 @@      <key>Value</key>      <integer>128</integer>    </map> -  <key>RenderTonemapper</key> -  <map> -    <key>Comment</key> -    <string>Which tone mapping function to use (0 - Linear, 1 - ACES Narkowicz, 2 - ACES Hill)</string> -    <key>Persist</key> -    <integer>1</integer> -    <key>Type</key> -    <string>U32</string> -    <key>Value</key> -    <real>2</real> -  </map>    <key>RenderExposure</key>    <map>      <key>Comment</key> @@ -10456,7 +10445,7 @@      <key>Type</key>      <string>F32</string>      <key>Value</key> -    <real>3.0</real> +    <real>1.25</real>    </map>    <key>RenderReflectionProbeMaxLocalLightAmbiance</key>    <map> @@ -10478,7 +10467,7 @@      <key>Type</key>      <string>F32</string>      <key>Value</key> -    <real>0.125</real> +    <real>0.6</real>    </map>    <key>RenderDynamicExposureMax</key>    <map> @@ -10489,7 +10478,7 @@      <key>Type</key>      <string>F32</string>      <key>Value</key> -    <real>1.3</real> +    <real>1.5</real>    </map>    <key>RenderDynamicExposureCoefficient</key>    <map> @@ -10500,7 +10489,7 @@      <key>Type</key>      <string>F32</string>      <key>Value</key> -    <real>0.175</real> +    <real>0.3</real>    </map>      <key>RenderShaderLODThreshold</key>      <map> diff --git a/indra/newview/app_settings/shaders/class1/deferred/exposureF.glsl b/indra/newview/app_settings/shaders/class1/deferred/exposureF.glsl index 7ed8e4c8ce..81f1e9aed0 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/exposureF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/exposureF.glsl @@ -48,8 +48,11 @@ void main()      vec2 tc = vec2(0.5,0.5);      float L = textureLod(emissiveRect, tc, 8).r; - -    float s = clamp(dynamic_exposure_params.x/L, dynamic_exposure_params.y, dynamic_exposure_params.z); +    float max_L = dynamic_exposure_params.x; +    L = clamp(L, 0.0, max_L); +    L /= max_L; +    L = pow(L, 2.0); +    float s = mix(dynamic_exposure_params.z, dynamic_exposure_params.y, L);      float prev = texture(exposureMap, vec2(0.5,0.5)).r; diff --git a/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl index b5eae3a1d5..11532135dd 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl @@ -42,6 +42,7 @@ vec4 applyWaterFogView(vec3 pos, vec4 color);  #endif  vec3 srgb_to_linear(vec3 cs); +vec3 legacy_adjust(vec3 c);  vec3 linear_to_srgb(vec3 cl);  vec3 fullbrightAtmosTransport(vec3 light); @@ -87,6 +88,7 @@ void main()  #endif  #ifndef IS_HUD +    color.rgb = legacy_adjust(color.rgb);      color.rgb = srgb_to_linear(color.rgb);      color.rgb = fullbrightAtmosTransport(color.rgb); diff --git a/indra/newview/app_settings/shaders/class1/deferred/luminanceF.glsl b/indra/newview/app_settings/shaders/class1/deferred/luminanceF.glsl index e63e666778..ee425f97fc 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/luminanceF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/luminanceF.glsl @@ -44,9 +44,9 @@ float lum(vec3 col)  void main()   {      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 + texture(emissiveRect, tc).rgb;      float L = lum(c); -      frag_color = vec4(L);  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/postDeferredGammaCorrect.glsl b/indra/newview/app_settings/shaders/class1/deferred/postDeferredGammaCorrect.glsl index ae6bdbba95..de766d6bc7 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/postDeferredGammaCorrect.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/postDeferredGammaCorrect.glsl @@ -105,29 +105,21 @@ vec3 toneMapACES_Hill(vec3 color)  uniform float exposure;  uniform float gamma; +vec3 legacy_adjust_post(vec3 c); +  vec3 toneMap(vec3 color, float gs)  {      float exp_scale = texture(exposureMap, vec2(0.5,0.5)).r;      color *= exposure * exp_scale * gs; -#ifdef TONEMAP_ACES_NARKOWICZ -    color = toneMapACES_Narkowicz(color); -#endif - -#ifdef TONEMAP_ACES_HILL      color = toneMapACES_Hill(color); -#endif -#ifdef TONEMAP_ACES_HILL_EXPOSURE_BOOST -    // boost exposure as discussed in https://github.com/mrdoob/three.js/pull/19621 -    // this factor is based on the exposure correction of Krzysztof Narkowicz in his -    // implemetation of ACES tone mapping -    color *= 1.0/0.6; -    color = toneMapACES_Hill(color); -#endif +    color = linear_to_srgb(color); -    return linear_to_srgb(color); +    color = legacy_adjust_post(color); + +    return color;  }  //=============================================================== @@ -181,7 +173,7 @@ vec3 legacyGamma(vec3 color)  float legacyGammaApprox()  { - //TODO -- figure out how to plumb this in as a uniform +    //TODO -- figure out how to plumb this in as a uniform      float c = 0.5;      float gc = 1.0-pow(c, gamma); diff --git a/indra/newview/app_settings/shaders/class1/environment/srgbF.glsl b/indra/newview/app_settings/shaders/class1/environment/srgbF.glsl index 4a8b892c3a..3cca84ca14 100644 --- a/indra/newview/app_settings/shaders/class1/environment/srgbF.glsl +++ b/indra/newview/app_settings/shaders/class1/environment/srgbF.glsl @@ -72,7 +72,7 @@ vec3 rgb2hsv(vec3 c)      vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));      float d = q.x - min(q.w, q.y); -    float e = 1.0e-10; +    float e = 1.0e-3;      return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);  } @@ -82,3 +82,25 @@ vec3 hsv2rgb(vec3 c)      vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);      return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);  } + +vec3 legacy_adjust_no_brighten(vec3 c) +{ +    vec3 desat = rgb2hsv(c.rgb); +    desat.g *= 0.75; +    desat.rgb = hsv2rgb(desat); +    return desat; +} + +vec3 legacy_adjust(vec3 c) +{ +    vec3 desat = rgb2hsv(c.rgb); +    desat.g *= 1.0-(1.0-desat.b)*0.5; +    desat.b += (1.0-desat.b)*0.1f; +    desat.rgb = hsv2rgb(desat); +    return desat; +} + +vec3 legacy_adjust_post(vec3 c) +{ +    return c; +} diff --git a/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl b/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl index 53552870ae..f4d6eff69e 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl @@ -77,6 +77,7 @@ vec4 applyWaterFogViewLinear(vec3 pos, vec4 color, vec3 sunlit);  vec3 srgb_to_linear(vec3 c);  vec3 linear_to_srgb(vec3 c); +vec3 legacy_adjust(vec3 c);  vec2 encode_normal (vec3 n);  vec3 atmosFragLightingLinear(vec3 light, vec3 additive, vec3 atten); @@ -239,6 +240,7 @@ void main()      }      diffuse_srgb.rgb *= vertex_color.rgb; +    diffuse_srgb.rgb = legacy_adjust(diffuse_srgb.rgb);      diffuse_linear.rgb = srgb_to_linear(diffuse_srgb.rgb);  #endif // USE_VERTEX_COLOR diff --git a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsF.glsl b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsF.glsl index 49ff49fdd8..e314555ef9 100644 --- a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsF.glsl +++ b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsF.glsl @@ -36,9 +36,9 @@ vec3 atmosFragLighting(vec3 light, vec3 additive, vec3 atten)  {       light *= atten.r;      additive = srgb_to_linear(additive*2.0); -    // magic 3.0 here is to match the default RenderSkyHDRScale -- this parameter needs to be plumbed into sky settings or something +    // magic 1.25 here is to match the default RenderSkyHDRScale -- this parameter needs to be plumbed into sky settings or something      // so it's available to all shaders that call atmosFragLighting instead of just softenLightF.glsl -    additive *= sun_up_factor*3.0 + 1.0;  +    additive *= sun_up_factor*1.25 + 1.0;       light += additive;      return light;  } diff --git a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsFuncs.glsl b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsFuncs.glsl index 14ce33f81f..22db9dce03 100644 --- a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsFuncs.glsl +++ b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsFuncs.glsl @@ -139,10 +139,8 @@ void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, ou      // brightness of surface both sunlight and ambient -    // fudge sunlit and amblit to get consistent lighting compared to legacy -    // midday before PBR was a thing -    sunlit = sunlight.rgb * (1.0+sun_up_factor*0.2); -    amblit = tmpAmbient.rgb * 0.25; +    sunlit = sunlight.rgb; +    amblit = vec3(1,0,1); //should no longer be used, filled in by calcAtmosphericVarsLinear      additive *= vec3(1.0 - combined_haze);  } @@ -172,7 +170,7 @@ void calcAtmosphericVarsLinear(vec3 inPositionEye, vec3 norm, vec3 light_dir, ou      sunlit *= 2.0;      // squash ambient to approximate whatever weirdness legacy atmospherics were doing -    amblit = ambient_color * 0.5 * (1.0+sun_up_factor*0.3); +    amblit = ambient_color; // * (1.0+sun_up_factor*0.3);      amblit *= ambientLighting(norm, light_dir);      amblit = srgb_to_linear(amblit); diff --git a/indra/newview/app_settings/shaders/class3/deferred/materialF.glsl b/indra/newview/app_settings/shaders/class3/deferred/materialF.glsl index 1aef971d3a..e5341386bd 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/materialF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/materialF.glsl @@ -44,9 +44,11 @@ vec4 applyWaterFogView(vec3 pos, vec4 color);  vec3 atmosFragLightingLinear(vec3 l, vec3 additive, vec3 atten);  vec3 scaleSoftClipFragLinear(vec3 l);  void calcAtmosphericVarsLinear(vec3 inPositionEye, vec3 norm, vec3 light_dir, out vec3 sunlit, out vec3 amblit, out vec3 atten, out vec3 additive); +void calcHalfVectors(vec3 lv, vec3 n, vec3 v, out vec3 h, out vec3 l, out float nh, out float nl, out float nv, out float vh, out float lightDist);  vec3 srgb_to_linear(vec3 cs);  vec3 linear_to_srgb(vec3 cs); +vec3 legacy_adjust(vec3 c);  #if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND) @@ -316,6 +318,7 @@ void main()  #if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND)      //forward rendering, output lit linear color +    diffcol.rgb = legacy_adjust(diffcol.rgb);      diffcol.rgb = srgb_to_linear(diffcol.rgb);      spec.rgb = srgb_to_linear(spec.rgb);      spec.a = glossiness; // pack glossiness into spec alpha for lighting functions @@ -357,6 +360,7 @@ void main()      float glare = 0.0; +#if 0 //wrong implementation      if (glossiness > 0.0)  // specular reflection      {          float sa        = dot(normalize(refnormpersp), light_dir.xyz); @@ -373,6 +377,32 @@ void main()          applyGlossEnv(color, glossenv, spec, pos.xyz, norm.xyz);      } +#else //right implementation ported from pointLightF.glsl +    if (glossiness > 0.0) +    { +        vec3  lv = light_dir.xyz; +        vec3  h, l, v = -normalize(pos.xyz); +        float nh, nl, nv, vh, lightDist; +        vec3 n = norm.xyz; +        calcHalfVectors(lv, n, v, h, l, nh, nl, nv, vh, lightDist); + +        if (nl > 0.0 && nh > 0.0) +        { +            float lit = min(nl*6.0, 1.0); + +            float sa = nh; +            float fres = pow(1 - vh, 5) * 0.4+0.5; +            float gtdenom = 2 * nh; +            float gt = max(0,(min(gtdenom * nv / vh, gtdenom * nl / vh))); + +            float scol = shadow*fres*texture2D(lightFunc, vec2(nh, glossiness)).r*gt/(nh*nl); +            color.rgb += lit*scol*sunlit_linear.rgb*spec.rgb; +        } + +        // add radiance map +        applyGlossEnv(color, glossenv, spec, pos.xyz, norm.xyz); +    } +#endif      color = mix(color.rgb, diffcol.rgb, emissive); @@ -381,7 +411,8 @@ void main()          applyLegacyEnv(color, legacyenv, spec, pos.xyz, norm.xyz, env);          float cur_glare = max(max(legacyenv.r, legacyenv.g), legacyenv.b); -        cur_glare *= env*4.0; +        cur_glare = clamp(cur_glare, 0, 1); +        cur_glare *= env;          glare += cur_glare;      } diff --git a/indra/newview/app_settings/shaders/class3/deferred/multiPointLightF.glsl b/indra/newview/app_settings/shaders/class3/deferred/multiPointLightF.glsl index 23ba95949a..5a2924afe5 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/multiPointLightF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/multiPointLightF.glsl @@ -58,6 +58,7 @@ vec4 getNormalEnvIntensityFlags(vec2 screenpos, out vec3 n, out float envIntensi  vec2 getScreenXY(vec4 clip);  vec2 getScreenCoord(vec4 clip);  vec3 srgb_to_linear(vec3 c); +vec3 legacy_adjust(vec3 c);  // Util  vec3 hue_to_rgb(float hue); @@ -131,6 +132,7 @@ void main()      }      else      { +        diffuse.rgb = legacy_adjust(diffuse.rgb);          diffuse = srgb_to_linear(diffuse);          spec.rgb = srgb_to_linear(spec.rgb); diff --git a/indra/newview/app_settings/shaders/class3/deferred/multiSpotLightF.glsl b/indra/newview/app_settings/shaders/class3/deferred/multiSpotLightF.glsl index 30b7895157..33e5b2346c 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/multiSpotLightF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/multiSpotLightF.glsl @@ -83,6 +83,7 @@ vec3 getProjectedLightSpecularColor(vec3 pos, vec3 n);  vec2 getScreenXY(vec4 clip);  vec2 getScreenCoord(vec4 clip);  vec3 srgb_to_linear(vec3 cs); +vec3 legacy_adjust(vec3 c);  vec4 texture2DLodSpecular(vec2 tc, float lod);  vec4 getPosition(vec2 pos_screen); @@ -182,7 +183,7 @@ void main()      }      else      { - +        diffuse = legacy_adjust(diffuse);          diffuse = srgb_to_linear(diffuse);          spec.rgb = srgb_to_linear(spec.rgb); diff --git a/indra/newview/app_settings/shaders/class3/deferred/pointLightF.glsl b/indra/newview/app_settings/shaders/class3/deferred/pointLightF.glsl index 30b96ce8dc..471e5e7fd3 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/pointLightF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/pointLightF.glsl @@ -63,6 +63,7 @@ vec4 getPosition(vec2 pos_screen);  vec2 getScreenXY(vec4 clip);  vec2 getScreenCoord(vec4 clip);  vec3 srgb_to_linear(vec3 c); +vec3 legacy_adjust(vec3 c);  float getDepth(vec2 tc);  vec3 pbrPunctual(vec3 diffuseColor, vec3 specularColor,  @@ -121,7 +122,7 @@ void main()          {              discard;          } - +        diffuse = legacy_adjust(diffuse);          diffuse = srgb_to_linear(diffuse);          spec.rgb = srgb_to_linear(spec.rgb); diff --git a/indra/newview/app_settings/shaders/class3/deferred/reflectionProbeF.glsl b/indra/newview/app_settings/shaders/class3/deferred/reflectionProbeF.glsl index e1b18935e8..55a43f76d0 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/reflectionProbeF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/reflectionProbeF.glsl @@ -752,6 +752,8 @@ void sampleReflectionProbesLegacy(inout vec3 ambenv, inout vec3 glossenv, inout          legacyenv = mix(legacyenv, ssr.rgb, w);      }  #endif + +    glossenv = clamp(glossenv, vec3(0), vec3(10));  }  void applyGlossEnv(inout vec3 color, vec3 glossenv, vec4 spec, vec3 pos, vec3 norm) diff --git a/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl index e1206cc844..ab83708c7b 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl @@ -83,15 +83,19 @@ float getDepth(vec2 pos_screen);  vec3 linear_to_srgb(vec3 c);  vec3 srgb_to_linear(vec3 c); +vec3 legacy_adjust(vec3 c);  uniform vec4 waterPlane; +uniform int cube_snapshot; +  #ifdef WATER_FOG  vec4 applyWaterFogViewLinear(vec3 pos, vec4 color);  #endif  uniform float sky_hdr_scale; +void calcHalfVectors(vec3 lv, vec3 n, vec3 v, out vec3 h, out vec3 l, out float nh, out float nl, out float nv, out float vh, out float lightDist);  void calcDiffuseSpecular(vec3 baseColor, float metallic, inout vec3 diffuseColor, inout vec3 specularColor);  vec3 pbrBaseLight(vec3 diffuseColor, @@ -207,12 +211,18 @@ void main()      else if (!GET_GBUFFER_FLAG(GBUFFER_FLAG_HAS_ATMOS))      {          //should only be true of WL sky, just port over base color value -        color = srgb_to_linear(texture2D(emissiveRect, tc).rgb); -        color *= sun_up_factor * sky_hdr_scale + 1.0; +        color = texture2D(emissiveRect, tc).rgb; +        color = srgb_to_linear(color); +        if (sun_up_factor > 0) +        { +           color *= sky_hdr_scale + 1.0; +        }      }      else      {          // legacy shaders are still writng sRGB to gbuffer +        baseColor.rgb = legacy_adjust(baseColor.rgb); +          baseColor.rgb = srgb_to_linear(baseColor.rgb);          spec.rgb = srgb_to_linear(spec.rgb); @@ -236,6 +246,7 @@ void main()          vec3 refnormpersp = reflect(pos.xyz, norm.xyz); +#if 0 // wrong implementation          if (spec.a > 0.0)  // specular reflection          {              float sa        = dot(normalize(refnormpersp), light_dir.xyz); @@ -248,6 +259,32 @@ void main()              // add radiance map              applyGlossEnv(color, glossenv, spec, pos.xyz, norm.xyz);          } +#else //right implementation (ported from pointLightF.glsl) +        if (spec.a > 0.0) +        { +            vec3  lv = light_dir.xyz; +            vec3  h, l, v = -normalize(pos.xyz); +            float nh, nl, nv, vh, lightDist; +            vec3 n = norm.xyz; +            calcHalfVectors(lv, n, v, h, l, nh, nl, nv, vh, lightDist); + +            if (nl > 0.0 && nh > 0.0) +            { +                float lit = min(nl*6.0, 1.0); + +                float sa = nh; +                float fres = pow(1 - vh, 5) * 0.4+0.5; +                float gtdenom = 2 * nh; +                float gt = max(0,(min(gtdenom * nv / vh, gtdenom * nl / vh))); + +                scol *= fres*texture2D(lightFunc, vec2(nh, spec.a)).r*gt/(nh*nl); +                color.rgb += lit*scol*sunlit_linear.rgb*spec.rgb; +            } + +            // add radiance map +            applyGlossEnv(color, glossenv, spec, pos.xyz, norm.xyz); +        } +#endif          color.rgb = mix(color.rgb, baseColor.rgb, baseColor.a); diff --git a/indra/newview/app_settings/shaders/class3/deferred/spotLightF.glsl b/indra/newview/app_settings/shaders/class3/deferred/spotLightF.glsl index 33ea2129cf..3d06bb27a5 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/spotLightF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/spotLightF.glsl @@ -91,6 +91,7 @@ vec3 getProjectedLightSpecularColor(vec3 pos, vec3 n);  vec2 getScreenXY(vec4 clip_point);  vec2 getScreenCoord(vec4 clip_point);  vec3 srgb_to_linear(vec3 c); +vec3 legacy_adjust(vec3 c);  vec4 texture2DLodSpecular(vec2 tc, float lod);  vec4 getPosition(vec2 pos_screen); @@ -189,6 +190,7 @@ void main()      }      else      { +        diffuse = legacy_adjust(diffuse);          diffuse = srgb_to_linear(diffuse);          spec.rgb = srgb_to_linear(spec.rgb); diff --git a/indra/newview/lldrawpoolwlsky.cpp b/indra/newview/lldrawpoolwlsky.cpp index 820073b3e0..05ee328e43 100644 --- a/indra/newview/lldrawpoolwlsky.cpp +++ b/indra/newview/lldrawpoolwlsky.cpp @@ -265,6 +265,11 @@ void LLDrawPoolWLSky::renderSkyCloudsDeferred(const LLVector3& camPosLocal, F32          F32 cloud_variance = psky ? psky->getCloudVariance() : 0.0f;          F32 blend_factor   = psky ? psky->getBlendFactor() : 0.0f; +        if (psky->getCloudScrollRate().isExactlyZero()) +        { +            blend_factor = 0.f; +        } +          // if we even have sun disc textures to work with...          if (cloud_noise || cloud_noise_next)          { diff --git a/indra/newview/llenvironment.cpp b/indra/newview/llenvironment.cpp index 6557c2b351..627842079e 100644 --- a/indra/newview/llenvironment.cpp +++ b/indra/newview/llenvironment.cpp @@ -812,7 +812,8 @@ const F64Seconds LLEnvironment::TRANSITION_SLOW(10.0f);  const F64Seconds LLEnvironment::TRANSITION_ALTITUDE(5.0f);  const LLUUID LLEnvironment::KNOWN_SKY_SUNRISE("01e41537-ff51-2f1f-8ef7-17e4df760bfb"); -const LLUUID LLEnvironment::KNOWN_SKY_MIDDAY("7819e136-b6af-2e32-9c85-0b94121bb359"); +const LLUUID LLEnvironment::KNOWN_SKY_MIDDAY("bd2e6d30-6e16-3253-e3e6-549e30b536ca"); +const LLUUID LLEnvironment::KNOWN_SKY_LEGACY_MIDDAY("6c83e853-e7f8-cad7-8ee6-5f31c453721c");  const LLUUID LLEnvironment::KNOWN_SKY_SUNSET("084e26cd-a900-28e8-08d0-64a9de5c15e2");  const LLUUID LLEnvironment::KNOWN_SKY_MIDNIGHT("8a01b97a-cb20-c1ea-ac63-f7ea84ad0090"); @@ -1686,8 +1687,16 @@ void LLEnvironment::updateCloudScroll()      if (mCurrentEnvironment->getSky() && !mCloudScrollPaused)      { -        LLVector2 cloud_delta = static_cast<F32>(delta_t)* (mCurrentEnvironment->getSky()->getCloudScrollRate()) / 100.0; -        mCloudScrollDelta += cloud_delta; +        LLVector2 rate = mCurrentEnvironment->getSky()->getCloudScrollRate(); +        if (rate.isExactlyZero()) +        { +            mCloudScrollDelta.setZero(); +        } +        else +        { +            LLVector2 cloud_delta = static_cast<F32>(delta_t) * (mCurrentEnvironment->getSky()->getCloudScrollRate()) / 100.0; +            mCloudScrollDelta += cloud_delta; +        }      }  } diff --git a/indra/newview/llenvironment.h b/indra/newview/llenvironment.h index 64fd170e43..4383f54f25 100644 --- a/indra/newview/llenvironment.h +++ b/indra/newview/llenvironment.h @@ -61,6 +61,7 @@ public:      static const LLUUID         KNOWN_SKY_SUNRISE;      static const LLUUID         KNOWN_SKY_MIDDAY; +    static const LLUUID         KNOWN_SKY_LEGACY_MIDDAY;      static const LLUUID         KNOWN_SKY_SUNSET;      static const LLUUID         KNOWN_SKY_MIDNIGHT; diff --git a/indra/newview/llsculptidsize.cpp b/indra/newview/llsculptidsize.cpp index 9edd78bff0..3d5102902d 100644 --- a/indra/newview/llsculptidsize.cpp +++ b/indra/newview/llsculptidsize.cpp @@ -65,7 +65,7 @@ void LLSculptIDSize::inc(const LLDrawable *pdrawable, int sz)  	pair_iter_iter_BY_SCULPT_ID_t itLU = mSizeInfo.get<tag_BY_SCULPT_ID>().equal_range(sculptId);  	if (itLU.first == itLU.second)  	{ //register -		llassert(mSizeInfo.get<tag_BY_DRAWABLE>().end() == mSizeInfo.get<tag_BY_DRAWABLE>().find(pdrawable)); +		//llassert(mSizeInfo.get<tag_BY_DRAWABLE>().end() == mSizeInfo.get<tag_BY_DRAWABLE>().find(pdrawable));  		mSizeInfo.get<tag_BY_DRAWABLE>().insert(Info(pdrawable, sz, boost::make_shared<SizeSum>(sz), sculptId));  		total_size = sz;  	} diff --git a/indra/newview/llsettingsvo.cpp b/indra/newview/llsettingsvo.cpp index a609c98d61..f2f269fa63 100644 --- a/indra/newview/llsettingsvo.cpp +++ b/indra/newview/llsettingsvo.cpp @@ -723,8 +723,20 @@ void LLSettingsVOSky::applySpecial(void *ptarget, bool force)      }      else      { -        shader->uniform3fv(LLShaderMgr::AMBIENT_LINEAR, linearColor3v(getAmbientColor() / 3.f)); // note magic number 3.f comes from SLIDER_SCALE_SUN_AMBIENT -        shader->uniform3fv(LLShaderMgr::AMBIENT, LLVector3(ambient.mV)); +        if (psky->getReflectionProbeAmbiance() == 0.f) +        { +            LLVector3 ambcol(ambient.mV); +            F32 cloud_shadow = psky->getCloudShadow(); +            LLVector3 tmpAmbient = ambcol + ((LLVector3::all_one - ambcol) * cloud_shadow * 0.5f); + +            shader->uniform3fv(LLShaderMgr::AMBIENT_LINEAR, linearColor3v(tmpAmbient)); +            shader->uniform3fv(LLShaderMgr::AMBIENT, tmpAmbient.mV); +        } +        else +        { +            shader->uniform3fv(LLShaderMgr::AMBIENT_LINEAR, linearColor3v(getAmbientColor() / 3.f)); // note magic number 3.f comes from SLIDER_SCALE_SUN_AMBIENT +            shader->uniform3fv(LLShaderMgr::AMBIENT, LLVector3(ambient.mV)); +        }      }      shader->uniform3fv(LLShaderMgr::BLUE_HORIZON_LINEAR, linearColor3v(getBlueHorizon() / 2.f)); // note magic number of 2.f comes from SLIDER_SCALE_BLUE_HORIZON_DENSITY diff --git a/indra/newview/lltoolcomp.cpp b/indra/newview/lltoolcomp.cpp index 6d54a3770c..b8357b3454 100644 --- a/indra/newview/lltoolcomp.cpp +++ b/indra/newview/lltoolcomp.cpp @@ -268,7 +268,7 @@ BOOL LLToolCompTranslate::handleHover(S32 x, S32 y, MASK mask)  BOOL LLToolCompTranslate::handleMouseDown(S32 x, S32 y, MASK mask)  {  	mMouseDown = TRUE; -	gViewerWindow->pickAsync(x, y, mask, pickCallback, /*BOOL pick_transparent*/ TRUE, LLFloaterReg::instanceVisible("build")); +	gViewerWindow->pickAsync(x, y, mask, pickCallback, /*BOOL pick_transparent*/ FALSE, LLFloaterReg::instanceVisible("build"));  	return TRUE;  } diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp index 59b566efb6..8973d1c099 100644 --- a/indra/newview/llviewercontrol.cpp +++ b/indra/newview/llviewercontrol.cpp @@ -656,7 +656,6 @@ void settings_setup_listeners()      setting_setup_signal_listener(gSavedSettings, "RenderReflectionsEnabled", handleReflectionProbeDetailChanged);      setting_setup_signal_listener(gSavedSettings, "RenderScreenSpaceReflections", handleReflectionProbeDetailChanged);  	setting_setup_signal_listener(gSavedSettings, "RenderShadowDetail", handleSetShaderChanged); -    setting_setup_signal_listener(gSavedSettings, "RenderTonemapper", handleSetShaderChanged);  	setting_setup_signal_listener(gSavedSettings, "RenderDeferredSSAO", handleSetShaderChanged);  	setting_setup_signal_listener(gSavedSettings, "RenderPerformanceTest", handleRenderPerfTestChanged);  	setting_setup_signal_listener(gSavedSettings, "ChatFontSize", handleChatFontSizeChanged); diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp index c8e279c991..d0dd02426e 100644 --- a/indra/newview/llviewermedia.cpp +++ b/indra/newview/llviewermedia.cpp @@ -79,6 +79,8 @@  #include <boost/bind.hpp>	// for SkinFolder listener  #include <boost/signals2.hpp> +extern BOOL gCubeSnapshot; +  // *TODO: Consider enabling mipmaps (they have been disabled for a long time). Likely has a significant performance impact for tiled/high texture repeat media. Mip generation in a shader may also be an option if necessary.  constexpr BOOL USE_MIPMAPS = FALSE; @@ -264,6 +266,7 @@ viewer_media_t LLViewerMedia::newMediaImpl(  viewer_media_t LLViewerMedia::updateMediaImpl(LLMediaEntry* media_entry, const std::string& previous_url, bool update_from_self)  { +    llassert(!gCubeSnapshot);  	// Try to find media with the same media ID  	viewer_media_t media_impl = getMediaImplFromTextureID(media_entry->getMediaID()); @@ -626,6 +629,8 @@ void LLViewerMedia::updateMedia(void *dummy_arg)  {      LL_PROFILE_ZONE_SCOPED_CATEGORY_MEDIA; //LL_RECORD_BLOCK_TIME(FTM_MEDIA_UPDATE); +    llassert(!gCubeSnapshot); +  	// Enable/disable the plugin read thread  	LLPluginProcessParent::setUseReadThread(gSavedSettings.getBOOL("PluginUseReadThread")); @@ -3003,6 +3008,7 @@ void LLViewerMediaImpl::updateImagesMediaStreams()  LLViewerMediaTexture* LLViewerMediaImpl::updateMediaImage()  {      LL_PROFILE_ZONE_SCOPED_CATEGORY_MEDIA; +    llassert(!gCubeSnapshot);      if (!mMediaSource)      {          return nullptr; // not ready for updating @@ -3558,6 +3564,8 @@ void LLViewerMediaImpl::calculateInterest()      LL_PROFILE_ZONE_SCOPED_CATEGORY_MEDIA; //LL_RECORD_BLOCK_TIME(FTM_MEDIA_CALCULATE_INTEREST);  	LLViewerMediaTexture* texture = LLViewerTextureManager::findMediaTexture( mTextureId ); +    llassert(!gCubeSnapshot); +  	if(texture != NULL)  	{  		mInterest = texture->getMaxVirtualSize(); diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 89538b3bd5..25efe189cb 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -8898,6 +8898,12 @@ class LLWorldEnvSettings : public view_listener_t              LLEnvironment::instance().setSelectedEnvironment(LLEnvironment::ENV_LOCAL, LLEnvironment::TRANSITION_INSTANT);              defocusEnvFloaters();  		} +        else if (event_name == "legacy noon") +        { +            LLEnvironment::instance().setEnvironment(LLEnvironment::ENV_LOCAL, LLEnvironment::KNOWN_SKY_LEGACY_MIDDAY, LLEnvironment::TRANSITION_INSTANT); +            LLEnvironment::instance().setSelectedEnvironment(LLEnvironment::ENV_LOCAL, LLEnvironment::TRANSITION_INSTANT); +            defocusEnvFloaters(); +        }  		else if (event_name == "sunset")  		{              LLEnvironment::instance().setEnvironment(LLEnvironment::ENV_LOCAL, LLEnvironment::KNOWN_SKY_SUNSET, LLEnvironment::TRANSITION_INSTANT); @@ -8912,6 +8918,9 @@ class LLWorldEnvSettings : public view_listener_t  		}          else if (event_name == "region")  		{ +            // reset probe data when reverting back to region sky setting +            gPipeline.mReflectionMapManager.reset(); +              LLEnvironment::instance().clearEnvironment(LLEnvironment::ENV_LOCAL);              LLEnvironment::instance().setSelectedEnvironment(LLEnvironment::ENV_LOCAL, LLEnvironment::TRANSITION_INSTANT);              defocusEnvFloaters(); @@ -8966,6 +8975,10 @@ class LLWorldEnableEnvSettings : public view_listener_t  			{              result = (skyid == LLEnvironment::KNOWN_SKY_MIDDAY);  			} +        else if (event_name == "legacy noon") +        { +            result = (skyid == LLEnvironment::KNOWN_SKY_LEGACY_MIDDAY); +        }  		else if (event_name == "sunset")  			{              result = (skyid == LLEnvironment::KNOWN_SKY_SUNSET); diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp index 4c34c6f6e5..1fd536ceac 100644 --- a/indra/newview/llviewershadermgr.cpp +++ b/indra/newview/llviewershadermgr.cpp @@ -2555,20 +2555,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  		gDeferredPostGammaCorrectProgram.mFeatures.isDeferred = true;  		gDeferredPostGammaCorrectProgram.mShaderFiles.clear();          gDeferredPostGammaCorrectProgram.clearPermutations(); -        U32 tonemapper = gSavedSettings.getU32("RenderTonemapper"); -        if (tonemapper == 1) -        { -            gDeferredPostGammaCorrectProgram.addPermutation("TONEMAP_ACES_NARKOWICZ", "1"); -        } -        else if (tonemapper == 2) -        { -            gDeferredPostGammaCorrectProgram.addPermutation("TONEMAP_ACES_HILL_EXPOSURE_BOOST", "1"); -        } -        else -        { -            gDeferredPostGammaCorrectProgram.addPermutation("TONEMAP_LINEAR", "1"); -        } -		gDeferredPostGammaCorrectProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredNoTCV.glsl", GL_VERTEX_SHADER)); +        gDeferredPostGammaCorrectProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredNoTCV.glsl", GL_VERTEX_SHADER));  		gDeferredPostGammaCorrectProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredGammaCorrect.glsl", GL_FRAGMENT_SHADER));          gDeferredPostGammaCorrectProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED];  		success = gDeferredPostGammaCorrectProgram.createShader(NULL, NULL); diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index 7cc3337243..cbb2d4ac76 100644 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -623,7 +623,7 @@ private:  	//--------------------------------------------------------------------  public:  	virtual LLViewerTexture::EBoostLevel 	getAvatarBoostLevel() const { return LLGLTexture::BOOST_AVATAR; } -	virtual LLViewerTexture::EBoostLevel 	getAvatarBakedBoostLevel() const { return LLGLTexture::BOOST_AVATAR_BAKED; } +	virtual LLViewerTexture::EBoostLevel 	getAvatarBakedBoostLevel() const { return LLGLTexture::BOOST_AVATAR_BAKED_SELF; }  	virtual S32 						getTexImageSize() const;  	/*virtual*/ S32						getTexImageArea() const { return getTexImageSize()*getTexImageSize(); } diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index db477f64e3..3e9a1bb353 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -6953,7 +6953,6 @@ void LLPipeline::generateLuminance(LLRenderTarget* src, LLRenderTarget* dst) {  		gLuminanceProgram.bind(); -  		S32 channel = 0;  		channel = gLuminanceProgram.enableTexture(LLShaderMgr::DEFERRED_DIFFUSE);  		if (channel > -1) @@ -6967,7 +6966,6 @@ void LLPipeline::generateLuminance(LLRenderTarget* src, LLRenderTarget* dst) {  			mGlow[1].bindTexture(0, channel);  		} -  		mScreenTriangleVB->setBuffer();  		mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);  		dst->flush(); @@ -6990,7 +6988,7 @@ void LLPipeline::generateExposure(LLRenderTarget* src, LLRenderTarget* dst) {  			// copy last frame's exposure into mLastExposure  			mLastExposure.bindTarget();  			gCopyProgram.bind(); -			gGL.getTexUnit(0)->bind(&mExposureMap); +			gGL.getTexUnit(0)->bind(dst);  			mScreenTriangleVB->setBuffer();  			mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); @@ -7007,7 +7005,7 @@ void LLPipeline::generateExposure(LLRenderTarget* src, LLRenderTarget* dst) {  		S32 channel = gExposureProgram.enableTexture(LLShaderMgr::DEFERRED_EMISSIVE);  		if (channel > -1)  		{ -			src->bindTexture(0, channel, LLTexUnit::TFO_TRILINEAR); +			mLuminanceMap.bindTexture(0, channel, LLTexUnit::TFO_TRILINEAR);  		}  		channel = gExposureProgram.enableTexture(LLShaderMgr::EXPOSURE_MAP); @@ -7016,13 +7014,13 @@ void LLPipeline::generateExposure(LLRenderTarget* src, LLRenderTarget* dst) {  			mLastExposure.bindTexture(0, channel);  		} +		static LLStaticHashedString dt("dt"); +		static LLStaticHashedString noiseVec("noiseVec"); +		static LLStaticHashedString dynamic_exposure_params("dynamic_exposure_params");  		static LLCachedControl<F32> dynamic_exposure_coefficient(gSavedSettings, "RenderDynamicExposureCoefficient", 0.175f);  		static LLCachedControl<F32> dynamic_exposure_min(gSavedSettings, "RenderDynamicExposureMin", 0.125f);  		static LLCachedControl<F32> dynamic_exposure_max(gSavedSettings, "RenderDynamicExposureMax", 1.3f); -		static LLStaticHashedString dt("dt"); -		static LLStaticHashedString noiseVec("noiseVec"); -		static LLStaticHashedString dynamic_exposure_params("dynamic_exposure_params");  		gExposureProgram.uniform1f(dt, gFrameIntervalSeconds);  		gExposureProgram.uniform2f(noiseVec, ll_frand() * 2.0 - 1.0, ll_frand() * 2.0 - 1.0);  		gExposureProgram.uniform3f(dynamic_exposure_params, dynamic_exposure_coefficient, dynamic_exposure_min, dynamic_exposure_max); @@ -7057,7 +7055,7 @@ void LLPipeline::gammaCorrect(LLRenderTarget* src, LLRenderTarget* dst) {  		static LLCachedControl<F32> exposure(gSavedSettings, "RenderExposure", 1.f); -		F32 e = llclamp(exposure(), 0.5f, 4.f); +		F32 e = llclamp(exposure(), 0.5f, 4.f);         		static LLStaticHashedString s_exposure("exposure"); @@ -9432,6 +9430,7 @@ void LLPipeline::generateSunShadow(LLCamera& camera)  			set_current_projection(saved_proj);  			LLVector3 eye = camera.getOrigin(); +            llassert(eye.isFinite());  			//camera used for shadow cull/render  			LLCamera shadow_cam; @@ -9711,6 +9710,7 @@ void LLPipeline::generateSunShadow(LLCamera& camera)  					{  						//get perspective projection  						view[j] = view[j].inverse(); +                        //llassert(origin.isFinite());  						glh::vec3f origin_agent(origin.mV); @@ -9718,7 +9718,7 @@ void LLPipeline::generateSunShadow(LLCamera& camera)  						view[j].mult_matrix_vec(origin_agent);  						eye = LLVector3(origin_agent.v); - +                        //llassert(eye.isFinite());  						if (!hasRenderDebugMask(LLPipeline::RENDER_DEBUG_SHADOW_FRUSTA) && !gCubeSnapshot)  						{  							mShadowFrustOrigin[j] = eye; 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 17875e9c19..16b965843d 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 @@ -712,42 +712,6 @@        value="2"/>    </combo_box> - -  <text -    type="string" -    length="1" -    follows="left|top" -    height="16" -    layout="topleft" -    left="420" -    name="RenderTonemapperText" -    text_readonly_color="LabelDisabledColor" -    top_delta="24" -    width="128"> -    Tonemapper: -  </text> -  <combo_box -   control_name="RenderTonemapper" -   height="18" -   layout="topleft" -   left_delta="130" -   top_delta="0" -   name="ToneMapper" -   width="150"> -    <combo_box.item -      label="Linear" -      name="0" -      value="0"/> -    <combo_box.item -      label="ACES Narkowicz" -      name="1" -      value="1"/> -    <combo_box.item -      label="ACES Hill" -      name="2" -      value="2"/> -  </combo_box> -      <slider      control_name="RenderExposure"      decimal_digits="1" diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index d77415877c..4a92bdc601 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -902,17 +902,27 @@                   function="World.EnableEnvSettings"                    parameter="sunrise" />              </menu_item_check> -            <menu_item_check -             label="Midday" -             name="Noon" -             shortcut="control|shift|Y"> -                <menu_item_check.on_click -                 function="World.EnvSettings" -                 parameter="noon" /> -                <menu_item_check.on_check -                 function="World.EnableEnvSettings"  -                 parameter="noon" /> -            </menu_item_check> +          <menu_item_check +           label="Midday" +           name="Noon" +           shortcut="control|shift|Y"> +            <menu_item_check.on_click +             function="World.EnvSettings" +             parameter="noon" /> +            <menu_item_check.on_check +             function="World.EnableEnvSettings" +             parameter="noon" /> +          </menu_item_check> +          <menu_item_check +             label="Midday (Legacy)" +             name="legacy noon"> +            <menu_item_check.on_click +             function="World.EnvSettings" +             parameter="legacy noon" /> +            <menu_item_check.on_check +             function="World.EnableEnvSettings" +             parameter="legacy noon" /> +          </menu_item_check>              <menu_item_check               label="Sunset"               name="Sunset"  | 
