diff --git a/engine/includes/editor/assetmanager.h b/engine/includes/editor/assetmanager.h index a334e2927..92b5a5459 100644 --- a/engine/includes/editor/assetmanager.h +++ b/engine/includes/editor/assetmanager.h @@ -5,6 +5,8 @@ #include #include +#include + #include #include #include diff --git a/engine/includes/editor/codebuilder.h b/engine/includes/editor/codebuilder.h index 183a485e6..e72f63122 100644 --- a/engine/includes/editor/codebuilder.h +++ b/engine/includes/editor/codebuilder.h @@ -1,6 +1,8 @@ #ifndef CODEBUILDER_H #define CODEBUILDER_H +#include + #include "assetconverter.h" class QAbstractItemModel; diff --git a/engine/includes/editor/projectsettings.h b/engine/includes/editor/projectsettings.h index 44c20e9e3..ab9866c94 100644 --- a/engine/includes/editor/projectsettings.h +++ b/engine/includes/editor/projectsettings.h @@ -1,6 +1,8 @@ #ifndef PROJECTSETTINGS_H #define PROJECTSETTINGS_H +#include + #include #include diff --git a/engine/includes/engine.h b/engine/includes/engine.h index 310a99494..626a4c577 100644 --- a/engine/includes/engine.h +++ b/engine/includes/engine.h @@ -127,10 +127,12 @@ class ENGINE_EXPORT Engine : public ObjectSystem { void removeNativeBehaviour(NativeBehaviour *native); private: + friend class System; + bool event(Event *event) override; static void addSystem(System *system); - + static void removeSystem(System *system); }; #endif // ENGINE_H diff --git a/engine/includes/system.h b/engine/includes/system.h index 20429c26b..8bb4389f6 100644 --- a/engine/includes/system.h +++ b/engine/includes/system.h @@ -14,6 +14,7 @@ class ENGINE_EXPORT System : public ObjectSystem { public: System(); + ~System(); virtual bool init(); diff --git a/engine/src/engine.cpp b/engine/src/engine.cpp index b57dd6032..9c5755a94 100644 --- a/engine/src/engine.cpp +++ b/engine/src/engine.cpp @@ -181,11 +181,13 @@ Engine::Engine(const char *path) { Engine::~Engine() { PROFILE_FUNCTION(); - for(auto it : m_serial) { + auto localSerial = m_serial; + for(auto it : localSerial) { delete it; } - for(auto it : m_pool) { + auto localPool = m_pool; + for(auto it : localPool) { delete it->m_system; delete it; } @@ -610,6 +612,21 @@ void Engine::addSystem(System *system) { m_resourceSystem = static_cast(system); } } +/*! + Removes a game \a system from pool. +*/ +void Engine::removeSystem(System *system) { + PROFILE_FUNCTION(); + + m_serial.remove(system); + + for(auto it : m_pool) { + if(it->m_system == system) { + m_pool.remove(it); + break; + } + } +} /*! Returns game World. \note The game can have only one scene graph. World is a root object, all map loads on this World. diff --git a/engine/src/system.cpp b/engine/src/system.cpp index 080b51da3..e8f1e621b 100644 --- a/engine/src/system.cpp +++ b/engine/src/system.cpp @@ -22,6 +22,11 @@ System::System() : m_world(nullptr) { } + +System::~System() { + Engine::removeSystem(this); +} + /*! Can be used to initialize and execute necessary routines. This method will be called automatically just after the engine started. diff --git a/modules/renders/rendervk/src/wrappervk.cpp b/modules/renders/rendervk/src/wrappervk.cpp index b1af8a439..978000c7b 100644 --- a/modules/renders/rendervk/src/wrappervk.cpp +++ b/modules/renders/rendervk/src/wrappervk.cpp @@ -3,6 +3,8 @@ #include #include +#include + #if defined(SHARED_DEFINE) #include diff --git a/thirdparty/next/inc/core/objectsystem.h b/thirdparty/next/inc/core/objectsystem.h index 4bcc123a8..b57919a11 100644 --- a/thirdparty/next/inc/core/objectsystem.h +++ b/thirdparty/next/inc/core/objectsystem.h @@ -20,8 +20,6 @@ #define OBJECTSYSTEM_H #include -#include -#include #include #include diff --git a/worldeditor/src/screens/scenecomposer/actions/changeobjectproperty.cpp b/worldeditor/src/screens/scenecomposer/actions/changeobjectproperty.cpp index bb98f7419..8695b8d28 100644 --- a/worldeditor/src/screens/scenecomposer/actions/changeobjectproperty.cpp +++ b/worldeditor/src/screens/scenecomposer/actions/changeobjectproperty.cpp @@ -3,6 +3,8 @@ #include #include +#include + ChangeObjectProperty::ChangeObjectProperty(const Object::ObjectList &objects, const TString &property, const Variant &value, ObjectController *ctrl, const TString &name, UndoCommand *group) : UndoCommand(name, group), m_value(value), diff --git a/worldeditor/src/screens/scenecomposer/actions/createobject.cpp b/worldeditor/src/screens/scenecomposer/actions/createobject.cpp index f7f482c32..3813b5591 100644 --- a/worldeditor/src/screens/scenecomposer/actions/createobject.cpp +++ b/worldeditor/src/screens/scenecomposer/actions/createobject.cpp @@ -3,6 +3,8 @@ #include #include +#include + CreateObject::CreateObject(const TString &type, Scene *scene, ObjectController *ctrl, UndoCommand *group) : UndoCommand(QObject::tr("Create %1").arg(type.data()).toStdString(), group), m_type(type), diff --git a/worldeditor/src/screens/scenecomposer/actions/createobjectserial.cpp b/worldeditor/src/screens/scenecomposer/actions/createobjectserial.cpp index ff9f80eb3..56486a747 100644 --- a/worldeditor/src/screens/scenecomposer/actions/createobjectserial.cpp +++ b/worldeditor/src/screens/scenecomposer/actions/createobjectserial.cpp @@ -7,6 +7,8 @@ #include +#include + CreateObjectSerial::CreateObjectSerial(const TString &ref, const Vector3 &position, uint32_t parent, ObjectController *ctrl, const TString &name, UndoCommand *group) : UndoCommand(name, group), m_reference(ref), diff --git a/worldeditor/src/screens/scenecomposer/objectcontroller.cpp b/worldeditor/src/screens/scenecomposer/objectcontroller.cpp index 20ca09ef1..960614882 100644 --- a/worldeditor/src/screens/scenecomposer/objectcontroller.cpp +++ b/worldeditor/src/screens/scenecomposer/objectcontroller.cpp @@ -423,7 +423,9 @@ bool ObjectController::setIsolatedPrefab(Prefab *prefab) { if(actor) { onSelectActor({actor}); - onFocusActor(actor); + float bottom; + setFocusOn(actor, bottom); + blockMovement(true); setFree(false); } else { @@ -504,11 +506,6 @@ void ObjectController::onRemoveActor(Object::ObjectList objects) { undoRedo()->push(new DeleteObjects(objects, this)); } -void ObjectController::onFocusActor(Object *object) { - float bottom; - setFocusOn(dynamic_cast(object), bottom); -} - void ObjectController::onChangeTool() { std::string name(sender()->objectName().toStdString()); for(auto &it : m_tools) { @@ -564,7 +561,7 @@ void ObjectController::onUpdateSelected() { void ObjectController::onDrop(QDropEvent *event) { StringList list = TString(event->mimeData()->data(gMimeContent)).split(";"); AssetManager *mgr = AssetManager::instance(); - for(TString str : list) { + for(TString &str : list) { if(!str.isEmpty()) { if(mgr->assetTypeName(str) == Map::metaClass()->name()) { emit dropMap((ProjectSettings::instance()->contentPath() + "/" + str).data(), (event->keyboardModifiers() & Qt::ControlModifier)); diff --git a/worldeditor/src/screens/scenecomposer/objectcontroller.h b/worldeditor/src/screens/scenecomposer/objectcontroller.h index d066afd4f..b77da42e7 100644 --- a/worldeditor/src/screens/scenecomposer/objectcontroller.h +++ b/worldeditor/src/screens/scenecomposer/objectcontroller.h @@ -71,8 +71,6 @@ public slots: void onSelectActor(Object::ObjectList list, bool additive = false); void onRemoveActor(Object::ObjectList objects); - void onFocusActor(Object *object); - void onChangeTool(); void onUpdated(Scene *scene = nullptr); diff --git a/worldeditor/src/screens/scenecomposer/scenecomposer.cpp b/worldeditor/src/screens/scenecomposer/scenecomposer.cpp index 50994bcd5..4cc586029 100644 --- a/worldeditor/src/screens/scenecomposer/scenecomposer.cpp +++ b/worldeditor/src/screens/scenecomposer/scenecomposer.cpp @@ -329,7 +329,8 @@ void SceneComposer::onObjectCreate(TString type) { void SceneComposer::onObjectsSelected(Object::ObjectList objects, bool force) { if(force) { - m_controller->onFocusActor(objects.front()); + float bottom; + m_controller->setFocusOn(dynamic_cast(objects.front()), bottom); } m_controller->onSelectActor(objects);