diff options
author | Sean Harmer <sean.harmer@kdab.com> | 2016-04-07 18:37:28 +0100 |
---|---|---|
committer | Sean Harmer <sean.harmer@kdab.com> | 2016-04-11 08:00:10 +0000 |
commit | fe154ade6d0329e4972f1d6af95720cf2dd7c01a (patch) | |
tree | 19a56fac9d85725bb0809f19b2d439925ee9bcd8 /src | |
parent | f9ddd0a0a8f590f16ac9d9122bddd2a33c72b14c (diff) |
RenderStateNode handles creation
Also remove last vestiges of blend state separate.
Change-Id: I75d3a97ae8383b5ad1bcdb903ed745cbcda31eec
Reviewed-by: Paul Lemire <paul.lemire@kdab.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/render/renderstates/genericstate_p.h | 2 | ||||
-rw-r--r-- | src/render/renderstates/qrenderstate_p.h | 1 | ||||
-rw-r--r-- | src/render/renderstates/renderstatenode.cpp | 8 | ||||
-rw-r--r-- | src/render/renderstates/renderstatenode_p.h | 3 | ||||
-rw-r--r-- | src/render/renderstates/renderstateset.cpp | 155 |
5 files changed, 157 insertions, 12 deletions
diff --git a/src/render/renderstates/genericstate_p.h b/src/render/renderstates/genericstate_p.h index 547e51ccb..3967e0913 100644 --- a/src/render/renderstates/genericstate_p.h +++ b/src/render/renderstates/genericstate_p.h @@ -53,6 +53,7 @@ // #include <Qt3DRender/private/backendnode_p.h> +#include <Qt3DRender/private/qrenderstatecreatedchange_p.h> #include <Qt3DCore/private/qresourcemanager_p.h> #include <QList> #include <QVector3D> @@ -120,6 +121,7 @@ public: virtual RenderStateImpl *getOrCreateWithPropertyChange(const char *name, const QVariant &value) const = 0; static RenderStateImpl *getOrCreateState(QRenderState *renderState); + static RenderStateImpl *getOrCreateState(const Qt3DRender::QRenderStateCreatedChangeBasePtr change); virtual void updateProperty(const char *name, const QVariant &value); }; diff --git a/src/render/renderstates/qrenderstate_p.h b/src/render/renderstates/qrenderstate_p.h index 26ff0af65..ee0acd5ca 100644 --- a/src/render/renderstates/qrenderstate_p.h +++ b/src/render/renderstates/qrenderstate_p.h @@ -68,7 +68,6 @@ public: AlphaTest, BlendEquation, BlendEquationArguments, - BlendStateSeparate, ColorMask, CullFace, NoDepthMask, diff --git a/src/render/renderstates/renderstatenode.cpp b/src/render/renderstates/renderstatenode.cpp index b04e723c5..403db94f4 100644 --- a/src/render/renderstates/renderstatenode.cpp +++ b/src/render/renderstates/renderstatenode.cpp @@ -36,6 +36,7 @@ #include "renderstatenode_p.h" #include <Qt3DRender/qrenderstate.h> +#include <Qt3DRender/private/qrenderstatecreatedchange_p.h> #include <Qt3DCore/qscenepropertychange.h> QT_BEGIN_NAMESPACE @@ -71,6 +72,13 @@ void RenderStateNode::updateFromPeer(Qt3DCore::QNode *peer) m_impl = RenderStateImpl::getOrCreateState(renderState); } +void RenderStateNode::initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &change) +{ + cleanup(); + const auto renderStateChange = qSharedPointerCast<Qt3DRender::QRenderStateCreatedChangeBase>(change); + m_impl = RenderStateImpl::getOrCreateState(renderStateChange); +} + void RenderStateNode::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) { if (e->type() == Qt3DCore::NodeUpdated) { diff --git a/src/render/renderstates/renderstatenode_p.h b/src/render/renderstates/renderstatenode_p.h index c9711bc15..cc6a101d5 100644 --- a/src/render/renderstates/renderstatenode_p.h +++ b/src/render/renderstates/renderstatenode_p.h @@ -72,6 +72,9 @@ public: protected: void cleanup(); +private: + void initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &change) Q_DECL_FINAL; + RenderStateImpl *m_impl; }; diff --git a/src/render/renderstates/renderstateset.cpp b/src/render/renderstates/renderstateset.cpp index 601a5a7a3..187017ddb 100644 --- a/src/render/renderstates/renderstateset.cpp +++ b/src/render/renderstates/renderstateset.cpp @@ -51,24 +51,40 @@ #include <Qt3DRender/qalphacoverage.h> #include <Qt3DRender/qalphatest.h> +#include <Qt3DRender/private/qalphatest_p.h> #include <Qt3DRender/qblendequation.h> +#include <Qt3DRender/private/qblendequation_p.h> #include <Qt3DRender/qblendequationarguments.h> +#include <Qt3DRender/private/qblendequationarguments_p.h> #include <Qt3DRender/qcolormask.h> +#include <Qt3DRender/private/qcolormask_p.h> #include <Qt3DRender/qcullface.h> +#include <Qt3DRender/private/qcullface_p.h> #include <Qt3DRender/qnodepthmask.h> #include <Qt3DRender/qdepthtest.h> +#include <Qt3DRender/private/qdepthtest_p.h> #include <Qt3DRender/qdithering.h> #include <Qt3DRender/qfrontface.h> +#include <Qt3DRender/private/qfrontface_p.h> #include <Qt3DRender/qpointsize.h> +#include <Qt3DRender/private/qpointsize_p.h> #include <Qt3DRender/qpolygonoffset.h> +#include <Qt3DRender/private/qpolygonoffset_p.h> #include <Qt3DRender/qscissortest.h> +#include <Qt3DRender/private/qscissortest_p.h> #include <Qt3DRender/qstenciltest.h> +#include <Qt3DRender/private/qstenciltest_p.h> #include <Qt3DRender/qstenciltestarguments.h> +#include <Qt3DRender/private/qstenciltestarguments_p.h> #include <Qt3DRender/qclipplane.h> +#include <Qt3DRender/private/qclipplane_p.h> #include <Qt3DRender/qseamlesscubemap.h> #include <Qt3DRender/qstenciloperation.h> +#include <Qt3DRender/private/qstenciloperation_p.h> #include <Qt3DRender/qstenciloperationarguments.h> +#include <Qt3DRender/private/qstenciloperationarguments_p.h> #include <Qt3DRender/qstencilmask.h> +#include <Qt3DRender/private/qstencilmask_p.h> QT_BEGIN_NAMESPACE @@ -271,18 +287,10 @@ RenderStateImpl* RenderStateImpl::getOrCreateState(QRenderState *renderState) } case QRenderStatePrivate::BlendEquationArguments: { QBlendEquationArguments *blendState = static_cast<QBlendEquationArguments *>(renderState); - // just use the same values for RGB and Alpha return getOrCreateRenderStateImpl<BlendEquationArguments>(blendState->sourceRgb(), blendState->destinationRgb(), - blendState->sourceRgb(), blendState->destinationRgb(), - blendState->isEnabled(), - blendState->bufferIndex()); - } - case QRenderStatePrivate::BlendStateSeparate: { - QBlendEquationArguments *blendState = static_cast<QBlendEquationArguments *>(renderState); - return getOrCreateRenderStateImpl<BlendEquationArguments>(blendState->sourceRgb(), blendState->destinationRgb(), - blendState->sourceAlpha(), blendState->destinationAlpha(), - blendState->isEnabled(), - blendState->bufferIndex()); + blendState->sourceAlpha(), blendState->destinationAlpha(), + blendState->isEnabled(), + blendState->bufferIndex()); } case QRenderStatePrivate::CullFace: { QCullFace *cullFace = static_cast<QCullFace *>(renderState); @@ -363,6 +371,131 @@ RenderStateImpl* RenderStateImpl::getOrCreateState(QRenderState *renderState) } } +RenderStateImpl* RenderStateImpl::getOrCreateState(const Qt3DRender::QRenderStateCreatedChangeBasePtr change) +{ + switch (change->type()) { + case QRenderStatePrivate::AlphaTest: { + const auto typedChange = qSharedPointerCast<Qt3DRender::QRenderStateCreatedChange<QAlphaTestData>>(change); + const auto &data = typedChange->data; + return getOrCreateRenderStateImpl<AlphaFunc>(data.alphaFunction, data.referenceValue); + } + + case QRenderStatePrivate::BlendEquation: { + const auto typedChange = qSharedPointerCast<Qt3DRender::QRenderStateCreatedChange<QBlendEquationData>>(change); + const auto &data = typedChange->data; + return getOrCreateRenderStateImpl<BlendEquation>(data.blendFunction); + } + + case QRenderStatePrivate::BlendEquationArguments: { + const auto typedChange = qSharedPointerCast<Qt3DRender::QRenderStateCreatedChange<QBlendEquationArgumentsData>>(change); + const auto &data = typedChange->data; + return getOrCreateRenderStateImpl<BlendEquationArguments>( + data.sourceRgb, data.destinationRgb, + data.sourceAlpha, data.destinationAlpha, + change->isNodeEnabled(), + data.bufferIndex); + } + + case QRenderStatePrivate::CullFace: { + const auto typedChange = qSharedPointerCast<Qt3DRender::QRenderStateCreatedChange<QCullFaceData>>(change); + const auto &data = typedChange->data; + return getOrCreateRenderStateImpl<CullFace>(data.mode); + } + + case QRenderStatePrivate::NoDepthMask: { + return getOrCreateRenderStateImpl<NoDepthMask>(false); + } + + case QRenderStatePrivate::DepthTest: { + const auto typedChange = qSharedPointerCast<Qt3DRender::QRenderStateCreatedChange<QDepthTestData>>(change); + const auto &data = typedChange->data; + return getOrCreateRenderStateImpl<DepthTest>(data.depthFunction); + } + + // TODO: Fix AlphaCoverage and Dithering states + case QRenderStatePrivate::AlphaCoverage: + case QRenderStatePrivate::Dithering: + case QRenderStatePrivate::FrontFace: { + const auto typedChange = qSharedPointerCast<Qt3DRender::QRenderStateCreatedChange<QFrontFaceData>>(change); + const auto &data = typedChange->data; + return getOrCreateRenderStateImpl<FrontFace>(data.direction); + } + + case QRenderStatePrivate::ScissorTest: { + const auto typedChange = qSharedPointerCast<Qt3DRender::QRenderStateCreatedChange<QScissorTestData>>(change); + const auto &data = typedChange->data; + return getOrCreateRenderStateImpl<ScissorTest>(data.left, data.bottom, + data.width, data.height); + } + + case QRenderStatePrivate::StencilTest: { + const auto typedChange = qSharedPointerCast<Qt3DRender::QRenderStateCreatedChange<QStencilTestData>>(change); + const auto &data = typedChange->data; + return getOrCreateRenderStateImpl<StencilTest>(data.front.stencilFunction, + data.front.referenceValue, + data.front.comparisonMask, + data.back.stencilFunction, + data.back.referenceValue, + data.back.comparisonMask); + } + + case QRenderStatePrivate::PointSize: { + const auto typedChange = qSharedPointerCast<Qt3DRender::QRenderStateCreatedChange<QPointSizeData>>(change); + const auto &data = typedChange->data; + const bool isProgrammable = (data.sizeMode == QPointSize::Programmable); + return getOrCreateRenderStateImpl<PointSize>(isProgrammable, data.value); + } + + case QRenderStatePrivate::PolygonOffset: { + const auto typedChange = qSharedPointerCast<Qt3DRender::QRenderStateCreatedChange<QPolygonOffsetData>>(change); + const auto &data = typedChange->data; + return getOrCreateRenderStateImpl<PolygonOffset>(data.scaleFactor, data.depthSteps); + } + + case QRenderStatePrivate::ColorMask: { + const auto typedChange = qSharedPointerCast<Qt3DRender::QRenderStateCreatedChange<QColorMaskData>>(change); + const auto &data = typedChange->data; + return getOrCreateRenderStateImpl<ColorMask>(data.redMasked, data.greenMasked, + data.blueMasked, data.alphaMasked); + } + + case QRenderStatePrivate::ClipPlane: { + const auto typedChange = qSharedPointerCast<Qt3DRender::QRenderStateCreatedChange<QClipPlaneData>>(change); + const auto &data = typedChange->data; + return getOrCreateRenderStateImpl<ClipPlane>(data.planeIndex, + data.normal, + data.distance); + } + + case QRenderStatePrivate::SeamlessCubemap: { + return getOrCreateRenderStateImpl<SeamlessCubemap>(change->isNodeEnabled()); + } + + case QRenderStatePrivate::StencilOp: { + const auto typedChange = qSharedPointerCast<Qt3DRender::QRenderStateCreatedChange<QStencilOperationData>>(change); + const auto &data = typedChange->data; + return getOrCreateRenderStateImpl<StencilOp>(data.front.stencilTestFailureOperation, + data.front.depthTestFailureOperation, + data.front.allTestsPassOperation, + data.back.stencilTestFailureOperation, + data.back.depthTestFailureOperation, + data.back.allTestsPassOperation); + } + + case QRenderStatePrivate::StencilMask: { + const auto typedChange = qSharedPointerCast<Qt3DRender::QRenderStateCreatedChange<QStencilMaskData>>(change); + const auto &data = typedChange->data; + return getOrCreateRenderStateImpl<StencilMask>(data.frontOutputMask, + data.backOutputMask); + } + + default: + Q_UNREACHABLE(); + qFatal("Should not happen"); + return Q_NULLPTR; + } +} + } // namespace Render } // namespace Qt3DRender |