#include "basetype.h"#include "xform3d.h"#include "quatern.h"#include "vfile.h"Go to the source code of this file.
Defines | |
| #define | GE_PATH_ROTATION_CHANNEL 1 |
| #define | GE_PATH_TRANSLATION_CHANNEL 2 |
| #define | GE_PATH_ALL_CHANNELS (GE_PATH_ROTATION_CHANNEL | GE_PATH_TRANSLATION_CHANNEL) |
Typedefs | |
| typedef _gePath | gePath |
Enumerations | |
| enum | gePath_Interpolator { GE_PATH_INTERPOLATE_LINEAR = 0, GE_PATH_INTERPOLATE_HERMITE, GE_PATH_INTERPOLATE_SLERP, GE_PATH_INTERPOLATE_SQUAD, GE_PATH_INTERPOLATE_HERMITE_ZERO_DERIV = 7 } |
Functions | |
| GENESISAPI void GENESISCC | gePath_CreateRef (gePath *P) |
| GENESISAPI gePath *GENESISCC | gePath_Create (gePath_Interpolator TranslationInterpolation, gePath_Interpolator RotationInterpolation, geBoolean Looped) |
| GENESISAPI gePath *GENESISCC | gePath_CreateCopy (const gePath *P) |
| GENESISAPI void GENESISCC | gePath_Destroy (gePath **PP) |
| GENESISAPI geBoolean GENESISCC | gePath_InsertKeyframe (gePath *P, int ChannelMask, geFloat Time, const geXForm3d *Matrix) |
| GENESISAPI geBoolean GENESISCC | gePath_DeleteKeyframe (gePath *P, int Index, int ChannelMask) |
| GENESISAPI geBoolean GENESISCC | gePath_GetTimeExtents (const gePath *P, geFloat *StartTime, geFloat *EndTime) |
| GENESISAPI void GENESISCC | gePath_GetKeyframe (const gePath *P, int Index, int Channel, geFloat *Time, geXForm3d *Matrix) |
| GENESISAPI int GENESISCC | gePath_GetKeyframeCount (const gePath *P, int Channel) |
| GENESISAPI int GENESISCC | gePath_GetKeyframeIndex (const gePath *P, int Channel, geFloat Time) |
| GENESISAPI void GENESISCC | gePath_Sample (const gePath *P, geFloat Time, geXForm3d *Matrix) |
| void GENESISCC | gePath_SampleChannels (const gePath *P, geFloat Time, geQuaternion *Rotation, geVec3d *Translation) |
| GENESISAPI geBoolean GENESISCC | gePath_OffsetTimes (gePath *P, int StartingIndex, int ChannelMask, geFloat TimeOffset) |
| GENESISAPI geBoolean GENESISCC | gePath_ModifyKeyframe (gePath *P, int Index, int ChannelMask, const geXForm3d *Matrix) |
| GENESISAPI gePath *GENESISCC | gePath_CreateFromFile (geVFile *F) |
| GENESISAPI geBoolean GENESISCC | gePath_WriteToFile (const gePath *P, geVFile *F) |
| GENESISAPI geBoolean GENESISCC | gePath_WriteToBinaryFile (const gePath *P, geVFile *F) |
|
|
|
|
|
Definition at line 38 of file path.h. Referenced by gePath_CreateFromFile_F0_(), gePath_DeleteKeyframe(), gePath_GetKeyframe(), gePath_GetKeyframeCount(), gePath_GetKeyframeIndex(), gePath_InsertKeyframe(), gePath_ModifyKeyframe(), and gePath_ReadChannel_F0_(). |
|
|
Definition at line 39 of file path.h. Referenced by geActor_IsAnimationCueDead(), geMotion_AddSubMotion(), gePath_CreateFromFile_F0_(), gePath_DeleteKeyframe(), gePath_GetKeyframe(), gePath_GetKeyframeCount(), gePath_GetKeyframeIndex(), gePath_InsertKeyframe(), gePath_ModifyKeyframe(), and gePath_ReadChannel_F0_(). |
|
|
|
|
|
Definition at line 45 of file path.h.
00046 {
00047 GE_PATH_INTERPOLATE_LINEAR = 0, // linear blend for translation or rotation channel
00048 GE_PATH_INTERPOLATE_HERMITE, // hermite cubic spline for translation channel
00049 GE_PATH_INTERPOLATE_SLERP, // spherical-linear blend for rotation channel
00050 GE_PATH_INTERPOLATE_SQUAD, // higher order blend for rotation channel 'G1' continuity
00051 //GE_PATH_INTEROPLATE_TRIPOD, // not supported yet.
00052 GE_PATH_INTERPOLATE_HERMITE_ZERO_DERIV = 7 // hermite cubic with zero derivative at keyframes ('easing' curve)
00053 }gePath_Interpolator;
|
|
||||||||||||||||
|
|
Definition at line 280 of file path.c. References ERR_PATH_CREATE_ENOMEM, GE_FALSE, GE_PATH_INTERPOLATE_HERMITE, GE_PATH_INTERPOLATE_HERMITE_ZERO_DERIV, GE_PATH_INTERPOLATE_LINEAR, GE_PATH_INTERPOLATE_SLERP, GE_PATH_INTERPOLATE_SQUAD, GE_PATH_QK_LINEAR, GE_PATH_QK_SLERP, GE_PATH_QK_SQUAD, GE_PATH_VK_HERMITE, GE_PATH_VK_HERMITE_ZERO_DERIV, GE_PATH_VK_LINEAR, GE_TRUE, geBoolean, geErrorLog_Add, GENESISAPI, GENESISCC, gePath_Create(), gePath_Destroy(), gePath_SetupRotationKeyList(), gePath_SetupTranslationKeyList(), gePath_TimeType, geQKFrame_Insert(), geQKFrame_Query(), geTKArray_NumElements(), geVKFrame_Insert(), geVKFrame_Query(), gePath_Channel::InterpolationType, gePath_Channel::KeyList, _gePath::Looped, NULL, _gePath::Rotation, _gePath::Translation, and V. Referenced by geMotion_SetBlendPath().
00281 {
00282 gePath *P;
00283 gePath_TimeType Time;
00284 geBoolean Looped;
00285
00286 int i,Count;
00287 int RInterp=0;
00288 int TInterp=0;
00289
00290 assert ( Src != NULL );
00291
00292 switch (Src->Rotation.InterpolationType)
00293 {
00294 case (GE_PATH_QK_LINEAR):
00295 RInterp = GE_PATH_INTERPOLATE_LINEAR;
00296 break;
00297 case (GE_PATH_QK_SLERP):
00298 RInterp = GE_PATH_INTERPOLATE_SLERP;
00299 break;
00300 case (GE_PATH_QK_SQUAD):
00301 RInterp = GE_PATH_INTERPOLATE_SQUAD;
00302 break;
00303 default:
00304 assert(0);
00305 }
00306
00307 switch (Src->Translation.InterpolationType)
00308 {
00309 case (GE_PATH_VK_LINEAR):
00310 TInterp = GE_PATH_INTERPOLATE_LINEAR;
00311 break;
00312 case (GE_PATH_VK_HERMITE):
00313 TInterp = GE_PATH_INTERPOLATE_HERMITE;
00314 break;
00315 case (GE_PATH_VK_HERMITE_ZERO_DERIV):
00316 TInterp = GE_PATH_INTERPOLATE_HERMITE_ZERO_DERIV;
00317 break;
00318 default:
00319 assert(0);
00320 }
00321
00322 if (Src->Looped)
00323 Looped = GE_TRUE;
00324 else
00325 Looped = GE_FALSE;
00326
00327 P = gePath_Create(TInterp, RInterp, Looped);
00328 if (P == NULL)
00329 {
00330 geErrorLog_Add(ERR_PATH_CREATE_ENOMEM, NULL);
00331 return NULL;
00332 }
00333
00334 {
00335 geVec3d V;
00336 Count = 0;
00337 if (Src->Translation.KeyList != NULL)
00338 {
00339 Count = geTKArray_NumElements(Src->Translation.KeyList);
00340 }
00341 if (Count>0)
00342 {
00343 if (gePath_SetupTranslationKeyList(P)==GE_FALSE)
00344 {
00345 geErrorLog_Add(ERR_PATH_CREATE_ENOMEM, NULL);
00346 gePath_Destroy(&P);
00347 return NULL;
00348 }
00349
00350 for (i=0; i<Count; i++)
00351 {
00352 int Index;
00353 geVKFrame_Query(Src->Translation.KeyList, i, &Time, &V);
00354 if (geVKFrame_Insert(&(P->Translation.KeyList), Time, &V,&Index) == GE_FALSE)
00355 {
00356 geErrorLog_Add(ERR_PATH_CREATE_ENOMEM, NULL);
00357 gePath_Destroy(&P);
00358 return NULL;
00359 }
00360 }
00361 }
00362 }
00363
00364 {
00365 geQuaternion Q;
00366 Count = 0;
00367 if (Src->Rotation.KeyList != NULL)
00368 {
00369 Count = geTKArray_NumElements(Src->Rotation.KeyList);
00370 }
00371 if (Count>0)
00372 {
00373 if (gePath_SetupRotationKeyList(P)==GE_FALSE)
00374 {
00375 geErrorLog_Add(ERR_PATH_CREATE_ENOMEM, NULL);
00376 gePath_Destroy(&P);
00377 return NULL;
00378 }
00379
00380 for (i=0; i<Count; i++)
00381 {
00382 int Index;
00383 geQKFrame_Query(Src->Rotation.KeyList, i, &Time, &Q);
00384 if (geQKFrame_Insert(&(P->Rotation.KeyList), Time, &Q, &Index) == GE_FALSE)
00385 {
00386 geErrorLog_Add(ERR_PATH_CREATE_ENOMEM, NULL);
00387 gePath_Destroy(&P);
00388 return NULL;
00389 }
00390 }
00391 }
00392 }
00393 return P;
00394 }
|
|
|
Definition at line 1298 of file path.c. References _gePath::Dirty, ERR_PATH_FILE_PARSE, ERR_PATH_FILE_READ, EXIT_ERROR, FLAG_DIRTY, FLAG_LOOPED, GE_FALSE, GE_PATH_ASCII_FILE_TYPE, GE_PATH_BINARY_FILE_VERSION, GE_PATH_FILE_VERSION, GE_PATH_FILE_VERSION0, GE_PATH_FILE_VERSION1, GE_PATH_ROTATION_ID, GE_PATH_TRANSLATION_ID, geErrorLog_Add, GENESISAPI, GENESISCC, gePath_Create(), gePath_CreateFromBinaryFile(), gePath_CreateFromFile_F0_(), gePath_QKToPathInterpolation(), gePath_VKToPathInterpolation(), geQKFrame_CreateFromFile(), geVFile_GetS(), geVFile_Read(), geVKFrame_CreateFromFile(), gePath_Channel::InterpolationType, gePath_Channel::KeyList, _gePath::Looped, NULL, _gePath::Rotation, _gePath::Translation, uint32, and v. Referenced by geMotion_CreateFromFile(), and geMotion_ReadBinaryLeaf().
01299 {
01300 uint32 u, v, flag;
01301 int Interp,Loop;
01302 gePath* P;
01303 #define LINE_LENGTH 256
01304 char line[LINE_LENGTH];
01305
01306 assert( pFile != NULL );
01307 if(geVFile_Read(pFile, &u, sizeof(u)) == GE_FALSE)
01308 {
01309 geErrorLog_Add( ERR_PATH_FILE_READ , NULL);
01310 return NULL;
01311 }
01312
01313 if ( (u>>16) == GE_PATH_BINARY_FILE_VERSION)
01314 return gePath_CreateFromBinaryFile(pFile,u);
01315
01316
01317 if(u != GE_PATH_ASCII_FILE_TYPE)
01318 {
01319 geErrorLog_Add( ERR_PATH_FILE_PARSE , NULL);
01320 return NULL;
01321 }
01322
01323 // Read the version.
01324 if (geVFile_GetS(pFile, line, LINE_LENGTH) == GE_FALSE)
01325 {
01326 geErrorLog_Add( ERR_PATH_FILE_READ , NULL);
01327 return NULL;
01328 }
01329 if (sscanf(line, "%X.%X\n", &u, &v) != 2)
01330 {
01331 geErrorLog_Add( ERR_PATH_FILE_PARSE , NULL);
01332 return NULL;
01333 }
01334 v |= (u << 8);
01335 if(v == GE_PATH_FILE_VERSION0)
01336 return gePath_CreateFromFile_F0_(pFile);
01337 if (! ((v == GE_PATH_FILE_VERSION1) || (v== GE_PATH_FILE_VERSION)) )
01338 {
01339 geErrorLog_Add( ERR_PATH_FILE_PARSE , NULL);
01340 return NULL;
01341 }
01342
01343 P = gePath_Create(0, 0, GE_FALSE);
01344 if( P == NULL )
01345 {
01346 return NULL; // error logged already in gePath_Create
01347 }
01348
01349 if(geVFile_GetS(pFile, line, LINE_LENGTH) == GE_FALSE)
01350 EXIT_ERROR
01351 if(strnicmp(line, GE_PATH_ROTATION_ID, sizeof(GE_PATH_ROTATION_ID)-1) != 0)
01352 EXIT_ERROR
01353 if (v==GE_PATH_FILE_VERSION1)
01354 {
01355 P->Rotation.InterpolationType = 0;
01356 if(sscanf(line + sizeof(GE_PATH_ROTATION_ID)-1, "%d", &flag) != 1)
01357 EXIT_ERROR
01358 }
01359 else
01360 {
01361 if (v==GE_PATH_FILE_VERSION)
01362 {
01363 if(sscanf(line + sizeof(GE_PATH_ROTATION_ID)-1, "%d %d", &flag, &(P->Rotation.InterpolationType)) != 2)
01364 EXIT_ERROR
01365 }
01366 else
01367 EXIT_ERROR
01368 }
01369 if (flag!=GE_FALSE)
01370 {
01371 P->Rotation.KeyList = geQKFrame_CreateFromFile(pFile,&Interp,&Loop);
01372 if (P->Rotation.KeyList == NULL)
01373 EXIT_ERROR
01374 P->Rotation.InterpolationType = gePath_QKToPathInterpolation(Interp);
01375 if (Loop)
01376 P->Looped = FLAG_LOOPED;
01377 }
01378
01379 if(geVFile_GetS(pFile, line, LINE_LENGTH) == GE_FALSE)
01380 EXIT_ERROR
01381 if(strnicmp(line, GE_PATH_TRANSLATION_ID, sizeof(GE_PATH_TRANSLATION_ID)-1) != 0)
01382 EXIT_ERROR
01383 if (v==GE_PATH_FILE_VERSION1)
01384 {
01385 P->Translation.InterpolationType = 0;
01386 if(sscanf(line + sizeof(GE_PATH_TRANSLATION_ID)-1, "%d", &flag) != 1)
01387 EXIT_ERROR
01388 }
01389 else
01390 {
01391 if (v==GE_PATH_FILE_VERSION)
01392 {
01393 if(sscanf(line + sizeof(GE_PATH_TRANSLATION_ID)-1, "%d %d", &flag, &(P->Translation.InterpolationType)) != 2)
01394 EXIT_ERROR
01395 }
01396 else
01397 EXIT_ERROR
01398 }
01399
01400 if (flag!=GE_FALSE)
01401 {
01402 P->Translation.KeyList = geVKFrame_CreateFromFile(pFile,&Interp,&Loop);
01403 if (P->Translation.KeyList == NULL)
01404 EXIT_ERROR
01405 P->Translation.InterpolationType = gePath_VKToPathInterpolation(Interp);
01406 if (Loop)
01407 P->Looped = FLAG_LOOPED;
01408 }
01409
01410 P->Dirty = FLAG_DIRTY;
01411 return P;
01412 }
|
|
|
Definition at line 161 of file path.c. References GENESISAPI, GENESISCC, NULL, and _gePath::RefCount. Referenced by geMotion_AddPath().
00162 {
00163 assert( P != NULL );
00164 P->RefCount++;
00165 }
|
|
||||||||||||||||
|
Definition at line 550 of file path.c. References _gePath::Dirty, ERR_PATH_DELETE_R_KEYFRAME, ERR_PATH_DELETE_T_KEYFRAME, FLAG_DIRTY, GE_FALSE, GE_PATH_ROTATION_CHANNEL, GE_PATH_TRANSLATION_CHANNEL, GE_TRUE, geBoolean, geErrorLog_Add, GENESISAPI, GENESISCC, geTKArray_DeleteElement(), gePath_Channel::KeyList, NULL, _gePath::Rotation, and _gePath::Translation.
00554 {
00555 int ErrorOccured= 0;
00556
00557 assert( P != NULL );
00558 assert( ( ChannelMask & GE_PATH_ROTATION_CHANNEL ) ||
00559 ( ChannelMask & GE_PATH_TRANSLATION_CHANNEL ) );
00560
00561 if (ChannelMask & GE_PATH_ROTATION_CHANNEL)
00562 {
00563 if (geTKArray_DeleteElement( &(P->Rotation.KeyList), Index) == GE_FALSE)
00564 {
00565 ErrorOccured = 1;
00566 geErrorLog_Add(ERR_PATH_DELETE_R_KEYFRAME, NULL);
00567 }
00568 }
00569
00570 if (ChannelMask & GE_PATH_TRANSLATION_CHANNEL)
00571 {
00572 if (geTKArray_DeleteElement( &(P->Translation.KeyList), Index) == GE_FALSE)
00573 {
00574 ErrorOccured = 1;
00575 geErrorLog_Add(ERR_PATH_DELETE_T_KEYFRAME, NULL);
00576 }
00577 }
00578
00579 P->Dirty = FLAG_DIRTY;
00580
00581
00582 if (ErrorOccured)
00583 {
00584 return GE_FALSE;
00585 }
00586
00587 return GE_TRUE;
00588 }
|
|
|
Definition at line 398 of file path.c. References GENESISAPI, GENESISCC, geRam_Free, geTKArray_Destroy(), gePath_Channel::KeyList, NULL, _gePath::RefCount, _gePath::Rotation, and _gePath::Translation. Referenced by geMotion_AddPath(), geMotion_AddSubMotion(), geMotion_Destroy(), geMotion_RemoveSubMotion(), geMotion_SetBlendPath(), and gePath_CreateCopy().
00399 {
00400 gePath *P;
00401
00402 assert( PP != NULL );
00403 assert( *PP != NULL );
00404
00405 P = *PP;
00406
00407 if ( P->RefCount > 0)
00408 {
00409 P->RefCount -- ;
00410 return;
00411 }
00412 if ( P->Rotation.KeyList != NULL)
00413 {
00414 geTKArray_Destroy(&(P->Rotation.KeyList));
00415 P->Rotation.KeyList = NULL;
00416 }
00417
00418 if ( P->Translation.KeyList != NULL)
00419 {
00420 geTKArray_Destroy(&(P->Translation.KeyList));
00421 P->Translation.KeyList = NULL;
00422 }
00423
00424 geRam_Free(*PP);
00425
00426 *PP = NULL;
00427 }
|
|
||||||||||||||||||||||||
|
Referenced by geActor_IsAnimationCueDead(). |
|
||||||||||||
|
Definition at line 661 of file path.c. References Channel, GE_PATH_ROTATION_CHANNEL, GE_PATH_TRANSLATION_CHANNEL, GENESISAPI, GENESISCC, geTKArray_NumElements(), gePath_Channel::KeyList, NULL, _gePath::Rotation, and _gePath::Translation. Referenced by geActor_IsAnimationCueDead().
00662 {
00663 assert( P != NULL );
00664
00665 switch (Channel)
00666 {
00667 case (GE_PATH_ROTATION_CHANNEL):
00668 if (P->Rotation.KeyList!=NULL)
00669 {
00670 return geTKArray_NumElements(P->Rotation.KeyList);
00671 }
00672 else
00673 {
00674 return 0;
00675 }
00676 break;
00677
00678 case (GE_PATH_TRANSLATION_CHANNEL):
00679 if (P->Translation.KeyList!=NULL)
00680 {
00681 return geTKArray_NumElements(P->Translation.KeyList);
00682 }
00683 else
00684 {
00685 return 0;
00686 }
00687 break;
00688
00689 default:
00690 assert(0);
00691 }
00692 return 0; // this is just for warning removal
00693 }
|
|
||||||||||||||||
|
Definition at line 695 of file path.c. References Channel, GE_PATH_ROTATION_CHANNEL, GE_PATH_TRANSLATION_CHANNEL, GE_TKA_TIME_TOLERANCE, GENESISAPI, GENESISCC, geTKArray_BSearch(), geTKArray_ElementTime(), gePath_Channel::KeyList, NULL, _gePath::Rotation, and _gePath::Translation.
00697 {
00698 int KeyIndex;
00699 geTKArray *Array = NULL;
00700
00701 assert ((Channel == GE_PATH_TRANSLATION_CHANNEL) ||
00702 (Channel == GE_PATH_ROTATION_CHANNEL));
00703
00704 switch (Channel)
00705 {
00706 case GE_PATH_ROTATION_CHANNEL :
00707 Array = P->Rotation.KeyList;
00708 break;
00709
00710 case GE_PATH_TRANSLATION_CHANNEL :
00711 Array = P->Translation.KeyList;
00712 break;
00713 }
00714
00715 // find the time in the channel's array
00716 KeyIndex = geTKArray_BSearch (Array, Time);
00717 if (KeyIndex != -1)
00718 {
00719 // since geTKArray_BSearch will return the "closest" key,
00720 // I need to make sure that it's exact...
00721 if (fabs (Time - geTKArray_ElementTime (Array, KeyIndex)) > GE_TKA_TIME_TOLERANCE)
00722 {
00723 KeyIndex = -1;
00724 }
00725 }
00726
00727 return KeyIndex;
00728 }
|
|
||||||||||||||||
|
Referenced by geMotion_GetTimeExtents(), and ModelCtl_Frame(). |
|
||||||||||||||||||||
|
Referenced by geMotion_AddSubMotion(). |
|
||||||||||||||||||||
|
Definition at line 628 of file path.c. References _gePath::Dirty, FLAG_DIRTY, GE_PATH_ROTATION_CHANNEL, GE_PATH_TRANSLATION_CHANNEL, GE_TRUE, geBoolean, GENESISAPI, GENESISCC, geQKFrame_Modify(), geQuaternion_FromMatrix(), geQuaternion_Normalize(), geVKFrame_Modify(), gePath_Channel::KeyList, NULL, _gePath::Rotation, geXForm3d::Translation, and _gePath::Translation.
00633 {
00634 assert( P != NULL );
00635 assert( Index >= 0 );
00636 assert( Matrix != NULL );
00637 assert( ( ChannelMask & GE_PATH_ROTATION_CHANNEL ) ||
00638 ( ChannelMask & GE_PATH_TRANSLATION_CHANNEL ) );
00639
00640
00641 if (ChannelMask & GE_PATH_ROTATION_CHANNEL)
00642 {
00643 geQuaternion Q;
00644 assert( Index < geTKArray_NumElements(P->Rotation.KeyList) );
00645 geQuaternion_FromMatrix(Matrix, &Q);
00646 geQuaternion_Normalize(&Q);
00647 geQKFrame_Modify(P->Rotation.KeyList, Index, &Q);
00648 }
00649
00650 if (ChannelMask & GE_PATH_TRANSLATION_CHANNEL)
00651 {
00652 assert( Index < geTKArray_NumElements(P->Translation.KeyList) );
00653 geVKFrame_Modify(P->Translation.KeyList, Index, &(Matrix->Translation));
00654 }
00655
00656 P->Dirty = FLAG_DIRTY;
00657 return GE_TRUE;
00658 }
|
|
||||||||||||||||||||
|
|
|
||||||||||||||||
|
Referenced by Door_Control(), Door_Spawn(), ModelCtl_Frame(), Plat_Control(), and Plat_Spawn(). |
|
||||||||||||||||||||
|
Referenced by geMotion_GetBlendAmount(), geMotion_GetTransform(), geMotion_SampleChannels(), and geMotion_SampleChannelsNamed(). |
|
||||||||||||
|
Definition at line 1514 of file path.c. References GE_FALSE, GE_PATH_BINARY_FILE_VERSION, GE_PATH_MAX_INT_TYPE_COUNT, GE_PATH_ROT_SHIFT_INTO_HEADER, GE_PATH_TRANS_SHIFT_INTO_HEADER, GE_TRUE, geBoolean, geErrorLog_AddString, GENESISAPI, GENESISCC, gePath_PathToQKInterpolation(), gePath_PathToVKInterpolation(), geQKFrame_WriteToBinaryFile(), geTKArray_NumElements(), geVFile_Write(), geVKFrame_WriteToBinaryFile(), gePath_Channel::InterpolationType, gePath_Channel::KeyList, _gePath::Looped, NULL, R, _gePath::Rotation, _gePath::Translation, and uint32. Referenced by geMotion_WriteBinaryLeaf().
01515 {
01516 uint32 Header;
01517 int R,T,Looped;
01518
01519 assert( F != NULL );
01520 assert( P != NULL );
01521 assert( GE_PATH_BINARY_FILE_VERSION < 0xFFFF );
01522
01523 R=T=0;
01524
01525 if (P->Rotation.KeyList != NULL)
01526 {
01527 if (geTKArray_NumElements(P->Rotation.KeyList)>0)
01528 {
01529 R = GE_TRUE;
01530 }
01531 }
01532
01533 if (P->Translation.KeyList != NULL)
01534 {
01535 if (geTKArray_NumElements(P->Translation.KeyList)>0)
01536 {
01537 T = GE_TRUE;
01538 }
01539 }
01540
01541 if (P->Looped)
01542 Looped = 1;
01543 else
01544 Looped = 0;
01545 assert( P->Translation.InterpolationType <= GE_PATH_MAX_INT_TYPE_COUNT);
01546 assert( P->Rotation.InterpolationType <= GE_PATH_MAX_INT_TYPE_COUNT);
01547
01548 Header =
01549 (GE_PATH_BINARY_FILE_VERSION << 16) |
01550 (T<<1) |
01551 (R) |
01552 (P->Translation.InterpolationType << GE_PATH_TRANS_SHIFT_INTO_HEADER) |
01553 (P->Rotation.InterpolationType << GE_PATH_ROT_SHIFT_INTO_HEADER );
01554
01555 if (geVFile_Write(F, &Header,sizeof(uint32)) == GE_FALSE)
01556 {
01557 geErrorLog_AddString( -1 ,"Failure to write Path Binary File Header", NULL);
01558 return GE_FALSE;
01559 }
01560
01561 if (T==1)
01562 {
01563 if (geVKFrame_WriteToBinaryFile( F, P->Translation.KeyList,
01564 gePath_PathToVKInterpolation(P->Translation.InterpolationType),
01565 Looped)==GE_FALSE)
01566 {
01567 geErrorLog_AddString( -1 ,"Failure to write Path data", NULL);
01568 return GE_FALSE;
01569 }
01570 }
01571 if (R==1)
01572 {
01573 if (geQKFrame_WriteToBinaryFile( F, P->Rotation.KeyList,
01574 gePath_PathToQKInterpolation(P->Rotation.InterpolationType),
01575 Looped)==GE_FALSE)
01576 {
01577 geErrorLog_AddString( -1 ,"Failure to write Path data", NULL);
01578 return GE_FALSE;
01579 }
01580 }
01581
01582 return GE_TRUE;
01583 }
|
|
||||||||||||
|
Definition at line 1414 of file path.c. References _gePath::Dirty, ERR_PATH_FILE_WRITE, GE_FALSE, GE_PATH_ASCII_FILE_TYPE, GE_PATH_FILE_VERSION, GE_PATH_ROTATION_ID, GE_PATH_TRANSLATION_ID, GE_TRUE, geBoolean, geErrorLog_Add, GENESISAPI, GENESISCC, gePath_PathToQKInterpolation(), gePath_PathToVKInterpolation(), gePath_Recompute(), geQKFrame_WriteToFile(), geTKArray_NumElements(), geVFile_Printf(), geVFile_Write(), geVKFrame_WriteToFile(), gePath_Channel::InterpolationType, gePath_Channel::KeyList, _gePath::Looped, NULL, _gePath::Rotation, _gePath::Translation, and uint32. Referenced by geMotion_WriteLeaf().
01415 {
01416 uint32 u;
01417 int Looped=0;
01418
01419 assert( P != NULL );
01420 assert( pFile != NULL );
01421
01422 if (P->Dirty)
01423 gePath_Recompute((gePath *)P);
01424
01425 // Write the format flag
01426 u = GE_PATH_ASCII_FILE_TYPE;
01427 if(geVFile_Write(pFile, &u,sizeof(u)) == GE_FALSE)
01428 {
01429 geErrorLog_Add( ERR_PATH_FILE_WRITE , NULL);
01430 return GE_FALSE;
01431 }
01432
01433 // Write the version
01434 if (geVFile_Printf(pFile, " %X.%.2X\n", (GE_PATH_FILE_VERSION & 0xFF00) >> 8,
01435 GE_PATH_FILE_VERSION & 0x00FF) == GE_FALSE)
01436 {
01437 geErrorLog_Add( ERR_PATH_FILE_WRITE , NULL);
01438 return GE_FALSE;
01439 }
01440
01441 {
01442 int flag;
01443 flag = GE_FALSE;
01444
01445 if (P->Rotation.KeyList != NULL)
01446 {
01447 if (geTKArray_NumElements(P->Rotation.KeyList)>0)
01448 {
01449 flag = GE_TRUE;
01450 }
01451 }
01452 if (geVFile_Printf(pFile,
01453 "%s %d %d\n",
01454 GE_PATH_ROTATION_ID,
01455 flag,
01456 P->Rotation.InterpolationType) == GE_FALSE)
01457 {
01458 geErrorLog_Add( ERR_PATH_FILE_WRITE , NULL);
01459 return GE_FALSE;
01460 }
01461
01462 if (P->Looped)
01463 Looped = 1;
01464
01465 if (flag!=GE_FALSE)
01466 if (geQKFrame_WriteToFile( pFile, P->Rotation.KeyList,
01467 gePath_PathToQKInterpolation(P->Rotation.InterpolationType),
01468 Looped)==GE_FALSE)
01469 {
01470 return GE_FALSE;
01471 }
01472
01473 flag = GE_FALSE;
01474 if (P->Translation.KeyList != NULL)
01475 {
01476 if (geTKArray_NumElements(P->Translation.KeyList)>0)
01477 {
01478 flag = GE_TRUE;
01479 }
01480 }
01481 if (geVFile_Printf(pFile,
01482 "%s %d %d\n",
01483 GE_PATH_TRANSLATION_ID,
01484 flag,
01485 P->Translation.InterpolationType) == GE_FALSE)
01486 {
01487 geErrorLog_Add( ERR_PATH_FILE_WRITE , NULL);
01488 return GE_FALSE;
01489 }
01490
01491 if (flag!=GE_FALSE)
01492 if (geVKFrame_WriteToFile( pFile, P->Translation.KeyList,
01493 gePath_PathToVKInterpolation(P->Translation.InterpolationType),
01494 Looped)==GE_FALSE)
01495 {
01496 return GE_FALSE;
01497 }
01498 }
01499
01500
01501 return GE_TRUE;
01502 }
|
1.3.2