diff --git a/engine/includes/components/actor.h b/engine/includes/components/actor.h index 10c9815c0..d3f391ab1 100644 --- a/engine/includes/components/actor.h +++ b/engine/includes/components/actor.h @@ -122,6 +122,8 @@ class ENGINE_EXPORT Actor : public Object { bool m_static; + bool m_muteUpdates; + }; #endif // ACTOR_H diff --git a/engine/includes/editor/converters/prefabconverter.h b/engine/includes/editor/converters/prefabconverter.h index b289f4bce..d619ea54d 100644 --- a/engine/includes/editor/converters/prefabconverter.h +++ b/engine/includes/editor/converters/prefabconverter.h @@ -29,7 +29,7 @@ class PrefabConverter : public AssetConverter { protected: Variant readJson(const std::string &data, AssetConverterSettings *); - void injectResource(Variant &origin, Resource *resource); + void injectResource(Object *data, Resource *resource); virtual Resource *requestResource(); diff --git a/engine/includes/resources/map.h b/engine/includes/resources/map.h index fd4f884e6..deb0cb505 100644 --- a/engine/includes/resources/map.h +++ b/engine/includes/resources/map.h @@ -15,7 +15,6 @@ class ENGINE_EXPORT Map : public Resource { public: Map(); - ~Map(); Scene *scene() const; void setScene(Scene *scene); diff --git a/engine/includes/resources/prefab.h b/engine/includes/resources/prefab.h index 8ad2ccbbf..b52c513a6 100644 --- a/engine/includes/resources/prefab.h +++ b/engine/includes/resources/prefab.h @@ -17,7 +17,6 @@ class ENGINE_EXPORT Prefab : public Resource { public: Prefab(); - ~Prefab(); Actor *actor() const; void setActor(Actor *actor); @@ -28,11 +27,13 @@ class ENGINE_EXPORT Prefab : public Resource { ObjectList absentInCloned(const ConstObjectList &cloned); private: + void makeCache(Object *object); + + void switchState(State state) override; + void loadUserData(const VariantMap &data) override; VariantMap saveUserData() const override; - void makeCache(Object *object); - private: friend class ActorTest; diff --git a/engine/src/components/actor.cpp b/engine/src/components/actor.cpp index bdb8821d4..32dddaaea 100644 --- a/engine/src/components/actor.cpp +++ b/engine/src/components/actor.cpp @@ -70,7 +70,8 @@ Actor::Actor() : m_layers(CommandBuffer::DEFAULT | CommandBuffer::RAYCAST | CommandBuffer::SHADOWCAST | CommandBuffer::TRANSLUCENT), m_flags(Actor::ENABLE | Actor::SELECTABLE), m_hierarchyEnable(m_flags & Actor::ENABLE), - m_static(false) { + m_static(false), + m_muteUpdates(false) { } @@ -390,18 +391,34 @@ void Actor::setPrefab(Prefab *prefab) { if(m_prefab != prefab) { if(m_prefab) { m_prefab->unsubscribe(this); - m_prefab->decRef(); } m_prefab = prefab; if(m_prefab) { - m_prefab->incRef(); + m_muteUpdates = true; m_prefab->subscribe(&Actor::prefabUpdated, this); + m_muteUpdates = false; } else { clearCloneRef(); } } } + +Object *findByClone(uint32_t uuid, Object *root) { + if(root) { + if(root->clonedFrom() == uuid) { + return root; + } + for(auto &it : root->getChildren()) { + Object *result = findByClone(uuid, it); + if(result) { + return result; + } + } + } + return nullptr; +} + /*! \internal */ @@ -419,7 +436,9 @@ void Actor::loadObjectData(const VariantMap &data) { if(it != data.end()) { for(auto &item : (*it).second.toList()) { uint32_t uuid = static_cast(item.toInt()); - Object *result = ObjectSystem::findObject(uuid, actor); + + // Need to do dearch by cloneID! + Object *result = findByClone(uuid, actor); if(result && result != actor) { delete result; } @@ -439,7 +458,8 @@ void Actor::loadObjectData(const VariantMap &data) { VariantList array = item.toList(); uint32_t originID = static_cast(array.front().toInt()); - Object *result = ObjectSystem::findObject(originID, this); + // Need to do dearch by cloneID! + Object *result = findByClone(originID, this); if(result) { uint32_t newID = static_cast(array.back().toInt()); ObjectSystem::replaceUUID(result, newID); @@ -462,51 +482,49 @@ void Actor::loadUserData(const VariantMap &data) { m_flags = it->second.toInt(); } - if(m_prefab) { - it = data.find(gData); - if(it != data.end()) { - Object::ObjectList objects; - Object::enumObjects(this, objects); - - std::unordered_map cacheMap; - for(auto &object : objects) { - uint32_t clone = object->clonedFrom(); - cacheMap[clone] = object; - } + it = data.find(gData); + if(it != data.end()) { + Object::ObjectList objects; + Object::enumObjects(this, objects); - const VariantList &list = (*it).second.toList(); - for(auto &item : list) { - const VariantList &fields = item.toList(); - - uint32_t cloned = static_cast(fields.front().toInt()); - auto object = cacheMap.find(cloned); - if(object != cacheMap.end()) { - const MetaObject *meta = (*object).second->metaObject(); - for(auto &property : fields.back().toMap()) { - int32_t index = meta->indexOfProperty(property.first.c_str()); - if(index > -1) { - MetaProperty prop = meta->property(index); - bool isObject = prop.type().flags() & MetaType::BASE_OBJECT; - Variant var(property.second); - if(var.type() == MetaType::VARIANTLIST) { - VariantList resultList; - for(auto it : var.toList()) { - Variant result(Actor::loadObject(it)); - if(!isObject) { - isObject = result.isValid(); - } - resultList.push_back(result); - } - if(isObject) { - var = resultList; - } - } else { - if(isObject) { - var = loadObject(var); + ObjectSystem::ObjectMap cacheMap; + for(auto &object : objects) { + uint32_t clone = object->clonedFrom(); + cacheMap[clone] = object; + } + + const VariantList &list = (*it).second.toList(); + for(auto &item : list) { + const VariantList &fields = item.toList(); + + uint32_t cloned = static_cast(fields.front().toInt()); + auto object = cacheMap.find(cloned); + if(object != cacheMap.end()) { + const MetaObject *meta = (*object).second->metaObject(); + for(auto &property : fields.back().toMap()) { + int32_t index = meta->indexOfProperty(property.first.c_str()); + if(index > -1) { + MetaProperty prop = meta->property(index); + bool isObject = prop.type().flags() & MetaType::BASE_OBJECT; + Variant var(property.second); + if(var.type() == MetaType::VARIANTLIST) { + VariantList resultList; + for(auto it : var.toList()) { + Variant result(Actor::loadObject(it)); + if(!isObject) { + isObject = result.isValid(); } + resultList.push_back(result); + } + if(isObject) { + var = resultList; + } + } else { + if(isObject) { + var = loadObject(var); } - prop.write((*object).second, var); } + prop.write((*object).second, var); } } } @@ -526,9 +544,9 @@ Variant Actor::loadObject(Variant &value) { } else if(value.type() == MetaType::INTEGER) { // Component uint32_t uuid = static_cast(value.toInt()); - Object *obj = Engine::findObject(uuid, this); + Object *obj = Engine::findObject(uuid); if(obj == nullptr) { - obj = Engine::findObject(uuid, Engine::findRoot(this)); + obj = Engine::findObject(uuid); } if(obj) { const char *name = obj->metaObject()->name(); @@ -663,6 +681,10 @@ Variant Actor::saveObject(const Variant &lv, const Variant &rv) const { void Actor::prefabUpdated(int state, void *ptr) { Actor *p = static_cast(ptr); + if(p->m_muteUpdates) { + return; + } + switch(state) { case Resource::Loading: { p->m_data = p->saveUserData(); diff --git a/engine/src/components/component.cpp b/engine/src/components/component.cpp index 694aa94f6..3c19bd5f7 100644 --- a/engine/src/components/component.cpp +++ b/engine/src/components/component.cpp @@ -174,7 +174,7 @@ Object *loadObjectHelper(const Variant &value, const MetaObject *meta, Object *r } else { uint32_t uuid = value.toInt(); if(uuid) { - object = Engine::findObject(uuid, root); + object = Engine::findObject(uuid); } } diff --git a/engine/src/editor/assetmanager.cpp b/engine/src/editor/assetmanager.cpp index cbb868f81..4d08a2052 100644 --- a/engine/src/editor/assetmanager.cpp +++ b/engine/src/editor/assetmanager.cpp @@ -425,7 +425,7 @@ void AssetManager::makePrefab(const QString &source, const QFileInfo &target) { int index = source.indexOf(':'); QString id = source.left(index); QString name = source.mid(index + 1); - Actor *actor = dynamic_cast(Engine::findObject(id.toUInt(), Engine::world())); + Actor *actor = dynamic_cast(Engine::findObject(id.toUInt())); if(actor) { Actor *clone = static_cast(actor->clone(actor->parent())); QString path = m_projectManager->contentPath() + "/" + target.filePath() + "/" + name + ".fab"; diff --git a/engine/src/editor/converters/prefabconverter.cpp b/engine/src/editor/converters/prefabconverter.cpp index 7c4dc5fa6..930fc1618 100644 --- a/engine/src/editor/converters/prefabconverter.cpp +++ b/engine/src/editor/converters/prefabconverter.cpp @@ -50,24 +50,33 @@ Actor *PrefabConverter::createActor(const AssetConverterSettings *settings, cons AssetConverter::ReturnCode PrefabConverter::convertFile(AssetConverterSettings *settings) { PROFILE_FUNCTION(); + AssetConverter::ReturnCode result = InternalError; + QFile src(settings->source()); if(src.open(QIODevice::ReadOnly)) { std::string data = src.readAll().toStdString(); src.close(); - Variant actor = readJson(data, settings); - injectResource(actor, requestResource()); + Resource *resource = requestResource(); + + Variant variant = readJson(data, settings); + Object *object = Engine::toObject(variant); + if(object) { + injectResource(object, resource); - QFile file(settings->absoluteDestination()); - if(file.open(QIODevice::WriteOnly)) { - ByteArray data = Bson::save(actor); - file.write(reinterpret_cast(data.data()), data.size()); - file.close(); + QFile file(settings->absoluteDestination()); + if(file.open(QIODevice::WriteOnly)) { + ByteArray data = Bson::save(Engine::toVariant(resource)); + file.write(reinterpret_cast(data.data()), data.size()); + file.close(); - return Success; + result = Success; + } } + + delete resource; } - return InternalError; + return result; } Variant PrefabConverter::readJson(const std::string &data, AssetConverterSettings *settings) { @@ -96,33 +105,15 @@ Variant PrefabConverter::readJson(const std::string &data, AssetConverterSetting return result; } -void PrefabConverter::injectResource(Variant &origin, Resource *resource) { +void PrefabConverter::injectResource(Object *data, Resource *resource) { PROFILE_FUNCTION(); - VariantList &objects = *(reinterpret_cast(origin.data())); - VariantList &o = *(reinterpret_cast(objects.front().data())); - - auto i = o.begin(); // type - i++; // uuid - i++; // parent - *i = resource->uuid(); + data->setParent(resource); - objects.push_front(Engine::toVariant(resource).toList().front()); - - QSet modules; - for(auto &it : objects) { - VariantList *object = reinterpret_cast(it.data()); - if(object) { - QString type = QString::fromStdString(object->begin()->toString()); - QString module = PluginManager::instance()->getModuleName(type); - if(!module.isEmpty() && module != (QString("Module") + ProjectSettings::instance()->projectName())) { - modules.insert(module); - } - } + Prefab *prefab = dynamic_cast(resource); + if(prefab) { + prefab->setActor(dynamic_cast(data)); } - ProjectSettings::instance()->reportModules(modules); - - Engine::unloadResource(resource); } Resource *PrefabConverter::requestResource() { diff --git a/engine/src/resources/map.cpp b/engine/src/resources/map.cpp index 4b4e7f43b..51c58a314 100644 --- a/engine/src/resources/map.cpp +++ b/engine/src/resources/map.cpp @@ -13,9 +13,6 @@ Map::Map() : } -Map::~Map() { - delete m_scene; -} /*! Returns a scene which can be added to the scene graph. */ diff --git a/engine/src/resources/prefab.cpp b/engine/src/resources/prefab.cpp index d615dd73e..d5202f81e 100644 --- a/engine/src/resources/prefab.cpp +++ b/engine/src/resources/prefab.cpp @@ -17,9 +17,6 @@ Prefab::Prefab() : } -Prefab::~Prefab() { - -} /*! Returns prototype Actor which will should be instanced */ @@ -50,7 +47,7 @@ void Prefab::setActor(Actor *actor) { */ bool Prefab::contains(uint32_t uuid) { if(m_dictionary.empty()) { - makeCache(m_actor); + makeCache(actor()); } return m_dictionary.find(uuid) != m_dictionary.end(); } @@ -59,7 +56,7 @@ bool Prefab::contains(uint32_t uuid) { */ Object *Prefab::protoObject(uint32_t uuid) { if(m_dictionary.empty()) { - makeCache(m_actor); + makeCache(actor()); } auto it = m_dictionary.find(uuid); @@ -73,7 +70,7 @@ Object *Prefab::protoObject(uint32_t uuid) { */ Object::ObjectList Prefab::absentInCloned(const ConstObjectList &cloned) { if(m_dictionary.empty()) { - makeCache(m_actor); + makeCache(actor()); } ObjectList temp; @@ -110,7 +107,7 @@ void Prefab::loadUserData(const VariantMap &data) { auto it = data.find(gActor); if(it != data.end()) { uint32_t uuid = uint32_t((*it).second.toInt()); - Object *object = Engine::findObject(uuid, Engine::findRoot(this)); + Object *object = Engine::findObject(uuid); setActor(dynamic_cast(object)); } } @@ -138,3 +135,12 @@ void Prefab::makeCache(Object *object) { makeCache(it); } } +/*! + \internal +*/ +void Prefab::switchState(State state) { + if(state == Ready) { + m_dictionary.clear(); + } + Resource::switchState(state); +} diff --git a/engine/src/systems/resourcesystem.cpp b/engine/src/systems/resourcesystem.cpp index 757f9d38d..5108ba4f6 100644 --- a/engine/src/systems/resourcesystem.cpp +++ b/engine/src/systems/resourcesystem.cpp @@ -235,7 +235,7 @@ void ResourceSystem::processState(Resource *resource) { auto it = std::next(fields.begin(), 1); Object *object = resource; if(!first) { - object = Engine::findObject(it->toInt(), resource); + object = Engine::findObject(it->toInt()); } else { first = false; } diff --git a/engine/tests/tst_actor.h b/engine/tests/tst_actor.h index 65ce84125..da67ee6a4 100644 --- a/engine/tests/tst_actor.h +++ b/engine/tests/tst_actor.h @@ -112,28 +112,30 @@ TEST_F(ActorTest, Prefab_serialization) { MeshRender::registerClassFactory(&system); RenderSystem render; - Actor *prefab = Engine::objectCreate("Prefab"); - prefab->addComponent("Transform"); - ASSERT_TRUE(prefab != nullptr); + Actor *root = Engine::objectCreate("Root"); + root->addComponent("Transform"); + ASSERT_TRUE(root != nullptr); - Transform *t0 = prefab->transform(); + Transform *t0 = root->transform(); ASSERT_TRUE(t0 != nullptr); t0->setPosition(Vector3(1.0f, 2.0f, 3.0f)); - SkinnedMeshRender *prefabSkinned = dynamic_cast(prefab->addComponent("SkinnedMeshRender")); + SkinnedMeshRender *prefabSkinned = dynamic_cast(root->addComponent("SkinnedMeshRender")); ASSERT_TRUE(prefabSkinned != nullptr); - Actor *level1 = Engine::composeActor("", "Level1", prefab); + Actor *level1 = Engine::composeActor("", "Level1", root); Camera *prefabCamera = dynamic_cast(level1->addComponent("Camera")); ASSERT_TRUE(prefabCamera != nullptr); prefabCamera->setFocal(10.0f); - Prefab *fab = Engine::objectCreate(""); - fab->setActor(prefab); + // Make a prefab + Prefab *prefab = Engine::objectCreate(""); + prefab->setActor(root); - system.resourceSystem()->setResource(fab, "TestPrefab"); + system.resourceSystem()->setResource(prefab, "TestPrefab"); - Actor *clone = dynamic_cast(prefab->clone()); + // Make a clone of prefab + Actor *clone = dynamic_cast(prefab->actor()->clone()); ASSERT_TRUE(clone != nullptr); ASSERT_TRUE(clone->transform()->position() == t0->position()); @@ -142,17 +144,25 @@ TEST_F(ActorTest, Prefab_serialization) { ASSERT_TRUE(cloneCamera->focal() == 10.0f); ASSERT_TRUE(cloneCamera->actor()->name() == "Level1"); + // Change a property of clone Transform *t1 = cloneCamera->transform(); ASSERT_TRUE(t1 != nullptr); t1->setPosition(Vector3(3.0f, 2.0f, 1.0f)); + // Add additional component to clone Actor *level2 = Engine::composeActor("", "Level2", cloneCamera->actor()); MeshRender *cloneMesh = dynamic_cast(level2->addComponent("MeshRender")); ASSERT_TRUE(cloneMesh != nullptr); + // Serialize clone Variant data = Engine::toVariant(clone); + // Delete the original clone + delete clone; + + // Deserialize clone Object *object = Engine::toObject(data); + Actor *result = dynamic_cast(object); ASSERT_TRUE(result != nullptr); @@ -161,7 +171,8 @@ TEST_F(ActorTest, Prefab_serialization) { ASSERT_TRUE(resultCamera != nullptr); ASSERT_TRUE(resultCamera->focal() == 10.0f); ASSERT_TRUE(resultCamera->actor()->name() == "Level1"); - ASSERT_TRUE(resultCamera->transform()->position() == t1->position()); + Transform *resultCameraTransform = resultCamera->transform(); + ASSERT_TRUE(resultCameraTransform->position() == Vector3(3.0f, 2.0f, 1.0f)); MeshRender *resultMesh = dynamic_cast(result->componentInChild("MeshRender")); ASSERT_TRUE(resultMesh != nullptr); @@ -169,7 +180,6 @@ TEST_F(ActorTest, Prefab_serialization) { delete result; - delete clone; delete prefab; } @@ -208,6 +218,8 @@ TEST_F(ActorTest, Cross_reference_prefab) { Variant data = Engine::toVariant(root); + delete root; + Object *object = Engine::toObject(data); Actor *result = dynamic_cast(object); ASSERT_TRUE(result != nullptr); @@ -220,13 +232,10 @@ TEST_F(ActorTest, Cross_reference_prefab) { ASSERT_TRUE(referenceTestComponent != resultTestComponent); ASSERT_TRUE(resultTestComponent->reference() == referenceTestComponent); - //QSKIP("Temporary disabled"); //ASSERT_TRUE(referenceTestComponent->reference() == resultTestComponent); delete result; - delete clone2; - delete clone1; delete prefab; } @@ -234,29 +243,38 @@ TEST_F(ActorTest, Remove_component_from_prefab_instance) { Engine system(nullptr, ""); TestComponent::registerClassFactory(&system); - Actor *prefab = Engine::objectCreate("Prefab"); - ASSERT_TRUE(prefab != nullptr); + // Create a root boject + Actor *root = Engine::objectCreate("Root"); + ASSERT_TRUE(root != nullptr); - Actor *level1 = Engine::objectCreate("Level1", prefab); + Actor *level1 = Engine::objectCreate("Level1", root); TestComponent *prefabTestComponent = dynamic_cast(level1->addComponent("TestComponent")); ASSERT_TRUE(prefabTestComponent != nullptr); - Prefab *fab = Engine::objectCreate(""); - fab->setActor(prefab); + // Create prefab + Prefab *prefab = Engine::objectCreate(""); + prefab->setActor(root); - system.resourceSystem()->setResource(fab, "TestPrefab"); + system.resourceSystem()->setResource(prefab, "TestPrefab"); - Actor *clone = dynamic_cast(prefab->clone()); + // Instantiate a prefab + Actor *clone = dynamic_cast(prefab->actor()->clone()); ASSERT_TRUE(clone != nullptr); ASSERT_TRUE(clone->isInstance()); + // Delete a component from instantiated hierarchy TestComponent *cloneTestComponent = dynamic_cast(clone->componentInChild("TestComponent")); ASSERT_TRUE(cloneTestComponent != nullptr); delete cloneTestComponent; + // Serialize instantiated hierarchy Variant data = Engine::toVariant(clone); + // Delete a clone + delete clone; + + // Deserialize instantiated hierarchy Object *object = Engine::toObject(data); Actor *result = dynamic_cast(object); ASSERT_TRUE(result != nullptr); @@ -266,7 +284,6 @@ TEST_F(ActorTest, Remove_component_from_prefab_instance) { delete result; - delete clone; delete prefab; } @@ -274,29 +291,29 @@ TEST_F(ActorTest, Update_prefab_instance) { Engine system(nullptr, ""); TestComponent::registerClassFactory(&system); - Actor *prefab = Engine::objectCreate("Prefab"); - ASSERT_TRUE(prefab != nullptr); + Actor *root = Engine::objectCreate("Root"); + ASSERT_TRUE(root != nullptr); - Actor *level1 = Engine::composeActor("TestComponent", "Level1", prefab); + Actor *level1 = Engine::composeActor("TestComponent", "Level1", root); uint32_t uuidLevel1 = level1->uuid(); - Actor *level2 = Engine::composeActor("", "Level2", prefab); + Actor *level2 = Engine::composeActor("", "Level2", root); - Prefab *fab = Engine::objectCreate(""); - fab->setActor(prefab); + Prefab *prefab = Engine::objectCreate(""); + prefab->setActor(root); - system.resourceSystem()->setResource(fab, "TestPrefab"); + system.resourceSystem()->setResource(prefab, "TestPrefab"); // Create an instance before do changes in prefab - Actor *clone = dynamic_cast(prefab->clone()); + Actor *clone = dynamic_cast(root->clone()); ASSERT_TRUE(clone != nullptr); ASSERT_TRUE(clone->isInstance()); - switchStatePrefab(*fab, Resource::Loading); + switchStatePrefab(*prefab, Resource::Loading); // Step 1 - Add item to prefab - TestComponent *prefabTestComponent = dynamic_cast(prefab->addComponent("TestComponent")); + TestComponent *prefabTestComponent = dynamic_cast(root->addComponent("TestComponent")); ASSERT_TRUE(prefabTestComponent != nullptr); // Step 2 - Delete item from prefab @@ -307,23 +324,24 @@ TEST_F(ActorTest, Update_prefab_instance) { level2->transform()->setPosition(value); // Sync instance with prefab - switchStatePrefab(*fab, Resource::Ready); + switchStatePrefab(*prefab, Resource::Ready); // Check instance state from Step 1 TestComponent *resultTestComponent = dynamic_cast(clone->component("TestComponent")); ASSERT_TRUE(resultTestComponent != nullptr); - ASSERT_TRUE(resultTestComponent->parent()->name() == "Prefab"); + ASSERT_TRUE(resultTestComponent->parent()->name() == "Root"); // Check instance state from Step 2 - Actor *cloneLevel1 = dynamic_cast(Engine::findObject(uuidLevel1, clone)); + Actor *cloneLevel1 = dynamic_cast(Engine::findObject(uuidLevel1)); ASSERT_TRUE(cloneLevel1 == nullptr); // Check instance state from Step 3 - Actor *cloneLevel2 = dynamic_cast(Engine::findObject(level2->uuid(), clone)); + Actor *cloneLevel2 = dynamic_cast(Engine::findObject(level2->uuid())); ASSERT_TRUE(cloneLevel2 != nullptr); ASSERT_TRUE(cloneLevel2->name() == level2->name()); ASSERT_TRUE(cloneLevel2->transform() != nullptr); ASSERT_TRUE(cloneLevel2->transform()->position() == value); + delete clone; delete prefab; } diff --git a/modules/editor/motiontools/converter/animationcontrollergraph.cpp b/modules/editor/motiontools/converter/animationcontrollergraph.cpp index bb04206b3..ad485563e 100644 --- a/modules/editor/motiontools/converter/animationcontrollergraph.cpp +++ b/modules/editor/motiontools/converter/animationcontrollergraph.cpp @@ -130,7 +130,7 @@ Variant AnimationControllerGraph::object() const { VariantList object; object.push_back(AnimationStateMachine::metaClass()->name()); // type - object.push_back(0); // id + object.push_back(Engine::generateUUID()); // id object.push_back(0); // parent object.push_back(""); // name diff --git a/modules/editor/shadertools/converter/shaderbuilder.cpp b/modules/editor/shadertools/converter/shaderbuilder.cpp index 5cea645ee..bcfb69546 100644 --- a/modules/editor/shadertools/converter/shaderbuilder.cpp +++ b/modules/editor/shadertools/converter/shaderbuilder.cpp @@ -300,7 +300,7 @@ AssetConverter::ReturnCode ShaderBuilder::convertFile(AssetConverterSettings *se VariantList object; object.push_back(Material::metaClass()->name()); // type - object.push_back(0); // id + object.push_back(Engine::generateUUID()); // id object.push_back(0); // parent object.push_back(builderSettings->destination().toStdString()); // name diff --git a/modules/uikit/includes/editor/widgetcontroller.h b/modules/uikit/includes/editor/widgetcontroller.h index ab06b19ce..dd90fb77f 100644 --- a/modules/uikit/includes/editor/widgetcontroller.h +++ b/modules/uikit/includes/editor/widgetcontroller.h @@ -23,8 +23,6 @@ class WidgetController : public CameraController { void selectActors(const std::list &list); - Object *findObject(uint32_t id, Object *parent = nullptr); - bool isDrag() const { return m_drag; } void setDrag(bool drag); diff --git a/modules/uikit/src/components/abstractbutton.cpp b/modules/uikit/src/components/abstractbutton.cpp index a45dc5993..da4d8c861 100644 --- a/modules/uikit/src/components/abstractbutton.cpp +++ b/modules/uikit/src/components/abstractbutton.cpp @@ -343,19 +343,19 @@ void AbstractButton::loadUserData(const VariantMap &data) { auto it = data.find(gTarget); if(it != data.end()) { uint32_t uuid = uint32_t((*it).second.toInt()); - Object *object = Engine::findObject(uuid, Engine::findRoot(this)); + Object *object = Engine::findObject(uuid); setBackground(dynamic_cast(object)); } it = data.find(gLabel); if(it != data.end()) { uint32_t uuid = uint32_t((*it).second.toInt()); - Object *object = Engine::findObject(uuid, Engine::findRoot(this)); + Object *object = Engine::findObject(uuid); setLabel(dynamic_cast