Browse Source

python: expose basic Framebuffer.

pull/2/head
Vladimír Vondruš 7 years ago
parent
commit
2ac4ca3338
  1. 7
      src/python/magnum/PyGL.h
  2. 39
      src/python/magnum/gl.cpp
  3. 17
      src/python/magnum/test/test_gl_gl.py

7
src/python/magnum/PyGL.h

@ -28,6 +28,7 @@
#include <pybind11/pybind11.h>
#include <vector>
#include <Magnum/GL/Mesh.h>
#include <Magnum/GL/Framebuffer.h>
#include "magnum/bootstrap.h"
@ -41,6 +42,12 @@ struct PyMesh: GL::Mesh {
std::vector<py::object> buffers;
};
struct PyFramebuffer: GL::Framebuffer {
explicit PyFramebuffer(const Range2Di& viewport): GL::Framebuffer{viewport} {}
std::vector<py::object> attached;
};
}
#endif

39
src/python/magnum/gl.cpp

@ -31,6 +31,7 @@
#include <Magnum/GL/Attribute.h>
#include <Magnum/GL/Buffer.h>
#include <Magnum/GL/DefaultFramebuffer.h>
#include <Magnum/GL/Framebuffer.h>
#include <Magnum/GL/Mesh.h>
#include <Magnum/GL/Renderer.h>
#include <Magnum/GL/Renderbuffer.h>
@ -46,6 +47,13 @@
namespace magnum {
void gl(py::module& m) {
/*
Missing APIs:
GL object labels
limit queries
*/
m.doc() = "OpenGL wrapping layer";
/* Abstract shader program */
@ -292,6 +300,37 @@ void gl(py::module& m) {
NonDestructibleBase<GL::DefaultFramebuffer, GL::AbstractFramebuffer> defaultFramebuffer{m,
"DefaultFramebuffer", "Default framebuffer"};
NonDestructibleBase<PyFramebuffer, GL::AbstractFramebuffer> framebuffer{m,
"Framebuffer", "Framebuffer"};
py::class_<GL::Framebuffer::ColorAttachment>{framebuffer, "ColorAttachment", "Color attachment"}
.def(py::init<UnsignedByte>(), "Constructor");
py::class_<GL::Framebuffer::BufferAttachment>{framebuffer, "BufferAttachment", "Buffer attachment"}
.def(py::init<GL::Framebuffer::ColorAttachment>(), "Color buffer")
.def_readonly_static("DEPTH", &GL::Framebuffer::BufferAttachment::Depth, "Depth buffer")
.def_readonly_static("STENCIL", &GL::Framebuffer::BufferAttachment::Stencil, "Stencil buffer")
#if !defined(MAGNUM_TARGET_GLES2) || defined(MAGNUM_TARGET_WEBGL)
.def_readonly_static("DEPTH_STENCIL", &GL::Framebuffer::BufferAttachment::DepthStencil, "Both depth and stencil buffer")
#endif
;
py::implicitly_convertible<GL::Framebuffer::ColorAttachment, GL::Framebuffer::BufferAttachment>();
framebuffer
.def(py::init<const Range2Di&>(), "Constructor")
.def_property_readonly("id", &GL::Framebuffer::id, "OpenGL framebuffer ID")
.def("attach_renderbuffer", [](PyFramebuffer& self, GL::Framebuffer::BufferAttachment attachment, GL::Renderbuffer& renderbuffer) {
self.attachRenderbuffer(attachment, renderbuffer);
/* Keep a reference to the renderbuffer to avoid it being deleted
before the framebuffer */
/** @todo isn't there an API for this? */
self.attached.emplace_back(py::detail::get_object_handle(&renderbuffer, py::detail::get_type_info(typeid(GL::Renderbuffer))), true);
}, "Attach renderbuffer to given buffer")
.def_readonly("attached", &PyFramebuffer::attached, "Renderbuffer and texture objects referenced by the framebuffer");
/* An equivalent to this would be
m.attr("default_framebuffer") = &GL::defaultFramebuffer;
(have to use a & to make it choose return_value_policy::reference

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

@ -57,6 +57,23 @@ class DefaultFramebuffer(GLTestCase):
# Using it should not crash, leak or cause double-free issues
self.assertTrue(gl.default_framebuffer is not None)
class Framebuffer(GLTestCase):
def test(self):
framebuffer = gl.Framebuffer(((0, 0), (4, 4)))
self.assertNotEqual(framebuffer.id, 0)
self.assertEqual(len(framebuffer.attached), 0)
def test_attach(self):
renderbuffer = gl.Renderbuffer()
renderbuffer.set_storage(gl.RenderbufferFormat.RGBA8, (4, 4))
renderbuffer_refcount = sys.getrefcount(renderbuffer)
framebuffer = gl.Framebuffer(((0, 0), (4, 4)))
framebuffer.attach_renderbuffer(gl.Framebuffer.ColorAttachment(0), renderbuffer)
self.assertEqual(len(framebuffer.attached), 1)
self.assertIs(framebuffer.attached[0], renderbuffer)
self.assertEqual(sys.getrefcount(renderbuffer), renderbuffer_refcount + 1)
class Mesh(GLTestCase):
def test_init(self):
a = gl.Mesh()

Loading…
Cancel
Save