summaryrefslogtreecommitdiffstats
path: root/src/Runtime
diff options
context:
space:
mode:
authorJanne Kangas <janne.kangas@qt.io>2019-03-21 13:38:12 +0200
committerJanne Kangas <janne.kangas@qt.io>2019-04-16 09:28:11 +0000
commit54b0cb3a95edee5471d9899587040f82e0cb4819 (patch)
tree673f16b544bb6af27b190bf25a49569737bc6db0 /src/Runtime
parentc6edb9c7d15843e8ab965d365099ace29e2d2049 (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.cpp32
-rw-r--r--src/Runtime/Source/engine/Qt3DSTegraApplication.h24
-rw-r--r--src/Runtime/Source/runtime/Qt3DSApplication.cpp21
-rw-r--r--src/Runtime/Source/runtime/Qt3DSApplication.h8
-rw-r--r--src/Runtime/Source/runtime/Qt3DSIScriptBridge.h6
-rw-r--r--src/Runtime/Source/runtime/Qt3DSQmlEngine.cpp333
-rw-r--r--src/Runtime/Source/runtime/q3dsqmlscript.cpp5
-rw-r--r--src/Runtime/Source/runtime/q3dsqmlscript.h4
-rw-r--r--src/Runtime/Source/viewer/Qt3DSViewerApp.cpp29
-rw-r--r--src/Runtime/Source/viewer/Qt3DSViewerApp.h10
-rw-r--r--src/Runtime/commoninclude.pri3
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 {