int R_LerpTag( orientation_t *tag, qhandle_t handle, int startFrame, int endFrame, float frac, const char *tagName ) { md3Tag_t *start, *end; #ifdef RAVENMD4 md3Tag_t start_space, end_space; #endif int i; float frontLerp, backLerp; model_t *model; model = R_GetModelByHandle( handle ); if ( !model->md3[0] ) { #ifdef RAVENMD4 if(model->type == MOD_MDR) { start = &start_space; end = &end_space; R_GetAnimTag((mdrHeader_t *) model->modelData, startFrame, tagName, start); R_GetAnimTag((mdrHeader_t *) model->modelData, endFrame, tagName, end); } else #endif if( model->type == MOD_IQM ) { return R_IQMLerpTag( tag, model->modelData, startFrame, endFrame, frac, tagName ); } else { AxisClear( tag->axis ); VectorClear( &tag->origin ); return qfalse; } } else { start = R_GetTag( model->md3[0], startFrame, tagName ); end = R_GetTag( model->md3[0], endFrame, tagName ); if ( !start || !end ) { AxisClear( tag->axis ); VectorClear( &tag->origin ); return qfalse; } } frontLerp = frac; backLerp = 1.0f - frac; for ( i = 0 ; i < 3 ; i++ ) { tag->origin.data[i] = start->origin.data[i] * backLerp + end->origin.data[i] * frontLerp; tag->axis[0].data[i] = start->axis[0].data[i] * backLerp + end->axis[0].data[i] * frontLerp; tag->axis[1].data[i] = start->axis[1].data[i] * backLerp + end->axis[1].data[i] * frontLerp; tag->axis[2].data[i] = start->axis[2].data[i] * backLerp + end->axis[2].data[i] * frontLerp; } VectorNormalize( &tag->axis[0] ); VectorNormalize( &tag->axis[1] ); VectorNormalize( &tag->axis[2] ); return qtrue; }
/* ================ R_LerpTag ================ */ int R_LerpTag( orientation_t *tag, qhandle_t handle, int startFrame, int endFrame, float frac, const char *tagName ) { md3Tag_t *start, *end; md3Tag_t start_space, end_space; int i; float frontLerp, backLerp; model_t *model; model = R_GetModelByHandle( handle ); if ( !model->md3[0] ) { if(model->type == MOD_MDR) { start = R_GetAnimTag((mdrHeader_t *) model->modelData, startFrame, tagName, &start_space); end = R_GetAnimTag((mdrHeader_t *) model->modelData, endFrame, tagName, &end_space); } else if( model->type == MOD_IQM ) { return R_IQMLerpTag( tag, (iqmData_t *)model->modelData, startFrame, endFrame, frac, tagName ); } else { start = end = NULL; } } else { start = R_GetTag( model->md3[0], startFrame, tagName ); end = R_GetTag( model->md3[0], endFrame, tagName ); } if ( !start || !end ) { AxisClear( tag->axis ); VectorClear( tag->origin ); return false; } frontLerp = frac; backLerp = 1.0f - frac; 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 true; }
/* ================ R_LerpTag ================ */ void R_LerpTag( orientation_t *tag, qhandle_t handle, int startFrame, int endFrame, float frac, const char *tagName ) { md3Tag_t *start, *finish; int i; float frontLerp, backLerp; model_t *model; model = R_GetModelByHandle( handle ); if ( model->md3[0] ) { start = R_GetTag( model->md3[0], startFrame, tagName ); finish = R_GetTag( model->md3[0], endFrame, tagName ); } else if ( model->md4 ) { md3Tag_t tstart, tfinish; start = &tstart; R_GetAnimTag( model->md4, startFrame, tagName, start ); finish = &tfinish; R_GetAnimTag( model->md4, endFrame, tagName, finish ); } else { AxisClear( tag->axis ); VectorClear( tag->origin ); return; } if ( !start || !finish ) { AxisClear( tag->axis ); VectorClear( tag->origin ); return; } frontLerp = frac; backLerp = 1.0 - frac; for ( i = 0 ; i < 3 ; i++ ) { tag->origin[i] = start->origin[i] * backLerp + finish->origin[i] * frontLerp; tag->axis[0][i] = start->axis[0][i] * backLerp + finish->axis[0][i] * frontLerp; tag->axis[1][i] = start->axis[1][i] * backLerp + finish->axis[1][i] * frontLerp; tag->axis[2][i] = start->axis[2][i] * backLerp + finish->axis[2][i] * frontLerp; } VectorNormalize( tag->axis[0] ); VectorNormalize( tag->axis[1] ); VectorNormalize( tag->axis[2] ); }