JD2022-TU1/main/extern/Camcam/LIBS/Mixer/SmallScene_ANIM.cpp

265 lines
7.4 KiB
C++

#include "SCENE.H"
#include <process.h>
#define MEDIA_BASE ".\\Media\\"
#define TEXTURES_DIRECTORY ""//"Textures\\"
#define MESHES_DIRECTORY ""//"Meshs\\"
#define MATERIALS_DIRECTORY ""//"Mats\\"
#define OBJECTS_DIRECTORY ""//"Objects\\"
extern u8 Upper(u8 P);
static u32 XAF_EOF = 0;
void WORLD::DestroyAnim(char *AnimName, char *SmScName)
{
UnicID AnimID;
char DicoName[1024];
if (SmScName && *SmScName)
sprintf(DicoName, "%s_%s", SmScName, AnimName);
else
strcpy(DicoName, AnimName);
AnimID = AnimDico.IsExist(DicoName);
if (AnimID == -1)
AnimID = AnimDico.IsExist(AnimName);
if (AnimID == -1)
return;
AnimID = AnimDico.mpst_Dico[AnimID].AssociatedValue;
AnimDico.DelWord((char *)AnimName);
if (pAllAnims[AnimID].Tracks)
{
FreeTrackPlayer(pAllAnims[AnimID].Tracks);
pAllAnims[AnimID].Tracks = NULL;
}
}
void WORLD::DestroyAllAnim()
{
/* u32 Counter = AnimCreateID;
SmallScene_ANIM *pSmallSceneAnim;
pSmallSceneAnim = &pAllAnims[AnimCreateID];
pSmallSceneAnim->TimeLineInMS = 0;
*/
for (int i=0; i<AnimCreateID; i++)
{
if (pAllAnims[i].Tracks)
{
FreeTrackPlayer(pAllAnims[i].Tracks);
pAllAnims[i].Tracks = NULL;
}
}
if (pAllAnims)
{
CC_free(pAllAnims);
pAllAnims = NULL;
}
AnimCreateID = 0;
AnimDico.Destroy();
}
int WORLD::LoadAnim(char *AnimName, char *SmScName, int ForceReload)
{
char NewName[1024];
char DicoName[1024];
int nbSearch;
char *SearchNames[3];
char SceneModifiedPath[1024];
char ScenePath[1024];
const char *AnimPath = ".\\anims";
FILE *F = 0;
UnicID AnimID;
if (SmScName && *SmScName)
{
sprintf(DicoName, "%s_%s", SmScName, AnimName);
sprintf(SceneModifiedPath, ".\\media\\%s\\modified", SmScName);
sprintf(ScenePath, ".\\media\\%s", SmScName);
nbSearch = 3;
SearchNames[0] = SceneModifiedPath;
SearchNames[1] = ScenePath;
SearchNames[2] = (char *)AnimPath;
}
else
{
strcpy(DicoName, AnimName);
nbSearch = 1;
SearchNames[0] = (char *)AnimPath;
}
AnimID = AnimDico.IsExist(DicoName);
if (AnimID != -1 && !ForceReload)
return 1;
for (int i=0; i<nbSearch && !F; i++)
{
sprintf(NewName,"%s\\%s.TRK",SearchNames[i],AnimName);
F = CC_fopen(NewName,"rb");
if (!F)
{
char XafName[2048];
extern void XAF_TO_TRK(char *XAFName,char *TRKName);
sprintf(XafName,"%s\\%s.XAF",SearchNames[i],AnimName);
XAF_TO_TRK(XafName,NewName);
F = CC_fopen(NewName,"rb");
}
}
if (F)
{
CC_fclose(F);
if ((AnimCreateID & 31) == 0)
{
if (AnimCreateID == 0)
pAllAnims = (SmallScene_ANIM *)CC_malloc((AnimCreateID+32)*sizeof(SmallScene_ANIM));
else
pAllAnims = (SmallScene_ANIM *)CC_realloc(pAllAnims,(AnimCreateID+32)*sizeof(SmallScene_ANIM));
}
memset(&pAllAnims[AnimCreateID],0,sizeof(SmallScene_ANIM));
if (!pAllAnims[AnimCreateID].Tracks)
pAllAnims[AnimCreateID].Tracks = (TrackPlayer *)CC_malloc(sizeof(TrackPlayer));
LoadTrackPlayer(&pAllAnims[AnimCreateID].Tracks,NewName);
/* Recompute TimeMax */
SmallScene_ANIM *pSmallSceneAnim;
pSmallSceneAnim = &pAllAnims[AnimCreateID];
pSmallSceneAnim->TimeLineInMS = 0;
/* Affect Anim to SmallScene */
for (int i = 0 ; i < pSmallSceneAnim->Tracks->ulNumberOfTracks ; i ++)
{
for (int j = 0 ; j < pSmallSceneAnim->Tracks->TracksPtrs[i].ulNumberOfMC ; j ++)
{
MATRIX T;
if (pSmallSceneAnim->Tracks->TracksPtrs[i].Get((u32)j,&T))
{
pSmallSceneAnim->TimeLineInMS = j;
} else
j = 0xffffff;
}
}
AnimDico.GetUnic(&AnimID,DicoName);
AnimDico.mpst_Dico[AnimID].AssociatedValue = AnimCreateID++;
return 1;
}
return 0;
}
int WORLD::PlayAnim(char *AnimName,char *SmScName,s32 Time,float BlendFactor)
{
SmallScene *pSmallScene;
UnicID AnimID;
char DicoName[1024];
SmallScene_ANIM *pSmallSceneAnim;
pSmallSceneAnim = NULL;
Time /= 33; // 30 images per second
pSmallScene = SmallNameToScene(SmScName);
sprintf(DicoName, "%s_%s", SmScName, AnimName);
AnimID = AnimDico.IsExist(DicoName);
if (AnimID == -1)
AnimID = AnimDico.IsExist(AnimName);
if (pSmallScene && (AnimID != -1))
{
pSmallSceneAnim = &pAllAnims[AnimDico.mpst_Dico[AnimID].AssociatedValue];
if (pSmallSceneAnim)
{
if (Time < 0)
{
Time = pSmallSceneAnim->TimeLineInMS + Time;
}
if (Time >= (s32)pSmallSceneAnim->TimeLineInMS)
Time = pSmallSceneAnim->TimeLineInMS;
if (Time < 0)
Time = 0;
ComputeSmallSceneHierarchie(pSmallScene);
/* Affect Anim to SmallScene */
for (int i = 0 ; i < pSmallSceneAnim->Tracks->ulNumberOfTracks ; i ++)
{
UnicID ObjectREF;
ObjectREF = pSmallScene->ObjectNameDico.IsExist(pSmallSceneAnim->Tracks->TracksPtrs[i].Name);
if (ObjectREF != -1)
{
MATRIX M2S;
ObjectREF = pSmallScene->ObjectNameDico.mpst_Dico[ObjectREF].AssociatedValue;
if (pSmallScene->ObjectsPtrs[ObjectREF])
{
if (pSmallSceneAnim->Tracks->TracksPtrs[i].Get((u32)Time,&M2S))
{
M2S.T *= 0.01f;
if (BlendFactor != 1.0f)
{
Quat SRC,DST;
Vector TS,TD;
Vector Scale;
Scale.x = pSmallScene->ObjectsPtrs[ObjectREF]->OriginalGlobalMatrix.I.Norm();
Scale.y = pSmallScene->ObjectsPtrs[ObjectREF]->OriginalGlobalMatrix.J.Norm();
Scale.z = pSmallScene->ObjectsPtrs[ObjectREF]->OriginalGlobalMatrix.K.Norm();
TS = M2S.T;
TD = pSmallScene->ObjectsPtrs[ObjectREF]->GlobalMatrix.T;
SRC.ComputeFromMatrix(&M2S);
DST.ComputeFromMatrix(&pSmallScene->ObjectsPtrs[ObjectREF]->GlobalMatrix);
SRC *= BlendFactor;
DST *= 1.0f - BlendFactor;
DST += SRC;
DST.Normalize();
TS *= BlendFactor;
TD *= 1.0f - BlendFactor;
TD += TS;
DST.TransforToMatrix(&pSmallScene->ObjectsPtrs[ObjectREF]->GlobalMatrix);
pSmallScene->ObjectsPtrs[ObjectREF]->GlobalMatrix.T = TD;
pSmallScene->ObjectsPtrs[ObjectREF]->GlobalMatrix.I *= Scale.x;
pSmallScene->ObjectsPtrs[ObjectREF]->GlobalMatrix.J *= Scale.y;
pSmallScene->ObjectsPtrs[ObjectREF]->GlobalMatrix.K *= Scale.z;
} else
{
Vector Scale;
Scale.x = pSmallScene->ObjectsPtrs[ObjectREF]->OriginalGlobalMatrix.I.Norm();
Scale.y = pSmallScene->ObjectsPtrs[ObjectREF]->OriginalGlobalMatrix.J.Norm();
Scale.z = pSmallScene->ObjectsPtrs[ObjectREF]->OriginalGlobalMatrix.K.Norm();
pSmallScene->ObjectsPtrs[ObjectREF]->GlobalMatrix = M2S;//*/
pSmallScene->ObjectsPtrs[ObjectREF]->GlobalMatrix.I *= Scale.x;
pSmallScene->ObjectsPtrs[ObjectREF]->GlobalMatrix.J *= Scale.y;
pSmallScene->ObjectsPtrs[ObjectREF]->GlobalMatrix.K *= Scale.z;//*/
}
}
/* Recompute Local Matrix (!! track are SORTED from father to child !!)*/
u32 Father,Current;
Father = pSmallScene->ObjectsPtrs[ObjectREF]->FatherIndex;
if (Father != -1)
{
MATRIX mFi;
pSmallScene->ObjectsPtrs[Father]->GlobalMatrix.Inverse(mFi);
pSmallScene->ObjectsPtrs[ObjectREF]->LocalMatrix = pSmallScene->ObjectsPtrs[ObjectREF]->GlobalMatrix ;
pSmallScene->ObjectsPtrs[ObjectREF]->LocalMatrix *= mFi;
} else
{
MATRIX mFi;
pSmallScene->RootMatrix.Inverse(mFi);
pSmallScene->ObjectsPtrs[ObjectREF]->LocalMatrix = pSmallScene->ObjectsPtrs[ObjectREF]->GlobalMatrix ;
pSmallScene->ObjectsPtrs[ObjectREF]->LocalMatrix *= mFi;
}
}
}
}
//ComputeSmallSceneHierarchie_Local(pSmallScene);
ComputeSmallSceneHierarchie(pSmallScene);
}
}
if ((pSmallSceneAnim) && (pSmallSceneAnim->TimeLineInMS <= Time))
return 1;
else
return 0;
}