//===== Copyright © 1996-2005, 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 { DECLARE_REFERENCED_CLASS( CMapEntity ); 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) const; bool ClassNameMatches(const char *szName) const; virtual bool ShouldAppearInRaytracedLightingPreview(void) { return ( m_EntityTypeFlags & ENTITY_FLAG_SHOW_IN_LPREVIEW2 ) != 0; } static inline void ShowDotACamera(bool bShow) { s_bShowDotACamera = bShow; } static inline bool GetShowDotACamera(void) { return s_bShowDotACamera; } 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) const { return((flags & flagPlaceholder) ? TRUE : FALSE); } bool UpdateObjectColor(); // // CMapClass overrides. // virtual bool IsIntersectingCordon(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() const { return !IsPlaceholder(); } // animation bool GetTransformMatrix( VMatrix& matrix ); bool IsAnimationController() { 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 MapClass *GetChildOfType( MapClass *ignoredArg ) { FOR_EACH_OBJ( m_Children, pos ) { MapClass *pChild = dynamic_cast( m_Children.Element(pos).GetObject() ); 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_bShowDotACamera; 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 }; class IMapEntity_Type_t : public CMapEntity {}; bool MapEntityList_HasInput(const CMapEntityList *pList, const char *szInput, InputOutputType_t eType = iotInvalid); #endif // MAPENTITY_H