void Matrix4_FromQuaternion( const quat_t q, mat4_t out ) { mat3_t m; Quat_ToMatrix3( q, m ); out[0 ] = m[0], out[1 ] = m[2], out[2 ] = m[6], out[3 ] = 0; out[4 ] = m[1], out[5 ] = m[4], out[6 ] = m[7], out[7 ] = 0; out[8 ] = m[2], out[9 ] = m[5], out[10] = m[8], out[11] = 0; out[12] = 0, out[13] = 0, out[14] = 0, out[15] = 1; }
/* * R_AliasModelLerpTag */ qboolean R_AliasModelLerpTag( orientation_t *orient, const maliasmodel_t *aliasmodel, int oldframenum, int framenum, float lerpfrac, const char *name ) { int i; quat_t quat; maliastag_t *tag, *oldtag; // find the appropriate tag for( i = 0; i < aliasmodel->numtags; i++ ) { if( !Q_stricmp( aliasmodel->tags[i].name, name ) ) break; } if( i == aliasmodel->numtags ) { //ri.Com_DPrintf ("R_AliasModelLerpTag: no such tag %s\n", name ); return qfalse; } // ignore invalid frames if( ( framenum >= aliasmodel->numframes ) || ( framenum < 0 ) ) { #ifndef PUBLIC_BUILD ri.Com_DPrintf( "R_AliasModelLerpTag %s: no such oldframe %i\n", name, framenum ); #endif framenum = 0; } if( ( oldframenum >= aliasmodel->numframes ) || ( oldframenum < 0 ) ) { #ifndef PUBLIC_BUILD ri.Com_DPrintf( "R_AliasModelLerpTag %s: no such oldframe %i\n", name, oldframenum ); #endif oldframenum = 0; } tag = aliasmodel->tags + framenum * aliasmodel->numtags + i; oldtag = aliasmodel->tags + oldframenum * aliasmodel->numtags + i; // interpolate axis and origin Quat_Lerp( oldtag->quat, tag->quat, lerpfrac, quat ); Quat_ToMatrix3( quat, orient->axis ); orient->origin[0] = oldtag->origin[0] + ( tag->origin[0] - oldtag->origin[0] ) * lerpfrac; orient->origin[1] = oldtag->origin[1] + ( tag->origin[1] - oldtag->origin[1] ) * lerpfrac; orient->origin[2] = oldtag->origin[2] + ( tag->origin[2] - oldtag->origin[2] ) * lerpfrac; return qtrue; }