summaryrefslogtreecommitdiffstats
path: root/src/datavisualization/engine
diff options
context:
space:
mode:
authorTomi Korpipää <tomi.korpipaa@qt.io>2016-11-18 13:12:13 +0200
committerTomi Korpipää <tomi.korpipaa@qt.io>2016-11-18 11:17:22 +0000
commite584f8753a39d3364aa50b4b89bafa4a0209af7c (patch)
treed6438e2c66dd3ae5310bce8e0b49bae84cf228cc /src/datavisualization/engine
parent4ff14c23b271747cc7a23fd72499d2032d692185 (diff)
Allow light position modification by user
Change-Id: I7efd56754bae16990fd11081493da0a37698f76b Task-number: QTRD-1803 Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io>
Diffstat (limited to 'src/datavisualization/engine')
-rw-r--r--src/datavisualization/engine/abstract3dcontroller.cpp4
-rw-r--r--src/datavisualization/engine/abstract3drenderer.cpp13
-rw-r--r--src/datavisualization/engine/q3dlight.cpp49
-rw-r--r--src/datavisualization/engine/q3dlight.h7
-rw-r--r--src/datavisualization/engine/q3dlight_p.h1
-rw-r--r--src/datavisualization/engine/q3dobject.cpp26
6 files changed, 88 insertions, 12 deletions
diff --git a/src/datavisualization/engine/abstract3dcontroller.cpp b/src/datavisualization/engine/abstract3dcontroller.cpp
index 08949c54..adfe461e 100644
--- a/src/datavisualization/engine/abstract3dcontroller.cpp
+++ b/src/datavisualization/engine/abstract3dcontroller.cpp
@@ -87,9 +87,7 @@ Abstract3DController::Abstract3DController(QRect initialViewport, Q3DScene *scen
setActiveTheme(defaultTheme);
m_scene->d_ptr->setViewport(initialViewport);
-
- // Populate the scene
- m_scene->activeLight()->setPosition(defaultLightPos);
+ m_scene->activeLight()->setAutoPosition(true);
// Create initial default input handler
QAbstract3DInputHandler *inputHandler;
diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp
index 4a681554..dd3212ac 100644
--- a/src/datavisualization/engine/abstract3drenderer.cpp
+++ b/src/datavisualization/engine/abstract3drenderer.cpp
@@ -500,6 +500,11 @@ void Abstract3DRenderer::handleShadowQualityChange()
{
reInitShaders();
+ if (m_cachedScene->activeLight()->isAutoPosition()
+ || m_cachedShadowQuality > QAbstract3DGraph::ShadowQualityNone) {
+ m_cachedScene->d_ptr->setLightPositionRelativeToCamera(defaultLightPos);
+ emit needRender();
+ }
if (m_isOpenGLES && m_cachedShadowQuality != QAbstract3DGraph::ShadowQualityNone) {
emit requestShadowQuality(QAbstract3DGraph::ShadowQualityNone);
qWarning("Shadows are not yet supported for OpenGL ES2");
@@ -1994,8 +1999,12 @@ void Abstract3DRenderer::updateCameraViewport()
m_oldCameraTarget = adjustedTarget;
}
m_cachedScene->activeCamera()->d_ptr->updateViewMatrix(m_autoScaleAdjustment);
- // Set light position (i.e rotate light with activeCamera, a bit above it)
- m_cachedScene->d_ptr->setLightPositionRelativeToCamera(defaultLightPos);
+ // Set light position (i.e rotate light with activeCamera, a bit above it).
+ // Check if we want to use automatic light positioning even without shadows
+ if (m_cachedScene->activeLight()->isAutoPosition()
+ || m_cachedShadowQuality > QAbstract3DGraph::ShadowQualityNone) {
+ m_cachedScene->d_ptr->setLightPositionRelativeToCamera(defaultLightPos);
+ }
}
QT_END_NAMESPACE_DATAVISUALIZATION
diff --git a/src/datavisualization/engine/q3dlight.cpp b/src/datavisualization/engine/q3dlight.cpp
index bc337512..8c439023 100644
--- a/src/datavisualization/engine/q3dlight.cpp
+++ b/src/datavisualization/engine/q3dlight.cpp
@@ -37,7 +37,9 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION
* \brief Representation of a light source in 3D space.
* \since QtDataVisualization 1.0
*
- * Q3DLight represents a monochrome non variable light source in 3D space.
+ * Q3DLight represents a monochrome light source in 3D space.
+ *
+ * \note Default light has isAutoPosition() \c true.
*/
/*!
@@ -48,7 +50,18 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION
* \instantiates Q3DLight
* \brief Representation of a light source in 3D space.
*
- * Light3D represents a monochrome non variable light source in 3D space.
+ * Light3D represents a monochrome light source in 3D space.
+ *
+ * \note Default light has autoPosition \c true.
+ */
+
+/*!
+ * \qmlproperty bool Light3D::autoPosition
+ * \since QtDataVisualization 1.3
+ * Holds a flag telling if the light position is automatic or not. If true, light position follows
+ * camera automatically.
+ * \note Has no effect if shadows are enabled. Remember to disable shadows before setting light's
+ * position, or it will be overwritten by automatic positioning, if autoPosition is false.
*/
/*!
@@ -68,8 +81,31 @@ Q3DLight::~Q3DLight()
{
}
+/*!
+ * \property Q3DLight::autoPosition
+ * \since QtDataVisualization 5.9
+ * Holds a flag telling if the light position is automatic or not. If true, light position follows
+ * camera automatically.
+ * \note Has no effect if shadows are enabled. Remember to disable shadows before setting light's
+ * position, or it will be overwritten by automatic positioning, if isAutoPosition() is false.
+ */
+void Q3DLight::setAutoPosition(bool enabled)
+{
+ if (enabled != d_ptr->m_automaticLight) {
+ d_ptr->m_automaticLight = enabled;
+ setDirty(true);
+ emit autoPositionChanged(enabled);
+ }
+}
+
+bool Q3DLight::isAutoPosition()
+{
+ return d_ptr->m_automaticLight;
+}
+
Q3DLightPrivate::Q3DLightPrivate(Q3DLight *q) :
- q_ptr(q)
+ q_ptr(q),
+ m_automaticLight(false)
{
}
@@ -79,8 +115,11 @@ Q3DLightPrivate::~Q3DLightPrivate()
void Q3DLightPrivate::sync(Q3DLight &other)
{
- Q_UNUSED(other);
- // Do nothing. Only value light has to sync is the position, which we handle internally.
+ if (q_ptr->isDirty()) {
+ other.setPosition(q_ptr->position());
+ other.setAutoPosition(q_ptr->isAutoPosition());
+ q_ptr->setDirty(false);
+ }
}
QT_END_NAMESPACE_DATAVISUALIZATION
diff --git a/src/datavisualization/engine/q3dlight.h b/src/datavisualization/engine/q3dlight.h
index 8dc59d3a..582e600c 100644
--- a/src/datavisualization/engine/q3dlight.h
+++ b/src/datavisualization/engine/q3dlight.h
@@ -39,11 +39,18 @@ class Q3DLightPrivate;
class QT_DATAVISUALIZATION_EXPORT Q3DLight : public Q3DObject
{
Q_OBJECT
+ Q_PROPERTY(bool autoPosition READ isAutoPosition WRITE setAutoPosition NOTIFY autoPositionChanged REVISION 1)
public:
explicit Q3DLight(QObject *parent = Q_NULLPTR);
virtual ~Q3DLight();
+ void setAutoPosition(bool enabled);
+ bool isAutoPosition();
+
+Q_SIGNALS:
+ Q_REVISION(1) void autoPositionChanged(bool autoPosition);
+
private:
QScopedPointer<Q3DLightPrivate> d_ptr;
diff --git a/src/datavisualization/engine/q3dlight_p.h b/src/datavisualization/engine/q3dlight_p.h
index 2e22be47..afb3330b 100644
--- a/src/datavisualization/engine/q3dlight_p.h
+++ b/src/datavisualization/engine/q3dlight_p.h
@@ -57,6 +57,7 @@ public:
void sync(Q3DLight &other);
public:
+ bool m_automaticLight;
Q3DLight *q_ptr;
};
diff --git a/src/datavisualization/engine/q3dobject.cpp b/src/datavisualization/engine/q3dobject.cpp
index 42c9ccd9..f7757293 100644
--- a/src/datavisualization/engine/q3dobject.cpp
+++ b/src/datavisualization/engine/q3dobject.cpp
@@ -43,6 +43,28 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION
*/
/*!
+ \qmltype Object3D
+ \inqmlmodule QtDataVisualization
+ \since QtDataVisualization 1.0
+ \ingroup datavisualization_qml
+ \instantiates Q3DObject
+ \brief Simple baseclass for all the objects in the 3D scene.
+
+ Object3D is an uncreatable base type that contains only position information for an object in
+ 3D scene. The object is considered to be a single point in the coordinate space without
+ dimensions.
+*/
+
+/*!
+ * \qmlproperty vector3d Object3D::position
+ *
+ * This property contains the 3D position of the object.
+ *
+ * \note Currently setting this property has no effect for Camera3D, as the position is handled
+ * internally.
+ */
+
+/*!
* Constructs a new 3D object with position set to origin by default. An
* optional \a parent parameter can be given and is then passed to QObject constructor.
*/
@@ -84,8 +106,8 @@ Q3DScene *Q3DObject::parentScene()
*
* This property contains the 3D position of the object.
*
- * \note Currently setting this property has no effect, as the positions of Q3DObjects in the
- * scene are handled internally.
+ * \note Currently setting this property has no effect for Q3DCamera, as the position is handled
+ * internally.
*/
QVector3D Q3DObject::position() const
{