X-Git-Url: http://git.xonotic.org/?p=xonotic%2Fdarkplaces.git;a=blobdiff_plain;f=mod_skeletal_animatevertices_generic.c;h=43563457212300837fde2d38ffcb70ba2a322fa2;hp=fcaf4ed24203a45e10df139aa16fea91eb547075;hb=118b0260c3c33669cd45bad72ddfdcf9232a1d65;hpb=4e917c714cb66459bc448d983a45d57b616bb154 diff --git a/mod_skeletal_animatevertices_generic.c b/mod_skeletal_animatevertices_generic.c index fcaf4ed2..43563457 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()