From 3b7cfa411782ac4de35c06287e8dfba968218491 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Thu, 25 Jul 2019 19:27:49 +0200 Subject: [PATCH] python: bind framebuffer reading. --- src/python/magnum/CMakeLists.txt | 4 +++- src/python/magnum/gl.cpp | 8 +++++++- src/python/magnum/test/test_gl_gl.py | 17 +++++++++++++++++ 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/src/python/magnum/CMakeLists.txt b/src/python/magnum/CMakeLists.txt index 185733a..c570b16 100644 --- a/src/python/magnum/CMakeLists.txt +++ b/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" diff --git a/src/python/magnum/gl.cpp b/src/python/magnum/gl.cpp index cba85fa..6ddf372 100644 --- a/src/python/magnum/gl.cpp +++ b/src/python/magnum/gl.cpp @@ -27,6 +27,7 @@ #include /* for Mesh.buffers */ #include #include +#include #include #include #include @@ -38,6 +39,8 @@ #include #include +#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 defaultFramebuffer{m, "DefaultFramebuffer", "Default framebuffer"}; diff --git a/src/python/magnum/test/test_gl_gl.py b/src/python/magnum/test/test_gl_gl.py index b58c810..f4eadee 100644 --- a/src/python/magnum/test/test_gl_gl.py +++ b/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()