/*********************/ /*** TileSet Stuph ***/ /*********************/ #include "stdafx.h" #include #include #include #include "GLEnabledView.h" #include #include #include "Core.h" #include "TileSet.h" #include "GinTex.h" #include "utils.h" #include "MapEdit.h" #include "MapEditDoc.h" #include "MapEditView.h" #include "MainFrm.h" #include "GUITileBank.h" /*****************************************************************************/ /*** TileBank ****************************************************************/ /*****************************************************************************/ const float TileBrowserGap=0.2f; const float TileBrowserX0=0-TileBrowserGap/2; const float TileBrowserX1=1+TileBrowserGap/2; const float TileBrowserY0=0-TileBrowserGap/2; const float TileBrowserY1=1+TileBrowserGap/2; /*****************************************************************************/ CTileBank::CTileBank() : CElemBank(16,16,true,false) { for (int i=0; iRead(&LayerCam,sizeof(Vector3)); File->Read(&CurrentSet,sizeof(int)); File->Read(&ActiveBrush,sizeof(int)); Brush[0].Load(File,Version); Brush[1].Load(File,Version); } else { File->Read(&LayerCam,sizeof(Vector3)); File->Read(&ActiveBrush,sizeof(int)); Brush[0].Load(File,Version); Brush[1].Load(File,Version); } CElemBank::Load(File,Version); } /*****************************************************************************/ void CTileBank::Save(CFile *File) { File->Write(&LayerCam,sizeof(Vector3)); File->Write(&ActiveBrush,sizeof(int)); Brush[0].Save(File); Brush[1].Save(File); CElemBank::Save(File); } /*****************************************************************************/ void CTileBank::DeleteCurrent() { int ListSize=GetSetCount(); // Remap Brushes for (int i=0; iListSize) return; if (!ListSize) return; if (SelStart==-1) { Start=GetElemPos(CursorPos,BrowserWidth); End=Start; } else { CPoint S=IDToPoint(SelStart-1,BrowserWidth); CPoint E=IDToPoint(CursorPos-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(); } /*****************************************************************************/ bool CTileBank::LButtonControl(CCore *Core,UINT nFlags, CPoint &CursorPos,bool DownFlag) { if (nFlags & MK_RBUTTON) { SelectCancel(); return(false); } Select(LBrush,DownFlag); return(true); } /*****************************************************************************/ bool CTileBank::RButtonControl(CCore *Core,UINT nFlags, CPoint &CursorPos,bool DownFlag) { if (nFlags & MK_LBUTTON) { SelectCancel(); return(false); } Select(RBrush,DownFlag); return(false); } /*****************************************************************************/ bool CTileBank::MouseMove(CCore *Core,UINT nFlags, CPoint &CursorPos) { return(false); } /*****************************************************************************/ bool CTileBank::Command(int CmdMsg,CCore *Core,int Param0,int Param1) { switch(CmdMsg) { case CmdMsg_SubViewLoad: LoadNewSet(Core); GUIUpdate(Core); break; case CmdMsg_SubViewDelete: DeleteSet(Core); GUIUpdate(Core); break; case CmdMsg_SubViewUpdate: ReloadAllSets(); Core->GetTexCache().Purge(); GUIUpdate(Core); break; case CmdMsg_SubViewSet: CurrentSet=GUIElemList.m_List.GetCurSel(); GUIUpdate(Core); break; case CmdMsg_ActiveBrushLeft: ActiveBrush=LBrush; break; case CmdMsg_ActiveBrushRight: ActiveBrush=RBrush; default: TRACE3("TileBank-Unhandled Command %i (%i,%i)\n",CmdMsg,Param0,Param1); } return(true); } /*****************************************************************************/ /*** Gui *********************************************************************/ /*****************************************************************************/ void CTileBank::GUIInit(CCore *Core) { Core->GUIAdd(GUIElemList,IDD_ELEMLIST); Core->GUIAdd(GUITileBank,IDD_TILEBANK); } /*****************************************************************************/ void CTileBank::GUIKill(CCore *Core) { Core->GUIRemove(GUIElemList,IDD_ELEMLIST); Core->GUIRemove(GUITileBank,IDD_TILEBANK); } /*****************************************************************************/ void CTileBank::GUIUpdate(CCore *Core) { int ListSize=GetSetCount(); bool IsSubView=Core->IsSubView(); if (GUIElemList.m_List) { GUIElemList.m_List.ResetContent(); if (ListSize) { for (int i=0; i=MaxTile) SelectCancel(); // Invalid selection ThisElem.Set=CurrentSet; ThisElem.Flags=0; ThisBrush.Delete(); ThisBrush.SetSize(Width,Height); for (int Y=0; YQuestion("Delete Current Tile Bank\n\nAll used tiles in current set will be set to blank\nAre you sure?")) { int SetCount=GetSetCount(); int i,ListSize=Core->GetLayerCount(); for (i=0;iGetLayer(i); if (ThisLayer->GetType()==LAYER_TYPE_TILE) { ThisLayer->RemoveSet(CurrentSet); } } DeleteCurrent(); for (int Set=CurrentSet+1; SetGetLayer(i); if (ThisLayer->GetType()==LAYER_TYPE_TILE) { ThisLayer->RemapSet(Set,Set-1); } } } } CurrentSet--; GUIUpdate(Core); }