summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--examples/3dstudioruntime2/cppdatainput/main.cpp19
-rw-r--r--examples/3dstudioruntime2/cppdatainput/presentation/datainput.uia2
-rw-r--r--src/runtime/api/q3dsdatainput.cpp57
-rw-r--r--src/runtime/api/q3dsdatainput.h4
-rw-r--r--src/runtime/api/q3dsdatainput_p.h1
-rw-r--r--src/runtime/api/q3dspresentation.cpp32
-rw-r--r--src/runtime/api/q3dspresentation.h1
-rw-r--r--src/runtime/api/q3dspresentation_p.h5
-rw-r--r--src/runtime/api/q3dspresentationcontroller.cpp27
-rw-r--r--src/runtime/q3dsdatainputentry_p.h14
-rw-r--r--src/runtime/q3dsengine.cpp54
-rw-r--r--src/runtime/q3dsengine_p.h6
-rw-r--r--src/runtime/q3dsscenemanager.cpp12
-rw-r--r--src/runtime/q3dsscenemanager_p.h1
-rw-r--r--src/runtime/q3dsuiadocument.cpp18
-rw-r--r--src/runtime/q3dsuiadocument_p.h5
-rw-r--r--src/runtime/q3dsuiaparser.cpp8
-rw-r--r--src/runtime/q3dsuippresentation.cpp16
-rw-r--r--src/runtime/q3dsuippresentation_p.h3
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;
};