summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJanne Kangas <janne.kangas@qt.io>2019-06-13 14:33:07 +0300
committerJanne Kangas <janne.kangas@qt.io>2019-06-14 14:38:17 +0300
commit768e8ba4cc6d1a23d94f4aee87b76b214e73603a (patch)
treee34b5d14338fe6407c07a6ccb3fb7584dfbf6500 /src
parent394b155234e256cf774f107178bc04cbaaedfc1d (diff)
Remove datainput control bindings from map on deleteElement
Update internal datainput control map when dynamically created elements are deleted. This avoids leaving invalid entries to performance-critical map lookups. Also fix typo in test code. Change-Id: I2b6490bf6de607d303fe0f94496b5b0cfff4c463 Task-id: QT3DS-3635 Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io>
Diffstat (limited to 'src')
-rw-r--r--src/runtime/Qt3DSApplication.h5
-rw-r--r--src/runtime/Qt3DSQmlEngine.cpp29
2 files changed, 34 insertions, 0 deletions
diff --git a/src/runtime/Qt3DSApplication.h b/src/runtime/Qt3DSApplication.h
index f38b182..510845e 100644
--- a/src/runtime/Qt3DSApplication.h
+++ b/src/runtime/Qt3DSApplication.h
@@ -89,6 +89,11 @@ struct DataInOutAttribute
QByteArray elementPath;
QVector<QByteArray> attributeName;
Q3DStudio::EAttributeType propertyType = Q3DStudio::ATTRIBUTETYPE_NONE;
+
+ bool operator==(const DataInOutAttribute &inOther) const {
+ return (inOther.elementPath == elementPath && inOther.attributeName == attributeName
+ && inOther.propertyType == propertyType);
+ }
};
enum DataInOutType {
diff --git a/src/runtime/Qt3DSQmlEngine.cpp b/src/runtime/Qt3DSQmlEngine.cpp
index c828466..46978e0 100644
--- a/src/runtime/Qt3DSQmlEngine.cpp
+++ b/src/runtime/Qt3DSQmlEngine.cpp
@@ -479,6 +479,7 @@ private:
void initializeDataInputsInPresentation(CPresentation &presentation, bool isPrimary,
QList<TElement *> inElements = QList<TElement *>());
void initializeDataOutputsInPresentation(CPresentation &presentation, bool isPrimary);
+ void removeDataInputControl(const QVector<TElement *> &inElements);
// Splits down vector attributes to components as Runtime does not really
// handle vectors at this level anymore
bool getAttributeVector3(QVector<QByteArray> &outAttVec, const QByteArray &attName,
@@ -2311,6 +2312,32 @@ void CQmlEngineImpl::initializeDataOutputsInPresentation(CPresentation &presenta
presentation.AddToDataOutputMap(elementPathToDataOutputDefMap);
}
+// Remove datainput control from listed elements and update internal control map. Should be used
+// when elements having a datainput controller are removed in order to avoid invalid entries.
+void CQmlEngineImpl::removeDataInputControl(const QVector<TElement *> &inElements)
+{
+ const qt3ds::runtime::DataInputMap diMap(m_Application->dataInputMap());
+
+ // Have to do nasty triple-nested search loop as the datainput map is organized around
+ // datainputs for fast lookups in setDataInputValue, not around control targets.
+ QVector<QPair<QString, qt3ds::runtime::DataInOutAttribute>> elemAttrsToRemove;
+ QMapIterator<QString, qt3ds::runtime::DataInputDef> diMapIter(diMap);
+
+ for (const auto &elem : inElements) {
+ while (diMapIter.hasNext()) {
+ diMapIter.next();
+ for (const auto &inOutAttr : qAsConst(diMapIter.value().controlledAttributes)) {
+ if (inOutAttr.elementPath == QByteArray(elem->m_Path))
+ elemAttrsToRemove.append({diMapIter.key(), inOutAttr});
+ }
+ }
+ diMapIter.toFront();
+ }
+
+ for (const auto &attr : qAsConst(elemAttrsToRemove))
+ m_Application->dataInputMap()[attr.first].controlledAttributes.removeAll(attr.second);
+}
+
// Bit clumsy way of getting from "position" to "position .x .y .z" and enabling datainput
// support for vectorized types. UIP parser has already thrown away all vector
// type attributes and at this point we are operating with scalar components only.
@@ -2686,6 +2713,8 @@ void CQmlEngineImpl::deleteElements(const QVector<TElement *> &elements,
}
for (auto parentNode : qAsConst(parentNodes))
renderer->ChildrenUpdated(*parentNode);
+
+ removeDataInputControl(elements);
}
int CQmlEngineImpl::getAvailableId()