diff options
Diffstat (limited to 'hammer/mapentity.h')
| -rw-r--r-- | hammer/mapentity.h | 267 |
1 files changed, 267 insertions, 0 deletions
diff --git a/hammer/mapentity.h b/hammer/mapentity.h new file mode 100644 index 0000000..fa7b192 --- /dev/null +++ b/hammer/mapentity.h @@ -0,0 +1,267 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//===========================================================================// + +#ifndef MAPENTITY_H +#define MAPENTITY_H +#pragma once + +#include "MapClass.h" +#include "MapFace.h" // FIXME: For PLANE definition. +#include "EditGameClass.h" + + +class CMapAnimator; +class CRender2D; +class CManifest; + +enum LogicalConnection_t +{ + LOGICAL_CONNECTION_INPUT = 0, + LOGICAL_CONNECTION_OUTPUT, +}; + +int CompareEntityNames(const char *szName1, const char *szName2); + +#define ENTITY_FLAG_IS_LIGHT 1 +#define ENTITY_FLAG_SHOW_IN_LPREVIEW2 2 +#define ENTITY_FLAG_IS_INSTANCE 4 + + +class CMapEntity : public CMapClass, public CEditGameClass +{ + friend CManifest; + +public: + + DECLARE_MAPCLASS(CMapEntity,CMapClass); + + CMapEntity(); + ~CMapEntity(); + + void Debug(void); + + size_t GetSize(); + + int m_EntityTypeFlags; // for fast checks w/o using class name + + // + // For flags field. + // + enum + { + flagPlaceholder = 0x01, // No solids - just a point entity + }; + + enum alignType_e + { + ALIGN_TOP, + ALIGN_BOTTOM, + }; + + bool NameMatches(const char *szName); + bool ClassNameMatches(const char *szName); + + virtual bool ShouldAppearInRaytracedLightingPreview(void) + { + return ( m_EntityTypeFlags & ENTITY_FLAG_SHOW_IN_LPREVIEW2 ) != 0; + } + + static inline void ShowEntityNames(bool bShow) { s_bShowEntityNames = bShow; } + static inline bool GetShowEntityNames(void) { return s_bShowEntityNames; } + + static inline void ShowEntityConnections(bool bShow) { s_bShowEntityConnections = bShow; } + static inline bool GetShowEntityConnections(void) { return s_bShowEntityConnections; } + + static inline void ShowUnconnectedEntities(bool bShow) { s_bShowUnconnectedEntities = bShow; } + static inline bool GetShowUnconnectedEntities(void) { return s_bShowUnconnectedEntities; } + + void ReplaceTargetname(const char *szOldName, const char *szNewName); + + void CalculateTypeFlags( void ); + + virtual void SignalChanged(void ); // object has changed + + inline void SetPlaceholder(BOOL bSet) + { + if (bSet) + { + flags |= flagPlaceholder; + } + else + { + flags &= ~flagPlaceholder; + } + } + + inline BOOL IsPlaceholder(void) + { + return((flags & flagPlaceholder) ? TRUE : FALSE); + } + + bool UpdateObjectColor(); + + // + // CMapClass overrides. + // + bool IsCulledByCordon(const Vector &vecMins, const Vector &vecMaxs); + + // + // Serialization. + // + ChunkFileResult_t LoadVMF(CChunkFile *pFile); + ChunkFileResult_t SaveVMF(CChunkFile *pFile, CSaveInfo *pSaveInfo); + int SerializeRMF(std::fstream&, BOOL); + int SerializeMAP(std::fstream&, BOOL); + virtual void PostloadWorld(CMapWorld *pWorld); + virtual ChunkFileResult_t SaveEditorData(CChunkFile *pFile); + + // + // Rendering. + // + virtual void Render2D(CRender2D *pRender); + virtual void RenderLogical( CRender2D *pRender ); + virtual bool IsLogical(); + virtual bool IsVisibleLogical(void); + virtual void SetLogicalPosition( const Vector2D &vecPosition ); + virtual const Vector2D& GetLogicalPosition( ); + virtual void GetRenderLogicalBox( Vector2D &mins, Vector2D &maxs ); + void GetLogicalConnectionPosition( LogicalConnection_t i, Vector2D &vecPosition ); + + virtual bool ShouldSnapToHalfGrid(); + + virtual void SetOrigin(Vector& o); + virtual void CalcBounds(BOOL bFullUpdate = FALSE); + inline void SetClass(GDclass *pClass) { CEditGameClass::SetClass(pClass); } // Works around a namespace issue. + virtual void SetClass(LPCTSTR pszClassname, bool bLoading = false); + virtual void AlignOnPlane( Vector& pos, PLANE *plane, alignType_e align ); + + // + // Hit testing/selection. + // + virtual CMapClass *PrepareSelection(SelectMode_t eSelectMode); + virtual bool HitTest2D(CMapView2D *pView, const Vector2D &point, HitInfo_t &HitData); + virtual bool HitTestLogical(CMapViewLogical *pView, const Vector2D &point, HitInfo_t &nHitData); + + // + // Notifications. + // + virtual void OnClone(CMapClass *pClone, CMapWorld *pWorld, const CMapObjectList &OriginalList, CMapObjectList &NewList); + virtual void OnPreClone(CMapClass *pClone, CMapWorld *pWorld, const CMapObjectList &OriginalList, CMapObjectList &NewList); + virtual void OnAddToWorld(CMapWorld *pWorld); + virtual void OnRemoveFromWorld(CMapWorld *pWorld, bool bNotifyChildren ); + virtual void OnNotifyDependent(CMapClass *pObject, Notify_Dependent_t eNotifyType); + virtual void OnPrePaste( CMapClass *pCopy, CMapWorld *pSourceWorld, CMapWorld *pDestWorld, const CMapObjectList &OriginalList, CMapObjectList &NewList ); + virtual void OnPaste( CMapClass *pCopyObject, CMapWorld *pSourceWorld, CMapWorld *pDestWorld, const CMapObjectList &OriginalList, CMapObjectList &NewList ); + + virtual void UpdateDependencies(CMapWorld *pWorld, CMapClass *pObject); + + virtual bool OnApply( void ); + + // + // Keyvalue access. We need to know any time one of our keyvalues changes. + // + virtual void SetKeyValue(LPCSTR pszKey, LPCSTR pszValue); + virtual void DeleteKeyValue(LPCTSTR pszKey); + + int GetNodeID(void); + int SetNodeID(int nNodeID); + + void NotifyChildKeyChanged(CMapClass *pChild, const char *szKey, const char *szValue); + + virtual CMapEntity *FindChildByKeyValue( LPCSTR key, LPCSTR value, bool *bIsInInstance = NULL, VMatrix *InstanceMatrix = NULL ); + + virtual CMapClass *Copy(bool bUpdateDependencies); + virtual CMapClass *CopyFrom(CMapClass *pFrom, bool bUpdateDependencies); + + virtual void AddChild(CMapClass *pChild); + + bool HasSolidChildren(void); + + void AssignNodeID(void); + + const char* GetDescription(); + bool IsScaleable() { return !IsPlaceholder(); } + + // animation + bool GetTransformMatrix( VMatrix& matrix ); + BOOL IsAnimationController( void ) { return IsMoveClass(); } + + //----------------------------------------------------------------------------- + // Purpose: If the first child of this entity is of type MapClass, this function + // returns a pointer to that child. + // Output : Returns a pointer to the MapClass that is a child of this + // entity, NULL if the first child of this entity is not MapClass. + //----------------------------------------------------------------------------- + template< class MapClass > + MapClass *GetChildOfType( MapClass *null ) + { + FOR_EACH_OBJ( m_Children, pos ) + { + MapClass *pChild = dynamic_cast<MapClass*>( m_Children.Element(pos) ); + if ( pChild != NULL ) + { + return pChild; + } + } + + return NULL; + } + + // + // CMapAtom implementation. + // + virtual void GetRenderColor( CRender2D *pRender, unsigned char &red, unsigned char &green, unsigned char &blue); + virtual color32 GetRenderColor( CRender2D *pRender ); + +// char const* GetKeyValue( char *symbol ) +// { +// return m_KeyValues.GetValue(symbol ); +// } + +private: + + void EnsureUniqueNodeID(CMapWorld *pWorld); + void OnKeyValueChanged(const char *pszKey, const char *pszOldValue, const char *pszValue); + + // + // Each CMapEntity may have one or more helpers as its children, depending + // on its class definition in the FGD file. + // + void AddBoundBoxForClass(GDclass *pClass, bool bLoading); + void AddHelper(CMapClass *pHelper, bool bLoading); + void AddHelpersForClass(GDclass *pClass, bool bLoading); + void RemoveHelpers(bool bRemoveSolids); + void UpdateHelpers(bool bLoading); + + // Safely sets the move parent. Will assert and not set it if pEnt is equal to this ent, + // or if this ent is already a parent of pEnt. + void SetMoveParent( CMapEntity *pEnt ); + + // + // Chunk and key value handlers for loading. + // + static ChunkFileResult_t LoadSolidCallback(CChunkFile *pFile, CMapEntity *pEntity); + static ChunkFileResult_t LoadEditorCallback(CChunkFile *pFile, CMapEntity *pEntity); + static ChunkFileResult_t LoadHiddenCallback(CChunkFile *pFile, CMapEntity *pEntity); + static ChunkFileResult_t LoadKeyCallback(const char *szKey, const char *szValue, CMapEntity *pEntity); + static ChunkFileResult_t LoadEditorKeyCallback(const char *szKey, const char *szValue, CMapEntity *pEntity); + + static bool s_bShowEntityNames; // Whether to render entity names in the 2D views. + static bool s_bShowEntityConnections; // Whether to render lines indicating entity connections in the 2D views. + static bool s_bShowUnconnectedEntities; // Whether to render unconnected entities in logical views + + WORD flags; // flagPlaceholder + CMapEntity *m_pMoveParent; // for entity movement hierarchy + CMapAnimator *m_pAnimatorChild; + Vector2D m_vecLogicalPosition; // Position in logical space +}; + + +typedef CUtlVector<CMapEntity*> CMapEntityList; + +bool MapEntityList_HasInput(const CMapEntityList *pList, const char *szInput, InputOutputType_t eType = iotInvalid); + +#endif // MAPENTITY_H |