#include <assert.h>#include <string.h>#include <stdio.h>#include "vec3d.h"#include "QKFrame.h"#include "errorlog.h"#include "ram.h"Go to the source code of this file.
Compounds | |
| struct | geQKFrame_Linear |
| struct | geQKFrame_Slerp |
| struct | geQKFrame_Squad |
| struct | QKeyframe |
Defines | |
| #define | LINEAR_BLEND(a, b, t) ( (t)*((b)-(a)) + (a) ) |
| #define | QKFRAME_LINEAR_ASCII_FILE 0x4C464B51 |
| #define | QKFRAME_SLERP_ASCII_FILE 0x53464B51 |
| #define | QKFRAME_SQUAD_ASCII_FILE 0x51464B51 |
| #define | CHECK_FOR_WRITE(uu) if(uu <= 0) { geErrorLog_Add(ERR_PATH_FILE_WRITE, NULL); return GE_FALSE; } |
| #define | CHECK_FOR_READ(uu, nn) if(uu != nn) { geErrorLog_Add(ERR_PATH_FILE_READ, NULL); return GE_FALSE; } |
| #define | QKFRAME_KEYLIST_ID "Keys" |
| #define | QKFRAME_HINGE_COMPRESSION 0x1 |
| #define | QKFRAME_LINEARTIME_COMPRESSION 0x2 |
| #define | HINGE_TOLERANCE (0.0001f) |
| #define | LINEARTIME_TOLERANCE (0.0001f) |
| #define | ERROREXIT {geErrorLog_Add( ERR_PATH_FILE_READ, NULL);if (KeyList != NULL){geTKArray_Destroy(&KeyList);} return NULL;} |
| #define | LINE_LENGTH 256 |
| #define | WBERREXIT {geErrorLog_AddString( ERR_PATH_FILE_WRITE,"Failure to write binary key data", NULL);return GE_FALSE;} |
Functions | |
| geTKArray *GENESISCC | geQKFrame_LinearCreate () |
| geTKArray *GENESISCC | geQKFrame_SlerpCreate () |
| geTKArray *GENESISCC | geQKFrame_SquadCreate () |
| geBoolean GENESISCC | geQKFrame_Insert (geTKArray **KeyList, geTKArray_TimeType Time, const geQuaternion *Q, int *Index) |
| void GENESISCC | geQKFrame_Query (const geTKArray *KeyList, int Index, geTKArray_TimeType *Time, geQuaternion *Q) |
| void GENESISCC | geQKFrame_Modify (geTKArray *KeyList, int Index, const geQuaternion *Q) |
| void GENESISCC | geQKFrame_LinearInterpolation (const void *KF1, const void *KF2, geFloat T, void *Result) |
| void GENESISCC | geQKFrame_SlerpInterpolation (const void *KF1, const void *KF2, geFloat T, void *Result) |
| void GENESISCC | geQKFrame_SquadInterpolation (const void *KF1, const void *KF2, geFloat T, void *Result) |
| void GENESISCC | geQKFrame_QuadrangleCorner (const geQuaternion *Q0, const geQuaternion *Q1, const geQuaternion *Q2, geQuaternion *Corner) |
| void GENESISCC | geQKFrame_ChooseBestQuat (const geQuaternion *Q0, geQuaternion *Q1) |
| void GENESISCC | geQKFrame_SquadRecompute (int Looped, geTKArray *KeyList) |
| void GENESISCC | geQKFrame_SlerpRecompute (geTKArray *KeyList) |
| geBoolean GENESISCC | geQKFrame_LinearRead (geVFile *pFile, void *geQKFrame) |
| geBoolean GENESISCC | geQKFrame_SlerpRead (geVFile *pFile, void *geQKFrame) |
| geBoolean GENESISCC | geQKFrame_SquadRead (geVFile *pFile, void *geQKFrame) |
| geBoolean GENESISCC | geQKFrame_PathIsHinged (geTKArray *KeyList, geFloat Tolerance) |
| int GENESISCC | geQKFrame_DetermineCompressionType (geTKArray *KeyList) |
| geBoolean GENESISCC | geQKFrame_WriteToFile (geVFile *pFile, geTKArray *KeyList, geQKFrame_InterpolationType InterpolationType, int Looping) |
| geTKArray *GENESISCC | geQKFrame_CreateFromFile (geVFile *pFile, int *InterpolationType, int *Looping) |
| uint32 GENESISCC | geQKFrame_ComputeBlockSize (geTKArray *KeyList, int Compression) |
| geTKArray *GENESISCC | geQKFrame_CreateFromBinaryFile (geVFile *pFile, int *InterpolationType, int *Looping) |
| geBoolean GENESISCC | geQKFrame_WriteToBinaryFile (geVFile *pFile, geTKArray *KeyList, geQKFrame_InterpolationType InterpolationType, int Looping) |
|
|
Definition at line 490 of file QKFrame.c. Referenced by geQKFrame_LinearRead(), geQKFrame_SlerpRead(), geQKFrame_SquadRead(), geVKFrame_HermiteRead(), and geVKFrame_LinearRead(). |
|
|
|
|
|
|
|
|
Definition at line 618 of file QKFrame.c. Referenced by geQKFrame_DetermineCompressionType(). |
|
|
|
|
|
|
|
|
Definition at line 619 of file QKFrame.c. Referenced by geQKFrame_DetermineCompressionType(), geVKFrame_WriteToBinaryFile(), and geVKFrame_WriteToFile(). |
|
|
Definition at line 614 of file QKFrame.c. Referenced by geQKFrame_ComputeBlockSize(), geQKFrame_CreateFromBinaryFile(), geQKFrame_CreateFromFile(), geQKFrame_DetermineCompressionType(), geQKFrame_WriteToBinaryFile(), and geQKFrame_WriteToFile(). |
|
|
Definition at line 492 of file QKFrame.c. Referenced by geQKFrame_CreateFromFile(), and geQKFrame_WriteToFile(). |
|
|
Definition at line 486 of file QKFrame.c. Referenced by geQKFrame_LinearRead(). |
|
|
Definition at line 615 of file QKFrame.c. Referenced by geQKFrame_ComputeBlockSize(), geQKFrame_CreateFromBinaryFile(), geQKFrame_CreateFromFile(), geQKFrame_DetermineCompressionType(), geQKFrame_WriteToBinaryFile(), and geQKFrame_WriteToFile(). |
|
|
Definition at line 487 of file QKFrame.c. Referenced by geQKFrame_SlerpRead(). |
|
|
Definition at line 488 of file QKFrame.c. Referenced by geQKFrame_SquadRead(). |
|
|
|
|
||||||||||||
|
Definition at line 337 of file QKFrame.c. References geFloat, GENESISCC, geQuaternion_Add(), geQuaternion_Multiply(), geQuaternion_Subtract(), NULL, geQuaternion::W, geQuaternion::X, geQuaternion::Y, and geQuaternion::Z. Referenced by geQKFrame_SlerpRecompute(), and geQKFrame_SquadRecompute().
00338 : to either Q1 or -Q1 00339 // adjusts Q1 such that Q1 is the 'closest' of the two choices to Q0. 00340 { 00341 geQuaternion pLessQ,pPlusQ; 00342 geFloat MagpLessQ,MagpPlusQ; 00343 00344 assert( Q0 != NULL ); 00345 assert( Q1 != NULL ); 00346 00347 geQuaternion_Add(Q0,Q1,&pPlusQ); 00348 geQuaternion_Subtract(Q0,Q1,&pLessQ); 00349 00350 geQuaternion_Multiply(&pPlusQ,&pPlusQ,&pPlusQ); 00351 geQuaternion_Multiply(&pLessQ,&pLessQ,&pLessQ); 00352 00353 MagpLessQ= (pLessQ.W * pLessQ.W) + (pLessQ.X * pLessQ.X) 00354 + (pLessQ.Y * pLessQ.Y) + (pLessQ.Z * pLessQ.Z); 00355 00356 MagpPlusQ= (pPlusQ.W * pPlusQ.W) + (pPlusQ.X * pPlusQ.X) 00357 + (pPlusQ.Y * pPlusQ.Y) + (pPlusQ.Z * pPlusQ.Z); 00358 00359 if (MagpLessQ >= MagpPlusQ) 00360 { 00361 Q1->X = -Q1->X; 00362 Q1->Y = -Q1->Y; 00363 Q1->Z = -Q1->Z; 00364 Q1->W = -Q1->W; 00365 } 00366 } |
|
||||||||||||
|
Definition at line 929 of file QKFrame.c. References geFloat, GENESISCC, geTKArray_NumElements(), NULL, QKFRAME_HINGE_COMPRESSION, QKFRAME_LINEARTIME_COMPRESSION, and uint32. Referenced by geQKFrame_WriteToBinaryFile().
00930 {
00931 uint32 Size=0;
00932 int Count;
00933 assert( KeyList != NULL );
00934 assert( Compression < 0xFF);
00935
00936 Count = geTKArray_NumElements(KeyList);
00937
00938 Size += sizeof(uint32); // flags
00939 Size += sizeof(uint32); // count
00940
00941 if (Compression & QKFRAME_LINEARTIME_COMPRESSION)
00942 {
00943 Size += sizeof(geFloat) * 2;
00944 }
00945 else
00946 {
00947 Size += sizeof(geFloat) * Count;
00948 }
00949
00950 switch (Compression & (~QKFRAME_LINEARTIME_COMPRESSION) )
00951 {
00952 case 0:
00953 Size += sizeof(geQuaternion) * Count;
00954 break;
00955 case QKFRAME_HINGE_COMPRESSION:
00956 Size += (sizeof(geFloat) * 3) + sizeof(geFloat) * Count;
00957 break;
00958 default:
00959 assert(0);
00960 }
00961 return Size;
00962 }
|
|
||||||||||||||||
|
Definition at line 964 of file QKFrame.c. References GE_FALSE, geErrorLog_AddString, geFloat, GENESISCC, geQKFrame_SlerpRecompute(), geQKFrame_SquadRecompute(), geQuaternion_SetFromAxisAngle(), geRam_Allocate, geRam_Free, geTKArray_CreateEmpty(), geTKArray_Element(), geVFile_Read(), geQKFrame_Linear::Key, NULL, QKeyframe::Q, QKFRAME_HINGE_COMPRESSION, QKFRAME_LINEAR, QKFRAME_LINEARTIME_COMPRESSION, QKFRAME_SLERP, QKFRAME_SQUAD, QKeyframe::Time, uint32, geVec3d::X, geVec3d::Y, and geVec3d::Z. Referenced by gePath_CreateFromBinaryFile().
00965 {
00966 uint32 u;
00967 int BlockSize;
00968 int Compression;
00969 int Count,i;
00970 int FieldSize;
00971 char *Block;
00972 geFloat *Data;
00973 geTKArray *KeyList;
00974 geQKFrame_Linear* pLinear0;
00975 geQKFrame_Linear* pLinear;
00976
00977 assert( pFile != NULL );
00978 assert( InterpolationType != NULL );
00979 assert( Looping != NULL );
00980
00981 if (geVFile_Read(pFile, &BlockSize, sizeof(int)) == GE_FALSE)
00982 {
00983 geErrorLog_AddString(-1,"Failure to read binary QKFrame header", NULL);
00984 return NULL;
00985 }
00986 if (BlockSize<0)
00987 {
00988 geErrorLog_AddString(-1,"Bad Blocksize", NULL);
00989 return NULL;
00990 }
00991
00992 Block = geRam_Allocate(BlockSize);
00993 if(geVFile_Read(pFile, Block, BlockSize) == GE_FALSE)
00994 {
00995 geErrorLog_AddString(-1,"Failure to read binary QKFrame header", NULL);
00996 return NULL;
00997 }
00998 u = *(uint32 *)Block;
00999 *InterpolationType = (u>>16)& 0xFF;
01000 Compression = (u>>8) & 0xFF;
01001 *Looping = (u & 0x1);
01002 Count = *(((uint32 *)Block)+1);
01003
01004 if (Compression > 0xFF)
01005 {
01006 geRam_Free(Block);
01007 geErrorLog_AddString(-1,"Bad Compression Flag", NULL);
01008 return NULL;
01009 }
01010 switch (*InterpolationType)
01011 {
01012 case (QKFRAME_LINEAR):
01013 FieldSize = sizeof(geQKFrame_Linear);
01014 break;
01015 case (QKFRAME_SLERP):
01016 FieldSize = sizeof(geQKFrame_Slerp);
01017 break;
01018 case (QKFRAME_SQUAD):
01019 FieldSize = sizeof(geQKFrame_Squad);
01020 break;
01021 default:
01022 geRam_Free(Block);
01023 geErrorLog_AddString(-1,"Bad InterpolationType", NULL);
01024 return NULL;
01025 }
01026
01027 KeyList = geTKArray_CreateEmpty(FieldSize,Count);
01028 if (KeyList == NULL)
01029 {
01030 geRam_Free(Block);
01031 geErrorLog_AddString(-1,"Failed to allocate tkarray", NULL);
01032 return NULL;
01033 }
01034
01035 Data = (geFloat *)(Block + sizeof(uint32)*2);
01036
01037 pLinear0 = (geQKFrame_Linear*)geTKArray_Element(KeyList, 0);
01038
01039 pLinear = pLinear0;
01040
01041 if (Compression & QKFRAME_LINEARTIME_COMPRESSION)
01042 {
01043 geFloat fi;
01044 geFloat fCount = (geFloat)Count;
01045 geFloat Time,DeltaTime;
01046 Time = *(Data++);
01047 DeltaTime = *(Data++);
01048 for(fi=0.0f;fi<fCount;fi+=1.0f)
01049 {
01050 pLinear->Key.Time = Time + fi*DeltaTime;
01051 pLinear = (geQKFrame_Linear *) ( ((char *)pLinear) + FieldSize );
01052 }
01053 }
01054 else
01055 {
01056 for(i=0;i<Count;i++)
01057 {
01058 pLinear->Key.Time = *(Data++);
01059 pLinear = (geQKFrame_Linear *) ( ((char *)pLinear) + FieldSize );
01060 }
01061 }
01062
01063 pLinear = pLinear0;
01064
01065 if (Compression & QKFRAME_HINGE_COMPRESSION)
01066 {
01067 geVec3d Hinge;
01068 Hinge.X = *(Data++);
01069 Hinge.Y = *(Data++);
01070 Hinge.Z = *(Data++);
01071
01072 for(i=0;i<Count;i++)
01073 {
01074 geQuaternion_SetFromAxisAngle(&(pLinear->Key.Q),&Hinge,*(Data++));
01075 pLinear = (geQKFrame_Linear *) ( ((char *)pLinear) + FieldSize );
01076 }
01077 }
01078 else
01079 {
01080 for(i=0;i<Count;i++)
01081 {
01082 pLinear->Key.Q = *(geQuaternion *)Data;
01083 Data += 4;
01084 pLinear = (geQKFrame_Linear *) ( ((char *)pLinear) + FieldSize );
01085 }
01086 }
01087
01088 switch (*InterpolationType)
01089 {
01090 case (QKFRAME_LINEAR):
01091 break;
01092 case (QKFRAME_SLERP):
01093 geQKFrame_SlerpRecompute( KeyList);
01094 break;
01095 case (QKFRAME_SQUAD):
01096 geQKFrame_SquadRecompute( *Looping, KeyList);
01097 break;
01098 default:
01099 assert(0);
01100 }
01101 geRam_Free(Block);
01102 return KeyList;
01103 }
|
|
||||||||||||||||
|
Definition at line 794 of file QKFrame.c. References GE_FALSE, geFloat, GENESISCC, geQKFrame_SlerpRecompute(), geQKFrame_SquadRecompute(), geQuaternion_SetFromAxisAngle(), geTKArray_CreateEmpty(), geTKArray_Element(), geVFile_GetS(), geQKFrame_Linear::Key, NULL, QKeyframe::Q, QKFRAME_HINGE_COMPRESSION, QKFRAME_KEYLIST_ID, QKFRAME_LINEAR, QKFRAME_LINEARTIME_COMPRESSION, QKFRAME_SLERP, QKFRAME_SQUAD, QKeyframe::Time, geQuaternion::W, geVec3d::X, geQuaternion::X, geVec3d::Y, geQuaternion::Y, geVec3d::Z, and geQuaternion::Z.
00795 {
00796 int i,u,NumElements;
00797 int Compression;
00798 geFloat StartTime=0.0f;
00799 geFloat DeltaTime=0.0f;
00800
00801 #define ERROREXIT {geErrorLog_Add( ERR_PATH_FILE_READ, NULL);if (KeyList != NULL){geTKArray_Destroy(&KeyList);} return NULL;}
00802
00803 #define LINE_LENGTH 256
00804 char line[LINE_LENGTH];
00805 geTKArray *KeyList=NULL;
00806
00807 assert( pFile != NULL );
00808 assert( InterpolationType != NULL );
00809
00810 if(geVFile_GetS(pFile, line, LINE_LENGTH) == GE_FALSE)
00811 ERROREXIT;
00812 if(strnicmp(line, QKFRAME_KEYLIST_ID, sizeof(QKFRAME_KEYLIST_ID)-1) != 0)
00813 ERROREXIT;
00814
00815 if(sscanf(line + sizeof(QKFRAME_KEYLIST_ID)-1, "%d %d %d %d",
00816 &NumElements,InterpolationType,&Compression,Looping) != 4)
00817 ERROREXIT;
00818
00819 if (!( (*InterpolationType == QKFRAME_LINEAR) || (*InterpolationType == QKFRAME_SLERP) || (*InterpolationType == QKFRAME_SQUAD) ))
00820 ERROREXIT;
00821
00822 if ( Compression > 0xFF)
00823 ERROREXIT;
00824
00825
00826
00827 switch (*InterpolationType)
00828 {
00829 case (QKFRAME_LINEAR):
00830 KeyList = geTKArray_CreateEmpty(sizeof(geQKFrame_Linear),NumElements);
00831 break;
00832 case (QKFRAME_SLERP):
00833 KeyList = geTKArray_CreateEmpty(sizeof(geQKFrame_Slerp),NumElements);
00834 break;
00835 case (QKFRAME_SQUAD):
00836 KeyList = geTKArray_CreateEmpty(sizeof(geQKFrame_Squad),NumElements);
00837 break;
00838 default:
00839 ERROREXIT;
00840 }
00841 if (KeyList == NULL)
00842 ERROREXIT;
00843
00844 if (Compression & QKFRAME_LINEARTIME_COMPRESSION)
00845 {
00846 if(geVFile_GetS(pFile, line, LINE_LENGTH) == GE_FALSE)
00847 ERROREXIT;
00848 if (sscanf(line,"%f %f",&StartTime,&DeltaTime) != 2)
00849 ERROREXIT;
00850 }
00851 switch (Compression & (~QKFRAME_LINEARTIME_COMPRESSION) )
00852 {
00853 case (0):
00854 {
00855 for(i=0;i<NumElements;i++)
00856 {
00857 geQKFrame_Linear* pLinear = (geQKFrame_Linear*)geTKArray_Element(KeyList, i);
00858 if(geVFile_GetS(pFile, line, LINE_LENGTH) == GE_FALSE)
00859 ERROREXIT;
00860 if (Compression & QKFRAME_LINEARTIME_COMPRESSION)
00861 {
00862 pLinear->Key.Time = StartTime + DeltaTime * i;
00863 u = sscanf(line,"%f %f %f %f", &(pLinear->Key.Q.W),
00864 &(pLinear->Key.Q.X),&(pLinear->Key.Q.Y),&(pLinear->Key.Q.Z));
00865 if (u==4) u = 5;
00866 }
00867 else
00868 {
00869 u = sscanf(line,"%f %f %f %f %f",&(pLinear->Key.Time), &(pLinear->Key.Q.W),
00870 &(pLinear->Key.Q.X),&(pLinear->Key.Q.Y),&(pLinear->Key.Q.Z));
00871 }
00872 if (u!=5)
00873 ERROREXIT;
00874 }
00875 }
00876 break;
00877 case (QKFRAME_HINGE_COMPRESSION):
00878 {
00879 geVec3d Hinge;
00880 geFloat Angle;
00881 if(geVFile_GetS(pFile, line, LINE_LENGTH) == GE_FALSE)
00882 ERROREXIT;
00883 u = sscanf(line,"%f %f %f",&(Hinge.X),&(Hinge.Y),&(Hinge.Z) );
00884 if (u != 3)
00885 ERROREXIT;
00886 for(i=0;i<NumElements;i++)
00887 {
00888 geQKFrame_Linear* pLinear = (geQKFrame_Linear*)geTKArray_Element(KeyList, i);
00889 if(geVFile_GetS(pFile, line, LINE_LENGTH) == GE_FALSE)
00890 ERROREXIT;
00891 if (Compression & QKFRAME_LINEARTIME_COMPRESSION)
00892 {
00893 pLinear->Key.Time = StartTime + DeltaTime * i;
00894 u = sscanf(line,"%f", &(Angle));
00895 if (u==1) u = 2;
00896 }
00897 else
00898 {
00899 u = sscanf(line,"%f %f",&(pLinear->Key.Time), &(Angle) );
00900 }
00901 if (u!=2)
00902 ERROREXIT;
00903 geQuaternion_SetFromAxisAngle(&(pLinear->Key.Q),&Hinge,Angle);
00904 }
00905 }
00906 break;
00907 default:
00908 assert(0);
00909
00910 }
00911
00912 switch (*InterpolationType)
00913 {
00914 case (QKFRAME_LINEAR):
00915 break;
00916 case (QKFRAME_SLERP):
00917 geQKFrame_SlerpRecompute( KeyList);
00918 break;
00919 case (QKFRAME_SQUAD):
00920 geQKFrame_SquadRecompute( *Looping, KeyList);
00921 break;
00922 default:
00923 assert(0);
00924 }
00925 return KeyList;
00926
00927 }
|
|
|
Definition at line 658 of file QKFrame.c. References GE_FALSE, GENESISCC, geQKFrame_PathIsHinged(), geTKArray_NumElements(), geTKArray_SamplesAreTimeLinear(), HINGE_TOLERANCE, LINEARTIME_TOLERANCE, NULL, QKFRAME_HINGE_COMPRESSION, and QKFRAME_LINEARTIME_COMPRESSION. Referenced by geQKFrame_WriteToBinaryFile(), and geQKFrame_WriteToFile().
00659 {
00660 int Compression=0;
00661 int NumElements=0;
00662
00663 assert( KeyList != NULL );
00664
00665 NumElements = geTKArray_NumElements(KeyList);
00666
00667 if (NumElements>2)
00668 {
00669 if ( geTKArray_SamplesAreTimeLinear(KeyList,LINEARTIME_TOLERANCE) != GE_FALSE )
00670 {
00671 Compression |= QKFRAME_LINEARTIME_COMPRESSION;
00672 }
00673 }
00674
00675
00676 if (NumElements>3)
00677 {
00678 if ( geQKFrame_PathIsHinged(KeyList,HINGE_TOLERANCE)!=GE_FALSE )
00679 {
00680 Compression |= QKFRAME_HINGE_COMPRESSION;
00681 }
00682 }
00683
00684 return Compression;
00685 }
|
|
||||||||||||||||||||
|
Definition at line 106 of file QKFrame.c. References ERR_QKARRAY_INSERT, GE_FALSE, GE_TRUE, geBoolean, geErrorLog_Add, GENESISCC, geTKArray_Element(), geTKArray_ElementSize(), geTKArray_Insert(), NULL, and QKeyframe::Q. Referenced by gePath_CreateCopy(), and gePath_InsertKeyframe().
00112 {
00113 assert( KeyList != NULL );
00114 assert( *KeyList != NULL );
00115 assert( Q != NULL );
00116 assert( sizeof(geQKFrame_Squad) == geTKArray_ElementSize(*KeyList)
00117 || sizeof(geQKFrame_Slerp) == geTKArray_ElementSize(*KeyList)
00118 || sizeof(geQKFrame_Linear) == geTKArray_ElementSize(*KeyList) );
00119
00120 if (geTKArray_Insert(KeyList, Time, Index) == GE_FALSE)
00121 {
00122 geErrorLog_Add(ERR_QKARRAY_INSERT, NULL);
00123 return GE_FALSE;
00124 }
00125 else
00126 {
00127 QKeyframe *KF;
00128 KF = (QKeyframe *)geTKArray_Element(*KeyList,*Index);
00129 KF->Q = *Q;
00130 return GE_TRUE;
00131 }
00132 }
|
|
|
Definition at line 86 of file QKFrame.c. References GENESISCC, and geTKArray_Create(). Referenced by gePath_ReadChannel_F0_(), and gePath_SetupRotationKeyList().
00088 {
00089 return geTKArray_Create(sizeof(geQKFrame_Linear) );
00090 }
|
|
||||||||||||||||||||
|
Definition at line 176 of file QKFrame.c. References geFloat, GENESISCC, geQuaternion_Normalize(), geQuaternion_SetNoRotation(), LINEAR_BLEND, NULL, geQuaternion::W, geQuaternion::X, geQuaternion::Y, and geQuaternion::Z.
00185 {
00186 geQuaternion *Q1,*Q2;
00187 geQuaternion *QNew = (geQuaternion *)Result;
00188
00189 assert( Result != NULL );
00190 assert( KF1 != NULL );
00191 assert( KF2 != NULL );
00192
00193 assert( T >= (geFloat)0.0f );
00194 assert( T <= (geFloat)1.0f );
00195
00196 if ( KF1 == KF2 )
00197 {
00198 *QNew = ((geQKFrame_Linear *)KF1)->Key.Q;
00199 return;
00200 }
00201
00202 Q1 = &( ((geQKFrame_Linear *)KF1)->Key.Q);
00203 Q2 = &( ((geQKFrame_Linear *)KF2)->Key.Q);
00204
00205 QNew->X = LINEAR_BLEND(Q1->X,Q2->X,T);
00206 QNew->Y = LINEAR_BLEND(Q1->Y,Q2->Y,T);
00207 QNew->Z = LINEAR_BLEND(Q1->Z,Q2->Z,T);
00208 QNew->W = LINEAR_BLEND(Q1->W,Q2->W,T);
00209 if (geQuaternion_Normalize(QNew)==0.0f)
00210 {
00211 geQuaternion_SetNoRotation(QNew);
00212 }
00213
00214 }
|
|
||||||||||||
|
Definition at line 497 of file QKFrame.c. References CHECK_FOR_READ, ERR_PATH_FILE_READ, ERR_PATH_FILE_VERSION, GE_FALSE, GE_TRUE, geBoolean, geErrorLog_Add, GENESISCC, geVFile_GetS(), geVFile_Read(), geQKFrame_Linear::Key, NULL, QKeyframe::Q, QKFRAME_LINEAR_ASCII_FILE, uint32, geQuaternion::W, geQuaternion::X, geQuaternion::Y, and geQuaternion::Z. Referenced by gePath_ReadChannel_F0_().
00498 {
00499 uint32 u;
00500 char QKeyString[64];
00501 geQKFrame_Linear* pLinear = (geQKFrame_Linear*)geQKFrame;
00502
00503 assert( pFile != NULL );
00504 assert( geQKFrame != NULL );
00505
00506 // Read the format/version flag
00507 if(geVFile_Read(pFile, &u, sizeof(u)) == GE_FALSE)
00508 {
00509 geErrorLog_Add(ERR_PATH_FILE_READ, NULL);
00510 return GE_FALSE;
00511 }
00512
00513 if(u != QKFRAME_LINEAR_ASCII_FILE)
00514 {
00515 geErrorLog_Add(ERR_PATH_FILE_VERSION, NULL);
00516 return GE_FALSE;
00517 }
00518
00519 if (geVFile_GetS(pFile, QKeyString, sizeof(QKeyString)) == GE_FALSE)
00520 {
00521 geErrorLog_Add(ERR_PATH_FILE_READ, NULL);
00522 return GE_FALSE;
00523 }
00524
00525 u = sscanf(QKeyString, "%f %f %f %f\n", &pLinear->Key.Q.W,
00526 &pLinear->Key.Q.X,
00527 &pLinear->Key.Q.Y,
00528 &pLinear->Key.Q.Z);
00529 CHECK_FOR_READ(u, 4);
00530
00531 return GE_TRUE;
00532 }
|
|
||||||||||||||||
|
Definition at line 156 of file QKFrame.c. References GENESISCC, geTKArray_Element(), geTKArray_ElementSize(), geTKArray_NumElements(), NULL, and QKeyframe::Q. Referenced by gePath_ModifyKeyframe().
00160 {
00161 QKeyframe *KF;
00162 assert( KeyList != NULL );
00163 assert( Q != NULL );
00164 assert( Index < geTKArray_NumElements(KeyList) );
00165 assert( Index >= 0 );
00166 assert( sizeof(geQKFrame_Squad) == geTKArray_ElementSize(KeyList)
00167 || sizeof(geQKFrame_Slerp) == geTKArray_ElementSize(KeyList)
00168 || sizeof(geQKFrame_Linear) == geTKArray_ElementSize(KeyList) );
00169
00170 KF = (QKeyframe *)geTKArray_Element(KeyList,Index);
00171 KF->Q = *Q;
00172 }
|
|
||||||||||||
|
Definition at line 621 of file QKFrame.c. References GE_FALSE, GE_TRUE, geBoolean, geFloat, GENESISCC, geQuaternion_GetAxisAngle(), geTKArray_Element(), geTKArray_NumElements(), geVec3d_Compare(), geQKFrame_Linear::Key, NULL, and QKeyframe::Q. Referenced by geQKFrame_DetermineCompressionType().
00622 {
00623 int i,Count;
00624 geVec3d Axis;
00625 geVec3d NextAxis;
00626 geFloat Angle;
00627 geQKFrame_Linear* pLinear;
00628
00629 assert( KeyList != NULL );
00630
00631 Count = geTKArray_NumElements(KeyList);
00632
00633 if (Count<2)
00634 return GE_FALSE;
00635 pLinear = (geQKFrame_Linear*)geTKArray_Element(KeyList, 0);
00636 if (geQuaternion_GetAxisAngle(&(pLinear->Key.Q),&Axis,&Angle)==GE_FALSE)
00637 {
00638 return GE_FALSE;
00639 }
00640
00641 for (i=1; i<Count; i++)
00642 {
00643 pLinear = (geQKFrame_Linear*)geTKArray_Element(KeyList, i);
00644 if (geQuaternion_GetAxisAngle(&(pLinear->Key.Q),&NextAxis,&Angle)==GE_FALSE)
00645 {
00646 return GE_FALSE;
00647 }
00648
00649 if (geVec3d_Compare(&Axis,&NextAxis,Tolerance) == GE_FALSE)
00650 {
00651 return GE_FALSE;
00652 }
00653 }
00654 return GE_TRUE;
00655 }
|
|
||||||||||||||||||||
|
Definition at line 298 of file QKFrame.c. References GE_TRUE, GENESISCC, geQuaternion_Add(), geQuaternion_Exp(), geQuaternion_IsUnit(), geQuaternion_Ln(), geQuaternion_Multiply(), geQuaternion_Scale(), NULL, geQuaternion::W, geQuaternion::X, geQuaternion::Y, and geQuaternion::Z. Referenced by geQKFrame_SquadRecompute().
00306 {
00307 geQuaternion Q1Inv,LnSum;
00308
00309 assert( Q0 != NULL );
00310 assert( Q1 != NULL );
00311 assert( Q2 != NULL );
00312 assert( Corner != NULL );
00313
00314 assert( geQuaternion_IsUnit(Q1) == GE_TRUE );
00315
00316 Q1Inv.W = Q1->W;
00317 Q1Inv.X = -Q1->X;
00318 Q1Inv.Y = -Q1->Y;
00319 Q1Inv.Z = -Q1->Z;
00320
00321 {
00322 geQuaternion Q1InvQ2, Q1InvQ0;
00323 geQuaternion Ln1,Ln2;
00324
00325 geQuaternion_Multiply(&Q1Inv,Q2,&Q1InvQ2);
00326 geQuaternion_Multiply(&Q1Inv,Q0,&Q1InvQ0);
00327 geQuaternion_Ln(&Q1InvQ0,&Ln1);
00328 geQuaternion_Ln(&Q1InvQ2,&Ln2);
00329 geQuaternion_Add(&Ln1,&Ln2,&LnSum);
00330 geQuaternion_Scale(&LnSum,-0.25f,&LnSum);
00331 }
00332
00333 geQuaternion_Exp(&LnSum,Corner);
00334 geQuaternion_Multiply(Q1,Corner,Corner);
00335 }
|
|
||||||||||||||||||||
|
Definition at line 134 of file QKFrame.c. References GENESISCC, geTKArray_Element(), geTKArray_ElementSize(), geTKArray_NumElements(), NULL, QKeyframe::Q, and QKeyframe::Time. Referenced by gePath_CreateCopy(), and gePath_GetKeyframe().
00140 {
00141 QKeyframe *KF;
00142 assert( KeyList != NULL );
00143 assert( Time != NULL );
00144 assert( Q != NULL );
00145 assert( Index < geTKArray_NumElements(KeyList) );
00146 assert( Index >= 0 );
00147 assert( sizeof(geQKFrame_Squad) == geTKArray_ElementSize(KeyList)
00148 || sizeof(geQKFrame_Slerp) == geTKArray_ElementSize(KeyList)
00149 || sizeof(geQKFrame_Linear) == geTKArray_ElementSize(KeyList) );
00150
00151 KF = (QKeyframe *)geTKArray_Element(KeyList,Index);
00152 *Time = KF->Time;
00153 *Q = KF->Q;
00154 }
|
|
|
Definition at line 93 of file QKFrame.c. References GENESISCC, and geTKArray_Create(). Referenced by gePath_ReadChannel_F0_(), and gePath_SetupRotationKeyList().
00095 {
00096 return geTKArray_Create(sizeof(geQKFrame_Slerp) );
00097 }
|
|
||||||||||||||||||||
|
Definition at line 218 of file QKFrame.c. References geFloat, GENESISCC, geQuaternion_SlerpNotShortest(), and NULL.
00227 {
00228 geQuaternion *Q1,*Q2;
00229 geQuaternion *QNew = (geQuaternion *)Result;
00230
00231 assert( Result != NULL );
00232 assert( KF1 != NULL );
00233 assert( KF2 != NULL );
00234
00235 assert( T >= (geFloat)0.0f );
00236 assert( T <= (geFloat)1.0f );
00237
00238 if ( KF1 == KF2 )
00239 {
00240 *QNew = ((geQKFrame_Slerp *)KF1)->Key.Q;
00241 return;
00242 }
00243
00244 Q1 = &( ((geQKFrame_Slerp *)KF1)->Key.Q);
00245 Q2 = &( ((geQKFrame_Slerp *)KF2)->Key.Q);
00246 geQuaternion_SlerpNotShortest(Q1,Q2,T,QNew);
00247 }
|
|
||||||||||||
|
Definition at line 534 of file QKFrame.c. References CHECK_FOR_READ, ERR_PATH_FILE_READ, ERR_PATH_FILE_VERSION, GE_FALSE, GE_TRUE, geBoolean, geErrorLog_Add, GENESISCC, geVFile_GetS(), geVFile_Read(), geQKFrame_Slerp::Key, NULL, QKeyframe::Q, QKFRAME_SLERP_ASCII_FILE, uint32, geQuaternion::W, geQuaternion::X, geQuaternion::Y, and geQuaternion::Z. Referenced by gePath_ReadChannel_F0_().
00535 {
00536 uint32 u;
00537 char QKeyString[64];
00538 geQKFrame_Slerp* pSlerp = (geQKFrame_Slerp*)geQKFrame;
00539
00540 assert( pFile != NULL );
00541 assert( geQKFrame != NULL );
00542
00543 // Read the format/version flag
00544 if(geVFile_Read(pFile, &u, sizeof(u)) == GE_FALSE)
00545 {
00546 geErrorLog_Add(ERR_PATH_FILE_READ, NULL);
00547 return GE_FALSE;
00548 }
00549
00550 if(u != QKFRAME_SLERP_ASCII_FILE)
00551 {
00552 geErrorLog_Add(ERR_PATH_FILE_VERSION, NULL);
00553 return GE_FALSE;
00554 }
00555
00556 if (geVFile_GetS(pFile, QKeyString, sizeof(QKeyString)) == GE_FALSE)
00557 {
00558 geErrorLog_Add(ERR_PATH_FILE_READ, NULL);
00559 return GE_FALSE;
00560 }
00561
00562 u = sscanf(QKeyString, "%f %f %f %f\n", &pSlerp->Key.Q.W,
00563 &pSlerp->Key.Q.X,
00564 &pSlerp->Key.Q.Y,
00565 &pSlerp->Key.Q.Z);
00566 CHECK_FOR_READ(u, 4);
00567
00568 return GE_TRUE;
00569 }
|
|
|
Definition at line 461 of file QKFrame.c. References count, GENESISCC, geQKFrame_ChooseBestQuat(), geTKArray_Element(), geTKArray_NumElements(), geQKFrame_Slerp::Key, NULL, and QKeyframe::Q. Referenced by gePath_Recompute(), geQKFrame_CreateFromBinaryFile(), and geQKFrame_CreateFromFile().
00466 {
00467
00468 int i;
00469 geQKFrame_Slerp *QList;
00470 int count;
00471 assert( KeyList != NULL );
00472
00473 count = geTKArray_NumElements(KeyList);
00474
00475 if (count > 0)
00476 {
00477 QList = (geQKFrame_Slerp *)geTKArray_Element(KeyList,0);
00478 for (i =0; i< count-1; i++)
00479 {
00480 geQKFrame_ChooseBestQuat(&(QList[i].Key.Q),&(QList[i+1].Key.Q) );
00481 }
00482 }
00483 }
|
|
|
Definition at line 99 of file QKFrame.c. References GENESISCC, and geTKArray_Create(). Referenced by gePath_ReadChannel_F0_(), and gePath_SetupRotationKeyList().
00101 {
00102 return geTKArray_Create(sizeof(geQKFrame_Squad) );
00103 }
|
|
||||||||||||||||||||
|
Definition at line 252 of file QKFrame.c. References B2, GE_TRUE, geFloat, GENESISCC, geQuaternion_IsUnit(), geQuaternion_SlerpNotShortest(), and NULL.
00261 {
00262 geQuaternion *Q1,*Q2;
00263 geQuaternion *QNew = (geQuaternion *)Result;
00264
00265 assert( Result != NULL );
00266 assert( KF1 != NULL );
00267 assert( KF2 != NULL );
00268
00269 assert( T >= (geFloat)0.0f );
00270 assert( T <= (geFloat)1.0f );
00271
00272 if ( KF1 == KF2 )
00273 {
00274 *QNew = ((geQKFrame_Squad *)KF1)->Key.Q;
00275 return;
00276 }
00277
00278 Q1 = &( ((geQKFrame_Squad *)KF1)->Key.Q);
00279 Q2 = &( ((geQKFrame_Squad *)KF2)->Key.Q);
00280
00281 {
00282 geQuaternion *A1,*B2;
00283 geQuaternion SL1,SL2;
00284
00285 A1 = &( ((geQKFrame_Squad *)KF1)->QuadrangleCorner);
00286 B2 = &( ((geQKFrame_Squad *)KF2)->QuadrangleCorner);
00287
00288 geQuaternion_SlerpNotShortest(Q1, Q2, T, &SL1);
00289 assert( geQuaternion_IsUnit(&SL1) == GE_TRUE);
00290 geQuaternion_SlerpNotShortest(A1, B2, T, &SL2);
00291 assert( geQuaternion_IsUnit(&SL2) == GE_TRUE);
00292 geQuaternion_SlerpNotShortest(&SL1, &SL2, (2.0f*T*(1.0f-T)), QNew);
00293 assert( geQuaternion_IsUnit(QNew) == GE_TRUE);
00294 }
00295 }
|
|
||||||||||||
|
Definition at line 572 of file QKFrame.c. References CHECK_FOR_READ, ERR_PATH_FILE_READ, ERR_PATH_FILE_VERSION, GE_FALSE, GE_TRUE, geBoolean, geErrorLog_Add, GENESISCC, geVFile_GetS(), geVFile_Read(), geQKFrame_Squad::Key, NULL, QKeyframe::Q, QKFRAME_SQUAD_ASCII_FILE, geQKFrame_Squad::QuadrangleCorner, uint32, geQuaternion::W, geQuaternion::X, geQuaternion::Y, and geQuaternion::Z. Referenced by gePath_ReadChannel_F0_().
00573 {
00574 uint32 u;
00575 char SQuadKeyString[128];
00576 geQKFrame_Squad* pSquad = (geQKFrame_Squad*)geQKFrame;
00577
00578 assert( pFile != NULL );
00579 assert( geQKFrame != NULL );
00580
00581 // Read the format/version flag
00582 if(geVFile_Read(pFile, &u, sizeof(u)) == GE_FALSE)
00583 {
00584 geErrorLog_Add(ERR_PATH_FILE_READ, NULL);
00585 return GE_FALSE;
00586 }
00587
00588 if(u != QKFRAME_SQUAD_ASCII_FILE)
00589 {
00590 geErrorLog_Add(ERR_PATH_FILE_VERSION, NULL);
00591 return GE_FALSE;
00592 }
00593
00594 if (geVFile_GetS(pFile, SQuadKeyString, sizeof(SQuadKeyString)) == GE_FALSE)
00595 {
00596 geErrorLog_Add(ERR_PATH_FILE_READ, NULL);
00597 return GE_FALSE;
00598 }
00599
00600 u = sscanf(SQuadKeyString, "%f %f %f %f %f %f %f %f\n", &pSquad->Key.Q.W,
00601 &pSquad->Key.Q.X,
00602 &pSquad->Key.Q.Y,
00603 &pSquad->Key.Q.Z,
00604 &pSquad->QuadrangleCorner.W,
00605 &pSquad->QuadrangleCorner.X,
00606 &pSquad->QuadrangleCorner.Y,
00607 &pSquad->QuadrangleCorner.Z);
00608 CHECK_FOR_READ(u, 8);
00609
00610 return GE_TRUE;
00611 }
|
|
||||||||||||
|
Definition at line 371 of file QKFrame.c. References count, GE_TRUE, GENESISCC, geQKFrame_ChooseBestQuat(), geQKFrame_QuadrangleCorner(), geQuaternion_Copy(), geTKArray_Element(), geTKArray_NumElements(), geQKFrame_Squad::Key, NULL, QKeyframe::Q, and geQKFrame_Squad::QuadrangleCorner. Referenced by gePath_Recompute(), geQKFrame_CreateFromBinaryFile(), and geQKFrame_CreateFromFile().
00375 {
00376
00377 // compute the extra interpolation points at each keyframe
00378 // see Advanced Animation and Rendering Techniques
00379 // by Alan Watt and Mark Watt, pg 366
00380 int i;
00381 geQKFrame_Squad *QList=NULL;
00382 int count;
00383
00384 int Index0,Index1,Index2;
00385 assert( KeyList != NULL );
00386
00387 count = geTKArray_NumElements(KeyList);
00388
00389 if (count > 0)
00390 {
00391 QList = (geQKFrame_Squad *)geTKArray_Element(KeyList,0);
00392
00393 for (i =0; i< count-1; i++)
00394 {
00395 geQKFrame_ChooseBestQuat(&(QList[i].Key.Q),&(QList[i+1].Key.Q) );
00396 }
00397 }
00398
00399 if (count<3)
00400 {
00401 Looped = 0;
00402 // cant compute 'slopes' without enough points to loop.
00403 // so treat path as non-looped.
00404 }
00405 for (i =0; i< count; i++)
00406 {
00407 Index0 = i-1;
00408 Index1 = i;
00409 Index2 = i+1;
00410
00411 if (Index1 == 0)
00412 {
00413 if (Looped != GE_TRUE)
00414 {
00415 Index0 = 0;
00416 }
00417 else
00418 {
00419 Index0 = count-2;
00420 }
00421 }
00422
00423 if (Index2 == count)
00424 {
00425 if (Looped != GE_TRUE)
00426 {
00427 Index2 = count-1;
00428 }
00429 else
00430 {
00431 Index2 = 1;
00432 }
00433 }
00434
00435 if (( Looped != GE_TRUE) && (Index1 == 0) )
00436 {
00437 geQuaternion_Copy(
00438 &(QList[i].Key.Q),
00439 &(QList[i].QuadrangleCorner) );
00440 }
00441 else if (( Looped != GE_TRUE) && (Index1 == count-1))
00442 {
00443 geQuaternion_Copy(
00444 &(QList[i].Key.Q),
00445 &(QList[i].QuadrangleCorner) );
00446 }
00447 else
00448 {
00449 geQKFrame_QuadrangleCorner(
00450 &(QList[Index0].Key.Q),
00451 &(QList[Index1].Key.Q),
00452 &(QList[Index2].Key.Q),
00453 &(QList[i].QuadrangleCorner) );
00454
00455 }
00456 }
00457 }
|
|
||||||||||||||||||||
|
Definition at line 1105 of file QKFrame.c. References GE_FALSE, GE_TRUE, geBoolean, geFloat, GENESISCC, geQKFrame_ComputeBlockSize(), geQKFrame_DetermineCompressionType(), geQuaternion_GetAxisAngle(), geTKArray_Element(), geTKArray_ElementTime(), geTKArray_NumElements(), geVec3d_Normalize(), geVFile_Write(), geQKFrame_Linear::Key, NULL, QKeyframe::Q, QKFRAME_HINGE_COMPRESSION, QKFRAME_LINEARTIME_COMPRESSION, and uint32. Referenced by gePath_WriteToBinaryFile().
01107 {
01108 #define WBERREXIT {geErrorLog_AddString( ERR_PATH_FILE_WRITE,"Failure to write binary key data", NULL);return GE_FALSE;}
01109 uint32 u,BlockSize;
01110 int Compression;
01111 int Count,i;
01112 geFloat Time,DeltaTime;
01113 assert( pFile != NULL );
01114 assert( InterpolationType < 0xFF);
01115 assert( (Looping == 0) || (Looping == 1) );
01116
01117
01118 Compression = geQKFrame_DetermineCompressionType(KeyList);
01119 u = (InterpolationType << 16) | (Compression << 8) | Looping;
01120
01121 BlockSize = geQKFrame_ComputeBlockSize(KeyList,Compression);
01122
01123 if (geVFile_Write(pFile, &BlockSize,sizeof(uint32)) == GE_FALSE)
01124 WBERREXIT;
01125
01126 if (geVFile_Write(pFile, &u, sizeof(uint32)) == GE_FALSE)
01127 WBERREXIT;
01128
01129 Count = geTKArray_NumElements(KeyList);
01130 if (geVFile_Write(pFile, &Count, sizeof(uint32)) == GE_FALSE)
01131 WBERREXIT;
01132
01133 if (Compression & QKFRAME_LINEARTIME_COMPRESSION)
01134 {
01135 Time = geTKArray_ElementTime(KeyList, 0);
01136 DeltaTime = geTKArray_ElementTime(KeyList, 1)- Time;
01137 if (geVFile_Write(pFile, &Time,sizeof(geFloat)) == GE_FALSE)
01138 WBERREXIT;
01139 if (geVFile_Write(pFile, &DeltaTime,sizeof(geFloat)) == GE_FALSE)
01140 WBERREXIT;
01141 }
01142 else
01143 {
01144 for(i=0;i<Count;i++)
01145 {
01146 Time = geTKArray_ElementTime(KeyList, i);
01147 if (geVFile_Write(pFile, &Time,sizeof(geFloat)) == GE_FALSE)
01148 WBERREXIT;
01149 }
01150 }
01151
01152 if (Compression & QKFRAME_HINGE_COMPRESSION)
01153 {
01154 geVec3d Hinge;
01155 geFloat Angle;
01156
01157 geQKFrame_Linear* pLinear = (geQKFrame_Linear*)geTKArray_Element(KeyList, 0);
01158 geQuaternion_GetAxisAngle(&(pLinear->Key.Q),&Hinge,&Angle);
01159 geVec3d_Normalize(&Hinge);
01160 if (geVFile_Write(pFile, &Hinge,sizeof(geVec3d)) == GE_FALSE)
01161 WBERREXIT;
01162
01163 for(i=0;i<Count;i++)
01164 {
01165 geQKFrame_Linear* pLinear = (geQKFrame_Linear*)geTKArray_Element(KeyList, i);
01166 geQuaternion_GetAxisAngle(&(pLinear->Key.Q),&Hinge,&Angle);
01167 if (geVFile_Write(pFile, &Angle,sizeof(geFloat)) == GE_FALSE)
01168 WBERREXIT;
01169 }
01170 }
01171 else
01172 {
01173 for(i=0;i<Count;i++)
01174 {
01175 geQKFrame_Linear* pLinear = (geQKFrame_Linear*)geTKArray_Element(KeyList, i);
01176 if (geVFile_Write(pFile, &(pLinear->Key.Q),sizeof(geQuaternion)) == GE_FALSE)
01177 WBERREXIT;
01178 }
01179 }
01180
01181 return GE_TRUE;
01182 }
|
|
||||||||||||||||||||
|
Definition at line 689 of file QKFrame.c. References ERR_PATH_FILE_WRITE, GE_FALSE, GE_TRUE, geBoolean, geErrorLog_Add, geFloat, GENESISCC, geQKFrame_DetermineCompressionType(), geQuaternion_GetAxisAngle(), geTKArray_Element(), geTKArray_ElementTime(), geTKArray_NumElements(), geVec3d_Normalize(), geVFile_Printf(), geQKFrame_Linear::Key, NULL, QKeyframe::Q, QKFRAME_HINGE_COMPRESSION, QKFRAME_KEYLIST_ID, QKFRAME_LINEARTIME_COMPRESSION, geQuaternion::W, geVec3d::X, geQuaternion::X, geVec3d::Y, geQuaternion::Y, geVec3d::Z, and geQuaternion::Z.
00691 {
00692 int NumElements,i;
00693 geFloat Time,DeltaTime;
00694 int Compression;
00695
00696 assert( pFile != NULL );
00697 assert( KeyList != NULL );
00698
00699 NumElements = geTKArray_NumElements(KeyList);
00700
00701 Compression = geQKFrame_DetermineCompressionType(KeyList);
00702
00703 if (geVFile_Printf(pFile,
00704 "%s %d %d %d %d\n",
00705 QKFRAME_KEYLIST_ID,
00706 NumElements,
00707 InterpolationType,
00708 Compression,
00709 Looping) == GE_FALSE)
00710 {
00711 geErrorLog_Add(ERR_PATH_FILE_WRITE, NULL);
00712 return GE_FALSE;
00713 }
00714
00715 if (Compression & QKFRAME_LINEARTIME_COMPRESSION)
00716 {
00717 Time = geTKArray_ElementTime(KeyList, 0);
00718 DeltaTime = geTKArray_ElementTime(KeyList, 1)- Time;
00719 if (geVFile_Printf(pFile,"%f %f Start T,Delta T\n",Time,DeltaTime) == GE_FALSE)
00720 {
00721 geErrorLog_Add(ERR_PATH_FILE_WRITE, NULL);
00722 return GE_FALSE;
00723 }
00724 }
00725
00726 switch (Compression & (~QKFRAME_LINEARTIME_COMPRESSION) )
00727 {
00728 case (0):
00729 {
00730 for(i=0;i<NumElements;i++)
00731 {
00732 geQKFrame_Linear* pLinear = (geQKFrame_Linear*)geTKArray_Element(KeyList, i);
00733 if (!(Compression & QKFRAME_LINEARTIME_COMPRESSION))
00734 {
00735 Time = geTKArray_ElementTime(KeyList, i);
00736 if (geVFile_Printf(pFile, "%f ",Time) == GE_FALSE)
00737 {
00738 geErrorLog_Add(ERR_PATH_FILE_WRITE, NULL);
00739 return GE_FALSE;
00740 }
00741 }
00742 if (geVFile_Printf(pFile,
00743 "%f %f %f %f\n", pLinear->Key.Q.W, pLinear->Key.Q.X,
00744 pLinear->Key.Q.Y, pLinear->Key.Q.Z) == GE_FALSE)
00745 {
00746 geErrorLog_Add(ERR_PATH_FILE_WRITE, NULL);
00747 return GE_FALSE;
00748 }
00749 }
00750 }
00751 break;
00752 case (QKFRAME_HINGE_COMPRESSION):
00753 {
00754 geVec3d Hinge;
00755 geFloat Angle;
00756
00757 geQKFrame_Linear* pLinear = (geQKFrame_Linear*)geTKArray_Element(KeyList, 0);
00758 geQuaternion_GetAxisAngle(&(pLinear->Key.Q),&Hinge,&Angle);
00759 geVec3d_Normalize(&Hinge);
00760 if (geVFile_Printf(pFile,"%f %f %f Axis\n",Hinge.X,Hinge.Y,Hinge.Z) == GE_FALSE)
00761 {
00762 geErrorLog_Add(ERR_PATH_FILE_WRITE, NULL);
00763 return GE_FALSE;
00764 }
00765 for(i=0;i<NumElements;i++)
00766 {
00767 geQKFrame_Linear* pLinear = (geQKFrame_Linear*)geTKArray_Element(KeyList, i);
00768 if (!(Compression & QKFRAME_LINEARTIME_COMPRESSION))
00769 {
00770 Time = geTKArray_ElementTime(KeyList, i);
00771 if (geVFile_Printf(pFile, "%f ",Time) == GE_FALSE)
00772 {
00773 geErrorLog_Add(ERR_PATH_FILE_WRITE, NULL);
00774 return GE_FALSE;
00775 }
00776 }
00777 geQuaternion_GetAxisAngle(&(pLinear->Key.Q),&Hinge,&Angle);
00778 if (geVFile_Printf(pFile,"%f\n", Angle) == GE_FALSE)
00779 {
00780 geErrorLog_Add(ERR_PATH_FILE_WRITE, NULL);
00781 return GE_FALSE;
00782 }
00783 }
00784 }
00785 break;
00786 default:
00787 assert(0);
00788
00789 }
00790 return GE_TRUE;
00791 }
|
1.3.2