diff options
author | Janne Kangas <janne.kangas@qt.io> | 2019-03-21 13:38:12 +0200 |
---|---|---|
committer | Janne Kangas <janne.kangas@qt.io> | 2019-04-16 09:28:11 +0000 |
commit | 54b0cb3a95edee5471d9899587040f82e0cb4819 (patch) | |
tree | 673f16b544bb6af27b190bf25a49569737bc6db0 /src/Runtime | |
parent | c6edb9c7d15843e8ab965d365099ace29e2d2049 (diff) |
Implement datainput getter API for OpenGL runtime
Partially implements RT2 feature parity for datainput getters. (Min/max
property is not exposed to QML side.)
Task-id: QT3DS-3258
Change-Id: I9cce3e98289c3cac8d2c774bb53eb75f445b6e17
Reviewed-by: Tomi Korpipää <tomi.korpipaa@qt.io>
Diffstat (limited to 'src/Runtime')
-rw-r--r-- | src/Runtime/Source/engine/Qt3DSTegraApplication.cpp | 32 | ||||
-rw-r--r-- | src/Runtime/Source/engine/Qt3DSTegraApplication.h | 24 | ||||
-rw-r--r-- | src/Runtime/Source/runtime/Qt3DSApplication.cpp | 21 | ||||
-rw-r--r-- | src/Runtime/Source/runtime/Qt3DSApplication.h | 8 | ||||
-rw-r--r-- | src/Runtime/Source/runtime/Qt3DSIScriptBridge.h | 6 | ||||
-rw-r--r-- | src/Runtime/Source/runtime/Qt3DSQmlEngine.cpp | 333 | ||||
-rw-r--r-- | src/Runtime/Source/runtime/q3dsqmlscript.cpp | 5 | ||||
-rw-r--r-- | src/Runtime/Source/runtime/q3dsqmlscript.h | 4 | ||||
-rw-r--r-- | src/Runtime/Source/viewer/Qt3DSViewerApp.cpp | 29 | ||||
-rw-r--r-- | src/Runtime/Source/viewer/Qt3DSViewerApp.h | 10 | ||||
-rw-r--r-- | src/Runtime/commoninclude.pri | 3 |
11 files changed, 298 insertions, 177 deletions
diff --git a/src/Runtime/Source/engine/Qt3DSTegraApplication.cpp b/src/Runtime/Source/engine/Qt3DSTegraApplication.cpp index 92c7f6cc..663fe836 100644 --- a/src/Runtime/Source/engine/Qt3DSTegraApplication.cpp +++ b/src/Runtime/Source/engine/Qt3DSTegraApplication.cpp @@ -202,7 +202,13 @@ public: void SetPresentationAttribute(const char *presId, const char *, const char *value) override; void GoToTime(const char *elementPath, const float time) override; void SetGlobalAnimationTime(qint64 inMilliSecs) override; - void SetDataInputValue(const QString &name, const QVariant &value); + void SetDataInputValue(const QString &name, const QVariant &value, + Q3DSDataInput::ValueRole property) override; + + QList<QString> dataInputs() const override; + float dataInputMax(const QString &name) const override; + float dataInputMin(const QString &name) const override; + void SetAttribute(const char *elementPath, const char *attributeName, const char *value) override; bool GetAttribute(const char *elementPath, const char *attributeName, void *value) override; void FireEvent(const char *element, const char *evtName) override; @@ -543,11 +549,31 @@ void CNDDView::SetGlobalAnimationTime(qint64 inMilliSecs) m_Application->SetTimeMilliSecs(inMilliSecs); } -void CNDDView::SetDataInputValue(const QString &name, const QVariant &value) +void CNDDView::SetDataInputValue( + const QString &name, const QVariant &value, + Q3DSDataInput::ValueRole property = Q3DSDataInput::ValueRole::Value) { Q3DStudio::CQmlEngine &theBridgeEngine = static_cast<Q3DStudio::CQmlEngine &>(m_RuntimeFactoryCore->GetScriptEngineQml()); - theBridgeEngine.SetDataInputValue(name, value); + theBridgeEngine.SetDataInputValue(name, value, property); +} + +QList<QString> CNDDView::dataInputs() const +{ + if (m_Application) + return m_Application->dataInputs(); + + return {}; +} + +float CNDDView::dataInputMax(const QString &name) const +{ + return m_Application->dataInputMax(name); +} + +float CNDDView::dataInputMin(const QString &name) const +{ + return m_Application->dataInputMin(name); } void CNDDView::SetAttribute(const char *elementPath, const char *attributeName, const char *value) diff --git a/src/Runtime/Source/engine/Qt3DSTegraApplication.h b/src/Runtime/Source/engine/Qt3DSTegraApplication.h index 91233355..75b6058b 100644 --- a/src/Runtime/Source/engine/Qt3DSTegraApplication.h +++ b/src/Runtime/Source/engine/Qt3DSTegraApplication.h @@ -38,6 +38,7 @@ #include "render/Qt3DSRenderBaseTypes.h" #include "EASTL/string.h" #include "foundation/Qt3DSRefCounted.h" +#include "q3dsdatainput.h" #include "Qt3DSWindowSystem.h" #include "Qt3DSTimer.h" #include "Qt3DSPresentation.h" @@ -187,7 +188,11 @@ public: virtual void SetPresentationAttribute(const char *presId, const char *, const char *value) = 0; virtual void GoToTime(const char *elementPath, const float time) = 0; virtual void SetGlobalAnimationTime(qint64 inMilliSecs) = 0; - virtual void SetDataInputValue(const QString &name, const QVariant &value) = 0; + virtual void SetDataInputValue(const QString &name, const QVariant &value, + Q3DSDataInput::ValueRole property) = 0; + virtual QList<QString> dataInputs() const = 0; + virtual float dataInputMax(const QString &name) const = 0; + virtual float dataInputMin(const QString &name) const = 0; virtual void SetAttribute(const char *elementPath, const char *attributeName, const char *value) = 0; virtual bool GetAttribute(const char *elementPath, const char *attributeName, void *value) = 0; @@ -280,9 +285,22 @@ public: { m_NDDView->SetGlobalAnimationTime(inMilliSecs); } - void SetDataInputValue(const QString &name, const QVariant &value) + void SetDataInputValue(const QString &name, const QVariant &value, + Q3DSDataInput::ValueRole property = Q3DSDataInput::ValueRole::Value) { - m_NDDView->SetDataInputValue(name, value); + m_NDDView->SetDataInputValue(name, value, property); + } + QList<QString> dataInputs() const + { + return m_NDDView->dataInputs(); + } + float datainputMax(const QString &name) const + { + return m_NDDView->dataInputMax(name); + } + float datainputMin(const QString &name) const + { + return m_NDDView->dataInputMin(name); } void SetAttribute(const char *elementPath, const char *attributeName, const char *value) { diff --git a/src/Runtime/Source/runtime/Qt3DSApplication.cpp b/src/Runtime/Source/runtime/Qt3DSApplication.cpp index 0538666d..6e7a2eb8 100644 --- a/src/Runtime/Source/runtime/Qt3DSApplication.cpp +++ b/src/Runtime/Source/runtime/Qt3DSApplication.cpp @@ -484,7 +484,7 @@ struct SApp : public IApplication bool m_createSuccessful; - DataInputMap m_dataInputs; + DataInputMap m_dataInputDefs; QT3DSI32 mRefCount; SApp(Q3DStudio::IRuntimeFactoryCore &inFactory, const char8_t *inAppDir) @@ -1175,7 +1175,7 @@ struct SApp : public IApplication diDef.evaluator = QString::fromUtf8(evaluator); } - m_dataInputs.insert(QString::fromUtf8(name), diDef); + m_dataInputDefs.insert(QString::fromUtf8(name), diDef); } else if (AreEqual(assetName, "renderplugin")) { const char8_t *pluginArgs = ""; inReader.UnregisteredAtt("args", pluginArgs); @@ -1217,7 +1217,22 @@ struct SApp : public IApplication DataInputMap &dataInputMap() override { - return m_dataInputs; + return m_dataInputDefs; + } + + QList<QString> dataInputs() const override + { + return m_dataInputDefs.keys(); + } + + float dataInputMax(const QString &name) const override + { + return m_dataInputDefs[name].max; + } + + float dataInputMin(const QString &name) const override + { + return m_dataInputDefs[name].min; } struct SAppXMLErrorHandler : public qt3ds::foundation::CXmlErrorHandler diff --git a/src/Runtime/Source/runtime/Qt3DSApplication.h b/src/Runtime/Source/runtime/Qt3DSApplication.h index d825fe0f..f0ccb175 100644 --- a/src/Runtime/Source/runtime/Qt3DSApplication.h +++ b/src/Runtime/Source/runtime/Qt3DSApplication.h @@ -37,6 +37,7 @@ #include "Qt3DSKernelTypes.h" #include "Qt3DSMetadata.h" #include "QtQml/qjsengine.h" +#include "q3dsdatainput.h" namespace Q3DStudio { class IRuntimeFactory; @@ -233,6 +234,13 @@ public: virtual bool createSuccessful() = 0; virtual DataInputMap &dataInputMap() = 0; + + virtual QList<QString> dataInputs() const = 0; + + virtual float dataInputMax(const QString &name) const = 0; + + virtual float dataInputMin(const QString &name) const = 0; + }; } } diff --git a/src/Runtime/Source/runtime/Qt3DSIScriptBridge.h b/src/Runtime/Source/runtime/Qt3DSIScriptBridge.h index 6dd04074..50b98368 100644 --- a/src/Runtime/Source/runtime/Qt3DSIScriptBridge.h +++ b/src/Runtime/Source/runtime/Qt3DSIScriptBridge.h @@ -33,6 +33,8 @@ #include "EASTL/vector.h" #include "EASTL/string.h" #include "foundation/Qt3DSRefCounted.h" +#include "q3dsdatainput.h" + //============================================================================== // Namespace //============================================================================== @@ -160,7 +162,9 @@ public: // Elements virtual void SetTableForElement(TElement &inElement, IScriptTableProvider &inProvider) = 0; virtual void SetAttribute(const char *element, const char *attName, const char *value) = 0; virtual void FireEvent(const char *element, const char *evtName) = 0; - virtual void SetDataInputValue(const QString &name, const QVariant &value) = 0; + virtual void SetDataInputValue( + const QString &name, const QVariant &value, + Q3DSDataInput::ValueRole property = Q3DSDataInput::ValueRole::Value) = 0; public: // Components virtual void GotoSlide(const char *component, const char *slideName, diff --git a/src/Runtime/Source/runtime/Qt3DSQmlEngine.cpp b/src/Runtime/Source/runtime/Qt3DSQmlEngine.cpp index 1ba1a5a6..25f857ee 100644 --- a/src/Runtime/Source/runtime/Qt3DSQmlEngine.cpp +++ b/src/Runtime/Source/runtime/Qt3DSQmlEngine.cpp @@ -413,7 +413,8 @@ public: void SetAttribute(const char *element, const char *attName, const char *value) override; bool GetAttribute(const char *element, const char *attName, char *value) override; void FireEvent(const char *element, const char *evtName) override; - void SetDataInputValue(const QString &name, const QVariant &value) override; + void SetDataInputValue(const QString &name, const QVariant &value, + Q3DSDataInput::ValueRole valueRole) override; void GotoSlide(const char *component, const char *slideName, const SScriptEngineGotoSlideArgs &inArgs) override; @@ -606,186 +607,200 @@ void CQmlEngineImpl::FireEvent(const char *element, const char *evtName) } } -void CQmlEngineImpl::SetDataInputValue(const QString &name, const QVariant &value) +void CQmlEngineImpl::SetDataInputValue( + const QString &name, const QVariant &value, + Q3DSDataInput::ValueRole valueRole = Q3DSDataInput::ValueRole::Value) { qt3ds::runtime::DataInputMap &diMap = m_Application->dataInputMap(); if (diMap.contains(name)) { qt3ds::runtime::DataInputDef &diDef = diMap[name]; - diDef.value = value; - const QVector<qt3ds::runtime::DataInputControlledAttribute> &ctrlAtt - = diDef.controlledAttributes; - for (const qt3ds::runtime::DataInputControlledAttribute &ctrlElem : ctrlAtt) { - switch (ctrlElem.propertyType) { - case ATTRIBUTETYPE_DATAINPUT_TIMELINE: { - // Quietly ignore other than number type data inputs when adjusting timeline - if (diDef.type == qt3ds::runtime::DataInputTypeRangedNumber) { - TTimeUnit endTime = 0; - TElement *element = getTarget(ctrlElem.elementPath.constData()); - TComponent *component = static_cast<TComponent *>(element); - endTime = component->GetTimePolicy().GetLoopingDuration(); - - // Normalize the value to dataInput range - qreal newTime = qreal(endTime) * (qreal(value.toFloat() - diDef.min) - / qreal(diDef.max - diDef.min)); - GotoTime(ctrlElem.elementPath.constData(), float(newTime / 1000.0)); - } - break; - } - case ATTRIBUTETYPE_DATAINPUT_SLIDE: { - // Quietly ignore other than string type when adjusting slide - if (diDef.type == qt3ds::runtime::DataInputTypeString) { - const QByteArray valueStr = value.toString().toUtf8(); - GotoSlide(ctrlElem.elementPath.constData(), valueStr.constData(), - SScriptEngineGotoSlideArgs()); + switch (valueRole) { + case Q3DSDataInput::ValueRole::Value: { // switch (valueRole) + diDef.value = value; + const QVector<qt3ds::runtime::DataInputControlledAttribute> &ctrlAtt + = diDef.controlledAttributes; + for (const qt3ds::runtime::DataInputControlledAttribute &ctrlElem : ctrlAtt) { + switch (ctrlElem.propertyType) { + case ATTRIBUTETYPE_DATAINPUT_TIMELINE: { + // Quietly ignore other than number type data inputs when adjusting timeline + if (diDef.type == qt3ds::runtime::DataInputTypeRangedNumber) { + TTimeUnit endTime = 0; + TElement *element = getTarget(ctrlElem.elementPath.constData()); + TComponent *component = static_cast<TComponent *>(element); + endTime = component->GetTimePolicy().GetLoopingDuration(); + + // Normalize the value to dataInput range + qreal newTime = qreal(endTime) * (qreal(value.toFloat() - diDef.min) + / qreal(diDef.max - diDef.min)); + GotoTime(ctrlElem.elementPath.constData(), float(newTime / 1000.0)); + } + break; } - break; - } - // Silently ignore invalid incoming type if it does not - // match with the datainput type except with type Variant, for which - // the incoming value is cast to target property type without checking. - // Caveat emptor. - - // For Evaluator, typecheck the JS evaluation result to see if it - // matches with the target property. - - // Handle ranged number similarly to generic float - // if it is bound to properties other - // than timeline animation i.e. disregard range min and max - - case ATTRIBUTETYPE_FLOAT: { - float valueFloat; - if (diDef.type == qt3ds::runtime::DataInputTypeFloat - || diDef.type == qt3ds::runtime::DataInputTypeRangedNumber - || diDef.type == qt3ds::runtime::DataInputTypeVariant) { - valueFloat = value.toFloat(); - } else if (diDef.type == qt3ds::runtime::DataInputTypeEvaluator) { - valueFloat = callJSFunc(name, diDef, QVariant::Type::Double).toFloat(); - } else { - qWarning() << __FUNCTION__ << "Property type " - << ctrlElem.propertyType - << " not matching with Datainput " << name - << " data type " - << diDef.type; + case ATTRIBUTETYPE_DATAINPUT_SLIDE: { + // Quietly ignore other than string type when adjusting slide + if (diDef.type == qt3ds::runtime::DataInputTypeString) { + const QByteArray valueStr = value.toString().toUtf8(); + GotoSlide(ctrlElem.elementPath.constData(), valueStr.constData(), + SScriptEngineGotoSlideArgs()); + } break; } + // Silently ignore invalid incoming type if it does not + // match with the datainput type except with type Variant, for which + // the incoming value is cast to target property type without checking. + // Caveat emptor. + + // For Evaluator, typecheck the JS evaluation result to see if it + // matches with the target property. + + // Handle ranged number similarly to generic float + // if it is bound to properties other + // than timeline animation i.e. disregard range min and max + case ATTRIBUTETYPE_FLOAT: { + float valueFloat; + if (diDef.type == qt3ds::runtime::DataInputTypeFloat + || diDef.type == qt3ds::runtime::DataInputTypeRangedNumber + || diDef.type == qt3ds::runtime::DataInputTypeVariant) { + valueFloat = value.toFloat(); + } else if (diDef.type == qt3ds::runtime::DataInputTypeEvaluator) { + valueFloat = callJSFunc(name, diDef, QVariant::Type::Double).toFloat(); + } else { + qWarning() << __FUNCTION__ << "Property type " + << ctrlElem.propertyType + << " not matching with Datainput " << name + << " data type " + << diDef.type; + break; + } - SetAttribute(ctrlElem.elementPath.constData(), - ctrlElem.attributeName.first().constData(), - reinterpret_cast<const char *>(&valueFloat)); - break; - } - case ATTRIBUTETYPE_FLOAT3: { - QVector3D valueVec; - if (diDef.type == qt3ds::runtime::DataInputTypeVector3 - || diDef.type == qt3ds::runtime::DataInputTypeVariant) { - valueVec = value.value<QVector3D>(); - } else if (diDef.type == qt3ds::runtime::DataInputTypeEvaluator) { - const QVariant res = callJSFunc(name, diDef, QVariant::Type::Vector3D); - valueVec = res.value<QVector3D>(); - } else { - qWarning() << __FUNCTION__ << "Property type " - << ctrlElem.propertyType - << " not matching with Datainput " << name - << " data type " - << diDef.type; + SetAttribute(ctrlElem.elementPath.constData(), + ctrlElem.attributeName.first().constData(), + reinterpret_cast<const char *>(&valueFloat)); break; } - // Set the values of vector attribute components separately - for (int i = 0; i < 3; i++) { - const float val = valueVec[i]; - SetAttribute(ctrlElem.elementPath.constData(), - ctrlElem.attributeName[i].constData(), - reinterpret_cast<const char *>(&val)); + case ATTRIBUTETYPE_FLOAT3: { + QVector3D valueVec; + if (diDef.type == qt3ds::runtime::DataInputTypeVector3 + || diDef.type == qt3ds::runtime::DataInputTypeVariant) { + valueVec = value.value<QVector3D>(); + } else if (diDef.type == qt3ds::runtime::DataInputTypeEvaluator) { + const QVariant res = callJSFunc(name, diDef, QVariant::Type::Vector3D); + valueVec = res.value<QVector3D>(); + } else { + qWarning() << __FUNCTION__ << "Property type " + << ctrlElem.propertyType + << " not matching with Datainput " << name + << " data type " + << diDef.type; + break; + } + // Set the values of vector attribute components separately + for (int i = 0; i < 3; i++) { + const float val = valueVec[i]; + SetAttribute(ctrlElem.elementPath.constData(), + ctrlElem.attributeName[i].constData(), + reinterpret_cast<const char *>(&val)); + } + break; } - break; - } - case ATTRIBUTETYPE_FLOAT2: - { - QVector2D valueVec; - if (diDef.type == qt3ds::runtime::DataInputTypeVector2 - || diDef.type == qt3ds::runtime::DataInputTypeVariant) { - valueVec = value.value<QVector2D>(); - } else if (diDef.type == qt3ds::runtime::DataInputTypeEvaluator) { - const QVariant res = callJSFunc(name, diDef, QVariant::Type::Vector2D); - valueVec = res.value<QVector2D>(); - } else { - qWarning() << __FUNCTION__ << "Property type " - << ctrlElem.propertyType - << " not matching with Datainput " << name - << " data type " - << diDef.type; + case ATTRIBUTETYPE_FLOAT2: + { + QVector2D valueVec; + if (diDef.type == qt3ds::runtime::DataInputTypeVector2 + || diDef.type == qt3ds::runtime::DataInputTypeVariant) { + valueVec = value.value<QVector2D>(); + } else if (diDef.type == qt3ds::runtime::DataInputTypeEvaluator) { + const QVariant res = callJSFunc(name, diDef, QVariant::Type::Vector2D); + valueVec = res.value<QVector2D>(); + } else { + qWarning() << __FUNCTION__ << "Property type " + << ctrlElem.propertyType + << " not matching with Datainput " << name + << " data type " + << diDef.type; + break; + } + // Set the values of vector attribute components separately + for (int i = 0; i < 2; i++) { + const float val = valueVec[i]; + SetAttribute(ctrlElem.elementPath.constData(), + ctrlElem.attributeName[i].constData(), + reinterpret_cast<const char *>(&val)); + } break; } - // Set the values of vector attribute components separately - for (int i = 0; i < 2; i++) { - const float val = valueVec[i]; + case ATTRIBUTETYPE_BOOL: { + bool valueBool; + if (diDef.type == qt3ds::runtime::DataInputTypeBoolean + || diDef.type == qt3ds::runtime::DataInputTypeVariant) { + valueBool = value.toBool(); + } else if (diDef.type == qt3ds::runtime::DataInputTypeEvaluator) { + valueBool = callJSFunc(name, diDef, QVariant::Type::Bool).toBool(); + } else { + qWarning() << __FUNCTION__ << "Property type " + << ctrlElem.propertyType + << " not matching with Datainput " << name + << " data type " + << diDef.type; + break; + } + SetAttribute(ctrlElem.elementPath.constData(), - ctrlElem.attributeName[i].constData(), - reinterpret_cast<const char *>(&val)); - } - break; - } - case ATTRIBUTETYPE_BOOL: { - bool valueBool; - if (diDef.type == qt3ds::runtime::DataInputTypeBoolean - || diDef.type == qt3ds::runtime::DataInputTypeVariant) { - valueBool = value.toBool(); - } else if (diDef.type == qt3ds::runtime::DataInputTypeEvaluator) { - valueBool = callJSFunc(name, diDef, QVariant::Type::Bool).toBool(); - } else { - qWarning() << __FUNCTION__ << "Property type " - << ctrlElem.propertyType - << " not matching with Datainput " << name - << " data type " - << diDef.type; + ctrlElem.attributeName.first().constData(), + reinterpret_cast<const char *>(&valueBool)); break; } + case ATTRIBUTETYPE_STRING: { + QByteArray valueStr; + // Allow scalar number types also as inputs to string attribute + if (diDef.type == qt3ds::runtime::DataInputTypeString + || diDef.type == qt3ds::runtime::DataInputTypeRangedNumber + || diDef.type == qt3ds::runtime::DataInputTypeFloat + || diDef.type == qt3ds::runtime::DataInputTypeVariant) { + valueStr = value.toString().toUtf8(); + } else if (diDef.type == qt3ds::runtime::DataInputTypeEvaluator) { + valueStr = callJSFunc(name, diDef, QVariant::Type::String) + .toString().toUtf8(); + } else { + qWarning() << __FUNCTION__ << "Property type " + << ctrlElem.propertyType + << " not matching with Datainput " << name + << " data type " + << diDef.type; + break; + } - SetAttribute(ctrlElem.elementPath.constData(), - ctrlElem.attributeName.first().constData(), - reinterpret_cast<const char *>(&valueBool)); - break; - } - case ATTRIBUTETYPE_STRING: { - QByteArray valueStr; - // Allow scalar number types also as inputs to string attribute - if (diDef.type == qt3ds::runtime::DataInputTypeString - || diDef.type == qt3ds::runtime::DataInputTypeRangedNumber - || diDef.type == qt3ds::runtime::DataInputTypeFloat - || diDef.type == qt3ds::runtime::DataInputTypeVariant) { - valueStr = value.toString().toUtf8(); - } else if (diDef.type == qt3ds::runtime::DataInputTypeEvaluator) { - valueStr = callJSFunc(name, diDef, QVariant::Type::String) - .toString().toUtf8(); - } else { - qWarning() << __FUNCTION__ << "Property type " - << ctrlElem.propertyType - << " not matching with Datainput " << name - << " data type " - << diDef.type; + SetAttribute(ctrlElem.elementPath.constData(), + ctrlElem.attributeName.first().constData(), + valueStr.constData()); + break; + } + default: + QT3DS_ALWAYS_ASSERT_MESSAGE("Unexpected data input type"); break; } - - SetAttribute(ctrlElem.elementPath.constData(), - ctrlElem.attributeName.first().constData(), - valueStr.constData()); - break; } - default: - QT3DS_ALWAYS_ASSERT_MESSAGE("Unexpected data input type"); - break; + + // Trigger re-evaluation of Evaluator datainputs that use this datainput + // as source data. Do this by calling setDataInputValue for evaluator + // with the current set value of the Evaluator (_not_ the evaluator result) + for (auto dependent : diDef.dependents) { + // Dependent list also contains the name of this datainput if + // the value of this datainput is used as source data. In this case + // obviously do not cause infinite recursion. + if (dependent != name) + SetDataInputValue(dependent, diMap[dependent].value); } + break; + } + case Q3DSDataInput::ValueRole::Max: { // switch (valueRole) + diDef.max = value.toFloat(); + break; + } + case Q3DSDataInput::ValueRole::Min: { // switch (valueRole) + diDef.min = value.toFloat(); + break; } - - // Trigger re-evaluation of Evaluator datainputs that use this datainput - // as source data. Do this by calling setDataInputValue for evaluator - // with the current set value of the Evaluator (_not_ the evaluator result) - for (auto dependent : diDef.dependents) { - // Dependent list also contains the name of this datainput if - // the value of this datainput is used as source data. In this case - // obviously do not cause infinite recursion. - if (dependent != name) - SetDataInputValue(dependent, diMap[dependent].value); } } } diff --git a/src/Runtime/Source/runtime/q3dsqmlscript.cpp b/src/Runtime/Source/runtime/q3dsqmlscript.cpp index 09f18148..326d709a 100644 --- a/src/Runtime/Source/runtime/q3dsqmlscript.cpp +++ b/src/Runtime/Source/runtime/q3dsqmlscript.cpp @@ -385,9 +385,10 @@ QString Q3DSQmlScript::getParent(const QString &handle) return parent->m_Path.c_str(); } -void Q3DSQmlScript::setDataInputValue(const QString &name, const QVariant &value) +void Q3DSQmlScript::setDataInputValue(const QString &name, const QVariant &value, + Q3DSDataInput::ValueRole valueRole) { - m_api.SetDataInputValue(name, value); + m_api.SetDataInputValue(name, value, valueRole); } TElement *Q3DSQmlScript::getElementByPath(const QString &path) diff --git a/src/Runtime/Source/runtime/q3dsqmlscript.h b/src/Runtime/Source/runtime/q3dsqmlscript.h index 1049bd86..b05fad03 100644 --- a/src/Runtime/Source/runtime/q3dsqmlscript.h +++ b/src/Runtime/Source/runtime/q3dsqmlscript.h @@ -41,6 +41,7 @@ #include "Qt3DSKernelTypes.h" #include "Qt3DSEvent.h" #include "q3dsqmlbehavior.h" +#include "q3dsdatainput.h" namespace Q3DStudio { class CQmlEngine; @@ -73,7 +74,8 @@ public: QVector3D lookAt(const QVector3D &target); QVector3D matrixToEuler(const QMatrix4x4 &matrix); QString getParent(const QString &handle); - void setDataInputValue(const QString &name, const QVariant &value); + void setDataInputValue(const QString &name, const QVariant &value, + Q3DSDataInput::ValueRole valueRole = Q3DSDataInput::ValueRole::Value); struct EventData { QJSValue function; diff --git a/src/Runtime/Source/viewer/Qt3DSViewerApp.cpp b/src/Runtime/Source/viewer/Qt3DSViewerApp.cpp index d393f2af..853a58ac 100644 --- a/src/Runtime/Source/viewer/Qt3DSViewerApp.cpp +++ b/src/Runtime/Source/viewer/Qt3DSViewerApp.cpp @@ -745,12 +745,37 @@ void Q3DSViewerApp::SetGlobalAnimationTime(qint64 inMilliSecs) m_Impl.m_tegraApp->SetGlobalAnimationTime(inMilliSecs); } -void Q3DSViewerApp::SetDataInputValue(const QString &name, const QVariant &value) +void Q3DSViewerApp::SetDataInputValue( + const QString &name, const QVariant &value, Q3DSDataInput::ValueRole valueRole) { if (!m_Impl.m_tegraApp) return; - m_Impl.m_tegraApp->SetDataInputValue(name, value); + m_Impl.m_tegraApp->SetDataInputValue(name, value, valueRole); +} + +QList<QString> Q3DSViewerApp::dataInputs() const +{ + if (!m_Impl.m_tegraApp) + return {}; + + return m_Impl.m_tegraApp->dataInputs(); +} + +float Q3DSViewerApp::dataInputMax(const QString &name) const +{ + if (!m_Impl.m_tegraApp) + return 0.0f; + + return m_Impl.m_tegraApp->datainputMax(name); +} + +float Q3DSViewerApp::dataInputMin(const QString &name) const +{ + if (!m_Impl.m_tegraApp) + return 0.0f; + + return m_Impl.m_tegraApp->datainputMin(name); } Q3DSViewerApp &Q3DSViewerApp::Create(void *glContext, Q3DStudio::IAudioPlayer *inAudioPlayer) diff --git a/src/Runtime/Source/viewer/Qt3DSViewerApp.h b/src/Runtime/Source/viewer/Qt3DSViewerApp.h index 0d56c3a1..4cc15def 100644 --- a/src/Runtime/Source/viewer/Qt3DSViewerApp.h +++ b/src/Runtime/Source/viewer/Qt3DSViewerApp.h @@ -38,7 +38,7 @@ #include <QObject> #include "Qt3DSInputDefs.h" - +#include "q3dsdatainput.h" #include <QtGui/qsurfaceformat.h> namespace Q3DStudio { @@ -348,7 +348,13 @@ public: void SetGlobalAnimationTime(qint64 inMilliSecs); - void SetDataInputValue(const QString &name, const QVariant &value); + void SetDataInputValue(const QString &name, const QVariant &value, + Q3DSDataInput::ValueRole valueRole = Q3DSDataInput::ValueRole::Value); + + QList<QString> dataInputs() const; + + float dataInputMax(const QString &name) const; + float dataInputMin(const QString &name) const; QString error(); diff --git a/src/Runtime/commoninclude.pri b/src/Runtime/commoninclude.pri index bf7d92d2..408b8755 100644 --- a/src/Runtime/commoninclude.pri +++ b/src/Runtime/commoninclude.pri @@ -41,7 +41,8 @@ INCLUDEPATH += \ $$PWD/../QtExtras/qmlstreamer \ $$PWD/Source/runtimerender \ $$PWD/Source/runtimerender/graphobjects \ - $$PWD/Source/runtimerender/resourcemanager + $$PWD/Source/runtimerender/resourcemanager \ + $$PWD/../Viewer/studio3d # TODO: Investigate whether these can be moved to commonplatform win32-msvc { |