/* * Copyright (c) Contributors to the Open 3D Engine Project. * For complete copyright and license terms please see the LICENSE at the root of this distribution. * * SPDX-License-Identifier: Apache-2.0 OR MIT * */ #ifndef CRYINCLUDE_EDITOR_OBJECTS_ENTITYOBJECT_H #define CRYINCLUDE_EDITOR_OBJECTS_ENTITYOBJECT_H #pragma once #if !defined(Q_MOC_RUN) #include "BaseObject.h" #include "IMovieSystem.h" #include "IEntityObjectListener.h" #include "Gizmo.h" #include "CryListenerSet.h" #include "StatObjBus.h" #include #endif #define CLASS_LIGHT "Light" #define CLASS_DESTROYABLE_LIGHT "DestroyableLight" #define CLASS_RIGIDBODY_LIGHT "RigidBodyLight" #define CLASS_ENVIRONMENT_LIGHT "EnvironmentLight" class CEntityObject; class QMenu; /*! * CEntityEventTarget is an Entity event target and type. */ struct CEntityEventTarget { CBaseObject* target; //! Target object. _smart_ptr pLineGizmo; QString event; QString sourceEvent; }; ////////////////////////////////////////////////////////////////////////// // Named link from entity to entity. ////////////////////////////////////////////////////////////////////////// struct CEntityLink { GUID targetId; // Target entity id. CEntityObject* target; // Target entity. QString name; // Name of the link. _smart_ptr pLineGizmo; }; struct IPickEntitesOwner { virtual void AddEntity(CBaseObject* pEntity) = 0; virtual CBaseObject* GetEntity(int nIdx) = 0; virtual int GetEntityCount() = 0; virtual void RemoveEntity(int nIdx) = 0; }; AZ_PUSH_DISABLE_DLL_EXPORT_BASECLASS_WARNING AZ_PUSH_DISABLE_DLL_EXPORT_MEMBER_WARNING /*! * CEntity is an static object on terrain. * */ class CRYEDIT_API CEntityObject : public CBaseObject , public CBaseObject::EventListener { AZ_POP_DISABLE_DLL_EXPORT_MEMBER_WARNING AZ_POP_DISABLE_DLL_EXPORT_BASECLASS_WARNING Q_OBJECT public: ~CEntityObject(); ////////////////////////////////////////////////////////////////////////// // Overrides from CBaseObject. ////////////////////////////////////////////////////////////////////////// //! Return type name of Entity. QString GetTypeDescription() const override { return GetEntityClass(); }; ////////////////////////////////////////////////////////////////////////// bool IsSameClass(CBaseObject* obj) override; bool Init(IEditor* ie, CBaseObject* prev, const QString& file) override; void InitVariables() override; void Done() override; void DrawExtraLightInfo (DisplayContext& disp); bool GetEntityPropertyBool(const char* name) const; int GetEntityPropertyInteger(const char* name) const; float GetEntityPropertyFloat(const char* name) const; QString GetEntityPropertyString(const char* name) const; void SetEntityPropertyBool(const char* name, bool value); void SetEntityPropertyInteger(const char* name, int value); void SetEntityPropertyFloat(const char* name, float value); void SetEntityPropertyString(const char* name, const QString& value); int MouseCreateCallback(CViewport* view, EMouseEvent event, QPoint& point, int flags) override; void OnContextMenu(QMenu* menu) override; void SetName(const QString& name) override; void SetSelected(bool bSelect) override; void GetLocalBounds(AABB& box) override; bool HitTest(HitContext& hc) override; bool HitHelperTest(HitContext& hc) override; bool HitTestRect(HitContext& hc) override; void UpdateVisibility(bool bVisible) override; bool ConvertFromObject(CBaseObject* object) override; using CBaseObject::Serialize; void Serialize(CObjectArchive& ar) override; void PostLoad(CObjectArchive& ar) override; XmlNodeRef Export(const QString& levelPath, XmlNodeRef& xmlNode) override; ////////////////////////////////////////////////////////////////////////// void OnEvent(ObjectEvent event) override; void SetTransformDelegate(ITransformDelegate* pTransformDelegate) override; // Set attach flags and target enum EAttachmentType { eAT_Pivot, eAT_GeomCacheNode, eAT_CharacterBone, }; void SetAttachType(const EAttachmentType attachmentType) { m_attachmentType = attachmentType; } void SetAttachTarget(const char* target) { m_attachmentTarget = target; } EAttachmentType GetAttachType() const { return m_attachmentType; } QString GetAttachTarget() const { return m_attachmentTarget; } void SetHelperScale(float scale) override; float GetHelperScale() override; void GatherUsedResources(CUsedResources& resources) override; bool IsSimilarObject(CBaseObject* pObject) override; bool HasMeasurementAxis() const override { return false; } bool IsIsolated() const override { return false; } ////////////////////////////////////////////////////////////////////////// // END CBaseObject ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// // CEntity interface. ////////////////////////////////////////////////////////////////////////// virtual void DeleteEntity() {} QString GetEntityClass() const { return m_entityClass; }; int GetEntityId() const { return m_entityId; }; ////////////////////////////////////////////////////////////////////////// //! Return number of event targets of Script. int GetEventTargetCount() const { return static_cast(m_eventTargets.size()); }; CEntityEventTarget& GetEventTarget(int index) { return m_eventTargets[index]; }; //! Add new event target, returns index of created event target. //! Event targets are Always entities. int AddEventTarget(CBaseObject* target, const QString& event, const QString& sourceEvent, bool bUpdateScript = true); //! Remove existing event target by index. void RemoveEventTarget(int index, bool bUpdateScript = true); ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// // Entity Links. ////////////////////////////////////////////////////////////////////////// //! Return number of event targets of Script. int GetEntityLinkCount() const { return static_cast(m_links.size()); }; CEntityLink& GetEntityLink(int index) { return m_links[index]; }; virtual int AddEntityLink(const QString& name, GUID targetEntityId); virtual bool EntityLinkExists(const QString& name, GUID targetEntityId); void RenameEntityLink(int index, const QString& newName); void RemoveEntityLink(int index); void RemoveAllEntityLinks(); virtual void EntityLinked([[maybe_unused]] const QString& name, [[maybe_unused]] GUID targetEntityId){} virtual void EntityUnlinked([[maybe_unused]] const QString& name, [[maybe_unused]] GUID targetEntityId) {} void LoadLink(XmlNodeRef xmlNode, CObjectArchive* pArchive = nullptr); void SaveLink(XmlNodeRef xmlNode); ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// int GetCastShadowMinSpec() const { return mv_castShadowMinSpec; } float GetRatioLod() const { return static_cast(mv_ratioLOD); }; float GetViewDistanceMultiplier() const { return mv_viewDistanceMultiplier; } CVarBlock* GetProperties() const { return m_pProperties; }; CVarBlock* GetProperties2() const { return m_pProperties2; }; bool IsLight() const { return m_bLight; } void Validate(IErrorReport* report) override; // Find CEntity from AZ::EntityId, which can also handle legacy game Ids stored as AZ::EntityIds static CEntityObject* FindFromEntityId(const AZ::EntityId& id); // Get the name of the light animation node assigned to this, if any. QString GetLightAnimation() const; IVariable* GetLightVariable(const char* name) const; void PreInitLightProperty(); void UpdateLightProperty(); void EnableReload(bool bEnable) { m_bEnableReload = bEnable; } static void StoreUndoEntityLink(CSelectionGroup* pGroup); void RegisterListener(IEntityObjectListener* pListener); void UnregisterListener(IEntityObjectListener* pListener); protected: template void SetEntityProperty(const char* name, T value); template T GetEntityProperty(const char* name, T defaultvalue) const; ////////////////////////////////////////////////////////////////////////// //! Must be called after cloning the object on clone of object. //! This will make sure object references are cloned correctly. void PostClone(CBaseObject* pFromObject, CObjectCloneContext& ctx) override; //! Draw default object items. void DrawProjectorPyramid(DisplayContext& dc, float dist); void DrawProjectorFrustum(DisplayContext& dc, Vec2 size, float dist); void OnLoadFailed(); CVarBlock* CloneProperties(CVarBlock* srcProperties); ////////////////////////////////////////////////////////////////////////// //! Callback called when one of entity properties have been modified. void OnPropertyChange(IVariable* var); ////////////////////////////////////////////////////////////////////////// void OnObjectEvent(CBaseObject* target, int event) override; void ResolveEventTarget(CBaseObject* object, unsigned int index); void ReleaseEventTargets(); public: CEntityObject(); static const GUID& GetClassID() { // {C80F8AEA-90EF-471f-82C7-D14FA80B9203} static const GUID guid = { 0xc80f8aea, 0x90ef, 0x471f, { 0x82, 0xc7, 0xd1, 0x4f, 0xa8, 0xb, 0x92, 0x3 } }; return guid; } protected: void DeleteThis() override { delete this; }; ////////////////////////////////////////////////////////////////////////// // Radius callbacks. ////////////////////////////////////////////////////////////////////////// void OnRadiusChange(IVariable* var); void OnInnerRadiusChange(IVariable* var); void OnOuterRadiusChange(IVariable* var); void OnBoxSizeXChange(IVariable* var); void OnBoxSizeYChange(IVariable* var); void OnBoxSizeZChange(IVariable* var); void OnProjectorFOVChange(IVariable* var); void OnProjectorTextureChange(IVariable* var); void OnProjectInAllDirsChange(IVariable* var); ////////////////////////////////////////////////////////////////////////// // Area light callbacks. ////////////////////////////////////////////////////////////////////////// void OnAreaLightChange(IVariable* var); void OnAreaWidthChange(IVariable* var); void OnAreaHeightChange(IVariable* var); void OnAreaFOVChange(IVariable* var); void OnAreaLightSizeChange(IVariable* var); void OnColorChange(IVariable* var); ////////////////////////////////////////////////////////////////////////// // Box projection callbacks. ////////////////////////////////////////////////////////////////////////// void OnBoxProjectionChange(IVariable* var); void OnBoxWidthChange(IVariable* var); void OnBoxHeightChange(IVariable* var); void OnBoxLengthChange(IVariable* var); ////////////////////////////////////////////////////////////////////////// void FreeGameData(); void AdjustLightProperties(CVarBlockPtr& properties, const char* pSubBlock); IVariable* FindVariableInSubBlock(CVarBlockPtr& properties, IVariable* pSubBlockVar, const char* pVarName); unsigned int m_bLoadFailed : 1; unsigned int m_bCalcPhysics : 1; unsigned int m_bDisplayBBox : 1; unsigned int m_bDisplaySolidBBox : 1; unsigned int m_bDisplayAbsoluteRadius : 1; unsigned int m_bDisplayArrow : 1; unsigned int m_bIconOnTop : 1; unsigned int m_bVisible : 1; unsigned int m_bLight : 1; unsigned int m_bAreaLight : 1; unsigned int m_bProjectorHasTexture : 1; unsigned int m_bProjectInAllDirs : 1; unsigned int m_bBoxProjectedCM : 1; unsigned int m_bBBoxSelection : 1; AZ_PUSH_DISABLE_DLL_EXPORT_MEMBER_WARNING Vec3 m_lightColor; //! Entity class. QString m_entityClass; //! Id of spawned entity. int m_entityId; // Used for light entities float m_projectorFOV; IStatObj* m_visualObject; AABB m_box; ////////////////////////////////////////////////////////////////////////// // Main entity parameters. ////////////////////////////////////////////////////////////////////////// CVariable mv_outdoor; CVariable mv_castShadow; // Legacy, required for backwards compatibility CSmartVariableEnum mv_castShadowMinSpec; CVariable mv_ratioLOD; CVariable mv_viewDistanceMultiplier; CVariable mv_hiddenInGame; // Entity is hidden in game (on start). CVariable mv_recvWind; CVariable mv_renderNearest; CVariable mv_noDecals; CVariable mv_createdThroughPool; CVariable mv_obstructionMultiplier; ////////////////////////////////////////////////////////////////////////// // Temp variables (Not serializable) just to display radii from properties. ////////////////////////////////////////////////////////////////////////// // Used for proximity entities. float m_proximityRadius; float m_innerRadius; float m_outerRadius; // Used for probes float m_boxSizeX; float m_boxSizeY; float m_boxSizeZ; // Used for area lights float m_fAreaWidth; float m_fAreaHeight; float m_fAreaLightSize; // Used for box projected cubemaps float m_fBoxWidth; float m_fBoxHeight; float m_fBoxLength; ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// // Event Targets. ////////////////////////////////////////////////////////////////////////// //! Array of event targets of this Entity. typedef std::vector EventTargets; EventTargets m_eventTargets; ////////////////////////////////////////////////////////////////////////// // Links typedef std::vector Links; Links m_links; //! Entity properties variables. CVarBlockPtr m_pProperties; //! Per instance entity properties variables CVarBlockPtr m_pProperties2; // Physics state, as a string. XmlNodeRef m_physicsState; AZ_POP_DISABLE_DLL_EXPORT_MEMBER_WARNING static float m_helperScale; EAttachmentType m_attachmentType; bool m_bEnableReload; QString m_attachmentTarget; private: struct VariableCallbackIndex { enum : unsigned char { OnAreaHeightChange = 0, OnAreaLightChange, OnAreaLightSizeChange, OnAreaWidthChange, OnBoxHeightChange, OnBoxLengthChange, OnBoxProjectionChange, OnBoxSizeXChange, OnBoxSizeYChange, OnBoxSizeZChange, OnBoxWidthChange, OnColorChange, OnInnerRadiusChange, OnOuterRadiusChange, OnProjectInAllDirsChange, OnProjectorFOVChange, OnProjectorTextureChange, OnPropertyChange, OnRadiusChange, // must be at the end Count, }; }; void ResetCallbacks(); void SetVariableCallback(IVariable* pVar, IVariable::OnSetCallback* func); void ClearCallbacks(); void ForceVariableUpdate(); AZ_PUSH_DISABLE_DLL_EXPORT_MEMBER_WARNING CListenerSet m_listeners; std::vector< std::pair > m_callbacks; AZStd::fixed_vector< IVariable::OnSetCallback, VariableCallbackIndex::Count > m_onSetCallbacksCache; AZ_POP_DISABLE_DLL_EXPORT_MEMBER_WARNING }; #endif // CRYINCLUDE_EDITOR_OBJECTS_ENTITYOBJECT_H