summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKevin Ottens <kevin.ottens@kdab.com>2017-01-31 17:09:21 +0100
committerSean Harmer <sean.harmer@kdab.com>2017-01-31 16:52:58 +0000
commit9ae12590ac965ca454b67c27f4411d71ad05ae86 (patch)
treebab852f45d8936604a91c9a514531613d9f4a8e6
parent708720b8a1056aec2c62a3a2467a324d62a25ee1 (diff)
Add gamma to QViewport's API
Change-Id: Ieced911cf1e51c0befc5ce91e8529a421b5c5a80 Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
-rw-r--r--src/render/framegraph/qviewport.cpp34
-rw-r--r--src/render/framegraph/qviewport.h4
-rw-r--r--src/render/framegraph/qviewport_p.h2
-rw-r--r--src/render/framegraph/viewportnode.cpp14
-rw-r--r--src/render/framegraph/viewportnode_p.h4
-rw-r--r--tests/auto/render/qviewport/tst_qviewport.cpp108
6 files changed, 131 insertions, 35 deletions
diff --git a/src/render/framegraph/qviewport.cpp b/src/render/framegraph/qviewport.cpp
index a78e260a5..8c1ebe67c 100644
--- a/src/render/framegraph/qviewport.cpp
+++ b/src/render/framegraph/qviewport.cpp
@@ -50,6 +50,7 @@ namespace Qt3DRender {
QViewportPrivate::QViewportPrivate()
: QFrameGraphNodePrivate()
, m_normalizedRect(QRectF(0.0f, 0.0f, 1.0f, 1.0f))
+ , m_gamma(2.2f)
{
}
@@ -62,7 +63,8 @@ QViewportPrivate::QViewportPrivate()
\inherits Qt3DRender::QFrameGraphNode
Qt3DRender::QViewport of the scene specifies at which portion of the render surface Qt3D
- is rendering to. Area outside the viewport is left untouched.
+ is rendering to. Area outside the viewport is left untouched. It also controls global parameters
+ to the rendering in that viewport like gamma.
*/
/*!
@@ -74,7 +76,8 @@ QViewportPrivate::QViewportPrivate()
\brief A viewport on the Qt3D Scene
Viewport of the scene specifies at which portion of the render surface Qt3D is
- rendering to. Area outside the viewport is left untouched.
+ rendering to. Area outside the viewport is left untouched. It also controls global parameters
+ to the rendering in that viewport like gamma.
*/
/*!
@@ -86,6 +89,12 @@ QViewportPrivate::QViewportPrivate()
*/
/*!
+ \qmlproperty rect Viewport::gamma
+
+ Specifies the gamma factor for the viewport. The default is 2.2 which should give proper result on most screens.
+ */
+
+/*!
Constructs QViewport with given \a parent.
*/
QViewport::QViewport(QNode *parent)
@@ -111,6 +120,12 @@ QRectF QViewport::normalizedRect() const
return d->m_normalizedRect;
}
+float QViewport::gamma() const
+{
+ Q_D(const QViewport);
+ return d->m_gamma;
+}
+
/*!
\property QViewport::normalizedRect
@@ -127,12 +142,27 @@ void QViewport::setNormalizedRect(const QRectF &normalizedRect)
}
}
+/*!
+ \property QViewport::gamma
+
+ Specifies the gamma factor for the viewport. The default is 2.2 which should give proper result on most screens.
+ */
+void QViewport::setGamma(float gamma)
+{
+ Q_D(QViewport);
+ if (gamma != d->m_gamma) {
+ d->m_gamma = gamma;
+ emit gammaChanged(gamma);
+ }
+}
+
Qt3DCore::QNodeCreatedChangeBasePtr QViewport::createNodeCreationChange() const
{
auto creationChange = QFrameGraphNodeCreatedChangePtr<QViewportData>::create(this);
auto &data = creationChange->data;
Q_D(const QViewport);
data.normalizedRect = d->m_normalizedRect;
+ data.gamma = d->m_gamma;
return creationChange;
}
diff --git a/src/render/framegraph/qviewport.h b/src/render/framegraph/qviewport.h
index 5959ed791..abe423cf4 100644
--- a/src/render/framegraph/qviewport.h
+++ b/src/render/framegraph/qviewport.h
@@ -54,18 +54,22 @@ class QT3DRENDERSHARED_EXPORT QViewport : public QFrameGraphNode
{
Q_OBJECT
Q_PROPERTY(QRectF normalizedRect READ normalizedRect WRITE setNormalizedRect NOTIFY normalizedRectChanged)
+ Q_PROPERTY(float gamma READ gamma WRITE setGamma NOTIFY gammaChanged)
public:
explicit QViewport(Qt3DCore::QNode *parent = nullptr);
~QViewport();
QRectF normalizedRect() const;
+ float gamma() const;
public Q_SLOTS:
void setNormalizedRect(const QRectF& normalizedRect);
+ void setGamma(float gamma);
Q_SIGNALS:
void normalizedRectChanged(const QRectF& normalizedRect);
+ void gammaChanged(float gamma);
protected:
explicit QViewport(QViewportPrivate &dd, Qt3DCore::QNode *parent = nullptr);
diff --git a/src/render/framegraph/qviewport_p.h b/src/render/framegraph/qviewport_p.h
index 790cd3d06..4c82f38b3 100644
--- a/src/render/framegraph/qviewport_p.h
+++ b/src/render/framegraph/qviewport_p.h
@@ -67,11 +67,13 @@ public :
Q_DECLARE_PUBLIC(QViewport)
QRectF m_normalizedRect;
QColor m_clearColor;
+ float m_gamma;
};
struct QViewportData
{
QRectF normalizedRect;
+ float gamma;
};
} // namespace Qt3DRender
diff --git a/src/render/framegraph/viewportnode.cpp b/src/render/framegraph/viewportnode.cpp
index ccdb68918..c16a660b0 100644
--- a/src/render/framegraph/viewportnode.cpp
+++ b/src/render/framegraph/viewportnode.cpp
@@ -55,6 +55,7 @@ ViewportNode::ViewportNode()
, m_yMin(0.0f)
, m_xMax(1.0f)
, m_yMax(1.0f)
+ , m_gamma(2.2f)
{
}
@@ -67,6 +68,7 @@ void ViewportNode::initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr
m_xMax = data.normalizedRect.width();
m_yMin = data.normalizedRect.y();
m_yMax = data.normalizedRect.height();
+ m_gamma = data.gamma;
}
float ViewportNode::xMin() const
@@ -106,6 +108,16 @@ void ViewportNode::setYMax(float yMax)
m_yMax = yMax;
}
+float ViewportNode::gamma() const
+{
+ return m_gamma;
+}
+
+void ViewportNode::setGamma(float gamma)
+{
+ m_gamma = gamma;
+}
+
void ViewportNode::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e)
{
if (e->type() == PropertyUpdated) {
@@ -116,6 +128,8 @@ void ViewportNode::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e)
setYMin(normalizedRect.y());
setXMax(normalizedRect.width());
setYMax(normalizedRect.height());
+ } else if (propertyChange->propertyName() == QByteArrayLiteral("gamma")) {
+ setGamma(propertyChange->value().toFloat());
}
markDirty(AbstractRenderer::AllDirty);
}
diff --git a/src/render/framegraph/viewportnode_p.h b/src/render/framegraph/viewportnode_p.h
index 882aa4d86..85003ff36 100644
--- a/src/render/framegraph/viewportnode_p.h
+++ b/src/render/framegraph/viewportnode_p.h
@@ -81,6 +81,9 @@ public:
float yMax() const;
void setYMax(float yMax);
+ float gamma() const;
+ void setGamma(float gamma);
+
void sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) Q_DECL_OVERRIDE;
private:
@@ -90,6 +93,7 @@ private:
float m_yMin;
float m_xMax;
float m_yMax;
+ float m_gamma;
};
QRectF computeViewport(const QRectF &childViewport, const ViewportNode *parentViewport);
diff --git a/tests/auto/render/qviewport/tst_qviewport.cpp b/tests/auto/render/qviewport/tst_qviewport.cpp
index 87b22e22b..93a2735f2 100644
--- a/tests/auto/render/qviewport/tst_qviewport.cpp
+++ b/tests/auto/render/qviewport/tst_qviewport.cpp
@@ -46,14 +46,15 @@ private Q_SLOTS:
{
QTest::addColumn<Qt3DRender::QViewport *>("viewport");
QTest::addColumn<QRectF>("normalizedRect");
+ QTest::addColumn<float>("gamma");
Qt3DRender::QViewport *defaultConstructed = new Qt3DRender::QViewport();
- QTest::newRow("defaultConstructed") << defaultConstructed << QRectF(0.0f, 0.0f, 1.0f, 1.0f);
+ QTest::newRow("defaultConstructed") << defaultConstructed << QRectF(0.0f, 0.0f, 1.0f, 1.0f) << 2.2f;
Qt3DRender::QViewport *smallGreenViewport = new Qt3DRender::QViewport();
smallGreenViewport->setNormalizedRect(QRectF(0.2f, 0.2f, 0.6f, 0.6f));
- QTest::newRow("smallGreenViewport") << smallGreenViewport << QRectF(0.2f, 0.2f, 0.6f, 0.6f);
-
+ smallGreenViewport->setGamma(1.8f);
+ QTest::newRow("smallGreenViewport") << smallGreenViewport << QRectF(0.2f, 0.2f, 0.6f, 0.6f) << 1.8f;
}
void checkCloning()
@@ -61,9 +62,11 @@ private Q_SLOTS:
// GIVEN
QFETCH(Qt3DRender::QViewport *, viewport);
QFETCH(QRectF, normalizedRect);
+ QFETCH(float, gamma);
// THEN
QCOMPARE(viewport->normalizedRect(), normalizedRect);
+ QCOMPARE(viewport->gamma(), gamma);
// WHEN
Qt3DCore::QNodeCreatedChangeGenerator creationChangeGenerator(viewport);
@@ -80,6 +83,7 @@ private Q_SLOTS:
QCOMPARE(viewport->isEnabled(), creationChangeData->isNodeEnabled());
QCOMPARE(viewport->metaObject(), creationChangeData->metaObject());
QCOMPARE(viewport->normalizedRect(), cloneData.normalizedRect);
+ QCOMPARE(viewport->gamma(), cloneData.gamma);
delete viewport;
}
@@ -91,39 +95,77 @@ private Q_SLOTS:
QScopedPointer<Qt3DRender::QViewport> viewport(new Qt3DRender::QViewport());
arbiter.setArbiterOnNode(viewport.data());
- // WHEN
- viewport->setNormalizedRect(QRectF(0.5f, 0.5f, 1.0f, 1.0f));
- QCoreApplication::processEvents();
-
- // THEN
- QCOMPARE(arbiter.events.size(), 1);
- Qt3DCore::QPropertyUpdatedChangePtr change = arbiter.events.first().staticCast<Qt3DCore::QPropertyUpdatedChange>();
- QCOMPARE(change->propertyName(), "normalizedRect");
- QCOMPARE(change->subjectId(), viewport->id());
- QCOMPARE(change->value().value<QRectF>(), QRectF(0.5f, 0.5f, 1.0f, 1.0f));
- QCOMPARE(change->type(), Qt3DCore::PropertyUpdated);
+ {
+ // WHEN
+ viewport->setNormalizedRect(QRectF(0.5f, 0.5f, 1.0f, 1.0f));
+ QCoreApplication::processEvents();
+
+ // THEN
+ QCOMPARE(arbiter.events.size(), 1);
+ Qt3DCore::QPropertyUpdatedChangePtr change = arbiter.events.first().staticCast<Qt3DCore::QPropertyUpdatedChange>();
+ QCOMPARE(change->propertyName(), "normalizedRect");
+ QCOMPARE(change->subjectId(), viewport->id());
+ QCOMPARE(change->value().value<QRectF>(), QRectF(0.5f, 0.5f, 1.0f, 1.0f));
+ QCOMPARE(change->type(), Qt3DCore::PropertyUpdated);
+
+ arbiter.events.clear();
+
+ // WHEN
+ viewport->setNormalizedRect(QRectF(0.5f, 0.5f, 1.0f, 1.0f));
+ QCoreApplication::processEvents();
+
+ // THEN
+ QCOMPARE(arbiter.events.size(), 0);
+
+ // WHEN
+ viewport->setNormalizedRect(QRectF(0.0f, 0.0f, 1.0f, 1.0f));
+ QCoreApplication::processEvents();
+
+ // THEN
+ QCOMPARE(arbiter.events.size(), 1);
+ change = arbiter.events.first().staticCast<Qt3DCore::QPropertyUpdatedChange>();
+ QCOMPARE(change->propertyName(), "normalizedRect");
+ QCOMPARE(change->subjectId(), viewport->id());
+ QCOMPARE(change->value().value<QRectF>(), QRectF(0.0f, 0.0f, 1.0f, 1.0f));
+ QCOMPARE(change->type(), Qt3DCore::PropertyUpdated);
+ }
arbiter.events.clear();
- // WHEN
- viewport->setNormalizedRect(QRectF(0.5f, 0.5f, 1.0f, 1.0f));
- QCoreApplication::processEvents();
-
- // THEN
- QCOMPARE(arbiter.events.size(), 0);
-
- // WHEN
- viewport->setNormalizedRect(QRectF(0.0f, 0.0f, 1.0f, 1.0f));
- QCoreApplication::processEvents();
-
- // THEN
- QCOMPARE(arbiter.events.size(), 1);
- change = arbiter.events.first().staticCast<Qt3DCore::QPropertyUpdatedChange>();
- QCOMPARE(change->propertyName(), "normalizedRect");
- QCOMPARE(change->subjectId(), viewport->id());
- QCOMPARE(change->value().value<QRectF>(), QRectF(0.0f, 0.0f, 1.0f, 1.0f));
- QCOMPARE(change->type(), Qt3DCore::PropertyUpdated);
-
+ {
+ // WHEN
+ viewport->setGamma(1.8f);
+ QCoreApplication::processEvents();
+
+ // THEN
+ QCOMPARE(arbiter.events.size(), 1);
+ Qt3DCore::QPropertyUpdatedChangePtr change = arbiter.events.first().staticCast<Qt3DCore::QPropertyUpdatedChange>();
+ QCOMPARE(change->propertyName(), "gamma");
+ QCOMPARE(change->subjectId(), viewport->id());
+ QCOMPARE(change->value().toFloat(), 1.8f);
+ QCOMPARE(change->type(), Qt3DCore::PropertyUpdated);
+
+ arbiter.events.clear();
+
+ // WHEN
+ viewport->setGamma(1.8f);
+ QCoreApplication::processEvents();
+
+ // THEN
+ QCOMPARE(arbiter.events.size(), 0);
+
+ // WHEN
+ viewport->setGamma(2.0f);
+ QCoreApplication::processEvents();
+
+ // THEN
+ QCOMPARE(arbiter.events.size(), 1);
+ change = arbiter.events.first().staticCast<Qt3DCore::QPropertyUpdatedChange>();
+ QCOMPARE(change->propertyName(), "gamma");
+ QCOMPARE(change->subjectId(), viewport->id());
+ QCOMPARE(change->value().toFloat(), 2.0f);
+ QCOMPARE(change->type(), Qt3DCore::PropertyUpdated);
+ }
}
};