Fixed an annoying showstopper regarding rigged attachment vertex corruption. Rigged meshes have can have poor weighting, causing potential div-by-zero issues.

This commit is contained in:
Shyotl
2014-05-08 15:11:12 -05:00
parent 2d0b310e19
commit 7158a3c83d
12 changed files with 149 additions and 188 deletions

View File

@@ -22,30 +22,34 @@
* $/LicenseInfo$
*/
#define FLT_MAX 3.402823466e+38
ATTRIBUTE vec4 weight4;
uniform mat3 matrixPalette[52];
uniform vec3 translationPalette[52];
uniform float maxWeight;
mat4 getObjectSkinnedTransform()
{
int i;
vec4 w = fract(weight4);
vec4 index = floor(weight4);
index = min(index, vec4(maxWeight));
index = max(index, vec4( 0.0));
float scale = 1.0/(w.x+w.y+w.z+w.w);
w *= scale;
float sum = (w.x+w.y+w.z+w.w);
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;
@@ -58,10 +62,10 @@ mat4 getObjectSkinnedTransform()
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);
ret[0] = vec4(mat[0].xyz, 0);
ret[1] = vec4(mat[1].xyz, 0);
ret[2] = vec4(mat[2].xyz, 0);
ret[3] = vec4(trans, scale);
return ret;
}