diff --git a/doc/changelog.dox b/doc/changelog.dox index 758ba1de7..98a305829 100644 --- a/doc/changelog.dox +++ b/doc/changelog.dox @@ -70,6 +70,9 @@ See also: @ref GL::Mesh::setIndexBuffer() can now take ownership of a passed @ref GL::Buffer to simplify resource management on user side. See @ref GL-Mesh-buffer-ownership for more information. +- @ref GL::Mesh::draw() and @ref GL::MeshView::draw() now return a reference + to self to make method-chained draws (for example using a different shader) + possible as well @subsubsection changelog-latest-changes-meshtools MeshTools library diff --git a/src/Magnum/GL/Mesh.cpp b/src/Magnum/GL/Mesh.cpp index 3b0dad175..60e8680eb 100644 --- a/src/Magnum/GL/Mesh.cpp +++ b/src/Magnum/GL/Mesh.cpp @@ -352,11 +352,11 @@ Mesh& Mesh::setIndexBuffer(Buffer& buffer, const GLintptr offset, const MeshInde return *this; } -void Mesh::draw(AbstractShaderProgram& shader) { - CORRADE_ASSERT(_countSet, "GL::Mesh::draw(): setCount() was never called, probably a mistake?", ); +Mesh& Mesh::draw(AbstractShaderProgram& shader) { + CORRADE_ASSERT(_countSet, "GL::Mesh::draw(): setCount() was never called, probably a mistake?", *this); /* Nothing to draw, exit without touching any state */ - if(!_count || !_instanceCount) return; + if(!_count || !_instanceCount) return *this; shader.use(); @@ -367,6 +367,8 @@ void Mesh::draw(AbstractShaderProgram& shader) { #else drawInternal(_count, _baseVertex, _instanceCount, _indexOffset); #endif + + return *this; } #ifndef MAGNUM_TARGET_GLES @@ -506,13 +508,13 @@ void Mesh::drawInternal(TransformFeedback& xfb, const UnsignedInt stream, const (this->*state.unbindImplementation)(); } -void Mesh::draw(AbstractShaderProgram& shader, TransformFeedback& xfb, UnsignedInt stream) { +Mesh& Mesh::draw(AbstractShaderProgram& shader, TransformFeedback& xfb, UnsignedInt stream) { /* Nothing to draw, exit without touching any state */ - if(!_instanceCount) return; + if(!_instanceCount) return *this; shader.use(); - drawInternal(xfb, stream, _instanceCount); + return *this; } #endif diff --git a/src/Magnum/GL/Mesh.h b/src/Magnum/GL/Mesh.h index 811c1d8e6..0508f7880 100644 --- a/src/Magnum/GL/Mesh.h +++ b/src/Magnum/GL/Mesh.h @@ -905,15 +905,14 @@ class MAGNUM_GL_EXPORT Mesh: public AbstractObject { Mesh& setIndexBuffer(Buffer&& buffer, GLintptr offset, MeshIndexType type) { return setIndexBuffer(std::move(buffer), offset, type, 0, 0); } - - /** @overload */ Mesh& setIndexBuffer(Buffer&& buffer, GLintptr offset, Magnum::MeshIndexType type) { return setIndexBuffer(std::move(buffer), offset, meshIndexType(type), 0, 0); - } + } /**< @overload */ /** * @brief Draw the mesh * @param shader Shader to use for drawing + * @return Reference to self (for method chaining) * * Expects that the shader is compatible with this mesh and is fully * set up. If vertex/index count or instance count is `0`, no draw @@ -953,8 +952,10 @@ class MAGNUM_GL_EXPORT Mesh: public AbstractObject { * @requires_gl Specifying base vertex for indexed meshes is not * available in OpenGL ES or WebGL. */ - void draw(AbstractShaderProgram& shader); - void draw(AbstractShaderProgram&& shader) { draw(shader); } /**< @overload */ + Mesh& draw(AbstractShaderProgram& shader); + Mesh& draw(AbstractShaderProgram&& shader) { + return draw(shader); + } /**< @overload */ #ifndef MAGNUM_TARGET_GLES /** @@ -962,6 +963,7 @@ class MAGNUM_GL_EXPORT Mesh: public AbstractObject { * @param shader Shader to use for drawing * @param xfb Transform feedback to use for vertex count * @param stream Transform feedback stream ID + * @return Reference to self (for method chaining) * * Expects that the @p shader is compatible with this mesh, is fully * set up and that the output buffer(s) from @p xfb are used as vertex @@ -985,12 +987,10 @@ class MAGNUM_GL_EXPORT Mesh: public AbstractObject { * @requires_gl42 Extension @gl_extension{ARB,transform_feedback_instanced} * if @ref instanceCount() is more than `1`. */ - void draw(AbstractShaderProgram& shader, TransformFeedback& xfb, UnsignedInt stream = 0); - - /** @overload */ - void draw(AbstractShaderProgram&& shader, TransformFeedback& xfb, UnsignedInt stream = 0) { - draw(shader, xfb, stream); - } + Mesh& draw(AbstractShaderProgram& shader, TransformFeedback& xfb, UnsignedInt stream = 0); + Mesh& draw(AbstractShaderProgram&& shader, TransformFeedback& xfb, UnsignedInt stream = 0) { + return draw(shader, xfb, stream); + } /**< @overload */ #endif private: diff --git a/src/Magnum/GL/MeshView.cpp b/src/Magnum/GL/MeshView.cpp index 0e0e6b32c..e2c9611ed 100644 --- a/src/Magnum/GL/MeshView.cpp +++ b/src/Magnum/GL/MeshView.cpp @@ -145,11 +145,11 @@ MeshView& MeshView::setIndexRange(Int first) { return *this; } -void MeshView::draw(AbstractShaderProgram& shader) { - CORRADE_ASSERT(_countSet, "GL::MeshView::draw(): setCount() was never called, probably a mistake?", ); +MeshView& MeshView::draw(AbstractShaderProgram& shader) { + CORRADE_ASSERT(_countSet, "GL::MeshView::draw(): setCount() was never called, probably a mistake?", *this); /* Nothing to draw, exit without touching any state */ - if(!_count || !_instanceCount) return; + if(!_count || !_instanceCount) return *this; shader.use(); @@ -160,16 +160,18 @@ void MeshView::draw(AbstractShaderProgram& shader) { #else _original.get().drawInternal(_count, _baseVertex, _instanceCount, _indexOffset); #endif + + return *this; } #ifndef MAGNUM_TARGET_GLES -void MeshView::draw(AbstractShaderProgram& shader, TransformFeedback& xfb, UnsignedInt stream) { +MeshView& MeshView::draw(AbstractShaderProgram& shader, TransformFeedback& xfb, UnsignedInt stream) { /* Nothing to draw, exit without touching any state */ - if(!_instanceCount) return; + if(!_instanceCount) return *this; shader.use(); - _original.get().drawInternal(xfb, stream, _instanceCount); + return *this; } #endif diff --git a/src/Magnum/GL/MeshView.h b/src/Magnum/GL/MeshView.h index 87aa55972..047440558 100644 --- a/src/Magnum/GL/MeshView.h +++ b/src/Magnum/GL/MeshView.h @@ -235,6 +235,7 @@ class MAGNUM_GL_EXPORT MeshView { /** * @brief Draw the mesh + * @return Reference to self (for method chaining) * * See @ref Mesh::draw(AbstractShaderProgram&) for more information. * @see @ref draw(AbstractShaderProgram&, std::initializer_list>), @@ -254,12 +255,15 @@ class MAGNUM_GL_EXPORT MeshView { * @requires_gl Specifying base vertex for indexed meshes is not * available in OpenGL ES or WebGL. */ - void draw(AbstractShaderProgram& shader); - void draw(AbstractShaderProgram&& shader) { draw(shader); } /**< @overload */ + MeshView& draw(AbstractShaderProgram& shader); + MeshView& draw(AbstractShaderProgram&& shader) { + return draw(shader); + } /**< @overload */ #ifndef MAGNUM_TARGET_GLES /** * @brief Draw the mesh with vertices coming out of transform feedback + * @return Reference to self (for method chaining) * * Everything set by @ref setCount(), @ref setBaseInstance(), * @ref setBaseVertex(), @ref setIndexRange() and @ref Mesh::setIndexBuffer() @@ -274,12 +278,10 @@ class MAGNUM_GL_EXPORT MeshView { * @requires_gl42 Extension @gl_extension{ARB,transform_feedback_instanced} * if @ref instanceCount() is more than `1`. */ - void draw(AbstractShaderProgram& shader, TransformFeedback& xfb, UnsignedInt stream = 0); - - /** @overload */ - void draw(AbstractShaderProgram&& shader, TransformFeedback& xfb, UnsignedInt stream = 0) { - draw(shader, xfb, stream); - } + MeshView& draw(AbstractShaderProgram& shader, TransformFeedback& xfb, UnsignedInt stream = 0); + MeshView& draw(AbstractShaderProgram&& shader, TransformFeedback& xfb, UnsignedInt stream = 0) { + return draw(shader, xfb, stream); + } /**< @overload */ #endif private: