X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fdarkplaces.git;a=blobdiff_plain;f=mod_skeletal_animatevertices_generic.c;h=5a1047d9798bd89c541ed5ca566c15d17c3ab110;hp=fcaf4ed24203a45e10df139aa16fea91eb547075;hb=85a33377d64ae8438e6582a7b8472f5a4bd41942;hpb=4e917c714cb66459bc448d983a45d57b616bb154 diff --git a/mod_skeletal_animatevertices_generic.c b/mod_skeletal_animatevertices_generic.c index fcaf4ed2..5a1047d9 100644 --- a/mod_skeletal_animatevertices_generic.c +++ b/mod_skeletal_animatevertices_generic.c @@ -1,105 +1,32 @@ #include "mod_skeletal_animatevertices_generic.h" -typedef struct -{ - float f[12]; -} -float12_t; - void Mod_Skeletal_AnimateVertices_Generic(const dp_model_t * RESTRICT model, const frameblend_t * RESTRICT frameblend, const skeleton_t *skeleton, float * RESTRICT vertex3f, float * RESTRICT normal3f, float * RESTRICT svector3f, float * RESTRICT tvector3f) { // vertex weighted skeletal int i, k; - int blends; - float12_t *bonepose; - float12_t *boneposerelative; - float m[12]; + float *bonepose; + float *boneposerelative; const blendweights_t * RESTRICT weights; //unsigned long long ts = rdtsc(); - bonepose = (float12_t *) Mod_Skeletal_AnimateVertices_AllocBuffers(sizeof(float12_t) * (model->num_bones*2 + model->surfmesh.num_blends)); - boneposerelative = bonepose + model->num_bones; - - if (skeleton && !skeleton->relativetransforms) - skeleton = NULL; - - // interpolate matrices - if (skeleton) - { - for (i = 0;i < model->num_bones;i++) - { - Matrix4x4_ToArray12FloatD3D(&skeleton->relativetransforms[i], m); - if (model->data_bones[i].parent >= 0) - R_ConcatTransforms(bonepose[model->data_bones[i].parent].f, m, bonepose[i].f); - else - memcpy(bonepose[i].f, m, sizeof(m)); - - // create a relative deformation matrix to describe displacement - // from the base mesh, which is used by the actual weighting - R_ConcatTransforms(bonepose[i].f, model->data_baseboneposeinverse + i * 12, boneposerelative[i].f); - } - } - else - { - float originscale = model->num_posescale; - float x,y,z,w,lerp; - const short * RESTRICT pose7s; + bonepose = (float *) Mod_Skeletal_AnimateVertices_AllocBuffers(sizeof(float[12]) * (model->num_bones*2 + model->surfmesh.num_blends)); + boneposerelative = bonepose + model->num_bones * 12; - for (i = 0;i < model->num_bones;i++) - { - memset(m, 0, sizeof(m)); - for (blends = 0;blends < MAX_FRAMEBLENDS && frameblend[blends].lerp > 0;blends++) - { - pose7s = model->data_poses7s + 7 * (frameblend[blends].subframe * model->num_bones + i); - lerp = frameblend[blends].lerp; - x = pose7s[3] * (1.0f / 32767.0f); - y = pose7s[4] * (1.0f / 32767.0f); - z = pose7s[5] * (1.0f / 32767.0f); - w = pose7s[6] * (1.0f / 32767.0f); - m[ 0] += (1-2*(y*y+z*z)) * lerp; - m[ 1] += ( 2*(x*y-z*w)) * lerp; - m[ 2] += ( 2*(x*z+y*w)) * lerp; - m[ 3] += (pose7s[0] * originscale) * lerp; - m[ 4] += ( 2*(x*y+z*w)) * lerp; - m[ 5] += (1-2*(x*x+z*z)) * lerp; - m[ 6] += ( 2*(y*z-x*w)) * lerp; - m[ 7] += (pose7s[1] * originscale) * lerp; - m[ 8] += ( 2*(x*z-y*w)) * lerp; - m[ 9] += ( 2*(y*z+x*w)) * lerp; - m[10] += (1-2*(x*x+y*y)) * lerp; - m[11] += (pose7s[2] * originscale) * lerp; - } - VectorNormalize(m ); - VectorNormalize(m + 4); - VectorNormalize(m + 8); - if (i == r_skeletal_debugbone.integer) - m[r_skeletal_debugbonecomponent.integer % 12] += r_skeletal_debugbonevalue.value; - m[3] *= r_skeletal_debugtranslatex.value; - m[7] *= r_skeletal_debugtranslatey.value; - m[11] *= r_skeletal_debugtranslatez.value; - if (model->data_bones[i].parent >= 0) - R_ConcatTransforms(bonepose[model->data_bones[i].parent].f, m, bonepose[i].f); - else - memcpy(bonepose[i].f, m, sizeof(m)); - // create a relative deformation matrix to describe displacement - // from the base mesh, which is used by the actual weighting - R_ConcatTransforms(bonepose[i].f, model->data_baseboneposeinverse + i * 12, boneposerelative[i].f); - } - } + Mod_Skeletal_BuildTransforms(model, frameblend, skeleton, bonepose, boneposerelative); // generate matrices for all blend combinations weights = model->surfmesh.data_blendweights; for (i = 0;i < model->surfmesh.num_blends;i++, weights++) { - float * RESTRICT b = boneposerelative[model->num_bones + i].f; - const float * RESTRICT m = boneposerelative[weights->index[0]].f; + float * RESTRICT b = boneposerelative + 12 * (model->num_bones + i); + const float * RESTRICT m = boneposerelative + 12 * (unsigned int)weights->index[0]; float f = weights->influence[0] * (1.0f / 255.0f); b[ 0] = f*m[ 0]; b[ 1] = f*m[ 1]; b[ 2] = f*m[ 2]; b[ 3] = f*m[ 3]; b[ 4] = f*m[ 4]; b[ 5] = f*m[ 5]; b[ 6] = f*m[ 6]; b[ 7] = f*m[ 7]; b[ 8] = f*m[ 8]; b[ 9] = f*m[ 9]; b[10] = f*m[10]; b[11] = f*m[11]; for (k = 1;k < 4 && weights->influence[k];k++) { - m = boneposerelative[weights->index[k]].f; + m = boneposerelative + 12 * (unsigned int)weights->index[k]; f = weights->influence[k] * (1.0f / 255.0f); b[ 0] += f*m[ 0]; b[ 1] += f*m[ 1]; b[ 2] += f*m[ 2]; b[ 3] += f*m[ 3]; b[ 4] += f*m[ 4]; b[ 5] += f*m[ 5]; b[ 6] += f*m[ 6]; b[ 7] += f*m[ 7]; @@ -107,7 +34,7 @@ void Mod_Skeletal_AnimateVertices_Generic(const dp_model_t * RESTRICT model, con } } -#define LOAD_MATRIX_SCALAR() const float * RESTRICT m = boneposerelative[*b].f +#define LOAD_MATRIX_SCALAR() const float * RESTRICT m = boneposerelative + 12 * (unsigned int)*b #define LOAD_MATRIX3() \ LOAD_MATRIX_SCALAR() @@ -139,19 +66,19 @@ void Mod_Skeletal_AnimateVertices_Generic(const dp_model_t * RESTRICT model, con const float * RESTRICT n = model->surfmesh.data_normal3f; if (svector3f && tvector3f) { - const float * RESTRICT sv = model->surfmesh.data_svector3f; - const float * RESTRICT tv = model->surfmesh.data_tvector3f; + const float * RESTRICT svec = model->surfmesh.data_svector3f; + const float * RESTRICT tvec = model->surfmesh.data_tvector3f; // Note that for SSE each iteration stores one element past end, so we break one vertex short // and handle that with scalars in that case - for (i = 0; i < model->surfmesh.num_vertices; i++, v += 3, n += 3, sv += 3, tv += 3, b++, + for (i = 0; i < model->surfmesh.num_vertices; i++, v += 3, n += 3, svec += 3, tvec += 3, b++, vertex3f += 3, normal3f += 3, svector3f += 3, tvector3f += 3) { LOAD_MATRIX4(); TRANSFORM_POSITION(v, vertex3f); TRANSFORM_VECTOR(n, normal3f); - TRANSFORM_VECTOR(sv, svector3f); - TRANSFORM_VECTOR(tv, tvector3f); + TRANSFORM_VECTOR(svec, svector3f); + TRANSFORM_VECTOR(tvec, tvector3f); } return; @@ -187,23 +114,23 @@ void Mod_Skeletal_AnimateVertices_Generic(const dp_model_t * RESTRICT model, con if (svector3f) { - const float * RESTRICT sv = model->surfmesh.data_svector3f; + const float * RESTRICT svec = model->surfmesh.data_svector3f; const unsigned short * RESTRICT b = model->surfmesh.blends; - for (i = 0; i < model->surfmesh.num_vertices; i++, sv += 3, b++, svector3f += 3) + for (i = 0; i < model->surfmesh.num_vertices; i++, svec += 3, b++, svector3f += 3) { LOAD_MATRIX3(); - TRANSFORM_VECTOR(sv, svector3f); + TRANSFORM_VECTOR(svec, svector3f); } } if (tvector3f) { - const float * RESTRICT tv = model->surfmesh.data_tvector3f; + const float * RESTRICT tvec = model->surfmesh.data_tvector3f; const unsigned short * RESTRICT b = model->surfmesh.blends; - for (i = 0; i < model->surfmesh.num_vertices; i++, tv += 3, b++, tvector3f += 3) + for (i = 0; i < model->surfmesh.num_vertices; i++, tvec += 3, b++, tvector3f += 3) { LOAD_MATRIX3(); - TRANSFORM_VECTOR(tv, tvector3f); + TRANSFORM_VECTOR(tvec, tvector3f); } } }