/* ** Command & Conquer Generals Zero Hour(tm) ** Copyright 2025 Electronic Arts Inc. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program. If not, see . */ // WorldBuilderDoc.h : interface of the CWorldBuilderDoc class // ///////////////////////////////////////////////////////////////////////////// #if !defined(AFX_WORLDBUILDERDOC_H__FBA4134D_2826_11D5_8CE0_00010297BBAC__INCLUDED_) #define AFX_WORLDBUILDERDOC_H__FBA4134D_2826_11D5_8CE0_00010297BBAC__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #include "lib/BaseType.h" #include "Common/MapObject.h" #include "Tool.h" class CWorldBuilderView; class WbView3d; class WorldHeightMapEdit; class Undoable; class DataChunkInput; struct DataChunkInfo; #define MAX_UNDOS 15 #define MIN_CELL_SIZE 1 #define MAX_CELL_SIZE 64 class CWorldBuilderDoc : public CDocument { friend class COptionsPanel; enum {MAX_WAYPOINTS=16000}; ///@todo - make it dynamic. jba. protected: // create from serialization only CWorldBuilderDoc(); DECLARE_DYNCREATE(CWorldBuilderDoc) protected: WorldHeightMapEdit *m_heightMap; Undoable *m_undoList; ///< Head of undo/redo list. int m_maxUndos; int m_curRedo; ///< 0 means no redos available. Bool m_linkCenters; ///< Flag whether the centers of the 2d and 3d views track together. Bool m_needAutosave; ///< True if changes have been made since last autosave. Int m_curWaypointID; protected: std::vector m_boundaries; protected: // waypoint stuff. MapObject *m_waypointTable[MAX_WAYPOINTS]; Bool m_waypointTableNeedsUpdate; struct { Int waypoint1; Int waypoint2; Bool processedFlag; } m_waypointLinks[MAX_WAYPOINTS]; Int m_numWaypointLinks; protected: void updateWaypointTable(void); void compressWaypointIds(void); void updateLWL(MapObject *pWay, MapObject *pSrcWay); public: void addWaypointLink(Int waypointID1, Int waypointID2); void removeWaypointLink(Int waypointID1, Int waypointID2); MapObject *getWaypointByID(Int waypointID); Int getNumWaypointLinks(void) {return m_numWaypointLinks;}; void getWaypointLink(Int ndx, Int *waypoint1, Int *waypointID2); Bool waypointLinkExists(Int waypointID1, Int waypointID2); Bool isWaypointLinked(MapObject *pWay); void updateLinkedWaypointLabels(MapObject *pWay); // Boundary stuff Int getNumBoundaries(void) const ; void getBoundary(Int ndx, ICoord2D* border) const; void addBoundary(ICoord2D* boundaryToAdd); void changeBoundary(Int ndx, ICoord2D *border); void removeLastBoundary(void); // outNdx must not be NULL, but outHandle can be. // outHandle: 0 means BL, 1 means TL, 2 means TR, 3 means BR void findBoundaryNear(Coord3D *pt, float okDistance, Int *outNdx, Int *outHandle); static Bool ParseWaypointDataChunk(DataChunkInput &file, DataChunkInfo *info, void *userData); Bool ParseWaypointData(DataChunkInput &file, DataChunkInfo *info, void *userData); public: // overridden virtual BOOL DoSave(LPCTSTR lpszPathName, BOOL bReplace = TRUE); virtual BOOL DoFileSave(); // Attributes public: WorldHeightMapEdit *GetHeightMap() {return m_heightMap;} void SetHeightMap(WorldHeightMapEdit *pMap, Bool doUpdate); void Create2DView(); void Create3DView(); CWorldBuilderView *Get2DView(); WbView3d *Get3DView(); static CWorldBuilderDoc *GetActiveDoc(); static CWorldBuilderView *GetActive2DView(); static WbView3d *GetActive3DView(); void invalObject(MapObject *pMapObj); void invalCell(int xIndex, int yIndex); void updateAllViews(); void updateHeightMap(WorldHeightMap *htMap, Bool partial, const IRegion2D &partialRange); /// Gets an xy index into the height map from a pixel location. Bool getCellIndexFromCoord(Coord3D pt, CPoint *ndxP); void getCoordFromCellIndex(CPoint ndx, Coord3D* pt); /// Gets a real xy location from a pixel point. Bool getCellPositionFromCoord(Coord3D pt, Coord3D *locP); /// Gets all of the indices within widthOutside of the rectangle and places them into /// allIndices Bool getAllIndexesInRect(const Coord3D* bl, const Coord3D* br, const Coord3D* tl, const Coord3D* tr, Int widthOutside, VecHeightMapIndexes* allIndices); /// Gets the arrow point location. void getObjArrowPoint(MapObject *pObj, Coord3D *location); void syncViewCenters(Real x, Real y); Bool needAutoSave(void) {return m_needAutosave;}; Int getNextWaypointID(void) { return ++m_curWaypointID;}; void setNextWaypointID(Int newMax) { if (newMax>m_curWaypointID) m_curWaypointID = newMax;}; void autoSave(void); void validate(void); // Operations public: // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CWorldBuilderDoc) public: virtual BOOL OnNewDocument(); virtual void Serialize(CArchive& ar); virtual BOOL OnOpenDocument(LPCTSTR lpszPathName); virtual BOOL CanCloseFrame(CFrameWnd* pFrame); //}}AFX_VIRTUAL // Implementation public: virtual ~CWorldBuilderDoc(); #ifdef _DEBUG virtual void AssertValid() const; virtual void Dump(CDumpContext& dc) const; #endif void AddAndDoUndoable(Undoable *pUndo); // Generated message map functions protected: //{{AFX_MSG(CWorldBuilderDoc) afx_msg void OnEditRedo(); afx_msg void OnUpdateEditRedo(CCmdUI* pCmdUI); afx_msg void OnEditUndo(); afx_msg void OnUpdateEditUndo(CCmdUI* pCmdUI); afx_msg void OnTsInfo(); afx_msg void OnTsCanonical(); afx_msg void OnUpdateTsCanonical(CCmdUI* pCmdUI); afx_msg void OnFileResize(); afx_msg void OnJumpToGame(); afx_msg void OnTsRemap(); afx_msg void OnEditLinkCenters(); afx_msg void OnUpdateEditLinkCenters(CCmdUI* pCmdUI); afx_msg void OnViewTimeOfDay(); afx_msg void OnWindow2dwindow(); afx_msg void OnUpdateWindow2dwindow(CCmdUI* pCmdUI); afx_msg void OnViewReloadtextures(); afx_msg void OnEditScripts(); afx_msg void OnViewHome(); afx_msg void OnTexturesizingTile4x4(); afx_msg void OnUpdateTexturesizingTile4x4(CCmdUI* pCmdUI); afx_msg void OnTexturesizingTile6x6(); afx_msg void OnUpdateTexturesizingTile6x6(CCmdUI* pCmdUI); afx_msg void OnTexturesizingTile8x8(); afx_msg void OnUpdateTexturesizingTile8x8(CCmdUI* pCmdUI); afx_msg void OnDumpDocToText(); afx_msg void OnRemoveclifftexmapping(); afx_msg void OnTogglePitchAndRotation(); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; ///////////////////////////////////////////////////////////////////////////// //{{AFX_INSERT_LOCATION}} // Microsoft Visual C++ will insert additional declarations immediately before the previous line. #endif // !defined(AFX_WORLDBUILDERDOC_H__FBA4134D_2826_11D5_8CE0_00010297BBAC__INCLUDED_)