diff options
author | Sean Harmer <sean.harmer@kdab.com> | 2017-08-19 15:53:30 +0100 |
---|---|---|
committer | Sean Harmer <sean.harmer@kdab.com> | 2017-08-19 16:28:52 +0100 |
commit | 8f863343a9e2e2f3630f22407f4e5e30e72745cf (patch) | |
tree | 5574e3c2215d74345e15df5f45ed3211e065541a /src/render/renderstates | |
parent | 3edb85002b848033bbeefa33001d19fb514ef489 (diff) | |
parent | 9d8c9ada161ad97634992c444196add0abb4f9d1 (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.h | 2 | ||||
-rw-r--r-- | src/render/renderstates/qstenciloperation.cpp | 49 | ||||
-rw-r--r-- | src/render/renderstates/qstenciloperation_p.h | 15 | ||||
-rw-r--r-- | src/render/renderstates/qstenciltest.cpp | 49 | ||||
-rw-r--r-- | src/render/renderstates/qstenciltest_p.h | 15 | ||||
-rw-r--r-- | src/render/renderstates/renderstates.cpp | 59 | ||||
-rw-r--r-- | src/render/renderstates/renderstates_p.h | 3 | ||||
-rw-r--r-- | src/render/renderstates/statevariant_p.h | 2 |
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; |