/*********************/ /*** TileSet Stuph ***/ /*********************/ #include "stdafx.h" #include "gl3d.h" #include #include #include #include "GLEnabledView.h" #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 "LayerTileGui.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() { LoadFlag=FALSE; CurrentSet=0; for (int i=0; iRead(&ListSize,sizeof(int)); File->Read(&CurrentSet,sizeof(int)); File->Read(&ActiveBrush,sizeof(int)); Brush[0].Load(File,Version); Brush[1].Load(File,Version); for (int i=0;iRead(Filename,256+64); AddTileSet(Filename); } } /*****************************************************************************/ void CTileBank::Save(CFile *File) { int ListSize=TileSet.size(); File->Write(&ListSize,sizeof(int)); File->Write(&CurrentSet,sizeof(int)); File->Write(&ActiveBrush,sizeof(int)); Brush[0].Save(File); Brush[1].Save(File); for (int i=0; iWrite(Filename,256+64); } } /*****************************************************************************/ void CTileBank::AddTileSet(char *Filename) { int ListSize=TileSet.size(); TileSet.push_back(CTileSet(Filename,ListSize)); LoadFlag=TRUE; } /*****************************************************************************/ void CTileBank::LoadTileSets(CCore *Core) { int ListSize=TileSet.size(); for (int i=0;iIsGridOn()) TileSet[CurrentSet].RenderGrid(CamPos); } /*****************************************************************************/ void CTileBank::FindCursorPos(CCore *Core,CMapEditView *View,Vec &CamPos,CPoint &MousePos) { if (!TileSet.size()) return; // No tiles, return CursorPos=TileSet[CurrentSet].FindCursorPos(Core,View,CamPos,MousePos); SelEnd=CursorPos; } /*****************************************************************************/ /*** Gui *********************************************************************/ /*****************************************************************************/ void CTileBank::UpdateGUI(CCore *Core,BOOL IsTileView) { CMainFrame *Frm=(CMainFrame*)AfxGetApp()->GetMainWnd(); CLayerTileGUI *Dlg=(CLayerTileGUI*)Frm->GetDialog(IDD_LAYERTILE_GUI); int ListSize=TileSet.size(); if (Dlg) { Dlg->m_List.ResetContent(); if (ListSize) { for (int i=0; im_List.AddString(TileSet[i].GetName()); } Dlg->m_List.SetCurSel(CurrentSet); } else { IsTileView=FALSE; } Dlg->m_List.EnableWindow(IsTileView); } } /*****************************************************************************/ /*** Functions ***************************************************************/ /*****************************************************************************/ BOOL CTileBank::Select(int BrushID,BOOL DownFlag) { if (DownFlag && SelStart==-1) { if (CursorPos<0) return(FALSE); SelStart=CursorPos; if (CursorPos==0) { SetBrush(GetBrush(BrushID)); SelStart=-1; TRACE0("Selected Blank\n"); } } else if (!DownFlag && SelStart!=-1) { if (CursorPos==-1) return(SelectCancel()); SetBrush(GetBrush(BrushID)); SelStart=-1; TRACE0("END SEL\n"); } return(TRUE); } /*****************************************************************************/ void CTileBank::SetBrush(CMap &ThisBrush) { int BW=TileSet[CurrentSet].GetTileBrowserWidth(); CPoint S=IDToPoint(SelStart-1,BW); CPoint E=IDToPoint(SelEnd-1,BW); int Width=abs(E.x-S.x)+1; int Height=abs(E.y-S.y)+1; sMapElem ThisElem; int MaxTile=TileSet[CurrentSet].GetTileCount(); // if (PointToID(End,BW)>=MaxTile) SelectCancel(); // Invalid selection ThisElem.Set=CurrentSet; ThisElem.Flags=0; ThisBrush.Delete(); ThisBrush.SetSize(Width,Height); for (int Y=0; YGetTexCache(); sRGBData ThisBmp; sRGBData NewTex; _makepath( Filename, Drive, Path, Name, Ext); TexCache.LoadBMP(Filename,ThisBmp); int Width=ThisBmp.Width/16; int Height=ThisBmp.Height/16; u8 Buffer[16*16*3]; NewTex.Width=16; NewTex.Height=16; NewTex.RGB=Buffer; TRACE2("Load 2d TileBank (%i,%i)\n",Width,Height); Tile.push_back(CTile(0)); // Insert Blank for (int Y=0; YListSize) return; if (SelStart==-1) { if (CursorPos==0) { Start=CPoint(-1,-1); } else { Start=IDToPoint(CursorPos-1,TileBrowserWidth); } 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); glDisable(GL_TEXTURE_2D); for (int Y=Start.y; Y<=End.y; Y++) { for (int X=Start.x; X<=End.x; X++) { glLoadIdentity(); glTranslatef(CamPos.x+X*(1+TileBrowserGap),CamPos.y-Y*(1+TileBrowserGap),CamPos.z); glBegin(GL_QUADS); #ifdef UseLighting glNormal3f( 1,1,1); #endif glColor4f(1,1,0,0.5); BuildGLQuad(TileBrowserX0,TileBrowserX1,TileBrowserY0,TileBrowserY1,0); glEnd(); } } glEnable(GL_TEXTURE_2D); } /*****************************************************************************/ void CTileSet::RenderGrid(Vec &CamPos) { int ListSize=Tile.size(); int TileID=0; glMatrixMode(GL_MODELVIEW); glDisable(GL_TEXTURE_2D); while(TileID!=ListSize) { CPoint Pos;//=IDToPoint(TileID,TileBrowserWidth); if (TileID==0) Pos=CPoint(-1,-1); else Pos=IDToPoint(TileID-1,TileBrowserWidth); glLoadIdentity(); glTranslatef(CamPos.x+Pos.x*(1+TileBrowserGap),CamPos.y-Pos.y*(1+TileBrowserGap),CamPos.z); glBegin(GL_LINES); #ifdef UseLighting glNormal3f( 1,1,1); #endif glColor3ub(255,255,255); 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++; } glEnable(GL_TEXTURE_2D); } /*****************************************************************************/ int CTileSet::FindCursorPos(CCore *Core,CMapEditView *View,Vec &CamPos,CPoint &MousePos) { int ListSize=Tile.size(); GLint Viewport[4]; GLuint SelectBuffer[SELECT_BUFFER_SIZE]; int HitCount; int TileID=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); View->SetupPersMatrix(); glMatrixMode(GL_MODELVIEW); while(TileID!=ListSize) { CPoint Pos;//=IDToPoint(TileID,TileBrowserWidth); if (TileID==0) Pos=CPoint(-1,-1); else Pos=IDToPoint(TileID-1,TileBrowserWidth); glLoadIdentity(); glTranslatef(CamPos.x+Pos.x*(1+TileBrowserGap),CamPos.y-Pos.y*(1+TileBrowserGap),CamPos.z); glLoadName (TileID); glBegin (GL_QUADS); BuildGLQuad(TileBrowserX0,TileBrowserX1,TileBrowserY0,TileBrowserY1,0); glEnd(); TileID++; } HitCount= glRenderMode (GL_RENDER); 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); }