diff options
author | Paul Lemire <paul.lemire350@gmail.com> | 2015-07-18 08:48:58 +0200 |
---|---|---|
committer | Paul Lemire <paul.lemire@kdab.com> | 2015-07-25 14:31:46 +0000 |
commit | b31fbd28868419d1791b69e72f132979e79a6d76 (patch) | |
tree | b4f3950532df89ac7081312ad8477a033fbeb92e /src | |
parent | 97df8522be37d28ef8a256c5756b8bfce85ea471 (diff) |
StencilMask backend renderstate for QStencilMask
Change-Id: Id6e92c5fe16cbdcd4307c8b1938e94ab593b4382
Reviewed-by: Paul Lemire <paul.lemire@kdab.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/render/backend/renderstate.cpp | 5 | ||||
-rw-r--r-- | src/render/backend/states/blendstate.cpp | 16 | ||||
-rw-r--r-- | src/render/backend/states/blendstate_p.h | 13 |
3 files changed, 34 insertions, 0 deletions
diff --git a/src/render/backend/renderstate.cpp b/src/render/backend/renderstate.cpp index b3d4f4bf7..b89d807af 100644 --- a/src/render/backend/renderstate.cpp +++ b/src/render/backend/renderstate.cpp @@ -62,6 +62,7 @@ #include <Qt3DRenderer/qclipplane.h> #include <Qt3DRenderer/qstencilop.h> #include <Qt3DRenderer/qstencilopseparate.h> +#include <Qt3DRenderer/qstencilmask.h> QT_BEGIN_NAMESPACE @@ -317,6 +318,10 @@ RenderState *RenderState::getOrCreateBackendState(QRenderState *renderState) return StencilOp::getOrCreate(front->stencilFail(), front->depthFail(), front->stencilDepthPass(), back->stencilFail(), back->depthFail(), back->stencilDepthPass()); } + case QRenderState::StencilMask: { + QStencilMask *stencilMask = static_cast<QStencilMask *>(renderState); + return StencilMask::getOrCreate(stencilMask->frontMask(), stencilMask->backMask()); + } default: Q_UNREACHABLE(); diff --git a/src/render/backend/states/blendstate.cpp b/src/render/backend/states/blendstate.cpp index 4b55dd971..0512ec685 100644 --- a/src/render/backend/states/blendstate.cpp +++ b/src/render/backend/states/blendstate.cpp @@ -313,6 +313,22 @@ StencilOp::StencilOp(GLenum fsfail, GLenum fdfail, GLenum fdspass, GLenum bsfail { } +void StencilMask::apply(QGraphicsContext *gc) const +{ + gc->openGLContext()->functions()->glStencilMaskSeparate(GL_FRONT, m_1); + gc->openGLContext()->functions()->glStencilMaskSeparate(GL_BACK, m_2); +} + +StencilMask *StencilMask::getOrCreate(uint frontMask, uint backMask) +{ + return getOrCreateImpl(StencilMask(frontMask, backMask)); +} + +StencilMask::StencilMask(uint frontMask, uint backMask) + : GenericState2<StencilMask, uint, uint>(frontMask, backMask) +{ +} + } // Render } // Qt3D diff --git a/src/render/backend/states/blendstate_p.h b/src/render/backend/states/blendstate_p.h index b7f527c5d..13dcb646b 100644 --- a/src/render/backend/states/blendstate_p.h +++ b/src/render/backend/states/blendstate_p.h @@ -262,6 +262,19 @@ private: GLenum bsfail, GLenum bdfail, GLenum bdspass); }; +class Q_AUTOTEST_EXPORT StencilMask : public GenericState2<StencilMask, uint, uint> +{ +public: + void apply(QGraphicsContext *gc) const Q_DECL_FINAL; + + StateMaskSet mask() const Q_DECL_FINAL + { return StencilWriteStateMask; } + static StencilMask *getOrCreate(uint frontMask, uint backMask); + +private: + StencilMask(uint frontMask, uint backMask); +}; + } // Render } // Qt3D |