diff options
author | Määttä Antti <antti.maatta@qt.io> | 2018-11-30 08:40:21 +0200 |
---|---|---|
committer | Antti Määttä <antti.maatta@qt.io> | 2018-12-05 10:29:41 +0000 |
commit | 7b09513f20095582ba194bbdc20605079ed8bf20 (patch) | |
tree | 6e558d104d7ba6b362b4fc624e0975e9906eab92 /src/Authoring/Studio/Render/Q3DSTranslation.cpp | |
parent | a9b8c040a1fe9b58293b05975f0476db5cd44cfb (diff) |
Enable removing objects from the scene
Delete graph objects when instance is removed from the scene.
Change-Id: Ia5125427384d4835c7ebe9cba0c1373f3b57ebc7
Reviewed-by: Tomi Korpipää <tomi.korpipaa@qt.io>
Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io>
Diffstat (limited to 'src/Authoring/Studio/Render/Q3DSTranslation.cpp')
-rw-r--r-- | src/Authoring/Studio/Render/Q3DSTranslation.cpp | 46 |
1 files changed, 44 insertions, 2 deletions
diff --git a/src/Authoring/Studio/Render/Q3DSTranslation.cpp b/src/Authoring/Studio/Render/Q3DSTranslation.cpp index d3640a50..c788da31 100644 --- a/src/Authoring/Studio/Render/Q3DSTranslation.cpp +++ b/src/Authoring/Studio/Render/Q3DSTranslation.cpp @@ -267,12 +267,16 @@ void Q3DSTranslation::markPropertyDirty(qt3dsdm::Qt3DSDMInstanceHandle instance, void Q3DSTranslation::releaseTranslation(qt3dsdm::Qt3DSDMInstanceHandle instance) { + THandleTranslatorPairList &theTranslators = getTranslatorsForInstance(instance); + for (int idx = 0, end = theTranslators.size(); idx < end; ++idx) + m_releaseSet.insert(*theTranslators[idx].second); + m_studioRenderer.RequestRender(); } -void Q3DSTranslation::markGraphInstanceDirty(int instance, int parent) +void Q3DSTranslation::markGraphInstanceDirty(int instance, int) { - + markDirty(instance); } void Q3DSTranslation::markBeginComponentSeconds(qt3dsdm::Qt3DSDMSlideHandle slide) @@ -495,6 +499,9 @@ Q3DSGraphObjectTranslator *Q3DSTranslation::createTranslator( if (type == qt3dsdm::ComposerObjectTypes::Unknown && parentClass.Valid()) type = m_objectDefinitions.GetType(parentClass); + if (type == qt3dsdm::ComposerObjectTypes::Unknown) + return nullptr; + QByteArray id = getInstanceObjectId(instance); Q_ASSERT_X(!m_instanceIdHash.contains(instance), __FUNCTION__, "Instance translator already created"); @@ -642,14 +649,49 @@ Q3DSGraphObjectTranslator *Q3DSTranslation::getOrCreateTranslator( return theNewTranslator; } +void Q3DSTranslation::releaseTranslator(Q3DSGraphObjectTranslator *translator) +{ + qt3dsdm::Qt3DSDMInstanceHandle instance = translator->instanceHandle(); + Q3DSGraphObject *graphObject = &translator->graphObject(); + + if (static_cast<Q3DSCameraTranslator *>(translator)) + m_cameraTranslators.removeAll(static_cast<Q3DSCameraTranslator *>(translator)); + if (static_cast<Q3DSReferencedMaterialTranslator *>(translator)) + m_refMatTranslators.removeAll(static_cast<Q3DSReferencedMaterialTranslator *>(translator)); + + qt3dsdm::Qt3DSDMSlideHandle slideHandle(m_reader.GetAssociatedSlide(instance)); + if (slideHandle.Valid()) { + std::shared_ptr<qt3dsdm::ISlideCore> slideCore = m_fullSystem.GetSlideCore(); + qt3dsdm::Qt3DSDMInstanceHandle slideInstance(slideCore->GetSlideInstance(slideHandle)); + if (slideInstance.Valid() && m_slideTranslatorMap.contains(slideInstance)) { + Q3DSGraphObjectTranslator *translator = m_slideTranslatorMap[slideInstance]; + Q3DSSlide *slide = translator->graphObject<Q3DSSlide>(); + if (slide) + slide->removeObject(graphObject); + } + } + + m_instanceIdHash.remove(instance); + m_translatorMap.remove(instance); + m_presentation->unlinkObject(graphObject); + delete translator; + delete graphObject; +} + void Q3DSTranslation::clearDirtySet() { + for (unsigned int idx = 0; idx < m_releaseSet.size(); ++idx) { + Q3DSGraphObjectTranslator *translator = m_releaseSet[idx]; + translator->releaseGraphObjectsRecursive(*this); + releaseTranslator(translator); + } for (unsigned int idx = 0; idx < m_dirtySet.size(); ++idx) { if (m_reader.IsInstance(m_dirtySet[idx]->instanceHandle()) && m_dirtySet[idx]->dirty()) { m_dirtySet[idx]->pushTranslation(*this); } } + m_releaseSet.clear(); m_dirtySet.clear(); } |