diff options
author | Tomi Korpipää <tomi.korpipaa@qt.io> | 2016-11-18 13:12:13 +0200 |
---|---|---|
committer | Tomi Korpipää <tomi.korpipaa@qt.io> | 2016-11-18 11:17:22 +0000 |
commit | e584f8753a39d3364aa50b4b89bafa4a0209af7c (patch) | |
tree | d6438e2c66dd3ae5310bce8e0b49bae84cf228cc /src/datavisualization/engine | |
parent | 4ff14c23b271747cc7a23fd72499d2032d692185 (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.cpp | 4 | ||||
-rw-r--r-- | src/datavisualization/engine/abstract3drenderer.cpp | 13 | ||||
-rw-r--r-- | src/datavisualization/engine/q3dlight.cpp | 49 | ||||
-rw-r--r-- | src/datavisualization/engine/q3dlight.h | 7 | ||||
-rw-r--r-- | src/datavisualization/engine/q3dlight_p.h | 1 | ||||
-rw-r--r-- | src/datavisualization/engine/q3dobject.cpp | 26 |
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 { |