Esempio n. 1
0
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;
}
Esempio n. 2
0
//	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;
}