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">
-
+
+
+
+
-
+
+
+
+