diff --git a/Utils/MapEdit/Core.cpp b/Utils/MapEdit/Core.cpp index 068aae964..e561f54cd 100644 --- a/Utils/MapEdit/Core.cpp +++ b/Utils/MapEdit/Core.cpp @@ -27,7 +27,6 @@ #include "Export.h" #include "LayerList.h" -const Vector3 DefaultCamPos(0.0f,0.0f,0.9f); /*****************************************************************************/ /*****************************************************************************/ @@ -36,12 +35,12 @@ CCore::CCore() { CurrentMousePos=CPoint(0,0); MapCam=DefaultCamPos; - TileCam=DefaultCamPos; SpareFlag=false; GridFlag=true; Is3dFlag=true; CurrentView=NULL; CursorPos.x=CursorPos.y=0; + CurrentLayer=0; } @@ -86,10 +85,10 @@ void CCore::Load(CFile *File) { int Version,i; BOOL F; - +Vector3 DuffVector; File->Read(&Version,sizeof(int)); if (Version>100000) Version=1; // Check fix for changing version to int from float - +#ifndef _DEBUG if (VersionRead(&MapCam,sizeof(Vector3)); - File->Read(&MapCamOfs,sizeof(Vector3)); - File->Read(&TileCam,sizeof(Vector3)); - File->Read(&TileCamOfs,sizeof(Vector3)); + if (VersionRead(&MapCamOfs,sizeof(Vector3)); + File->Read(&DuffVector,sizeof(Vector3)); + File->Read(&DuffVector,sizeof(Vector3)); + } File->Read(&F,sizeof(BOOL)); SpareFlag=F!=0; File->Read(&F,sizeof(BOOL)); GridFlag=F!=0; @@ -161,9 +164,6 @@ BOOL F; File->Write(&FileVersion,sizeof(int)); File->Write(&MapCam,sizeof(Vector3)); - File->Write(&MapCamOfs,sizeof(Vector3)); - File->Write(&TileCam,sizeof(Vector3)); - File->Write(&TileCamOfs,sizeof(Vector3)); F=SpareFlag; File->Write(&F,sizeof(BOOL)); F=GridFlag; File->Write(&F,sizeof(BOOL)); @@ -182,7 +182,12 @@ int LayerCount=Layer.size(); Layer[i]->Save(File); } GetTileBank()->Save(File); - +/* +CString a=File->GetFilePath(); +char Txt[256]; + sprintf(Txt,"%s",a); + Export(Txt); +*/ } /*****************************************************************************/ @@ -209,14 +214,14 @@ Vector3 &ThisCam=GetCam(); UpdateAll(); return; } - if (GetTileBank()->NeedLoad()) GetTileBank()->LoadTileSets(this); +// if (GetTileBank()->NeedLoad()) GetTileBank()->LoadAllSets(this); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear Screen - if (CurrentLayer!=Layer[ActiveLayer] || CurrentLayer->IsUnique()) + if (IsSubView() || CurrentLayer->IsUnique()) { CurrentLayer->Render(this,ThisCam,Is3dFlag); - CurrentLayer->RenderGrid(this,ThisCam,true); + if (GridFlag) CurrentLayer->RenderGrid(this,ThisCam,true); CurrentLayer->FindCursorPos(this,GetCam(),CurrentMousePos); } else @@ -398,7 +403,7 @@ bool RedrawFlag=false; break; } -/* if (RedrawFlag) */RedrawView(); + RedrawView(); } @@ -454,14 +459,12 @@ int LastLayer=ActiveLayer; } else { - bool IsCol=Layer[NewLayer]->GetType()==LAYER_TYPE_COLLISION; - GetTileBank()->SetCollision(IsCol); ActiveLayer=NewLayer; } if (LastLayer!=ActiveLayer || Force) { - if (LastLayer<=LayerCount) CurrentLayer->GUIKill(this); + if (LastLayer<=LayerCount) Layer[LastLayer]->GUIKill(this); CurrentLayer=Layer[ActiveLayer]; CurrentLayer->GUIInit(this); GUIUpdate(); @@ -487,7 +490,6 @@ int Idx=ListSize; Layer.insert(Layer.begin() + Idx,NewLayer); if (NewLayer->GetType()==LAYER_TYPE_TILE && NewLayer->GetSubType()==LAYER_SUBTYPE_ACTION) ActionLayer=(CLayerTile*)NewLayer; - NewLayer->InitSubView(this); return(Idx); } @@ -511,6 +513,7 @@ int Idx; ASSERT(!"AddLayer - Invalid Layer Type"); break; } + if (ActionLayer) Layer[Idx]->InitSubView(this); return(Idx); } @@ -549,23 +552,25 @@ int Idx=AddLayer(CLayer::InfoTable[NewLayerId].Type,CLayer::InfoTable[NewLayerI } /*****************************************************************************/ -void CCore::DeleteLayer(int CurrentLayer) +void CCore::DeleteLayer(int ThisLayer) { - if (Layer[CurrentLayer]->CanDelete()) + + if (Layer[ThisLayer]->CanDelete()) { - Layer[CurrentLayer]->GUIKill(this); - delete Layer[CurrentLayer]; - Layer.erase(Layer.begin() + CurrentLayer); - SetLayer(CurrentLayer-1,true); - TRACE1("Deleted Layer %i\n",CurrentLayer); +// Layer[CurrentLayer]->GUIKill(this); + SetLayer(ThisLayer-1,true); + delete Layer[ThisLayer]; + Layer.erase(Layer.begin() + ThisLayer); + TRACE1("Deleted Layer %i\n",ThisLayer); } else { - TRACE1("Cant Delete Layer %i\n",CurrentLayer); + TRACE1("Cant Delete Layer %i\n",ThisLayer); } } /*****************************************************************************/ +/* CLayer *CCore::FindSubView(int Type) { int i,ListSize=Layer.size(); @@ -580,7 +585,7 @@ int i,ListSize=Layer.size(); } return(0); } - +*/ /*****************************************************************************/ /*** Grid ********************************************************************/ /*****************************************************************************/ @@ -604,7 +609,7 @@ CLayer *LastLayer=CurrentLayer; LastLayer->GUIKill(this); CurrentLayer->GUIInit(this); GUIUpdate(); - RedrawView(); + UpdateView(); } } @@ -613,10 +618,12 @@ CLayer *LastLayer=CurrentLayer; /*****************************************************************************/ Vector3 &CCore::GetCam() { -// if (SubViewFlag) -// return(TileCam); -// else - return(MapCam); + if (IsSubView() || CurrentLayer->IsUnique()) + { + return(CurrentLayer->GetCam()); + } + + return(MapCam); } @@ -719,6 +726,7 @@ void CCore::RedrawView() /*****************************************************************************/ void CCore::UpdateView(Vector3 *Ofs) { + if (!CurrentLayer) return; if (Ofs) { Vector3 &ThisCam=GetCam(); @@ -726,8 +734,11 @@ void CCore::UpdateView(Vector3 *Ofs) ThisCam.x+=Ofs->x; ThisCam.y+=Ofs->y; ThisCam.z-=Ofs->z; - if (ThisCam.x<0) ThisCam.x=0; - if (ThisCam.y<0) ThisCam.y=0; + if (!IsSubView()) + { + if (ThisCam.x<0) ThisCam.x=0; + if (ThisCam.y<0) ThisCam.y=0; + } if (ThisCam.z<0.1) ThisCam.z=0.1f; } @@ -779,7 +790,6 @@ Vector3 ThisCam=Cam; ThisCam=Cam/DivVal; ThisCam.z=Cam.z; - return(ThisCam); } diff --git a/Utils/MapEdit/Core.h b/Utils/MapEdit/Core.h index 9fda2057f..8ec6877c9 100644 --- a/Utils/MapEdit/Core.h +++ b/Utils/MapEdit/Core.h @@ -19,11 +19,13 @@ #include "Layer.h" #include "LayerTile.h" -const s32 FileVersion=3; +const s32 FileVersion=4; #define SCREEN_MAP_WIDTH 30 #define SCREEN_MAP_HEIGHT 20 +const Vector3 DefaultCamPos(0.0f,0.0f,0.9f); + /*****************************************************************************/ class CMapEditView; @@ -58,8 +60,8 @@ public: // Subview & TileBank CTileBank *GetTileBank() {return(ActionLayer->GetTileBank());} void ToggleSubView(); - CLayer *FindSubView(int Type); - +// CLayer *FindSubView(int Type); + bool IsSubView() {return(CurrentLayer!=Layer[ActiveLayer]);} // GUI void UpdateParamBar(); void GUIAdd(CDialog &Dlg,int ID,bool Visible=true,bool Lock=false); @@ -117,7 +119,7 @@ private: CMapEditView *CurrentView; CPoint CurrentMousePos,LastMousePos; CPoint CursorPos,LastCursorPos; - Vector3 MapCam,TileCam; + Vector3 MapCam; Vector3 MapCamOfs,TileCamOfs; Vector3 ScaleVector; diff --git a/Utils/MapEdit/Elem.cpp b/Utils/MapEdit/Elem.cpp index c23a12d00..f310d5184 100644 --- a/Utils/MapEdit/Elem.cpp +++ b/Utils/MapEdit/Elem.cpp @@ -1,5 +1,5 @@ /*********************/ -/*** Tile Stuph ***/ +/*** Elem Stuph ***/ /*********************/ #include "stdafx.h" @@ -11,8 +11,7 @@ #include "Core.h" #include "TexCache.h" -//#include "TileSet.h" -#include "Tile.h" +#include "Elem.h" #include "GinTex.h" #include "utils.h" @@ -36,26 +35,25 @@ const float YFlipMtx[]= }; /*****************************************************************************/ -/* -CTile::CTile() +CElem::CElem(int Width,int Height) { -} -*/ -/*****************************************************************************/ -CTile::CTile(int Blank,int _Width,int _Height) -{ - Width=_Width; - Height=_Height; - PCTexID=-1; - PCTexRGB=(u8*)malloc(Width*Height*3); - memset(PCTexRGB,0,Width*Height*3); - Tex2dID=-1; - Type=TileType2d; + ElemWidth=Width; + ElemHeight=Height; + UnitWidth=ElemWidth/UnitSize; + UnitHeight=ElemHeight/UnitSize; + ElemID=-1; + ElemRGB=(u8*)malloc(ElemWidth*ElemHeight*3); + memset(ElemRGB,0,ElemWidth*ElemHeight*3); + + Type=ElemType2d; + TexXOfs=0; + TexYOfs=0; + CreateBlankTileGfx(); } /*****************************************************************************/ -// 3d tile (From Gin File) -CTile::CTile(CCore *Core,const char *Filename,CScene &ThisScene,int Node) +// 3d Elem (From Gin File) +CElem::CElem(CCore *Core,const char *Filename,CScene &ThisScene,int Node) { CNode &ThisNode=ThisScene.GetNode(Node); CTexCache &TexCache=Core->GetTexCache(); @@ -65,36 +63,50 @@ GFName Path=Filename; SetPath+=Path.Dir(); SetPath.Append('\\'); - Type=TileType3d; + Type=ElemType3d; TexXOfs=-1; TexYOfs=-1; - Build3dTile(TexCache,ThisScene,Node); + Build3dElem(TexCache,ThisScene,Node); + Calc3dSize(); Ofs.x=+0.5f; Ofs.y=0; Ofs.z=+4.0f; - Build3dDrawList(TexCache,DrawList[TileType3d]); + Build3dDrawList(TexCache,DrawList[ElemType3d]); Create2dTexture(TexCache,Path.File(),Node); - Build2dDrawList(TexCache,DrawList[TileType2d]); + Build2dDrawList(TexCache,DrawList[ElemType2d]); + if (!ValidFlag) CreateInvalidTileGfx(); + } /*****************************************************************************/ -// 2d tile (From Bmp File) -CTile::CTile(CCore *Core,const char *Filename,int TexID,int XOfs,int YOfs) +// 2d Elem (From Bmp File) +CElem::CElem(CCore *Core,const char *Filename,int TexID,int XOfs,int YOfs,int Width,int Height) { CTexCache &TexCache=Core->GetTexCache(); GFName Path=Filename; - Type=TileType2d; + ElemWidth=Width; + ElemHeight=Height; + UnitWidth=ElemWidth/UnitSize; + UnitHeight=ElemHeight/UnitSize; + + Type=ElemType2d; TexXOfs=XOfs; TexYOfs=YOfs; - - Build2dTile(Core,Path.File(),TexID); + Build2dElem(Core,Path.File(),TexID); Ofs.Zero(); - Build3dDrawList(TexCache,DrawList[TileType3d]); + Build3dDrawList(TexCache,DrawList[ElemType3d]); Create2dTexture(TexCache,Path.File(),TexID); - Build2dDrawList(TexCache,DrawList[TileType2d]); + Build2dDrawList(TexCache,DrawList[ElemType2d]); + if (!ValidFlag) CreateInvalidTileGfx(); } /*****************************************************************************/ -void CTile::Build2dTile(CCore *Core,const char *Filename,int TexID) +void CElem::CleanUp() +{ + free(ElemRGB); +} + +/*****************************************************************************/ +void CElem::Build2dElem(CCore *Core,const char *Filename,int TexID) { const Vector3 P0(0.0f,0.0f,0.0f); const Vector3 P1(1.0f,0.0f,0.0f); @@ -111,11 +123,10 @@ sTex &ThisTex=TexCache.GetTex(TexID); float u0,u1,v0,v1; - Tex2dID=TexID; u0=(TexXOfs)*ThisTex.dW; u1=u0+ThisTex.dW; - v0=(((ThisTex.TexHeight/16)-(TexYOfs+1))*ThisTex.dH); + v0=(((ThisTex.TexHeight/UnitSize)-(TexYOfs+1))*ThisTex.dH); v1=v0+ThisTex.dH; Tri0.Mat=TexID; @@ -137,7 +148,7 @@ float u0,u1,v0,v1; } /*****************************************************************************/ -void CTile::Build3dTile(CTexCache &TexCache,CScene &ThisScene,int Node) +void CElem::Build3dElem(CTexCache &TexCache,CScene &ThisScene,int Node) { CNode &ThisNode=ThisScene.GetNode(Node); int ChildCount=ThisNode.GetChildCount(); @@ -170,7 +181,7 @@ int ListSize=TriList.size(); ThisName=SetPath+TexList[TexID]; TexID=TexCache.ProcessTexture(ThisName,MatList[ThisMat].Flags); } -// Sort Rest +// Sort Rest of Tri info for (int p=0; p<3; p++) { Tri.vtx[p]=NodeVtxList[ThisTri.p[p]]; @@ -180,29 +191,58 @@ int ListSize=TriList.size(); } } - for (int Child=0; ChildTri.vtx[p].x) XMin=Tri.vtx[p].x; + if (XMaxTri.vtx[p].y) YMin=Tri.vtx[p].y; + if (YMax> PC_TILE_FLAG_COLLISION_SHIFT; } glEnable(GL_TEXTURE_2D); - glCallList(DrawList[Render3d]); + if (Render3d) + { + glEnable(GL_DEPTH_TEST); + glCallList(DrawList[ElemType3d]); + glDisable(GL_DEPTH_TEST); + } + else + { + glCallList(DrawList[ElemType2d]); + } glDisable(GL_TEXTURE_2D); glPopMatrix(); } /*****************************************************************************/ -void CTile::Purge() +void CElem::Purge() { - glDeleteLists(DrawList[TileType3d],1); - glDeleteLists(DrawList[TileType2d],1); + for (int i=0; iGetTexCache(); +int TexID=TexCache.ProcessTexture(Filename,0); +sTex &ThisTex=TexCache.GetTex(TexID); +int Width=ThisTex.TexWidth/DefWidth; +int Height=ThisTex.TexHeight/DefHeight; + + ElemList.push_back(CElem(DefWidth,DefHeight)); // Insert Blank + + for (int Y=0; YListSize) return(false); + return(ElemList[No].IsValid()); +} + +/*****************************************************************************/ +/*****************************************************************************/ +/*** Elem Bank ***************************************************************/ +/*****************************************************************************/ +/*****************************************************************************/ +/*****************************************************************************/ +CElemBank::CElemBank() +{ + LoadFlag=FALSE; +} + +/*****************************************************************************/ +CElemBank::~CElemBank() +{ +} + +/*****************************************************************************/ +void CElemBank::Load(CFile *File,int Version) +{ +int ListSize; +GFName RootPath=File->GetFilePath(); +GString FilePath; +char FixPath[1024]; + + FilePath=RootPath.Drive(); + FilePath+=RootPath.Dir(); + FilePath.Append('\\'); + FilePath.Upper(); + + File->Read(&ListSize,sizeof(int)); + +// New Style rel storage + for (int i=0;iRead(&c,1); + FullName.Append(c); + } + FullName.Upper(); + GFName::makeabsolute(FilePath,FullName,FixPath); + FullName=FixPath; + _fullpath( FixPath, FullName, 1024); + for (int z=0; zGetFilePath(); +GString SavePath; + + SavePath=RootPath.Drive(); + SavePath+=RootPath.Dir(); + SavePath.Append('\\'); + + SavePath.Upper(); + + File->Write(&ListSize,sizeof(int)); + + for (int i=0; iWrite(Filename,strlen(Filename)+1); + } + +} + +/*****************************************************************************/ +void CElemBank::AddSet(const char *Filename) +{ +int ListSize=SetList.size(); +CElemSet NewSet(Filename,ListSize); + + SetList.Add(NewSet); + if (SetList.size()!=ListSize) LoadFlag=TRUE; +} + +/*****************************************************************************/ +void CElemBank::LoadAllSets(CCore *Core) +{ +int ListSize=SetList.size(); + + if (!LoadFlag) return; + + for (int i=0;i=0 && Elem>=0); + return(SetList[Set].GetElem(Elem)); +} + +/*****************************************************************************/ +bool CElemBank::IsValid(int Set,int Elem) +{ + if (Set<0 || Elem<0) return(false); + if (Elem==0) return(true); + ASSERT(Set &GetTriList() {return(TriList);} protected: void Build3dElem(CTexCache &TexCache,CScene &ThisScene,int Node); void Build2dElem(CCore *Core,const char *Filename,int TexId); -// void FixUp(); void Build3dDrawList(CTexCache &TexCache,GLint &List); void Build2dDrawList(CTexCache &TexCache,GLint &List); void RenderElem4Texture(sRGBData &RGBData); void Create2dTexture(CTexCache &TexCache,const char *Filename,int ID); bool CheckHasData(sRGBData &RGBData); - + void Calc3dSize(); GString SetPath; std::vector TriList; - Vector3 Ofs; - int Width,Height; - GLint DrawList[2]; + GLint DrawList[ElemTypeMax]; ElemType Type; bool ValidFlag; int TexXOfs,TexYOfs; - int Tex2dID; -// char PCTexName[256]; - int PCTexID; - u8 *PCTexRGB; + int ElemWidth,ElemHeight; + float UnitWidth,UnitHeight; + int ElemID; + u8 *ElemRGB; + +}; + +/*****************************************************************************/ +class CElemSet +{ +public: + enum + { + DEF_ELEMWIDTH=16, + DEF_ELEMHEIGHT=16, + DEF_ELEMBROWSWEWIDTH=8, + }; + + CElemSet(const char *_Filename,int Idx,int Width=DEF_ELEMWIDTH,int Height=DEF_ELEMHEIGHT); + ~CElemSet(); + + int IsLoaded() {return(Loaded);} + int GetCount() {return(ElemList.size());} + + void Load(CCore *Core); + +const char *GetFilename() {return(Filename);} +const char *GetName() {return(Name);} + int GetBrowserWidth() {return(ElemBrowserWidth);} + + void RenderElem(int Elem,int Flags,bool Render3d) {ElemList[Elem].Render(Flags,Render3d);} + CElem &GetElem(int No) {return(ElemList[No]);} + void Purge(); + bool IsValid(int No); + + bool operator==(CElemSet const &v1) {return (Name==v1.Name);} + +private: + void Load2d(CCore *Core); + void Load3d(CCore *Core); + + CPoint GetElemPos(int ID); + + GString Filename,Name; + + int SetNumber; + int DefWidth,DefHeight; + CList ElemList; + bool Loaded; + int ElemBrowserWidth; +}; + +/*****************************************************************************/ +class CElemBank +{ +public: + CElemBank(); + ~CElemBank(); + + void Load(CFile *File,int Version); + void Save(CFile *File); + + void AddSet(const char *Filename); + void LoadAllSets(CCore *Core); + void LoadNewSet(CCore *Core); + void ReloadAllSets(); + void DeleteSet(int Set); + int NeedLoad() {return(LoadFlag);} + CElem &GetElem(int Set,int Elem); + bool IsValid(int Set,int Elem); + + int GetSetCount() {return(SetList.size());} + + +protected: + + CList SetList; + bool LoadFlag; }; diff --git a/Utils/MapEdit/Export.cpp b/Utils/MapEdit/Export.cpp index 5da79925d..3397b489a 100644 --- a/Utils/MapEdit/Export.cpp +++ b/Utils/MapEdit/Export.cpp @@ -13,7 +13,7 @@ #include "Core.h" #include "TexCache.h" #include "TileSet.h" -#include "Tile.h" +#include "Elem.h" #include "Layer.h" #include "LayerTile.h" @@ -30,6 +30,11 @@ CExport::CExport(char *Filename) // Write Dummy File Header fwrite(&FileHdr,sizeof(sExpFileHdr),1,File); + +// Add blank tile + +sExpTile BlankElem={0,0,0,0,0,0,0}; + AddTile(BlankElem); } /*****************************************************************************/ @@ -81,8 +86,10 @@ void CExport::ExportTiles(CCore *Core) int ListSize,i; CTileBank *TileBank=Core->GetTileBank(); - FileHdr.TileW=TileBank->GetTile(1,0).GetPCTexW(); - FileHdr.TileH=TileBank->GetTile(1,0).GetPCTexH(); +//!! 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(); @@ -108,37 +115,32 @@ CTileBank *TileBank=Core->GetTileBank(); void CExport::ExportTile(CCore *Core,sExpTile &OutTile) { CTileBank *TileBank=Core->GetTileBank(); -CTile &ThisTile=TileBank->GetTile(OutTile.Set,OutTile.Tile); -int RGBW=ThisTile.GetPCTexW(); -int RGBH=ThisTile.GetPCTexH(); -u8 *RGB=ThisTile.GetPCTexRGB(); -GString SetName=TileBank->GetSet(OutTile.Set).GetFilename(); - if (ThisTile.IsTile3d()) + if (OutTile.Set==0 && OutTile.Tile==0) { - ExportTile3d(Core,ThisTile,OutTile); + char c=0; + + fwrite(&OutTile,sizeof(sExpTile),1,File); + fwrite(&c,1,16*16*3,File); // Write RGB } else { + CElem &ThisTile=TileBank->GetTile(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 } -// change set name to set mappping - if (OutTile.Set==0) - { - SetName="BLANK"; - } - - OutTile.Set=SetNames.Add(SetName); - fwrite(&OutTile,sizeof(sExpTile),1,File); -// Write RGB - ASSERT(RGBW==FileHdr.TileW); - ASSERT(RGBH==FileHdr.TileH); - fwrite(RGB,RGBW*RGBH*3,1,File); } /*****************************************************************************/ -void CExport::ExportTile3d(CCore *Core,CTile &ThisTile,sExpTile &OutTile) +void CExport::ExportTile3d(CCore *Core,CElem &ThisTile,sExpTile &OutTile) { CTexCache &TexCache=Core->GetTexCache(); std::vector &TileTriList=ThisTile.GetTriList(); @@ -185,6 +187,7 @@ char RelStr[256]; 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(); @@ -197,6 +200,7 @@ char RelStr[256]; ThisFile.Upper(); GFName::makerelative(SavePath,ThisFile,RelStr); fwrite(RelStr,strlen(RelStr)+1,1,File); + TRACE2("Tex %i:%s\n",i,RelStr); } } diff --git a/Utils/MapEdit/Export.h b/Utils/MapEdit/Export.h index 134c34220..c84eaab68 100644 --- a/Utils/MapEdit/Export.h +++ b/Utils/MapEdit/Export.h @@ -34,8 +34,8 @@ public: protected: void ExportTile(CCore *Core,sExpTile &ThisElem); - void ExportTile3d(CCore *Core,CTile &ThisTile,sExpTile &OutTile); - void ExportTile2d(CCore *Core,CTile &ThisTile,sExpTile &OutTile); + void ExportTile3d(CCore *Core,CElem &ThisTile,sExpTile &OutTile); + void ExportTile2d(CCore *Core,CElem &ThisTile,sExpTile &OutTile); sExpFileHdr FileHdr; diff --git a/Utils/MapEdit/ExportHdr.h b/Utils/MapEdit/ExportHdr.h index 8f7bd19eb..735e26d3e 100644 --- a/Utils/MapEdit/ExportHdr.h +++ b/Utils/MapEdit/ExportHdr.h @@ -6,8 +6,6 @@ #define __EXPORT_STRUCTS_HEADER__ #include -//#include "GinTex.h" -//#include "Tile.h" #include diff --git a/Utils/MapEdit/Layer.cpp b/Utils/MapEdit/Layer.cpp index d491154c6..9a7e481d2 100644 --- a/Utils/MapEdit/Layer.cpp +++ b/Utils/MapEdit/Layer.cpp @@ -31,6 +31,7 @@ int CLayer::InfoTableSize=sizeof(InfoTable)/sizeof(sLayerInfoTable); CLayer::CLayer() { SubView=0; + LayerCam=DefaultCamPos; } /*****************************************************************************/ diff --git a/Utils/MapEdit/Layer.h b/Utils/MapEdit/Layer.h index 72e19ce4f..321b0c55c 100644 --- a/Utils/MapEdit/Layer.h +++ b/Utils/MapEdit/Layer.h @@ -78,16 +78,17 @@ virtual void GUIKill(CCore *Core)=0; virtual void GUIUpdate(CCore *Core)=0; virtual void GUIChanged(CCore *Core)=0; -virtual int GetWidth()=0; -virtual int GetHeight()=0; +virtual int GetWidth() {return(-1);} +virtual int GetHeight() {return(-1);} virtual void CheckLayerSize(int Width,int Height){}; -virtual bool Resize(int Width,int Height)=0; +virtual bool Resize(int Width,int Height) {return(false);} virtual void Load(CFile *File,int Version)=0; virtual void Save(CFile *File)=0; virtual void Export(CCore *Core,CExport &Exp)=0; +virtual Vector3 &GetCam() {return(LayerCam);} // Functions virtual bool LButtonControl(CCore *Core,UINT nFlags, CPoint &CursorPos,bool DownFlag){return(false);} @@ -103,6 +104,8 @@ protected: bool VisibleFlag; CSelect Selection; CLayer *SubView; + Vector3 LayerCam; + }; diff --git a/Utils/MapEdit/LayerCollision.cpp b/Utils/MapEdit/LayerCollision.cpp index a5ed0045f..985277243 100644 --- a/Utils/MapEdit/LayerCollision.cpp +++ b/Utils/MapEdit/LayerCollision.cpp @@ -21,6 +21,9 @@ #include "Select.h" #include "Export.h" +// Reserve slot 0 for collision :o) +GString ColFName="Collision.bmp"; + /*****************************************************************************/ /*****************************************************************************/ /*****************************************************************************/ @@ -31,6 +34,7 @@ CLayerCollision::CLayerCollision(int _SubType,int Width,int Height) SetDefaultParams(); Mode=MouseModePaint; Map.SetSize(Width,Height,TRUE); + VisibleFlag=true; } /*****************************************************************************/ @@ -43,6 +47,32 @@ CLayerCollision::CLayerCollision(CFile *File,int Version) /*****************************************************************************/ CLayerCollision::~CLayerCollision() { + delete TileBank; +} + +/*****************************************************************************/ +void CLayerCollision::InitSubView(CCore *Core) +{ + TileBank=new CTileBank; + SubView=TileBank; + +GFName ExePath; +GString Filename; + +// Get application path +#ifdef _DEBUG + ExePath="C:\\Spongebob\\tools\\mapedit\\"; +#else +char ExeFilename[2048]; + GetModuleFileName(GetModuleHandle(NULL),ExeFilename,2048); + ExePath=ExeFilename; + ExePath.File(0); + ExePath.Ext(0); +#endif + Filename=ExePath.FullName(); + Filename+=ColFName; + TileBank->AddSet(Filename); + } /*****************************************************************************/ @@ -81,7 +111,7 @@ void CLayerCollision::Render(CCore *Core,Vector3 &CamPos,bool Is3d) { Vector3 ThisCam=Core->OffsetCam(CamPos,GetScaleFactor()); - CLayerTile::Render(Core,ThisCam,Map,FALSE,0.5f); + CLayerTile::Render(Core,ThisCam,Map,false,0.5f); } /*****************************************************************************/ @@ -162,19 +192,3 @@ int Height=Map.GetHeight(); } } - -/*****************************************************************************/ -/* -void CLayerCollision::DeleteSet(int Set) -{ - Map.DeleteSet(Set); -} -*/ -/*****************************************************************************/ -/* -void CLayerCollision::RemapSet(int OrigSet,int NewSet) -{ - Map.RemapSet(OrigSet,NewSet); - -} -*/ \ No newline at end of file diff --git a/Utils/MapEdit/LayerCollision.h b/Utils/MapEdit/LayerCollision.h index 5ed6ef256..19b887400 100644 --- a/Utils/MapEdit/LayerCollision.h +++ b/Utils/MapEdit/LayerCollision.h @@ -20,6 +20,7 @@ public: ~CLayerCollision(); int GetType() {return(LAYER_TYPE_COLLISION);} + void InitSubView(CCore *Core); void Render(CCore *Core,Vector3 &CamPos,bool Is3d); @@ -38,7 +39,7 @@ public: void DeleteSet(int Set); void RemapSet(int OrigSet,int NewSet); protected: - + void InitTileBank(); CLayerCollisionGUI CollisionGUI; diff --git a/Utils/MapEdit/LayerTile.cpp b/Utils/MapEdit/LayerTile.cpp index c8b304758..a146b0535 100644 --- a/Utils/MapEdit/LayerTile.cpp +++ b/Utils/MapEdit/LayerTile.cpp @@ -110,11 +110,11 @@ void CLayerTile::Save(CFile *File) void CLayerTile::InitSubView(CCore *Core) { // Fix up shared layers - if (!SubView) + if (SubType!=LAYER_SUBTYPE_ACTION) { - SubView=Core->FindSubView(LAYER_SUBVIEW_TILEBANK); + TileBank=Core->GetTileBank(); + SubView=(CLayer*)TileBank; } - TileBank=(CTileBank*)SubView; } /*****************************************************************************/ @@ -154,16 +154,8 @@ void CLayerTile::Render(CCore *Core,Vector3 &CamPos,bool Is3d) { Vector3 ThisCam=Core->OffsetCam(CamPos,GetScaleFactor()); - if (Is3d && Render3dFlag) - { - glEnable(GL_DEPTH_TEST); - Render(Core,ThisCam,Map,TRUE); - glDisable(GL_DEPTH_TEST); - } - else - { - Render(Core,ThisCam,Map,FALSE); - } + Is3d&=Render3dFlag; + Render(Core,ThisCam,Map,Is3d); } /*****************************************************************************/ @@ -206,10 +198,12 @@ float ScrOfsX=(ZoomW/2); float ScrOfsY=(ZoomH/2); Vector3 &Scale=Core->GetScaleVector(); bool WrapMap=SubType==LAYER_SUBTYPE_BACK; -int StartX=(int)ThisCam.x; -int StartY=(int)ThisCam.y; -float ShiftX=ThisCam.x - (int)ThisCam.x; -float ShiftY=ThisCam.y - (int)ThisCam.y; +int StartX=(int)ThisCam.x; +int StartY=(int)ThisCam.y; +float ShiftX=ThisCam.x - (int)ThisCam.x; +float ShiftY=ThisCam.y - (int)ThisCam.y; + + if (TileBank->NeedLoad()) TileBank->LoadAllSets(Core); if (StartX<0) StartX=0; if (StartY<0) StartY=0; @@ -251,12 +245,10 @@ int DrawH=ZoomH+8; } sMapElem &ThisElem=ThisMap.Get(XPos,YPos); - if (ThisElem.Tile && TileBank->IsTileValid(ThisElem.Set,ThisElem.Tile)) - { // Render Non Zero Tiles - CTile &ThisTile=TileBank->GetTile(ThisElem.Set,ThisElem.Tile); - + if (ThisElem.Tile>0) + { // Render Non Zero and Valid Tiles glColor4f(1,1,1,Alpha); // Set default Color - ThisTile.Render(ThisElem.Flags,Render3d); + TileBank->RenderTile(ThisElem.Set,ThisElem.Tile,ThisElem.Flags,Render3d); } glTranslatef(1.0f,0,0); // Next X } @@ -584,6 +576,7 @@ bool Ret=false; case CmdMsg_ActiveBrushLeft: case CmdMsg_ActiveBrushRight: Ret=TileBank->Command(CmdMsg,Core,Param0,Param1); + break; default: TRACE3("LayerTile-Unhandled Command %i (%i,%i)\n",CmdMsg,Param0,Param1); } @@ -634,7 +627,6 @@ bool CLayerTile::MirrorX(CCore *Core) /*****************************************************************************/ bool CLayerTile::MirrorY(CCore *Core) { -// if (GetType()==LAYER_TYPE_COLLISION) return(false); switch(Mode) { case MouseModePaint: @@ -714,7 +706,7 @@ CRect Rect=Selection.GetRect(); bool CLayerTile::Paint(CMap &Blk,CPoint &CursorPos) { - if (CursorPos.y==-1 || CursorPos.y==-1) return(FALSE); // Off Map? + if (CursorPos.x==-1 || CursorPos.y==-1) return(FALSE); // Off Map? if (!Blk.IsValid()) return(FALSE); // Invalid tile? Map.Set(CursorPos.x,CursorPos.y,Blk); @@ -727,38 +719,45 @@ void CLayerTile::Export(CCore *Core,CExport &Exp) { int Width=Map.GetWidth(); int Height=Map.GetHeight(); -sExpTile BlankElem={0,0,0,0}; Exp.ExportLayerHeader(LAYER_TYPE_TILE,SubType,Width,Height); - Exp.AddTile(BlankElem); // Ensure blank tile is present - for (int Y=0; YGetTile(MapElem.Set,MapElem.Tile); sExpLayerTile OutElem; - sExpTile OutTile; - OutTile.Set=MapElem.Set; - OutTile.Tile=MapElem.Tile; - OutTile.TriCount=0; - OutTile.XOfs=ThisTile.GetTexXOfs(); - OutTile.YOfs=ThisTile.GetTexYOfs(); - - OutElem.Tile=Exp.AddTile(OutTile); - OutElem.Flags=MapElem.Flags; + if (MapElem.Set==0 && MapElem.Tile==0) + { // Blank + OutElem.Tile=0; + OutElem.Flags=0; + } + else + { + sExpTile OutTile; + CElem &ThisTile=TileBank->GetTile(MapElem.Set,MapElem.Tile); + + OutTile.Set=MapElem.Set; + OutTile.Tile=MapElem.Tile; + OutTile.TriStart=0; + OutTile.TriCount=0; + OutTile.XOfs=ThisTile.GetTexXOfs(); + OutTile.YOfs=ThisTile.GetTexYOfs(); + OutElem.Tile=Exp.AddTile(OutTile); + OutElem.Flags=MapElem.Flags; + } + Exp.Write(&OutElem,sizeof(sExpLayerTile)); } } } /*****************************************************************************/ -void CLayerTile::DeleteSet(int Set) +void CLayerTile::RemoveSet(int Set) { - Map.DeleteSet(Set); + Map.RemoveSet(Set); } /*****************************************************************************/ diff --git a/Utils/MapEdit/LayerTile.h b/Utils/MapEdit/LayerTile.h index 39bbe0932..8022453f1 100644 --- a/Utils/MapEdit/LayerTile.h +++ b/Utils/MapEdit/LayerTile.h @@ -68,7 +68,7 @@ virtual bool Command(int CmdMsg,CCore *Core,int Param0=0,int Param1=0); // Local CTileBank *GetTileBank() {return(TileBank);} - void DeleteSet(int Set); + void RemoveSet(int Set); void RemapSet(int OrigSet,int NewSet); protected: diff --git a/Utils/MapEdit/Map.cpp b/Utils/MapEdit/Map.cpp index 416ec867c..6465f8e28 100644 --- a/Utils/MapEdit/Map.cpp +++ b/Utils/MapEdit/Map.cpp @@ -17,7 +17,7 @@ void CMap::Load(CFile *File,int Version) // Version 1 int Width; int Height; -int VFix=0; // Fix for colliison tileset +int VFix=0; // Fix for New tileset shash if (Version<2) VFix=1; @@ -33,6 +33,15 @@ int VFix=0; // Fix for colliison tileset sMapElem ThisElem; File->Read(&ThisElem,sizeof(sMapElem)); ThisElem.Set+=VFix; + if (Version==3) + { + ThisElem.Set--; + if (ThisElem.Set<0) + { + ThisElem.Set=0; + } + } + Set(X,Y,ThisElem,TRUE); } } @@ -312,7 +321,7 @@ int MinH=min(Height,OldHeight); } /*****************************************************************************/ -void CMap::DeleteSet(int Set) +void CMap::RemoveSet(int Set) { int Width=GetWidth(); int Height=GetHeight(); diff --git a/Utils/MapEdit/Map.h b/Utils/MapEdit/Map.h index e2b3af20a..8409c2d33 100644 --- a/Utils/MapEdit/Map.h +++ b/Utils/MapEdit/Map.h @@ -55,7 +55,7 @@ public: void Load(CFile *File,int Version); void Save(CFile *File); - void DeleteSet(int Set); + void RemoveSet(int Set); void RemapSet(int Old,int New); diff --git a/Utils/MapEdit/MapEdit.dsp b/Utils/MapEdit/MapEdit.dsp index 18adbcd42..c6484cad9 100644 --- a/Utils/MapEdit/MapEdit.dsp +++ b/Utils/MapEdit/MapEdit.dsp @@ -69,7 +69,7 @@ LINK32=link.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_AFXDLL" /Yu"stdafx.h" /FD /GZ /c -# ADD CPP /nologo /MDd /W3 /Gm /Gi- /GX /ZI /Od /I "..\libs\glib" /I "..\libs\maths" /I "..\libs\davelib" /I "..\libs\ginlib" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_AFXDLL" /D "_MBCS" /FR /Yu"stdafx.h" /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "..\libs\glib" /I "..\libs\maths" /I "..\libs\davelib" /I "..\libs\ginlib" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_AFXDLL" /D "_MBCS" /FR /Yu"stdafx.h" /FD /GZ /c # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x809 /d "_DEBUG" /d "_AFXDLL" @@ -160,6 +160,14 @@ SOURCE=.\Core.h # End Source File # Begin Source File +SOURCE=.\Elem.cpp +# End Source File +# Begin Source File + +SOURCE=.\Elem.h +# End Source File +# Begin Source File + SOURCE=.\Map.cpp # End Source File # Begin Source File @@ -176,14 +184,6 @@ SOURCE=.\TexCache.h # End Source File # Begin Source File -SOURCE=.\Tile.cpp -# End Source File -# Begin Source File - -SOURCE=.\Tile.h -# End Source File -# Begin Source File - SOURCE=.\TileSet.cpp # End Source File # Begin Source File diff --git a/Utils/MapEdit/TileSet.cpp b/Utils/MapEdit/TileSet.cpp index d4b0e16f6..785d0968a 100644 --- a/Utils/MapEdit/TileSet.cpp +++ b/Utils/MapEdit/TileSet.cpp @@ -22,9 +22,6 @@ #include "MainFrm.h" #include "LayerTileGui.h" -// Reserve slot 0 for collision :o) -GString ColFName="Collision.bmp"; - /*****************************************************************************/ /*** TileBank ****************************************************************/ /*****************************************************************************/ @@ -38,31 +35,13 @@ const float TileBrowserY1=1+TileBrowserGap/2; /*****************************************************************************/ CTileBank::CTileBank() { -GFName ExePath; -GString Filename; - -// Get application path -#ifdef _DEBUG - ExePath="C:\\Spongebob\\tools\\mapedit\\"; -#else -char ExeFilename[2048]; - GetModuleFileName(GetModuleHandle(NULL),ExeFilename,2048); - ExePath=ExeFilename; - ExePath.File(0); - ExePath.Ext(0); -#endif - Filename=ExePath.FullName(); - Filename+=ColFName; - - LoadFlag=FALSE; + LoadFlag=false; CurrentSet=0; LastSet=0; for (int i=0; iGetFilePath(); + GString FilePath; + char FixPath[1024]; + + FilePath=RootPath.Drive(); + FilePath+=RootPath.Dir(); + FilePath.Append('\\'); + FilePath.Upper(); + + File->Read(&ListSize,sizeof(int)); + File->Read(&CurrentSet,sizeof(int)); + File->Read(&ActiveBrush,sizeof(int)); + Brush[0].Load(File,Version); + Brush[1].Load(File,Version); + if (Version<2) + { + CurrentSet++; + } + + // New Style rel storage + for (int i=0;iRead(&c,1); + FullName.Append(c); + } + FullName.Upper(); + GFName::makeabsolute(FilePath,FullName,FixPath); + FullName=FixPath; + _fullpath( FixPath, FullName, 1024); + for (int z=0; zGetFilePath(); -GString FilePath; -char FixPath[1024]; - - FilePath=RootPath.Drive(); - FilePath+=RootPath.Dir(); - FilePath.Append('\\'); - FilePath.Upper(); - - File->Read(&ListSize,sizeof(int)); + File->Read(&LayerCam,sizeof(Vector3)); File->Read(&CurrentSet,sizeof(int)); File->Read(&ActiveBrush,sizeof(int)); Brush[0].Load(File,Version); Brush[1].Load(File,Version); - if (Version<2) - { - CurrentSet++; + + CElemBank::Load(File,Version); } -// New Style rel storage - for (int i=0;iRead(&c,1); - FullName.Append(c); - } - FullName.Upper(); - GFName::makeabsolute(FilePath,FullName,FixPath); - FullName=FixPath; - _fullpath( FixPath, FullName, 1024); - for (int z=0; zGetFilePath(); GString SavePath; @@ -149,55 +129,23 @@ GString SavePath; SavePath.Upper(); - File->Write(&NewListSize,sizeof(int)); + File->Write(&LayerCam,sizeof(Vector3)); File->Write(&CurrentSet,sizeof(int)); File->Write(&ActiveBrush,sizeof(int)); Brush[0].Save(File); Brush[1].Save(File); - for (int i=1; iWrite(Filename,strlen(Filename)+1); - } - -} - -/*****************************************************************************/ -void CTileBank::AddTileSet(const char *Filename) -{ -int ListSize=TileSet.size(); -CTileSet NewSet(Filename,ListSize); - - TileSet.Add(NewSet); - if (TileSet.size()!=ListSize) LoadFlag=TRUE; -} - -/*****************************************************************************/ -void CTileBank::LoadTileSets(CCore *Core) -{ -int ListSize=TileSet.size(); - - for (int i=0;i=0 && Tile>=0); - return(TileSet[Bank].GetTile(Tile)); + if (ID==0) + return(CPoint(-1,-1)); + else + return(IDToPoint(ID-1,Width)); } /*****************************************************************************/ void CTileBank::Render(CCore *Core,Vector3 &CamPos,bool Is3d) { - if (!TileSet.size()) return; // No tiles, return + if (!GetSetCount()) return; +CElemSet &ThisSet=SetList[CurrentSet]; +int ListSize=ThisSet.GetCount(); +int BrowserWidth=ThisSet.GetBrowserWidth(); +int TileID=0; +sMapElem ThisElem; +int SelFlag; +float Scale=CamPos.z/(float)BrowserWidth/2.0; - if (Is3d) - { - glEnable(GL_DEPTH_TEST); - TileSet[CurrentSet].Render(Core,CamPos,GetLBrush(),GetRBrush(),TRUE); - glDisable(GL_DEPTH_TEST); - } - else - { - TileSet[CurrentSet].Render(Core,CamPos,GetLBrush(),GetRBrush(),FALSE); - } + ThisElem.Flags=0; + ThisElem.Set=CurrentSet; + + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + while(TileID!=ListSize) + { + CPoint Pos=GetTilePos(TileID,BrowserWidth); + float XPos=(float)Pos.x*(1+TileBrowserGap); + float YPos=(float)Pos.y*(1+TileBrowserGap); + + glLoadIdentity(); + glScalef(Scale,Scale,Scale); + glTranslatef(-CamPos.x+XPos,CamPos.y-YPos,0); + + glColor3f(1,1,1); + ThisSet.RenderElem(TileID,0,Is3d); +// Selection + ThisElem.Tile=TileID; + SelFlag=0; + + if (Brush[0].DoesContainTile(ThisElem)) SelFlag|=1; + if (Brush[1].DoesContainTile(ThisElem)) SelFlag|=2; + + if (SelFlag) + { + glBegin(GL_QUADS); + switch(SelFlag) + { + case 1: // L + glColor4f(1,0,0,0.5); + BuildGLQuad(TileBrowserX0,TileBrowserX1,TileBrowserY0,TileBrowserY1,0.01f); + break; + case 2: // R + glColor4f(0,0,1,0.5); + BuildGLQuad(TileBrowserX0,TileBrowserX1,TileBrowserY0,TileBrowserY1,0.01f); + break; + case 3: // LR + glColor4f(1,0,0,0.5); + BuildGLQuad(TileBrowserX0,0.5,TileBrowserY0,TileBrowserY1,0.01f); + glColor4f(0,0,1,0.5); + BuildGLQuad(0.5,TileBrowserX1,TileBrowserY0,TileBrowserY1,0.01f); + break; + } + + glEnd(); + } + TileID++; + } + glPopMatrix(); + } + /*****************************************************************************/ void CTileBank::RenderCursor(CCore *Core,Vector3 &CamPos,bool Is3d) { - TileSet[CurrentSet].RenderCursor(CamPos,CursorPos,SelStart,SelEnd); + if (!GetSetCount()) return; +CElemSet &ThisSet=SetList[CurrentSet]; +int ListSize=ThisSet.GetCount(); +int BrowserWidth=ThisSet.GetBrowserWidth(); +CPoint Start,End; +int MaxTile=ListSize; +float Scale=CamPos.z/(float)BrowserWidth/2.0; + + if (CursorPos<-1 || CursorPos>ListSize) return; + if (!ListSize) return; + + + if (SelStart==-1) + { + Start=GetTilePos(CursorPos,BrowserWidth); + End=Start; + } + else + { + + CPoint S=IDToPoint(SelStart-1,BrowserWidth); + CPoint E=IDToPoint(SelEnd-1,BrowserWidth); + + Start=CPoint( min(S.x,E.x), min(S.y,E.y)); + End=CPoint( max(S.x,E.x), max(S.y,E.y)); + if (PointToID(End,BrowserWidth)>=MaxTile) return; // Invalid selection + } + + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + + for (int Y=Start.y; Y<=End.y; Y++) + { + for (int X=Start.x; X<=End.x; X++) + { + float XPos=(float)X*(1+TileBrowserGap); + float YPos=(float)Y*(1+TileBrowserGap); + + glLoadIdentity(); + glScalef(Scale,Scale,Scale); + glTranslatef(-CamPos.x+XPos,CamPos.y-YPos,0); + + + glBegin(GL_QUADS); + glColor4f(1,1,0,0.5); + BuildGLQuad(TileBrowserX0,TileBrowserX1,TileBrowserY0,TileBrowserY1,0); + glEnd(); + + } + } + glPopMatrix(); + } /*****************************************************************************/ void CTileBank::RenderGrid(CCore *Core,Vector3 &CamPos,bool Active) { - TileSet[CurrentSet].RenderGrid(Core,CamPos,Active); + if (!GetSetCount()) return; +CElemSet &ThisSet=SetList[CurrentSet]; +int ListSize=ThisSet.GetCount(); +int BrowserWidth=ThisSet.GetBrowserWidth(); +int TileID=1; // Dont bother with blank, its sorted +float Scale=CamPos.z/(float)BrowserWidth/2.0; + + if (!ListSize) return; + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + + while(TileID!=ListSize) + { + CPoint Pos=GetTilePos(TileID,BrowserWidth); + float XPos=(float)Pos.x*(1+TileBrowserGap); + float YPos=(float)Pos.y*(1+TileBrowserGap); + + glLoadIdentity(); + glScalef(Scale,Scale,Scale); + glTranslatef(-CamPos.x+XPos,CamPos.y-YPos,0); + + glBegin(GL_LINES); + glColor3f(1,1,1); + + glVertex3f( TileBrowserX0,TileBrowserY0,0); + glVertex3f( TileBrowserX1,TileBrowserY0,0); + + glVertex3f( TileBrowserX0,TileBrowserY1,0); + glVertex3f( TileBrowserX1,TileBrowserY1,0); + + glVertex3f( TileBrowserX0,TileBrowserY0,0); + glVertex3f( TileBrowserX0,TileBrowserY1,0); + + glVertex3f( TileBrowserX1,TileBrowserY0,0); + glVertex3f( TileBrowserX1,TileBrowserY1,0); + + glEnd(); + + TileID++; + } + glPopMatrix(); } /*****************************************************************************/ void CTileBank::FindCursorPos(CCore *Core,Vector3 &CamPos,CPoint &MousePos) { - if (!TileSet.size()) return; // No tiles, return + if (!GetSetCount()) return; +CElemSet &ThisSet=SetList[CurrentSet]; +int ListSize=ThisSet.GetCount(); +int BrowserWidth=ThisSet.GetBrowserWidth(); +GLint Viewport[4]; +GLuint SelectBuffer[SELECT_BUFFER_SIZE]; +int HitCount; +int TileID=0; +float Scale=CamPos.z/(float)BrowserWidth/2.0; - CursorPos=TileSet[CurrentSet].FindCursorPos(Core,CamPos,MousePos); + if (!ListSize) return; + glGetIntegerv(GL_VIEWPORT, Viewport); + glSelectBuffer (SELECT_BUFFER_SIZE, SelectBuffer ); + glRenderMode (GL_SELECT); + + glInitNames(); + glPushName(-1); + + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + gluPickMatrix( MousePos.x ,(Viewport[3]-MousePos.y),5.0,5.0,Viewport); + Core->GetView()->SetupPersMatrix(); + + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + + while(TileID!=ListSize) + { + CPoint Pos=GetTilePos(TileID,BrowserWidth); + float XPos=(float)Pos.x*(1+TileBrowserGap); + float YPos=(float)Pos.y*(1+TileBrowserGap); + + glLoadIdentity(); + glScalef(Scale,Scale,Scale); + glTranslatef(-CamPos.x+XPos,CamPos.y-YPos,0); + + glLoadName (TileID); + glBegin (GL_QUADS); + BuildGLQuad(TileBrowserX0,TileBrowserX1,TileBrowserY0,TileBrowserY1,0); + glEnd(); + TileID++; + } + + HitCount= glRenderMode (GL_RENDER); + glPopMatrix(); + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + +// Process hits + +GLuint *HitPtr=SelectBuffer; + + TileID=-2; + if (HitCount) // Just take 1st + { + TileID=HitPtr[3]; + } + glMatrixMode(GL_MODELVIEW); // <-- Prevent arse GL assert + + CursorPos=TileID; SelEnd=CursorPos; } @@ -307,17 +442,17 @@ bool CTileBank::Command(int CmdMsg,CCore *Core,int Param0,int Param1) switch(CmdMsg) { case CmdMsg_SubViewLoad: - LoadSet(Core); + LoadNewSet(Core); break; case CmdMsg_SubViewDelete: DeleteSet(Core); break; case CmdMsg_SubViewUpdate: - ReloadAll(); + ReloadAllSets(); Core->GetTexCache().Purge(); break; case CmdMsg_SubViewSet: - CurrentSet=TileBankGUI.m_List.GetCurSel()+1; + CurrentSet=TileBankGUI.m_List.GetCurSel(); break; case CmdMsg_ActiveBrushLeft: ActiveBrush=LBrush; @@ -347,19 +482,19 @@ void CTileBank::GUIKill(CCore *Core) /*****************************************************************************/ void CTileBank::GUIUpdate(CCore *Core) { -int ListSize=TileSet.size(); -bool IsSubView=true;//Core->IsSubView(); +int ListSize=GetSetCount(); +bool IsSubView=true; if (TileBankGUI.m_List) { TileBankGUI.m_List.ResetContent(); - if (ListSize-1) + if (ListSize) { - for (int i=1; iIsSubView(); } TileBankGUI.m_List.EnableWindow(IsSubView); } + } /*****************************************************************************/ @@ -383,6 +519,8 @@ bool CTileBank::Select(int BrushID,bool DownFlag) { if (CursorPos<0) return(FALSE); SelStart=CursorPos; + TRACE1("SEL Start %i\n",CursorPos); + if (CursorPos==0) { SetBrush(GetBrush(BrushID)); @@ -399,7 +537,7 @@ bool CTileBank::Select(int BrushID,bool DownFlag) SetBrush(GetBrush(BrushID)); SelStart=-1; - TRACE0("END SEL\n"); + TRACE1("END SEL %i\n",CursorPos); } return(TRUE); @@ -408,7 +546,7 @@ bool CTileBank::Select(int BrushID,bool DownFlag) /*****************************************************************************/ void CTileBank::SetBrush(CMap &ThisBrush) { -int BW=TileSet[CurrentSet].GetTileBrowserWidth(); +int BW=SetList[CurrentSet].GetBrowserWidth(); CPoint S=IDToPoint(SelStart-1,BW); CPoint E=IDToPoint(SelEnd-1,BW); @@ -416,7 +554,7 @@ int Width=abs(E.x-S.x)+1; int Height=abs(E.y-S.y)+1; sMapElem ThisElem; -int MaxTile=TileSet[CurrentSet].GetTileCount(); +int MaxTile=SetList[CurrentSet].GetCount(); // if (PointToID(End,BW)>=MaxTile) SelectCancel(); // Invalid selection @@ -431,14 +569,14 @@ int MaxTile=TileSet[CurrentSet].GetTileCount(); for (int X=0; XGetLayer(i); if (ThisLayer->GetType()==LAYER_TYPE_TILE) { - ThisLayer->DeleteSet(CurrentSet); + ThisLayer->RemoveSet(CurrentSet); } } DeleteCurrent(); @@ -508,394 +622,3 @@ void CTileBank::DeleteSet(CCore *Core) GUIUpdate(Core); } -/*****************************************************************************/ -/*****************************************************************************/ -/*** TileSet *****************************************************************/ -/*****************************************************************************/ -/*****************************************************************************/ -CTileSet::CTileSet(const char *_Filename,int Idx) -{ -GFName FName=_Filename; - - Filename=_Filename; - Name=FName.File(); - - Loaded=FALSE; - SetNumber=Idx; -} - -/*****************************************************************************/ -/*****************************************************************************/ -/*****************************************************************************/ -CTileSet::~CTileSet() -{ -} - -/*****************************************************************************/ -/*****************************************************************************/ -/*****************************************************************************/ -void CTileSet::Load(CCore *Core) -{ -GFName FName=Filename; -GString Ext=FName.Ext(); - Ext.Upper(); - - if (Ext=="GIN") - { - Load3d(Core); - } - else - { - Load2d(Core); - } - - Loaded=TRUE; -} - -/*****************************************************************************/ - -void CTileSet::Load2d(CCore *Core) -{ -CTexCache &TexCache=Core->GetTexCache(); -GString ColTest; -int TexID=TexCache.ProcessTexture(Filename,0); -sTex &ThisTex=TexCache.GetTex(TexID); - -int Width=ThisTex.TexWidth/16; -int Height=ThisTex.TexHeight/16; - -// TRACE3("Load 2d TileBank %s (%i,%i)\n",Filename.FullName(),Width,Height); - - Tile.push_back(CTile(0)); // Insert Blank - - for (int Y=0; YTile.size()) return(FALSE); - return(Tile[No].IsValid()); -} - -/*****************************************************************************/ -void CTileSet::Render(CCore *Core,Vector3 &CamPos,CMap &LBrush,CMap &RBrush,bool Render3d) -{ -int ListSize=Tile.size(); -int TileID=0; -sMapElem ThisElem; -int SelFlag; -bool ValidTile=TRUE; -//float Scale=1.0f/(float)TileBrowserWidth/CamPos.z; -float Scale=CamPos.z/(float)TileBrowserWidth/2.0; - - ThisElem.Flags=0; - ThisElem.Set=SetNumber; - - glMatrixMode(GL_MODELVIEW); - glPushMatrix(); - - while(TileID!=ListSize) - { - CPoint Pos=GetTilePos(TileID); - float XPos=(float)Pos.x*(1+TileBrowserGap); - float YPos=(float)Pos.y*(1+TileBrowserGap); - - glLoadIdentity(); - glScalef(Scale,Scale,Scale); - glTranslatef(-CamPos.x+XPos,CamPos.y-YPos,0); - - ValidTile=IsTileValid(TileID); - if (TileID && ValidTile) - { - glColor3f(1,1,1); - Tile[TileID].Render(0,Render3d); - } - -// Selection - ThisElem.Tile=TileID; - SelFlag=0; - - if (LBrush.DoesContainTile(ThisElem)) SelFlag|=1; - if (RBrush.DoesContainTile(ThisElem)) SelFlag|=2; - - if (SelFlag) - { - glBegin(GL_QUADS); - switch(SelFlag) - { - case 1: // L - glColor4f(1,0,0,0.5); - BuildGLQuad(TileBrowserX0,TileBrowserX1,TileBrowserY0,TileBrowserY1,0.01f); - break; - case 2: // R - glColor4f(0,0,1,0.5); - BuildGLQuad(TileBrowserX0,TileBrowserX1,TileBrowserY0,TileBrowserY1,0.01f); - break; - case 3: // LR - glColor4f(1,0,0,0.5); - BuildGLQuad(TileBrowserX0,0.5,TileBrowserY0,TileBrowserY1,0.01f); - glColor4f(0,0,1,0.5); - BuildGLQuad(0.5,TileBrowserX1,TileBrowserY0,TileBrowserY1,0.01f); - break; - } - - glEnd(); - } -// Invalid tile? - if (!ValidTile) - { - glBegin(GL_LINES); - glColor3f(1,1,1); - - glVertex3f( TileBrowserX0,TileBrowserY0,0); - glVertex3f( TileBrowserX1,TileBrowserY1,0); - - glVertex3f( TileBrowserX1,TileBrowserY0,0); - glVertex3f( TileBrowserX0,TileBrowserY1,0); - - glEnd(); - } -// Draw Box around bloody Blank so you can see it - if (!TileID) - { - CPoint Pos=GetTilePos(TileID); - - glBegin(GL_LINES); - glColor3f(1,1,1); - - glVertex3f( TileBrowserX0,TileBrowserY0,0); - glVertex3f( TileBrowserX1,TileBrowserY0,0); - - glVertex3f( TileBrowserX0,TileBrowserY1,0); - glVertex3f( TileBrowserX1,TileBrowserY1,0); - - glVertex3f( TileBrowserX0,TileBrowserY0,0); - glVertex3f( TileBrowserX0,TileBrowserY1,0); - - glVertex3f( TileBrowserX1,TileBrowserY0,0); - glVertex3f( TileBrowserX1,TileBrowserY1,0); - - glEnd(); - } - - TileID++; - } - glPopMatrix(); - -} - -/*****************************************************************************/ -void CTileSet::RenderCursor(Vector3 &CamPos,int CursorPos,int SelStart,int SelEnd) -{ -int ListSize=Tile.size(); -CPoint Start,End; -int MaxTile=Tile.size(); -//float Scale=1.0f/(float)TileBrowserWidth/CamPos.z; -float Scale=CamPos.z/(float)TileBrowserWidth/2.0; - - if (CursorPos<-1 || CursorPos>ListSize) return; - - if (SelStart==-1) - { - Start=GetTilePos(CursorPos); - End=Start; - } - else - { - - CPoint S=IDToPoint(SelStart-1,TileBrowserWidth); - CPoint E=IDToPoint(SelEnd-1,TileBrowserWidth); - - Start=CPoint( min(S.x,E.x), min(S.y,E.y)); - End=CPoint( max(S.x,E.x), max(S.y,E.y)); - if (PointToID(End,TileBrowserWidth)>=MaxTile) return; // Invalid selection - } - - glMatrixMode(GL_MODELVIEW); - glPushMatrix(); - - for (int Y=Start.y; Y<=End.y; Y++) - { - for (int X=Start.x; X<=End.x; X++) - { - float XPos=(float)X*(1+TileBrowserGap); - float YPos=(float)Y*(1+TileBrowserGap); - - glLoadIdentity(); - glScalef(Scale,Scale,Scale); - glTranslatef(-CamPos.x+XPos,CamPos.y-YPos,0); - - - glBegin(GL_QUADS); - glColor4f(1,1,0,0.5); - BuildGLQuad(TileBrowserX0,TileBrowserX1,TileBrowserY0,TileBrowserY1,0); - glEnd(); - - } - } - glPopMatrix(); -} - -/*****************************************************************************/ -void CTileSet::RenderGrid(CCore *Core,Vector3 &CamPos,bool Active) -{ -int ListSize=Tile.size(); -int TileID=1; // Dont bother with blank, its sorted -//float Scale=1.0f/(float)TileBrowserWidth/CamPos.z; -float Scale=CamPos.z/(float)TileBrowserWidth/2.0; - - glMatrixMode(GL_MODELVIEW); - glPushMatrix(); - - while(TileID!=ListSize) - { - CPoint Pos=GetTilePos(TileID); - float XPos=(float)Pos.x*(1+TileBrowserGap); - float YPos=(float)Pos.y*(1+TileBrowserGap); - - glLoadIdentity(); - glScalef(Scale,Scale,Scale); - glTranslatef(-CamPos.x+XPos,CamPos.y-YPos,0); - - glBegin(GL_LINES); - glColor3f(1,1,1); - - glVertex3f( TileBrowserX0,TileBrowserY0,0); - glVertex3f( TileBrowserX1,TileBrowserY0,0); - - glVertex3f( TileBrowserX0,TileBrowserY1,0); - glVertex3f( TileBrowserX1,TileBrowserY1,0); - - glVertex3f( TileBrowserX0,TileBrowserY0,0); - glVertex3f( TileBrowserX0,TileBrowserY1,0); - - glVertex3f( TileBrowserX1,TileBrowserY0,0); - glVertex3f( TileBrowserX1,TileBrowserY1,0); - - glEnd(); - - TileID++; - } - glPopMatrix(); - -} - -/*****************************************************************************/ -int CTileSet::FindCursorPos(CCore *Core,Vector3 &CamPos,CPoint &MousePos) -{ -int ListSize=Tile.size(); -GLint Viewport[4]; -GLuint SelectBuffer[SELECT_BUFFER_SIZE]; -int HitCount; -int TileID=0; -//float Scale=1.0f/(float)TileBrowserWidth/CamPos.z; -float Scale=CamPos.z/(float)TileBrowserWidth/2.0; - - glGetIntegerv(GL_VIEWPORT, Viewport); - glSelectBuffer (SELECT_BUFFER_SIZE, SelectBuffer ); - glRenderMode (GL_SELECT); - - glInitNames(); - glPushName(-1); - - glMatrixMode(GL_PROJECTION); - glPushMatrix(); - glLoadIdentity(); - gluPickMatrix( MousePos.x ,(Viewport[3]-MousePos.y),5.0,5.0,Viewport); - Core->GetView()->SetupPersMatrix(); - - glMatrixMode(GL_MODELVIEW); - glPushMatrix(); - - while(TileID!=ListSize) - { - CPoint Pos=GetTilePos(TileID); - float XPos=(float)Pos.x*(1+TileBrowserGap); - float YPos=(float)Pos.y*(1+TileBrowserGap); - - glLoadIdentity(); - glScalef(Scale,Scale,Scale); - glTranslatef(-CamPos.x+XPos,CamPos.y-YPos,0); - - glLoadName (TileID); - glBegin (GL_QUADS); - BuildGLQuad(TileBrowserX0,TileBrowserX1,TileBrowserY0,TileBrowserY1,0); - glEnd(); - TileID++; - } - - HitCount= glRenderMode (GL_RENDER); - glPopMatrix(); - glMatrixMode(GL_PROJECTION); - glPopMatrix(); - -// Process hits - -GLuint *HitPtr=SelectBuffer; - - TileID=-2; - if (HitCount) // Just take 1st - { - TileID=HitPtr[3]; - } - glMatrixMode(GL_MODELVIEW); // <-- Prevent arse GL assert - - return(TileID); - -} - - - diff --git a/Utils/MapEdit/TileSet.h b/Utils/MapEdit/TileSet.h index a6e35c65c..896c0edc7 100644 --- a/Utils/MapEdit/TileSet.h +++ b/Utils/MapEdit/TileSet.h @@ -14,7 +14,7 @@ #include "Layer.h" #include "TexCache.h" -#include "Tile.h" +#include "Elem.h" #include "MapEdit.h" #include "LayerTileGui.h" @@ -27,11 +27,9 @@ DefTileBrowserWidth=8, /*****************************************************************************/ class CCore; -class CTile; /*****************************************************************************/ -class CTileSet; -class CTileBank : public CLayer +class CTileBank : public CLayer, public CElemBank { public: CTileBank(); @@ -57,11 +55,6 @@ public: void GUIUpdate(CCore *Core); void GUIChanged(CCore *Core); - int GetWidth(){return(0);} - int GetHeight(){return(0);} - void CheckLayerSize(int Width,int Height){}; - bool Resize(int Width,int Height){return(false);} - void Load(CFile *File,int Version); void Save(CFile *File); @@ -72,30 +65,25 @@ public: bool MouseMove(CCore *Core,UINT nFlags, CPoint &CursorPos); bool Command(int CmdMsg,CCore *Core,int Param0=0,int Param1=0); +// ElemSet Thruput +const char *GetSetName(int Set) {return(SetList[Set].GetName());} +const char *GetSetFilename(int Set) {return(SetList[Set].GetFilename());} + CElem &GetTile(int Set,int Tile) {return(SetList[Set].GetElem(Tile));} + void RenderTile(int Set,int Elem,int Flags,bool Is3d) {SetList[Set].RenderElem(Elem,Flags,Is3d);} + // Local - void AddTileSet(const char *Filename); - int NeedLoad() {return(LoadFlag);} void DeleteCurrent(); - void ReloadAll(); - void LoadTileSets(CCore *Core); - CTile &GetTile(int Bank,int Tile); - int GetSetCount() {return(TileSet.size());} - - CMap &GetLBrush() {return(Brush[LBrush]);} - CMap &GetRBrush() {return(Brush[RBrush]);} - CMap &GetBrush(int i) {return(Brush[i]);} - CMap &GetActiveBrush() {return(GetBrush(ActiveBrush));} + CMap &GetLBrush() {return(Brush[LBrush]);} + CMap &GetRBrush() {return(Brush[RBrush]);} + CMap &GetBrush(int i) {return(Brush[i]);} + CMap &GetActiveBrush() {return(GetBrush(ActiveBrush));} - bool IsTileValid(int Set,int Tile); - bool CanClose() {return(SelStart==-1);} - - void SetCollision(bool f); - CTileSet &GetSet(int Set) {return(TileSet[Set]);} + bool CanClose() {return(SelStart==-1);} + CPoint GetTilePos(int ID,int Width); // Functions bool SelectCancel(); - void LoadSet(CCore *Core); void DeleteSet(CCore *Core); @@ -104,7 +92,7 @@ protected: bool Select(int BrushID,bool DownFlag); void SetBrush(CMap &ThisBrush); - CList TileSet; +//!! CList TileSet; int CurrentSet,LastSet; CMap Brush[2]; int ActiveBrush; @@ -117,48 +105,5 @@ protected: }; -/*****************************************************************************/ -class CTileSet -{ -public: - CTileSet(const char *_Filename,int Idx); - ~CTileSet(); - - int IsLoaded() {return(Loaded);} - int GetTileCount() {return(Tile.size());} - - void Load(CCore *Core); - void Load2d(CCore *Core); - void Load3d(CCore *Core); - -const char *GetFilename() {return(Filename);} -const char *GetName() {return(Name);} - - CTile &GetTile(int No) {return(Tile[No]);} - void Purge(); - int FindCursorPos(CCore *Core,Vector3 &CamPos,CPoint &MousePos); - void Render(CCore *Core,Vector3 &CamPos,CMap &LBrush,CMap &RBrush,bool Render3d); - void RenderCursor(Vector3 &CamPos,int Pos,int Width, int Height); - void RenderBrush(Vector3 &CamPos,CMap &LBrush,CMap &RBrush); - void RenderGrid(CCore *Core,Vector3 &CamPos,bool Active); - int GetTileBrowserWidth() {return(TileBrowserWidth);} - bool IsTileValid(int No); - -bool operator==(CTileSet const &v1) {return (Name==v1.Name);} - -// if (IsStrSame((char*)Name,(char*)v1.Name) return(i); - -private: - bool Create16x16Tile(sRGBData &Src,u8 *Dst,int XOfs,int YOfs); - CPoint GetTilePos(int ID); - - GString Filename,Name; - - int SetNumber; - CList Tile; - bool Loaded; - int TileBrowserWidth; -}; - /*****************************************************************************/ #endif \ No newline at end of file diff --git a/Utils/MapEdit/utils.cpp b/Utils/MapEdit/utils.cpp index c20856cbd..9043535e5 100644 --- a/Utils/MapEdit/utils.cpp +++ b/Utils/MapEdit/utils.cpp @@ -324,3 +324,15 @@ CFileDialog Dlg(true,NULL,Name,OFN_HIDEREADONLY | OFN_PATHMUSTEXIST,Filter); } /*****************************************************************************/ +int round(float f) +{ + if (f<0) + { + return (int)(f-0.5f); + } + else + { + return (int)(f+0.5f); + } +} +/*****************************************************************************/ diff --git a/Utils/MapEdit/utils.h b/Utils/MapEdit/utils.h index 3ea97e135..33d58bb80 100644 --- a/Utils/MapEdit/utils.h +++ b/Utils/MapEdit/utils.h @@ -53,6 +53,7 @@ void MakeFullFilename(const char *RelName,GString &Out); void MakePathRel2App(const char* In,char *Out); GString GetWorkingPath(); void CheckFilename(GString &Filename); +int round(float f) ; #endif \ No newline at end of file diff --git a/Utils/MkActor3d/MkActor3d.cpp b/Utils/MkActor3d/MkActor3d.cpp index 1731bfb7f..19413b045 100644 --- a/Utils/MkActor3d/MkActor3d.cpp +++ b/Utils/MkActor3d/MkActor3d.cpp @@ -129,7 +129,6 @@ vector const &Files = MyFiles.GetFileInfoVector(); for (i=0; i