diff --git a/Utils/Libs/DaveLib/DaveLib.cpp b/Utils/Libs/DaveLib/DaveLib.cpp index 5b230c4be..0b6443eda 100644 --- a/Utils/Libs/DaveLib/DaveLib.cpp +++ b/Utils/Libs/DaveLib/DaveLib.cpp @@ -14,6 +14,7 @@ #include #include "psxtypes.h" #include "FaceStore.h" +#include #include "..\..\..\tools\data\include\dStructs.h" @@ -100,3 +101,50 @@ int NumOfCommas=0; return(NumOfCommas); } +//*************************************************************************** +char *FindFile(const char *Name) +{ +int Handle; +GFName DirName(Name); +GString Filename,Path; +_finddata_t FindBlock; +int Status; + +// Does this file exist +FILE *File=fopen(Name,"rb"); + if (File) + { + fclose(File); + return((char*)Name); + } + +// Recurse dirs to find file + Filename=DirName.File(); + Filename+="."; + Filename+=DirName.Ext(); + DirName.File("*"); + DirName.Ext("*"); + Path=DirName.FullName(); + + Name=0; + Status=Handle= _findfirst(Path,&FindBlock); + + while (Status!=-1 && !Name) + { + if (FindBlock.attrib&_A_SUBDIR) + { + if (strcmp(FindBlock.name,".") && strcmp(FindBlock.name,"..")) + { + GString NewName; + NewName=DirName.Drive(); + NewName+=DirName.Dir(); + NewName+=FindBlock.name; + NewName+="/"; + NewName+=Filename; + Name=FindFile(NewName); + } + } + if (!Name) Status=_findnext(Handle,&FindBlock); + } + return((char*)Name); +} diff --git a/Utils/Libs/DaveLib/DaveLib.h b/Utils/Libs/DaveLib/DaveLib.h index d5e0b1c7f..f6a61c129 100644 --- a/Utils/Libs/DaveLib/DaveLib.h +++ b/Utils/Libs/DaveLib/DaveLib.h @@ -65,5 +65,7 @@ int round(float f); void alignFile( FILE *f, int align ); +char *FindFile(const char *Name); + //*************************************************************************** #endif \ No newline at end of file diff --git a/Utils/Libs/DaveLib/facestore.cpp b/Utils/Libs/DaveLib/facestore.cpp index 35182537e..81c201f8a 100644 --- a/Utils/Libs/DaveLib/facestore.cpp +++ b/Utils/Libs/DaveLib/facestore.cpp @@ -190,21 +190,27 @@ CFace &F = FaceList[ListSize]; int CFaceStore::AddTex(GString const &TexName) { int ListSize=TexList.size(); -GString UpperName=TexBasePath+TexName; - UpperName.Upper(); +GString Filename=TexName; + Filename.Upper(); for (int i=0; iAddFile(UpperName); + New.TexGrabId=TexGrab->AddFile(Filename); return(New.TexGrabId); } diff --git a/Utils/Libs/DaveLib/facestore.h b/Utils/Libs/DaveLib/facestore.h index e9746379c..f5c0ece95 100644 --- a/Utils/Libs/DaveLib/facestore.h +++ b/Utils/Libs/DaveLib/facestore.h @@ -75,7 +75,7 @@ public: void SetTexGrab(CTexGrab &NewGrab) {TexGrab=&NewGrab;} int AddTex(GString const &TexName); - void SetTexBasePath(GString &Path) {TexBasePath=Path;} + void SetTexOut(GString &Name,int TPBase,int TPW,int TPH) {TexGrab->SetOutFile(Name); TexGrab->SetTPage(TPBase,TPW,TPH);} void SetTexInclude(GString &Name) {TexGrab->SetIncFile(Name);} void SetTexDebug(bool f) {TexGrab->SetDebug(f);} @@ -137,7 +137,6 @@ private: vector FaceList; vector TexList; CTexGrab FaceStoreTexGrab,*TexGrab; - GString TexBasePath; vector TriFaceList; vector QuadFaceList; diff --git a/Utils/MkActor3d/MkActor3d.cpp b/Utils/MkActor3d/MkActor3d.cpp index 752fceba3..1731bfb7f 100644 --- a/Utils/MkActor3d/MkActor3d.cpp +++ b/Utils/MkActor3d/MkActor3d.cpp @@ -38,12 +38,12 @@ int Count; case 'o': OutStr = CheckFileString(String); OutStr.Upper(); - OutStr.Append('\\'); + OutStr.Append('/'); break; case 'i': IncludeFile = CheckFileString(String); IncludeFile.Upper(); - IncludeFile.Append('\\'); + IncludeFile.Append('/'); break; case 'd': DebugOn =true; @@ -167,6 +167,7 @@ GString IncName; TexGrab.AnimatedHeadersOnly(true); TexGrab.DontOutputBoxes(true); TexGrab.AllowRotate(true); + TexGrab.FileRecursion(true); } //*************************************************************************** @@ -290,8 +291,8 @@ Matrix4x4 PMtx=ParentNode.Mtx; int Mat=SceneUsedMatList[NodeMatList[T]]; if (Mat>SceneTexList.size()) GObject::Error(ERR_FATAL,"Crap Material ID, wanted %i, only have %i\n",Mat,SceneTexList.size()); - - ParentBone.FaceList.AddFace( VtxList, NodeTriList[T], NodeUVList[T], SceneTexList[Mat]); + GString TexName=InPath+SceneTexList[Mat]; + ParentBone.FaceList.AddFace( VtxList, NodeTriList[T], NodeUVList[T], TexName); } } @@ -345,7 +346,6 @@ int ListSize=Skel.size(); void CMkActor3d::ActorProcess() { FaceList.SetTexGrab(TexGrab); - FaceList.SetTexBasePath(InPath); ProcessSkel(1,-1); BuildSkelOut(); @@ -354,9 +354,10 @@ void CMkActor3d::ActorProcess() int ListSize=InTexList.size(); for (int i=0; i &TexList=TexGrab.GetTexInfo(); int ListSize=TexList.size(); int Pos=ftell(File); @@ -456,6 +456,7 @@ int Pos=ftell(File); sTexInfo OutTex; CalcTPXY(TexList[i],OutTex); +// printf("%i %i %i %i\n",OutTex.x,OutTex.y,OutTex.w,OutTex.h); fwrite(&OutTex, sizeof(sTexInfo), 1, File); } // printf("%i Materials\n",ListSize);