summaryrefslogtreecommitdiffstats
path: root/src/Authoring/Studio/Render/Q3DSTranslation.cpp
diff options
context:
space:
mode:
authorMäättä Antti <antti.maatta@qt.io>2018-11-30 08:40:21 +0200
committerAntti Määttä <antti.maatta@qt.io>2018-12-05 10:29:41 +0000
commit7b09513f20095582ba194bbdc20605079ed8bf20 (patch)
tree6e558d104d7ba6b362b4fc624e0975e9906eab92 /src/Authoring/Studio/Render/Q3DSTranslation.cpp
parenta9b8c040a1fe9b58293b05975f0476db5cd44cfb (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.cpp46
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();
}