summaryrefslogtreecommitdiffstats
path: root/src/render/renderstates
diff options
context:
space:
mode:
authorSean Harmer <sean.harmer@kdab.com>2017-08-19 15:53:30 +0100
committerSean Harmer <sean.harmer@kdab.com>2017-08-19 16:28:52 +0100
commit8f863343a9e2e2f3630f22407f4e5e30e72745cf (patch)
tree5574e3c2215d74345e15df5f45ed3211e065541a /src/render/renderstates
parent3edb85002b848033bbeefa33001d19fb514ef489 (diff)
parent9d8c9ada161ad97634992c444196add0abb4f9d1 (diff)
Merge branch '5.9' into dev
Conflicts: src/render/backend/renderer.cpp src/render/backend/renderview.cpp src/render/graphicshelpers/graphicscontext_p.h src/render/graphicshelpers/graphicshelperes2_p.h src/render/graphicshelpers/graphicshelpergl2_p.h src/render/graphicshelpers/graphicshelpergl3_2_p.h src/render/graphicshelpers/graphicshelpergl3_3_p.h src/render/graphicshelpers/graphicshelpergl4_p.h src/render/graphicshelpers/graphicshelperinterface_p.h src/render/jobs/pickboundingvolumejob.cpp tests/auto/animation/clipanimator/tst_clipanimator.cpp tests/auto/auto.pro tests/manual/manual.pro Also disabled the QQmlMetaType codepaths following commit 49a11e882059ee1729f776722e085dd21d378c36 in qtdeclarative. The QQmlMetaType codepaths will be re-enabled once a qt5.git integration has succeeded. Change-Id: Ia654d75425e6d406c472d19864383612208cad2b
Diffstat (limited to 'src/render/renderstates')
-rw-r--r--src/render/renderstates/qstencilmask_p.h2
-rw-r--r--src/render/renderstates/qstenciloperation.cpp49
-rw-r--r--src/render/renderstates/qstenciloperation_p.h15
-rw-r--r--src/render/renderstates/qstenciltest.cpp49
-rw-r--r--src/render/renderstates/qstenciltest_p.h15
-rw-r--r--src/render/renderstates/renderstates.cpp59
-rw-r--r--src/render/renderstates/renderstates_p.h3
-rw-r--r--src/render/renderstates/statevariant_p.h2
8 files changed, 151 insertions, 43 deletions
diff --git a/src/render/renderstates/qstencilmask_p.h b/src/render/renderstates/qstencilmask_p.h
index a6aad60b9..762b249f8 100644
--- a/src/render/renderstates/qstencilmask_p.h
+++ b/src/render/renderstates/qstencilmask_p.h
@@ -60,7 +60,7 @@ class QT3DRENDERSHARED_PRIVATE_EXPORT QStencilMaskPrivate : public QRenderStateP
{
public:
QStencilMaskPrivate()
- : QRenderStatePrivate(Render::StencilTestStateMask)
+ : QRenderStatePrivate(Render::StencilWriteStateMask)
, m_frontOutputMask(0)
, m_backOutputMask(0)
{}
diff --git a/src/render/renderstates/qstenciloperation.cpp b/src/render/renderstates/qstenciloperation.cpp
index 7a5b113d8..66a326d55 100644
--- a/src/render/renderstates/qstenciloperation.cpp
+++ b/src/render/renderstates/qstenciloperation.cpp
@@ -40,6 +40,7 @@
#include "qstenciloperation.h"
#include "qstenciloperation_p.h"
#include "qstenciloperationarguments.h"
+#include <Qt3DCore/qpropertyupdatedchange.h>
#include <Qt3DRender/private/qrenderstatecreatedchange_p.h>
QT_BEGIN_NAMESPACE
@@ -103,6 +104,19 @@ namespace Qt3DRender {
QStencilOperation::QStencilOperation(QNode *parent)
: QRenderState(*new QStencilOperationPrivate(), parent)
{
+ Q_D(QStencilOperation);
+
+ const auto resend = [d]() { d->resendArguments(); };
+
+ (void) connect(d->m_front, &QStencilOperationArguments::allTestsPassOperationChanged, resend);
+ (void) connect(d->m_front, &QStencilOperationArguments::depthTestFailureOperationChanged, resend);
+ (void) connect(d->m_front, &QStencilOperationArguments::stencilTestFailureOperationChanged, resend);
+ (void) connect(d->m_front, &QStencilOperationArguments::faceModeChanged, resend);
+
+ (void) connect(d->m_back, &QStencilOperationArguments::allTestsPassOperationChanged, resend);
+ (void) connect(d->m_back, &QStencilOperationArguments::depthTestFailureOperationChanged, resend);
+ (void) connect(d->m_back, &QStencilOperationArguments::stencilTestFailureOperationChanged, resend);
+ (void) connect(d->m_back, &QStencilOperationArguments::faceModeChanged, resend);
}
/*! \internal */
@@ -110,6 +124,30 @@ QStencilOperation::~QStencilOperation()
{
}
+/*! \internal */
+void QStencilOperationPrivate::resendArguments()
+{
+ auto e = Qt3DCore::QPropertyUpdatedChangePtr::create(m_id);
+ QStencilOperationData data;
+ fillData(data);
+ e->setPropertyName("arguments");
+ e->setValue(QVariant::fromValue(data));
+ notifyObservers(e);
+}
+
+/*! \internal */
+void QStencilOperationPrivate::fillData(QStencilOperationData &data) const
+{
+ data.front.face = m_front->faceMode();
+ data.front.stencilTestFailureOperation = m_front->stencilTestFailureOperation();
+ data.front.depthTestFailureOperation = m_front->depthTestFailureOperation();
+ data.front.allTestsPassOperation = m_front->allTestsPassOperation();
+ data.back.face = m_back->faceMode();
+ data.back.stencilTestFailureOperation = m_back->stencilTestFailureOperation();
+ data.back.depthTestFailureOperation = m_back->depthTestFailureOperation();
+ data.back.allTestsPassOperation = m_back->allTestsPassOperation();
+}
+
QStencilOperationArguments *QStencilOperation::front() const
{
Q_D(const QStencilOperation);
@@ -125,16 +163,7 @@ QStencilOperationArguments *QStencilOperation::back() const
Qt3DCore::QNodeCreatedChangeBasePtr QStencilOperation::createNodeCreationChange() const
{
auto creationChange = QRenderStateCreatedChangePtr<QStencilOperationData>::create(this);
- auto &data = creationChange->data;
- Q_D(const QStencilOperation);
- data.front.face = d->m_front->faceMode();
- data.front.stencilTestFailureOperation = d->m_front->stencilTestFailureOperation();
- data.front.depthTestFailureOperation = d->m_front->depthTestFailureOperation();
- data.front.allTestsPassOperation = d->m_front->allTestsPassOperation();
- data.back.face = d->m_back->faceMode();
- data.back.stencilTestFailureOperation = d->m_back->stencilTestFailureOperation();
- data.back.depthTestFailureOperation = d->m_back->depthTestFailureOperation();
- data.back.allTestsPassOperation = d->m_back->allTestsPassOperation();
+ d_func()->fillData(creationChange->data);
return creationChange;
}
diff --git a/src/render/renderstates/qstenciloperation_p.h b/src/render/renderstates/qstenciloperation_p.h
index 3273ada23..dbce734b1 100644
--- a/src/render/renderstates/qstenciloperation_p.h
+++ b/src/render/renderstates/qstenciloperation_p.h
@@ -58,6 +58,12 @@ QT_BEGIN_NAMESPACE
namespace Qt3DRender {
+struct QStencilOperationData
+{
+ QStencilOperationArgumentsData front;
+ QStencilOperationArgumentsData back;
+};
+
class QT3DRENDERSHARED_PRIVATE_EXPORT QStencilOperationPrivate : public QRenderStatePrivate
{
public:
@@ -69,16 +75,15 @@ public:
QStencilOperationArguments *m_front;
QStencilOperationArguments *m_back;
-};
-struct QStencilOperationData
-{
- QStencilOperationArgumentsData front;
- QStencilOperationArgumentsData back;
+ void resendArguments();
+ void fillData(QStencilOperationData &data) const;
};
} // namespace Qt3DRender
QT_END_NAMESPACE
+Q_DECLARE_METATYPE(Qt3DRender::QStencilOperationData)
+
#endif // QT3DRENDER_QSTENCILOPERATION_P_H
diff --git a/src/render/renderstates/qstenciltest.cpp b/src/render/renderstates/qstenciltest.cpp
index f1e42f1e3..74acfe3bc 100644
--- a/src/render/renderstates/qstenciltest.cpp
+++ b/src/render/renderstates/qstenciltest.cpp
@@ -41,6 +41,7 @@
#include "qstenciltest.h"
#include "qstenciltest_p.h"
#include "qstenciltestarguments.h"
+#include <Qt3DCore/qpropertyupdatedchange.h>
#include <Qt3DRender/private/qrenderstatecreatedchange_p.h>
QT_BEGIN_NAMESPACE
@@ -106,6 +107,19 @@ namespace Qt3DRender {
QStencilTest::QStencilTest(QNode *parent)
: QRenderState(*new QStencilTestPrivate, parent)
{
+ Q_D(QStencilTest);
+
+ const auto resend = [d]() { d->resendArguments(); };
+
+ (void) connect(d->m_front, &QStencilTestArguments::comparisonMaskChanged, resend);
+ (void) connect(d->m_front, &QStencilTestArguments::faceModeChanged, resend);
+ (void) connect(d->m_front, &QStencilTestArguments::referenceValueChanged, resend);
+ (void) connect(d->m_front, &QStencilTestArguments::stencilFunctionChanged, resend);
+
+ (void) connect(d->m_back, &QStencilTestArguments::comparisonMaskChanged, resend);
+ (void) connect(d->m_back, &QStencilTestArguments::faceModeChanged, resend);
+ (void) connect(d->m_back, &QStencilTestArguments::referenceValueChanged, resend);
+ (void) connect(d->m_back, &QStencilTestArguments::stencilFunctionChanged, resend);
}
/*! \internal */
@@ -113,6 +127,30 @@ QStencilTest::~QStencilTest()
{
}
+/*! \internal */
+void QStencilTestPrivate::resendArguments()
+{
+ auto e = Qt3DCore::QPropertyUpdatedChangePtr::create(m_id);
+ QStencilTestData data;
+ fillData(data);
+ e->setPropertyName("arguments");
+ e->setValue(QVariant::fromValue(data));
+ notifyObservers(e);
+}
+
+/*! \internal */
+void QStencilTestPrivate::fillData(QStencilTestData &data) const
+{
+ data.front.face = m_front->faceMode();
+ data.front.comparisonMask = m_front->comparisonMask();
+ data.front.referenceValue = m_front->referenceValue();
+ data.front.stencilFunction = m_front->stencilFunction();
+ data.back.face = m_back->faceMode();
+ data.back.comparisonMask = m_back->comparisonMask();
+ data.back.referenceValue = m_back->referenceValue();
+ data.back.stencilFunction = m_back->stencilFunction();
+}
+
QStencilTestArguments *QStencilTest::front() const
{
Q_D(const QStencilTest);
@@ -128,16 +166,7 @@ QStencilTestArguments *QStencilTest::back() const
Qt3DCore::QNodeCreatedChangeBasePtr QStencilTest::createNodeCreationChange() const
{
auto creationChange = QRenderStateCreatedChangePtr<QStencilTestData>::create(this);
- auto &data = creationChange->data;
- Q_D(const QStencilTest);
- data.front.face = d->m_front->faceMode();
- data.front.comparisonMask = d->m_front->comparisonMask();
- data.front.referenceValue = d->m_front->referenceValue();
- data.front.stencilFunction = d->m_front->stencilFunction();
- data.back.face = d->m_back->faceMode();
- data.back.comparisonMask = d->m_back->comparisonMask();
- data.back.referenceValue = d->m_back->referenceValue();
- data.back.stencilFunction = d->m_back->stencilFunction();
+ d_func()->fillData(creationChange->data);
return creationChange;
}
diff --git a/src/render/renderstates/qstenciltest_p.h b/src/render/renderstates/qstenciltest_p.h
index fc17cfde8..838ba5bc0 100644
--- a/src/render/renderstates/qstenciltest_p.h
+++ b/src/render/renderstates/qstenciltest_p.h
@@ -58,6 +58,12 @@ QT_BEGIN_NAMESPACE
namespace Qt3DRender {
+struct QStencilTestData
+{
+ QStencilTestArgumentsData front;
+ QStencilTestArgumentsData back;
+};
+
class QT3DRENDERSHARED_PRIVATE_EXPORT QStencilTestPrivate : public QRenderStatePrivate
{
public:
@@ -71,16 +77,15 @@ public:
Q_DECLARE_PUBLIC(QStencilTest)
QStencilTestArguments *m_front;
QStencilTestArguments *m_back;
-};
-struct QStencilTestData
-{
- QStencilTestArgumentsData front;
- QStencilTestArgumentsData back;
+ void resendArguments();
+ void fillData(QStencilTestData &data) const;
};
} // namespace Qt3DRender
QT_END_NAMESPACE
+Q_DECLARE_METATYPE(Qt3DRender::QStencilTestData)
+
#endif // QT3DRENDER_QSTENCILTEST_P_H
diff --git a/src/render/renderstates/renderstates.cpp b/src/render/renderstates/renderstates.cpp
index d94191a13..d5e12aeab 100644
--- a/src/render/renderstates/renderstates.cpp
+++ b/src/render/renderstates/renderstates.cpp
@@ -43,8 +43,11 @@
#include <Qt3DCore/qpropertyupdatedchange.h>
#include <Qt3DRender/qrenderstate.h>
#include <Qt3DRender/qcullface.h>
+#include <Qt3DRender/qpointsize.h>
#include <Qt3DRender/private/graphicscontext_p.h>
+#include <Qt3DRender/private/qstenciloperation_p.h>
+#include <Qt3DRender/private/qstenciltest_p.h>
QT_BEGIN_NAMESPACE
@@ -102,7 +105,7 @@ void BlendEquation::apply(GraphicsContext *gc) const
void BlendEquation::updateProperty(const char *name, const QVariant &value)
{
- if (name == QByteArrayLiteral("mode")) std::get<0>(m_values) = value.toInt();
+ if (name == QByteArrayLiteral("blendFunction")) std::get<0>(m_values) = value.toInt();
}
void AlphaFunc::apply(GraphicsContext* gc) const
@@ -110,6 +113,14 @@ void AlphaFunc::apply(GraphicsContext* gc) const
gc->alphaTest(std::get<0>(m_values), std::get<1>(m_values));
}
+void AlphaFunc::updateProperty(const char *name, const QVariant &value)
+{
+ if (name == QByteArrayLiteral("alphaFunction"))
+ std::get<0>(m_values) = value.toInt();
+ if (name == QByteArrayLiteral("referenceValue"))
+ std::get<1>(m_values) = value.toFloat();
+}
+
void MSAAEnabled::apply(GraphicsContext *gc) const
{
gc->setMSAAEnabled(std::get<0>(m_values));
@@ -128,7 +139,7 @@ void DepthTest::apply(GraphicsContext *gc) const
void DepthTest::updateProperty(const char *name, const QVariant &value)
{
- if (name == QByteArrayLiteral("func")) std::get<0>(m_values) = value.toInt();
+ if (name == QByteArrayLiteral("depthFunction")) std::get<0>(m_values) = value.toInt();
}
void CullFace::apply(GraphicsContext *gc) const
@@ -192,6 +203,19 @@ void StencilTest::apply(GraphicsContext *gc) const
gc->openGLContext()->functions()->glStencilFuncSeparate(GL_BACK, std::get<3>(m_values), std::get<4>(m_values), std::get<5>(m_values));
}
+void StencilTest::updateProperty(const char *name, const QVariant &value)
+{
+ if (name == QByteArrayLiteral("arguments")) {
+ const QStencilTestData data = value.value<QStencilTestData>();
+ std::get<0>(m_values) = data.front.stencilFunction;
+ std::get<1>(m_values) = data.front.referenceValue;
+ std::get<2>(m_values) = data.front.comparisonMask;
+ std::get<3>(m_values) = data.back.stencilFunction;
+ std::get<4>(m_values) = data.back.referenceValue;
+ std::get<5>(m_values) = data.back.comparisonMask;
+ }
+}
+
void AlphaCoverage::apply(GraphicsContext *gc) const
{
gc->setAlphaCoverageEnabled(true);
@@ -204,7 +228,7 @@ void PointSize::apply(GraphicsContext *gc) const
void PointSize::updateProperty(const char *name, const QVariant &value)
{
- if (name == QByteArrayLiteral("specification")) std::get<0>(m_values) = value.toBool();
+ if (name == QByteArrayLiteral("sizeMode")) std::get<0>(m_values) = (value.toInt() == QPointSize::Programmable);
else if (name == QByteArrayLiteral("value")) std::get<1>(m_values) = value.toFloat();
}
@@ -216,8 +240,8 @@ void PolygonOffset::apply(GraphicsContext *gc) const
void PolygonOffset::updateProperty(const char *name, const QVariant &value)
{
- if (name == QByteArrayLiteral("factor")) std::get<0>(m_values) = value.toFloat();
- else if (name == QByteArrayLiteral("units")) std::get<1>(m_values) = value.toFloat();
+ if (name == QByteArrayLiteral("scaleFactor")) std::get<0>(m_values) = value.toFloat();
+ else if (name == QByteArrayLiteral("depthSteps")) std::get<1>(m_values) = value.toFloat();
}
void ColorMask::apply(GraphicsContext *gc) const
@@ -227,10 +251,10 @@ void ColorMask::apply(GraphicsContext *gc) const
void ColorMask::updateProperty(const char *name, const QVariant &value)
{
- if (name == QByteArrayLiteral("red")) std::get<0>(m_values) = value.toBool();
- else if (name == QByteArrayLiteral("green")) std::get<1>(m_values) = value.toBool();
- else if (name == QByteArrayLiteral("blue")) std::get<2>(m_values) = value.toBool();
- else if (name == QByteArrayLiteral("alpha")) std::get<3>(m_values) = value.toBool();
+ if (name == QByteArrayLiteral("redMasked")) std::get<0>(m_values) = value.toBool();
+ else if (name == QByteArrayLiteral("greenMasked")) std::get<1>(m_values) = value.toBool();
+ else if (name == QByteArrayLiteral("blueMasked")) std::get<2>(m_values) = value.toBool();
+ else if (name == QByteArrayLiteral("alphaMasked")) std::get<3>(m_values) = value.toBool();
}
void ClipPlane::apply(GraphicsContext *gc) const
@@ -257,6 +281,19 @@ void StencilOp::apply(GraphicsContext *gc) const
gc->openGLContext()->functions()->glStencilOpSeparate(GL_BACK, std::get<3>(m_values), std::get<4>(m_values), std::get<5>(m_values));
}
+void StencilOp::updateProperty(const char *name, const QVariant &value)
+{
+ if (name == QByteArrayLiteral("arguments")) {
+ const QStencilOperationData data = value.value<QStencilOperationData>();
+ std::get<0>(m_values) = data.front.stencilTestFailureOperation;
+ std::get<1>(m_values) = data.front.depthTestFailureOperation;
+ std::get<2>(m_values) = data.front.allTestsPassOperation;
+ std::get<3>(m_values) = data.back.stencilTestFailureOperation;
+ std::get<4>(m_values) = data.back.depthTestFailureOperation;
+ std::get<5>(m_values) = data.back.allTestsPassOperation;
+ }
+}
+
void StencilMask::apply(GraphicsContext *gc) const
{
gc->openGLContext()->functions()->glStencilMaskSeparate(GL_FRONT, std::get<0>(m_values));
@@ -265,8 +302,8 @@ void StencilMask::apply(GraphicsContext *gc) const
void StencilMask::updateProperty(const char *name, const QVariant &value)
{
- if (name == QByteArrayLiteral("frontMask")) std::get<0>(m_values) = value.toInt();
- else if (name == QByteArrayLiteral("backMask")) std::get<1>(m_values) = value.toInt();
+ if (name == QByteArrayLiteral("frontOutputMask")) std::get<0>(m_values) = value.toInt();
+ else if (name == QByteArrayLiteral("backOutputMask")) std::get<1>(m_values) = value.toInt();
}
#ifndef GL_LINE_SMOOTH
diff --git a/src/render/renderstates/renderstates_p.h b/src/render/renderstates/renderstates_p.h
index b503067a9..2b1af1c4c 100644
--- a/src/render/renderstates/renderstates_p.h
+++ b/src/render/renderstates/renderstates_p.h
@@ -78,6 +78,7 @@ class Q_AUTOTEST_EXPORT AlphaFunc : public GenericState<AlphaFunc, AlphaTestMask
{
public:
void apply(GraphicsContext *gc) const Q_DECL_OVERRIDE;
+ void updateProperty(const char *name, const QVariant &value) Q_DECL_OVERRIDE;
};
class Q_AUTOTEST_EXPORT MSAAEnabled : public GenericState<MSAAEnabled, MSAAEnabledStateMask, GLboolean>
@@ -132,6 +133,7 @@ class Q_AUTOTEST_EXPORT StencilTest : public GenericState<StencilTest, StencilTe
{
public:
void apply(GraphicsContext *gc) const Q_DECL_OVERRIDE;
+ void updateProperty(const char *name, const QVariant &value) Q_DECL_OVERRIDE;
};
class Q_AUTOTEST_EXPORT AlphaCoverage : public GenericState<AlphaCoverage, AlphaCoverageStateMask>
@@ -178,6 +180,7 @@ class Q_AUTOTEST_EXPORT StencilOp : public GenericState<StencilOp, StencilOpMask
{
public:
void apply(GraphicsContext *gc) const Q_DECL_FINAL;
+ void updateProperty(const char *name, const QVariant &value) Q_DECL_OVERRIDE;
};
class Q_AUTOTEST_EXPORT StencilMask : public GenericState<StencilMask, StencilWriteStateMask, uint, uint>
diff --git a/src/render/renderstates/statevariant_p.h b/src/render/renderstates/statevariant_p.h
index 55ec23899..393e4156c 100644
--- a/src/render/renderstates/statevariant_p.h
+++ b/src/render/renderstates/statevariant_p.h
@@ -58,7 +58,7 @@ QT_BEGIN_NAMESPACE
namespace Qt3DRender {
namespace Render {
-struct StateVariant
+struct Q_AUTOTEST_EXPORT StateVariant
{
StateMask type;