265 lines
7.4 KiB
C++
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;
|
|
}
|
|
|