|
|
//===== 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 <class MapClass> MapClass *GetChildOfType( MapClass *ignoredArg ) { FOR_EACH_OBJ( m_Children, pos ) { MapClass *pChild = dynamic_cast<MapClass *>( 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
|