diff --git a/source/SkyXEngine.h b/source/SkyXEngine.h index 4615c45d04e43a0af47d981bcd6981ef477d4e61..f0ce3c3ed761ea62f1f05b37b40e2d228c6f027c 100644 --- a/source/SkyXEngine.h +++ b/source/SkyXEngine.h @@ -292,7 +292,7 @@ QT стиль документирования (!) и QT_AUTOBRIEF - корот #ifndef __SKYXENGINE_H #define __SKYXENGINE_H -#define SKYXENGINE_VERSION "X.9.0-dev" +#define SKYXENGINE_VERSION "X.9.1-dev" #define SKYXENGINE_VERSION4EDITORS "SkyXEngine version " ## SKYXENGINE_VERSION diff --git a/source/game/Editable.cpp b/source/game/Editable.cpp index 6448c8172fbfaef1be17e54f6d0d5c28f614462f..b64fb2d14a3a09d801214efd7d7293dad4664679 100644 --- a/source/game/Editable.cpp +++ b/source/game/Editable.cpp @@ -63,7 +63,7 @@ UINT CEditable::getObjectCount() } return(uResult); } -IXEditorObject *CEditable::getObject(UINT id) +IXEditorObject* CEditable::getObject(UINT id) { UINT uResult = 0; CBaseEntity *pEnt; @@ -73,7 +73,9 @@ IXEditorObject *CEditable::getObject(UINT id) { if(uResult == id) { - return(new CEditorObject(this, pEnt)); + CEditorObject *pObj = new CEditorObject(this, pEnt); + m_aObjects.push_back(pObj); + return(pObj); } ++uResult; } @@ -81,7 +83,26 @@ IXEditorObject *CEditable::getObject(UINT id) return(NULL); } -IXEditorObject *CEditable::newObject(const char *szClassName) +IXEditorObject* CEditable::newObject(const char *szClassName) { - return(new CEditorObject(this, szClassName)); + CEditorObject *pObj = new CEditorObject(this, szClassName); + m_aObjects.push_back(pObj); + return(pObj); +} + +void CEditable::removeObject(CEditorObject *pObject) +{ + int idx = m_aObjects.indexOf(pObject); + if(idx >= 0) + { + m_aObjects.erase(idx); + } +} + +void CEditable::resync() +{ + for(UINT i = 0, l = m_aObjects.size(); i < l; ++i) + { + m_aObjects[i]->resync(); + } } diff --git a/source/game/Editable.h b/source/game/Editable.h index 2df3b94c1ad3b9f90f9c5cf4437591c2c91dc833..8af5ed88d282fff5d4317dff0aceb12d2994adf9 100644 --- a/source/game/Editable.h +++ b/source/game/Editable.h @@ -6,7 +6,7 @@ #include <xcommon/IXCore.h> #include "GameData.h" -class CEditable: public IXUnknownImplementation<IXEditable> +class CEditable final: public IXUnknownImplementation<IXEditable> { friend class CEditorObject; @@ -36,6 +36,8 @@ public: void startup(IGXDevice *pDevice) override; void shutdown() override; + + void resync(); protected: IGXDevice *m_pDevice = NULL; @@ -47,6 +49,10 @@ protected: IXTexture *m_pWhiteTexture = NULL; const char **m_pszClassList = NULL; + + Array<CEditorObject*> m_aObjects; + + void removeObject(CEditorObject *pObject); }; #endif diff --git a/source/game/EditorObject.cpp b/source/game/EditorObject.cpp index 11199d63772dae787d2bb8c5efda1fe6a5422c9a..0d2f3054ce551ded0ff46c3cb14f6cffcea35d24 100644 --- a/source/game/EditorObject.cpp +++ b/source/game/EditorObject.cpp @@ -7,7 +7,8 @@ CEditorObject::CEditorObject(CEditable *pEditable, CBaseEntity *pEntity): m_pEditable(pEditable), - m_pEntity(pEntity) + m_pEntity(pEntity), + m_idEnt(pEntity->getId()) { assert(pEntity); @@ -32,7 +33,7 @@ CEditorObject::CEditorObject(CEditable *pEditable, const char *szClassName): CEditorObject::~CEditorObject() { - + m_pEditable->removeObject(this); } void CEditorObject::_iniFieldList() @@ -205,6 +206,7 @@ void CEditorObject::remove() } REMOVE_ENTITY(m_pEntity); m_pEntity = NULL; + m_idEnt = -1; } void CEditorObject::preSetup() { @@ -219,6 +221,8 @@ void CEditorObject::create() assert(!m_pEntity); m_pEntity = CREATE_ENTITY(m_szClassName, GameData::m_pMgr); + m_idEnt = m_pEntity->getId(); + m_pEntity->setFlags(m_pEntity->getFlags() | EF_LEVEL | EF_EXPORT); setPos(getPos()); @@ -226,6 +230,14 @@ void CEditorObject::create() setScale(getScale()); } +void CEditorObject::resync() +{ + if(ID_VALID(m_idEnt)) + { + m_pEntity = GameData::m_pMgr->getById(m_idEnt); + } +} + void CEditorObject::setKV(const char *szKey, const char *szValue) { if(m_pEntity) diff --git a/source/game/EditorObject.h b/source/game/EditorObject.h index 09f3391934261c57b0793bd10cd31b3a03bedb7c..11580d1de4722ec21a65d3187a5cbfe3e4666beb 100644 --- a/source/game/EditorObject.h +++ b/source/game/EditorObject.h @@ -7,7 +7,7 @@ #include <common/array.h> class CEditable; -class CEditorObject: public IXUnknownImplementation<IXEditorObject> +class CEditorObject final: public IXUnknownImplementation<IXEditorObject> { DECLARE_CLASS(CEditorObject, IXEditorObject); public: @@ -15,28 +15,30 @@ public: CEditorObject(CEditable *pEditable, CBaseEntity *pEntity); ~CEditorObject(); - void setPos(const float3_t &pos); - void setOrient(const SMQuaternion &orient); - void setScale(const float3_t &pos); + void setPos(const float3_t &pos) override; + void setOrient(const SMQuaternion &orient) override; + void setScale(const float3_t &pos) override; - void getBound(float3 *pvMin, float3 *pvMax); + void getBound(float3 *pvMin, float3 *pvMax) override; - void renderSelection(bool is3D); + void renderSelection(bool is3D) override; - bool rayTest(const float3 &vStart, const float3 &vEnd, float3 *pvOut, ID *pidMtrl); + bool rayTest(const float3 &vStart, const float3 &vEnd, float3 *pvOut, ID *pidMtrl) override; - void remove(); - void create(); - void preSetup(); - void postSetup(); + void remove() override; + void create() override; + void preSetup() override; + void postSetup() override; - void setKV(const char *szKey, const char *szValue); - const char *getKV(const char *szKey); - const X_PROP_FIELD *getPropertyMeta(UINT uKey); - UINT getProperyCount(); + void resync(); - const char *getTypeName(); - const char *getClassName(); + void setKV(const char *szKey, const char *szValue) override; + const char *getKV(const char *szKey) override; + const X_PROP_FIELD *getPropertyMeta(UINT uKey) override; + UINT getProperyCount() override; + + const char *getTypeName() override; + const char *getClassName() override; protected: CBaseEntity *m_pEntity = NULL; @@ -48,8 +50,9 @@ protected: AssotiativeArray<String, String> m_msPropCache; const char *m_aszFlags[16]; - void _iniFieldList(); + + ID m_idEnt = -1; }; #endif diff --git a/source/game/GameStates.cpp b/source/game/GameStates.cpp index a91c98c4289737c694d099ad36d10459f31d9d5b..993ab09c5f6ce6bc192a699b14e59b3ed16fc6b9 100644 --- a/source/game/GameStates.cpp +++ b/source/game/GameStates.cpp @@ -6,6 +6,9 @@ #include <score/sxscore.h> #include <input/sxinput.h> +#include "Editable.h" + +extern CEditable *g_pEditable; CMainMenuGameState::CMainMenuGameState() { @@ -155,6 +158,11 @@ void CIngameGameState::deactivate() if(*dev_reset_world_on_run) { GameData::m_pMgr->dispatchBaseline(m_pBaseLine); + + if(g_pEditable) + { + g_pEditable->resync(); + } } }