/**********************************/ /*** SpongeBob 3d Actor Creator ***/ /**********************************/ #include "stdio.h" #include #include #include #include #include #include #include "MkActor3d.h" using namespace std; //*************************************************************************** vector ActorList; int TPBase=-1,TPWidth=-1,TPHeight=-1; GString TPOutStr; //std::vector ExtraTex; CTexGrab CMkActor3d::TexGrab; //*************************************************************************** char * CycleCommands(char *String,int Num) { char Text[2048],*TextPtr; int Count; if (String[0]=='-' || String[0]=='/') { GString TpStr; switch (String[1]) { // Switches case 'o': OutStr = CheckFileString(String); OutStr.Upper(); OutStr.Append('/'); break; case 'i': IncludeFile = CheckFileString(String); IncludeFile.Upper(); IncludeFile.Append('/'); break; case 'd': DebugOn =true; break; case 's': TpStr= CheckFileString(String); Scale=atof(TpStr); break; case 'g': TPOutStr= CheckFileString(String); break; case 't': TpStr= CheckFileString(String); TextPtr=Text; strcpy(TextPtr,TpStr); Count=ZeroAndCountCommas(TextPtr); if (Count!=2) GObject::Error(ERR_FATAL,"Problem with option %s\n",String); TPBase=atol(TextPtr); TextPtr+=strlen(TextPtr)+1; TPWidth=atol(TextPtr); TextPtr+=strlen(TextPtr)+1; TPHeight=atol(TextPtr); break; case 'q': StripLength=4; break; default: GObject::Error(ERR_FATAL,"Unknown switch %s",String); break; } } else { GString UpperName(String); UpperName.Upper(); MyFiles.AddFile(UpperName); } return(String); } //*************************************************************************** void Usage(char *ErrStr) { printf("\nMkActor3d (usese scripts): by Dave\n"); printf("Usage: MkActor3d [ .. ] [ switches.. ]\n"); printf("Switches:\n"); printf(" -o:[FILE] Set output Dir\n"); printf(" -s:nn Set Scaling value\n"); printf(" -t:p,w,h Set TPage No,Width,Height\n"); printf(" -d: Enable Debug output\n"); printf(" -q: Enable Quadding\n"); GObject::Error(ERR_FATAL,ErrStr); } //*************************************************************************** int main (int argc, char *argv[]) { int i,ListSize; CommandLine(argc,argv,CycleCommands); if (OutStr.Empty()) Usage("No Output File Set\n"); vector const &Files = MyFiles.GetFileInfoVector(); for (i=0; i &List) { char *Script,*Ptr; int Size; File=fopen(Filename,"rb"); if (!File) return; fseek(File,0,SEEK_END); Size=ftell(File); fseek(File,0,SEEK_SET); Script=(char*)malloc(Size+1); // Load It fread(Script,Size,1,File); fclose(File); // Extract Names Ptr=Script; Script[Size]=0; while (*Ptr) { GString Str; while (*Ptr=='\n' || *Ptr=='\r'|| *Ptr==' ') *Ptr++; // Skip gaff if (*Ptr) { if (*Ptr=='#') { // Skip commented lines while (*Ptr!='\n' && *Ptr) Ptr++; } else { // Read data while (*Ptr!=' ' && *Ptr!='\n' && *Ptr!='\r' && *Ptr) { Str.Append(*Ptr++); } List.push_back(Str); } } } free(Script); } //*************************************************************************** //*************************************************************************** //*************************************************************************** void CMkActor3d::BuildBoneOut(sBone &OutBone,CNode const &InNode,int ParentBoneIdx) { OutBone.BoneSize.vx =round(InNode.Pos.x*Scale); OutBone.BoneSize.vy =round(InNode.Pos.y*Scale); OutBone.BoneSize.vz =round(InNode.Pos.z*Scale); OutBone.Parent=ParentBoneIdx; OutBone.VtxCount=0; OutBone.TriCount=0; OutBone.TriStart=0; } //*************************************************************************** void CMkActor3d::ProcessSkel(int Idx,int ParentIdx) { CNode &ThisNode=Scene.GetNode(Idx); CNode &ParentNode=Scene.GetNode(ThisNode.ParentIdx); vector const &NodeTriList = ThisNode.GetTris(); vector const &NodeVtxList = ThisNode.GetPts(); vector const &NodeMatList = ThisNode.GetTriMaterial(); vector const &NodeUVList = ThisNode.GetUVTris(); vector const &SceneTexList= Scene.GetTexList(); vector const &SceneUsedMatList=Scene.GetUsedMaterialIdx(); int TriCount=NodeTriList.size(); int ThisIdx=Skel.size(); sGinSkel &ParentBone=Skel[ParentIdx]; vector VtxList; if (!TriCount) { // Its a Bone!! sGinSkel ThisBone; BuildBoneOut(ThisBone.Bone,ThisNode,ParentIdx); int WeightCount=ThisNode.Weights.size(); if (WeightCount) { // printf("%s %i\n",ThisNode.Name,WeightCount); for (int i=0; iSceneTexList.size()) GObject::Error(ERR_FATAL,"Crap Material ID, wanted %i, only have %i\n",Mat,SceneTexList.size()); GString TexName=InPath+SceneTexList[Mat]; Scale*=16;; ParentBone.FaceList.AddFace( VtxList, NodeTriList[T], NodeUVList[T], TexName,0,false); Scale/=16;; } } int ChildCount=ThisNode.GetPruneChildCount(); for (int Loop=0;Loop const &InList,vector &OutList) { int i,ListSize=InList.size(); int S=16; OutList.resize(ListSize); if (!ListSize) return; printf("Rescale Factor %i\n",S); for (i=0; i VtxList; Rescale(FaceList.GetVtxList(),VtxList); FileHdr.VtxList=(sVtx*)FaceList.WriteVtxList(File,VtxList); printf("V:%i\t",FileHdr.VtxCount); // Write TexList FileHdr.TexInfo=(sTexInfo*)WriteTexInfoList(); // Write anims AnimWrite(); // Rewrite Header fseek(File, 0, SEEK_SET); fwrite(&FileHdr,1,sizeof(sActorHdr),File); fclose(File); AnimWriteInclude(); } //*************************************************************************** void CalcTPXY(sTexOutInfo const &In,sTexInfo &Out) { int TPage=In.Tpage; int X,Y,W,H; int PixPerWord; X=(u8)In.u; Y=(u8)In.v; W=(u8)In.w; H=(u8)In.h; switch (((TPage)>>7)&0x003) { case 0: PixPerWord=4; break; case 1: PixPerWord=2; break; case 2: PixPerWord=1; break; default: GObject::Error(ERR_FATAL,"Unknown Pixel Depth"); break; }; X/=PixPerWord; W/=PixPerWord; Out.x=(TPage<<6)&0x7c0; Out.x+=X; Out.y=(TPage<<4)&0x100; Out.y+=Y; Out.w=W; Out.h=H; } //*************************************************************************** int CMkActor3d::WriteTexInfoList() { std::vector &TexList=TexGrab.GetTexInfo(); int ListSize=TexList.size(); int Pos=ftell(File); for (int i=0; i const &NodeAnim=ThisNode.GetAnim(); int FrameCount=NodeAnim.size(); vector &Move=ThisAnim.Move; Move.resize(FrameCount); for (int i=0; i const &NodeAnim=ThisNode.GetAnim(); int FrameCount=NodeAnim.size(); // if (!ThisNode.Pts.size()) // Dont export Skin as bone if (!ThisNode.GetTris().size()) // Dont export Skin as bone { sBoneAnim FrameList; FrameList.Idx.resize(FrameCount); for (int i=0; i