diff options
Diffstat (limited to 'indra/newview/app_settings')
5 files changed, 448 insertions, 58 deletions
| diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index af63d6ff87..c3f9a64fd6 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -16829,6 +16829,226 @@        <key>Value</key>        <string>00000000-0000-0000-0000-000000000000</string>      </map> +    <key>LocalTerrainTransform1ScaleU</key> +    <map> +      <key>Comment</key> +      <string>KHR texture transform component if LocalTerrainAsset1 is set</string> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>1.0</real> +    </map> +    <key>LocalTerrainTransform1ScaleV</key> +    <map> +      <key>Comment</key> +      <string>KHR texture transform component if LocalTerrainAsset1 is set</string> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>1.0</real> +    </map> +    <key>LocalTerrainTransform1Rotation</key> +    <map> +      <key>Comment</key> +      <string>KHR texture transform component if LocalTerrainAsset1 is set</string> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>0.0</real> +    </map> +    <key>LocalTerrainTransform1OffsetU</key> +    <map> +      <key>Comment</key> +      <string>KHR texture transform component if LocalTerrainAsset1 is set</string> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>0.0</real> +    </map> +    <key>LocalTerrainTransform1OffsetV</key> +    <map> +      <key>Comment</key> +      <string>KHR texture transform component if LocalTerrainAsset1 is set</string> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>0.0</real> +    </map> +    <key>LocalTerrainTransform2ScaleU</key> +    <map> +      <key>Comment</key> +      <string>KHR texture transform component if LocalTerrainAsset2 is set</string> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>1.0</real> +    </map> +    <key>LocalTerrainTransform2ScaleV</key> +    <map> +      <key>Comment</key> +      <string>KHR texture transform component if LocalTerrainAsset2 is set</string> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>1.0</real> +    </map> +    <key>LocalTerrainTransform2Rotation</key> +    <map> +      <key>Comment</key> +      <string>KHR texture transform component if LocalTerrainAsset2 is set</string> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>0.0</real> +    </map> +    <key>LocalTerrainTransform2OffsetU</key> +    <map> +      <key>Comment</key> +      <string>KHR texture transform component if LocalTerrainAsset2 is set</string> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>0.0</real> +    </map> +    <key>LocalTerrainTransform2OffsetV</key> +    <map> +      <key>Comment</key> +      <string>KHR texture transform component if LocalTerrainAsset2 is set</string> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>0.0</real> +    </map> +    <key>LocalTerrainTransform3ScaleU</key> +    <map> +      <key>Comment</key> +      <string>KHR texture transform component if LocalTerrainAsset3 is set</string> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>1.0</real> +    </map> +    <key>LocalTerrainTransform3ScaleV</key> +    <map> +      <key>Comment</key> +      <string>KHR texture transform component if LocalTerrainAsset3 is set</string> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>1.0</real> +    </map> +    <key>LocalTerrainTransform3Rotation</key> +    <map> +      <key>Comment</key> +      <string>KHR texture transform component if LocalTerrainAsset3 is set</string> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>0.0</real> +    </map> +    <key>LocalTerrainTransform3OffsetU</key> +    <map> +      <key>Comment</key> +      <string>KHR texture transform component if LocalTerrainAsset3 is set</string> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>0.0</real> +    </map> +    <key>LocalTerrainTransform3OffsetV</key> +    <map> +      <key>Comment</key> +      <string>KHR texture transform component if LocalTerrainAsset3 is set</string> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>0.0</real> +    </map> +    <key>LocalTerrainTransform4ScaleU</key> +    <map> +      <key>Comment</key> +      <string>KHR texture transform component if LocalTerrainAsset4 is set</string> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>1.0</real> +    </map> +    <key>LocalTerrainTransform4ScaleV</key> +    <map> +      <key>Comment</key> +      <string>KHR texture transform component if LocalTerrainAsset4 is set</string> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>1.0</real> +    </map> +    <key>LocalTerrainTransform4Rotation</key> +    <map> +      <key>Comment</key> +      <string>KHR texture transform component if LocalTerrainAsset4 is set</string> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>0.0</real> +    </map> +    <key>LocalTerrainTransform4OffsetU</key> +    <map> +      <key>Comment</key> +      <string>KHR texture transform component if LocalTerrainAsset4 is set</string> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>0.0</real> +    </map> +    <key>LocalTerrainTransform4OffsetV</key> +    <map> +      <key>Comment</key> +      <string>KHR texture transform component if LocalTerrainAsset4 is set</string> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>0.0</real> +    </map>  	<key>PathfindingRetrieveNeighboringRegion</key>      <map>        <key>Comment</key> diff --git a/indra/newview/app_settings/shaders/class1/deferred/pbrterrainF.glsl b/indra/newview/app_settings/shaders/class1/deferred/pbrterrainF.glsl index de4745c1c4..65a6b8613d 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/pbrterrainF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/pbrterrainF.glsl @@ -31,7 +31,7 @@  #define TERRAIN_PBR_DETAIL_METALLIC_ROUGHNESS -3  #if TERRAIN_PLANAR_TEXTURE_SAMPLE_COUNT == 3 -#define TerrainCoord vec4[2] +#define TerrainCoord vec4[3]  #elif TERRAIN_PLANAR_TEXTURE_SAMPLE_COUNT == 1  #define TerrainCoord vec2  #endif @@ -131,12 +131,16 @@ uniform vec3[4] emissiveColors;  uniform vec4 minimum_alphas; // PBR alphaMode: MASK, See: mAlphaCutoff, setAlphaCutoff()  #if TERRAIN_PLANAR_TEXTURE_SAMPLE_COUNT == 3 +in vec4[10] vary_coords; +#elif TERRAIN_PLANAR_TEXTURE_SAMPLE_COUNT == 1  in vec4[2] vary_coords;  #endif  in vec3 vary_position;  in vec3 vary_normal; -in vec3 vary_tangent; +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_NORMAL) +in vec3 vary_tangents[4];  flat in float vary_sign; +#endif  in vec4 vary_texcoord0;  in vec4 vary_texcoord1; @@ -144,17 +148,26 @@ void mirrorClip(vec3 position);  float terrain_mix(TerrainMix tm, vec4 tms4); +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_NORMAL) +// from mikktspace.com +vec3 mikktspace(vec3 vNt, vec3 vT) +{ +    vec3 vN = vary_normal; +     +    vec3 vB = vary_sign * cross(vN, vT); +    vec3 tnorm = normalize( vNt.x * vT + vNt.y * vB + vNt.z * vN ); + +    tnorm *= gl_FrontFacing ? 1.0 : -1.0; + +    return tnorm; +} +#endif +  void main()  {      // Make sure we clip the terrain if we're in a mirror.      mirrorClip(vary_position); -#if TERRAIN_PLANAR_TEXTURE_SAMPLE_COUNT == 3 -    TerrainCoord terrain_texcoord = vary_coords; -#elif TERRAIN_PLANAR_TEXTURE_SAMPLE_COUNT == 1 -    TerrainCoord terrain_texcoord = vary_texcoord0.xy; -#endif -      float alpha1 = texture(alpha_ramp, vary_texcoord0.zw).a;      float alpha2 = texture(alpha_ramp,vary_texcoord1.xy).a;      float alphaFinal = texture(alpha_ramp, vary_texcoord1.zw).a; @@ -185,6 +198,16 @@ void main()      switch (tm.type & MIX_X)      {      case MIX_X: +#if TERRAIN_PLANAR_TEXTURE_SAMPLE_COUNT == 3 +        TerrainCoord terrain_texcoord; +        terrain_texcoord[0].xy = vary_coords[0].xy; +        terrain_texcoord[0].zw = vary_coords[0].zw; +        terrain_texcoord[1].xy = vary_coords[1].xy; +        terrain_texcoord[1].zw = vary_coords[1].zw; +        terrain_texcoord[2].xy = vary_coords[2].xy; +#elif TERRAIN_PLANAR_TEXTURE_SAMPLE_COUNT == 1 +        TerrainCoord terrain_texcoord = vary_coords[0].xy; +#endif          mix2 = terrain_sample_and_multiply_pbr(              terrain_texcoord              , detail_0_base_color @@ -207,6 +230,9 @@ void main()              , emissiveColors[0]  #endif          ); +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_NORMAL) +        mix2.vNt = mikktspace(mix2.vNt, vary_tangents[0]); +#endif          mix = mix_pbr(mix, mix2, tm.weight.x);          break;      default: @@ -215,6 +241,16 @@ void main()      switch (tm.type & MIX_Y)      {      case MIX_Y: +#if TERRAIN_PLANAR_TEXTURE_SAMPLE_COUNT == 3 +        TerrainCoord terrain_texcoord; +        terrain_texcoord[0].xy = vary_coords[2].zw; +        terrain_texcoord[0].zw = vary_coords[3].xy; +        terrain_texcoord[1].xy = vary_coords[3].zw; +        terrain_texcoord[1].zw = vary_coords[4].xy; +        terrain_texcoord[2].xy = vary_coords[4].zw; +#elif TERRAIN_PLANAR_TEXTURE_SAMPLE_COUNT == 1 +        TerrainCoord terrain_texcoord = vary_coords[0].zw; +#endif          mix2 = terrain_sample_and_multiply_pbr(              terrain_texcoord              , detail_1_base_color @@ -237,6 +273,9 @@ void main()              , emissiveColors[1]  #endif          ); +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_NORMAL) +        mix2.vNt = mikktspace(mix2.vNt, vary_tangents[1]); +#endif          mix = mix_pbr(mix, mix2, tm.weight.y);          break;      default: @@ -245,6 +284,16 @@ void main()      switch (tm.type & MIX_Z)      {      case MIX_Z: +#if TERRAIN_PLANAR_TEXTURE_SAMPLE_COUNT == 3 +        TerrainCoord terrain_texcoord; +        terrain_texcoord[0].xy = vary_coords[5].xy; +        terrain_texcoord[0].zw = vary_coords[5].zw; +        terrain_texcoord[1].xy = vary_coords[6].xy; +        terrain_texcoord[1].zw = vary_coords[6].zw; +        terrain_texcoord[2].xy = vary_coords[7].xy; +#elif TERRAIN_PLANAR_TEXTURE_SAMPLE_COUNT == 1 +        TerrainCoord terrain_texcoord = vary_coords[1].xy; +#endif          mix2 = terrain_sample_and_multiply_pbr(              terrain_texcoord              , detail_2_base_color @@ -267,6 +316,9 @@ void main()              , emissiveColors[2]  #endif          ); +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_NORMAL) +        mix2.vNt = mikktspace(mix2.vNt, vary_tangents[2]); +#endif          mix = mix_pbr(mix, mix2, tm.weight.z);          break;      default: @@ -275,6 +327,16 @@ void main()      switch (tm.type & MIX_W)      {      case MIX_W: +#if TERRAIN_PLANAR_TEXTURE_SAMPLE_COUNT == 3 +        TerrainCoord terrain_texcoord; +        terrain_texcoord[0].xy = vary_coords[7].zw; +        terrain_texcoord[0].zw = vary_coords[8].xy; +        terrain_texcoord[1].xy = vary_coords[8].zw; +        terrain_texcoord[1].zw = vary_coords[9].xy; +        terrain_texcoord[2].xy = vary_coords[9].zw; +#elif TERRAIN_PLANAR_TEXTURE_SAMPLE_COUNT == 1 +        TerrainCoord terrain_texcoord = vary_coords[1].zw; +#endif          mix2 = terrain_sample_and_multiply_pbr(              terrain_texcoord              , detail_3_base_color @@ -297,6 +359,9 @@ void main()              , emissiveColors[3]  #endif          ); +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_NORMAL) +        mix2.vNt = mikktspace(mix2.vNt, vary_tangents[3]); +#endif          mix = mix_pbr(mix, mix2, tm.weight.w);          break;      default: @@ -311,19 +376,11 @@ void main()      float base_color_factor_alpha = terrain_mix(tm, vec4(baseColorFactors[0].z, baseColorFactors[1].z, baseColorFactors[2].z, baseColorFactors[3].z));  #if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_NORMAL) -    // from mikktspace.com -    vec3 vNt = mix.vNt; -    vec3 vN = vary_normal; -    vec3 vT = vary_tangent.xyz; -     -    vec3 vB = vary_sign * cross(vN, vT); -    vec3 tnorm = normalize( vNt.x * vT + vNt.y * vB + vNt.z * vN ); - -    tnorm *= gl_FrontFacing ? 1.0 : -1.0; +    vec3 tnorm = normalize(mix.vNt);  #else      vec3 tnorm = vary_normal; -    tnorm *= gl_FrontFacing ? 1.0 : -1.0;  #endif +    tnorm *= gl_FrontFacing ? 1.0 : -1.0;  #if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_EMISSIVE) diff --git a/indra/newview/app_settings/shaders/class1/deferred/pbrterrainUtilF.glsl b/indra/newview/app_settings/shaders/class1/deferred/pbrterrainUtilF.glsl index 935c3f9301..7a7fd783ec 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/pbrterrainUtilF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/pbrterrainUtilF.glsl @@ -233,17 +233,12 @@ float terrain_mix(TerrainMix tm, vec4 tms4)  // Triplanar mapping  // Pre-transformed texture coordinates for each axial uv slice (Packing: xy, yz, (-x)z, unused) -#define TerrainCoord vec4[2] +#define TerrainCoord vec4[3] -vec2 _t_uv(vec2 uv_unflipped, float sign_or_zero) +// If sign_or_zero is positive, use uv_unflippped, otherwise use uv_flipped +vec2 _t_uv(vec2 uv_unflipped, vec2 uv_flipped, float sign_or_zero)  { -    // Handle case where sign is 0 -    float sign = (2.0*sign_or_zero) + 1.0; -    sign /= abs(sign); -    // If the vertex normal is negative, flip the texture back -    // right-side up. -    vec2 uv = uv_unflipped * vec2(sign, 1); -    return uv; +    return mix(uv_flipped, uv_unflipped, max(0.0, sign_or_zero));  }  vec3 _t_normal_post_1(vec3 vNt0, float sign_or_zero) @@ -298,9 +293,9 @@ PBRMix terrain_sample_pbr(  {      PBRMix mix = init_pbr_mix(); -#define get_uv_x() _t_uv(terrain_coord[0].zw, sign(vary_vertex_normal.x)) -#define get_uv_y() _t_uv(terrain_coord[1].xy, sign(vary_vertex_normal.y)) -#define get_uv_z() _t_uv(terrain_coord[0].xy, sign(vary_vertex_normal.z)) +#define get_uv_x() _t_uv(terrain_coord[0].zw, terrain_coord[1].zw, sign(vary_vertex_normal.x)) +#define get_uv_y() _t_uv(terrain_coord[1].xy, terrain_coord[2].xy, sign(vary_vertex_normal.y)) +#define get_uv_z() _t_uv(terrain_coord[0].xy, vec2(0),             sign(vary_vertex_normal.z))      switch (tw.type & SAMPLE_X)      {      case SAMPLE_X: diff --git a/indra/newview/app_settings/shaders/class1/deferred/pbrterrainV.glsl b/indra/newview/app_settings/shaders/class1/deferred/pbrterrainV.glsl index 489fc26e3f..167d980eb8 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/pbrterrainV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/pbrterrainV.glsl @@ -23,6 +23,11 @@   * $/LicenseInfo$   */ +#define TERRAIN_PBR_DETAIL_EMISSIVE 0 +#define TERRAIN_PBR_DETAIL_OCCLUSION -1 +#define TERRAIN_PBR_DETAIL_NORMAL -2 +#define TERRAIN_PBR_DETAIL_METALLIC_ROUGHNESS -3 +  uniform mat3 normal_matrix;  uniform mat4 texture_matrix0;  uniform mat4 modelview_matrix; @@ -34,24 +39,28 @@ in vec4 tangent;  in vec4 diffuse_color;  in vec2 texcoord1; -#if TERRAIN_PLANAR_TEXTURE_SAMPLE_COUNT == 3 -out vec4[2] vary_coords; -#endif  out vec3 vary_vertex_normal; // Used by pbrterrainUtilF.glsl  out vec3 vary_normal; -out vec3 vary_tangent; +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_NORMAL) +out vec3 vary_tangents[4];  flat out float vary_sign; +#endif  out vec4 vary_texcoord0;  out vec4 vary_texcoord1; +#if TERRAIN_PLANAR_TEXTURE_SAMPLE_COUNT == 3 +out vec4[10] vary_coords; +#elif TERRAIN_PLANAR_TEXTURE_SAMPLE_COUNT == 1 +out vec4[2] vary_coords; +#endif  out vec3 vary_position; -// *HACK: tangent_space_transform should use texture_normal_transform, or maybe -// we shouldn't use tangent_space_transform at all. See the call to -// tangent_space_transform below. -uniform vec4[2] texture_base_color_transform; +// *HACK: Each material uses only one texture transform, but the KHR texture +// transform spec allows handling texture transforms separately for each +// individual texture info. +uniform vec4[5] terrain_texture_transforms; -vec2 texture_transform(vec2 vertex_texcoord, vec4[2] khr_gltf_transform, mat4 sl_animation_transform); -vec3 tangent_space_transform(vec4 vertex_tangent, vec3 vertex_normal, vec4[2] khr_gltf_transform, mat4 sl_animation_transform); +vec2 terrain_texture_transform(vec2 vertex_texcoord, vec4[2] khr_gltf_transform); +vec3 terrain_tangent_space_transform(vec4 vertex_tangent, vec3 vertex_normal, vec4[2] khr_gltf_transform);  void main()  { @@ -63,31 +72,101 @@ void main()      vary_vertex_normal = normal;  	vec3 t = normal_matrix * tangent.xyz; -    vary_tangent = normalize(t); -    // *TODO: Decide if we want this. It may be better to just calculate the -    // tangents on-the-fly in the fragment shader, due to the subtleties of the -    // effect of triplanar mapping on UVs. -    // *HACK: Should be using texture_normal_transform here. The KHR texture -    // transform spec requires handling texture transforms separately for each -    // individual texture. -    vary_tangent = normalize(tangent_space_transform(vec4(t, tangent.w), n, texture_base_color_transform, texture_matrix0)); +#if (TERRAIN_PBR_DETAIL >= TERRAIN_PBR_DETAIL_NORMAL) +    { +        vec4[2] ttt; +        // material 1 +        ttt[0].xyz = terrain_texture_transforms[0].xyz; +        ttt[1].x = terrain_texture_transforms[0].w; +        ttt[1].y = terrain_texture_transforms[1].x; +        vary_tangents[0] = normalize(terrain_tangent_space_transform(vec4(t, tangent.w), n, ttt)); +        // material 2 +        ttt[0].xyz = terrain_texture_transforms[1].yzw; +        ttt[1].xy = terrain_texture_transforms[2].xy; +        vary_tangents[1] = normalize(terrain_tangent_space_transform(vec4(t, tangent.w), n, ttt)); +        // material 3 +        ttt[0].xy = terrain_texture_transforms[2].zw; +        ttt[0].z = terrain_texture_transforms[3].x; +        ttt[1].xy = terrain_texture_transforms[3].yz; +        vary_tangents[2] = normalize(terrain_tangent_space_transform(vec4(t, tangent.w), n, ttt)); +        // material 4 +        ttt[0].x = terrain_texture_transforms[3].w; +        ttt[0].yz = terrain_texture_transforms[4].xy; +        ttt[1].xy = terrain_texture_transforms[4].zw; +        vary_tangents[3] = normalize(terrain_tangent_space_transform(vec4(t, tangent.w), n, ttt)); +    } +      vary_sign = tangent.w; +#endif      vary_normal = normalize(n);      // Transform and pass tex coords -    // *HACK: texture_base_color_transform is used for all of these here, but -    // the KHR texture transform spec requires handling texture transforms -    // separately for each individual texture. +    { +        vec4[2] ttt;  #if TERRAIN_PLANAR_TEXTURE_SAMPLE_COUNT == 3 -    // xy -    vary_coords[0].xy = texture_transform(position.xy, texture_base_color_transform, texture_matrix0); -    // yz -    vary_coords[0].zw = texture_transform(position.yz, texture_base_color_transform, texture_matrix0); -    // (-x)z -    vary_coords[1].xy = texture_transform(position.xz * vec2(-1, 1), texture_base_color_transform, texture_matrix0); +// Don't care about upside-down (transform_xy_flipped()) +#define transform_xy()             terrain_texture_transform(position.xy,               ttt) +#define transform_yz()             terrain_texture_transform(position.yz,               ttt) +#define transform_negx_z()         terrain_texture_transform(position.xz * vec2(-1, 1), ttt) +#define transform_yz_flipped()     terrain_texture_transform(position.yz * vec2(-1, 1), ttt) +#define transform_negx_z_flipped() terrain_texture_transform(position.xz,               ttt) +        // material 1 +        ttt[0].xyz = terrain_texture_transforms[0].xyz; +        ttt[1].x = terrain_texture_transforms[0].w; +        ttt[1].y = terrain_texture_transforms[1].x; +        vary_coords[0].xy = transform_xy(); +        vary_coords[0].zw = transform_yz(); +        vary_coords[1].xy = transform_negx_z(); +        vary_coords[1].zw = transform_yz_flipped(); +        vary_coords[2].xy = transform_negx_z_flipped(); +        // material 2 +        ttt[0].xyz = terrain_texture_transforms[1].yzw; +        ttt[1].xy = terrain_texture_transforms[2].xy; +        vary_coords[2].zw = transform_xy(); +        vary_coords[3].xy = transform_yz(); +        vary_coords[3].zw = transform_negx_z(); +        vary_coords[4].xy = transform_yz_flipped(); +        vary_coords[4].zw = transform_negx_z_flipped(); +        // material 3 +        ttt[0].xy = terrain_texture_transforms[2].zw; +        ttt[0].z = terrain_texture_transforms[3].x; +        ttt[1].xy = terrain_texture_transforms[3].yz; +        vary_coords[5].xy = transform_xy(); +        vary_coords[5].zw = transform_yz(); +        vary_coords[6].xy = transform_negx_z(); +        vary_coords[6].zw = transform_yz_flipped(); +        vary_coords[7].xy = transform_negx_z_flipped(); +        // material 4 +        ttt[0].x = terrain_texture_transforms[3].w; +        ttt[0].yz = terrain_texture_transforms[4].xy; +        ttt[1].xy = terrain_texture_transforms[4].zw; +        vary_coords[7].zw = transform_xy(); +        vary_coords[8].xy = transform_yz(); +        vary_coords[8].zw = transform_negx_z(); +        vary_coords[9].xy = transform_yz_flipped(); +        vary_coords[9].zw = transform_negx_z_flipped();  #elif TERRAIN_PLANAR_TEXTURE_SAMPLE_COUNT == 1 -    vary_texcoord0.xy = texture_transform(position.xy, texture_base_color_transform, texture_matrix0); +        // material 1 +        ttt[0].xyz = terrain_texture_transforms[0].xyz; +        ttt[1].x = terrain_texture_transforms[0].w; +        ttt[1].y = terrain_texture_transforms[1].x; +        vary_coords[0].xy = terrain_texture_transform(position.xy, ttt); +        // material 2 +        ttt[0].xyz = terrain_texture_transforms[1].yzw; +        ttt[1].xy = terrain_texture_transforms[2].xy; +        vary_coords[0].zw = terrain_texture_transform(position.xy, ttt); +        // material 3 +        ttt[0].xy = terrain_texture_transforms[2].zw; +        ttt[0].z = terrain_texture_transforms[3].x; +        ttt[1].xy = terrain_texture_transforms[3].yz; +        vary_coords[1].xy = terrain_texture_transform(position.xy, ttt); +        // material 4 +        ttt[0].x = terrain_texture_transforms[3].w; +        ttt[0].yz = terrain_texture_transforms[4].xy; +        ttt[1].xy = terrain_texture_transforms[4].zw; +        vary_coords[1].zw = terrain_texture_transform(position.xy, ttt);  #endif +    }      vec4 tc = vec4(texcoord1,0,1);      vary_texcoord0.zw = tc.xy; diff --git a/indra/newview/app_settings/shaders/class1/deferred/textureUtilV.glsl b/indra/newview/app_settings/shaders/class1/deferred/textureUtilV.glsl index 732333311c..baf4010fa7 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/textureUtilV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/textureUtilV.glsl @@ -48,6 +48,7 @@ vec2 khr_texture_transform(vec2 texcoord, vec2 scale, float rotation, vec2 offse      return (transform * vec3(texcoord, 1)).xy;  } +// A texture transform function for PBR materials applied to shape prims/Collada model prims  // 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. @@ -77,6 +78,21 @@ vec2 texture_transform(vec2 vertex_texcoord, vec4[2] khr_gltf_transform, mat4 sl      return texcoord;  } +// Similar to texture_transform but no offset during coordinate system +// conversion, and no texture animation support. +vec2 terrain_texture_transform(vec2 vertex_texcoord, vec4[2] khr_gltf_transform) +{ +    vec2 texcoord = vertex_texcoord; + +    texcoord.y = 1.0 - texcoord.y; +    //texcoord.y = -texcoord.y; +    texcoord = khr_texture_transform(texcoord, khr_gltf_transform[0].xy, khr_gltf_transform[0].z, khr_gltf_transform[1].xy); +    texcoord.y = 1.0 - texcoord.y; +    //texcoord.y = -texcoord.y; + +    return texcoord; +} +  // Take the rotation only from both transforms and apply to the tangent. This  // accounts for the change of the topology of the normal texture when a texture  // rotation is applied to it. @@ -120,3 +136,26 @@ vec3 tangent_space_transform(vec4 vertex_tangent, vec3 vertex_normal, vec4[2] kh      return (weights.x * vertex_binormal.xyz) + (weights.y * vertex_tangent.xyz);  } + +// Similar to tangent_space_transform but no offset during coordinate system +// conversion, and no texture animation support. +vec3 terrain_tangent_space_transform(vec4 vertex_tangent, vec3 vertex_normal, vec4[2] khr_gltf_transform) +{ +    // Immediately convert to left-handed coordinate system ((0,1) -> (0, -1)) +    vec2 weights = vec2(0, -1); + +    // Apply KHR_texture_transform (rotation only) +    float khr_rotation = khr_gltf_transform[0].z; +    mat2 khr_rotation_mat = mat2( +        cos(khr_rotation),-sin(khr_rotation), +        sin(khr_rotation), cos(khr_rotation) +    ); +    weights = khr_rotation_mat * weights; + +    // Convert back to right-handed coordinate system +    weights.y = -weights.y; + +    vec3 vertex_binormal = vertex_tangent.w * cross(vertex_normal, vertex_tangent.xyz); + +    return (weights.x * vertex_binormal.xyz) + (weights.y * vertex_tangent.xyz); +} | 
