Main Page | Alphabetical List | Compound List | File List | Compound Members | File Members

path.h File Reference

#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)


Define Documentation

#define GE_PATH_ALL_CHANNELS   (GE_PATH_ROTATION_CHANNEL | GE_PATH_TRANSLATION_CHANNEL)
 

Definition at line 41 of file path.h.

#define GE_PATH_ROTATION_CHANNEL   1
 

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_().

#define GE_PATH_TRANSLATION_CHANNEL   2
 

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_().


Typedef Documentation

typedef struct _gePath gePath
 

Definition at line 36 of file path.h.


Enumeration Type Documentation

enum gePath_Interpolator
 

Enumeration values:
GE_PATH_INTERPOLATE_LINEAR 
GE_PATH_INTERPOLATE_HERMITE 
GE_PATH_INTERPOLATE_SLERP 
GE_PATH_INTERPOLATE_SQUAD 
GE_PATH_INTERPOLATE_HERMITE_ZERO_DERIV 

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;


Function Documentation

GENESISAPI gePath* GENESISCC gePath_Create gePath_Interpolator  TranslationInterpolation,
gePath_Interpolator  RotationInterpolation,
geBoolean  Looped
 

Definition at line 167 of file path.c.

References _gePath::Dirty, ERR_PATH_CREATE_ENOMEM, FLAG_DIRTY, FLAG_LOOPED, 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, geErrorLog_Add, GENESISAPI, GENESISCC, geRam_Allocate, gePath_Channel::InterpolationType, gePath_Channel::KeyList, _gePath::Looped, NULL, _gePath::RefCount, _gePath::Rotation, and _gePath::Translation.

Referenced by geMotion_AddSubMotion(), gePath_CreateCopy(), gePath_CreateFromFile(), and gePath_CreateFromFile_F0_().

00172 {
00173         gePath *P;
00174 
00175         P = geRam_Allocate(sizeof(gePath));
00176 
00177         if ( P == NULL )
00178         {
00179                 geErrorLog_Add(ERR_PATH_CREATE_ENOMEM, NULL);
00180                 return NULL;
00181         }
00182 
00183         P->Rotation.KeyList    = NULL;
00184         P->Translation.KeyList = NULL;
00185         
00186         P->RefCount = 0;
00187         P->Dirty    = FLAG_DIRTY;
00188 
00189         if (Looped==GE_TRUE)
00190                 P->Looped = FLAG_LOOPED;
00191         else
00192                 P->Looped = 0;
00193 
00194 
00195         switch (RotationInterpolation)
00196                 {
00197                         case (GE_PATH_INTERPOLATE_LINEAR):
00198                                 P->Rotation.InterpolationType = GE_PATH_QK_LINEAR;
00199                                 break;
00200                         case (GE_PATH_INTERPOLATE_SLERP):
00201                                 P->Rotation.InterpolationType = GE_PATH_QK_SLERP; 
00202                                 break;
00203                         case (GE_PATH_INTERPOLATE_SQUAD):
00204                                 P->Rotation.InterpolationType = GE_PATH_QK_SQUAD;
00205                                 break;
00206                         default:
00207                                 assert(0);
00208                 }
00209         
00210         P->Rotation.KeyList = NULL;
00211 
00212         switch (TranslationInterpolation)
00213                 {
00214                         case (GE_PATH_INTERPOLATE_LINEAR):
00215                                 P->Translation.InterpolationType = GE_PATH_VK_LINEAR;
00216                                 break;
00217                         case (GE_PATH_INTERPOLATE_HERMITE):
00218                                 P->Translation.InterpolationType = GE_PATH_VK_HERMITE;
00219                                 break;
00220                         case (GE_PATH_INTERPOLATE_HERMITE_ZERO_DERIV):
00221                                 P->Translation.InterpolationType = GE_PATH_VK_HERMITE_ZERO_DERIV;
00222                                 break;
00223                         default:
00224                                 assert(0);
00225                 }
00226 
00227         P->Translation.KeyList = NULL;
00228 
00229         return P;
00230 }

GENESISAPI gePath* GENESISCC gePath_CreateCopy const gePath P  ) 
 

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 }

GENESISAPI gePath* GENESISCC gePath_CreateFromFile geVFile F  ) 
 

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 }

GENESISAPI void GENESISCC gePath_CreateRef gePath P  ) 
 

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 }

GENESISAPI geBoolean GENESISCC gePath_DeleteKeyframe gePath P,
int  Index,
int  ChannelMask
 

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 }

GENESISAPI void GENESISCC gePath_Destroy gePath **  PP  ) 
 

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 }

GENESISAPI void GENESISCC gePath_GetKeyframe const gePath P,
int  Index,
int  Channel,
geFloat Time,
geXForm3d Matrix
 

Referenced by geActor_IsAnimationCueDead().

GENESISAPI int GENESISCC gePath_GetKeyframeCount const gePath P,
int  Channel
 

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 }

GENESISAPI int GENESISCC gePath_GetKeyframeIndex const gePath P,
int  Channel,
geFloat  Time
 

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 }

GENESISAPI geBoolean GENESISCC gePath_GetTimeExtents const gePath P,
geFloat StartTime,
geFloat EndTime
 

Referenced by geMotion_GetTimeExtents(), and ModelCtl_Frame().

GENESISAPI geBoolean GENESISCC gePath_InsertKeyframe gePath P,
int  ChannelMask,
geFloat  Time,
const geXForm3d Matrix
 

Referenced by geMotion_AddSubMotion().

GENESISAPI geBoolean GENESISCC gePath_ModifyKeyframe gePath P,
int  Index,
int  ChannelMask,
const geXForm3d Matrix
 

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 }

GENESISAPI geBoolean GENESISCC gePath_OffsetTimes gePath P,
int  StartingIndex,
int  ChannelMask,
geFloat  TimeOffset
 

GENESISAPI void GENESISCC gePath_Sample const gePath P,
geFloat  Time,
geXForm3d Matrix
 

Referenced by Door_Control(), Door_Spawn(), ModelCtl_Frame(), Plat_Control(), and Plat_Spawn().

void GENESISCC gePath_SampleChannels const gePath P,
geFloat  Time,
geQuaternion Rotation,
geVec3d Translation
 

Referenced by geMotion_GetBlendAmount(), geMotion_GetTransform(), geMotion_SampleChannels(), and geMotion_SampleChannelsNamed().

GENESISAPI geBoolean GENESISCC gePath_WriteToBinaryFile const gePath P,
geVFile F
 

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 }

GENESISAPI geBoolean GENESISCC gePath_WriteToFile const gePath P,
geVFile F
 

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 }


Generated on Tue Sep 30 12:37:51 2003 for GTestAndEngine by doxygen 1.3.2