diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2019-09-18 17:18:53 +0200 |
---|---|---|
committer | Paul Lemire <paul.lemire@kdab.com> | 2019-09-25 11:41:26 +0200 |
commit | e498e2fc16a09cab315ffaf88eea1679fe2a436d (patch) | |
tree | f3b32757e28207bcac954cd76e34e661e0ad4ceb /src/render/renderstates | |
parent | 6ead5cfc2c7c971a4698e1ebf6b1973b1d8e2a78 (diff) |
Update QRenderState to use direct sync
Change-Id: Id38fd035701c86d126851fbde245ebba93e26f34
Reviewed-by: Mike Krus <mike.krus@kdab.com>
Diffstat (limited to 'src/render/renderstates')
-rw-r--r-- | src/render/renderstates/genericstate_p.h | 2 | ||||
-rw-r--r-- | src/render/renderstates/qstenciloperation.cpp | 13 | ||||
-rw-r--r-- | src/render/renderstates/qstenciloperation_p.h | 1 | ||||
-rw-r--r-- | src/render/renderstates/qstenciltest.cpp | 13 | ||||
-rw-r--r-- | src/render/renderstates/qstenciltest_p.h | 1 | ||||
-rw-r--r-- | src/render/renderstates/renderstatenode.cpp | 156 | ||||
-rw-r--r-- | src/render/renderstates/renderstatenode_p.h | 4 | ||||
-rw-r--r-- | src/render/renderstates/renderstates.cpp | 193 | ||||
-rw-r--r-- | src/render/renderstates/renderstates_p.h | 38 |
9 files changed, 203 insertions, 218 deletions
diff --git a/src/render/renderstates/genericstate_p.h b/src/render/renderstates/genericstate_p.h index b07487d65..e3ece36f5 100644 --- a/src/render/renderstates/genericstate_p.h +++ b/src/render/renderstates/genericstate_p.h @@ -80,7 +80,7 @@ public: virtual StateMask mask() const = 0; virtual bool equalTo(const RenderStateImpl &renderState) const = 0; - virtual void updateProperty(const char *name, const QVariant &value); + virtual void updateProperties(const QRenderState *); }; template <class StateSetImpl, StateMask stateMask, typename ... T> diff --git a/src/render/renderstates/qstenciloperation.cpp b/src/render/renderstates/qstenciloperation.cpp index af7e014f5..86b4c706b 100644 --- a/src/render/renderstates/qstenciloperation.cpp +++ b/src/render/renderstates/qstenciloperation.cpp @@ -106,7 +106,7 @@ QStencilOperation::QStencilOperation(QNode *parent) { Q_D(QStencilOperation); - const auto resend = [d]() { d->resendArguments(); }; + const auto resend = [d]() { d->update(); }; (void) connect(d->m_front, &QStencilOperationArguments::allTestsPassOperationChanged, resend); (void) connect(d->m_front, &QStencilOperationArguments::depthTestFailureOperationChanged, resend); @@ -125,17 +125,6 @@ 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(); diff --git a/src/render/renderstates/qstenciloperation_p.h b/src/render/renderstates/qstenciloperation_p.h index a1c0cda4a..d38abf0d7 100644 --- a/src/render/renderstates/qstenciloperation_p.h +++ b/src/render/renderstates/qstenciloperation_p.h @@ -76,7 +76,6 @@ public: QStencilOperationArguments *m_front; QStencilOperationArguments *m_back; - void resendArguments(); void fillData(QStencilOperationData &data) const; }; diff --git a/src/render/renderstates/qstenciltest.cpp b/src/render/renderstates/qstenciltest.cpp index a364c3b88..8f6738e54 100644 --- a/src/render/renderstates/qstenciltest.cpp +++ b/src/render/renderstates/qstenciltest.cpp @@ -109,7 +109,7 @@ QStencilTest::QStencilTest(QNode *parent) { Q_D(QStencilTest); - const auto resend = [d]() { d->resendArguments(); }; + const auto resend = [d]() { d->update(); }; (void) connect(d->m_front, &QStencilTestArguments::comparisonMaskChanged, resend); (void) connect(d->m_front, &QStencilTestArguments::faceModeChanged, resend); @@ -128,17 +128,6 @@ 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(); diff --git a/src/render/renderstates/qstenciltest_p.h b/src/render/renderstates/qstenciltest_p.h index 328e34878..9ddfc6e33 100644 --- a/src/render/renderstates/qstenciltest_p.h +++ b/src/render/renderstates/qstenciltest_p.h @@ -78,7 +78,6 @@ public: QStencilTestArguments *m_front; QStencilTestArguments *m_back; - void resendArguments(); void fillData(QStencilTestData &data) const; }; diff --git a/src/render/renderstates/renderstatenode.cpp b/src/render/renderstates/renderstatenode.cpp index f83640154..bd218c803 100644 --- a/src/render/renderstates/renderstatenode.cpp +++ b/src/render/renderstates/renderstatenode.cpp @@ -90,118 +90,105 @@ namespace Render { namespace { -StateVariant createStateImplementation(const Qt3DRender::QRenderStateCreatedChangeBasePtr renderStateChange) +StateVariant createStateImplementation(const QRenderState *node) { - switch (renderStateChange->renderStateType()) { + const QRenderStatePrivate *d = static_cast<const QRenderStatePrivate *>(Qt3DCore::QNodePrivate::get(node)); + switch (d->m_type) { case AlphaCoverageStateMask: { return StateVariant::createState<AlphaCoverage>(); } case AlphaTestMask: { - const auto typedChange = qSharedPointerCast<Qt3DRender::QRenderStateCreatedChange<QAlphaTestData>>(renderStateChange); - const auto &data = typedChange->data; - return StateVariant::createState<AlphaFunc>(data.alphaFunction, data.referenceValue); + const QAlphaTest *alphaTest = static_cast<const QAlphaTest *>(node); + return StateVariant::createState<AlphaFunc>(alphaTest->alphaFunction(), alphaTest->referenceValue()); } case BlendStateMask: { - const auto typedChange = qSharedPointerCast<Qt3DRender::QRenderStateCreatedChange<QBlendEquationData>>(renderStateChange); - const auto &data = typedChange->data; - return StateVariant::createState<BlendEquation>(data.blendFunction); + const QBlendEquation *blendEquation = static_cast<const QBlendEquation *>(node); + return StateVariant::createState<BlendEquation>(blendEquation->blendFunction()); } case BlendEquationArgumentsMask: { - const auto typedChange = qSharedPointerCast<Qt3DRender::QRenderStateCreatedChange<QBlendEquationArgumentsData>>(renderStateChange); - const auto &data = typedChange->data; + const QBlendEquationArguments *blendArgs = static_cast<const QBlendEquationArguments *>(node); return StateVariant::createState<BlendEquationArguments>( - data.sourceRgb, data.destinationRgb, - data.sourceAlpha, data.destinationAlpha, - renderStateChange->isNodeEnabled(), - data.bufferIndex); + blendArgs->sourceRgb(), blendArgs->destinationRgb(), + blendArgs->sourceAlpha(), blendArgs->destinationAlpha(), + blendArgs->isEnabled(), + blendArgs->bufferIndex()); } case MSAAEnabledStateMask: { - return StateVariant::createState<MSAAEnabled>(renderStateChange->isNodeEnabled()); + return StateVariant::createState<MSAAEnabled>(node->isEnabled()); } case CullFaceStateMask: { - const auto typedChange = qSharedPointerCast<Qt3DRender::QRenderStateCreatedChange<QCullFaceData>>(renderStateChange); - const auto &data = typedChange->data; - return StateVariant::createState<CullFace>(data.mode); + const QCullFace *cullFace = static_cast<const QCullFace *>(node); + return StateVariant::createState<CullFace>(cullFace->mode()); } case DepthRangeMask: { - const auto typedChange = qSharedPointerCast<Qt3DRender::QRenderStateCreatedChange<QDepthRangeData>>(renderStateChange); - const auto &data = typedChange->data; - return StateVariant::createState<DepthRange>(data.nearValue, data.farValue); + const QDepthRange *depthRange = static_cast<const QDepthRange *>(node); + return StateVariant::createState<DepthRange>(depthRange->nearValue(), depthRange->farValue()); } case DepthWriteStateMask: { - return StateVariant::createState<NoDepthMask>(false); + return StateVariant::createState<NoDepthMask>(!node->isEnabled()); } case DepthTestStateMask: { - const auto typedChange = qSharedPointerCast<Qt3DRender::QRenderStateCreatedChange<QDepthTestData>>(renderStateChange); - const auto &data = typedChange->data; - return StateVariant::createState<DepthTest>(data.depthFunction); + const QDepthTest *depthTest = static_cast<const QDepthTest *>(node); + return StateVariant::createState<DepthTest>(depthTest->depthFunction()); } case RasterModeMask: { - const auto typedChange = qSharedPointerCast<Qt3DRender::QRenderStateCreatedChange<QRasterModeData>>(renderStateChange); - const auto &data = typedChange->data; - return StateVariant::createState<RasterMode>(data.faceMode, data.rasterMode); + const QRasterMode *rasterMode = static_cast<const QRasterMode *>(node); + return StateVariant::createState<RasterMode>(rasterMode->faceMode(), rasterMode->rasterMode()); } case FrontFaceStateMask: { - const auto typedChange = qSharedPointerCast<Qt3DRender::QRenderStateCreatedChange<QFrontFaceData>>(renderStateChange); - const auto &data = typedChange->data; - return StateVariant::createState<FrontFace>(data.direction); + const QFrontFace *frontFace = static_cast<const QFrontFace *>(node); + return StateVariant::createState<FrontFace>(frontFace->direction()); } case ScissorStateMask: { - const auto typedChange = qSharedPointerCast<Qt3DRender::QRenderStateCreatedChange<QScissorTestData>>(renderStateChange); - const auto &data = typedChange->data; - return StateVariant::createState<ScissorTest>(data.left, data.bottom, - data.width, data.height); + const QScissorTest *scissorTest = static_cast<const QScissorTest *>(node); + return StateVariant::createState<ScissorTest>(scissorTest->left(), scissorTest->bottom(), + scissorTest->width(), scissorTest->height()); } case StencilTestStateMask: { - const auto typedChange = qSharedPointerCast<Qt3DRender::QRenderStateCreatedChange<QStencilTestData>>(renderStateChange); - const auto &data = typedChange->data; - return StateVariant::createState<StencilTest>(data.front.stencilFunction, - data.front.referenceValue, - data.front.comparisonMask, - data.back.stencilFunction, - data.back.referenceValue, - data.back.comparisonMask); + const QStencilTest *stencilTest = static_cast<const QStencilTest *>(node); + return StateVariant::createState<StencilTest>(stencilTest->front()->stencilFunction(), + stencilTest->front()->referenceValue(), + stencilTest->front()->comparisonMask(), + stencilTest->back()->stencilFunction(), + stencilTest->back()->referenceValue(), + stencilTest->back()->comparisonMask()); } case PointSizeMask: { - const auto typedChange = qSharedPointerCast<Qt3DRender::QRenderStateCreatedChange<QPointSizeData>>(renderStateChange); - const auto &data = typedChange->data; - const bool isProgrammable = (data.sizeMode == QPointSize::Programmable); - return StateVariant::createState<PointSize>(isProgrammable, data.value); + const QPointSize *pointSize = static_cast<const QPointSize *>(node); + const bool isProgrammable = (pointSize->sizeMode() == QPointSize::Programmable); + return StateVariant::createState<PointSize>(isProgrammable, pointSize->value()); } case PolygonOffsetStateMask: { - const auto typedChange = qSharedPointerCast<Qt3DRender::QRenderStateCreatedChange<QPolygonOffsetData>>(renderStateChange); - const auto &data = typedChange->data; - return StateVariant::createState<PolygonOffset>(data.scaleFactor, data.depthSteps); + const QPolygonOffset *offset = static_cast<const QPolygonOffset *>(node); + return StateVariant::createState<PolygonOffset>(offset->scaleFactor(), offset->depthSteps()); } case ColorStateMask: { - const auto typedChange = qSharedPointerCast<Qt3DRender::QRenderStateCreatedChange<QColorMaskData>>(renderStateChange); - const auto &data = typedChange->data; - return StateVariant::createState<ColorMask>(data.redMasked, data.greenMasked, - data.blueMasked, data.alphaMasked); + const QColorMask *colorMask = static_cast<const QColorMask *>(node); + return StateVariant::createState<ColorMask>(colorMask->isRedMasked(), colorMask->isGreenMasked(), + colorMask->isBlueMasked(), colorMask->isAlphaMasked()); } case ClipPlaneMask: { - const auto typedChange = qSharedPointerCast<Qt3DRender::QRenderStateCreatedChange<QClipPlaneData>>(renderStateChange); - const auto &data = typedChange->data; - return StateVariant::createState<ClipPlane>(data.planeIndex, - data.normal, - data.distance); + const QClipPlane *clipPlane = static_cast<const QClipPlane *>(node); + return StateVariant::createState<ClipPlane>(clipPlane->planeIndex(), + clipPlane->normal(), + clipPlane->distance()); } case SeamlessCubemapMask: { @@ -209,21 +196,19 @@ StateVariant createStateImplementation(const Qt3DRender::QRenderStateCreatedChan } case StencilOpMask: { - const auto typedChange = qSharedPointerCast<Qt3DRender::QRenderStateCreatedChange<QStencilOperationData>>(renderStateChange); - const auto &data = typedChange->data; - return StateVariant::createState<StencilOp>(data.front.stencilTestFailureOperation, - data.front.depthTestFailureOperation, - data.front.allTestsPassOperation, - data.back.stencilTestFailureOperation, - data.back.depthTestFailureOperation, - data.back.allTestsPassOperation); + const QStencilOperation *stencilOp = static_cast<const QStencilOperation *>(node); + return StateVariant::createState<StencilOp>(stencilOp->front()->stencilTestFailureOperation(), + stencilOp->front()->depthTestFailureOperation(), + stencilOp->front()->allTestsPassOperation(), + stencilOp->back()->stencilTestFailureOperation(), + stencilOp->back()->depthTestFailureOperation(), + stencilOp->back()->allTestsPassOperation()); } case StencilWriteStateMask: { - const auto typedChange = qSharedPointerCast<Qt3DRender::QRenderStateCreatedChange<QStencilMaskData>>(renderStateChange); - const auto &data = typedChange->data; - return StateVariant::createState<StencilMask>(data.frontOutputMask, - data.backOutputMask); + const QStencilMask *stencilMask = static_cast<const QStencilMask *>(node); + return StateVariant::createState<StencilMask>(stencilMask->frontOutputMask(), + stencilMask->backOutputMask()); } case DitheringStateMask: { @@ -231,9 +216,8 @@ StateVariant createStateImplementation(const Qt3DRender::QRenderStateCreatedChan } case LineWidthMask: { - const auto typedChange = qSharedPointerCast<Qt3DRender::QRenderStateCreatedChange<QLineWidthData>>(renderStateChange); - const auto &data = typedChange->data; - return StateVariant::createState<LineWidth>(data.value, data.smooth); + const QLineWidth *lineWidth = static_cast<const QLineWidth *>(node); + return StateVariant::createState<LineWidth>(lineWidth->value(), lineWidth->smooth()); } default: @@ -258,21 +242,19 @@ void RenderStateNode::cleanup() { } -void RenderStateNode::initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &chang3) +void RenderStateNode::syncFromFrontEnd(const Qt3DCore::QNode *frontEnd, bool firstTime) { - cleanup(); - const auto renderStateChange = qSharedPointerCast<Qt3DRender::QRenderStateCreatedChangeBase>(chang3); - m_impl = createStateImplementation(renderStateChange); -} + const QRenderState *node = qobject_cast<const QRenderState *>(frontEnd); + if (!node) + return; -void RenderStateNode::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) -{ - if (e->type() == Qt3DCore::PropertyUpdated) { - Qt3DCore::QPropertyUpdatedChangePtr propertyChange = qSharedPointerCast<Qt3DCore::QPropertyUpdatedChange>(e); - m_impl.state()->updateProperty(propertyChange->propertyName(), propertyChange->value()); - markDirty(AbstractRenderer::AllDirty); - } - BackendNode::sceneChangeEvent(e); + BackendNode::syncFromFrontEnd(frontEnd, firstTime); + + if (firstTime) + m_impl = createStateImplementation(node); + + m_impl.state()->updateProperties(node); + markDirty(AbstractRenderer::AllDirty); } } // namespace Render diff --git a/src/render/renderstates/renderstatenode_p.h b/src/render/renderstates/renderstatenode_p.h index 277b8a7c8..e0258112f 100644 --- a/src/render/renderstates/renderstatenode_p.h +++ b/src/render/renderstates/renderstatenode_p.h @@ -63,8 +63,7 @@ public: RenderStateNode(); virtual ~RenderStateNode(); - void sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) override; - + void syncFromFrontEnd(const Qt3DCore::QNode *frontEnd, bool firstTime) override; StateMask type() const { return m_impl.type; } StateVariant impl() const { return m_impl; } @@ -72,7 +71,6 @@ protected: void cleanup(); private: - void initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &change) final; StateVariant m_impl; }; diff --git a/src/render/renderstates/renderstates.cpp b/src/render/renderstates/renderstates.cpp index 77143ecd3..bd4a209a1 100644 --- a/src/render/renderstates/renderstates.cpp +++ b/src/render/renderstates/renderstates.cpp @@ -48,152 +48,181 @@ #include <Qt3DRender/private/graphicscontext_p.h> #include <Qt3DRender/private/qstenciloperation_p.h> #include <Qt3DRender/private/qstenciltest_p.h> +#include <Qt3DRender/qblendequationarguments.h> +#include <Qt3DRender/qblendequation.h> +#include <Qt3DRender/qalphatest.h> +#include <Qt3DRender/qdepthrange.h> +#include <Qt3DRender/qdepthtest.h> +#include <Qt3DRender/qrastermode.h> +#include <Qt3DRender/qfrontface.h> +#include <Qt3DRender/qscissortest.h> +#include <Qt3DRender/qpolygonoffset.h> +#include <Qt3DRender/qcolormask.h> +#include <Qt3DRender/qclipplane.h> +#include <Qt3DRender/qstencilmask.h> +#include <Qt3DRender/qlinewidth.h> QT_BEGIN_NAMESPACE namespace Qt3DRender { namespace Render { -void RenderStateImpl::updateProperty(const char *name, const QVariant &value) +void RenderStateImpl::updateProperties(const QRenderState *) { - Q_UNUSED(name); - Q_UNUSED(value); } -void BlendEquationArguments::updateProperty(const char *name, const QVariant &value) +void BlendEquationArguments::updateProperties(const QRenderState *node) { - if (name == QByteArrayLiteral("sourceRgb")) std::get<0>(m_values) = value.toInt(); - else if (name == QByteArrayLiteral("destinationRgb")) std::get<1>(m_values) = value.toInt(); - else if (name == QByteArrayLiteral("sourceAlpha")) std::get<2>(m_values) = value.toInt(); - else if (name == QByteArrayLiteral("destinationAlpha")) std::get<3>(m_values) = value.toInt(); - else if (name == QByteArrayLiteral("enabled")) std::get<4>(m_values) = value.toBool(); - else if (name == QByteArrayLiteral("bufferIndex")) std::get<5>(m_values) = value.toInt(); + const QBlendEquationArguments *args = static_cast<const QBlendEquationArguments *>(node); + + std::get<0>(m_values) = args->sourceRgb(); + std::get<1>(m_values) = args->destinationRgb(); + std::get<2>(m_values) = args->sourceAlpha(); + std::get<3>(m_values) = args->destinationAlpha(); + std::get<4>(m_values) = args->isEnabled(); + std::get<5>(m_values) = args->bufferIndex(); } -void BlendEquation::updateProperty(const char *name, const QVariant &value) +void BlendEquation::updateProperties(const QRenderState *node) { - if (name == QByteArrayLiteral("blendFunction")) std::get<0>(m_values) = value.toInt(); + const QBlendEquation *equation = static_cast<const QBlendEquation *>(node); + std::get<0>(m_values) = equation->blendFunction(); } -void AlphaFunc::updateProperty(const char *name, const QVariant &value) +void AlphaFunc::updateProperties(const QRenderState *node) { - if (name == QByteArrayLiteral("alphaFunction")) - std::get<0>(m_values) = value.toInt(); - if (name == QByteArrayLiteral("referenceValue")) - std::get<1>(m_values) = value.toFloat(); + const QAlphaTest *alphaTest = static_cast<const QAlphaTest *>(node); + std::get<0>(m_values) = alphaTest->alphaFunction(); + std::get<1>(m_values) = alphaTest->referenceValue(); } -void MSAAEnabled::updateProperty(const char *name, const QVariant &value) +void MSAAEnabled::updateProperties(const QRenderState *node) { - if (name == QByteArrayLiteral("enabled")) - std::get<0>(m_values) = value.toBool(); + std::get<0>(m_values) = node->isEnabled(); } -void DepthRange::updateProperty(const char *name, const QVariant &value) +void DepthRange::updateProperties(const QRenderState *node) { - if (name == QByteArrayLiteral("nearValue")) std::get<0>(m_values) = value.toDouble(); - else if (name == QByteArrayLiteral("farValue")) std::get<1>(m_values) = value.toDouble(); + const QDepthRange *depthRange = static_cast<const QDepthRange *>(node); + + std::get<0>(m_values) = depthRange->nearValue(); + std::get<1>(m_values) = depthRange->farValue(); } -void DepthTest::updateProperty(const char *name, const QVariant &value) +void DepthTest::updateProperties(const QRenderState *node) { - if (name == QByteArrayLiteral("depthFunction")) std::get<0>(m_values) = value.toInt(); + const QDepthTest *depthTest = static_cast<const QDepthTest *>(node); + + std::get<0>(m_values) = depthTest->depthFunction(); } -void RasterMode::updateProperty(const char *name, const QVariant &value) +void RasterMode::updateProperties(const QRenderState *node) { - if (name == QByteArrayLiteral("rasterMode")) std::get<0>(m_values) = value.toInt(); - if (name == QByteArrayLiteral("faceMode")) std::get<1>(m_values) = value.toInt(); + const QRasterMode *rasterMode = static_cast<const QRasterMode *>(node); + + std::get<0>(m_values) = rasterMode->faceMode(); + std::get<1>(m_values) = rasterMode->rasterMode(); } -void CullFace::updateProperty(const char *name, const QVariant &value) +void CullFace::updateProperties(const QRenderState *node) { - if (name == QByteArrayLiteral("mode")) std::get<0>(m_values) = value.toInt(); + const QCullFace *cullFace = static_cast<const QCullFace *>(node); + + std::get<0>(m_values) = cullFace->mode(); } -void FrontFace::updateProperty(const char *name, const QVariant &value) +void FrontFace::updateProperties(const QRenderState *node) { - if (name == QByteArrayLiteral("direction")) std::get<0>(m_values) = value.toInt(); + const QFrontFace *frontFace = static_cast<const QFrontFace *>(node); + + std::get<0>(m_values) = frontFace->direction(); } -void NoDepthMask::updateProperty(const char *name, const QVariant &value) +void NoDepthMask::updateProperties(const QRenderState *node) { - if (name == QByteArrayLiteral("mask")) std::get<0>(m_values) = value.toBool(); + std::get<0>(m_values) = !node->isEnabled(); } -void ScissorTest::updateProperty(const char *name, const QVariant &value) +void ScissorTest::updateProperties(const QRenderState *node) { - if (name == QByteArrayLiteral("left")) std::get<0>(m_values) = value.toInt(); - else if (name == QByteArrayLiteral("bottom")) std::get<1>(m_values) = value.toInt(); - else if (name == QByteArrayLiteral("width")) std::get<2>(m_values) = value.toInt(); - else if (name == QByteArrayLiteral("height")) std::get<3>(m_values) = value.toInt(); + const QScissorTest *scissorTest = static_cast<const QScissorTest *>(node); + + std::get<0>(m_values) = scissorTest->left(); + std::get<1>(m_values) = scissorTest->bottom(); + std::get<2>(m_values) = scissorTest->width(); + std::get<3>(m_values) = scissorTest->height(); } -void StencilTest::updateProperty(const char *name, const QVariant &value) +void StencilTest::updateProperties(const QRenderState *node) { - 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; - } + const QStencilTest *stencilTest = static_cast<const QStencilTest *>(node); + std::get<0>(m_values) = stencilTest->front()->stencilFunction(); + std::get<1>(m_values) = stencilTest->front()->referenceValue(); + std::get<2>(m_values) = stencilTest->front()->comparisonMask(); + std::get<3>(m_values) = stencilTest->back()->stencilFunction(); + std::get<4>(m_values) = stencilTest->back()->referenceValue(); + std::get<5>(m_values) = stencilTest->back()->comparisonMask(); } -void PointSize::updateProperty(const char *name, const QVariant &value) +void PointSize::updateProperties(const QRenderState *node) { - 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(); + const QPointSize *pointSize = static_cast<const QPointSize *>(node); + + std::get<0>(m_values) = (pointSize->sizeMode() == QPointSize::Programmable); + std::get<1>(m_values) = pointSize->value(); } -void PolygonOffset::updateProperty(const char *name, const QVariant &value) +void PolygonOffset::updateProperties(const QRenderState *node) { - if (name == QByteArrayLiteral("scaleFactor")) std::get<0>(m_values) = value.toFloat(); - else if (name == QByteArrayLiteral("depthSteps")) std::get<1>(m_values) = value.toFloat(); + const QPolygonOffset *offset = static_cast<const QPolygonOffset *>(node); + + std::get<0>(m_values) = offset->scaleFactor(); + std::get<1>(m_values) = offset->depthSteps(); } -void ColorMask::updateProperty(const char *name, const QVariant &value) +void ColorMask::updateProperties(const QRenderState *node) { - 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(); + const QColorMask *colorMask = static_cast<const QColorMask *>(node); + + std::get<0>(m_values) = colorMask->isRedMasked(); + std::get<1>(m_values) = colorMask->isGreenMasked(); + std::get<2>(m_values) = colorMask->isBlueMasked(); + std::get<3>(m_values) = colorMask->isAlphaMasked(); } -void ClipPlane::updateProperty(const char *name, const QVariant &value) +void ClipPlane::updateProperties(const QRenderState *node) { - if (name == QByteArrayLiteral("planeIndex")) std::get<0>(m_values) = value.toInt(); - else if (name == QByteArrayLiteral("normal")) std::get<1>(m_values) = value.value<QVector3D>(); - else if (name == QByteArrayLiteral("distance")) std::get<2>(m_values) = value.toFloat(); + const QClipPlane *clipPlane = static_cast<const QClipPlane *>(node); + + std::get<0>(m_values) = clipPlane->planeIndex(); + std::get<1>(m_values) = clipPlane->normal(); + std::get<2>(m_values) = clipPlane->distance(); } -void StencilOp::updateProperty(const char *name, const QVariant &value) +void StencilOp::updateProperties(const QRenderState *node) { - 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; - } + const QStencilOperation *stencilOp = static_cast<const QStencilOperation *>(node); + + std::get<0>(m_values) = stencilOp->front()->stencilTestFailureOperation(); + std::get<1>(m_values) = stencilOp->front()->depthTestFailureOperation(); + std::get<2>(m_values) = stencilOp->front()->allTestsPassOperation(); + std::get<3>(m_values) = stencilOp->back()->stencilTestFailureOperation(); + std::get<4>(m_values) = stencilOp->back()->depthTestFailureOperation(); + std::get<5>(m_values) = stencilOp->back()->allTestsPassOperation(); } -void StencilMask::updateProperty(const char *name, const QVariant &value) +void StencilMask::updateProperties(const QRenderState *node) { - if (name == QByteArrayLiteral("frontOutputMask")) std::get<0>(m_values) = value.toInt(); - else if (name == QByteArrayLiteral("backOutputMask")) std::get<1>(m_values) = value.toInt(); + const QStencilMask *stencilMask = static_cast<const QStencilMask *>(node); + std::get<0>(m_values) = stencilMask->frontOutputMask(); + std::get<1>(m_values) = stencilMask->backOutputMask(); } -void LineWidth::updateProperty(const char *name, const QVariant &value) +void LineWidth::updateProperties(const QRenderState *node) { - if (name == QByteArrayLiteral("value")) - std::get<0>(m_values) = value.toFloat(); - else if (name == QByteArrayLiteral("smooth")) - std::get<1>(m_values) = value.toBool(); + const QLineWidth *lineWidth = static_cast<const QLineWidth *>(node); + std::get<0>(m_values) = lineWidth->value(); + std::get<1>(m_values) = lineWidth->smooth(); } } // namespace Render diff --git a/src/render/renderstates/renderstates_p.h b/src/render/renderstates/renderstates_p.h index 7c6dc4ebd..6c8e9d551 100644 --- a/src/render/renderstates/renderstates_p.h +++ b/src/render/renderstates/renderstates_p.h @@ -62,61 +62,61 @@ namespace Render { class Q_AUTOTEST_EXPORT BlendEquationArguments : public GenericState<BlendEquationArguments, BlendEquationArgumentsMask, GLenum, GLenum, GLenum, GLenum, bool, int> { public: - void updateProperty(const char *name, const QVariant &value) override; + void updateProperties(const QRenderState *node) override; }; class Q_AUTOTEST_EXPORT BlendEquation : public GenericState<BlendEquation, BlendStateMask, GLenum> { public: - void updateProperty(const char *name, const QVariant &value) override; + void updateProperties(const QRenderState *node) override; }; class Q_AUTOTEST_EXPORT AlphaFunc : public GenericState<AlphaFunc, AlphaTestMask, GLenum, GLclampf> { public: - void updateProperty(const char *name, const QVariant &value) override; + void updateProperties(const QRenderState *node) override; }; class Q_AUTOTEST_EXPORT MSAAEnabled : public GenericState<MSAAEnabled, MSAAEnabledStateMask, GLboolean> { public: - void updateProperty(const char *name, const QVariant &value) override; + void updateProperties(const QRenderState *node) override; }; class Q_AUTOTEST_EXPORT DepthRange : public GenericState<DepthRange, DepthRangeMask, double, double> { public: - void updateProperty(const char *name, const QVariant &value) override; + void updateProperties(const QRenderState *node) override; }; class Q_AUTOTEST_EXPORT DepthTest : public GenericState<DepthTest, DepthTestStateMask, GLenum> { public: - void updateProperty(const char *name, const QVariant &value) override; + void updateProperties(const QRenderState *node) override; }; class Q_AUTOTEST_EXPORT RasterMode : public GenericState<RasterMode, RasterModeMask, GLenum, GLenum> { public: - void updateProperty(const char *name, const QVariant &value) override; + void updateProperties(const QRenderState *node) override; }; class Q_AUTOTEST_EXPORT NoDepthMask : public GenericState<NoDepthMask, DepthWriteStateMask, GLboolean> { public: - void updateProperty(const char *name, const QVariant &value) override; + void updateProperties(const QRenderState *node) override; }; class Q_AUTOTEST_EXPORT CullFace : public GenericState<CullFace, CullFaceStateMask, GLenum> { public: - void updateProperty(const char *name, const QVariant &value) override; + void updateProperties(const QRenderState *node) override; }; class Q_AUTOTEST_EXPORT FrontFace : public GenericState<FrontFace, FrontFaceStateMask, GLenum> { public: - void updateProperty(const char *name, const QVariant &value) override; + void updateProperties(const QRenderState *node) override; }; class Q_AUTOTEST_EXPORT Dithering : public GenericState<Dithering, DitheringStateMask> @@ -126,13 +126,13 @@ class Q_AUTOTEST_EXPORT Dithering : public GenericState<Dithering, DitheringStat class Q_AUTOTEST_EXPORT ScissorTest : public GenericState<ScissorTest, ScissorStateMask, int, int, int, int> { public: - void updateProperty(const char *name, const QVariant &value) override; + void updateProperties(const QRenderState *node) override; }; class Q_AUTOTEST_EXPORT StencilTest : public GenericState<StencilTest, StencilTestStateMask, GLenum, int, uint, GLenum, int, uint> { public: - void updateProperty(const char *name, const QVariant &value) override; + void updateProperties(const QRenderState *node) override; }; class Q_AUTOTEST_EXPORT AlphaCoverage : public GenericState<AlphaCoverage, AlphaCoverageStateMask> @@ -142,26 +142,26 @@ class Q_AUTOTEST_EXPORT AlphaCoverage : public GenericState<AlphaCoverage, Alpha class Q_AUTOTEST_EXPORT PointSize : public GenericState<PointSize, PointSizeMask, bool, GLfloat> { public: - void updateProperty(const char *name, const QVariant &value) override; + void updateProperties(const QRenderState *node) override; }; class Q_AUTOTEST_EXPORT PolygonOffset : public GenericState<PolygonOffset, PolygonOffsetStateMask, GLfloat, GLfloat> { public: - void updateProperty(const char *name, const QVariant &value) override; + void updateProperties(const QRenderState *node) override; }; class Q_AUTOTEST_EXPORT ColorMask : public GenericState<ColorMask, ColorStateMask, GLboolean, GLboolean, GLboolean, GLboolean> { public: - void updateProperty(const char *name, const QVariant &value) override; + void updateProperties(const QRenderState *node) override; }; class Q_AUTOTEST_EXPORT ClipPlane : public GenericState<ClipPlane, ClipPlaneMask, int, QVector3D, float> { public: - void updateProperty(const char *name, const QVariant &value) override; + void updateProperties(const QRenderState *node) override; }; class Q_AUTOTEST_EXPORT SeamlessCubemap : public GenericState<SeamlessCubemap, SeamlessCubemapMask> @@ -171,19 +171,19 @@ class Q_AUTOTEST_EXPORT SeamlessCubemap : public GenericState<SeamlessCubemap, S class Q_AUTOTEST_EXPORT StencilOp : public GenericState<StencilOp, StencilOpMask, GLenum, GLenum, GLenum, GLenum, GLenum, GLenum> { public: - void updateProperty(const char *name, const QVariant &value) override; + void updateProperties(const QRenderState *node) override; }; class Q_AUTOTEST_EXPORT StencilMask : public GenericState<StencilMask, StencilWriteStateMask, uint, uint> { public: - void updateProperty(const char *name, const QVariant &value) override; + void updateProperties(const QRenderState *node) override; }; class Q_AUTOTEST_EXPORT LineWidth : public GenericState<LineWidth, LineWidthMask, GLfloat, bool> { public: - void updateProperty(const char *name, const QVariant &value) override; + void updateProperties(const QRenderState *node) override; }; } // namespace Render |