summaryrefslogtreecommitdiffstats
path: root/src/render
diff options
context:
space:
mode:
authorJuan Jose Casafranca <juan.casafranca@kdab.com>2018-07-16 11:33:24 +0200
committerJuan José Casafranca <juan.casafranca@kdab.com>2019-02-12 11:20:48 +0000
commit22d24c182687ef4334582d5e35744388a7f00f53 (patch)
tree2a8fa3d9b30671ca5fa81b68f6ae737bfd97da81 /src/render
parent6e0a8452d6b37175b53394a31af5b32aa05c7285 (diff)
Add QRasterMode render state
QRasterMode allows a user to change the raster mode from fill to lines or points Change-Id: If96848e38ac4b5a615040b3bae2dec38a03cb031 Reviewed-by: Kevin Ottens <kevin.ottens@kdab.com>
Diffstat (limited to 'src/render')
-rw-r--r--src/render/renderers/opengl/graphicshelpers/graphicscontext.cpp5
-rw-r--r--src/render/renderers/opengl/graphicshelpers/graphicscontext_p.h1
-rw-r--r--src/render/renderers/opengl/graphicshelpers/graphicshelperes2.cpp7
-rw-r--r--src/render/renderers/opengl/graphicshelpers/graphicshelperes2_p.h1
-rw-r--r--src/render/renderers/opengl/graphicshelpers/graphicshelpergl2.cpp5
-rw-r--r--src/render/renderers/opengl/graphicshelpers/graphicshelpergl2_p.h1
-rw-r--r--src/render/renderers/opengl/graphicshelpers/graphicshelpergl3_2.cpp5
-rw-r--r--src/render/renderers/opengl/graphicshelpers/graphicshelpergl3_2_p.h1
-rw-r--r--src/render/renderers/opengl/graphicshelpers/graphicshelpergl3_3.cpp5
-rw-r--r--src/render/renderers/opengl/graphicshelpers/graphicshelpergl3_3_p.h1
-rw-r--r--src/render/renderers/opengl/graphicshelpers/graphicshelpergl4.cpp5
-rw-r--r--src/render/renderers/opengl/graphicshelpers/graphicshelpergl4_p.h1
-rw-r--r--src/render/renderers/opengl/graphicshelpers/graphicshelperinterface_p.h1
-rw-r--r--src/render/renderers/opengl/graphicshelpers/submissioncontext.cpp16
-rw-r--r--src/render/renderstates/qrastermode.cpp95
-rw-r--r--src/render/renderstates/qrastermode.h96
-rw-r--r--src/render/renderstates/qrastermode_p.h84
-rw-r--r--src/render/renderstates/renderstatenode.cpp8
-rw-r--r--src/render/renderstates/renderstates.cpp6
-rw-r--r--src/render/renderstates/renderstates.pri7
-rw-r--r--src/render/renderstates/renderstates_p.h6
-rw-r--r--src/render/renderstates/statemask_p.h1
-rw-r--r--src/render/renderstates/statevariant.cpp2
23 files changed, 357 insertions, 3 deletions
diff --git a/src/render/renderers/opengl/graphicshelpers/graphicscontext.cpp b/src/render/renderers/opengl/graphicshelpers/graphicscontext.cpp
index 1cd089903..01a1b107a 100644
--- a/src/render/renderers/opengl/graphicshelpers/graphicscontext.cpp
+++ b/src/render/renderers/opengl/graphicshelpers/graphicscontext.cpp
@@ -329,6 +329,11 @@ void GraphicsContext::activateDrawBuffers(const AttachmentPack &attachments)
}
}
+void GraphicsContext::rasterMode(GLenum faceMode, GLenum rasterMode)
+{
+ m_glHelper->rasterMode(faceMode, rasterMode);
+}
+
/*!
* \internal
* Finds the highest supported opengl version and internally use the most optimized
diff --git a/src/render/renderers/opengl/graphicshelpers/graphicscontext_p.h b/src/render/renderers/opengl/graphicshelpers/graphicscontext_p.h
index 934a400f6..548a6d9f4 100644
--- a/src/render/renderers/opengl/graphicshelpers/graphicscontext_p.h
+++ b/src/render/renderers/opengl/graphicshelpers/graphicscontext_p.h
@@ -167,6 +167,7 @@ public:
void setVerticesPerPatch(GLint verticesPerPatch);
void memoryBarrier(QMemoryBarrier::Operations barriers);
void activateDrawBuffers(const AttachmentPack &attachments);
+ void rasterMode(GLenum faceMode, GLenum rasterMode);
// Helper methods
static GLint elementType(GLint type);
diff --git a/src/render/renderers/opengl/graphicshelpers/graphicshelperes2.cpp b/src/render/renderers/opengl/graphicshelpers/graphicshelperes2.cpp
index 382aecc4d..0eb7401ed 100644
--- a/src/render/renderers/opengl/graphicshelpers/graphicshelperes2.cpp
+++ b/src/render/renderers/opengl/graphicshelpers/graphicshelperes2.cpp
@@ -345,6 +345,13 @@ void GraphicsHelperES2::deleteSync(void *)
qWarning() << "Fences are not supported by OpenGL ES 2.0 (since OpenGL ES 3.0)";
}
+void GraphicsHelperES2::rasterMode(GLenum faceMode, GLenum rasterMode)
+{
+ Q_UNUSED(faceMode);
+ Q_UNUSED(rasterMode);
+ qWarning() << "glPolyonMode is not supported with OpenGL ES";
+}
+
void GraphicsHelperES2::blendEquation(GLenum mode)
{
m_funcs->glBlendEquation(mode);
diff --git a/src/render/renderers/opengl/graphicshelpers/graphicshelperes2_p.h b/src/render/renderers/opengl/graphicshelpers/graphicshelperes2_p.h
index ace61edeb..87e4c92c8 100644
--- a/src/render/renderers/opengl/graphicshelpers/graphicshelperes2_p.h
+++ b/src/render/renderers/opengl/graphicshelpers/graphicshelperes2_p.h
@@ -132,6 +132,7 @@ public:
void vertexAttributePointer(GLenum shaderDataType, GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer) override;
void readBuffer(GLenum mode) override;
void drawBuffer(GLenum mode) override;
+ void rasterMode(GLenum faceMode, GLenum rasterMode) override;
void *fenceSync() override;
void clientWaitSync(void *sync, GLuint64 nanoSecTimeout) override;
diff --git a/src/render/renderers/opengl/graphicshelpers/graphicshelpergl2.cpp b/src/render/renderers/opengl/graphicshelpers/graphicshelpergl2.cpp
index 6b7c3661e..d6dad7de2 100644
--- a/src/render/renderers/opengl/graphicshelpers/graphicshelpergl2.cpp
+++ b/src/render/renderers/opengl/graphicshelpers/graphicshelpergl2.cpp
@@ -299,6 +299,11 @@ void GraphicsHelperGL2::deleteSync(void *)
qWarning() << "Fences are not supported by OpenGL 2.0 (since OpenGL 3.2)";
}
+void GraphicsHelperGL2::rasterMode(GLenum faceMode, GLenum rasterMode)
+{
+ m_funcs->glPolygonMode(faceMode, rasterMode);
+}
+
void GraphicsHelperGL2::blendEquation(GLenum mode)
{
m_funcs->glBlendEquation(mode);
diff --git a/src/render/renderers/opengl/graphicshelpers/graphicshelpergl2_p.h b/src/render/renderers/opengl/graphicshelpers/graphicshelpergl2_p.h
index bf7e6e228..56e05e3ff 100644
--- a/src/render/renderers/opengl/graphicshelpers/graphicshelpergl2_p.h
+++ b/src/render/renderers/opengl/graphicshelpers/graphicshelpergl2_p.h
@@ -132,6 +132,7 @@ public:
void vertexAttributePointer(GLenum shaderDataType, GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer) override;
void readBuffer(GLenum mode) override;
void drawBuffer(GLenum mode) override;
+ void rasterMode(GLenum faceMode, GLenum rasterMode) override;
void *fenceSync() override;
void clientWaitSync(void *sync, GLuint64 nanoSecTimeout) override;
diff --git a/src/render/renderers/opengl/graphicshelpers/graphicshelpergl3_2.cpp b/src/render/renderers/opengl/graphicshelpers/graphicshelpergl3_2.cpp
index b0cb27556..9d5305059 100644
--- a/src/render/renderers/opengl/graphicshelpers/graphicshelpergl3_2.cpp
+++ b/src/render/renderers/opengl/graphicshelpers/graphicshelpergl3_2.cpp
@@ -365,6 +365,11 @@ void GraphicsHelperGL3_2::deleteSync(void *sync)
m_funcs->glDeleteSync(static_cast<GLsync>(sync));
}
+void GraphicsHelperGL3_2::rasterMode(GLenum faceMode, GLenum rasterMode)
+{
+ m_funcs->glPolygonMode(faceMode, rasterMode);
+}
+
void GraphicsHelperGL3_2::blendEquation(GLenum mode)
{
m_funcs->glBlendEquation(mode);
diff --git a/src/render/renderers/opengl/graphicshelpers/graphicshelpergl3_2_p.h b/src/render/renderers/opengl/graphicshelpers/graphicshelpergl3_2_p.h
index 065b61428..fc273a2c2 100644
--- a/src/render/renderers/opengl/graphicshelpers/graphicshelpergl3_2_p.h
+++ b/src/render/renderers/opengl/graphicshelpers/graphicshelpergl3_2_p.h
@@ -134,6 +134,7 @@ public:
void vertexAttributePointer(GLenum shaderDataType, GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer) override;
void readBuffer(GLenum mode) override;
void drawBuffer(GLenum mode) override;
+ void rasterMode(GLenum faceMode, GLenum rasterMode) override;
void *fenceSync() override;
void clientWaitSync(void *sync, GLuint64 nanoSecTimeout) override;
diff --git a/src/render/renderers/opengl/graphicshelpers/graphicshelpergl3_3.cpp b/src/render/renderers/opengl/graphicshelpers/graphicshelpergl3_3.cpp
index e8cb3ee95..6c636e292 100644
--- a/src/render/renderers/opengl/graphicshelpers/graphicshelpergl3_3.cpp
+++ b/src/render/renderers/opengl/graphicshelpers/graphicshelpergl3_3.cpp
@@ -361,6 +361,11 @@ void GraphicsHelperGL3_3::deleteSync(void *sync)
m_funcs->glDeleteSync(static_cast<GLsync>(sync));
}
+void GraphicsHelperGL3_3::rasterMode(GLenum faceMode, GLenum rasterMode)
+{
+ m_funcs->glPolygonMode(faceMode, rasterMode);
+}
+
void GraphicsHelperGL3_3::blendEquation(GLenum mode)
{
m_funcs->glBlendEquation(mode);
diff --git a/src/render/renderers/opengl/graphicshelpers/graphicshelpergl3_3_p.h b/src/render/renderers/opengl/graphicshelpers/graphicshelpergl3_3_p.h
index c7e5138d1..1750b66ee 100644
--- a/src/render/renderers/opengl/graphicshelpers/graphicshelpergl3_3_p.h
+++ b/src/render/renderers/opengl/graphicshelpers/graphicshelpergl3_3_p.h
@@ -134,6 +134,7 @@ public:
void vertexAttributePointer(GLenum shaderDataType, GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer) override;
void readBuffer(GLenum mode) override;
void drawBuffer(GLenum mode) override;
+ void rasterMode(GLenum faceMode, GLenum rasterMode) override;
void *fenceSync() override;
void clientWaitSync(void *sync, GLuint64 nanoSecTimeout) override;
diff --git a/src/render/renderers/opengl/graphicshelpers/graphicshelpergl4.cpp b/src/render/renderers/opengl/graphicshelpers/graphicshelpergl4.cpp
index c4f06c3eb..a8926860b 100644
--- a/src/render/renderers/opengl/graphicshelpers/graphicshelpergl4.cpp
+++ b/src/render/renderers/opengl/graphicshelpers/graphicshelpergl4.cpp
@@ -433,6 +433,11 @@ void GraphicsHelperGL4::deleteSync(void *sync)
m_funcs->glDeleteSync(static_cast<GLsync>(sync));
}
+void GraphicsHelperGL4::rasterMode(GLenum faceMode, GLenum rasterMode)
+{
+ m_funcs->glPolygonMode(faceMode, rasterMode);
+}
+
void GraphicsHelperGL4::glUniform1fv(GLint location, GLsizei count, const GLfloat *values)
{
m_funcs->glUniform1fv(location, count, values);
diff --git a/src/render/renderers/opengl/graphicshelpers/graphicshelpergl4_p.h b/src/render/renderers/opengl/graphicshelpers/graphicshelpergl4_p.h
index 878d6e309..26613a39a 100644
--- a/src/render/renderers/opengl/graphicshelpers/graphicshelpergl4_p.h
+++ b/src/render/renderers/opengl/graphicshelpers/graphicshelpergl4_p.h
@@ -132,6 +132,7 @@ public:
void vertexAttributePointer(GLenum shaderDataType, GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer) override;
void readBuffer(GLenum mode) override;
void drawBuffer(GLenum mode) override;
+ void rasterMode(GLenum faceMode, GLenum rasterMode) override;
void *fenceSync() override;
void clientWaitSync(void *sync, GLuint64 nanoSecTimeout) override;
diff --git a/src/render/renderers/opengl/graphicshelpers/graphicshelperinterface_p.h b/src/render/renderers/opengl/graphicshelpers/graphicshelperinterface_p.h
index b50488823..d91761422 100644
--- a/src/render/renderers/opengl/graphicshelpers/graphicshelperinterface_p.h
+++ b/src/render/renderers/opengl/graphicshelpers/graphicshelperinterface_p.h
@@ -156,6 +156,7 @@ public:
virtual void vertexAttributePointer(GLenum shaderDataType, GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer) = 0;
virtual void readBuffer(GLenum mode) = 0;
virtual void drawBuffer(GLenum mode) = 0;
+ virtual void rasterMode(GLenum faceMode, GLenum rasterMode) = 0;
virtual void *fenceSync() = 0;
virtual void clientWaitSync(void *sync, GLuint64 nanoSecTimeout) = 0;
diff --git a/src/render/renderers/opengl/graphicshelpers/submissioncontext.cpp b/src/render/renderers/opengl/graphicshelpers/submissioncontext.cpp
index 4c264383b..a39b900e0 100644
--- a/src/render/renderers/opengl/graphicshelpers/submissioncontext.cpp
+++ b/src/render/renderers/opengl/graphicshelpers/submissioncontext.cpp
@@ -246,6 +246,11 @@ void applyStateHelper<DepthTest>(const DepthTest *state, SubmissionContext *gc)
gc->depthTest(std::get<0>(state->values()));
}
+template<>
+void applyStateHelper<RasterMode>(const RasterMode *state, SubmissionContext *gc)
+{
+ gc->rasterMode(std::get<0>(state->values()), std::get<1>(state->values()));
+}
template<>
void applyStateHelper<NoDepthMask>(const NoDepthMask *state, SubmissionContext *gc)
@@ -253,7 +258,6 @@ void applyStateHelper<NoDepthMask>(const NoDepthMask *state, SubmissionContext *
gc->depthMask(std::get<0>(state->values()));
}
-
template<>
void applyStateHelper<CullFace>(const CullFace *state, SubmissionContext *gc)
{
@@ -1095,6 +1099,11 @@ void SubmissionContext::applyState(const StateVariant &stateVariant)
break;
}
+ case RasterModeMask: {
+ applyStateHelper<RasterMode>(static_cast<const RasterMode *>(stateVariant.constState()), this);
+ break;
+ }
+
case FrontFaceStateMask: {
applyStateHelper<FrontFace>(static_cast<const FrontFace *>(stateVariant.constState()), this);
break;
@@ -1221,6 +1230,11 @@ void SubmissionContext::resetMasked(qint64 maskOfStatesToReset)
if (maskOfStatesToReset & LineWidthMask)
funcs->glLineWidth(1.0f);
+
+#ifndef QT_OPENGL_ES_2
+ if (maskOfStatesToReset & RasterModeMask)
+ m_glHelper->rasterMode(GL_FRONT_AND_BACK, GL_FILL);
+#endif
}
void SubmissionContext::applyStateSet(RenderStateSet *ss)
diff --git a/src/render/renderstates/qrastermode.cpp b/src/render/renderstates/qrastermode.cpp
new file mode 100644
index 000000000..065a1ca8c
--- /dev/null
+++ b/src/render/renderstates/qrastermode.cpp
@@ -0,0 +1,95 @@
+/****************************************************************************
+**
+** Copyright (C) 2018 Klaralvdalens Datakonsult AB (KDAB).
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt3D module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qrastermode.h"
+#include "qrastermode_p.h"
+#include <Qt3DRender/private/qrenderstatecreatedchange_p.h>
+
+QT_BEGIN_NAMESPACE
+
+namespace Qt3DRender {
+
+QRasterMode::QRasterMode(QNode *parent)
+ : QRenderState(*new QRasterModePrivate, parent)
+{
+}
+
+QRasterMode::RasterMode QRasterMode::rasterMode() const
+{
+ Q_D(const QRasterMode);
+ return d->m_rasterMode;
+}
+
+QRasterMode::FaceMode QRasterMode::faceMode() const
+{
+ Q_D(const QRasterMode);
+ return d->m_faceMode;
+}
+
+void QRasterMode::setRasterMode(QRasterMode::RasterMode rasterMode)
+{
+ Q_D(QRasterMode);
+ if (d->m_rasterMode != rasterMode) {
+ d->m_rasterMode = rasterMode;
+ emit rasterModeChanged(rasterMode);
+ }
+}
+
+void QRasterMode::setFaceMode(QRasterMode::FaceMode faceMode)
+{
+ Q_D(QRasterMode);
+ if (d->m_faceMode != faceMode) {
+ d->m_faceMode = faceMode;
+ emit faceModeChanged(faceMode);
+ }
+}
+
+Qt3DCore::QNodeCreatedChangeBasePtr QRasterMode::createNodeCreationChange() const
+{
+ auto creationChange = QRenderStateCreatedChangePtr<QRasterModeData>::create(this);
+ auto &data = creationChange->data;
+ Q_D(const QRasterMode);
+ data.rasterMode = d->m_rasterMode;
+ data.faceMode = d->m_faceMode;
+ return creationChange;
+}
+
+} // namespace Qt3DRender
+
+QT_END_NAMESPACE
diff --git a/src/render/renderstates/qrastermode.h b/src/render/renderstates/qrastermode.h
new file mode 100644
index 000000000..9448a6932
--- /dev/null
+++ b/src/render/renderstates/qrastermode.h
@@ -0,0 +1,96 @@
+/****************************************************************************
+**
+** Copyright (C) 2018 Klaralvdalens Datakonsult AB (KDAB).
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt3D module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3DRENDER_QRASTERMODE_H
+#define QT3DRENDER_QRASTERMODE_H
+
+#include <Qt3DRender/qrenderstate.h>
+
+QT_BEGIN_NAMESPACE
+
+namespace Qt3DRender {
+
+class QRasterModePrivate;
+
+class QT3DRENDERSHARED_EXPORT QRasterMode : public QRenderState
+{
+ Q_OBJECT
+ Q_PROPERTY(RasterMode rasterMode READ rasterMode WRITE setRasterMode NOTIFY rasterModeChanged)
+ Q_PROPERTY(FaceMode faceMode READ faceMode WRITE setFaceMode NOTIFY faceModeChanged)
+public:
+
+ enum RasterMode {
+ Points = 0x1B00,
+ Lines = 0x1B01,
+ Fill = 0x1B02,
+ };
+ Q_ENUM(RasterMode) // LCOV_EXCL_LINE
+
+ enum FaceMode
+ {
+ Front = 0x0404,
+ Back = 0x0405,
+ FrontAndBack = 0x0408
+ };
+ Q_ENUM(FaceMode) // LCOV_EXCL_LINE
+
+ explicit QRasterMode(Qt3DCore::QNode *parent = nullptr);
+ ~QRasterMode() = default;
+
+ RasterMode rasterMode() const;
+ FaceMode faceMode() const;
+
+public Q_SLOTS:
+ void setRasterMode(RasterMode rasterMode);
+ void setFaceMode(FaceMode faceMode);
+
+Q_SIGNALS:
+ void rasterModeChanged(RasterMode rasterMode);
+ void faceModeChanged(FaceMode faceMode);
+
+private:
+ Q_DECLARE_PRIVATE(QRasterMode)
+ Qt3DCore::QNodeCreatedChangeBasePtr createNodeCreationChange() const override;
+};
+
+} // namespace Qt3DRender
+
+QT_END_NAMESPACE
+
+#endif // QT3DRENDER_QRASTERMODE_H
diff --git a/src/render/renderstates/qrastermode_p.h b/src/render/renderstates/qrastermode_p.h
new file mode 100644
index 000000000..506689f02
--- /dev/null
+++ b/src/render/renderstates/qrastermode_p.h
@@ -0,0 +1,84 @@
+/****************************************************************************
+**
+** Copyright (C) 2018 Klaralvdalens Datakonsult AB (KDAB).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the Qt3D module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3DRENDER_QRASTERMODE_P_H
+#define QT3DRENDER_QRASTERMODE_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists for the convenience
+// of other Qt classes. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <Qt3DRender/private/qrenderstate_p.h>
+#include <Qt3DRender/qrastermode.h>
+#include <Qt3DRender/private/qt3drender_global_p.h>
+
+QT_BEGIN_NAMESPACE
+
+namespace Qt3DRender {
+
+class QT3DRENDERSHARED_PRIVATE_EXPORT QRasterModePrivate : public QRenderStatePrivate
+{
+public :
+ QRasterModePrivate()
+ : QRenderStatePrivate(Render::RasterModeMask)
+ , m_rasterMode(QRasterMode::Fill)
+ , m_faceMode(QRasterMode::FrontAndBack)
+ {
+ }
+
+ Q_DECLARE_PUBLIC(QRasterMode)
+ QRasterMode::RasterMode m_rasterMode;
+ QRasterMode::FaceMode m_faceMode;
+};
+
+struct QRasterModeData
+{
+ QRasterMode::FaceMode faceMode;
+ QRasterMode::RasterMode rasterMode;
+};
+
+} // namespace Qt3DRender
+
+QT_END_NAMESPACE
+
+#endif // QT3DRENDER_QRASTERMODE_P_H
diff --git a/src/render/renderstates/renderstatenode.cpp b/src/render/renderstates/renderstatenode.cpp
index 1cab44218..f83640154 100644
--- a/src/render/renderstates/renderstatenode.cpp
+++ b/src/render/renderstates/renderstatenode.cpp
@@ -55,6 +55,8 @@
#include <Qt3DRender/private/qdepthrange_p.h>
#include <Qt3DRender/qdepthtest.h>
#include <Qt3DRender/private/qdepthtest_p.h>
+#include <Qt3DRender/qrastermode.h>
+#include <Qt3DRender/private/qrastermode_p.h>
#include <Qt3DRender/qdithering.h>
#include <Qt3DRender/qfrontface.h>
#include <Qt3DRender/private/qfrontface_p.h>
@@ -144,6 +146,12 @@ StateVariant createStateImplementation(const Qt3DRender::QRenderStateCreatedChan
return StateVariant::createState<DepthTest>(data.depthFunction);
}
+ case RasterModeMask: {
+ const auto typedChange = qSharedPointerCast<Qt3DRender::QRenderStateCreatedChange<QRasterModeData>>(renderStateChange);
+ const auto &data = typedChange->data;
+ return StateVariant::createState<RasterMode>(data.faceMode, data.rasterMode);
+ }
+
case FrontFaceStateMask: {
const auto typedChange = qSharedPointerCast<Qt3DRender::QRenderStateCreatedChange<QFrontFaceData>>(renderStateChange);
const auto &data = typedChange->data;
diff --git a/src/render/renderstates/renderstates.cpp b/src/render/renderstates/renderstates.cpp
index c954d9d2c..77143ecd3 100644
--- a/src/render/renderstates/renderstates.cpp
+++ b/src/render/renderstates/renderstates.cpp
@@ -100,6 +100,12 @@ void DepthTest::updateProperty(const char *name, const QVariant &value)
if (name == QByteArrayLiteral("depthFunction")) std::get<0>(m_values) = value.toInt();
}
+void RasterMode::updateProperty(const char *name, const QVariant &value)
+{
+ if (name == QByteArrayLiteral("rasterMode")) std::get<0>(m_values) = value.toInt();
+ if (name == QByteArrayLiteral("faceMode")) std::get<1>(m_values) = value.toInt();
+}
+
void CullFace::updateProperty(const char *name, const QVariant &value)
{
if (name == QByteArrayLiteral("mode")) std::get<0>(m_values) = value.toInt();
diff --git a/src/render/renderstates/renderstates.pri b/src/render/renderstates/renderstates.pri
index b084a8759..06ba53a41 100644
--- a/src/render/renderstates/renderstates.pri
+++ b/src/render/renderstates/renderstates.pri
@@ -49,7 +49,9 @@ HEADERS += \
$$PWD/renderstatenode_p.h \
$$PWD/qmultisampleantialiasing.h \
$$PWD/statemask_p.h \
- $$PWD/statevariant_p.h
+ $$PWD/statevariant_p.h \
+ $$PWD/qrastermode.h \
+ $$PWD/qrastermode_p.h
SOURCES += \
$$PWD/qalphacoverage.cpp \
@@ -79,4 +81,5 @@ SOURCES += \
$$PWD/qrenderstatecreatedchange.cpp \
$$PWD/renderstatenode.cpp \
$$PWD/statevariant.cpp \
- $$PWD/qmultisampleantialiasing.cpp
+ $$PWD/qmultisampleantialiasing.cpp \
+ $$PWD/qrastermode.cpp
diff --git a/src/render/renderstates/renderstates_p.h b/src/render/renderstates/renderstates_p.h
index e769be2a4..7c6dc4ebd 100644
--- a/src/render/renderstates/renderstates_p.h
+++ b/src/render/renderstates/renderstates_p.h
@@ -95,6 +95,12 @@ public:
void updateProperty(const char *name, const QVariant &value) override;
};
+class Q_AUTOTEST_EXPORT RasterMode : public GenericState<RasterMode, RasterModeMask, GLenum, GLenum>
+{
+public:
+ void updateProperty(const char *name, const QVariant &value) override;
+};
+
class Q_AUTOTEST_EXPORT NoDepthMask : public GenericState<NoDepthMask, DepthWriteStateMask, GLboolean>
{
public:
diff --git a/src/render/renderstates/statemask_p.h b/src/render/renderstates/statemask_p.h
index 6920a7d5b..ca64e30cd 100644
--- a/src/render/renderstates/statemask_p.h
+++ b/src/render/renderstates/statemask_p.h
@@ -82,6 +82,7 @@ enum StateMask
BlendEquationArgumentsMask = 1 << 18,
LineWidthMask = 1 << 19,
DepthRangeMask = 1 << 20,
+ RasterModeMask = 1 << 21
};
} // namespace Render
diff --git a/src/render/renderstates/statevariant.cpp b/src/render/renderstates/statevariant.cpp
index 09c800470..47b3fd0a7 100644
--- a/src/render/renderstates/statevariant.cpp
+++ b/src/render/renderstates/statevariant.cpp
@@ -68,6 +68,7 @@ RenderStateImpl *StateVariant::state()
case StencilOpMask:
case StencilWriteStateMask:
case LineWidthMask:
+ case RasterModeMask:
return &data.blendEquationArguments;
default:
Q_UNREACHABLE();
@@ -98,6 +99,7 @@ const RenderStateImpl *StateVariant::constState() const
case StencilOpMask:
case StencilWriteStateMask:
case LineWidthMask:
+ case RasterModeMask:
return &data.blendEquationArguments;
default:
Q_UNREACHABLE();