41#ifdef WITH_OPENGL_BACKEND
42static void report_deprecated_call(
const char *function_name)
52 "'bgl.gl%s' is deprecated and will not work on all platforms. Report or update your "
53 "script to use 'gpu' module.",
56 PyErr_WarnEx(PyExc_DeprecationWarning, message, 1);
60static void report_deprecated_call_to_user()
63 if (
G.opengl_deprecation_usage_detected) {
66 G.opengl_deprecation_usage_detected =
true;
67 PyC_FileAndNum(&
G.opengl_deprecation_usage_filename, &
G.opengl_deprecation_usage_lineno);
86#define void_ref(num) &bgl_var##num
87#define void_def(num) char bgl_var##num
90# define buffer_str "O!"
91# define buffer_var(number) (bgl_buffer##number)->buf.asvoid
92# define buffer_ref(number) &BGL_bufferType, &bgl_buffer##number
93# define buffer_def(number) Buffer *bgl_buffer##number
99#define GLbooleanP_str "O!"
100#define GLbooleanP_var(number) (bgl_buffer##number)->buf.asvoid
101#define GLbooleanP_ref(number) &BGL_bufferType, &bgl_buffer##number
102#define GLbooleanP_def(number) Buffer *bgl_buffer##number
104#define GLbyteP_str "O!"
105#define GLbyteP_var(number) (bgl_buffer##number)->buf.asvoid
106#define GLbyteP_ref(number) &BGL_bufferType, &bgl_buffer##number
107#define GLbyteP_def(number) Buffer *bgl_buffer##number
109#define GLubyteP_str "O!"
110#define GLubyteP_var(number) (bgl_buffer##number)->buf.asvoid
111#define GLubyteP_ref(number) &BGL_bufferType, &bgl_buffer##number
112#define GLubyteP_def(number) Buffer *bgl_buffer##number
114#define GLintP_str "O!"
115#define GLintP_var(number) (bgl_buffer##number)->buf.asvoid
116#define GLintP_ref(number) &BGL_bufferType, &bgl_buffer##number
117#define GLintP_def(number) Buffer *bgl_buffer##number
119#define GLint64P_str "O!"
120#define GLint64P_var(number) (bgl_buffer##number)->buf.asvoid
121#define GLint64P_ref(number) &BGL_bufferType, &bgl_buffer##number
122#define GLint64P_def(number) Buffer *bgl_buffer##number
124#define GLenumP_str "O!"
125#define GLenumP_var(number) (bgl_buffer##number)->buf.asvoid
126#define GLenumP_ref(number) &BGL_bufferType, &bgl_buffer##number
127#define GLenumP_def(number) Buffer *bgl_buffer##number
129#define GLuintP_str "O!"
130#define GLuintP_var(number) (bgl_buffer##number)->buf.asvoid
131#define GLuintP_ref(number) &BGL_bufferType, &bgl_buffer##number
132#define GLuintP_def(number) Buffer *bgl_buffer##number
135# define GLuint64P_str "O!"
136# define GLuint64P_var(number) (bgl_buffer##number)->buf.asvoid
137# define GLuint64P_ref(number) &BGL_bufferType, &bgl_buffer##number
138# define GLuint64P_def(number) Buffer *bgl_buffer##number
141#define GLshortP_str "O!"
142#define GLshortP_var(number) (bgl_buffer##number)->buf.asvoid
143#define GLshortP_ref(number) &BGL_bufferType, &bgl_buffer##number
144#define GLshortP_def(number) Buffer *bgl_buffer##number
146#define GLushortP_str "O!"
147#define GLushortP_var(number) (bgl_buffer##number)->buf.asvoid
148#define GLushortP_ref(number) &BGL_bufferType, &bgl_buffer##number
149#define GLushortP_def(number) Buffer *bgl_buffer##number
151#define GLfloatP_str "O!"
152#define GLfloatP_var(number) (bgl_buffer##number)->buf.asvoid
153#define GLfloatP_ref(number) &BGL_bufferType, &bgl_buffer##number
154#define GLfloatP_def(number) Buffer *bgl_buffer##number
156#define GLdoubleP_str "O!"
157#define GLdoubleP_var(number) (bgl_buffer##number)->buf.asvoid
158#define GLdoubleP_ref(number) &BGL_bufferType, &bgl_buffer##number
159#define GLdoubleP_def(number) Buffer *bgl_buffer##number
162# define GLclampfP_str "O!"
163# define GLclampfP_var(number) (bgl_buffer##number)->buf.asvoid
164# define GLclampfP_ref(number) &BGL_bufferType, &bgl_buffer##number
165# define GLclampfP_def(number) Buffer *bgl_buffer##number
173#define GLvoidP_str "O&"
174#define GLvoidP_var(number) \
175 ((bgl_buffer##number.buffer) ? (bgl_buffer##number.buffer)->buf.asvoid : \
176 (bgl_buffer##number.offset))
177#define GLvoidP_ref(number) BGL_BufferOrOffsetConverter, &bgl_buffer##number
178#define GLvoidP_def(number) BufferOrOffset bgl_buffer##number
180#define GLsizeiP_str "O!"
181#define GLsizeiP_var(number) (bgl_buffer##number)->buf.asvoid
182#define GLsizeiP_ref(number) &BGL_bufferType, &bgl_buffer##number
183#define GLsizeiP_def(number) Buffer *bgl_buffer##number
185#define GLcharP_str "O!"
186#define GLcharP_var(number) (bgl_buffer##number)->buf.asvoid
187#define GLcharP_ref(number) &BGL_bufferType, &bgl_buffer##number
188#define GLcharP_def(number) Buffer *bgl_buffer##number
191# define buffer_str "O!"
192# define buffer_var(number) (bgl_buffer##number)->buf.asvoid
193# define buffer_ref(number) &BGL_bufferType, &bgl_buffer##number
194# define buffer_def(number) Buffer *bgl_buffer##number
206#define GLenum_str "i"
207#define GLenum_var(num) bgl_var##num
208#define GLenum_ref(num) &bgl_var##num
209#define GLenum_def(num) int GLenum_var(num)
212#define GLboolean_str "b"
213#define GLboolean_var(num) bgl_var##num
214#define GLboolean_ref(num) &bgl_var##num
215#define GLboolean_def(num) char GLboolean_var(num)
218#define GLbitfield_str "i"
219#define GLbitfield_var(num) bgl_var##num
220#define GLbitfield_ref(num) &bgl_var##num
221#define GLbitfield_def(num) int GLbitfield_var(num)
225# define GLbyte_str "b"
226# define GLbyte_var(num) bgl_var##num
227# define GLbyte_ref(num) &bgl_var##num
228# define GLbyte_def(num) signed char GLbyte_var(num)
232#define GLshort_str "h"
233#define GLshort_var(num) bgl_var##num
234#define GLshort_ref(num) &bgl_var##num
235#define GLshort_def(num) short GLshort_var(num)
239#define GLint_var(num) bgl_var##num
240#define GLint_ref(num) &bgl_var##num
241#define GLint_def(num) int GLint_var(num)
244#define GLsizei_str "n"
245#define GLsizei_var(num) bgl_var##num
246#define GLsizei_ref(num) &bgl_var##num
247#define GLsizei_def(num) size_t GLsizei_var(num)
250#define GLsizeiptr_str "n"
251#define GLsizeiptr_var(num) bgl_var##num
252#define GLsizeiptr_ref(num) &bgl_var##num
253#define GLsizeiptr_def(num) size_t GLsizeiptr_var(num)
256#define GLintptr_str "n"
257#define GLintptr_var(num) bgl_var##num
258#define GLintptr_ref(num) &bgl_var##num
259#define GLintptr_def(num) size_t GLintptr_var(num)
262#define GLubyte_str "B"
263#define GLubyte_var(num) bgl_var##num
264#define GLubyte_ref(num) &bgl_var##num
265#define GLubyte_def(num) char GLubyte_var(num)
269# define GLushort_str "H"
270# define GLushort_var(num) bgl_var##num
271# define GLushort_ref(num) &bgl_var##num
272# define GLushort_def(num) short GLushort_var(num)
276#define GLuint_str "I"
277#define GLuint_var(num) bgl_var##num
278#define GLuint_ref(num) &bgl_var##num
279#define GLuint_def(num) int GLuint_var(num)
283# define GLuint64_str "Q"
284# define GLuint64_var(num) bgl_var##num
285# define GLuint64_ref(num) &bgl_var##num
286# define GLuint64_def(num) int GLuint64_var(num)
291# define GLsync_str "I"
292# define GLsync_var(num) bgl_var##num
293# define GLsync_ref(num) &bgl_var##num
294# define GLsync_def(num) int GLsync_var(num)
298#define GLfloat_str "f"
299#define GLfloat_var(num) bgl_var##num
300#define GLfloat_ref(num) &bgl_var##num
301#define GLfloat_def(num) float GLfloat_var(num)
304#define GLstring_str "s"
305#define GLstring_var(number) bgl_var##number
306#define GLstring_ref(number) &bgl_var##number
307#define GLstring_def(number) char *GLstring_var(number)
311# define GLclampf_str "f"
312# define GLclampf_var(num) bgl_var##num
313# define GLclampf_ref(num) &bgl_var##num
314# define GLclampf_def(num) float GLclampf_var(num)
318#define GLdouble_str "d"
319#define GLdouble_var(num) bgl_var##num
320#define GLdouble_ref(num) &bgl_var##num
321#define GLdouble_def(num) double GLdouble_var(num)
325# define GLclampd_str "d"
326# define GLclampd_var(num) bgl_var##num
327# define GLclampd_ref(num) &bgl_var##num
328# define GLclampd_def(num) double GLclampd_var(num)
331#define _arg_def1(a1) a1##_def(1)
332#define _arg_def2(a1, a2) \
335#define _arg_def3(a1, a2, a3) \
338#define _arg_def4(a1, a2, a3, a4) \
339 _arg_def3(a1, a2, a3); \
341#define _arg_def5(a1, a2, a3, a4, a5) \
342 _arg_def4(a1, a2, a3, a4); \
344#define _arg_def6(a1, a2, a3, a4, a5, a6) \
345 _arg_def5(a1, a2, a3, a4, a5); \
347#define _arg_def7(a1, a2, a3, a4, a5, a6, a7) \
348 _arg_def6(a1, a2, a3, a4, a5, a6); \
350#define _arg_def8(a1, a2, a3, a4, a5, a6, a7, a8) \
351 _arg_def7(a1, a2, a3, a4, a5, a6, a7); \
353#define _arg_def9(a1, a2, a3, a4, a5, a6, a7, a8, a9) \
354 _arg_def8(a1, a2, a3, a4, a5, a6, a7, a8); \
356#define _arg_def10(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) \
357 _arg_def9(a1, a2, a3, a4, a5, a6, a7, a8, a9); \
359#define _arg_def11(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) \
360 _arg_def10(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10); \
362#define arg_def(...) VA_NARGS_CALL_OVERLOAD(_arg_def, __VA_ARGS__)
364#define _arg_var1(a1) a1##_var(1)
365#define _arg_var2(a1, a2) _arg_var1(a1), a2##_var(2)
366#define _arg_var3(a1, a2, a3) _arg_var2(a1, a2), a3##_var(3)
367#define _arg_var4(a1, a2, a3, a4) _arg_var3(a1, a2, a3), a4##_var(4)
368#define _arg_var5(a1, a2, a3, a4, a5) _arg_var4(a1, a2, a3, a4), a5##_var(5)
369#define _arg_var6(a1, a2, a3, a4, a5, a6) _arg_var5(a1, a2, a3, a4, a5), a6##_var(6)
370#define _arg_var7(a1, a2, a3, a4, a5, a6, a7) _arg_var6(a1, a2, a3, a4, a5, a6), a7##_var(7)
371#define _arg_var8(a1, a2, a3, a4, a5, a6, a7, a8) \
372 _arg_var7(a1, a2, a3, a4, a5, a6, a7), a8##_var(8)
373#define _arg_var9(a1, a2, a3, a4, a5, a6, a7, a8, a9) \
374 _arg_var8(a1, a2, a3, a4, a5, a6, a7, a8), a9##_var(9)
375#define _arg_var10(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) \
376 _arg_var9(a1, a2, a3, a4, a5, a6, a7, a8, a9), a10##_var(10)
377#define _arg_var11(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) \
378 _arg_var10(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10), a11##_var(11)
379#define arg_var(...) VA_NARGS_CALL_OVERLOAD(_arg_var, __VA_ARGS__)
381#define _arg_ref1(a1) a1##_ref(1)
382#define _arg_ref2(a1, a2) _arg_ref1(a1), a2##_ref(2)
383#define _arg_ref3(a1, a2, a3) _arg_ref2(a1, a2), a3##_ref(3)
384#define _arg_ref4(a1, a2, a3, a4) _arg_ref3(a1, a2, a3), a4##_ref(4)
385#define _arg_ref5(a1, a2, a3, a4, a5) _arg_ref4(a1, a2, a3, a4), a5##_ref(5)
386#define _arg_ref6(a1, a2, a3, a4, a5, a6) _arg_ref5(a1, a2, a3, a4, a5), a6##_ref(6)
387#define _arg_ref7(a1, a2, a3, a4, a5, a6, a7) _arg_ref6(a1, a2, a3, a4, a5, a6), a7##_ref(7)
388#define _arg_ref8(a1, a2, a3, a4, a5, a6, a7, a8) \
389 _arg_ref7(a1, a2, a3, a4, a5, a6, a7), a8##_ref(8)
390#define _arg_ref9(a1, a2, a3, a4, a5, a6, a7, a8, a9) \
391 _arg_ref8(a1, a2, a3, a4, a5, a6, a7, a8), a9##_ref(9)
392#define _arg_ref10(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) \
393 _arg_ref9(a1, a2, a3, a4, a5, a6, a7, a8, a9), a10##_ref(10)
394#define _arg_ref11(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) \
395 _arg_ref10(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10), a11##_ref(11)
396#define arg_ref(...) VA_NARGS_CALL_OVERLOAD(_arg_ref, __VA_ARGS__)
398#define _arg_str1(a1) a1##_str
399#define _arg_str2(a1, a2) _arg_str1(a1) a2##_str
400#define _arg_str3(a1, a2, a3) _arg_str2(a1, a2) a3##_str
401#define _arg_str4(a1, a2, a3, a4) _arg_str3(a1, a2, a3) a4##_str
402#define _arg_str5(a1, a2, a3, a4, a5) _arg_str4(a1, a2, a3, a4) a5##_str
403#define _arg_str6(a1, a2, a3, a4, a5, a6) _arg_str5(a1, a2, a3, a4, a5) a6##_str
404#define _arg_str7(a1, a2, a3, a4, a5, a6, a7) _arg_str6(a1, a2, a3, a4, a5, a6) a7##_str
405#define _arg_str8(a1, a2, a3, a4, a5, a6, a7, a8) _arg_str7(a1, a2, a3, a4, a5, a6, a7) a8##_str
406#define _arg_str9(a1, a2, a3, a4, a5, a6, a7, a8, a9) \
407 _arg_str8(a1, a2, a3, a4, a5, a6, a7, a8) a9##_str
408#define _arg_str10(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) \
409 _arg_str9(a1, a2, a3, a4, a5, a6, a7, a8, a9) a10##_str
410#define _arg_str11(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) \
411 _arg_str10(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) a11##_str
412#define arg_str(...) VA_NARGS_CALL_OVERLOAD(_arg_str, __VA_ARGS__)
416#define ret_default_void
417#define ret_ret_void return Py_INCREF(Py_None), Py_None
419#define ret_def_GLint int ret_int
420#define ret_set_GLint ret_int =
421#define ret_default_GLint -1
422#define ret_ret_GLint return PyLong_FromLong(ret_int)
424#define ret_def_GLuint uint ret_uint
425#define ret_set_GLuint ret_uint =
426#define ret_default_GLuint 0
427#define ret_ret_GLuint return PyLong_FromLong(long(ret_uint))
430# define ret_def_GLsizei size_t ret_size_t
431# define ret_set_GLsizei ret_size_t =
432# define ret_ret_GLsizei return PyLong_FromSsize_t(ret_size_t)
436# define ret_def_GLsync uint ret_sync
437# define ret_set_GLsync ret_sync =
438# define ret_ret_GLsync return PyLong_FromLong(long(ret_sync))
441#define ret_def_GLenum uint ret_uint
442#define ret_set_GLenum ret_uint =
443#define ret_default_GLenum 0
444#define ret_ret_GLenum return PyLong_FromLong(long(ret_uint))
446#define ret_def_GLboolean uchar ret_bool
447#define ret_set_GLboolean ret_bool =
448#define ret_default_GLboolean GL_FALSE
449#define ret_ret_GLboolean return PyLong_FromLong(long(ret_bool))
451#define ret_def_GLstring \
452 const char *default_GLstring = ""; \
454#define ret_set_GLstring ret_str =
455#define ret_default_GLstring (const uchar *)default_GLstring
457#define ret_ret_GLstring \
459 return PyUnicode_FromString((const char *)ret_str); \
462 PyErr_SetString(PyExc_AttributeError, "could not get opengl string"); \
470static PyObject *
Buffer_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
493 return sizeof(short);
497 return sizeof(
float);
507 const Py_ssize_t itemsize = pybuffer->itemsize;
534 for (
int i = 0; i < ndim; i++) {
535 if (dim1[i] != dim2[i]) {
572 int i,
len =
self->dimensions[0];
573 PyObject *list = PyList_New(
len);
575 for (i = 0; i <
len; i++) {
586 if (
self->ndimensions > 1) {
587 int i,
len =
self->dimensions[0];
588 list = PyList_New(
len);
590 for (i = 0; i <
len; i++) {
605 PyObject *list = PyList_New(
self->ndimensions);
608 for (i = 0; i <
self->ndimensions; i++) {
609 PyList_SET_ITEM(list, i, PyLong_FromLong(
self->dimensions[i]));
615#if (defined(__GNUC__) && !defined(__clang__))
616# pragma GCC diagnostic push
617# pragma GCC diagnostic ignored "-Wcast-function-type"
622 {
nullptr,
nullptr, 0,
nullptr},
625#if (defined(__GNUC__) && !defined(__clang__))
626# pragma GCC diagnostic pop
631 {
nullptr,
nullptr,
nullptr,
nullptr,
nullptr},
635 PyVarObject_HEAD_INIT(
nullptr, 0)
687 PyObject *parent,
int type,
int ndimensions,
const int *dimensions,
void *buf)
695 MEM_mallocN(ndimensions *
sizeof(
int),
"Buffer dimensions"));
696 memcpy(buffer->
dimensions, dimensions, ndimensions *
sizeof(
int));
709 for (i = 0; i < ndimensions; i++) {
710 size *= dimensions[i];
718 memcpy(buffer->
buf.
asvoid, initbuffer, size);
726#ifdef WITH_OPENGL_BACKEND
730static int BGL_BufferOrOffsetConverter(PyObject *
object,
BufferOrOffset *buffer)
732 if (
object == Py_None) {
737 if (PyNumber_Check(
object)) {
738 const Py_ssize_t offset = PyNumber_AsSsize_t(
object, PyExc_IndexError);
739 if (offset == -1 && PyErr_Occurred()) {
744 buffer->
offset = (
void *)offset;
753 PyErr_SetString(PyExc_TypeError,
"expected a bgl.Buffer or None");
758#define MAX_DIMENSIONS 256
759static PyObject *
Buffer_new(PyTypeObject * , PyObject *args, PyObject *kwds)
761 PyObject *length_ob =
nullptr, *
init =
nullptr;
766 Py_ssize_t i, ndimensions = 0;
768 if (kwds && PyDict_Size(kwds)) {
769 PyErr_SetString(PyExc_TypeError,
"bgl.Buffer(): takes no keyword args");
773 if (!PyArg_ParseTuple(args,
"iO|O: bgl.Buffer", &type, &length_ob, &
init)) {
776 if (!
ELEM(type, GL_BYTE, GL_SHORT, GL_INT, GL_FLOAT, GL_DOUBLE)) {
777 PyErr_SetString(PyExc_AttributeError,
778 "invalid first argument type, should be one of "
779 "GL_BYTE, GL_SHORT, GL_INT, GL_FLOAT or GL_DOUBLE");
783 if (PyLong_Check(length_ob)) {
785 if ((dimensions[0] = PyLong_AsLong(length_ob)) < 1) {
786 PyErr_SetString(PyExc_AttributeError,
791 else if (PySequence_Check(length_ob)) {
792 ndimensions = PySequence_Size(length_ob);
794 PyErr_SetString(PyExc_AttributeError,
798 if (ndimensions < 1) {
799 PyErr_SetString(PyExc_AttributeError,
"sequence must have at least one dimension");
802 for (i = 0; i < ndimensions; i++) {
803 PyObject *ob = PySequence_GetItem(length_ob, i);
805 if (!PyLong_Check(ob)) {
809 dimensions[i] = PyLong_AsLong(ob);
813 if (dimensions[i] < 1) {
814 PyErr_SetString(PyExc_AttributeError,
821 PyErr_Format(PyExc_TypeError,
822 "invalid second argument expected a sequence "
823 "or an int, not a %.200s",
824 Py_TYPE(length_ob)->tp_name);
828 if (
init && PyObject_CheckBuffer(
init)) {
831 if (PyObject_GetBuffer(
init, &pybuffer, PyBUF_ND | PyBUF_FORMAT) == -1) {
837 PyErr_Format(PyExc_TypeError,
838 "`GL_TYPE` and `typestr` of object with buffer interface do not match. '%s'",
841 else if (ndimensions != pybuffer.ndim ||
844 PyErr_Format(PyExc_TypeError,
"array size does not match");
850 PyBuffer_Release(&pybuffer);
860 return (PyObject *)buffer;
872 if (i >=
self->dimensions[0] || i < 0) {
873 PyErr_SetString(PyExc_IndexError,
"array index out of range");
877 if (
self->ndimensions == 1) {
878 switch (
self->type) {
880 return Py_BuildValue(
"b",
self->buf.asbyte[i]);
882 return Py_BuildValue(
"h",
self->buf.asshort[i]);
884 return Py_BuildValue(
"i",
self->buf.asint[i]);
886 return PyFloat_FromDouble(
self->buf.asfloat[i]);
888 return Py_BuildValue(
"d",
self->buf.asdouble[i]);
894 for (j = 1; j <
self->ndimensions; j++) {
895 offset *=
self->dimensions[j];
900 self->ndimensions - 1,
901 self->dimensions + 1,
902 self->buf.asbyte + offset);
915 if (end >
self->dimensions[0]) {
916 end =
self->dimensions[0];
922 list = PyList_New(end - begin);
932 if (i >=
self->dimensions[0] || i < 0) {
933 PyErr_SetString(PyExc_IndexError,
"array assignment index out of range");
937 if (
self->ndimensions != 1) {
949 switch (
self->type) {
951 return PyArg_Parse(
v,
"b:Expected ints", &
self->buf.asbyte[i]) ? 0 : -1;
953 return PyArg_Parse(
v,
"h:Expected ints", &
self->buf.asshort[i]) ? 0 : -1;
955 return PyArg_Parse(
v,
"i:Expected ints", &
self->buf.asint[i]) ? 0 : -1;
957 return PyArg_Parse(
v,
"f:Expected floats", &
self->buf.asfloat[i]) ? 0 : -1;
959 return PyArg_Parse(
v,
"d:Expected floats", &
self->buf.asdouble[i]) ? 0 : -1;
974 if (end >
self->dimensions[0]) {
975 end =
self->dimensions[0];
981 if (!PySequence_Check(seq)) {
982 PyErr_Format(PyExc_TypeError,
983 "buffer[:] = value, invalid assignment. "
984 "Expected a sequence, not an %.200s type",
985 Py_TYPE(seq)->tp_name);
990 if ((
count = PySequence_Size(seq)) != (end - begin)) {
991 PyErr_Format(PyExc_TypeError,
992 "buffer[:] = value, size mismatch in assignment. "
993 "Expected: %d (given: %d)",
1000 item = PySequence_GetItem(seq,
count - begin);
1017 if (PyIndex_Check(item)) {
1019 i = PyNumber_AsSsize_t(item, PyExc_IndexError);
1020 if (i == -1 && PyErr_Occurred()) {
1024 i +=
self->dimensions[0];
1028 if (PySlice_Check(item)) {
1029 Py_ssize_t start, stop, step, slicelength;
1031 if (PySlice_GetIndicesEx(item,
self->dimensions[0], &start, &stop, &step, &slicelength) < 0) {
1035 if (slicelength <= 0) {
1036 return PyTuple_New(0);
1042 PyErr_SetString(PyExc_IndexError,
"slice steps not supported with vectors");
1047 PyExc_TypeError,
"buffer indices must be integers, not %.200s", Py_TYPE(item)->tp_name);
1053 if (PyIndex_Check(item)) {
1054 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
1055 if (i == -1 && PyErr_Occurred()) {
1059 i +=
self->dimensions[0];
1063 if (PySlice_Check(item)) {
1064 Py_ssize_t start, stop, step, slicelength;
1066 if (PySlice_GetIndicesEx(item,
self->dimensions[0], &start, &stop, &step, &slicelength) < 0) {
1074 PyErr_SetString(PyExc_IndexError,
"slice steps not supported with vectors");
1079 PyExc_TypeError,
"buffer indices must be integers, not %.200s", Py_TYPE(item)->tp_name);
1086 Py_DECREF(
self->parent);
1101 const char *typestr;
1103 switch (
self->type) {
1105 typestr =
"GL_BYTE";
1108 typestr =
"GL_SHORT";
1114 typestr =
"GL_FLOAT";
1117 typestr =
"GL_DOUBLE";
1120 typestr =
"UNKNOWN";
1124 repr = PyUnicode_FromFormat(
"Buffer(%s, %R)", typestr, list);
1136#ifdef WITH_OPENGL_BACKEND
1137# define BGL_Wrap(funcname, ret, arg_list) \
1138 static PyObject *Method_##funcname(PyObject * , PyObject *args) \
1142 report_deprecated_call(#funcname); \
1143 if (!PyArg_ParseTuple(args, arg_str arg_list, arg_ref arg_list)) { \
1146 const bool has_opengl_backend = GPU_backend_get_type() == GPU_BACKEND_OPENGL; \
1147 if (has_opengl_backend) { \
1149 ret_set_##ret gl##funcname(arg_var arg_list); \
1152 report_deprecated_call_to_user(); \
1153 ret_set_##ret ret_default_##ret; \
1161 PyErr_SetString(PyExc_RuntimeError,
"Built without OpenGL support");
1164# define BGL_Wrap(funcname, ret, arg_list) \
1165 static PyObject *Method_##funcname(PyObject * , PyObject *args) \
1168 bgl_no_opengl_error(); \
1176BGL_Wrap(ClearColor,
void, (GLfloat, GLfloat, GLfloat, GLfloat));
1179BGL_Wrap(ColorMask,
void, (GLboolean, GLboolean, GLboolean, GLboolean));
1196BGL_Wrap(GetTexImage,
void, (GLenum, GLint, GLenum, GLenum, GLvoidP));
1197BGL_Wrap(GetTexLevelParameterfv,
void, (GLenum, GLint, GLenum, GLfloatP));
1198BGL_Wrap(GetTexLevelParameteriv,
void, (GLenum, GLint, GLenum, GLintP));
1199BGL_Wrap(GetTexParameterfv,
void, (GLenum, GLenum, GLfloatP));
1200BGL_Wrap(GetTexParameteriv,
void, (GLenum, GLenum, GLintP));
1210BGL_Wrap(ReadPixels,
void, (GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, GLvoidP));
1211BGL_Wrap(Scissor,
void, (GLint, GLint, GLsizei, GLsizei));
1215BGL_Wrap(TexImage1D,
void, (GLenum, GLint, GLint, GLsizei, GLint, GLenum, GLenum, GLvoidP));
1218 (GLenum, GLint, GLint, GLsizei, GLsizei, GLint, GLenum, GLenum, GLvoidP));
1219BGL_Wrap(TexParameterf,
void, (GLenum, GLenum, GLfloat));
1220BGL_Wrap(TexParameterfv,
void, (GLenum, GLenum, GLfloatP));
1222BGL_Wrap(TexParameteriv,
void, (GLenum, GLenum, GLintP));
1223BGL_Wrap(Viewport,
void, (GLint, GLint, GLsizei, GLsizei));
1227BGL_Wrap(CopyTexImage1D,
void, (GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLint));
1228BGL_Wrap(CopyTexImage2D,
void, (GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLsizei, GLint));
1229BGL_Wrap(CopyTexSubImage1D,
void, (GLenum, GLint, GLint, GLint, GLint, GLsizei));
1230BGL_Wrap(CopyTexSubImage2D,
void, (GLenum, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei));
1233BGL_Wrap(DrawElements,
void, (GLenum, GLsizei, GLenum, GLvoidP));
1237BGL_Wrap(TexSubImage1D,
void, (GLenum, GLint, GLint, GLsizei, GLenum, GLenum, GLvoidP));
1240 (GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, GLvoidP));
1245 (GLenum, GLint, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei));
1246BGL_Wrap(DrawRangeElements,
void, (GLenum, GLuint, GLuint, GLsizei, GLenum, GLvoidP));
1249 (GLenum, GLint, GLint, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, GLvoidP));
1252 (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum, GLvoidP));
1256BGL_Wrap(CompressedTexImage1D,
void, (GLenum, GLint, GLenum, GLsizei, GLint, GLsizei, GLvoidP));
1259 (GLenum, GLint, GLenum, GLsizei, GLsizei, GLint, GLsizei, GLvoidP));
1262 (GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLsizei, GLvoidP));
1263BGL_Wrap(CompressedTexSubImage1D,
void, (GLenum, GLint, GLint, GLsizei, GLenum, GLsizei, GLvoidP));
1266 (GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLsizei, GLvoidP));
1268 CompressedTexSubImage3D,
1270 (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLsizei, GLvoidP));
1271BGL_Wrap(GetCompressedTexImage,
void, (GLenum, GLint, GLvoidP));
1275BGL_Wrap(BlendColor,
void, (GLfloat, GLfloat, GLfloat, GLfloat));
1281BGL_Wrap(BufferData,
void, (GLenum, GLsizeiptr, GLvoidP, GLenum));
1282BGL_Wrap(BufferSubData,
void, (GLenum, GLintptr, GLsizeiptr, GLvoidP));
1288BGL_Wrap(GetBufferParameteriv,
void, (GLenum, GLenum, GLintP));
1289BGL_Wrap(GetBufferPointerv,
void, (GLenum, GLenum, GLvoidP));
1290BGL_Wrap(GetBufferSubData,
void, (GLenum, GLintptr, GLsizeiptr, GLvoidP));
1291BGL_Wrap(GetQueryObjectiv,
void, (GLuint, GLenum, GLintP));
1292BGL_Wrap(GetQueryObjectuiv,
void, (GLuint, GLenum, GLuintP));
1301BGL_Wrap(BindAttribLocation,
void, (GLuint, GLuint, GLstring));
1302BGL_Wrap(BlendEquationSeparate,
void, (GLenum, GLenum));
1312BGL_Wrap(GetActiveAttrib,
void, (GLuint, GLuint, GLsizei, GLsizeiP, GLintP, GLenumP, GLcharP));
1313BGL_Wrap(GetActiveUniform,
void, (GLuint, GLuint, GLsizei, GLsizeiP, GLintP, GLenumP, GLcharP));
1314BGL_Wrap(GetAttachedShaders,
void, (GLuint, GLsizei, GLsizeiP, GLuintP));
1316BGL_Wrap(GetProgramInfoLog,
void, (GLuint, GLsizei, GLsizeiP, GLcharP));
1318BGL_Wrap(GetShaderInfoLog,
void, (GLuint, GLsizei, GLsizeiP, GLcharP));
1319BGL_Wrap(GetShaderSource,
void, (GLuint, GLsizei, GLsizeiP, GLcharP));
1321BGL_Wrap(GetUniformLocation, GLint, (GLuint, GLstring));
1322BGL_Wrap(GetUniformfv,
void, (GLuint, GLint, GLfloatP));
1324BGL_Wrap(GetVertexAttribPointerv,
void, (GLuint, GLenum, GLvoidP));
1325BGL_Wrap(GetVertexAttribdv,
void, (GLuint, GLenum, GLdoubleP));
1326BGL_Wrap(GetVertexAttribfv,
void, (GLuint, GLenum, GLfloatP));
1327BGL_Wrap(GetVertexAttribiv,
void, (GLuint, GLenum, GLintP));
1331BGL_Wrap(StencilFuncSeparate,
void, (GLenum, GLenum, GLint, GLuint));
1333BGL_Wrap(StencilOpSeparate,
void, (GLenum, GLenum, GLenum, GLenum));
1342BGL_Wrap(Uniform3f,
void, (GLint, GLfloat, GLfloat, GLfloat));
1344BGL_Wrap(Uniform3i,
void, (GLint, GLint, GLint, GLint));
1346BGL_Wrap(Uniform4f,
void, (GLint, GLfloat, GLfloat, GLfloat, GLfloat));
1348BGL_Wrap(Uniform4i,
void, (GLint, GLint, GLint, GLint, GLint));
1350BGL_Wrap(UniformMatrix2fv,
void, (GLint, GLsizei, GLboolean, GLfloatP));
1351BGL_Wrap(UniformMatrix3fv,
void, (GLint, GLsizei, GLboolean, GLfloatP));
1352BGL_Wrap(UniformMatrix4fv,
void, (GLint, GLsizei, GLboolean, GLfloatP));
1361BGL_Wrap(VertexAttrib2d,
void, (GLuint, GLdouble, GLdouble));
1363BGL_Wrap(VertexAttrib2f,
void, (GLuint, GLfloat, GLfloat));
1365BGL_Wrap(VertexAttrib2s,
void, (GLuint, GLshort, GLshort));
1367BGL_Wrap(VertexAttrib3d,
void, (GLuint, GLdouble, GLdouble, GLdouble));
1369BGL_Wrap(VertexAttrib3f,
void, (GLuint, GLfloat, GLfloat, GLfloat));
1371BGL_Wrap(VertexAttrib3s,
void, (GLuint, GLshort, GLshort, GLshort));
1376BGL_Wrap(VertexAttrib4Nub,
void, (GLuint, GLubyte, GLubyte, GLubyte, GLubyte));
1381BGL_Wrap(VertexAttrib4d,
void, (GLuint, GLdouble, GLdouble, GLdouble, GLdouble));
1383BGL_Wrap(VertexAttrib4f,
void, (GLuint, GLfloat, GLfloat, GLfloat, GLfloat));
1386BGL_Wrap(VertexAttrib4s,
void, (GLuint, GLshort, GLshort, GLshort, GLshort));
1391BGL_Wrap(VertexAttribPointer,
void, (GLuint, GLint, GLenum, GLboolean, GLsizei, GLvoidP));
1394BGL_Wrap(UniformMatrix2x3fv,
void, (GLint, GLsizei, GLboolean, GLfloatP));
1395BGL_Wrap(UniformMatrix2x4fv,
void, (GLint, GLsizei, GLboolean, GLfloatP));
1396BGL_Wrap(UniformMatrix3x2fv,
void, (GLint, GLsizei, GLboolean, GLfloatP));
1397BGL_Wrap(UniformMatrix3x4fv,
void, (GLint, GLsizei, GLboolean, GLfloatP));
1398BGL_Wrap(UniformMatrix4x2fv,
void, (GLint, GLsizei, GLboolean, GLfloatP));
1399BGL_Wrap(UniformMatrix4x3fv,
void, (GLint, GLsizei, GLboolean, GLfloatP));
1407 (GLint, GLint, GLint, GLint, GLint, GLint, GLint, GLint, GLbitfield, GLenum));
1410BGL_Wrap(DeleteRenderbuffers,
void, (GLsizei, GLuintP));
1412BGL_Wrap(FramebufferRenderbuffer,
void, (GLenum, GLenum, GLenum, GLuint));
1418BGL_Wrap(RenderbufferStorage,
void, (GLenum, GLenum, GLsizei, GLsizei));
1419BGL_Wrap(VertexAttribIPointer,
void, (GLuint, GLint, GLenum, GLsizei, GLvoidP));
1422BGL_Wrap(BindBufferBase,
void, (GLenum, GLuint, GLuint));
1423BGL_Wrap(BindBufferRange,
void, (GLenum, GLuint, GLuint, GLintptr, GLsizeiptr));
1424BGL_Wrap(GetActiveUniformBlockName,
void, (GLuint, GLuint, GLsizei, GLsizeiP, GLcharP));
1425BGL_Wrap(GetActiveUniformBlockiv,
void, (GLuint, GLuint, GLenum, GLintP));
1426BGL_Wrap(GetActiveUniformName,
void, (GLuint, GLuint, GLsizei, GLsizeiP, GLcharP));
1427BGL_Wrap(GetActiveUniformsiv,
void, (GLuint, GLsizei, GLuintP, GLenum, GLintP));
1428BGL_Wrap(GetIntegeri_v,
void, (GLenum, GLuint, GLintP));
1429BGL_Wrap(GetUniformBlockIndex, GLuint, (GLuint, GLstring));
1430BGL_Wrap(GetUniformIndices,
void, (GLuint, GLsizei, GLcharP, GLuintP));
1431BGL_Wrap(UniformBlockBinding,
void, (GLuint, GLuint, GLuint));
1434BGL_Wrap(FramebufferTexture,
void, (GLenum, GLenum, GLuint, GLint));
1435BGL_Wrap(GetBufferParameteri64v,
void, (GLenum, GLenum, GLint64P));
1436BGL_Wrap(GetInteger64i_v,
void, (GLenum, GLuint, GLint64P));
1437BGL_Wrap(GetMultisamplefv,
void, (GLenum, GLuint, GLfloatP));
1439BGL_Wrap(TexImage2DMultisample,
void, (GLenum, GLsizei, GLenum, GLsizei, GLsizei, GLboolean));
1442 (GLenum, GLsizei, GLenum, GLsizei, GLsizei, GLsizei, GLboolean));
1454 PyModuleDef_HEAD_INIT,
1468 PyDict_SetItemString(dict, name, item = PyLong_FromLong(value));
1475 PyDict_SetItemString(dict, name, item = PyLong_FromLongLong(value));
1481 PyMethodDef *method_def,
1486 m = PyCFunction_NewEx(method_def,
nullptr, submodule);
1487 PyDict_SetItemString(dict, method_def->ml_name, m);
1491 PyDict_SetItemString(dict, method_def->ml_name, Py_None);
1497# pragma GCC diagnostic ignored "-Waddress"
1500#ifdef WITH_OPENGL_BACKEND
1501# define PY_MOD_ADD_METHOD(func) \
1503 static PyMethodDef method_def = {"gl" #func, Method_##func, METH_VARARGS}; \
1504 py_module_dict_add_method(submodule, dict, &method_def, (gl##func != nullptr)); \
1508# define PY_MOD_ADD_METHOD(func) \
1510 static PyMethodDef method_def = {"gl" #func, Method_##func, METH_VARARGS}; \
1511 py_module_dict_add_method(submodule, dict, &method_def, false); \
1792#define PY_DICT_ADD_INT(x) py_module_dict_add_int(dict, #x, x)
1793#define PY_DICT_ADD_INT64(x) py_module_dict_add_int64(dict, #x, x)
2660 PyObject *submodule, *dict;
2662 dict = PyModule_GetDict(submodule);
2672#ifndef WITH_PYTHON_MODULE
2675 "'bgl' imported without an OpenGL backend. Please update your add-ons to use the "
2682 PyModule_AddObjectRef(submodule,
"Buffer", (PyObject *)&
BGL_bufferType);
2717 if (!PyArg_ParseTuple(args,
"Is", &shader, &source)) {
2722 glShaderSource(shader, 1, (
const char **)&source,
nullptr);
#define SNPRINTF(dst, format,...)
typedef double(DMatrix)[4][4]
#define CLOG_WARN(clg_ref,...)
eGPUBackendType GPU_backend_get_type()
Read Guarded memory(de)allocation.
static int gl_buffer_type_from_py_buffer(Py_buffer *pybuffer)
static void bgl_no_opengl_error()
static void py_module_dict_add_method(PyObject *submodule, PyObject *dict, PyMethodDef *method_def, bool is_valid)
static int Buffer_ass_subscript(Buffer *self, PyObject *item, PyObject *value)
static PyGetSetDef Buffer_getseters[]
static PyObject * Buffer_slice(Buffer *self, Py_ssize_t begin, Py_ssize_t end)
static void init_bgl_version_1_2_methods(PyObject *submodule, PyObject *dict)
static void Buffer_dealloc(Buffer *self)
static void init_bgl_version_3_0_constants(PyObject *dict)
int BGL_typeSize(int type)
PyTypeObject BGL_bufferType
static void init_bgl_version_3_0_methods(PyObject *submodule, PyObject *dict)
static PyObject * Buffer_dimensions(Buffer *self, void *)
static void py_module_dict_add_int(PyObject *dict, const char *name, int value)
static PySequenceMethods Buffer_SeqMethods
#define BGL_Wrap(funcname, ret, arg_list)
static void init_bgl_version_2_1_methods(PyObject *submodule, PyObject *dict)
static void init_bgl_version_1_3_methods(PyObject *submodule, PyObject *dict)
static void init_bgl_version_1_4_constants(PyObject *dict)
static PyObject * Buffer_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
static PyMappingMethods Buffer_AsMapping
static void init_bgl_version_3_2_methods(PyObject *submodule, PyObject *dict)
static PyModuleDef BGL_module_def
static Py_ssize_t Buffer_len(Buffer *self)
#define PY_DICT_ADD_INT(x)
static void init_bgl_version_1_0_methods(PyObject *submodule, PyObject *dict)
static int Buffer_ass_slice(Buffer *self, Py_ssize_t begin, Py_ssize_t end, PyObject *seq)
static void init_bgl_version_1_2_constants(PyObject *dict)
static Buffer * BGL_MakeBuffer_FromData(PyObject *parent, int type, int ndimensions, const int *dimensions, void *buf)
static void init_bgl_version_1_5_methods(PyObject *submodule, PyObject *dict)
static PyObject * Method_ShaderSource(PyObject *self, PyObject *args)
static void init_bgl_version_3_3_methods(PyObject *, PyObject *)
static PyObject * Buffer_to_list(Buffer *self)
static void init_bgl_version_2_1_constants(PyObject *dict)
static PyObject * Buffer_subscript(Buffer *self, PyObject *item)
#define PY_DICT_ADD_INT64(x)
static void init_bgl_version_1_1_constants(PyObject *dict)
#define PY_MOD_ADD_METHOD(func)
static PyObject * Buffer_item(Buffer *self, Py_ssize_t i)
static PyObject * Buffer_repr(Buffer *self)
static void init_bgl_version_1_4_methods(PyObject *submodule, PyObject *dict)
static PyMethodDef Buffer_methods[]
Buffer * BGL_MakeBuffer(int type, int ndimensions, const int *dimensions, const void *initbuffer)
static PyObject * Buffer_to_list_recursive(Buffer *self)
static void init_bgl_version_3_2_constants(PyObject *dict)
static void init_bgl_version_1_3_constants(PyObject *dict)
static void init_bgl_version_1_1_methods(PyObject *submodule, PyObject *dict)
static bool compare_dimensions(int ndim, const int *dim1, const Py_ssize_t *dim2)
static void init_bgl_version_2_0_constants(PyObject *dict)
static void init_bgl_version_2_0_methods(PyObject *submodule, PyObject *dict)
static void init_bgl_version_3_1_methods(PyObject *submodule, PyObject *dict)
static void init_bgl_version_1_5_constants(PyObject *dict)
static void py_module_dict_add_int64(PyObject *dict, const char *name, int64_t value)
static void init_bgl_version_3_3_constants(PyObject *dict)
static void init_bgl_version_3_1_constants(PyObject *dict)
static int Buffer_ass_item(Buffer *self, Py_ssize_t i, PyObject *v)
ATTR_WARN_UNUSED_RESULT const BMVert * v
draw_view in_light_buf[] float
draw_view push_constant(Type::INT, "radiance_src") .push_constant(Type capture_info_buf storage_buf(1, Qualifier::READ, "ObjectBounds", "bounds_buf[]") .push_constant(Type draw_view int
void *(* MEM_mallocN)(size_t len, const char *str)
void MEM_freeN(void *vmemh)
char PyC_StructFmt_type_from_str(const char *typestr)
bool PyC_StructFmt_type_is_int_any(char format)
bool PyC_StructFmt_type_is_byte(char format)
void PyC_FileAndNum(const char **r_filename, int *r_lineno)
bool PyC_StructFmt_type_is_float_any(char format)
PyObject_VAR_HEAD PyObject * parent