Browse Source

GL: Mesh::draw() and MeshView::draw() return a reference to self as well.

So it's possible to chain the draw() calls (for example with a different
shader).
pull/255/head
Vladimír Vondruš 8 years ago
parent
commit
4c29ff0d3b
  1. 3
      doc/changelog.dox
  2. 14
      src/Magnum/GL/Mesh.cpp
  3. 22
      src/Magnum/GL/Mesh.h
  4. 14
      src/Magnum/GL/MeshView.cpp
  5. 18
      src/Magnum/GL/MeshView.h

3
doc/changelog.dox

@ -70,6 +70,9 @@ See also:
@ref GL::Mesh::setIndexBuffer() can now take ownership of a passed @ref GL::Mesh::setIndexBuffer() can now take ownership of a passed
@ref GL::Buffer to simplify resource management on user side. See @ref GL::Buffer to simplify resource management on user side. See
@ref GL-Mesh-buffer-ownership for more information. @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 @subsubsection changelog-latest-changes-meshtools MeshTools library

14
src/Magnum/GL/Mesh.cpp

@ -352,11 +352,11 @@ Mesh& Mesh::setIndexBuffer(Buffer& buffer, const GLintptr offset, const MeshInde
return *this; return *this;
} }
void Mesh::draw(AbstractShaderProgram& shader) { Mesh& Mesh::draw(AbstractShaderProgram& shader) {
CORRADE_ASSERT(_countSet, "GL::Mesh::draw(): setCount() was never called, probably a mistake?", ); CORRADE_ASSERT(_countSet, "GL::Mesh::draw(): setCount() was never called, probably a mistake?", *this);
/* Nothing to draw, exit without touching any state */ /* Nothing to draw, exit without touching any state */
if(!_count || !_instanceCount) return; if(!_count || !_instanceCount) return *this;
shader.use(); shader.use();
@ -367,6 +367,8 @@ void Mesh::draw(AbstractShaderProgram& shader) {
#else #else
drawInternal(_count, _baseVertex, _instanceCount, _indexOffset); drawInternal(_count, _baseVertex, _instanceCount, _indexOffset);
#endif #endif
return *this;
} }
#ifndef MAGNUM_TARGET_GLES #ifndef MAGNUM_TARGET_GLES
@ -506,13 +508,13 @@ void Mesh::drawInternal(TransformFeedback& xfb, const UnsignedInt stream, const
(this->*state.unbindImplementation)(); (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 */ /* Nothing to draw, exit without touching any state */
if(!_instanceCount) return; if(!_instanceCount) return *this;
shader.use(); shader.use();
drawInternal(xfb, stream, _instanceCount); drawInternal(xfb, stream, _instanceCount);
return *this;
} }
#endif #endif

22
src/Magnum/GL/Mesh.h

@ -905,15 +905,14 @@ class MAGNUM_GL_EXPORT Mesh: public AbstractObject {
Mesh& setIndexBuffer(Buffer&& buffer, GLintptr offset, MeshIndexType type) { Mesh& setIndexBuffer(Buffer&& buffer, GLintptr offset, MeshIndexType type) {
return setIndexBuffer(std::move(buffer), offset, type, 0, 0); return setIndexBuffer(std::move(buffer), offset, type, 0, 0);
} }
/** @overload */
Mesh& setIndexBuffer(Buffer&& buffer, GLintptr offset, Magnum::MeshIndexType type) { Mesh& setIndexBuffer(Buffer&& buffer, GLintptr offset, Magnum::MeshIndexType type) {
return setIndexBuffer(std::move(buffer), offset, meshIndexType(type), 0, 0); return setIndexBuffer(std::move(buffer), offset, meshIndexType(type), 0, 0);
} } /**< @overload */
/** /**
* @brief Draw the mesh * @brief Draw the mesh
* @param shader Shader to use for drawing * @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 * 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 * 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 * @requires_gl Specifying base vertex for indexed meshes is not
* available in OpenGL ES or WebGL. * available in OpenGL ES or WebGL.
*/ */
void draw(AbstractShaderProgram& shader); Mesh& draw(AbstractShaderProgram& shader);
void draw(AbstractShaderProgram&& shader) { draw(shader); } /**< @overload */ Mesh& draw(AbstractShaderProgram&& shader) {
return draw(shader);
} /**< @overload */
#ifndef MAGNUM_TARGET_GLES #ifndef MAGNUM_TARGET_GLES
/** /**
@ -962,6 +963,7 @@ class MAGNUM_GL_EXPORT Mesh: public AbstractObject {
* @param shader Shader to use for drawing * @param shader Shader to use for drawing
* @param xfb Transform feedback to use for vertex count * @param xfb Transform feedback to use for vertex count
* @param stream Transform feedback stream ID * @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 * 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 * 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} * @requires_gl42 Extension @gl_extension{ARB,transform_feedback_instanced}
* if @ref instanceCount() is more than `1`. * if @ref instanceCount() is more than `1`.
*/ */
void draw(AbstractShaderProgram& shader, TransformFeedback& xfb, UnsignedInt stream = 0); Mesh& draw(AbstractShaderProgram& shader, TransformFeedback& xfb, UnsignedInt stream = 0);
Mesh& draw(AbstractShaderProgram&& shader, TransformFeedback& xfb, UnsignedInt stream = 0) {
/** @overload */ return draw(shader, xfb, stream);
void draw(AbstractShaderProgram&& shader, TransformFeedback& xfb, UnsignedInt stream = 0) { } /**< @overload */
draw(shader, xfb, stream);
}
#endif #endif
private: private:

14
src/Magnum/GL/MeshView.cpp

@ -145,11 +145,11 @@ MeshView& MeshView::setIndexRange(Int first) {
return *this; return *this;
} }
void MeshView::draw(AbstractShaderProgram& shader) { MeshView& MeshView::draw(AbstractShaderProgram& shader) {
CORRADE_ASSERT(_countSet, "GL::MeshView::draw(): setCount() was never called, probably a mistake?", ); CORRADE_ASSERT(_countSet, "GL::MeshView::draw(): setCount() was never called, probably a mistake?", *this);
/* Nothing to draw, exit without touching any state */ /* Nothing to draw, exit without touching any state */
if(!_count || !_instanceCount) return; if(!_count || !_instanceCount) return *this;
shader.use(); shader.use();
@ -160,16 +160,18 @@ void MeshView::draw(AbstractShaderProgram& shader) {
#else #else
_original.get().drawInternal(_count, _baseVertex, _instanceCount, _indexOffset); _original.get().drawInternal(_count, _baseVertex, _instanceCount, _indexOffset);
#endif #endif
return *this;
} }
#ifndef MAGNUM_TARGET_GLES #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 */ /* Nothing to draw, exit without touching any state */
if(!_instanceCount) return; if(!_instanceCount) return *this;
shader.use(); shader.use();
_original.get().drawInternal(xfb, stream, _instanceCount); _original.get().drawInternal(xfb, stream, _instanceCount);
return *this;
} }
#endif #endif

18
src/Magnum/GL/MeshView.h

@ -235,6 +235,7 @@ class MAGNUM_GL_EXPORT MeshView {
/** /**
* @brief Draw the mesh * @brief Draw the mesh
* @return Reference to self (for method chaining)
* *
* See @ref Mesh::draw(AbstractShaderProgram&) for more information. * See @ref Mesh::draw(AbstractShaderProgram&) for more information.
* @see @ref draw(AbstractShaderProgram&, std::initializer_list<std::reference_wrapper<MeshView>>), * @see @ref draw(AbstractShaderProgram&, std::initializer_list<std::reference_wrapper<MeshView>>),
@ -254,12 +255,15 @@ class MAGNUM_GL_EXPORT MeshView {
* @requires_gl Specifying base vertex for indexed meshes is not * @requires_gl Specifying base vertex for indexed meshes is not
* available in OpenGL ES or WebGL. * available in OpenGL ES or WebGL.
*/ */
void draw(AbstractShaderProgram& shader); MeshView& draw(AbstractShaderProgram& shader);
void draw(AbstractShaderProgram&& shader) { draw(shader); } /**< @overload */ MeshView& draw(AbstractShaderProgram&& shader) {
return draw(shader);
} /**< @overload */
#ifndef MAGNUM_TARGET_GLES #ifndef MAGNUM_TARGET_GLES
/** /**
* @brief Draw the mesh with vertices coming out of transform feedback * @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(), * Everything set by @ref setCount(), @ref setBaseInstance(),
* @ref setBaseVertex(), @ref setIndexRange() and @ref Mesh::setIndexBuffer() * @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} * @requires_gl42 Extension @gl_extension{ARB,transform_feedback_instanced}
* if @ref instanceCount() is more than `1`. * if @ref instanceCount() is more than `1`.
*/ */
void draw(AbstractShaderProgram& shader, TransformFeedback& xfb, UnsignedInt stream = 0); MeshView& draw(AbstractShaderProgram& shader, TransformFeedback& xfb, UnsignedInt stream = 0);
MeshView& draw(AbstractShaderProgram&& shader, TransformFeedback& xfb, UnsignedInt stream = 0) {
/** @overload */ return draw(shader, xfb, stream);
void draw(AbstractShaderProgram&& shader, TransformFeedback& xfb, UnsignedInt stream = 0) { } /**< @overload */
draw(shader, xfb, stream);
}
#endif #endif
private: private:

Loading…
Cancel
Save