/*******************/ /*** Layer Thing ***/ /*******************/ #include "stdafx.h" #include #include #include #include "GLEnabledView.h" #include "MapEdit.h" #include "MapEditDoc.h" #include "MapEditView.h" #include "MainFrm.h" #include "Core.h" #include "Layer.h" #include "LayerThing.h" #include "Utils.h" #include "Export.h" /*****************************************************************************/ /*****************************************************************************/ /*****************************************************************************/ CLayerThing::CLayerThing(sLayerDef &Def) { InitLayer(Def); } /*****************************************************************************/ CLayerThing::~CLayerThing() { ThingBank->CleanUp(); delete ThingBank; } /*****************************************************************************/ void CLayerThing::InitLayer(sLayerDef &Def) { CLayer::InitLayer(Def); Mode=MouseModeNormal; ThingBank=new CElemBank(-1,-1,false,true); Cursor.XY.resize(1); Cursor.ElemID=-1; CurrentDefThing=-1; CurrentThing=-1; CurrentThingPoint=0; } /*****************************************************************************/ void CLayerThing::Load(CFile *File,int Version) { int i,ListSize; File->Read(&Mode,sizeof(MouseMode)); File->Read(&CurrentDefThing,sizeof(int)); File->Read(&CurrentThing,sizeof(int)); File->Read(&CurrentThingPoint,sizeof(int)); File->Read(&ListSize,sizeof(int)); ThingList.resize(ListSize); // Load Data for (i=0;iRead(&ThisThing.Data,sizeof(sLayerThingData)); } LoadThingNames(File,Version); } /*****************************************************************************/ void CLayerThing::LoadThing(CFile *File,int Version,sLayerThing &ThisThing) { int i,ListSize; File->Read(&ListSize,sizeof(int)); ThisThing.XY.resize(ListSize); for (i=0 ;iRead(&ThisThing.XY[i],sizeof(CPoint)); } } /*****************************************************************************/ void CLayerThing::LoadThingNames(CFile *File,int Version) { int i,ListSize=ThingList.size(); for (i=0;iRead(&c,1); ThisName.Append(c); } // Update Gfx ID int Idx=FindDefThing(ThisName); ThisThing.ElemID=DefList[Idx].ElemID; } } /*****************************************************************************/ void CLayerThing::Save(CFile *File) { int i,ListSize=ThingList.size(); // Always Save current version File->Write(&Mode,sizeof(MouseMode)); File->Write(&CurrentDefThing,sizeof(int)); File->Write(&CurrentThing,sizeof(int)); File->Write(&CurrentThingPoint,sizeof(int)); File->Write(&ListSize,sizeof(int)); for (i=0;iWrite(&ThisThing.Data,sizeof(sLayerThingData)); } SaveThingNames(File); } /*****************************************************************************/ void CLayerThing::SaveThing(CFile *File,sLayerThing &ThisThing) { int i,ListSize=ThisThing.XY.size(); File->Write(&ListSize,sizeof(int)); for (i=0 ;iWrite(&ThisThing.XY[i],sizeof(CPoint)); } } /*****************************************************************************/ void CLayerThing::SaveThingNames(CFile *File) { int i,ListSize=ThingList.size(); for (i=0; iWrite(Txt,strlen(Txt)+1); } } /*****************************************************************************/ void CLayerThing::InitSubView(CCore *Core) { } /*****************************************************************************/ void CLayerThing::LoadThingScript(const char *Filename) { GString ExecPath; GString ScriptName; GetExecPath(ExecPath); ScriptName=ExecPath+Filename; ThingScript.LoadAndImport(ScriptName); int i,ListSize=ThingScript.GetGroupCount(); DefList.resize(ListSize); for (i=0; iAddSet(Filename); } else { TRACE1("BAD %s\n",Name); } } } /*****************************************************************************/ /*****************************************************************************/ /*****************************************************************************/ void CLayerThing::Render(CCore *Core,Vector3 &CamPos,bool Is3d) { Vector3 ThisCam=Core->OffsetCam(CamPos,GetScaleFactor()); int i,ListSize=ThingList.size(); for (i=0; iGetZoomW(); float ZoomH=Core->GetZoomH(); Vector3 &Scale=Core->GetScaleVector(); Vector3 ScrOfs(ZoomW/2,ZoomH/2,0); if (Render3d) { ScrOfs.z=-4.0f; } if (ThingBank->NeedLoad()) ThingBank->LoadAllSets(Core); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); glScalef(Scale.x,Scale.y,Scale.z); glTranslatef(-ThisCam.x,ThisCam.y,0); // Set scroll offset glTranslatef(-ScrOfs.x,ScrOfs.y,0); // Bring to top left corner int ListSize=ThisThing.XY.size(); for (int i=0;iRenderNumber(i); if (i==0) { glColor4f(1,1,1,1); // Set default Color glEnable(GL_DEPTH_TEST); glTranslatef(0,0,ScrOfs.z); ThingBank->RenderElem(ThisThing.ElemID,0,0,Render3d); glTranslatef(0,0,-ScrOfs.z); glDisable(GL_DEPTH_TEST); } glPopMatrix(); } glPopMatrix(); } /*****************************************************************************/ /*** Gui *********************************************************************/ /*****************************************************************************/ void CLayerThing::GUIInit(CCore *Core) { } /*****************************************************************************/ void CLayerThing::GUIKill(CCore *Core) { } /*****************************************************************************/ void CLayerThing::GUIUpdate(CCore *Core) { } /*****************************************************************************/ void CLayerThing::GUIChanged(CCore *Core) { } /*****************************************************************************/ /*** Functions ***************************************************************/ /*****************************************************************************/ bool CLayerThing::LButtonControl(CCore *Core,UINT nFlags, CPoint &CursorPos,bool DownFlag) { bool Ret=false; if (!DownFlag) return(false); switch(Mode) { case MouseModeNormal: SelectThing(CursorPos); GUIThingUpdate(); break; case MouseModeNew: AddThing(CursorPos); GUIThingDefClear(); GUIThingUpdate(); break; case MouseModePoints: AddThingPoint(CursorPos); GUIThingPointUpdate(); break; default: break; } return(true); } /*****************************************************************************/ bool CLayerThing::RButtonControl(CCore *Core,UINT nFlags, CPoint &CursorPos,bool DownFlag) { if (!DownFlag) return(false); Cancel(); return(true); } /*****************************************************************************/ bool CLayerThing::MouseMove(CCore *Core,UINT nFlags, CPoint &CursorPos) { bool Ret=false; if (CurrentThing!=-1) { if (nFlags & MK_LBUTTON) // Drag { UpdatePos(CursorPos,CurrentThing,CurrentThingPoint,(nFlags & MK_CONTROL)!=0); GUIThingPointUpdate(); Ret=true; } else if (nFlags & MK_RBUTTON) // Cancel { Cancel(); Ret=true; } } return(Ret); } /*****************************************************************************/ void CLayerThing::Cancel() { switch(Mode) { case MouseModeNormal: CurrentThing=-1; case MouseModeNew: case MouseModePoints: Mode=MouseModeNormal; CurrentThingPoint=0; GUIThingDefClear(); GUIThingUpdate(); break; default: break; } } /*****************************************************************************/ bool CLayerThing::Command(int CmdMsg,CCore *Core,int Param0,int Param1) { bool Ret=false; switch(CmdMsg) { case CmdMsg_ThingListDelete: DeleteThing(); GUIThingUpdate(); break; case CmdMsg_ThingListSelect: CurrentDefThing=Param0; SetCursor(DefList[CurrentDefThing].Name); Mode=MouseModeNew; break; case CmdMsg_ThingLevelSelect: SelectThing(Param0); GUIThingUpdate(); break; case CmdMsg_ThingPosSelect: CurrentThingPoint=Param0; GUIThingPointUpdate(); break; case CmdMsg_ThingPosUp: MovePoint(-1); break; case CmdMsg_ThingPosDown: MovePoint(+1); break; case CmdMsg_ThingPosDelete: DeletePoint(); break; default: break; } return(Ret); } /*****************************************************************************/ int CLayerThing::FindDefThing(const char *Name) { int i,ListSize=DefList.size(); for (i=0; iOffsetCam(CamPos,GetScaleFactor()); CPoint &CursPos=Core->GetCursorPos(); Cursor.XY[0]=CursPos; if (CursPos.x<0 || CursPos.y<0) return; if (Mode!=MouseModeNew) return; if (Cursor.ElemID==-1) return; RenderThing(Core,ThisCam,Cursor,Is3d,true); } /*****************************************************************************/ /*****************************************************************************/ /*****************************************************************************/ int CLayerThing::CheckThing(CPoint &Pos) { CList List; int Idx=-1,i,ListSize=ThingList.size(); int StartIdx=0; // Build List Of XY Matches for (i=0; i List; sLayerThing &ThisThing=ThingList[CurrentThing]; int Idx=-1,i,ListSize=ThisThing.XY.size(); int StartIdx=0; // Build List Of XY Matches for (i=0; i=ThisThing.XY.size()) return; CPoint Tmp=ThisThing.XY[CurrentThingPoint]; ThisThing.XY[CurrentThingPoint]=ThisThing.XY[NewPos]; ThisThing.XY[NewPos]=Tmp; CurrentThingPoint=NewPos; GUIThingPointUpdate(); } /*****************************************************************************/ void CLayerThing::DeletePoint() { if (!CurrentThingPoint) return; if (CurrentThing==-1) return; sLayerThing &ThisThing=ThingList[CurrentThing]; ThisThing.XY.erase(CurrentThingPoint); CurrentThingPoint--; if (CurrentThingPoint<0) CurrentThingPoint=0; GUIThingPointUpdate(); } /*****************************************************************************/ /*****************************************************************************/ /*****************************************************************************/ void CLayerThing::Export(CCore *Core,CExport &Exp) { int i,ListSize=ThingList.size(); Exp.ExportLayerHeader(LayerDef); Exp.Write(&ListSize,sizeof(int)); for (i=0;i