summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire350@gmail.com>2015-07-18 08:48:58 +0200
committerPaul Lemire <paul.lemire@kdab.com>2015-07-25 14:31:46 +0000
commitb31fbd28868419d1791b69e72f132979e79a6d76 (patch)
treeb4f3950532df89ac7081312ad8477a033fbeb92e /src
parent97df8522be37d28ef8a256c5756b8bfce85ea471 (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.cpp5
-rw-r--r--src/render/backend/states/blendstate.cpp16
-rw-r--r--src/render/backend/states/blendstate_p.h13
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