summaryrefslogtreecommitdiffstats
path: root/src/Authoring/Studio/Palettes/Timeline/Bindings/Qt3DSDMTimelineItemBinding.cpp
diff options
context:
space:
mode:
authorMiikka Heikkinen <miikka.heikkinen@qt.io>2018-05-11 14:34:55 +0300
committerMiikka Heikkinen <miikka.heikkinen@qt.io>2018-05-14 07:44:08 +0000
commitd8951711c3f5a2f52c24715f15f9a446ca7ae755 (patch)
tree247fbb9a2ec323d6d7a825c86131b1ab4a15a797 /src/Authoring/Studio/Palettes/Timeline/Bindings/Qt3DSDMTimelineItemBinding.cpp
parent4f3612e4c2c79ec61269de8581138b44267608b5 (diff)
Optimize iterating through child objects
GetAssetChildrenInTimeParent was getting called unnecessarily much, as it was called every time GetChildrenCount or GetChild was called. According to profiling it was responsible for vast majority of the time spent when changing a slide. Optimized various loops that iterate through object's children to only call this function once. Task-number: QT3DS-1601 Change-Id: Ia006acb76bd818c390a36f6fe9f1656660974c0e Reviewed-by: Antti Määttä <antti.maatta@qt.io> Reviewed-by: Jere Tuliniemi <jere.tuliniemi@qt.io> Reviewed-by: Kaj Grönholm <kaj.gronholm@qt.io> Reviewed-by: Tomi Korpipää <tomi.korpipaa@qt.io>
Diffstat (limited to 'src/Authoring/Studio/Palettes/Timeline/Bindings/Qt3DSDMTimelineItemBinding.cpp')
-rw-r--r--src/Authoring/Studio/Palettes/Timeline/Bindings/Qt3DSDMTimelineItemBinding.cpp41
1 files changed, 30 insertions, 11 deletions
diff --git a/src/Authoring/Studio/Palettes/Timeline/Bindings/Qt3DSDMTimelineItemBinding.cpp b/src/Authoring/Studio/Palettes/Timeline/Bindings/Qt3DSDMTimelineItemBinding.cpp
index dd2989fa..9592b8ba 100644
--- a/src/Authoring/Studio/Palettes/Timeline/Bindings/Qt3DSDMTimelineItemBinding.cpp
+++ b/src/Authoring/Studio/Palettes/Timeline/Bindings/Qt3DSDMTimelineItemBinding.cpp
@@ -180,13 +180,10 @@ void ToggleChildrenLock(Q3DStudio::ScopedDocumentEditor &scopedDocEditor,
{
scopedDocEditor->SetInstancePropertyValue(inTimelineItemBinding->GetInstanceHandle(),
inSceneAsset.m_Locked, inLocked);
- long childrenCount = inTimelineItemBinding->GetChildrenCount();
- if (childrenCount == 0)
- return;
- for (long i = 0; i < childrenCount; ++i) {
- Qt3DSDMTimelineItemBinding *child =
- static_cast<Qt3DSDMTimelineItemBinding *>(inTimelineItemBinding->GetChild(i));
- ToggleChildrenLock(scopedDocEditor, child, inSceneAsset, inLocked);
+ const QList<ITimelineItemBinding *> children = inTimelineItemBinding->GetChildren();
+ for (auto child : children) {
+ ToggleChildrenLock(scopedDocEditor, static_cast<Qt3DSDMTimelineItemBinding *>(child),
+ inSceneAsset, inLocked);
}
}
@@ -466,6 +463,29 @@ ITimelineItemBinding *Qt3DSDMTimelineItemBinding::GetChild(long inIndex)
return nullptr;
}
+QList<ITimelineItemBinding *> Qt3DSDMTimelineItemBinding::GetChildren()
+{
+ QList<ITimelineItemBinding *> retlist;
+ qt3dsdm::Qt3DSDMInstanceHandle theInstance = GetInstance();
+ if (theInstance.Valid()) {
+ Q3DStudio::CGraphIterator theChildren;
+ Qt3DSDMSlideHandle theActiveSlide = m_TransMgr->GetDoc()->GetActiveSlide();
+ GetAssetChildrenInTimeParent(theInstance, m_TransMgr->GetDoc(), AmITimeParent(),
+ theChildren, theActiveSlide);
+ int childCount = int(theChildren.GetCount());
+ retlist.reserve(childCount);
+
+ for (int i = 0; i < childCount; ++i) {
+ qt3dsdm::Qt3DSDMInstanceHandle theChildInstance = theChildren.GetCurrent();
+ if (theChildInstance.Valid())
+ retlist.append(m_TransMgr->GetOrCreate(theChildInstance));
+ ++theChildren;
+ }
+ }
+
+ return retlist;
+}
+
ITimelineItemBinding *Qt3DSDMTimelineItemBinding::GetParent()
{
return m_Parent;
@@ -890,11 +910,10 @@ void Qt3DSDMTimelineItemBinding::RefreshStateRow(bool inRefreshChildren)
theRow->OnTimeChange();
theRow->setDirty(false);
if (inRefreshChildren) {
- long theChildrenCount = GetChildrenCount();
- for (long theIndex = 0; theIndex < theChildrenCount; ++theIndex) {
- ITimelineItemBinding *theChild = GetChild(theIndex);
+ const QList<ITimelineItemBinding *> children = GetChildren();
+ for (auto child : children) {
Qt3DSDMTimelineItemBinding *theBinding =
- dynamic_cast<Qt3DSDMTimelineItemBinding *>(theChild);
+ static_cast<Qt3DSDMTimelineItemBinding *>(child);
if (theBinding)
theBinding->RefreshStateRow(inRefreshChildren);
}