int RE_LerpTagET( orientation_t *tag, const refEntity_t *refent, const char *tagNameIn, int startIndex ) { mdvTag_t *start, *end; int i; float frontLerp, backLerp; model_t *model; char tagName[ MAX_QPATH ]; //, *ch; int retval; qhandle_t handle; int startFrame, endFrame; float frac; handle = refent->hModel; startFrame = refent->oldframe; endFrame = refent->frame; frac = 1.0 - refent->backlerp; Q_strncpyz( tagName, tagNameIn, MAX_QPATH ); /* // if the tagName has a space in it, then it is passing through the starting tag number if (ch = strrchr(tagName, ' ')) { *ch = 0; ch++; startIndex = atoi(ch); } */ model = R_GetModelByHandle( handle ); /* if(!model->mdv[0]) //if(!model->model.md3[0] && !model->model.mdc[0] && !model->model.mds) { AxisClear(tag->axis); VectorClear(tag->origin); return -1; } */ frontLerp = frac; backLerp = 1.0 - frac; start = end = NULL; /* else if(model->type == MOD_MDS) { // use bone lerping retval = R_GetBoneTag(tag, model->model.mds, startIndex, refent, tagNameIn); if(retval >= 0) { return retval; } // failed return -1; } */ if ( model->type == MOD_MDM ) { // use bone lerping retval = R_MDM_GetBoneTag( tag, model->mdm, startIndex, refent, tagNameIn ); if ( retval >= 0 ) { return retval; } // failed return -1; } else if ( model->type == MOD_MD5 ) { vec3_t tmp; retval = RE_BoneIndex( handle, tagName ); if ( retval <= 0 ) { return -1; } VectorCopy( refent->skeleton.bones[ retval ].origin, tag->origin ); QuatToAxis( refent->skeleton.bones[ retval ].rotation, tag->axis ); VectorCopy( tag->axis[ 2 ], tmp ); VectorCopy( tag->axis[ 1 ], tag->axis[ 2 ] ); VectorCopy( tag->axis[ 0 ], tag->axis[ 1 ] ); VectorCopy( tmp, tag->axis[ 0 ] ); VectorNormalize( tag->axis[ 0 ] ); VectorNormalize( tag->axis[ 1 ] ); VectorNormalize( tag->axis[ 2 ] ); return retval; } /* else { // psuedo-compressed MDC tags mdcTag_t *cstart, *cend; retval = R_GetMDCTag((byte *) model->model.mdc[0], startFrame, tagName, startIndex, &cstart); retval = R_GetMDCTag((byte *) model->model.mdc[0], endFrame, tagName, startIndex, &cend); // uncompress the MDC tags into MD3 style tags if(cstart && cend) { for(i = 0; i < 3; i++) { ustart.origin[i] = (float)cstart->xyz[i] * MD3_XYZ_SCALE; uend.origin[i] = (float)cend->xyz[i] * MD3_XYZ_SCALE; sangles[i] = (float)cstart->angles[i] * MDC_TAG_ANGLE_SCALE; eangles[i] = (float)cend->angles[i] * MDC_TAG_ANGLE_SCALE; } AnglesToAxis(sangles, ustart.axis); AnglesToAxis(eangles, uend.axis); start = &ustart; end = &uend; } else { start = NULL; end = NULL; } } */ else if ( model->type == MOD_MESH ) { // old MD3 style retval = R_GetTag( model->mdv[ 0 ], startFrame, tagName, startIndex, &start ); retval = R_GetTag( model->mdv[ 0 ], endFrame, tagName, startIndex, &end ); if ( !start || !end ) { AxisClear( tag->axis ); VectorClear( tag->origin ); return -1; } for ( i = 0; i < 3; i++ ) { tag->origin[ i ] = start->origin[ i ] * backLerp + end->origin[ i ] * frontLerp; tag->axis[ 0 ][ i ] = start->axis[ 0 ][ i ] * backLerp + end->axis[ 0 ][ i ] * frontLerp; tag->axis[ 1 ][ i ] = start->axis[ 1 ][ i ] * backLerp + end->axis[ 1 ][ i ] * frontLerp; tag->axis[ 2 ][ i ] = start->axis[ 2 ][ i ] * backLerp + end->axis[ 2 ][ i ] * frontLerp; } VectorNormalize( tag->axis[ 0 ] ); VectorNormalize( tag->axis[ 1 ] ); VectorNormalize( tag->axis[ 2 ] ); return retval; } return -1; }
// returns the index of the tag it found, for cycling through tags with the same name int R_LerpTag( orientation_t* tag, const refEntity_t* refent, const char* tagName, int startIndex ) { qhandle_t handle = refent->hModel; int startFrame = refent->oldframe; int endFrame = refent->frame; float frac = 1.0 - refent->backlerp; idRenderModel* model = R_GetModelByHandle( handle ); if ( !model->q3_md3[ 0 ].header && !model->q3_mdc[ 0 ].header && !model->q3_mds && !model->q3_mdm ) { AxisClear( tag->axis ); VectorClear( tag->origin ); return -1; } float frontLerp = frac; float backLerp = 1.0 - frac; int retval; md3Tag_t* start; md3Tag_t* end; md3Tag_t ustart, uend; if ( model->type == MOD_MESH3 ) { // old MD3 style retval = R_GetTag( ( byte* )model->q3_md3[ 0 ].header, startFrame, tagName, startIndex, &start ); retval = R_GetTag( ( byte* )model->q3_md3[ 0 ].header, endFrame, tagName, startIndex, &end ); } else if ( model->type == MOD_MDS ) { // use bone lerping retval = R_GetBoneTagMds( tag, model->q3_mds, startIndex, refent, tagName ); if ( retval >= 0 ) { return retval; } // failed return -1; } else if ( model->type == MOD_MDM ) { // use bone lerping retval = R_MDM_GetBoneTag( tag, model->q3_mdm, startIndex, refent, tagName ); if ( retval >= 0 ) { return retval; } // failed return -1; } else { // psuedo-compressed MDC tags mdcTag_t* cstart; mdcTag_t* cend; retval = R_GetMDCTag( ( byte* )model->q3_mdc[ 0 ].header, startFrame, tagName, startIndex, &cstart ); retval = R_GetMDCTag( ( byte* )model->q3_mdc[ 0 ].header, endFrame, tagName, startIndex, &cend ); // uncompress the MDC tags into MD3 style tags if ( cstart && cend ) { vec3_t sangles, eangles; for ( int i = 0; i < 3; i++ ) { ustart.origin[ i ] = ( float )cstart->xyz[ i ] * MD3_XYZ_SCALE; uend.origin[ i ] = ( float )cend->xyz[ i ] * MD3_XYZ_SCALE; sangles[ i ] = ( float )cstart->angles[ i ] * MDC_TAG_ANGLE_SCALE; eangles[ i ] = ( float )cend->angles[ i ] * MDC_TAG_ANGLE_SCALE; } AnglesToAxis( sangles, ustart.axis ); AnglesToAxis( eangles, uend.axis ); start = &ustart; end = &uend; } else { start = NULL; end = NULL; } } if ( !start || !end ) { AxisClear( tag->axis ); VectorClear( tag->origin ); return -1; } for ( int i = 0; i < 3; i++ ) { tag->origin[ i ] = start->origin[ i ] * backLerp + end->origin[ i ] * frontLerp; tag->axis[ 0 ][ i ] = start->axis[ 0 ][ i ] * backLerp + end->axis[ 0 ][ i ] * frontLerp; tag->axis[ 1 ][ i ] = start->axis[ 1 ][ i ] * backLerp + end->axis[ 1 ][ i ] * frontLerp; tag->axis[ 2 ][ i ] = start->axis[ 2 ][ i ] * backLerp + end->axis[ 2 ][ i ] * frontLerp; } VectorNormalize( tag->axis[ 0 ] ); VectorNormalize( tag->axis[ 1 ] ); VectorNormalize( tag->axis[ 2 ] ); return retval; }