summaryrefslogtreecommitdiff
path: root/hammer/mapdoc.h
diff options
context:
space:
mode:
Diffstat (limited to 'hammer/mapdoc.h')
-rw-r--r--hammer/mapdoc.h990
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