diff --git a/indra/llrender/llshadermgr.cpp b/indra/llrender/llshadermgr.cpp index c9cb86cfa..8dab8bbc8 100644 --- a/indra/llrender/llshadermgr.cpp +++ b/indra/llrender/llshadermgr.cpp @@ -1224,6 +1224,7 @@ void LLShaderMgr::initAttribsAndUniforms() mReservedUniforms.push_back("env_intensity"); mReservedUniforms.push_back("matrixPalette"); + mReservedUniforms.push_back("translationPalette"); mReservedUniforms.push_back("screenTex"); mReservedUniforms.push_back("screenDepth"); diff --git a/indra/llrender/llshadermgr.h b/indra/llrender/llshadermgr.h index 7dccf47b1..5cf22f58f 100644 --- a/indra/llrender/llshadermgr.h +++ b/indra/llrender/llshadermgr.h @@ -178,6 +178,7 @@ public: ENVIRONMENT_INTENSITY, AVATAR_MATRIX, + AVATAR_TRANSLATION, WATER_SCREENTEX, WATER_SCREENDEPTH, diff --git a/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl b/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl index 4005341c6..972d10b32 100644 --- a/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl +++ b/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl @@ -26,26 +26,45 @@ ATTRIBUTE vec4 weight4; -uniform mat4 matrixPalette[32]; +uniform mat3 matrixPalette[64]; +uniform vec3 translationPalette[64]; + mat4 getObjectSkinnedTransform() { - float w0 = fract(weight4.x); - float w1 = fract(weight4.y); - float w2 = fract(weight4.z); - float w3 = fract(weight4.w); + int i; - int i0 = int(floor(weight4.x)); - int i1 = int(floor(weight4.y)); - int i2 = int(floor(weight4.z)); - int i3 = int(floor(weight4.w)); + vec4 w = fract(weight4); + vec4 index = floor(weight4); - //float scale = 1.0/(w.x+w.y+w.z+w.w); - //w *= scale; - mat4 mat = matrixPalette[i0]*w0; - mat += matrixPalette[i1]*w1; - mat += matrixPalette[i2]*w2; - mat += matrixPalette[i3]*w3; + index = min(index, vec4(63.0)); + index = max(index, vec4( 0.0)); - return mat; + float scale = 1.0/(w.x+w.y+w.z+w.w); + w *= scale; + + int i1 = int(index.x); + int i2 = int(index.y); + int i3 = int(index.z); + int i4 = int(index.w); + + mat3 mat = matrixPalette[i1]*w.x; + mat += matrixPalette[i2]*w.y; + mat += matrixPalette[i3]*w.z; + mat += matrixPalette[i4]*w.w; + + vec3 trans = translationPalette[i1]*w.x; + trans += translationPalette[i2]*w.y; + trans += translationPalette[i3]*w.z; + trans += translationPalette[i4]*w.w; + + mat4 ret; + + ret[0] = vec4(mat[0], 0); + ret[1] = vec4(mat[1], 0); + ret[2] = vec4(mat[2], 0); + ret[3] = vec4(trans, 1.0); + + return ret; } + diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml index 48e6205bc..d65f1e09b 100644 --- a/indra/newview/character/avatar_lad.xml +++ b/indra/newview/character/avatar_lad.xml @@ -3563,7 +3563,11 @@ + pos="0.07 0 -0.02"/> + @@ -3582,7 +3586,16 @@ camera_elevation=".1" camera_distance="1" camera_angle="15"> - + + + + - + + + + - + + + + + @@ -3732,6 +3767,10 @@ scale="-0.01 -0.01 0.0" pos="0.01 0.0 0"/> + @@ -3780,6 +3819,32 @@ scale="0.02 0.03 0.03" pos="0 0 -0.03"/> + + + + + + + @@ -3832,7 +3897,16 @@ value_max="2" camera_elevation=".3" camera_distance=".8"> - + + + + + + + @@ -3901,7 +3984,16 @@ value_max="1.3" camera_elevation=".3" camera_distance=".8"> - + + + + - + + + +