[Bf-blender-cvs] [5cfeba72f11] master: Python API: allow passing integer to some BGL functions instead of bgl.Buffer

Brecht Van Lommel noreply at git.blender.org
Thu Apr 18 14:34:07 CEST 2019


Commit: 5cfeba72f117b7dc6d6eba22e3f203fc3f574429
Author: Brecht Van Lommel
Date:   Thu Apr 18 11:24:39 2019 +0200
Branches: master
https://developer.blender.org/rB5cfeba72f117b7dc6d6eba22e3f203fc3f574429

Python API: allow passing integer to some BGL functions instead of bgl.Buffer

These parameters can be both pointers and offsets into a bound buffer, so we
need to support both even if it's possible to cause crashes this way.

===================================================================

M	source/blender/python/generic/bgl.c

===================================================================

diff --git a/source/blender/python/generic/bgl.c b/source/blender/python/generic/bgl.c
index 02cad742ed9..23be0d68fb0 100644
--- a/source/blender/python/generic/bgl.c
+++ b/source/blender/python/generic/bgl.c
@@ -130,10 +130,17 @@
 #  define GLclampfP_def(number) Buffer *bgl_buffer##number
 #endif
 
+typedef struct BufferOrOffset {
+  Buffer *buffer;
+  void *offset;
+} BufferOrOffset;
+
 #define GLvoidP_str "O&"
-#define GLvoidP_var(number) ((bgl_buffer##number) ? (bgl_buffer##number)->buf.asvoid : NULL)
-#define GLvoidP_ref(number) BGL_BufferOrNoneConverter, &bgl_buffer##number
-#define GLvoidP_def(number) Buffer *bgl_buffer##number
+#define GLvoidP_var(number) \
+  ((bgl_buffer##number.buffer) ? (bgl_buffer##number.buffer)->buf.asvoid : \
+                                 (bgl_buffer##number.offset))
+#define GLvoidP_ref(number) BGL_BufferOrOffsetConverter, &bgl_buffer##number
+#define GLvoidP_def(number) BufferOrOffset bgl_buffer##number
 
 #define GLsizeiP_str "O!"
 #define GLsizeiP_var(number) (bgl_buffer##number)->buf.asvoid
@@ -688,15 +695,29 @@ Buffer *BGL_MakeBuffer(int type, int ndimensions, int *dimensions, void *initbuf
   return buffer;
 }
 
-/* Custom converter function so we can support a buffer or NULL. */
-static int BGL_BufferOrNoneConverter(PyObject *object, Buffer **buffer)
+/* Custom converter function so we can support a buffer, an integer or NULL.
+ * Many OpenGL API functions can accept both an actual pointer or an offset
+ * into a buffer that is already bound. */
+static int BGL_BufferOrOffsetConverter(PyObject *object, BufferOrOffset *buffer)
 {
   if (object == Py_None) {
-    *buffer = NULL;
+    buffer->buffer = NULL;
+    buffer->offset = NULL;
+    return 1;
+  }
+  else if (PyNumber_Check(object)) {
+    Py_ssize_t offset = PyNumber_AsSsize_t(object, PyExc_IndexError);
+    if (offset == -1 && PyErr_Occurred()) {
+      return 0;
+    }
+
+    buffer->buffer = NULL;
+    buffer->offset = (void *)offset;
     return 1;
   }
   else if (PyObject_TypeCheck(object, &BGL_bufferType)) {
-    *buffer = (Buffer *)object;
+    buffer->buffer = (Buffer *)object;
+    buffer->offset = NULL;
     return 1;
   }
   else {



More information about the Bf-blender-cvs mailing list