diff options
-rw-r--r-- | examples/3dstudioruntime2/cppdatainput/main.cpp | 19 | ||||
-rw-r--r-- | examples/3dstudioruntime2/cppdatainput/presentation/datainput.uia | 2 | ||||
-rw-r--r-- | src/runtime/api/q3dsdatainput.cpp | 57 | ||||
-rw-r--r-- | src/runtime/api/q3dsdatainput.h | 4 | ||||
-rw-r--r-- | src/runtime/api/q3dsdatainput_p.h | 1 | ||||
-rw-r--r-- | src/runtime/api/q3dspresentation.cpp | 32 | ||||
-rw-r--r-- | src/runtime/api/q3dspresentation.h | 1 | ||||
-rw-r--r-- | src/runtime/api/q3dspresentation_p.h | 5 | ||||
-rw-r--r-- | src/runtime/api/q3dspresentationcontroller.cpp | 27 | ||||
-rw-r--r-- | src/runtime/q3dsdatainputentry_p.h | 14 | ||||
-rw-r--r-- | src/runtime/q3dsengine.cpp | 54 | ||||
-rw-r--r-- | src/runtime/q3dsengine_p.h | 6 | ||||
-rw-r--r-- | src/runtime/q3dsscenemanager.cpp | 12 | ||||
-rw-r--r-- | src/runtime/q3dsscenemanager_p.h | 1 | ||||
-rw-r--r-- | src/runtime/q3dsuiadocument.cpp | 18 | ||||
-rw-r--r-- | src/runtime/q3dsuiadocument_p.h | 5 | ||||
-rw-r--r-- | src/runtime/q3dsuiaparser.cpp | 8 | ||||
-rw-r--r-- | src/runtime/q3dsuippresentation.cpp | 16 | ||||
-rw-r--r-- | src/runtime/q3dsuippresentation_p.h | 3 |
19 files changed, 281 insertions, 4 deletions
diff --git a/examples/3dstudioruntime2/cppdatainput/main.cpp b/examples/3dstudioruntime2/cppdatainput/main.cpp index c3579a3..0366ca0 100644 --- a/examples/3dstudioruntime2/cppdatainput/main.cpp +++ b/examples/3dstudioruntime2/cppdatainput/main.cpp @@ -58,6 +58,7 @@ #include <Q3DSDataInput> #include <QVector3D> #include <QTimer> +#include <QDebug> // Required for Ubuntu build #include <cmath> @@ -88,6 +89,11 @@ int main(int argc, char *argv[]) Q3DSDataInput *dynDi = qvariant_cast<Q3DSDataInput *>(it); if (dynDi->name().contains(QLatin1String("color"))) { if (dynDi->isValid()) { + // Access and modify metadata. + dynDi->setMetadata("metadata1", "gauge color"); + qDebug() << "Metadata key for" << dynDi->name() << ":" << dynDi->metadataKey(); + qDebug() << "Metadata: " << dynDi->metadata(); + QObject::connect(&viewer, &Q3DSSurfaceViewer::frameUpdate, [&colorRed, dynDi] { dynDi->setValue(QVector3D(colorRed, 0.5, 0.5)); @@ -101,6 +107,14 @@ int main(int argc, char *argv[]) if (dynDi->isValid()) { dynDi->setMin(90.0f); dynDi->setMax(270.0f); + + // Access and modify metadata. + qDebug() << "Metadata key for" << dynDi->name() << ":" << dynDi->metadataKey(); + qDebug() << "Metadata: " << dynDi->metadata(); + dynDi->setMetadata("metadata2", "Secondary rotation control"); + qDebug() << "New metadata key for" << dynDi->name() << ":" << dynDi->metadataKey(); + qDebug() << "New metadata for " << dynDi->name() << ":" << dynDi->metadata(); + QObject::connect(&viewer, &Q3DSSurfaceViewer::frameUpdate, [&range, dynDi] { dynDi->setValue((float)range); range = (range + 1) % 360; @@ -108,6 +122,11 @@ int main(int argc, char *argv[]) } } } + const auto diWithMetadata = viewer.presentation() + ->getDataInputs(QVariant("metadata1")); + qDebug() << "Datainputs with metadatakey metadata1: "; + for (auto &it : diWithMetadata) + qDebug() << it->name(); }); viewer.presentation()->setSource(QUrl(QStringLiteral("qrc:presentation/datainput.uia"))); diff --git a/examples/3dstudioruntime2/cppdatainput/presentation/datainput.uia b/examples/3dstudioruntime2/cppdatainput/presentation/datainput.uia index cbe778f..5676aec 100644 --- a/examples/3dstudioruntime2/cppdatainput/presentation/datainput.uia +++ b/examples/3dstudioruntime2/cppdatainput/presentation/datainput.uia @@ -3,7 +3,7 @@ <assets initial="datainput"> <presentation id="datainput" src="datainput.uip"/> <dataInput name="colorInput" type="Vector3"/> - <dataInput name="rangeInput" type="Ranged Number" min="0" max="360"/> + <dataInput metadatakey="metadata1" metadata="Controls rotation" max="360" name="rangeInput" min="0" type="Ranged Number"/> </assets> <statemachine ref="#logic"> <visual-states> diff --git a/src/runtime/api/q3dsdatainput.cpp b/src/runtime/api/q3dsdatainput.cpp index 5144d75..9621b9a 100644 --- a/src/runtime/api/q3dsdatainput.cpp +++ b/src/runtime/api/q3dsdatainput.cpp @@ -155,6 +155,55 @@ bool Q3DSDataInput::isValid() const } } +/*! + \property Q3DSDataInput::metadata + + Returns the metadata for this datainput. Metadata is convenience data + that can be used by API clients to better identify datainput purpose, and facilitate + binding the appropriate external data source to this datainput. Metadata does not have + any impact to rendering. + + Datainput only has a single key-value pair at any given time. + */ +QVariant Q3DSDataInput::metadata() const +{ + Q_D(const Q3DSDataInput); + if (!d->presentation) + return {}; + + return Q3DSPresentationPrivate::get(d->presentation) + ->controller->handleDataInputMetaData(this); +} + +/*! + \property Q3DSDataInput::metadataKey + + Returns the metadata key for this datainput. + + \sa Q3DSDataInput::metadata() + + */ +QVariant Q3DSDataInput::metadataKey() const +{ + Q_D(const Q3DSDataInput); + if (!d->presentation) + return {}; + + return Q3DSPresentationPrivate::get(d->presentation) + ->controller->handleDataInputMetaDataKey(this); +} + +/*! + Sets the \a metadata for this datainput for the specified \a key. + + \sa Q3DSDataInput::metadata() + */ +void Q3DSDataInput::setMetadata(const QVariant &key, const QVariant &metadata) +{ + Q_D(Q3DSDataInput); + d->sendMetaData(key, metadata); +} + void Q3DSDataInput::setValue(const QVariant &value) { Q_D(Q3DSDataInput); @@ -219,6 +268,14 @@ void Q3DSDataInput::setMax(float max) emit maxChanged(); } +void Q3DSDataInputPrivate::sendMetaData(const QVariant &key, const QVariant &metaData) +{ + if (!presentation || key.isNull()) + return; + + Q3DSPresentationPrivate::get(presentation)->setDataInputMetaData(name, key, metaData); +} + void Q3DSDataInputPrivate::sendValue() { if (!presentation || name.isEmpty()) diff --git a/src/runtime/api/q3dsdatainput.h b/src/runtime/api/q3dsdatainput.h index c614776..2ba6d35 100644 --- a/src/runtime/api/q3dsdatainput.h +++ b/src/runtime/api/q3dsdatainput.h @@ -62,7 +62,9 @@ public: float min() const; float max() const; bool isValid() const; - + QVariant metadata() const; + QVariant metadataKey() const; + void setMetadata(const QVariant &key, const QVariant &metadata); public Q_SLOTS: void setName(const QString &name); void setValue(const QVariant &value); diff --git a/src/runtime/api/q3dsdatainput_p.h b/src/runtime/api/q3dsdatainput_p.h index 1b53b41..d3e5144 100644 --- a/src/runtime/api/q3dsdatainput_p.h +++ b/src/runtime/api/q3dsdatainput_p.h @@ -57,6 +57,7 @@ public: static Q3DSDataInputPrivate *get(Q3DSDataInput *p) { return p->d_func(); } void sendValue(); void sendMinMax(float min, float max); + void sendMetaData(const QVariant &key, const QVariant &metadata); QString name; QVariant value; diff --git a/src/runtime/api/q3dspresentation.cpp b/src/runtime/api/q3dspresentation.cpp index f46ab3d..4f311ee 100644 --- a/src/runtime/api/q3dspresentation.cpp +++ b/src/runtime/api/q3dspresentation.cpp @@ -531,7 +531,7 @@ QVariantList Q3DSPresentation::getDataInputs() QVariantList ret; if (d->controller) { const auto diList = d->controller->handleGetDataInputs(); - for (auto it : diList) { + for (auto &it : diList) { // Assign "this" as presentation associated with this datainput, // as the query from Q3DSUipPresentation does not return // actual datainput object references with presentation associations. @@ -554,6 +554,30 @@ QVariantList Q3DSPresentation::getDataInputs() } /*! + Returns a list of datainputs defined for this presentation which have metadata key \a metadataKey. + + \sa Q3DSDataInput + */ +QVector<Q3DSDataInput *> Q3DSPresentation::getDataInputs(const QVariant &metadataKey) +{ + Q_D(Q3DSPresentation); + QVector<Q3DSDataInput *> ret; + if (d->controller) { + const auto diList = d->controller->handleGetDataInputs(metadataKey); + for (auto &it : diList) { + auto privDi = Q3DSDataInputPrivate::get(it); + privDi->presentation = this; + privDi->max = d->dataInputMax(it->name()); + privDi->min = d->dataInputMin(it->name()); + ret.append(it); + } + return ret; + } else { + return {}; + } +} + +/*! \fn void Q3DSPresentation::customSignalEmitted(const QString &elementPath, const QString &name) This signal is emitted when an action with the \c{Emit Signal} @@ -790,6 +814,12 @@ void Q3DSPresentationPrivate::setDataInputMinMax(const QString &name, float min, controller->pcEngine()->setDataInputMinMax(name, min, max); } +void Q3DSPresentationPrivate::setDataInputMetaData(const QString &diName, + const QVariant &key, const QVariant &metaData) +{ + controller->pcEngine()->setDataInputMetaData(diName, key, metaData); +} + float Q3DSPresentationPrivate::dataInputMin(const QString &name) const { return controller->pcEngine()->dataInputMin(name); diff --git a/src/runtime/api/q3dspresentation.h b/src/runtime/api/q3dspresentation.h index 6c85881..54816ed 100644 --- a/src/runtime/api/q3dspresentation.h +++ b/src/runtime/api/q3dspresentation.h @@ -101,6 +101,7 @@ public: Q_INVOKABLE void setAttribute(const QString &elementPath, const QString &attributeName, const QVariant &value); Q_INVOKABLE QVariantList getDataInputs(); + QVector<Q3DSDataInput *> getDataInputs(const QVariant &metadataKey); void keyPressEvent(QKeyEvent *e); void keyReleaseEvent(QKeyEvent *e); diff --git a/src/runtime/api/q3dspresentation_p.h b/src/runtime/api/q3dspresentation_p.h index 0710b2c..49a514c 100644 --- a/src/runtime/api/q3dspresentation_p.h +++ b/src/runtime/api/q3dspresentation_p.h @@ -86,7 +86,10 @@ public: virtual void handleDataInputValue(const QString &name, const QVariant &value); virtual QVector<Q3DSDataInput *> handleGetDataInputs() const; + virtual QVector<Q3DSDataInput *> handleGetDataInputs(const QVariant &metadataKey) const; virtual bool handleIsValidDataInput(const Q3DSDataInput *di) const; + virtual QVariant handleDataInputMetaData(const Q3DSDataInput *di) const; + virtual QVariant handleDataInputMetaDataKey(const Q3DSDataInput *di) const; virtual void handleFireEvent(const QString &elementPath, const QString &eventName); virtual void handleGoToTime(const QString &elementPath, float timeSeconds); virtual void handleGoToSlideByName(const QString &elementPath, const QString &name); @@ -103,6 +106,7 @@ public: Q3DSEngine *pcEngine() const { return m_pcEngine; } + protected: Q3DSEngine *m_pcEngine = nullptr; // don't want clashes with commonly used m_engine members QVector<QPair<QString, QVariant> > m_pendingDataInputSets; @@ -121,6 +125,7 @@ public: Q3DSPresentationController::SourceFlags sourceFlags() const; bool compareElementPath(const QString &a, const QString &b) const; void registerInlineQmlSubPresentations(const QVector<Q3DSInlineQmlSubPresentation *> &list); + void setDataInputMetaData(const QString &diName, const QVariant &key, const QVariant &metaData); void setDataInputMinMax(const QString &name, float min, float max); float dataInputMin(const QString &name) const; float dataInputMax(const QString &name) const; diff --git a/src/runtime/api/q3dspresentationcontroller.cpp b/src/runtime/api/q3dspresentationcontroller.cpp index 2ce7296..b8fdf1e 100644 --- a/src/runtime/api/q3dspresentationcontroller.cpp +++ b/src/runtime/api/q3dspresentationcontroller.cpp @@ -136,6 +136,15 @@ QVector<Q3DSDataInput *> Q3DSPresentationController::handleGetDataInputs() const return QVector<Q3DSDataInput *>(); } +QVector<Q3DSDataInput *> Q3DSPresentationController::handleGetDataInputs( + const QVariant &metadataKey) const +{ + if (m_pcEngine) + return m_pcEngine->dataInputs(metadataKey); + else + return QVector<Q3DSDataInput *>(); +} + bool Q3DSPresentationController::handleIsValidDataInput(const Q3DSDataInput *di) const { if (m_pcEngine) @@ -144,6 +153,24 @@ bool Q3DSPresentationController::handleIsValidDataInput(const Q3DSDataInput *di) return false; } +QVariant Q3DSPresentationController::handleDataInputMetaData( + const Q3DSDataInput *di) const +{ + if (m_pcEngine) + return m_pcEngine->dataInputMetaData(di); + else + return {}; +} + +QVariant Q3DSPresentationController::handleDataInputMetaDataKey( + const Q3DSDataInput *di) const +{ + if (m_pcEngine) + return m_pcEngine->dataInputMetaDataKey(di); + else + return {}; +} + void Q3DSPresentationController::handleFireEvent(const QString &elementPath, const QString &eventName) { if (!m_pcEngine) diff --git a/src/runtime/q3dsdatainputentry_p.h b/src/runtime/q3dsdatainputentry_p.h index 5c7476b..e8cb0f3 100644 --- a/src/runtime/q3dsdatainputentry_p.h +++ b/src/runtime/q3dsdatainputentry_p.h @@ -45,12 +45,21 @@ #include <QVector> #include <QString> #include <QHash> +#include <QVariant> QT_BEGIN_NAMESPACE struct Q3DSV_PRIVATE_EXPORT Q3DSDataInputEntry { typedef QHash<QString, Q3DSDataInputEntry> Map; + // Metadata key - Datainput name mapping. Internally + // key is type QString, as QVariant does not work that well + // as keys to QMultiHash. Accesses to this map are therefore + // done using QVariant automatic cast to QString (UIA format + // anyway stores metadata as strings, so that is the usual use case). + // TODO: use case of keys that are of different internal type but + // equivalent after auto cast to QString eg. "9.0" type string vs "9.0" type float? + typedef QMultiHash<QString, QString> MetadataMap; enum Type { TypeString, @@ -66,6 +75,11 @@ struct Q3DSV_PRIVATE_EXPORT Q3DSDataInputEntry Type type = TypeString; float minValue = 0; float maxValue = 0; + // As per QT3DS-2205 we currently need only a single key-value pair per datainput. + // For efficiency we use separate items for both, as there is no need for more + // elaborate containers. + QVariant metaDataKey; + QVariant metaData; // Just check that relative minmax values are sane, which also // covers the case when both are at default value of 0.0 i.e. unset. diff --git a/src/runtime/q3dsengine.cpp b/src/runtime/q3dsengine.cpp index a567e6f..d7223c9 100644 --- a/src/runtime/q3dsengine.cpp +++ b/src/runtime/q3dsengine.cpp @@ -624,6 +624,7 @@ bool Q3DSEngine::setDocument(const Q3DSUiaDocument &uiaDocument, QString *error) } m_dataInputEntries = uiaDocument.dataInputEntries(); + m_dataInputMetaData = uiaDocument.dataInputMetadatas(); qCDebug(lcUip, "Registered %d data input entries", m_dataInputEntries.count()); return loadPresentations(); @@ -1553,6 +1554,18 @@ void Q3DSEngine::setDataInputValue(const QString &name, const QVariant &value) } } +void Q3DSEngine::setDataInputMetaData(const QString &diName, + const QVariant &key, const QVariant &metaData) +{ + // Metadata has a single entry as per QT3DS-2205, so just + // overwrite existing values and update the datainput entry + // map held by presentation + m_dataInputEntries[diName].metaDataKey = key; + m_dataInputEntries[diName].metaData = metaData; + + presentation()->setDataInputEntries(&m_dataInputEntries); +} + void Q3DSEngine::setDataInputMinMax(const QString &name, float min, float max) { if (m_dataInputEntries[name].type == Q3DSDataInputEntry::TypeRangedNumber) { @@ -1591,6 +1604,17 @@ QVector<Q3DSDataInput *> Q3DSEngine::dataInputs() const return dataInputs; } +QVector<Q3DSDataInput *> Q3DSEngine::dataInputs(const QVariant &metadataKey) const +{ + QVector<Q3DSDataInput *> dataInputs; + for (const UipPresentation &pres : qAsConst(m_uipPresentations)) { + if (pres.sceneManager) + dataInputs.append(pres.sceneManager->dataInputs(metadataKey)); + } + + return dataInputs; +} + bool Q3DSEngine::isValidDataInput(const Q3DSDataInput *di) const { if (m_uipPresentations.isEmpty()) @@ -1603,6 +1627,36 @@ bool Q3DSEngine::isValidDataInput(const Q3DSDataInput *di) const return false; } +QVariant Q3DSEngine::dataInputMetaData(const Q3DSDataInput *di) const +{ + if (m_uipPresentations.isEmpty()) + return {}; + + for (const UipPresentation &pres : qAsConst(m_uipPresentations)) { + if (pres.presentation->isValidDataInput(di)) { + const auto diEntry( + pres.presentation->dataInputEntries()->value(di->name())); + return diEntry.metaData; + } + } + return {}; +} + +QVariant Q3DSEngine::dataInputMetaDataKey(const Q3DSDataInput *di) const +{ + if (m_uipPresentations.isEmpty()) + return {}; + + for (const UipPresentation &pres : qAsConst(m_uipPresentations)) { + if (pres.presentation->isValidDataInput(di)) { + const auto diEntry( + pres.presentation->dataInputEntries()->value(di->name())); + return diEntry.metaDataKey; + } + } + return {}; +} + void Q3DSEngine::fireEvent(Q3DSGraphObject *target, Q3DSUipPresentation *presentation, const QString &event) { for (const UipPresentation &pres : qAsConst(m_uipPresentations)) { diff --git a/src/runtime/q3dsengine_p.h b/src/runtime/q3dsengine_p.h index 7885061..89dfdd5 100644 --- a/src/runtime/q3dsengine_p.h +++ b/src/runtime/q3dsengine_p.h @@ -169,7 +169,11 @@ public: void setDataInputValue(const QString &name, const QVariant &value); void setDataInputMinMax(const QString &name, float min, float max); QVector<Q3DSDataInput *> dataInputs() const; + QVector<Q3DSDataInput *> dataInputs(const QVariant &metadataKey) const; bool isValidDataInput(const Q3DSDataInput *di) const; + QVariant dataInputMetaData(const Q3DSDataInput *di) const; + QVariant dataInputMetaDataKey(const Q3DSDataInput *di) const; + void setDataInputMetaData(const QString &diName, const QVariant &key, const QVariant &metaData); float dataInputMin(const QString &name) const; float dataInputMax(const QString &name) const; void fireEvent(Q3DSGraphObject *target, Q3DSUipPresentation *presentation, const QString &event); @@ -227,7 +231,6 @@ public: Q3DSSubPresentation loadSubUipPresentation(const QString &subPresId); void createAspectEngine(); - public Q_SLOTS: void requestGrab(); @@ -294,6 +297,7 @@ private: QVector<QmlPresentation> m_qmlPresentations; QVector<Q3DSInlineQmlSubPresentation *> m_inlineQmlPresentations; Q3DSDataInputEntry::Map m_dataInputEntries; + Q3DSDataInputEntry::MetadataMap m_dataInputMetaData; QQmlEngine *m_qmlSubPresentationEngine = nullptr; bool m_ownsQmlSubPresentationEngine = false; diff --git a/src/runtime/q3dsscenemanager.cpp b/src/runtime/q3dsscenemanager.cpp index e155f14..79764e1 100644 --- a/src/runtime/q3dsscenemanager.cpp +++ b/src/runtime/q3dsscenemanager.cpp @@ -9333,6 +9333,18 @@ QVector<Q3DSDataInput *> Q3DSSceneManager::dataInputs() const return outVec; } +QVector<Q3DSDataInput *> Q3DSSceneManager::dataInputs(const QVariant &metadataKey) const +{ + const auto dataInputMetas = m_presentation->dataInputMetadatas(); + QVector<Q3DSDataInput *> outVec; + const QList<QString> dis = dataInputMetas->values(metadataKey.toString()); + + for (auto &it : dis) + outVec.append(new Q3DSDataInput(nullptr, it)); + + return outVec; +} + void Q3DSSceneManager::handleEvent(const Q3DSGraphObject::Event &e) { Q3DSSlide *slide = currentSlide(); diff --git a/src/runtime/q3dsscenemanager_p.h b/src/runtime/q3dsscenemanager_p.h index 6705b7c..d1a4461 100644 --- a/src/runtime/q3dsscenemanager_p.h +++ b/src/runtime/q3dsscenemanager_p.h @@ -814,6 +814,7 @@ public: void setDataInputValue(const QString &dataInputName, const QVariant &value); QVector<Q3DSDataInput *> dataInputs() const; + QVector<Q3DSDataInput *> dataInputs(const QVariant &metadataKey) const; void changeSlideByName(Q3DSGraphObject *sceneOrComponent, const QString &name); void changeSlideByIndex(Q3DSGraphObject *sceneOrComponent, int index); void changeSlideByDirection(Q3DSGraphObject *sceneOrComponent, bool next, bool wrap); diff --git a/src/runtime/q3dsuiadocument.cpp b/src/runtime/q3dsuiadocument.cpp index c1bb395..4de2b58 100644 --- a/src/runtime/q3dsuiadocument.cpp +++ b/src/runtime/q3dsuiadocument.cpp @@ -44,6 +44,7 @@ QString Q3DSUiaDocument::initialDocumentId() const void Q3DSUiaDocument::setDataInputEntries(const Q3DSDataInputEntry::Map &entries) { m_dataInputEntries = entries; + updateMetadata(); } const Q3DSDataInputEntry::Map Q3DSUiaDocument::dataInputEntries() const @@ -51,6 +52,11 @@ const Q3DSDataInputEntry::Map Q3DSUiaDocument::dataInputEntries() const return m_dataInputEntries; } +const Q3DSDataInputEntry::MetadataMap Q3DSUiaDocument::dataInputMetadatas() const +{ + return m_dataInputMetadata; +} + void Q3DSUiaDocument::addSubDocument(const Q3DSUipDocument &uipDocument) { m_uipDocuments.append(uipDocument); @@ -66,6 +72,7 @@ void Q3DSUiaDocument::clear() m_uipDocuments.clear(); m_qmlDocuments.clear(); m_dataInputEntries.clear(); + m_dataInputMetadata.clear(); } const QVector<Q3DSUipDocument> Q3DSUiaDocument::uipDocuments() const @@ -78,4 +85,15 @@ const QVector<Q3DSQmlDocument> Q3DSUiaDocument::qmlDocuments() const return m_qmlDocuments; } +// Extract metadata - datainputs to a separate hash table to avoid iterating +// through main datainput table +void Q3DSUiaDocument::updateMetadata() +{ + m_dataInputMetadata.clear(); + for (const Q3DSDataInputEntry &it : qAsConst(m_dataInputEntries)) { + if (!it.metaDataKey.isNull() && !it.metaData.isNull()) + m_dataInputMetadata.insert(it.metaDataKey.toString(), it.name); + } +} + QT_END_NAMESPACE diff --git a/src/runtime/q3dsuiadocument_p.h b/src/runtime/q3dsuiadocument_p.h index dadff67..b9bd7f5 100644 --- a/src/runtime/q3dsuiadocument_p.h +++ b/src/runtime/q3dsuiadocument_p.h @@ -60,6 +60,7 @@ public: void setDataInputEntries(const Q3DSDataInputEntry::Map &entries); const Q3DSDataInputEntry::Map dataInputEntries() const; + const Q3DSDataInputEntry::MetadataMap dataInputMetadatas() const; void addSubDocument(const Q3DSUipDocument &uipDocument); void addSubDocument(const Q3DSQmlDocument &qmlDocument); @@ -75,6 +76,10 @@ private: QVector<Q3DSUipDocument> m_uipDocuments; QVector<Q3DSQmlDocument> m_qmlDocuments; Q3DSDataInputEntry::Map m_dataInputEntries; + // Metadata key - datainput mapping extracted from main datainput entry map + // for faster lookups for datainputs with specific key. + Q3DSDataInputEntry::MetadataMap m_dataInputMetadata; + void updateMetadata(); }; QT_END_NAMESPACE diff --git a/src/runtime/q3dsuiaparser.cpp b/src/runtime/q3dsuiaparser.cpp index 2c5f794..6a461e2 100644 --- a/src/runtime/q3dsuiaparser.cpp +++ b/src/runtime/q3dsuiaparser.cpp @@ -113,12 +113,20 @@ void Q3DSUiaParser::parsePresentations() QStringRef type = attrs.value(QLatin1String("type")); QStringRef minValue = attrs.value(QLatin1String("min")); QStringRef maxValue = attrs.value(QLatin1String("max")); + QStringRef metaDataKey = attrs.value(QLatin1String("metadatakey")); + QStringRef metaData = attrs.value(QLatin1String("metadata")); if (name.isEmpty() || type.isEmpty()) { r->raiseError(QObject::tr("Malformed dataInput element")); m_uia.presentations.clear(); } else { Q3DSDataInputEntry e; e.name = name.toString(); + + if (!metaData.isEmpty()) + e.metaData = QVariant::fromValue(metaData.toString()); + if (!metaDataKey.isEmpty()) + e.metaDataKey = QVariant::fromValue(metaDataKey.toString()); + if (type == QStringLiteral("String")) { e.type = Q3DSDataInputEntry::TypeString; } else if (type == QLatin1String("Float")) { diff --git a/src/runtime/q3dsuippresentation.cpp b/src/runtime/q3dsuippresentation.cpp index af2b710..c7b48f8 100644 --- a/src/runtime/q3dsuippresentation.cpp +++ b/src/runtime/q3dsuippresentation.cpp @@ -4446,6 +4446,17 @@ qint64 Q3DSUipPresentation::meshesLoadTimeMsecs() const void Q3DSUipPresentation::setDataInputEntries(const Q3DSDataInputEntry::Map *entries) { d->dataInputEntries = entries; + updateMetadata(); +} + +void Q3DSUipPresentation::updateMetadata() +{ + Q3DSDataInputEntry::MetadataMap map; + for (auto it = d->dataInputEntries->cbegin(); it != d->dataInputEntries->cend(); ++it) { + if (!it->metaDataKey.isNull() && !it->metaData.isNull()) + map.insert(it->metaDataKey.toString(), it->name); + } + d->dataInputMetadata = map; } const Q3DSDataInputEntry::Map *Q3DSUipPresentation::dataInputEntries() const @@ -4453,6 +4464,11 @@ const Q3DSDataInputEntry::Map *Q3DSUipPresentation::dataInputEntries() const return d->dataInputEntries; } +const Q3DSDataInputEntry::MetadataMap *Q3DSUipPresentation::dataInputMetadatas() const +{ + return &d->dataInputMetadata; +} + bool Q3DSUipPresentation::isValidDataInput(const Q3DSDataInput *di) const { // Only check for name validity here. Q3DSUipPresentation is not concerned diff --git a/src/runtime/q3dsuippresentation_p.h b/src/runtime/q3dsuippresentation_p.h index f760e1a..de1be1e 100644 --- a/src/runtime/q3dsuippresentation_p.h +++ b/src/runtime/q3dsuippresentation_p.h @@ -2170,7 +2170,9 @@ public: void setDataInputEntries(const Q3DSDataInputEntry::Map *entries); const Q3DSDataInputEntry::Map *dataInputEntries() const; + const Q3DSDataInputEntry::MetadataMap *dataInputMetadatas() const; bool isValidDataInput(const Q3DSDataInput *di) const; + void updateMetadata(); typedef QMultiHash<QString, Q3DSGraphObject *> DataInputMap; // data input entry name - target object const DataInputMap *dataInputMap() const; @@ -2244,6 +2246,7 @@ struct Q3DSUipPresentationData QHash<MeshId, MeshList> meshes; const Q3DSDataInputEntry::Map *dataInputEntries = nullptr; + Q3DSDataInputEntry::MetadataMap dataInputMetadata; Q3DSUipPresentation::DataInputMap dataInputMap; }; |