Browse Source

python: bind framebuffer reading.

pull/2/head
Vladimír Vondruš 7 years ago
parent
commit
3b7cfa4117
  1. 4
      src/python/magnum/CMakeLists.txt
  2. 8
      src/python/magnum/gl.cpp
  3. 17
      src/python/magnum/test/test_gl_gl.py

4
src/python/magnum/CMakeLists.txt

@ -74,7 +74,9 @@ set(magnum_trade_SRCS
if(NOT MAGNUM_BUILD_STATIC)
if(Magnum_GL_FOUND)
pybind11_add_module(magnum_gl SYSTEM ${magnum_gl_SRCS})
target_include_directories(magnum_gl PRIVATE ${PROJECT_SOURCE_DIR}/src/python)
target_include_directories(magnum_gl PRIVATE
${PROJECT_SOURCE_DIR}/src
${PROJECT_SOURCE_DIR}/src/python)
target_link_libraries(magnum_gl PRIVATE Magnum::GL)
set_target_properties(magnum_gl PROPERTIES
FOLDER "python"

8
src/python/magnum/gl.cpp

@ -27,6 +27,7 @@
#include <pybind11/stl.h> /* for Mesh.buffers */
#include <Corrade/Containers/ArrayView.h>
#include <Corrade/Utility/FormatStl.h>
#include <Magnum/ImageView.h>
#include <Magnum/GL/AbstractShaderProgram.h>
#include <Magnum/GL/Attribute.h>
#include <Magnum/GL/Buffer.h>
@ -38,6 +39,8 @@
#include <Magnum/GL/RenderbufferFormat.h>
#include <Magnum/Math/Color.h>
#include "Magnum/Python.h"
#include "corrade/PyArrayView.h"
#include "corrade/EnumOperators.h"
#include "magnum/bootstrap.h"
@ -295,7 +298,10 @@ void gl(py::module& m) {
/* Using lambdas to avoid method chaining getting into signatures */
.def("clear", [](GL::AbstractFramebuffer& self, GL::FramebufferClear mask) {
self.clear(mask);
});
}, "Clear specified buffers in the framebuffer")
.def("read", [](GL::AbstractFramebuffer& self, const Range2Di& rectangle, PyImageView<2, char>& image) {
self.read(rectangle, image);
}, "Read block of pixels from the framebuffer to an image view");
NonDestructibleBase<GL::DefaultFramebuffer, GL::AbstractFramebuffer> defaultFramebuffer{m,
"DefaultFramebuffer", "Default framebuffer"};

17
src/python/magnum/test/test_gl_gl.py

@ -74,6 +74,23 @@ class Framebuffer(GLTestCase):
self.assertIs(framebuffer.attached[0], renderbuffer)
self.assertEqual(sys.getrefcount(renderbuffer), renderbuffer_refcount + 1)
def test_read(self):
renderbuffer = gl.Renderbuffer()
renderbuffer.set_storage(gl.RenderbufferFormat.RGBA8, (4, 4))
framebuffer = gl.Framebuffer(((0, 0), (4, 4)))
framebuffer.attach_renderbuffer(gl.Framebuffer.ColorAttachment(0), renderbuffer)
gl.Renderer.clear_color = Color4(1.0, 0.5, 0.75)
framebuffer.clear(gl.FramebufferClear.COLOR)
a = MutableImageView2D(PixelFormat.RGBA8UNORM, (2, 2), bytearray(16))
framebuffer.read(Range2Di.from_size((1, 1), (2, 2)), a)
self.assertEqual(a.size, Vector2i(2, 2))
self.assertEqual(ord(a.pixels[0, 0, 0]), 0xff)
self.assertEqual(ord(a.pixels[0, 1, 1]), 0x80)
self.assertEqual(ord(a.pixels[1, 0, 2]), 0xbf)
class Mesh(GLTestCase):
def test_init(self):
a = gl.Mesh()

Loading…
Cancel
Save