Python API: allow passing None to some BGL functions instead of bgl.Buffer
authorBrecht Van Lommel <brechtvanlommel@gmail.com>
Tue, 26 Mar 2019 18:48:44 +0000 (19:48 +0100)
committerBrecht Van Lommel <brechtvanlommel@gmail.com>
Tue, 26 Mar 2019 18:56:43 +0000 (19:56 +0100)
Many OpenGL functions take NULL pointers, passing those was quite complicated
with some addons even using ctypes to manipulate internal bgl.Buffer pointers.

source/blender/python/generic/bgl.c

index 0828024..13342b7 100644 (file)
 #define GLclampfP_def(number) Buffer *bgl_buffer##number
 #endif
 
-#define GLvoidP_str     "O!"
-#define GLvoidP_var(number) (bgl_buffer##number)->buf.asvoid
-#define GLvoidP_ref(number) &BGL_bufferType, &bgl_buffer##number
+#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 GLsizeiP_str     "O!"
@@ -703,6 +703,22 @@ 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)
+{
+       if (object == Py_None) {
+               *buffer = NULL;
+               return 1;
+       }
+       else if (PyObject_TypeCheck(object, &BGL_bufferType)) {
+               *buffer = (Buffer *)object;
+               return 1;
+       }
+       else {
+               PyErr_SetString(PyExc_TypeError, "expected a bgl.Buffer or None");
+               return 0;
+       }
+}
 
 #define MAX_DIMENSIONS  256
 static PyObject *Buffer_new(PyTypeObject *UNUSED(type), PyObject *args, PyObject *kwds)