// Filename:- matcomp.cpp // #include "stdafx.h" #include #include #include // #include "MatComp.h" #define MC_MASK_X ((1<<(MC_BITS_X))-1) #define MC_MASK_Y ((1<<(MC_BITS_Y))-1) #define MC_MASK_Z ((1<<(MC_BITS_Z))-1) #define MC_MASK_VECT ((1<<(MC_BITS_VECT))-1) #define MC_SCALE_VECT (1.0f/(float)((1<<(MC_BITS_VECT-1))-2)) #define MC_POS_X (0) #define MC_SHIFT_X (0) #define MC_POS_Y ((((MC_BITS_X))/8)) #define MC_SHIFT_Y ((((MC_BITS_X)%8))) #define MC_POS_Z ((((MC_BITS_X+MC_BITS_Y))/8)) #define MC_SHIFT_Z ((((MC_BITS_X+MC_BITS_Y)%8))) #define MC_POS_V11 ((((MC_BITS_X+MC_BITS_Y+MC_BITS_Z))/8)) #define MC_SHIFT_V11 ((((MC_BITS_X+MC_BITS_Y+MC_BITS_Z)%8))) #define MC_POS_V12 ((((MC_BITS_X+MC_BITS_Y+MC_BITS_Z+MC_BITS_VECT))/8)) #define MC_SHIFT_V12 ((((MC_BITS_X+MC_BITS_Y+MC_BITS_Z+MC_BITS_VECT)%8))) #define MC_POS_V13 ((((MC_BITS_X+MC_BITS_Y+MC_BITS_Z+MC_BITS_VECT*2))/8)) #define MC_SHIFT_V13 ((((MC_BITS_X+MC_BITS_Y+MC_BITS_Z+MC_BITS_VECT*2)%8))) #define MC_POS_V21 ((((MC_BITS_X+MC_BITS_Y+MC_BITS_Z+MC_BITS_VECT*3))/8)) #define MC_SHIFT_V21 ((((MC_BITS_X+MC_BITS_Y+MC_BITS_Z+MC_BITS_VECT*3)%8))) #define MC_POS_V22 ((((MC_BITS_X+MC_BITS_Y+MC_BITS_Z+MC_BITS_VECT*4))/8)) #define MC_SHIFT_V22 ((((MC_BITS_X+MC_BITS_Y+MC_BITS_Z+MC_BITS_VECT*4)%8))) #define MC_POS_V23 ((((MC_BITS_X+MC_BITS_Y+MC_BITS_Z+MC_BITS_VECT*5))/8)) #define MC_SHIFT_V23 ((((MC_BITS_X+MC_BITS_Y+MC_BITS_Z+MC_BITS_VECT*5)%8))) #define MC_POS_V31 ((((MC_BITS_X+MC_BITS_Y+MC_BITS_Z+MC_BITS_VECT*6))/8)) #define MC_SHIFT_V31 ((((MC_BITS_X+MC_BITS_Y+MC_BITS_Z+MC_BITS_VECT*6)%8))) #define MC_POS_V32 ((((MC_BITS_X+MC_BITS_Y+MC_BITS_Z+MC_BITS_VECT*7))/8)) #define MC_SHIFT_V32 ((((MC_BITS_X+MC_BITS_Y+MC_BITS_Z+MC_BITS_VECT*7)%8))) #define MC_POS_V33 ((((MC_BITS_X+MC_BITS_Y+MC_BITS_Z+MC_BITS_VECT*8))/8)) #define MC_SHIFT_V33 ((((MC_BITS_X+MC_BITS_Y+MC_BITS_Z+MC_BITS_VECT*8)%8))) void MC_Compress(const float mat[3][4],unsigned char * _comp) { char comp[MC_COMP_BYTES*2]; int i,val; for (i=0;i=(1<=(1<=(1<=(1<=(1<=(1<=(1<=(1<=(1<=(1<=(1<=(1< 1.0) a = 1; else a = w; // compute the sine angle sin_angle = sqrt( 1.0 - a * a ); // compute x, y, and z x = quaternionIndex[index].vec[0] * sin_angle * mult; y = quaternionIndex[index].vec[1] * sin_angle * mult; z = quaternionIndex[index].vec[2] * sin_angle * mult; fTx = 2.0f*x; fTy = 2.0f*y; fTz = 2.0f*z; fTwx = fTx*w; fTwy = fTy*w; fTwz = fTz*w; fTxx = fTx*x; fTxy = fTy*x; fTxz = fTz*x; fTyy = fTy*y; fTyz = fTz*y; fTzz = fTz*z; // rot... // mat[0][0] = 1.0f-(fTyy+fTzz); mat[0][1] = fTxy-fTwz; mat[0][2] = fTxz+fTwy; mat[1][0] = fTxy+fTwz; mat[1][1] = 1.0f-(fTxx+fTzz); mat[1][2] = fTyz-fTwx; mat[2][0] = fTxz-fTwy; mat[2][1] = fTyz+fTwx; mat[2][2] = 1.0f-(fTxx+fTyy); // xlat... // f = *pwIn++; // RTCDC f = f1; f/=64; f-=512; f1 = f; mat[0][3] = f; f = *pwIn++; // RTCDC f = f2; f/=64; f-=512; f2 = f; mat[1][3] = f; f = *pwIn++; // RTCDC f = f3; f/=64; f-=512; f3 = f; mat[2][3] = f; */ float w,x,y,z,f; float f1, f2, f3; const unsigned short *pwIn = (unsigned short *) comp; w = *pwIn++; w/=16383.0f; w-=2.0f; x = *pwIn++; x/=16383.0f; x-=2.0f; y = *pwIn++; y/=16383.0f; y-=2.0f; z = *pwIn++; z/=16383.0f; z-=2.0f; float fTx = 2.0f*x; float fTy = 2.0f*y; float fTz = 2.0f*z; float fTwx = fTx*w; float fTwy = fTy*w; float fTwz = fTz*w; float fTxx = fTx*x; float fTxy = fTy*x; float fTxz = fTz*x; float fTyy = fTy*y; float fTyz = fTz*y; float fTzz = fTz*z; // rot... // mat[0][0] = 1.0f-(fTyy+fTzz); mat[0][1] = fTxy-fTwz; mat[0][2] = fTxz+fTwy; mat[1][0] = fTxy+fTwz; mat[1][1] = 1.0f-(fTxx+fTzz); mat[1][2] = fTyz-fTwx; mat[2][0] = fTxz-fTwy; mat[2][1] = fTyz+fTwx; mat[2][2] = 1.0f-(fTxx+fTyy); // xlat... // f = *pwIn++; f/=64; f-=512; f1 = f; mat[0][3] = f; f = *pwIn++; f/=64; f-=512; f2 = f; mat[1][3] = f; f = *pwIn++; f/=64; f-=512; f3 = f; mat[2][3] = f; //OutputDebugString(va("%f %f %f %f, %f %f %f\n", x, y, z, w, f1, f2, f3)); } ////////////////// eof ////////////////