/**************/ /*** Export ***/ /**************/ #include "stdafx.h" #include <Vector> #include "LayerTile.h" #include "Map.h" #include "utils.h" #include "Core.h" #include "TexCache.h" #include "TileSet.h" #include "Elem.h" #include "Layer.h" #include "LayerTile.h" #include "Export.h" /*****************************************************************************/ /*****************************************************************************/ /*****************************************************************************/ CExport::CExport(char *Filename) { File=fopen(Filename,"wb"); // Write Dummy File Header fwrite(&FileHdr,sizeof(sExpFileHdr),1,File); // Add blank tile sExpTile BlankElem={0,0,0,0,0,0,0}; AddTile(BlankElem); } /*****************************************************************************/ CExport::~CExport() { int LayerCount=LayerOfs.size(); FileHdr.LayerCount=LayerCount; for (int i=0;i<LayerCount; i++) { FileHdr.LayerOfs[i]=LayerOfs[i]; } // ReWrite Main Header fseek(File,0,0); fwrite(&FileHdr,sizeof(sExpFileHdr),1,File); fclose(File); } /*****************************************************************************/ void CExport::Write(void *Addr,int Len) { fwrite(Addr,Len,1,File); } /*****************************************************************************/ int CExport::ExportLayerHeader(int Type,int SubType,int Width,int Height) { sExpLayerHdr LayerHdr; int ThisFilePos=ftell(File); LayerOfs.push_back(ThisFilePos); LayerHdr.Type=Type; LayerHdr.SubType=SubType; LayerHdr.Width=Width; LayerHdr.Height=Height; fwrite(&LayerHdr,sizeof(sExpLayerHdr),1,File); return(ThisFilePos); } /*****************************************************************************/ /*** Tiles *******************************************************************/ /*****************************************************************************/ void CExport::ExportTiles(CCore *Core) { int ListSize,i; CTileBank *TileBank=Core->GetTileBank(); //!! FileHdr.TileW=TileBank->GetTile(0,0).GetElemWidth(); //!! FileHdr.TileH=TileBank->GetTile(0,0).GetElemHeight(); FileHdr.TileW=16; FileHdr.TileH=16; // Write Tiles ListSize=UsedTileList.size(); FileHdr.TileCount=ListSize; FileHdr.TileOfs=ftell(File); for (i=0; i<ListSize; i++) { ExportTile(Core,UsedTileList[i]); } // Write Tris ListSize=TriList.size(); FileHdr.TriCount=ListSize; FileHdr.TriOfs=ftell(File); for (i=0; i<ListSize; i++) { fwrite(&TriList[i],sizeof(sExpTri),1,File); } } /*****************************************************************************/ void CExport::ExportTile(CCore *Core,sExpTile &OutTile) { CTileBank *TileBank=Core->GetTileBank(); if (OutTile.Set==0 && OutTile.Tile==0) { char c=0; fwrite(&OutTile,sizeof(sExpTile),1,File); fwrite(&c,1,16*16*3,File); // Write RGB } else { CElem &ThisTile=TileBank->GetElem(OutTile.Set,OutTile.Tile); GString SetName=TileBank->GetSetFilename(OutTile.Set); ASSERT(ThisTile.GetElemWidth()==FileHdr.TileW); ASSERT(ThisTile.GetElemHeight()==FileHdr.TileH); if (ThisTile.IsElem3d()) ExportTile3d(Core,ThisTile,OutTile); OutTile.Set=SetNames.Add(SetName); fwrite(&OutTile,sizeof(sExpTile),1,File); fwrite(ThisTile.GetElemRGB(),FileHdr.TileW*FileHdr.TileH*3,1,File); // Write RGB } } /*****************************************************************************/ void CExport::ExportTile3d(CCore *Core,CElem &ThisTile,sExpTile &OutTile) { CTexCache &TexCache=Core->GetTexCache(); std::vector<sTriFace> &TileTriList=ThisTile.GetTriList(); int TriCount=TileTriList.size(); OutTile.TriStart=TriList.size(); OutTile.TriCount=TriCount; for (int T=0; T<TriCount; T++) { sTriFace &InTri=TileTriList[T]; sExpTri OutTri; GString TexName=TexCache.GetTexFilename(InTri.Mat); OutTri.TexID=TexNames.Add(TexName); for (int p=0; p<3; p++) { OutTri.vtx[p]=InTri.vtx[p]; OutTri.uv[p][0]=InTri.uvs[p].u; OutTri.uv[p][1]=InTri.uvs[p].v; } TriList.push_back(OutTri); } } /*****************************************************************************/ void CExport::ExportStrList(CCore *Core) { int ListSize,i; GString SavePath=GetWorkingPath(); char RelStr[256]; SavePath.Upper(); // Set List ListSize=SetNames.size(); FileHdr.SetNameCount=ListSize; FileHdr.SetNameOfs=ftell(File); for (i=0; i<ListSize; i++) { GString &ThisFile=SetNames[i]; ThisFile.Upper(); GFName::makerelative(SavePath,ThisFile,RelStr); fwrite(RelStr,strlen(RelStr)+1,1,File); TRACE2("Set %i:%s\n",i,RelStr); } // Tex List ListSize=TexNames.size(); FileHdr.TexNameCount=ListSize; FileHdr.TexNameOfs=ftell(File); for (i=0; i<ListSize; i++) { GString &ThisFile=TexNames[i]; ThisFile.Upper(); GFName::makerelative(SavePath,ThisFile,RelStr); fwrite(RelStr,strlen(RelStr)+1,1,File); TRACE2("Tex %i:%s\n",i,RelStr); } } /*****************************************************************************/