static void BuildStack() { // Get log data vector<CLog> vL; int nL = ReadLogs( vL, gArgs.zmin, gArgs.zmax ); if( gArgs.table ) Tabulate( vL, nL ); if( !nL ) return; // Make layer TForms vector<TAffine> vT( nL ); MakeTAffines( vT, vL ); // Calculate bounds DBox B; MakeBounds( B, vL, vT ); // Write WriteTrakEM2( "LowRes.xml", B, vL, vT ); }
//----------------------------------------------------------------------------- // Generates the PoseToBone Matrix nessecary to align the given bone with the // world. //----------------------------------------------------------------------------- static void ScreenAlignBone( matrix3x4_t *pPoseToWorld, mstudiobone_t *pCurBone, const Vector& vecViewOrigin, const matrix3x4_t &boneToWorld ) { // Grab the world translation: Vector vT( boneToWorld[0][3], boneToWorld[1][3], boneToWorld[2][3] ); // Construct the coordinate frame: // Initialized to get rid of compiler Vector vX, vY, vZ; if( pCurBone->flags & BONE_SCREEN_ALIGN_SPHERE ) { vX = vecViewOrigin - vT; VectorNormalize(vX); vZ = Vector(0,0,1); vY = vZ.Cross(vX); VectorNormalize(vY); vZ = vX.Cross(vY); VectorNormalize(vZ); } else { Assert( pCurBone->flags & BONE_SCREEN_ALIGN_CYLINDER ); vX.Init( boneToWorld[0][0], boneToWorld[1][0], boneToWorld[2][0] ); vZ = vecViewOrigin - vT; VectorNormalize(vZ); vY = vZ.Cross(vX); VectorNormalize(vY); vZ = vX.Cross(vY); VectorNormalize(vZ); } matrix3x4_t matBoneBillboard( vX.x, vY.x, vZ.x, vT.x, vX.y, vY.y, vZ.y, vT.y, vX.z, vY.z, vZ.z, vT.z ); ConcatTransforms( matBoneBillboard, pCurBone->poseToBone, *pPoseToWorld ); }