/* <160de> ../cstrike/dlls/animation.cpp:994 */ void StudioCalcRotations(mstudiobone_t *pbones, int *chain, int chainlength, float *adj, float pos[128][3], vec4_t *q, mstudioseqdesc_t *pseqdesc, mstudioanim_t *panim, float f, float s) { int i; int j; for (i = chainlength - 1; i >= 0; i--) { j = chain[i]; StudioCalcBoneQuaterion((int)f, s, &pbones[j], &panim[j], adj, q[j]); StudioCalcBonePosition((int)f, s, &pbones[j], &panim[j], adj, pos[j]); } }
void CStudioModelRenderer::StudioCalcRotations(float pos[][3], vec4_t *q, mstudioseqdesc_t *pseqdesc, mstudioanim_t *panim, float f) { int i; int frame; mstudiobone_t *pbone; float s; float adj[MAXSTUDIOCONTROLLERS]; float dadt; if (f > pseqdesc->numframes - 1) f = 0; else if (f < -0.01) f = -0.01; frame = (int)f; dadt = StudioEstimateInterpolant(); s = (f - frame); pbone = (mstudiobone_t *)((byte *)m_pStudioHeader + m_pStudioHeader->boneindex); StudioCalcBoneAdj(dadt, adj, m_pCurrentEntity->curstate.controller, m_pCurrentEntity->latched.prevcontroller, m_pCurrentEntity->mouth.mouthopen); for (i = 0; i < m_pStudioHeader->numbones; i++, pbone++, panim++) { StudioCalcBoneQuaterion(frame, s, pbone, panim, adj, q[i]); StudioCalcBonePosition(frame, s, pbone, panim, adj, pos[i]); } if (pseqdesc->motiontype & STUDIO_X) pos[pseqdesc->motionbone][0] = 0.0; if (pseqdesc->motiontype & STUDIO_Y) pos[pseqdesc->motionbone][1] = 0.0; if (pseqdesc->motiontype & STUDIO_Z) pos[pseqdesc->motionbone][2] = 0.0; s = 0 * ((1.0 - (f - (int)(f))) / (pseqdesc->numframes)) * m_pCurrentEntity->curstate.framerate; if (pseqdesc->motiontype & STUDIO_LX) pos[pseqdesc->motionbone][0] += s * pseqdesc->linearmovement[0]; if (pseqdesc->motiontype & STUDIO_LY) pos[pseqdesc->motionbone][1] += s * pseqdesc->linearmovement[1]; if (pseqdesc->motiontype & STUDIO_LZ) pos[pseqdesc->motionbone][2] += s * pseqdesc->linearmovement[2]; }
/* ==================== StudioCalcRotations ==================== */ void CStudioModelRenderer::StudioCalcRotations ( float pos[][3], vec4_t *q, mstudioseqdesc_t *pseqdesc, mstudioanim_t *panim, float f ) { int i; int frame; mstudiobone_t *pbone; float s; float adj[MAXSTUDIOCONTROLLERS]; float dadt; if (f > pseqdesc->numframes - 1) { f = 0; // bah, fix this bug with changing sequences too fast } // BUG ( somewhere else ) but this code should validate this data. // This could cause a crash if the frame # is negative, so we'll go ahead // and clamp it here else if ( f < -0.01 ) { f = -0.01; } frame = (int)f; // Con_DPrintf("%d %.4f %.4f %.4f %.4f %d\n", m_pCurrentEntity->curstate.sequence, m_clTime, m_pCurrentEntity->animtime, m_pCurrentEntity->frame, f, frame ); // Con_DPrintf( "%f %f %f\n", m_pCurrentEntity->angles[ROLL], m_pCurrentEntity->angles[PITCH], m_pCurrentEntity->angles[YAW] ); // Con_DPrintf("frame %d %d\n", frame1, frame2 ); dadt = StudioEstimateInterpolant( ); s = (f - frame); // add in programtic controllers pbone = (mstudiobone_t *)((byte *)m_pStudioHeader + m_pStudioHeader->boneindex); StudioCalcBoneAdj( dadt, adj, m_pCurrentEntity->curstate.controller, m_pCurrentEntity->latched.prevcontroller, m_pCurrentEntity->mouth.mouthopen ); for (i = 0; i < m_pStudioHeader->numbones; i++, pbone++, panim++) { StudioCalcBoneQuaterion( frame, s, pbone, panim, adj, q[i] ); StudioCalcBonePosition( frame, s, pbone, panim, adj, pos[i] ); // if (0 && i == 0) // Con_DPrintf("%d %d %d %d\n", m_pCurrentEntity->curstate.sequence, frame, j, k ); } if (pseqdesc->motiontype & STUDIO_X) { pos[pseqdesc->motionbone][0] = 0.0; } if (pseqdesc->motiontype & STUDIO_Y) { pos[pseqdesc->motionbone][1] = 0.0; } if (pseqdesc->motiontype & STUDIO_Z) { pos[pseqdesc->motionbone][2] = 0.0; } s = 0 * ((1.0 - (f - (int)(f))) / (pseqdesc->numframes)) * m_pCurrentEntity->curstate.framerate; if (pseqdesc->motiontype & STUDIO_LX) { pos[pseqdesc->motionbone][0] += s * pseqdesc->linearmovement[0]; } if (pseqdesc->motiontype & STUDIO_LY) { pos[pseqdesc->motionbone][1] += s * pseqdesc->linearmovement[1]; } if (pseqdesc->motiontype & STUDIO_LZ) { pos[pseqdesc->motionbone][2] += s * pseqdesc->linearmovement[2]; } }