diff options
Diffstat (limited to 'hammer/mapdoc.h')
| -rw-r--r-- | hammer/mapdoc.h | 990 |
1 files changed, 990 insertions, 0 deletions
diff --git a/hammer/mapdoc.h b/hammer/mapdoc.h new file mode 100644 index 0000000..8336a06 --- /dev/null +++ b/hammer/mapdoc.h @@ -0,0 +1,990 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//===========================================================================// + +#ifndef MAPDOC_H +#define MAPDOC_H +#ifdef _WIN32 +#pragma once +#endif + +#include "MapClass.h" +#include "Selection.h" +#include "MapEntity.h" +#include "GameConfig.h" +#include "filesystem.h" +#include "tier1/utlrbtree.h" +#include "tier1/utlstack.h" + +class CToolManager; +class CMapDoc; +class CGameConfig; +class CHistory; +class CMapGroup; +class CMapView; +class CMapView3D; +class CMapView2D; +class IBSPLighting; +class CRender; +class CManifest; + +struct FindEntity_t; +struct FindGroup_t; +struct AddNonSelectedInfo_t; + + +enum SelectionHandleMode_t; +enum MAPFORMAT; +enum ToolID_t; + + +enum +{ + // hints what recently changed + MAPVIEW_UPDATE_OBJECTS = 0x001, // a world object has changed (pos, size etc) + MAPVIEW_UPDATE_ANIMATION = 0x002, // an object animation has been changed + MAPVIEW_UPDATE_COLOR = 0x004, // an object color has been changed + MAPVIEW_UPDATE_SELECTION = 0x008, // the current selection has changed + MAPVIEW_UPDATE_TOOL = 0x010, // the current tool has been changed + + // what views should be updated + MAPVIEW_UPDATE_ONLY_2D = 0x020, // update only 2D views for some reason + MAPVIEW_UPDATE_ONLY_3D = 0x040, // update only 3D views for some reason + MAPVIEW_UPDATE_ONLY_LOGICAL = 0x080, // update only Logical views for some reason + + MAPVIEW_OPTIONS_CHANGED = 0x100, // view options has been changed + MAPVIEW_UPDATE_VISGROUP_STATE = 0x200, // a visgroup was hidden or shown. + MAPVIEW_UPDATE_VISGROUP_ALL = 0x400, // a visgroup was created or deleted. + + MAPVIEW_RENDER_NOW = 0x800, // bypass the main frame loop and render now +}; + + +// Flags for view2dinfo.wflags +enum +{ + VI_ZOOM = 0x01, + VI_CENTER = 0x02 +}; + + +// Display modes for instances +enum ShowInstance_t +{ + INSTANCES_HIDE = 0, // instance contents are not displayed + INSTANCES_SHOW_TINTED, // instance contents are displayed with a yellowish tint + INSTANCES_SHOW_NORMAL // instance contents are displayed normally +}; + + +enum VMFLoadFlags_t +{ + VMF_LOAD_ACTIVATE = 0x01, // loading map should be activated + VMF_LOAD_IS_SUBMAP = 0x02, // loading map is part of an instance / manifest +}; + +typedef struct +{ + WORD wFlags; + float fZoom; + Vector ptCenter; +} VIEW2DINFO; + +struct ExportDXFInfo_s +{ + int nObject; + bool bVisOnly; + CMapWorld *pWorld; + FILE *fp; +}; + + +// +// The doc holds a list of objects with dependents that changed since the last render. The list +// must be processed before rendering so that interobject dependencies are resolved. +// +struct NotifyListEntry_t +{ + CSmartPtr< CSafeObject< CMapClass > > pObject; + Notify_Dependent_t eNotifyType; +}; + + +// +// To pass as hint to UpdateAllViews. +// +class UpdateBox : public CObject +{ + public: + + UpdateBox(void) { Objects = NULL; } + + CMapObjectList *Objects; + BoundBox Box; +}; + +// this holds all of the data needed to visualize the level's portal file +struct portalfile_t +{ + CString fileName; + int totalVerts; + CUtlVector<Vector> verts; + CUtlVector<int> vertCount; +}; + + +struct UpdateVisibilityData_t +{ + CMapDoc *pDoc; + bool bRadiusCullingEnabled; + Vector vecRadiusCullCenter; + float flRadiusCullDistSq; +}; + + +// this is a structure to manage clipboards +class IHammerClipboard +{ +protected: + IHammerClipboard(){} + virtual ~IHammerClipboard() {} + +public: + static IHammerClipboard *CreateInstance(); + +public: + virtual void Destroy() = 0; +}; + + +class CMapDoc : public CDocument +{ + friend class CManifest; + + protected: + DECLARE_DYNCREATE(CMapDoc) + + public: + + // attribs: + bool m_bSnapToGrid; + bool m_bShowGrid; + bool m_bShowLogicalGrid; + + // pointfile stuff: + enum + { + PFPNext = 1, + PFPPrev = -1 + }; + + int m_iCurPFPoint; + CUtlVector<Vector> m_PFPoints; + CString m_strLastPointFile; + portalfile_t *m_pPortalFile; + + static inline CMapDoc *GetActiveMapDoc(void); + static void SetActiveMapDoc(CMapDoc *pDoc); + static void ActivateMapDoc( CMapDoc *pDoc ); + static inline CManifest *GetManifest(void); + static inline int GetInLevelLoad( ); + + private: + + static CMapDoc *m_pMapDoc; + static CManifest *m_pManifest; + static int m_nInLevelLoad; + + public: + + CMapDoc(void); + virtual ~CMapDoc(); + + virtual void Initialize( void ); + + virtual bool IsManifest( void ) { return false; } + + IBSPLighting *GetBSPLighting() { return m_pBSPLighting; } + CToolManager *GetTools() { return m_pToolManager; } // return tools working on this document + CSelection *GetSelection() { return m_pSelection; } // return current selection + + void BeginShellSession(void); + void EndShellSession(void); + bool IsShellSessionActive(void); + + inline int GetDocVersion(void); + inline void DecrementDocVersion(void); + + // + // Interface to the map document. Functions for object creation, deletion, etc. + // + CMapEntity *CreateEntity(const char *pszClassName, float x, float y, float z); + bool DeleteEntity(const char *pszClassName, float x, float y, float z); + + CMapEntity *FindEntity(const char *pszClassName, float x, float y, float z); + + CMapEntity *FindEntityByName( const char *pszName, bool bVisiblesOnly ); + bool FindEntitiesByKeyValue(CMapEntityList &Found, const char *szKey, const char *szValue, bool bVisiblesOnly); + bool FindEntitiesByName(CMapEntityList &Found, const char *szName, bool bVisiblesOnly); + bool FindEntitiesByClassName(CMapEntityList &Found, const char *szClassName, bool bVisiblesOnly); + bool FindEntitiesByNameOrClassName(CMapEntityList &Found, const char *pszName, bool bVisiblesOnly); + + virtual void Update(void); + virtual void SetModifiedFlag(BOOL bModified = TRUE); + void SetAutosaveFlag(BOOL bAutosave = TRUE); + + BOOL NeedsAutosave(); + BOOL IsAutosave(); + CString *AutosavedFrom(); + + void AddReference( void ); + void RemoveReference( void ); + int GetReferenceCount( void ) { return m_nExternalReferenceCount; } + + // Used to track down a potential crash. + bool AnyNotificationsForObject(CMapClass *pObject); + + void SetAnimationTime( float time ); + float GetAnimationTime( void ) { return m_flAnimationTime; } + bool IsAnimating( void ) { return m_bIsAnimating; } + + // other stuff + float m_flCurrentTime; + void UpdateCurrentTime( void ); + float GetTime( void ) { return m_flCurrentTime; } + + void GotoPFPoint(int iDirection); + + // world cordon + bool IsCordoning(void); + bool SetCordoning( bool bState); + void GetCordon( Vector &mins, Vector &maxs); + void SetCordon( const Vector &mins, const Vector &maxs); + CMapWorld *CordonCreateWorld(); + ChunkFileResult_t CordonSaveVMF(CChunkFile *pFile, CSaveInfo *pSaveInfo); + Vector m_vCordonMins; + Vector m_vCordonMaxs; + bool m_bIsCordoning; + + CMapView *GetActiveMapView(); + CMapView3D *GetFirst3DView(); + void Snap(Vector &pt, int nFlags = 0); + inline bool IsSnapEnabled(void); + + // + // Face selection for face editing. + // + void SelectFace(CMapSolid *pSolid, int iFace, int cmd); + void UpdateForApplicator(BOOL bApplicator); + + + void UpdateAnimation( void ); + + void DeleteObject(CMapClass *pObject); + void DeleteObjectList(CMapObjectList &List); + + void InternalEnableLightPreview( bool bCustomFilename ); + + // + // Object selection: + // + bool SelectObject(CMapClass *pobj, int cmd = scSelect); + void SelectObjectList(const CMapObjectList *pList, int cmd = (scSelect|scClear|scSaveChanges) ); + void SelectRegion( BoundBox *pBox, bool bInsideOnly, bool ResetSelection = true ); + void SelectLogicalRegion( const Vector2D &vecMins, const Vector2D &vecMaxs, bool bInsideOnly); + + // View centering. + void CenterViewsOnSelection(); + void CenterViewsOn(const Vector &vec); + void CenterLogicalViewsOnSelection(); + void CenterLogicalViewsOn(const Vector2D &vecLogical); + void Center2DViewsOnSelection(); + void Center2DViewsOn(const Vector &vec); + void Center3DViewsOnSelection(); + void Center3DViewsOn(const Vector &vPos); + void Set3DViewsPosAng( const Vector &vPos, const Vector &vAng ); + void GetSelectedCenter(Vector &vCenter); + + void GetBestVisiblePoint(Vector &ptOrg); + void Cut( IHammerClipboard *pClipboard ); + void Copy( IHammerClipboard *pClipboard = NULL ); + void Paste(CMapObjectList &Objects, CMapWorld *pSourceWorld, CMapWorld *pDestWorld, Vector vecOffset, QAngle vecRotate, CMapClass *pParent, bool bMakeEntityNamesUnique, const char *pszEntityNamePrefix); + void PasteInstance(CMapObjectList &Objects, CMapWorld *pSourceWorld, CMapWorld *pDestWorld, Vector vecOffset, QAngle vecRotate, CMapClass *pParent, bool bMakeEntityNamesUnique, const char *pszEntityNamePrefix); + void Paste( IHammerClipboard *pClipboard, CMapWorld *pDestWorld, Vector vecOffset, QAngle vecRotate, CMapClass *pParent, bool bMakeEntityNamesUnique, const char *pszEntityNamePrefix ); + void Delete( void ); + + // FIXME: refactor these! + void CloneObjects(const CMapObjectList &Objects); + void NudgeObjects(const Vector &Delta, bool bClone); + void GetNudgeVector(const Vector& vHorz, const Vector& vVert, int nChar, bool bSnap, Vector &vecNudge); + + void GetBestPastePoint(Vector &vecPasteOrigin); + void UpdateStatusbar(); + void UpdateStatusBarSnap(); + void SetView2dInfo(VIEW2DINFO& vi); + void SetViewLogicalInfo(VIEW2DINFO& vi); + void SetActiveView(CMapView *pViewActivate); + void SetUndoActive(bool bActive); + void UpdateTitle(CView*); + + void CountSolids(); + void CountSolids2(); + + void ReplaceTextures( + LPCTSTR pszFind, + LPCTSTR pszReplace, + BOOL bEverything, + int iAction, + BOOL bHidden, + bool bRescaleTextureCoordinates); + + void BatchReplaceTextures( FileHandle_t fp ); + + bool Is3DGridEnabled(void) { return(m_bShow3DGrid); } + ShowInstance_t GetShowInstance( void ) { return m_tShowInstance; } + + void ReleaseVideoMemory( ); + + inline MAPFORMAT GetMapFormat(void); + inline CMapWorld *GetMapWorld(void); + inline CGameConfig *GetGame(void); + inline int GetGridSpacing(void) { return(max(m_nGridSpacing, 1)); } + + inline CHistory *GetDocHistory(void); + + inline int GetNextMapObjectID(void); + inline int GetNextNodeID(void); + inline void SetNextNodeID(int nID); + + static int GetDocumentCount(); + static CMapDoc *GetDocument(int index); + + void SetMRU(CMapView2D *pView); + void RemoveMRU(CMapView2D *pView); + CUtlVector<CMapView2D*> MRU2DViews; + + // if theres anything the document whats to show, do it in RenderDocument() + void RenderDocument(CRender *pRender); + + void RenderAllViews(void); + BOOL SelectDocType(void); + BOOL SaveModified(void); + + // Set edit prefab mode. + void EditPrefab3D(DWORD dwPrefabID); + + // + // Call these when modifying the document contents. + // + virtual void AddObjectToWorld(CMapClass *pObject, CMapClass *pParent = NULL); + BOOL FindObject(CMapClass *pObject); + void RemoveObjectFromWorld(CMapClass *pMapClass, bool bNotifyChildren); + void RenderPreloadObject(CMapClass *pObject); + void UpdateObject(CMapClass *pMapClass); + void UpdateVisibilityAll(void); + void UpdateVisibility(CMapClass *pObject); + void NotifyDependents(CMapClass *pObject, Notify_Dependent_t eNotifyType); + + // Radius culling + bool IsCulledBy3DCameraDistance( CMapClass *pObject, UpdateVisibilityData_t *pData ); + + // + // Morph tool. + // + void Morph_SelectObject(CMapSolid *pSolid, unsigned int uCmd); + void Morph_GetBounds(Vector &mins, Vector &maxs, bool bReset); + int Morph_GetObjectCount(void); + CSSolid *Morph_GetFirstObject(POSITION &pos); + CSSolid *Morph_GetNextObject(POSITION &pos); + + // + inline bool IsDispSolidDrawMask( void ) { return m_bDispSolidDrawMask; } + inline void SetDispDrawWalkable( bool bValue ) { m_bDispDrawWalkable = bValue; } + inline bool IsDispDrawWalkable( void ) { return m_bDispDrawWalkable; } + inline bool IsDispDraw3D() { return m_bDispDraw3D; } + inline void SetDispDrawBuildable( bool bValue ) { m_bDispDrawBuildable = bValue; } + inline bool IsDispDrawBuildable( void ) { return m_bDispDrawBuildable; } + inline void SetDispDrawRemove( bool bValue ) { m_bDispDrawRemove = bValue; } + inline bool IsDispDrawRemove( void ) { return m_bDispDrawRemove; } + inline bool IsDispDrawRemovedVerts( void ) { return m_bDispDrawRemovedVerts; } + inline void SetDispDrawRemovedVerts( bool bValue ) { m_bDispDrawRemovedVerts = bValue; } + + // + // List of VisGroups. + // + void ShowNewVisGroupsDialog(CMapObjectList &Objects, bool bUnselectObjects); + void VisGroups_CreateNamedVisGroup(CMapObjectList &Objects, const char *szName, bool bHide, bool bRemoveFromOtherVisGroups); + void VisGroups_AddObjectsToVisGroup(CMapObjectList &Objects, CVisGroup *pVisGroup, bool bHide, bool bRemoveFromOtherVisGroups); + CVisGroup *VisGroups_AddGroup(CVisGroup *pGroup); + bool VisGroups_ObjectCanBelongToVisGroup(CMapClass *pObject); + CVisGroup *VisGroups_AddGroup(LPCTSTR pszName, bool bAuto = false); + static BOOL VisGroups_CheckForGroupCallback(CMapClass *pObject, CVisGroup *pGroup); + int VisGroups_GetCount(); + CVisGroup *VisGroups_GetVisGroup(int nIndex); + int VisGroups_GetRootCount(); + CVisGroup *VisGroups_GetRootVisGroup(int nIndex); + CVisGroup *VisGroups_GroupForID(DWORD id); + CVisGroup *VisGroups_GroupForName( const char *pszName, bool bIsAuto ); + void VisGroups_PurgeGroups(); + void VisGroups_MoveUp(CVisGroup *pGroup); + void VisGroups_MoveDown(CVisGroup *pGroup); + void VisGroups_ShowVisGroup(CVisGroup *pGroup, bool bShow); + void VisGroups_UpdateAll(); + void VisGroups_UpdateForObject(CMapClass *pObject); + void VisGroups_SetParent(CVisGroup *pVisGroup, CVisGroup *pNewParent); + bool VisGroups_CanMoveUp(CVisGroup *pGroup); + bool VisGroups_CanMoveDown(CVisGroup *pGroup); + void VisGroups_RemoveGroup(CVisGroup *pGroup); + void VisGroups_CombineGroups(CVisGroup *pFrom, CVisGroup *pTo); + bool VisGroups_LockUpdates( bool bLock ); + void VisGroups_CheckMemberVisibility(CVisGroup *pGroup); + + // Quick Hide + void QuickHide_HideObjects( void ); + void QuickHide_HideUnselectedObjects( void ); + void QuickHide_Unhide( void ); + bool QuickHide_IsObjectHidden( CMapClass *pObject ); + ChunkFileResult_t QuickHide_SaveVMF( CChunkFile *pFile, CSaveInfo *pSaveInfo ); + CUtlVector< CMapClass* > m_QuickHideGroup; + CUtlVector< CMapClass* > m_QuickHideGroupedParents; + + // Default logical placement for new entities + void GetDefaultNewLogicalPosition( Vector2D &vecPosition ); + + private: + + void VisGroups_Validate(); + void VisGroups_UpdateParents(); + void VisGroups_UnlinkGroup(CVisGroup *pGroup); + void VisGroups_DoRemoveOrCombine(CVisGroup *pFrom, CVisGroup *pTo); + + bool FindNotification(CMapClass *pObject, Notify_Dependent_t eNotifyType); + + protected: + + // ClassWizard generated virtual function overrides + //{{AFX_VIRTUAL(CMapDoc) + public: + virtual BOOL OnNewDocument(); + virtual void DeleteContents(); + virtual BOOL OnOpenDocument(LPCTSTR lpszPathName); + virtual void OnCloseDocument(void); + virtual BOOL OnSaveDocument(LPCTSTR lpszPathName); + //}}AFX_VIRTUAL + + BOOL Serialize(std::fstream &file, BOOL fIsStoring, BOOL bRMF); + + // Save a VMF file. saveFlags is a combination of SAVEFLAGS_ defines. + bool SaveVMF(const char *pszFileName, int saveFlags ); + + bool LoadVMF( const char *pszFileName, int LoadFlags = VMF_LOAD_ACTIVATE ); + void Postload(const char *pszFileName); + inline bool IsLoading(void); + + inline void SetInitialUpdate( void ) { m_bHasInitialUpdate = true; } + inline bool HasInitialUpdate( void ) { return m_bHasInitialUpdate; } + + // manifest routines + void SetManifest( CManifest *pManifest ); + void SetEditable( bool IsEditable ) { m_bIsEditable = IsEditable; } + bool IsEditable( void ) { return m_bIsEditable; } + bool IsSelectionEditable( void ); + bool CreateNewManifest( void ); + CMapWorld *GetCurrentWorld( void ); + int GetClipboardCount( void ); + void ManifestPaste( CMapWorld *pDestWorld, Vector vecOffset, QAngle vecRotate, CMapClass *pParent, bool bMakeEntityNamesUnique, const char *pszEntityNamePrefix ); + virtual void UpdateInstanceMap( CMapDoc *pInstanceMapDoc ); + void CollapseInstances( bool bOnlySelected ); + void PopulateInstanceParms_r( CMapEntity *pEntity, const CMapObjectList *pChildren, CUtlVector< CString > &ParmList ); + void PopulateInstanceParms( CMapEntity *pEntity ); + void PopulateInstance( CMapEntity *pEntity ); + void InstanceMoved( void ); + + void ShowWindow( bool bIsVisible ); + bool IsVisible( void ); + + void BuildAllDetailObjects(); + + void ExpandObjectKeywords(CMapClass *pObject, CMapWorld *pWorld); + + #ifdef _DEBUG + virtual void AssertValid() const; + virtual void Dump(CDumpContext& dc) const; + #endif + + void UpdateAllCameras(const Vector *vecViewPos, const Vector *vecLookAt, const float *fZoom); + void UpdateAllViews(int nFlags, UpdateBox *ub = NULL ); + + void SetSmoothingGroupVisual( int iGroup ) { m_SmoothingGroupVisual = iGroup; } + int GetSmoothingGroupVisual( void ) { return m_SmoothingGroupVisual; } + + void AddToAutoVisGroup( CMapClass *pObject ); + void AddToAutoVisGroup( CMapClass *pObject, const char *pAutoVisGroup ); + void AddChildGroupToAutoVisGroup( CMapClass *pObject, const char *pAutoVisGroup, const char *pParentName ); + void RemoveFromAutoVisGroups( CMapClass *pObject ); + void AddToFGDAutoVisGroups( CMapClass *pObject ); + + // Builds a list of all objects which are connected to outputs of pObj + void BuildCascadingSelectionList( CMapClass *pObj, CUtlRBTree< CMapClass*, unsigned short > &list, bool bRecursive ); + + void Public_SaveMap() { OnFileSave(); } + protected: + + void AssignAllToAutoVisGroups(); + CVisGroup *GetRootAutoVisGroup(); + + // Tools: + CToolManager *m_pToolManager; + + int m_nGridSpacing; + + bool m_bDispSolidDrawMask; + bool m_bDispDrawWalkable; + bool m_bDispDraw3D; + bool m_bDispDrawBuildable; + bool m_bDispDrawRemove; + bool m_bDispDrawRemovedVerts; + + bool m_bHasInitialUpdate; + bool m_bLoading; // Set to true while we are being loaded from VMF. + + static BOOL GetBrushNumberCallback(CMapClass *pObject, void *pFindInfo); + + // + // Serialization. + // + ChunkFileResult_t SaveVersionInfoVMF(CChunkFile *pFile, bool bIsAutosave = false); + ChunkFileResult_t VisGroups_SaveVMF(CChunkFile *pFile, CSaveInfo *pSaveInfo); + ChunkFileResult_t SaveViewSettingsVMF(CChunkFile *pFile, CSaveInfo *pSaveInfo); + + static bool HandleLoadError(CChunkFile *pFile, const char *szChunkName, ChunkFileResult_t eError, CMapDoc *pDoc); + static ChunkFileResult_t LoadCordonCallback(CChunkFile *pFile, CMapDoc *pDoc); + static ChunkFileResult_t LoadCordonKeyCallback(const char *pszKey, const char *pszValue, CMapDoc *pDoc); + static ChunkFileResult_t LoadEntityCallback(CChunkFile *pFile, CMapDoc *pDoc); + static ChunkFileResult_t LoadHiddenCallback(CChunkFile *pFile, CMapDoc *pDoc); + static ChunkFileResult_t LoadGroupKeyCallback(const char *szKey, const char *szValue, CMapGroup *pGroup); + static ChunkFileResult_t LoadVersionInfoCallback(CChunkFile *pFile, CMapDoc *pDoc); + static ChunkFileResult_t LoadVersionInfoKeyCallback(const char *szKey, const char *szValue, CMapDoc *pDoc); + static ChunkFileResult_t LoadAutosaveCallback(CChunkFile *pFile, CMapDoc *pDoc); + static ChunkFileResult_t LoadAutosaveKeyCallback(const char *szKey, const char *szValue, CMapDoc *pDoc); + static ChunkFileResult_t LoadWorldCallback(CChunkFile *pFile, CMapDoc *pDoc); + static ChunkFileResult_t LoadViewSettingsCallback(CChunkFile *pFile, CMapDoc *pDoc); + static ChunkFileResult_t LoadViewSettingsKeyCallback(const char *szKey, const char *szValue, CMapDoc *pDoc); + + // + // Search functions. + // + static BOOL FindEntityCallback(CMapClass *pObject, FindEntity_t *pFindInfo); + static BOOL FindGroupCallback(CMapGroup *pGroup, FindGroup_t *pFindInfo); + + void AssignToVisGroups(void); + void AssignToGroups(void); + void RemoveEmptyGroups(void); + void CountGUIDs(void); + + void InitUpdateVisibilityData( UpdateVisibilityData_t &data ); + bool ShouldObjectBeVisible( CMapClass *pObject, UpdateVisibilityData_t *pData ); + static BOOL UpdateVisibilityCallback( CMapClass *pObject, UpdateVisibilityData_t *pData ); + + bool GetChildrenToHide(CMapClass *pObject, bool bSelected, CMapObjectList &List); + + // + // Interobject dependency notification. + // + void ProcessNotifyList(); + void DispatchNotifyDependents(CMapClass *pObject, Notify_Dependent_t eNotifyType); + + CUtlVector<NotifyListEntry_t > m_NotifyList; + + CMapWorld *m_pWorld; // The world that this document represents. + CMapObjectList m_UpdateList; // List of objects that have changed since the last call to Update. + CString m_strLastExportFileName; // The full path that we last exported this document to. + int m_nDocVersion; // A number that increments every time the doc is modified after being saved. + BOOL m_bNeedsAutosave; // True if the document has been changed and needs autosaved. + BOOL m_bIsAutosave; + CString m_strAutosavedFrom; + + // Undo/Redo system. + CHistory *m_pUndo; + CHistory *m_pRedo; + + CSelection *m_pSelection; // object selection list + + int m_nNextMapObjectID; // The ID that will be assigned to the next CMapClass object in this document. + int m_nNextNodeID; // The ID that will be assigned to the next "info_node_xxx" object created in this document. + + // Editing prefabs data. + DWORD m_dwPrefabID; + DWORD m_dwPrefabLibraryID; + BOOL m_bEditingPrefab; + bool m_bPrefab; // true if this document IS a prefab, false if not. + + // Game configuration. + CGameConfig *m_pGame; + + bool m_bShow3DGrid; // Whether to render a grid in the 3D views. + bool m_bHideItems; // Whether to render point entities in all views. + + int m_nExternalReferenceCount; // Indicates how many external references ( instances ) are pointing to this map + ShowInstance_t m_tShowInstance; // Indicates how instance contents should be displayed + CManifest *m_pManifestOwner; + bool m_bIsEditable; + bool m_bCollapsingInstances; + + // + // Animation. + // + float m_flAnimationTime; // Current time in the animation + bool m_bIsAnimating; + + IBSPLighting *m_pBSPLighting; + + // + // Visgroups. + // + CUtlVector<CVisGroup *> *m_VisGroups; + CUtlVector<CVisGroup *> *m_RootVisGroups; + bool m_bVisGroupUpdatesLocked; + + int m_SmoothingGroupVisual; + + int m_nLogicalPositionCount; + + // + // Expands %i keyword in prefab targetnames to generate unique targetnames for this map. + // + bool ExpandTargetNameKeywords(char *szNewTargetName, const char *szOldTargetName, CMapWorld *pWorld); + bool DoExpandKeywords(CMapClass *pObject, CMapWorld *pWorld, char *szOldKeyword, char *szNewKeyword); + + // Renames all named entities in pRoot + void RenameEntities( CMapClass *pRoot, CMapWorld *pWorld, bool bMakeUnique, const char *pszPrefix ); + + void CenterOriginsRecursive(CMapClass *pObject); + void SnapObjectsRecursive(CMapClass *pObject); + + // Add all entities connected to all entities in the selection list recursively + void AddConnectedNodes( CMapClass *pClass, CUtlRBTree< CMapClass*, unsigned short >& list ); + + //{{AFX_MSG(CMapDoc) + afx_msg void OnEditDelete(); + afx_msg void OnMapSnaptogrid(); + afx_msg void OnMapEntityGallery(); + afx_msg void OnUpdateMapSnaptogrid(CCmdUI* pCmdUI); + afx_msg void OnEditApplytexture(); + afx_msg void OnToolsSubtractselection(); + afx_msg void OnToolsCenterOrigins(); + afx_msg void OnEnableLightPreview(); + afx_msg void OnEnableLightPreviewCustomFilename(); + afx_msg void OnDisableLightPreview(); + afx_msg void OnToggleLightPreview(); + afx_msg void OnUpdateLightPreview(); + afx_msg void OnAbortLightCalculation(); + afx_msg void OnEditCopy(); + afx_msg void OnEditPaste(); + afx_msg void OnUpdateEditSelection(CCmdUI *pCmdUI); + afx_msg void OnUpdateEditPaste(CCmdUI* pCmdUI); + afx_msg void OnEditCut(); + afx_msg void OnEditReplace(); + afx_msg void OnToolsGroup(); + afx_msg void OnToolsUngroup(); + afx_msg void OnUpdateViewGrid(CCmdUI* pCmdUI); + afx_msg void OnUpdateViewLogicalGrid(CCmdUI* pCmdUI); + afx_msg void OnEditSelectall(); + afx_msg void OnFileSaveAs(); + afx_msg void OnFileSave(); + afx_msg void OnMapGridlower(); + afx_msg void OnMapGridhigher(); + afx_msg void OnEditToworld(); + afx_msg void OnEditToWorld(); + afx_msg void OnFileExport(); + afx_msg void OnFileExportAgain(); + afx_msg void OnEditMapproperties(); + afx_msg void OnFileConvertWAD(); + afx_msg void OnUpdateFileConvertWAD(CCmdUI* pCmdUI); + afx_msg void OnFileRunmap(); + afx_msg void OnToolsHideitems(); + afx_msg void OnViewHideUnconnectedEntities(); + afx_msg void OnUpdateViewHideUnconnectedEntities(CCmdUI* pCmdUI); + afx_msg void OnUpdateToolsSubtractselection(CCmdUI* pCmdUI); + afx_msg void OnUpdateToolsHideitems(CCmdUI* pCmdUI); + afx_msg void OnUpdateEditDelete(CCmdUI* pCmdUI); + afx_msg void OnUpdateEditFunction(CCmdUI* pCmdUI); + afx_msg void OnUpdateEditCut(CCmdUI* pCmdUI); + afx_msg void OnUpdateEditMapproperties(CCmdUI* pCmdUI); + afx_msg void OnMapInformation(); + + // View menu + afx_msg void OnViewGrid(); + afx_msg void OnViewLogicalGrid(); + afx_msg void OnViewCenterOnSelection(); + afx_msg void OnViewCenter3DViewsOnSelection(); + afx_msg BOOL OnViewHideObjects(UINT nID); + afx_msg void OnQuickHide_HideObjects(); + afx_msg void OnQuickHide_HideUnselectedObjects(); + afx_msg void OnQuickHide_Unhide(); + afx_msg void OnQuickHide_UpdateUnHide(CCmdUI *pCmdUI); + afx_msg void OnQuickHide_CreateVisGroupFromHidden(); + afx_msg void OnQuickHide_UpdateCreateVisGroupFromHidden(CCmdUI *pCmdUI); + afx_msg void OnViewShowconnections(); + afx_msg void OnViewGotoBrush(void); + afx_msg void OnViewGotoCoords(void); + afx_msg void OnViewShowHelpers(); + afx_msg void OnViewShowModelsIn2D(); + afx_msg void OnViewPreviewModelFade(); + afx_msg void OnCollisionWireframe(); + afx_msg void OnShowDetailObjects(); + afx_msg void OnShowNoDrawBrushes(); + afx_msg void OnRadiusCulling(); + afx_msg void OnUpdateRadiusCulling(CCmdUI *pCmdUI); + + afx_msg void OnToolsHollow(); + afx_msg void OnEditPastespecial(); + afx_msg void OnUpdateEditPastespecial(CCmdUI* pCmdUI); + afx_msg void OnEditSelnext(); + afx_msg void OnEditSelprev(); + afx_msg void OnEditSelnextCascading(); + afx_msg void OnEditSelprevCascading(); + afx_msg void OnLogicalMoveBlock(); + afx_msg void OnLogicalSelectAllCascading(); + afx_msg void OnLogicalSelectAllConnected(); + afx_msg void OnLogicalobjectLayoutgeometric(); + afx_msg void OnLogicalobjectLayoutdefault(); + afx_msg void OnLogicalobjectLayoutlogical(); + afx_msg void OnMapCheck(); + afx_msg void OnUpdateViewShowconnections(CCmdUI* pCmdUI); + afx_msg void OnUpdateFileSave(CCmdUI* pCmdUI); + afx_msg void OnToolsCreateprefab(); + afx_msg void OnInsertprefabOriginal(); + afx_msg void OnEditReplacetex(); + afx_msg void OnToolsSnapselectedtogrid(); + afx_msg void OnToolsSnapSelectedToGridIndividually(); + afx_msg void OnUpdateToolsSplitface(CCmdUI* pCmdUI); + afx_msg void OnToolsSplitface(); + afx_msg void OnToolsTransform(); + afx_msg void OnToolsToggletexlock(); + afx_msg void OnUpdateToolsToggletexlock(CCmdUI* pCmdUI); + afx_msg void OnToolsToggletexlockScale(); + afx_msg void OnUpdateToolsToggletexlockScale(CCmdUI* pCmdUI); + afx_msg void OnToolsTextureAlignment(void); + afx_msg void OnUpdateToolsTextureAlignment(CCmdUI *pCmdUI); + afx_msg void OnToggleCordon(); + afx_msg void OnUpdateToggleCordon(CCmdUI* pCmdUI); + afx_msg void OnUpdateShowNoDrawBrushes(CCmdUI* pCmdUI); + afx_msg void OnEditCordon(); + afx_msg void OnUpdateEditCordon(CCmdUI* pCmdUI); + afx_msg void OnUpdateViewHideUnselectedObjects(CCmdUI* pCmdUI); + afx_msg void OnToggleGroupignore(); + afx_msg void OnUpdateToggleGroupignore(CCmdUI* pCmdUI); + afx_msg void OnVscaleToggle(); + afx_msg void OnMapEntityreport(); + afx_msg void OnToggleSelectbyhandle(); + afx_msg void OnUpdateToggleSelectbyhandle(CCmdUI* pCmdUI); + afx_msg void OnToggleInfiniteselect(); + afx_msg void OnUpdateToggleInfiniteselect(CCmdUI* pCmdUI); + afx_msg void OnFileExporttodxf(); + afx_msg void OnUpdateEditApplytexture(CCmdUI* pCmdUI); + afx_msg void OnMapLoadpointfile(); + afx_msg void OnMapUnloadpointfile(); + afx_msg void OnMapLoadportalfile(); + afx_msg void OnMapUnloadportalfile(); + afx_msg void OnUpdate3dViewUI(CCmdUI* pCmdUI); + afx_msg BOOL OnChange3dViewType(UINT nID); + afx_msg void OnEditToEntity(); + afx_msg BOOL OnUndoRedo(UINT nID); + afx_msg void OnUpdateUndoRedo(CCmdUI* pCmdUI); + afx_msg void OnChangeVertexscale(); + afx_msg void OnUpdateGroupEditFunction(CCmdUI* pCmdUI); + afx_msg void OnUpdateFileExport(CCmdUI *pCmdUI); + afx_msg void OnEditClearselection(); + afx_msg void OnUpdateToggle3DGrid(CCmdUI* pCmdUI); + afx_msg void OnMapShowSelectedBrushNumber(); + afx_msg void OnEditFindEntities(void); + afx_msg void OnToolsHideEntityNames(void); + afx_msg void OnUpdateToolsHideEntityNames(CCmdUI *pCmdUI); + afx_msg void OnToggleDispSolidMask( void ); + afx_msg void OnUpdateToggleSolidMask(CCmdUI* pCmdUI); + afx_msg void OnToggleDispDrawWalkable( void ); + afx_msg void OnUpdateToggleDispDrawWalkable(CCmdUI* pCmdUI); + afx_msg void OnToggleDispDraw3D( void ); + afx_msg void OnUpdateToggleDispDraw3D(CCmdUI* pCmdUI); + afx_msg void OnToggleDispDrawBuildable( void ); + afx_msg void OnUpdateToggleDispDrawBuildable(CCmdUI* pCmdUI); + afx_msg void OnToggleDispDrawRemovedVerts( void ); + afx_msg void OnUpdateToggleDispDrawRemovedVerts(CCmdUI* pCmdUI); + afx_msg void OnUpdateViewShowHelpers(CCmdUI *pCmdUI); + afx_msg void OnUpdateViewShowModelsIn2D(CCmdUI *pCmdUI); + afx_msg void OnUpdateViewPreviewModelFade(CCmdUI *pCmdUI); + afx_msg void OnUpdateCollisionWireframe(CCmdUI *pCmdUI); + afx_msg void OnUpdateShowDetailObjects(CCmdUI *pCmdUI); + afx_msg void OnMapDiff(); + afx_msg void OnToolsInstancesHide(void); + afx_msg void OnUpdateToolsInstancesHide(CCmdUI *pCmdUI); + afx_msg void OnToolsInstancesShowTinted(void); + afx_msg void OnUpdateToolsInstancesShowTinted(CCmdUI *pCmdUI); + afx_msg void OnToolsInstancesShowNormal(void); + afx_msg void OnUpdateToolsInstancesShowNormal(CCmdUI *pCmdUI); + afx_msg void OnInstancesHideAll( void ); + afx_msg void OnInstancesShowAll( void ); + + public: + afx_msg void OnToggle3DGrid(); + //}}AFX_MSG + + DECLARE_MESSAGE_MAP() + afx_msg void OnInstancingCreatemanifest(); + afx_msg void OnUpdateInstancingCreatemanifest(CCmdUI *pCmdUI); + afx_msg void OnInstancingCheckinAll(); + afx_msg void OnUpdateInstancingCheckinAll( CCmdUI *pCmdUI ); + afx_msg void OnInstancingCheckOutManifest(); + afx_msg void OnUpdateInstancingCheckOutManifest( CCmdUI *pCmdUI ); + afx_msg void OnInstancingAddManifest(); + afx_msg void OnUpdateInstancingAddManifest( CCmdUI *pCmdUI ); + afx_msg void OnInstancesCollapseAll(); + afx_msg void OnInstancesCollapseSelection(); +}; + + +//----------------------------------------------------------------------------- +// Purpose: +// Output : inline void +//----------------------------------------------------------------------------- +void CMapDoc::DecrementDocVersion(void) +{ + if (m_nDocVersion > 0) + { + m_nDocVersion--; + } +} + + +//----------------------------------------------------------------------------- +// Purpose: Returns true if we are loading, false if not. +//----------------------------------------------------------------------------- +bool CMapDoc::IsLoading(void) +{ + return(m_bLoading); +} + + +//----------------------------------------------------------------------------- +// Purpose: Returns the document that is currently active. +//----------------------------------------------------------------------------- +CMapDoc *CMapDoc::GetActiveMapDoc(void) +{ + return(m_pMapDoc); +} + + +//----------------------------------------------------------------------------- +// Purpose: Returns the manifest associated with the active document. +//----------------------------------------------------------------------------- +CManifest *CMapDoc::GetManifest(void) +{ + return m_pManifest; +} + + +//----------------------------------------------------------------------------- +// Purpose: Returns the current level loading depth. 0 = not loading level +//----------------------------------------------------------------------------- +int CMapDoc::GetInLevelLoad( ) +{ + return m_nInLevelLoad; +} + + +//----------------------------------------------------------------------------- +// Purpose: Returns the current version of the document that is being worked on. +//----------------------------------------------------------------------------- +int CMapDoc::GetDocVersion(void) +{ + return(m_nDocVersion); +} + + +//----------------------------------------------------------------------------- +// Purpose: Returns a pointer to the game configuration for this document. +//----------------------------------------------------------------------------- +CGameConfig *CMapDoc::GetGame(void) +{ + return(m_pGame); +} + + +//----------------------------------------------------------------------------- +// Purpose: Returns a pointer to the Undo system for this document. +//----------------------------------------------------------------------------- +CHistory *CMapDoc::GetDocHistory(void) +{ + return(m_pUndo); +} + + +//----------------------------------------------------------------------------- +// Purpose: Returns the map format of the game configuration for this document. +//----------------------------------------------------------------------------- +MAPFORMAT CMapDoc::GetMapFormat(void) +{ + if (m_pGame != NULL) + { + return(m_pGame->mapformat); + } + + return(mfHalfLife2); +} + + +//----------------------------------------------------------------------------- +// Purpose: Returns a pointer to the world that this document edits. +//----------------------------------------------------------------------------- +CMapWorld *CMapDoc::GetMapWorld(void) +{ + return(m_pWorld); +} + + +//----------------------------------------------------------------------------- +// Purpose: All map objects in a given document are assigned a unique ID. +//----------------------------------------------------------------------------- +int CMapDoc::GetNextMapObjectID(void) +{ + return(m_nNextMapObjectID++); +} + + +//----------------------------------------------------------------------------- +// Purpose: Returns the next unique ID for an AI node. Called when an AI node +// is created so that each one can have a unique ID. +// +// We can't use the unique object ID (above) for this because of +// problems with in-engine editing of nodes and node connections. +//----------------------------------------------------------------------------- +int CMapDoc::GetNextNodeID(void) +{ + return(m_nNextNodeID++); +} + + +//----------------------------------------------------------------------------- +// Purpose: Sets the next unique ID for a AI node creation. Called when an AI node +// is created from the shell so that node IDs continue from there. +//----------------------------------------------------------------------------- +void CMapDoc::SetNextNodeID(int nID) +{ + m_nNextNodeID = nID; +} + + +//----------------------------------------------------------------------------- +// Purpose: Returns whether or not grid snap is enabled. Called by the tools and +// views to determine snap behavior. +//----------------------------------------------------------------------------- +bool CMapDoc::IsSnapEnabled(void) +{ + return m_bSnapToGrid; +} + + +#endif // MAPDOC_H |