diff options
Diffstat (limited to 'indra')
39 files changed, 260 insertions, 383 deletions
| diff --git a/indra/llprimitive/llgltfmaterial.cpp b/indra/llprimitive/llgltfmaterial.cpp index d0ecf611ff..62b693919c 100644 --- a/indra/llprimitive/llgltfmaterial.cpp +++ b/indra/llprimitive/llgltfmaterial.cpp @@ -43,26 +43,16 @@ const char* const GLTF_FILE_EXTENSION_TRANSFORM_ROTATION = "rotation";  // special UUID that indicates a null UUID in override data  static const LLUUID GLTF_OVERRIDE_NULL_UUID = LLUUID("ffffffff-ffff-ffff-ffff-ffffffffffff"); -// https://github.com/KhronosGroup/glTF/tree/main/extensions/3.0/Khronos/KHR_texture_transform -LLMatrix3 LLGLTFMaterial::TextureTransform::asMatrix() -{ -    LLMatrix3 scale; -    scale.mMatrix[0][0] = mScale[0]; -    scale.mMatrix[1][1] = mScale[1]; - -    LLMatrix3 rotation; -    const F32 cos_r = cos(mRotation); -    const F32 sin_r = sin(mRotation); -    rotation.mMatrix[0][0] = cos_r; -    rotation.mMatrix[0][1] = -sin_r; -    rotation.mMatrix[1][0] = sin_r; -    rotation.mMatrix[1][1] = cos_r; - -    LLMatrix3 offset; -    offset.mMatrix[2][0] = mOffset[0]; -    offset.mMatrix[2][1] = mOffset[1]; - -    return offset * rotation * scale; +void LLGLTFMaterial::TextureTransform::getPacked(F32 (&packed)[8]) +{ +    packed[0] = mScale.mV[VX]; +    packed[1] = mScale.mV[VY]; +    packed[2] = mRotation; +    // packed[3] = unused +    packed[4] = mOffset.mV[VX]; +    packed[5] = mOffset.mV[VY]; +    // packed[6] = unused +    // packed[7] = unused  }  bool LLGLTFMaterial::TextureTransform::operator==(const TextureTransform& other) const diff --git a/indra/llprimitive/llgltfmaterial.h b/indra/llprimitive/llgltfmaterial.h index cae7284421..e701b62fdc 100644 --- a/indra/llprimitive/llgltfmaterial.h +++ b/indra/llprimitive/llgltfmaterial.h @@ -28,7 +28,6 @@  #include "llrefcount.h"  #include "llmemory.h" -#include "m3math.h"  #include "v4color.h"  #include "v3color.h"  #include "v2math.h" @@ -60,7 +59,7 @@ public:          LLVector2 mScale = { 1.f, 1.f };          F32 mRotation = 0.f; -        LLMatrix3 asMatrix(); +        void getPacked(F32 (&packed)[8]);          bool operator==(const TextureTransform& other) const;      }; diff --git a/indra/llrender/llshadermgr.cpp b/indra/llrender/llshadermgr.cpp index 13074032e0..6fb319fd5b 100644 --- a/indra/llrender/llshadermgr.cpp +++ b/indra/llrender/llshadermgr.cpp @@ -1073,11 +1073,13 @@ void LLShaderMgr::initAttribsAndUniforms()  	mReservedUniforms.push_back("texture_matrix3");  	mReservedUniforms.push_back("object_plane_s");  	mReservedUniforms.push_back("object_plane_t"); -    mReservedUniforms.push_back("texture_basecolor_matrix"); // GLTF -    mReservedUniforms.push_back("texture_normal_matrix"); // GLTF -    mReservedUniforms.push_back("texture_metallic_roughness_matrix"); // GLTF -    mReservedUniforms.push_back("texture_emissive_matrix"); // GLTF -    llassert(mReservedUniforms.size() == LLShaderMgr::TEXTURE_EMISSIVE_MATRIX+1); + +    mReservedUniforms.push_back("texture_base_color_transform"); // (GLTF) +    mReservedUniforms.push_back("texture_normal_transform"); // (GLTF) +    mReservedUniforms.push_back("texture_metallic_roughness_transform"); // (GLTF) +    mReservedUniforms.push_back("texture_emissive_transform"); // (GLTF) + +    llassert(mReservedUniforms.size() == LLShaderMgr::TEXTURE_EMISSIVE_TRANSFORM+1);  	mReservedUniforms.push_back("viewport"); diff --git a/indra/llrender/llshadermgr.h b/indra/llrender/llshadermgr.h index 3c8bef635a..93ea49d16a 100644 --- a/indra/llrender/llshadermgr.h +++ b/indra/llrender/llshadermgr.h @@ -52,10 +52,12 @@ public:          TEXTURE_MATRIX3,                    //  "texture_matrix3"          OBJECT_PLANE_S,                     //  "object_plane_s"          OBJECT_PLANE_T,                     //  "object_plane_t" -        TEXTURE_BASECOLOR_MATRIX,           //  "texture_basecolor_matrix" (GLTF) -        TEXTURE_NORMAL_MATRIX,              //  "texture_normal_matrix" (GLTF) -        TEXTURE_METALLIC_ROUGHNESS_MATRIX,  //  "texture_metallic_roughness_matrix" (GLTF) -        TEXTURE_EMISSIVE_MATRIX,            //  "texture_emissive_matrix" (GLTF) + +        TEXTURE_BASE_COLOR_TRANSFORM,         //  "texture_base_color_transform" (GLTF) +        TEXTURE_NORMAL_TRANSFORM,             //  "texture_normal_transform" (GLTF) +        TEXTURE_METALLIC_ROUGHNESS_TRANSFORM, //  "texture_metallic_roughness_transform" (GLTF) +        TEXTURE_EMISSIVE_TRANSFORM,           //  "texture_emissive_transform" (GLTF) +          VIEWPORT,                           //  "viewport"          LIGHT_POSITION,                     //  "light_position"          LIGHT_DIRECTION,                    //  "light_direction" diff --git a/indra/newview/app_settings/shaders/class1/deferred/pbralphaF.glsl b/indra/newview/app_settings/shaders/class1/deferred/pbralphaF.glsl index 3f3c11517e..2ccd3fd962 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/pbralphaF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/pbralphaF.glsl @@ -30,4 +30,4 @@ out vec4 frag_color;  void main()  {      frag_color = vec4(1.0, 0, 0.5, 0.5); -}
\ No newline at end of file +} diff --git a/indra/newview/app_settings/shaders/class1/deferred/pbralphaV.glsl b/indra/newview/app_settings/shaders/class1/deferred/pbralphaV.glsl index 24faf1763f..e9515a9187 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/pbralphaV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/pbralphaV.glsl @@ -44,10 +44,10 @@ uniform mat4 modelview_matrix;  out vec3 vary_position; -uniform mat3 texture_basecolor_matrix; -uniform mat3 texture_normal_matrix; -uniform mat3 texture_metallic_roughness_matrix; -uniform mat3 texture_emissive_matrix; +uniform vec4[2] texture_base_color_transform; +uniform vec4[2] texture_normal_transform; +uniform vec4[2] texture_metallic_roughness_transform; +uniform vec4[2] texture_emissive_transform;  out vec3 vary_fragcoord; @@ -59,7 +59,7 @@ in vec3 normal;  in vec4 tangent;  in vec2 texcoord0; -out vec2 basecolor_texcoord; +out vec2 base_color_texcoord;  out vec2 normal_texcoord;  out vec2 metallic_roughness_texcoord;  out vec2 emissive_texcoord; @@ -70,7 +70,7 @@ out vec3 vary_tangent;  flat out float vary_sign;  out vec3 vary_normal; -vec2 texture_transform(vec2 vertex_texcoord, mat3 khr_gltf_transform, mat4 sl_animation_transform); +vec2 texture_transform(vec2 vertex_texcoord, vec4[2] khr_gltf_transform, mat4 sl_animation_transform);  void main() @@ -89,10 +89,10 @@ void main()      vary_fragcoord.xyz = vert.xyz + vec3(0,0,near_clip); -	basecolor_texcoord = texture_transform(texcoord0, texture_basecolor_matrix, texture_matrix0); -	normal_texcoord = texture_transform(texcoord0, texture_normal_matrix, texture_matrix0); -	metallic_roughness_texcoord = texture_transform(texcoord0, texture_metallic_roughness_matrix, texture_matrix0); -	emissive_texcoord = texture_transform(texcoord0, texture_emissive_matrix, texture_matrix0); +    base_color_texcoord = texture_transform(texcoord0, texture_base_color_transform, texture_matrix0); +    normal_texcoord = texture_transform(texcoord0, texture_normal_transform, texture_matrix0); +    metallic_roughness_texcoord = texture_transform(texcoord0, texture_metallic_roughness_transform, texture_matrix0); +    emissive_texcoord = texture_transform(texcoord0, texture_emissive_transform, texture_matrix0);  #ifdef HAS_SKIN  	vec3 n = (mat*vec4(normal.xyz+position.xyz,1.0)).xyz-pos.xyz; @@ -125,19 +125,19 @@ uniform mat4 modelview_matrix;  out vec3 vary_position; -uniform mat3 texture_basecolor_matrix; -uniform mat3 texture_emissive_matrix; +uniform vec4[2] texture_base_color_transform; +uniform vec4[2] texture_emissive_transform;  in vec3 position;  in vec4 diffuse_color;  in vec2 texcoord0; -out vec2 basecolor_texcoord; +out vec2 base_color_texcoord;  out vec2 emissive_texcoord;  out vec4 vertex_color; -vec2 texture_transform(vec2 vertex_texcoord, mat3 khr_gltf_transform, mat4 sl_animation_transform); +vec2 texture_transform(vec2 vertex_texcoord, vec4[2] khr_gltf_transform, mat4 sl_animation_transform);  void main() @@ -147,8 +147,8 @@ void main()      gl_Position = vert;      vary_position = vert.xyz; -	basecolor_texcoord = texture_transform(texcoord0, texture_basecolor_matrix, texture_matrix0); -	emissive_texcoord = texture_transform(texcoord0, texture_emissive_matrix, texture_matrix0); +    base_color_texcoord = texture_transform(texcoord0, texture_base_color_transform, texture_matrix0); +    emissive_texcoord = texture_transform(texcoord0, texture_emissive_transform, texture_matrix0);  	vertex_color = diffuse_color;  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/pbrglowF.glsl b/indra/newview/app_settings/shaders/class1/deferred/pbrglowF.glsl index 8dc9e02f7a..1c36aa6b50 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/pbrglowF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/pbrglowF.glsl @@ -37,7 +37,7 @@ out vec4 frag_color;  in vec3 vary_position;  in vec4 vertex_emissive; -in vec2 basecolor_texcoord; +in vec2 base_color_texcoord;  in vec2 emissive_texcoord;  uniform float minimum_alpha; // PBR alphaMode: MASK, See: mAlphaCutoff, setAlphaCutoff() @@ -47,7 +47,7 @@ vec3 srgb_to_linear(vec3 c);  void main()  { -    vec4 basecolor = texture2D(diffuseMap, basecolor_texcoord.xy).rgba; +    vec4 basecolor = texture2D(diffuseMap, base_color_texcoord.xy).rgba;      if (basecolor.a < minimum_alpha)      { diff --git a/indra/newview/app_settings/shaders/class1/deferred/pbrglowV.glsl b/indra/newview/app_settings/shaders/class1/deferred/pbrglowV.glsl index bcad1c1ceb..82a50a115c 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/pbrglowV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/pbrglowV.glsl @@ -34,20 +34,20 @@ uniform mat4 modelview_projection_matrix;  uniform mat4 texture_matrix0; -uniform mat3 texture_basecolor_matrix; -uniform mat3 texture_emissive_matrix; +uniform vec4[2] texture_base_color_transform; +uniform vec4[2] texture_emissive_transform;  in vec3 position;  in vec4 emissive;  in vec2 texcoord0; -out vec2 basecolor_texcoord; +out vec2 base_color_texcoord;  out vec2 emissive_texcoord;  out vec4 vertex_emissive; -vec2 texture_transform(vec2 vertex_texcoord, mat3 khr_gltf_transform, mat4 sl_animation_transform); +vec2 texture_transform(vec2 vertex_texcoord, vec4[2] khr_gltf_transform, mat4 sl_animation_transform);  void main()  { @@ -64,8 +64,8 @@ void main()      gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);   #endif -    basecolor_texcoord = texture_transform(texcoord0, texture_basecolor_matrix, texture_matrix0); -    emissive_texcoord = texture_transform(texcoord0, texture_emissive_matrix, texture_matrix0); +    base_color_texcoord = texture_transform(texcoord0, texture_base_color_transform, texture_matrix0); +    emissive_texcoord = texture_transform(texcoord0, texture_emissive_transform, texture_matrix0);      vertex_emissive = emissive;  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/pbropaqueF.glsl b/indra/newview/app_settings/shaders/class1/deferred/pbropaqueF.glsl index c4c5a7872b..6659e67a7a 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/pbropaqueF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/pbropaqueF.glsl @@ -47,7 +47,7 @@ in vec3 vary_normal;  in vec3 vary_tangent;  flat in float vary_sign; -in vec2 basecolor_texcoord; +in vec2 base_color_texcoord;  in vec2 normal_texcoord;  in vec2 metallic_roughness_texcoord;  in vec2 emissive_texcoord; @@ -62,7 +62,7 @@ uniform mat3 normal_matrix;  void main()  { -    vec4 basecolor = texture2D(diffuseMap, basecolor_texcoord.xy).rgba; +    vec4 basecolor = texture2D(diffuseMap, base_color_texcoord.xy).rgba;      if (basecolor.a < minimum_alpha)      {          discard; @@ -121,7 +121,7 @@ out vec4 frag_color;  in vec3 vary_position;  in vec4 vertex_color; -in vec2 basecolor_texcoord; +in vec2 base_color_texcoord;  in vec2 emissive_texcoord;  uniform float minimum_alpha; // PBR alphaMode: MASK, See: mAlphaCutoff, setAlphaCutoff() @@ -131,7 +131,7 @@ vec3 srgb_to_linear(vec3 c);  void main()  { -    vec4 basecolor = texture2D(diffuseMap, basecolor_texcoord.xy).rgba; +    vec4 basecolor = texture2D(diffuseMap, base_color_texcoord.xy).rgba;      if (basecolor.a < minimum_alpha)      {          discard; diff --git a/indra/newview/app_settings/shaders/class1/deferred/pbropaqueV.glsl b/indra/newview/app_settings/shaders/class1/deferred/pbropaqueV.glsl index f0e3d4f034..e2c23ac8f0 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/pbropaqueV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/pbropaqueV.glsl @@ -38,10 +38,10 @@ uniform mat4 modelview_projection_matrix;  #endif  uniform mat4 texture_matrix0; -uniform mat3 texture_basecolor_matrix; -uniform mat3 texture_normal_matrix; -uniform mat3 texture_metallic_roughness_matrix; -uniform mat3 texture_emissive_matrix; +uniform vec4[2] texture_base_color_transform; +uniform vec4[2] texture_normal_transform; +uniform vec4[2] texture_metallic_roughness_transform; +uniform vec4[2] texture_emissive_transform;  in vec3 position;  in vec4 diffuse_color; @@ -49,7 +49,7 @@ in vec3 normal;  in vec4 tangent;  in vec2 texcoord0; -out vec2 basecolor_texcoord; +out vec2 base_color_texcoord;  out vec2 normal_texcoord;  out vec2 metallic_roughness_texcoord;  out vec2 emissive_texcoord; @@ -60,7 +60,7 @@ out vec3 vary_tangent;  flat out float vary_sign;  out vec3 vary_normal; -vec2 texture_transform(vec2 vertex_texcoord, mat3 khr_gltf_transform, mat4 sl_animation_transform); +vec2 texture_transform(vec2 vertex_texcoord, vec4[2] khr_gltf_transform, mat4 sl_animation_transform);  void main()  { @@ -78,10 +78,10 @@ void main()  	gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);   #endif -    basecolor_texcoord = texture_transform(texcoord0, texture_basecolor_matrix, texture_matrix0); -    normal_texcoord = texture_transform(texcoord0, texture_normal_matrix, texture_matrix0); -    metallic_roughness_texcoord = texture_transform(texcoord0, texture_metallic_roughness_matrix, texture_matrix0); -    emissive_texcoord = texture_transform(texcoord0, texture_emissive_matrix, texture_matrix0); +    base_color_texcoord = texture_transform(texcoord0, texture_base_color_transform, texture_matrix0); +    normal_texcoord = texture_transform(texcoord0, texture_normal_transform, texture_matrix0); +    metallic_roughness_texcoord = texture_transform(texcoord0, texture_metallic_roughness_transform, texture_matrix0); +    emissive_texcoord = texture_transform(texcoord0, texture_emissive_transform, texture_matrix0);  #ifdef HAS_SKIN  	vec3 n = (mat*vec4(normal.xyz+position.xyz,1.0)).xyz-pos.xyz; @@ -106,29 +106,29 @@ uniform mat4 modelview_projection_matrix;  uniform mat4 texture_matrix0; -uniform mat3 texture_basecolor_matrix; -uniform mat3 texture_normal_matrix; -uniform mat3 texture_metallic_roughness_matrix; -uniform mat3 texture_emissive_matrix; +uniform vec4[2] texture_base_color_transform; +uniform vec4[2] texture_normal_transform; +uniform vec4[2] texture_metallic_roughness_transform; +uniform vec4[2] texture_emissive_transform;  in vec3 position;  in vec4 diffuse_color;  in vec2 texcoord0; -out vec2 basecolor_texcoord; +out vec2 base_color_texcoord;  out vec2 emissive_texcoord;  out vec4 vertex_color; -vec2 texture_transform(vec2 vertex_texcoord, mat3 khr_gltf_transform, mat4 sl_animation_transform); +vec2 texture_transform(vec2 vertex_texcoord, vec4[2] khr_gltf_transform, mat4 sl_animation_transform);  void main()  {      //transform vertex      gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);  -    basecolor_texcoord = texture_transform(texcoord0, texture_basecolor_matrix, texture_matrix0); -    emissive_texcoord = texture_transform(texcoord0, texture_emissive_matrix, texture_matrix0); +    base_color_texcoord = texture_transform(texcoord0, texture_base_color_transform, texture_matrix0); +    emissive_texcoord = texture_transform(texcoord0, texture_emissive_transform, texture_matrix0);      vertex_color = diffuse_color;  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/postDeferredGammaCorrect.glsl b/indra/newview/app_settings/shaders/class1/deferred/postDeferredGammaCorrect.glsl index f0e940eb5f..cc77712347 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/postDeferredGammaCorrect.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/postDeferredGammaCorrect.glsl @@ -134,6 +134,7 @@ vec3 toneMap(vec3 color)      color *= exposure;  #ifdef TONEMAP_ACES_NARKOWICZ +    color *= 0.8;      color = toneMapACES_Narkowicz(color);  #endif @@ -145,7 +146,7 @@ vec3 toneMap(vec3 color)      // 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 /= 0.6; +    color *= 0.85/0.6;      color = toneMapACES_Hill(color);  #endif diff --git a/indra/newview/app_settings/shaders/class1/deferred/textureUtilV.glsl b/indra/newview/app_settings/shaders/class1/deferred/textureUtilV.glsl index b146c665f9..71f7ec52c4 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/textureUtilV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/textureUtilV.glsl @@ -23,6 +23,31 @@   * $/LicenseInfo$   */ +// This shader code is taken from the sample code on the KHR_texture_transform +// spec page page, plus or minus some sign error corrections (I think because the GLSL +// matrix constructor is backwards?): +// https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_texture_transform +// Previously (6494eed242b1), we passed in a single, precalculated matrix +// uniform per transform into the shaders. However, that was found to produce +// small-but-noticeable discrepancies with the GLTF sample model +// "TextureTransformTest", likely due to numerical precision differences. In +// the interest of parity with other renderers, calculate the transform +// directly in the shader. -Cosmic,2023-02-24 +vec2 khr_texture_transform(vec2 texcoord, vec2 scale, float rotation, vec2 offset) +{ +    mat3 scale_mat = mat3(scale.x,0,0, 0,scale.y,0, 0,0,1); +    mat3 offset_mat = mat3(1,0,0, 0,1,0, offset.x, offset.y, 1); +    mat3 rotation_mat = mat3( +        cos(rotation),-sin(rotation), 0, +        sin(rotation), cos(rotation), 0, +                    0,             0, 1 +    ); + +    mat3 transform = offset_mat * rotation_mat * scale_mat; + +    return (transform * vec3(texcoord, 1)).xy; +} +  // vertex_texcoord - The UV texture coordinates sampled from the vertex at  //     runtime. Per SL convention, this is in a right-handed UV coordinate  //     system. Collada models also have right-handed UVs. @@ -33,20 +58,18 @@  //     animations, available through LSL script functions such as  //     LlSetTextureAnim. It assumes a right-handed UV coordinate system.  // texcoord - The final texcoord to use for image sampling -vec2 texture_transform(vec2 vertex_texcoord, mat3 khr_gltf_transform, mat4 sl_animation_transform) +vec2 texture_transform(vec2 vertex_texcoord, vec4[2] khr_gltf_transform, mat4 sl_animation_transform)  {      vec2 texcoord = vertex_texcoord; +    // Apply texture animation first to avoid shearing and other artifacts +    texcoord = (sl_animation_transform * vec4(texcoord, 0, 1)).xy;      // Convert to left-handed coordinate system. The offset of 1 is necessary      // for rotations to be applied correctly. -    // In the future, we could bake this coordinate conversion into the uniform -    // that khr_gltf_transform comes from, since it's applied immediately -    // before.      texcoord.y = 1.0 - texcoord.y; -    texcoord = (khr_gltf_transform * vec3(texcoord, 1.0)).xy; +    texcoord = khr_texture_transform(texcoord, khr_gltf_transform[0].xy, khr_gltf_transform[0].z, khr_gltf_transform[1].xy);      // Convert back to right-handed coordinate system      texcoord.y = 1.0 - texcoord.y; -    texcoord = (sl_animation_transform * vec4(texcoord, 0, 1)).xy;      // To make things more confusing, all SL image assets are upside-down      // We may need an additional sign flip here when we implement a Vulkan backend diff --git a/indra/newview/app_settings/shaders/class1/interface/reflectionmipF.glsl b/indra/newview/app_settings/shaders/class1/interface/reflectionmipF.glsl index 9f7706fe36..45267e4403 100644 --- a/indra/newview/app_settings/shaders/class1/interface/reflectionmipF.glsl +++ b/indra/newview/app_settings/shaders/class1/interface/reflectionmipF.glsl @@ -26,29 +26,11 @@  out vec4 frag_color;  uniform sampler2D diffuseRect; -uniform sampler2D depthMap; - -uniform float resScale; -uniform float znear; -uniform float zfar;  in vec2 vary_texcoord0; -// get linear depth value given a depth buffer sample d and znear and zfar values -float linearDepth(float d, float znear, float zfar); -  void main()   { -    float depth = texture(depthMap, vary_texcoord0.xy).r; -    float dist = linearDepth(depth, znear, zfar); - -    // convert linear depth to distance -    vec3 v; -    v.xy = vary_texcoord0.xy / 512.0 * 2.0 - 1.0; -    v.z = 1.0; -    v = normalize(v); -    dist /= v.z; -      vec3 col = texture(diffuseRect, vary_texcoord0.xy).rgb; -    frag_color = vec4(col, dist/256.0); +    frag_color = vec4(col, 0.0);  } diff --git a/indra/newview/app_settings/shaders/class2/deferred/pbralphaF.glsl b/indra/newview/app_settings/shaders/class2/deferred/pbralphaF.glsl index 987b0ca1d5..2a093827cb 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/pbralphaF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/pbralphaF.glsl @@ -54,7 +54,7 @@ in vec3 vary_fragcoord;  in vec3 vary_position; -in vec2 basecolor_texcoord; +in vec2 base_color_texcoord;  in vec2 normal_texcoord;  in vec2 metallic_roughness_texcoord;  in vec2 emissive_texcoord; @@ -168,7 +168,7 @@ void main()      waterClip(pos); -    vec4 basecolor = texture(diffuseMap, basecolor_texcoord.xy).rgba; +    vec4 basecolor = texture(diffuseMap, base_color_texcoord.xy).rgba;      basecolor.rgb = srgb_to_linear(basecolor.rgb);  #ifdef HAS_ALPHA_MASK      if (basecolor.a < minimum_alpha) @@ -267,7 +267,7 @@ out vec4 frag_color;  in vec3 vary_position; -in vec2 basecolor_texcoord; +in vec2 base_color_texcoord;  in vec2 emissive_texcoord;  in vec4 vertex_color; @@ -286,7 +286,7 @@ void main()      vec3  pos         = vary_position; -    vec4 basecolor = texture(diffuseMap, basecolor_texcoord.xy).rgba; +    vec4 basecolor = texture(diffuseMap, base_color_texcoord.xy).rgba;      basecolor.rgb = srgb_to_linear(basecolor.rgb);  #ifdef HAS_ALPHA_MASK      if (basecolor.a < minimum_alpha) diff --git a/indra/newview/app_settings/shaders/class2/deferred/reflectionProbeF.glsl b/indra/newview/app_settings/shaders/class2/deferred/reflectionProbeF.glsl index f1ee4b4681..5fa53c374b 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/reflectionProbeF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/reflectionProbeF.glsl @@ -34,7 +34,7 @@ uniform mat3 env_mat;  vec3 srgb_to_linear(vec3 c);  void sampleReflectionProbes(inout vec3 ambenv, inout vec3 glossenv, -        vec2 tc, vec3 pos, vec3 norm, float glossiness, bool errorCorrect) +        vec2 tc, vec3 pos, vec3 norm, float glossiness)  {      ambenv = vec3(reflection_probe_ambiance * 0.25); @@ -43,11 +43,11 @@ void sampleReflectionProbes(inout vec3 ambenv, inout vec3 glossenv,      glossenv = srgb_to_linear(textureCube(environmentMap, env_vec).rgb);  } -void sampleReflectionProbes(inout vec3 ambenv, inout vec3 glossenv, -    vec2 tc, vec3 pos, vec3 norm, float glossiness) +void sampleReflectionProbesWater(inout vec3 ambenv, inout vec3 glossenv, +        vec2 tc, vec3 pos, vec3 norm, float glossiness)  { -    sampleReflectionProbes(ambenv, glossenv, -        tc, pos, norm, glossiness, false); +    sampleReflectionProbes(ambenv, glossenv, tc, pos, norm, glossiness); +    glossenv *= 8.0;  }  vec4 sampleReflectionProbesDebug(vec3 pos) diff --git a/indra/newview/app_settings/shaders/class3/deferred/materialF.glsl b/indra/newview/app_settings/shaders/class3/deferred/materialF.glsl index b00a6ed757..49529860be 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/materialF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/materialF.glsl @@ -382,11 +382,6 @@ void main()      color.rgb = mix(atmosFragLightingLinear(color.rgb, additive, atten), fullbrightAtmosTransportFragLinear(color, additive, atten), emissive);       color.rgb = scaleSoftClipFragLinear(color.rgb); -#ifdef WATER_FOG -    vec4 temp = applyWaterFogView(pos, vec4(color, 0.0)); -    color = temp.rgb; -#endif -      vec3 npos = normalize(-pos.xyz);      vec3 light = vec3(0, 0, 0); @@ -400,11 +395,18 @@ void main()          LIGHT_LOOP(6)          LIGHT_LOOP(7) +    light *= 1.0-emissive;      color += light; +    glare *= 1.0-emissive;      glare = min(glare, 1.0);      float al = max(diffcol.a, glare) * vertex_color.a; +#ifdef WATER_FOG +    vec4 temp = applyWaterFogView(pos, vec4(color, 0.0)); +    color = temp.rgb; +#endif +      frag_color = vec4(color, al);  #else // mode is not DIFFUSE_ALPHA_MODE_BLEND, encode to gbuffer  diff --git a/indra/newview/app_settings/shaders/class3/deferred/reflectionProbeF.glsl b/indra/newview/app_settings/shaders/class3/deferred/reflectionProbeF.glsl index 24539c3c3a..23c6f4d5ae 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/reflectionProbeF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/reflectionProbeF.glsl @@ -542,7 +542,7 @@ vec3 tapIrradianceMap(vec3 pos, vec3 dir, out float w, out float dw, vec3 c, int      }  } -vec3 sampleProbes(vec3 pos, vec3 dir, float lod, bool errorCorrect) +vec3 sampleProbes(vec3 pos, vec3 dir, float lod)  {      float wsum[2];      wsum[0] = 0; @@ -573,29 +573,7 @@ vec3 sampleProbes(vec3 pos, vec3 dir, float lod, bool errorCorrect)          { -            if (errorCorrect && refIndex[i].w >= 0) -            { // error correction is on and this probe is a sphere -              //take a sample to get depth value, then error correct -                refcol = tapRefMap(pos, dir, w, dw, vi, wi, abs(lod + 2), refSphere[i].xyz, i); - -                //adjust lookup by distance result -                float d = length(vi - wi); -                vi += dir * d; - -                vi -= refSphere[i].xyz; - -                vi = env_mat * vi; - -                refcol = textureLod(reflectionProbes, vec4(vi, refIndex[i].x), lod).rgb; - -                // weight by vector correctness -                vec3 pi = normalize(wi - pos); -                w *= max(dot(pi, dir), 0.1); -            } -            else -            { -                refcol = tapRefMap(pos, dir, w, dw, vi, wi, lod, refSphere[i].xyz, i); -            } +            refcol = tapRefMap(pos, dir, w, dw, vi, wi, lod, refSphere[i].xyz, i);              col[p] += refcol.rgb*w;              wsum[p] += w; @@ -684,7 +662,7 @@ vec3 sampleProbeAmbient(vec3 pos, vec3 dir)  }  void sampleReflectionProbes(inout vec3 ambenv, inout vec3 glossenv, -        vec2 tc, vec3 pos, vec3 norm, float glossiness, bool errorCorrect) +        vec2 tc, vec3 pos, vec3 norm, float glossiness)  {      // TODO - don't hard code lods      float reflection_lods = max_probe_lod; @@ -695,13 +673,12 @@ void sampleReflectionProbes(inout vec3 ambenv, inout vec3 glossenv,      ambenv = sampleProbeAmbient(pos, norm);      float lod = (1.0-glossiness)*reflection_lods; -    glossenv = sampleProbes(pos, normalize(refnormpersp), lod, errorCorrect); +    glossenv = sampleProbes(pos, normalize(refnormpersp), lod);  #if defined(SSR)      if (cube_snapshot != 1 && glossiness >= 0.9)      {          vec4 ssr = vec4(0); -        //float w = tapScreenSpaceReflection(errorCorrect ? 1 : 4, tc, pos, norm, ssr, sceneMap);          float w = tapScreenSpaceReflection(1, tc, pos, norm, ssr, sceneMap);          glossenv = mix(glossenv, ssr.rgb, w); @@ -709,6 +686,12 @@ void sampleReflectionProbes(inout vec3 ambenv, inout vec3 glossenv,  #endif  } +void sampleReflectionProbesWater(inout vec3 ambenv, inout vec3 glossenv, +        vec2 tc, vec3 pos, vec3 norm, float glossiness) +{ +    sampleReflectionProbes(ambenv, glossenv, tc, pos, norm, glossiness); +} +  void debugTapRefMap(vec3 pos, vec3 dir, float depth, int i, inout vec4 col)  {      vec3 origin = vec3(0,0,0); @@ -749,14 +732,6 @@ vec4 sampleReflectionProbesDebug(vec3 pos)      return col;  } -void sampleReflectionProbes(inout vec3 ambenv, inout vec3 glossenv, -    vec2 tc, vec3 pos, vec3 norm, float glossiness) -{ -    sampleReflectionProbes(ambenv, glossenv, -        tc, pos, norm, glossiness, false); -} - -  void sampleReflectionProbesLegacy(inout vec3 ambenv, inout vec3 glossenv, inout vec3 legacyenv,          vec2 tc, vec3 pos, vec3 norm, float glossiness, float envIntensity)  { @@ -770,12 +745,12 @@ void sampleReflectionProbesLegacy(inout vec3 ambenv, inout vec3 glossenv, inout      if (glossiness > 0.0)      {          float lod = (1.0-glossiness)*reflection_lods; -        glossenv = sampleProbes(pos, normalize(refnormpersp), lod, false); +        glossenv = sampleProbes(pos, normalize(refnormpersp), lod);      }      if (envIntensity > 0.0)      { -        legacyenv = sampleProbes(pos, normalize(refnormpersp), 0.0, false); +        legacyenv = sampleProbes(pos, normalize(refnormpersp), 0.0);      }  #if defined(SSR) diff --git a/indra/newview/app_settings/shaders/class3/environment/waterF.glsl b/indra/newview/app_settings/shaders/class3/environment/waterF.glsl index 631d2c04d0..a87682affb 100644 --- a/indra/newview/app_settings/shaders/class3/environment/waterF.glsl +++ b/indra/newview/app_settings/shaders/class3/environment/waterF.glsl @@ -122,11 +122,8 @@ vec3 transform_normal(vec3 vNt)      return normalize(vNt.x * vT + vNt.y * vB + vNt.z * vN);  } -void sampleReflectionProbes(inout vec3 ambenv, inout vec3 glossenv, -    vec2 tc, vec3 pos, vec3 norm, float glossiness); - -void sampleReflectionProbes(inout vec3 ambenv, inout vec3 glossenv, -     vec2 tc, vec3 pos, vec3 norm, float glossiness, bool errorCorrect); +void sampleReflectionProbesWater(inout vec3 ambenv, inout vec3 glossenv, +        vec2 tc, vec3 pos, vec3 norm, float glossiness);  vec3 getPositionWithNDC(vec3 ndc); @@ -219,16 +216,16 @@ void main()      fb = applyWaterFogViewLinear(refPos, fb, sunlit);  #else -    vec4 fb = applyWaterFogViewLinear(viewVec*2048.0, vec4(0.5), sunlit); +    vec4 fb = applyWaterFogViewLinear(viewVec*2048.0, vec4(1.0), sunlit);  #endif      float metallic = 0.0; -    float perceptualRoughness = 0.1; +    float perceptualRoughness = 0.05;      float gloss      = 1.0 - perceptualRoughness;      vec3  irradiance = vec3(0);      vec3  radiance  = vec3(0); -    sampleReflectionProbes(irradiance, radiance, distort2, pos.xyz, wave_ibl.xyz, gloss); +    sampleReflectionProbesWater(irradiance, radiance, distort2, pos.xyz, wave_ibl.xyz, gloss);      irradiance       = vec3(0); @@ -265,10 +262,18 @@ void main()      f *= 0.9;      f *= f; +    // incoming scale is [0, 1] with 0.5 being default +    // shift to 0.5 to 1.5 +    f *= (fresnelScale - 0.5)+1.0; + +    // incoming offset is [0, 1] with 0.5 being default +    // shift from -1 to 1 +    f += (fresnelOffset - 0.5) * 2.0; +      f = clamp(f, 0, 1); -    //fb.rgb *= 1.; -     +      color = mix(color, fb.rgb, f); +      float spec = min(max(max(punctual.r, punctual.g), punctual.b), 0.05);      frag_color = vec4(color, spec); //*sunAngle2); diff --git a/indra/newview/featuretable.txt b/indra/newview/featuretable.txt index af72d48db9..b24244c188 100644 --- a/indra/newview/featuretable.txt +++ b/indra/newview/featuretable.txt @@ -1,4 +1,4 @@ -version 49 +version 50  // 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 @@ -117,7 +117,7 @@ RenderGlowResolutionPow		1	8  RenderMaxPartCount			1	2048  RenderLocalLights			1	1  RenderTransparentWater      1   0 -RenderReflectionsEnabled    1   0 +RenderReflectionsEnabled    1   1  RenderReflectionProbeDetail	1	0  RenderTerrainDetail			1	1  RenderTerrainLODFactor		1	1.0 diff --git a/indra/newview/featuretable_mac.txt b/indra/newview/featuretable_mac.txt index c90e4d6dbc..df12f56dd2 100644 --- a/indra/newview/featuretable_mac.txt +++ b/indra/newview/featuretable_mac.txt @@ -1,4 +1,4 @@ -version 44 +version 45  // 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 @@ -124,7 +124,7 @@ RenderUseAdvancedAtmospherics 1 0  RenderShadowDetail			1	0  WLSkyDetail					1	48  RenderFSAASamples			1	0 -RenderReflectionsEnabled    1   0 +RenderReflectionsEnabled    1   1  RenderReflectionProbeDetail	1	0  RenderScreenSpaceReflections 1  0 diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index af4c68e41f..6113c30a84 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -3960,8 +3960,6 @@ bool LLAgent::teleportCore(bool is_local)  		LL_INFOS("Teleport") << "Non-local, setting teleport state to TELEPORT_START" << LL_ENDL;  		gAgent.setTeleportState( LLAgent::TELEPORT_START ); -		//release geometry from old location -		gPipeline.resetVertexBuffers();  		LLSpatialPartition::sTeleportRequested = TRUE;  	}  	make_ui_sound("UISndTeleportOut"); @@ -4305,7 +4303,6 @@ void LLAgent::teleportCancel()  	}  	clearTeleportRequest();  	gAgent.setTeleportState( LLAgent::TELEPORT_NONE ); -	gPipeline.resetVertexBuffers();   }  void LLAgent::restoreCanceledTeleportRequest() diff --git a/indra/newview/lldrawpoolwlsky.cpp b/indra/newview/lldrawpoolwlsky.cpp index 59ed62f995..acbc349567 100644 --- a/indra/newview/lldrawpoolwlsky.cpp +++ b/indra/newview/lldrawpoolwlsky.cpp @@ -45,6 +45,8 @@  #include "llvowlsky.h"  #include "llsettingsvo.h" +extern BOOL gCubeSnapshot; +  static LLStaticHashedString sCamPosLocal("camPosLocal");  static LLStaticHashedString sCustomAlpha("custom_alpha"); @@ -434,7 +436,10 @@ void LLDrawPoolWLSky::renderDeferred(S32 pass)      {          renderSkyHazeDeferred(origin, camHeightLocal);          renderHeavenlyBodies(); -        renderStarsDeferred(origin); +        if (!gCubeSnapshot) +        { +            renderStarsDeferred(origin); +        }          renderSkyCloudsDeferred(origin, camHeightLocal, cloud_shader);      }      gGL.setColorMask(true, true); diff --git a/indra/newview/llfeaturemanager.cpp b/indra/newview/llfeaturemanager.cpp index 3b1bee05af..81a7aa47c8 100644 --- a/indra/newview/llfeaturemanager.cpp +++ b/indra/newview/llfeaturemanager.cpp @@ -425,18 +425,14 @@ bool LLFeatureManager::loadGPUClass()  		}  		if (gbps < 0.f) -		{ //couldn't bench, use GLVersion +		{ //couldn't bench, default to Low  	#if LL_DARWIN  		//GLVersion is misleading on OSX, just default to class 3 if we can't bench  		LL_WARNS("RenderInit") << "Unable to get an accurate benchmark; defaulting to class 3" << LL_ENDL;  		mGPUClass = GPU_CLASS_3;  	#else -			mGPUClass = GPU_CLASS_2; -	#endif -		} -		else if (gbps <= 5.f) -		{  			mGPUClass = GPU_CLASS_0; +	#endif  		}  		else if (gbps <= 8.f)  		{ diff --git a/indra/newview/llfetchedgltfmaterial.cpp b/indra/newview/llfetchedgltfmaterial.cpp index f3583daa0a..80074cc655 100644 --- a/indra/newview/llfetchedgltfmaterial.cpp +++ b/indra/newview/llfetchedgltfmaterial.cpp @@ -110,14 +110,21 @@ void LLFetchedGLTFMaterial::bind(LLViewerTexture* media_tex)          shader->uniform1f(LLShaderMgr::METALLIC_FACTOR, mMetallicFactor);          shader->uniform3fv(LLShaderMgr::EMISSIVE_COLOR, 1, mEmissiveColor.mV); -        const LLMatrix3 base_color_matrix = mTextureTransform[GLTF_TEXTURE_INFO_BASE_COLOR].asMatrix(); -        shader->uniformMatrix3fv(LLShaderMgr::TEXTURE_BASECOLOR_MATRIX, 1, false, (F32*)base_color_matrix.mMatrix); -        const LLMatrix3 normal_matrix = mTextureTransform[GLTF_TEXTURE_INFO_NORMAL].asMatrix(); -        shader->uniformMatrix3fv(LLShaderMgr::TEXTURE_NORMAL_MATRIX, 1, false, (F32*)normal_matrix.mMatrix); -        const LLMatrix3 metallic_roughness_matrix = mTextureTransform[GLTF_TEXTURE_INFO_METALLIC_ROUGHNESS].asMatrix(); -        shader->uniformMatrix3fv(LLShaderMgr::TEXTURE_METALLIC_ROUGHNESS_MATRIX, 1, false, (F32*)metallic_roughness_matrix.mMatrix); -        const LLMatrix3 emissive_matrix = mTextureTransform[GLTF_TEXTURE_INFO_EMISSIVE].asMatrix(); -        shader->uniformMatrix3fv(LLShaderMgr::TEXTURE_EMISSIVE_MATRIX, 1, false, (F32*)emissive_matrix.mMatrix); +        F32 base_color_packed[8]; +        mTextureTransform[GLTF_TEXTURE_INFO_BASE_COLOR].getPacked(base_color_packed); +        shader->uniform4fv(LLShaderMgr::TEXTURE_BASE_COLOR_TRANSFORM, 2, (F32*)base_color_packed); + +        F32 normal_packed[8]; +        mTextureTransform[GLTF_TEXTURE_INFO_NORMAL].getPacked(normal_packed); +        shader->uniform4fv(LLShaderMgr::TEXTURE_NORMAL_TRANSFORM, 2, (F32*)normal_packed); + +        F32 metallic_roughness_packed[8]; +        mTextureTransform[GLTF_TEXTURE_INFO_METALLIC_ROUGHNESS].getPacked(metallic_roughness_packed); +        shader->uniform4fv(LLShaderMgr::TEXTURE_METALLIC_ROUGHNESS_TRANSFORM, 2, (F32*)metallic_roughness_packed); + +        F32 emissive_packed[8]; +        mTextureTransform[GLTF_TEXTURE_INFO_EMISSIVE].getPacked(emissive_packed); +        shader->uniform4fv(LLShaderMgr::TEXTURE_EMISSIVE_TRANSFORM, 2, (F32*)emissive_packed);      }  } diff --git a/indra/newview/llpanelvolume.cpp b/indra/newview/llpanelvolume.cpp index 3c34d6ee65..ed244f773c 100644 --- a/indra/newview/llpanelvolume.cpp +++ b/indra/newview/llpanelvolume.cpp @@ -749,29 +749,49 @@ void LLPanelVolume::sendIsReflectionProbe()      BOOL value = getChild<LLUICtrl>("Reflection Probe")->getValue();      BOOL old_value = volobjp->isReflectionProbe(); -    volobjp->setIsReflectionProbe(value); -    LL_INFOS() << "update reflection probe sent" << LL_ENDL; +    if (value && value != old_value) +    { // defer to notification util as to whether or not we *really* make this object a reflection probe +        LLNotificationsUtil::add("ReflectionProbeApplied", LLSD(), LLSD(), boost::bind(&LLPanelVolume::doSendIsReflectionProbe, this, _1, _2)); +    } +    else +    { +        volobjp->setIsReflectionProbe(value); +    } +} -    if (value && !old_value) -    { // has become a reflection probe, slam to a 10m sphere and pop up a message -        // warning people about the pitfalls of reflection probes -#if 0 -        auto* select_mgr = LLSelectMgr::getInstance(); +void LLPanelVolume::doSendIsReflectionProbe(const LLSD & notification, const LLSD & response) +{ +    S32 option = LLNotificationsUtil::getSelectedOption(notification, response); +    if (option == 0) // YES +    { +        LLViewerObject* objectp = mObject; +        if (!objectp || (objectp->getPCode() != LL_PCODE_VOLUME)) +        { +            return; +        } +        LLVOVolume* volobjp = (LLVOVolume*)objectp; -        mObject->setScale(LLVector3(10.f, 10.f, 10.f)); -        select_mgr->sendMultipleUpdate(UPD_ROTATION | UPD_POSITION | UPD_SCALE); +        volobjp->setIsReflectionProbe(true); -        select_mgr->selectionUpdatePhantom(true); -        select_mgr->selectionSetGLTFMaterial(LLUUID::null); -        select_mgr->selectionSetAlphaOnly(0.f); -         -        LLVolumeParams params; -        params.getPathParams().setCurveType(LL_PCODE_PATH_CIRCLE); -        params.getProfileParams().setCurveType(LL_PCODE_PROFILE_CIRCLE_HALF); -        mObject->updateVolume(params); -#endif +        { // has become a reflection probe, slam to a 10m sphere and pop up a message +            // warning people about the pitfalls of reflection probes + +            auto* select_mgr = LLSelectMgr::getInstance(); -        LLNotificationsUtil::add("ReflectionProbeApplied"); +            select_mgr->selectionUpdatePhantom(true); +            select_mgr->selectionSetGLTFMaterial(LLUUID::null); +            select_mgr->selectionSetAlphaOnly(0.f); + +            LLVolumeParams params; +            params.getPathParams().setCurveType(LL_PCODE_PATH_CIRCLE); +            params.getProfileParams().setCurveType(LL_PCODE_PROFILE_CIRCLE_HALF); +            mObject->updateVolume(params); +        } +    } +    else +    { +        // cancelled, touch up UI state +        getChild<LLUICtrl>("Reflection Probe")->setValue(false);      }  } diff --git a/indra/newview/llpanelvolume.h b/indra/newview/llpanelvolume.h index 62a6d01b21..01b7ebb75c 100644 --- a/indra/newview/llpanelvolume.h +++ b/indra/newview/llpanelvolume.h @@ -57,7 +57,14 @@ public:  	void			refresh();  	void			sendIsLight(); +     +    // when an object is becoming a refleciton probe, present a dialog asking for confirmation +    // otherwise, send the reflection probe update immediately      void            sendIsReflectionProbe(); + +    // callback for handling response of the ok/cancel/ignore dialog for making an object a reflection probe +    void            doSendIsReflectionProbe(const LLSD& notification, const LLSD& response); +  	void			sendIsFlexible();  	static bool		precommitValidate(const LLSD& data); diff --git a/indra/newview/llreflectionmapmanager.cpp b/indra/newview/llreflectionmapmanager.cpp index acb3612416..9962d0c10c 100644 --- a/indra/newview/llreflectionmapmanager.cpp +++ b/indra/newview/llreflectionmapmanager.cpp @@ -107,7 +107,7 @@ void LLReflectionMapManager::update()          mMipChain.resize(count);          for (int i = 0; i < count; ++i)          { -            mMipChain[i].allocate(res, res, GL_RGBA16); +            mMipChain[i].allocate(res, res, GL_RGB16);              res /= 2;          }      } @@ -475,7 +475,7 @@ void LLReflectionMapManager::updateProbeFace(LLReflectionMap* probe, U32 face)          //only render sky, water, terrain, and clouds          gPipeline.andRenderTypeMask(LLPipeline::RENDER_TYPE_SKY, LLPipeline::RENDER_TYPE_WL_SKY, -            LLPipeline::RENDER_TYPE_WATER, LLPipeline::RENDER_TYPE_CLOUDS, LLPipeline::RENDER_TYPE_TERRAIN, LLPipeline::END_RENDER_TYPES); +            LLPipeline::RENDER_TYPE_WATER, LLPipeline::RENDER_TYPE_VOIDWATER, LLPipeline::RENDER_TYPE_CLOUDS, LLPipeline::RENDER_TYPE_TERRAIN, LLPipeline::END_RENDER_TYPES);          probe->update(mRenderTarget.getWidth(), face); @@ -519,7 +519,6 @@ void LLReflectionMapManager::updateProbeFace(LLReflectionMap* probe, U32 face)          static LLStaticHashedString zfar("zfar");          LLRenderTarget* screen_rt = &gPipeline.mAuxillaryRT.screen; -        LLRenderTarget* depth_rt = &gPipeline.mAuxillaryRT.deferredScreen;          // perform a gaussian blur on the super sampled render before downsampling          { @@ -549,7 +548,6 @@ void LLReflectionMapManager::updateProbeFace(LLReflectionMap* probe, U32 face)          gReflectionMipProgram.bind();          S32 diffuseChannel = gReflectionMipProgram.enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, LLTexUnit::TT_TEXTURE); -        S32 depthChannel   = gReflectionMipProgram.enableTexture(LLShaderMgr::DEFERRED_DEPTH, LLTexUnit::TT_TEXTURE);          for (int i = 0; i < mMipChain.size(); ++i)          { @@ -564,12 +562,9 @@ void LLReflectionMapManager::updateProbeFace(LLReflectionMap* probe, U32 face)                  gGL.getTexUnit(diffuseChannel)->bind(&(mMipChain[i - 1]));              } -            gGL.getTexUnit(depthChannel)->bind(depth_rt, true); - +                          gReflectionMipProgram.uniform1f(resScale, 1.f/(mProbeResolution*2)); -            gReflectionMipProgram.uniform1f(znear, probe->getNearClip()); -            gReflectionMipProgram.uniform1f(zfar, MAX_FAR_CLIP); - +                          gPipeline.mScreenTriangleVB->setBuffer();              gPipeline.mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); @@ -597,7 +592,6 @@ void LLReflectionMapManager::updateProbeFace(LLReflectionMap* probe, U32 face)          gGL.popMatrix();          gGL.getTexUnit(diffuseChannel)->unbind(LLTexUnit::TT_TEXTURE); -        gGL.getTexUnit(depthChannel)->unbind(LLTexUnit::TT_TEXTURE);          gReflectionMipProgram.unbind();      } @@ -1021,7 +1015,7 @@ void LLReflectionMapManager::initReflectionMaps()          mTexture = new LLCubeMapArray();          // store mReflectionProbeCount+2 cube maps, final two cube maps are used for render target and radiance map generation source) -        mTexture->allocate(mProbeResolution, 4, mReflectionProbeCount + 2); +        mTexture->allocate(mProbeResolution, 3, mReflectionProbeCount + 2);          mIrradianceMaps = new LLCubeMapArray();          mIrradianceMaps->allocate(LL_IRRADIANCE_MAP_RESOLUTION, 4, mReflectionProbeCount, FALSE); @@ -1082,7 +1076,7 @@ void LLReflectionMapManager::doOcclusion()      for (auto& probe : mProbes)      { -        if (probe != nullptr) +        if (probe != nullptr && probe != mDefaultProbe)          {              probe->doOcclusion(eye);          } diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp index 764131ab79..35e11b8991 100644 --- a/indra/newview/llspatialpartition.cpp +++ b/indra/newview/llspatialpartition.cpp @@ -3234,6 +3234,7 @@ public:  				renderAgentTarget(avatar);  			} +#if 0  			if (gDebugGL)  			{  				for (U32 i = 0; i < drawable->getNumFaces(); ++i) @@ -3259,6 +3260,7 @@ public:  					}  				}  			} +#endif  		}  		for (LLSpatialGroup::draw_map_t::iterator i = group->mDrawMap.begin(); i != group->mDrawMap.end(); ++i) diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp index ea53012b7a..59b566efb6 100644 --- a/indra/newview/llviewercontrol.cpp +++ b/indra/newview/llviewercontrol.cpp @@ -149,14 +149,7 @@ static bool handleSetShaderChanged(const LLSD& newvalue)      if (gPipeline.isInit())      {          // ALM depends onto atmospheric shaders, state might have changed -        bool old_state = LLPipeline::sRenderDeferred;          LLPipeline::refreshCachedSettings(); -        if (old_state != LLPipeline::sRenderDeferred) -        { -            gPipeline.releaseGLBuffers(); -            gPipeline.createGLBuffers(); -            gPipeline.resetVertexBuffers(); -        }      }  	// else, leave terrain detail as is @@ -206,7 +199,6 @@ bool handleRenderTransparentWaterChanged(const LLSD& newvalue)  		gPipeline.updateRenderTransparentWater();  		gPipeline.releaseGLBuffers();  		gPipeline.createGLBuffers(); -		gPipeline.resetVertexBuffers();  		LLViewerShaderMgr::instance()->setShaders();  	}  	LLWorld::getInstance()->updateWaterObjects(); @@ -397,15 +389,6 @@ static bool handleWLSkyDetailChanged(const LLSD&)  	return true;  } -static bool handleResetVertexBuffersChanged(const LLSD&) -{ -	if (gPipeline.isInit()) -	{ -		gPipeline.resetVertexBuffers(); -	} -	return true; -} -  static bool handleRepartition(const LLSD&)  {  	if (gPipeline.isInit()) @@ -436,7 +419,6 @@ static bool handleReflectionProbeDetailChanged(const LLSD& newvalue)          LLPipeline::refreshCachedSettings();          gPipeline.releaseGLBuffers();          gPipeline.createGLBuffers(); -        gPipeline.resetVertexBuffers();          LLViewerShaderMgr::instance()->setShaders();      }      return true; @@ -654,7 +636,6 @@ void settings_setup_listeners()  	setting_setup_signal_listener(gSavedSettings, "RenderGlow", handleReleaseGLBufferChanged);  	setting_setup_signal_listener(gSavedSettings, "RenderGlow", handleSetShaderChanged);  	setting_setup_signal_listener(gSavedSettings, "RenderGlowResolutionPow", handleReleaseGLBufferChanged); -	// DEPRECATED -- setting_setup_signal_listener(gSavedSettings, "WindLightUseAtmosShaders", handleSetShaderChanged);  	setting_setup_signal_listener(gSavedSettings, "RenderGammaFull", handleSetShaderChanged);  	setting_setup_signal_listener(gSavedSettings, "RenderVolumeLODFactor", handleVolumeLODChanged);  	setting_setup_signal_listener(gSavedSettings, "RenderAvatarLODFactor", handleAvatarLODChanged); @@ -667,17 +648,11 @@ void settings_setup_listeners()  	setting_setup_signal_listener(gSavedSettings, "RenderMaxPartCount", handleMaxPartCountChanged);  	setting_setup_signal_listener(gSavedSettings, "RenderDynamicLOD", handleRenderDynamicLODChanged);  	setting_setup_signal_listener(gSavedSettings, "RenderLocalLights", handleRenderLocalLightsChanged); -	setting_setup_signal_listener(gSavedSettings, "RenderDebugTextureBind", handleResetVertexBuffersChanged); -	setting_setup_signal_listener(gSavedSettings, "RenderAutoMaskAlphaDeferred", handleResetVertexBuffersChanged); -	setting_setup_signal_listener(gSavedSettings, "RenderAutoMaskAlphaNonDeferred", handleResetVertexBuffersChanged); -	// DEPRECATED - setting_setup_signal_listener(gSavedSettings, "RenderObjectBump", handleRenderBumpChanged); -	setting_setup_signal_listener(gSavedSettings, "RenderMaxVBOSize", handleResetVertexBuffersChanged); -    setting_setup_signal_listener(gSavedSettings, "RenderVSyncEnable", handleVSyncChanged); +	setting_setup_signal_listener(gSavedSettings, "RenderVSyncEnable", handleVSyncChanged);  	setting_setup_signal_listener(gSavedSettings, "RenderDeferredNoise", handleReleaseGLBufferChanged);  	setting_setup_signal_listener(gSavedSettings, "RenderDebugPipeline", handleRenderDebugPipelineChanged);  	setting_setup_signal_listener(gSavedSettings, "RenderResolutionDivisor", handleRenderResolutionDivisorChanged); -	// DEPRECATED - setting_setup_signal_listener(gSavedSettings, "RenderDeferred", handleRenderDeferredChanged); -    setting_setup_signal_listener(gSavedSettings, "RenderReflectionProbeDetail", handleReflectionProbeDetailChanged); +	setting_setup_signal_listener(gSavedSettings, "RenderReflectionProbeDetail", handleReflectionProbeDetailChanged);      setting_setup_signal_listener(gSavedSettings, "RenderReflectionsEnabled", handleReflectionProbeDetailChanged);      setting_setup_signal_listener(gSavedSettings, "RenderScreenSpaceReflections", handleReflectionProbeDetailChanged);  	setting_setup_signal_listener(gSavedSettings, "RenderShadowDetail", handleSetShaderChanged); @@ -705,11 +680,6 @@ void settings_setup_listeners()  	setting_setup_signal_listener(gSavedSettings, "MuteVoice", handleAudioVolumeChanged);  	setting_setup_signal_listener(gSavedSettings, "MuteAmbient", handleAudioVolumeChanged);  	setting_setup_signal_listener(gSavedSettings, "MuteUI", handleAudioVolumeChanged); -	setting_setup_signal_listener(gSavedSettings, "RenderVBOEnable", handleResetVertexBuffersChanged); -	setting_setup_signal_listener(gSavedSettings, "RenderUseVAO", handleResetVertexBuffersChanged); -	setting_setup_signal_listener(gSavedSettings, "RenderVBOMappingDisable", handleResetVertexBuffersChanged); -	setting_setup_signal_listener(gSavedSettings, "RenderUseStreamVBO", handleResetVertexBuffersChanged); -	setting_setup_signal_listener(gSavedSettings, "RenderPreferStreamDraw", handleResetVertexBuffersChanged);  	setting_setup_signal_listener(gSavedSettings, "WLSkyDetail", handleWLSkyDetailChanged);  	setting_setup_signal_listener(gSavedSettings, "JoystickAxis0", handleJoystickChanged);  	setting_setup_signal_listener(gSavedSettings, "JoystickAxis1", handleJoystickChanged); diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp index 62144b2d31..59333b6cee 100644 --- a/indra/newview/llviewerdisplay.cpp +++ b/indra/newview/llviewerdisplay.cpp @@ -279,14 +279,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)  	LLGLState::checkStates(); -	stop_glerror(); -  	gPipeline.disableLights(); -	 -	//reset vertex buffers if needed -	gPipeline.doResetVertexBuffers(); - -	stop_glerror();  	// Don't draw if the window is hidden or minimized.  	// In fact, must explicitly check the minimized state before drawing. diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 5a3f2f22b8..3a8206ad26 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -8540,7 +8540,6 @@ BOOL get_visibility(void* user_data)  	return viewp->getVisible();  } -// TomY TODO: Get rid of these?  class LLViewShowHoverTips : public view_listener_t  {  	bool handleEvent(const LLSD& userdata) @@ -8559,13 +8558,11 @@ class LLViewCheckShowHoverTips : public view_listener_t  	}  }; -// TomY TODO: Get rid of these?  class LLViewHighlightTransparent : public view_listener_t  {  	bool handleEvent(const LLSD& userdata)  	{  		LLDrawPoolAlpha::sShowDebugAlpha = !LLDrawPoolAlpha::sShowDebugAlpha; -        gPipeline.resetVertexBuffers();  		return true;  	}  }; diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index e96047df14..4ecb54aa0f 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -2938,8 +2938,6 @@ void process_teleport_finish(LLMessageSystem* msg, void**)  	// Teleport is finished; it can't be cancelled now.  	gViewerWindow->setProgressCancelButtonVisible(FALSE); -	gPipeline.doResetVertexBuffers(true); -  	// Do teleport effect for where you're leaving  	// VEFFECT: TeleportStart  	LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_POINT, TRUE); diff --git a/indra/newview/llvieweroctree.cpp b/indra/newview/llvieweroctree.cpp index 7d6c18ae67..d1d23cfb8e 100644 --- a/indra/newview/llvieweroctree.cpp +++ b/indra/newview/llvieweroctree.cpp @@ -870,6 +870,7 @@ LLOcclusionCullingGroup::LLOcclusionCullingGroup(OctreeNode* node, LLViewerOctre  	for (U32 i = 0; i < LLViewerCamera::NUM_CAMERAS; i++)  	{  		mOcclusionQuery[i] = 0; +        mOcclusionCheckCount[i] = 0;  		mOcclusionIssued[i] = 0;  		mOcclusionState[i] = parent ? SG_STATE_INHERIT_MASK & parent->mOcclusionState[i] : 0;  		mVisible[i] = 0; @@ -1127,10 +1128,12 @@ void LLOcclusionCullingGroup::checkOcclusion()              {                  LL_PROFILE_ZONE_NAMED_CATEGORY_OCTREE("co - query available");                  glGetQueryObjectuiv(mOcclusionQuery[LLViewerCamera::sCurCameraID], GL_QUERY_RESULT_AVAILABLE, &available); +                mOcclusionCheckCount[LLViewerCamera::sCurCameraID]++;              } -            if (available) +            if (available || mOcclusionCheckCount[LLViewerCamera::sCurCameraID] > 4)              {    +                mOcclusionCheckCount[LLViewerCamera::sCurCameraID] = 0;                  GLuint query_result;    // Will be # samples drawn, or a boolean depending on mHasOcclusionQuery2 (both are type GLuint)                  {                      LL_PROFILE_ZONE_NAMED_CATEGORY_OCTREE("co - query result"); @@ -1140,20 +1143,6 @@ void LLOcclusionCullingGroup::checkOcclusion()                  sPendingQueries.erase(mOcclusionQuery[LLViewerCamera::sCurCameraID]);  #endif -#if 0   // (12/2021) occasional false-negative occlusion tests produce water reflection errors, SL-16461 -        // If/when water occlusion queries become 100% reliable, re-enable this optimization - -                if (LLPipeline::RENDER_TYPE_WATER == mSpatialPartition->mDrawableType) -                { -                    // Note any unoccluded water, for deciding on reflection/distortion passes -                    // (If occlusion is disabled, these are set within LLDrawPoolWater::render) -                    if (query_result > 0) -                    { -                        LLDrawPoolWater::sNeedsReflectionUpdate = TRUE; -                        LLDrawPoolWater::sNeedsDistortionUpdate = TRUE; -                    } -                } -#endif                  if (query_result > 0)                  {                      clearOcclusionState(LLOcclusionCullingGroup::OCCLUDED, LLOcclusionCullingGroup::STATE_MODE_DIFF); diff --git a/indra/newview/llvieweroctree.h b/indra/newview/llvieweroctree.h index 7666062f99..353429d254 100644 --- a/indra/newview/llvieweroctree.h +++ b/indra/newview/llvieweroctree.h @@ -336,6 +336,7 @@ protected:  	LLViewerOctreePartition* mSpatialPartition;  	U32		                 mOcclusionQuery[LLViewerCamera::NUM_CAMERAS]; +    U32                      mOcclusionCheckCount[LLViewerCamera::NUM_CAMERAS];  public:		  	static std::set<U32> sPendingQueries; diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp index 859df1277c..f4f20ee7a6 100644 --- a/indra/newview/llviewershadermgr.cpp +++ b/indra/newview/llviewershadermgr.cpp @@ -378,9 +378,6 @@ void LLViewerShaderMgr::setShaders()      LLPipeline::sRenderGlow = gSavedSettings.getBOOL("RenderGlow");  -    //hack to reset buffers that change behavior with shaders -    gPipeline.resetVertexBuffers(); -      if (gViewerWindow)      {          gViewerWindow->setCursor(UI_CURSOR_WAIT); diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index fec9f1cdd1..42e764b492 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -625,18 +625,24 @@ void LLVOVolume::animateTextures()  					continue;  				} -				if (!(result & LLViewerTextureAnim::ROTATE)) -				{ -					te->getRotation(&rot); -				} -				if (!(result & LLViewerTextureAnim::TRANSLATE)) -				{ -					te->getOffset(&off_s,&off_t); -				}			 -				if (!(result & LLViewerTextureAnim::SCALE)) -				{ -					te->getScale(&scale_s, &scale_t); -				} +                LLGLTFMaterial *gltf_mat = te->getGLTFRenderMaterial(); +                const bool is_pbr = gltf_mat != nullptr; + +                if (!is_pbr) +                { +                    if (!(result & LLViewerTextureAnim::ROTATE)) +                    { +                        te->getRotation(&rot); +                    } +                    if (!(result & LLViewerTextureAnim::TRANSLATE)) +                    { +                        te->getOffset(&off_s,&off_t); +                    } +                    if (!(result & LLViewerTextureAnim::SCALE)) +                    { +                        te->getScale(&scale_s, &scale_t); +                    } +                }  				if (!facep->mTextureMatrix)  				{ @@ -645,6 +651,7 @@ void LLVOVolume::animateTextures()  				LLMatrix4& tex_mat = *facep->mTextureMatrix;  				tex_mat.setIdentity(); +  				LLVector3 trans ;  					trans.set(LLVector3(off_s+0.5f, off_t+0.5f, 0.f));			 diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 9522f804d6..b5b5d9ef7f 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -681,8 +681,6 @@ void LLPipeline::destroyGL()  	resetDrawOrders(); -	resetVertexBuffers(); -  	releaseGLBuffers();  	if (mMeshDirtyQueryObject) @@ -6753,88 +6751,6 @@ void LLPipeline::resetVertexBuffers(LLDrawable* drawable)  	}  } -void LLPipeline::resetVertexBuffers() -{	 -	mResetVertexBuffers = true; -} - -void LLPipeline::doResetVertexBuffers(bool forced) -{ -	if (!mResetVertexBuffers) -	{ -		return; -	} -	if(!forced && LLSpatialPartition::sTeleportRequested) -	{ -		if(gAgent.getTeleportState() != LLAgent::TELEPORT_NONE) -		{ -			return; //wait for teleporting to finish -		} -		else -		{ -			//teleporting aborted -			LLSpatialPartition::sTeleportRequested = FALSE; -			mResetVertexBuffers = false; -			return; -		} -	} - -    LL_PROFILE_ZONE_SCOPED_CATEGORY_PIPELINE; -	mResetVertexBuffers = false; - -	mCubeVB = NULL; -    mDeferredVB = NULL; - -	for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin();  -			iter != LLWorld::getInstance()->getRegionList().end(); ++iter) -	{ -		LLViewerRegion* region = *iter; -		for (U32 i = 0; i < LLViewerRegion::NUM_PARTITIONS; i++) -		{ -			LLSpatialPartition* part = region->getSpatialPartition(i); -			if (part) -			{ -				part->resetVertexBuffers(); -			} -		} -	} -	if(LLSpatialPartition::sTeleportRequested) -	{ -		LLSpatialPartition::sTeleportRequested = FALSE; - -		LLWorld::getInstance()->clearAllVisibleObjects(); -		clearRebuildDrawables(); -	} - -	resetDrawOrders(); - -	gSky.resetVertexBuffers(); - -	LLVOPartGroup::destroyGL(); - -	if ( LLPathingLib::getInstance() ) -	{ -		LLPathingLib::getInstance()->cleanupVBOManager(); -	} -	LLVOPartGroup::destroyGL(); -    gGL.resetVertexBuffer(); - -	LLVertexBuffer::unbind(); -	 -	updateRenderBump(); - -	sBakeSunlight = gSavedSettings.getBOOL("RenderBakeSunlight"); -	sNoAlpha = gSavedSettings.getBOOL("RenderNoAlpha"); -	LLPipeline::sTextureBindTest = gSavedSettings.getBOOL("RenderDebugTextureBind"); - -    gGL.initVertexBuffer(); - -    mDeferredVB = new LLVertexBuffer(DEFERRED_VB_MASK); -    mDeferredVB->allocateBuffer(8, 0); - -	LLVOPartGroup::restoreGL(); -} -  void LLPipeline::renderObjects(U32 type, bool texture, bool batch_texture, bool rigged)  {  	assertInitialized(); diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h index 29dd42e4ec..483fe08559 100644 --- a/indra/newview/pipeline.h +++ b/indra/newview/pipeline.h @@ -97,9 +97,7 @@ public:  	void destroyGL();  	void restoreGL(); -	void resetVertexBuffers(); -	void doResetVertexBuffers(bool forced = false); -    void requestResizeScreenTexture(); // set flag only, no work, safer for callbacks... +	void requestResizeScreenTexture(); // set flag only, no work, safer for callbacks...      void requestResizeShadowTexture(); // set flag only, no work, safer for callbacks...  	void resizeScreenTexture(); diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 711be76764..bf67118eac 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -12041,10 +12041,12 @@ Material successfully created.  Asset ID: [ASSET_ID]      name="ReflectionProbeApplied"      persist="true"      type="alertmodal"> -    WARNING: You have made your object a Refelction Probe.  Continuing to manipulate the object while it is a probe will implicitly change the object to mimic its influence volume and will make irreversible changes to the object.  If you don't know what a reflection probe is, uncheck "Reflection Probe" immediately.  To learn more about Reflection Probes and how to use them, see https://wiki.secondlife.com/wiki/PBR_Materials#Understanding_and_Assisting_the_New_Reflections_System. -    <usetemplate ignoretext="Reflection Probe tips" -                 name="okignore" -                 yestext="OK"/> +    WARNING: You have made your object a Reflection Probe.  This will implicitly change the object to mimic its influence volume and will make irreversible changes to the object.  Do you want to continue? +   <usetemplate +       ignoretext="Reflection Probe tips" +       name="okcancelignore" +       notext="Cancel" +       yestext="OK"/>    </notification>  </notifications> | 
