32#define USE_BGL_DEPRECATED_API
34#undef USE_BGL_DEPRECATED_API
42#ifdef WITH_OPENGL_BACKEND
43static void report_deprecated_call(
const char *function_name)
53 "'bgl.gl%s' is deprecated and will not work on all platforms. Report or update your "
54 "script to use 'gpu' module.",
57 PyErr_WarnEx(PyExc_DeprecationWarning, message, 1);
61static void report_deprecated_call_to_user()
64 if (
G.opengl_deprecation_usage_detected) {
67 G.opengl_deprecation_usage_detected =
true;
68 PyC_FileAndNum(&
G.opengl_deprecation_usage_filename, &
G.opengl_deprecation_usage_lineno);
87#define void_ref(num) &bgl_var##num
88#define void_def(num) char bgl_var##num
91# define buffer_str "O!"
92# define buffer_var(number) (bgl_buffer##number)->buf.asvoid
93# define buffer_ref(number) &BGL_bufferType, &bgl_buffer##number
94# define buffer_def(number) Buffer *bgl_buffer##number
100#define GLbooleanP_str "O!"
101#define GLbooleanP_var(number) (bgl_buffer##number)->buf.asvoid
102#define GLbooleanP_ref(number) &BGL_bufferType, &bgl_buffer##number
103#define GLbooleanP_def(number) Buffer *bgl_buffer##number
105#define GLbyteP_str "O!"
106#define GLbyteP_var(number) (bgl_buffer##number)->buf.asvoid
107#define GLbyteP_ref(number) &BGL_bufferType, &bgl_buffer##number
108#define GLbyteP_def(number) Buffer *bgl_buffer##number
110#define GLubyteP_str "O!"
111#define GLubyteP_var(number) (bgl_buffer##number)->buf.asvoid
112#define GLubyteP_ref(number) &BGL_bufferType, &bgl_buffer##number
113#define GLubyteP_def(number) Buffer *bgl_buffer##number
115#define GLintP_str "O!"
116#define GLintP_var(number) (bgl_buffer##number)->buf.asvoid
117#define GLintP_ref(number) &BGL_bufferType, &bgl_buffer##number
118#define GLintP_def(number) Buffer *bgl_buffer##number
120#define GLint64P_str "O!"
121#define GLint64P_var(number) (bgl_buffer##number)->buf.asvoid
122#define GLint64P_ref(number) &BGL_bufferType, &bgl_buffer##number
123#define GLint64P_def(number) Buffer *bgl_buffer##number
125#define GLenumP_str "O!"
126#define GLenumP_var(number) (bgl_buffer##number)->buf.asvoid
127#define GLenumP_ref(number) &BGL_bufferType, &bgl_buffer##number
128#define GLenumP_def(number) Buffer *bgl_buffer##number
130#define GLuintP_str "O!"
131#define GLuintP_var(number) (bgl_buffer##number)->buf.asvoid
132#define GLuintP_ref(number) &BGL_bufferType, &bgl_buffer##number
133#define GLuintP_def(number) Buffer *bgl_buffer##number
136# define GLuint64P_str "O!"
137# define GLuint64P_var(number) (bgl_buffer##number)->buf.asvoid
138# define GLuint64P_ref(number) &BGL_bufferType, &bgl_buffer##number
139# define GLuint64P_def(number) Buffer *bgl_buffer##number
142#define GLshortP_str "O!"
143#define GLshortP_var(number) (bgl_buffer##number)->buf.asvoid
144#define GLshortP_ref(number) &BGL_bufferType, &bgl_buffer##number
145#define GLshortP_def(number) Buffer *bgl_buffer##number
147#define GLushortP_str "O!"
148#define GLushortP_var(number) (bgl_buffer##number)->buf.asvoid
149#define GLushortP_ref(number) &BGL_bufferType, &bgl_buffer##number
150#define GLushortP_def(number) Buffer *bgl_buffer##number
152#define GLfloatP_str "O!"
153#define GLfloatP_var(number) (bgl_buffer##number)->buf.asvoid
154#define GLfloatP_ref(number) &BGL_bufferType, &bgl_buffer##number
155#define GLfloatP_def(number) Buffer *bgl_buffer##number
157#define GLdoubleP_str "O!"
158#define GLdoubleP_var(number) (bgl_buffer##number)->buf.asvoid
159#define GLdoubleP_ref(number) &BGL_bufferType, &bgl_buffer##number
160#define GLdoubleP_def(number) Buffer *bgl_buffer##number
163# define GLclampfP_str "O!"
164# define GLclampfP_var(number) (bgl_buffer##number)->buf.asvoid
165# define GLclampfP_ref(number) &BGL_bufferType, &bgl_buffer##number
166# define GLclampfP_def(number) Buffer *bgl_buffer##number
174#define GLvoidP_str "O&"
175#define GLvoidP_var(number) \
176 ((bgl_buffer##number.buffer) ? (bgl_buffer##number.buffer)->buf.asvoid : \
177 (bgl_buffer##number.offset))
178#define GLvoidP_ref(number) BGL_BufferOrOffsetConverter, &bgl_buffer##number
179#define GLvoidP_def(number) BufferOrOffset bgl_buffer##number
181#define GLsizeiP_str "O!"
182#define GLsizeiP_var(number) (bgl_buffer##number)->buf.asvoid
183#define GLsizeiP_ref(number) &BGL_bufferType, &bgl_buffer##number
184#define GLsizeiP_def(number) Buffer *bgl_buffer##number
186#define GLcharP_str "O!"
187#define GLcharP_var(number) (bgl_buffer##number)->buf.asvoid
188#define GLcharP_ref(number) &BGL_bufferType, &bgl_buffer##number
189#define GLcharP_def(number) Buffer *bgl_buffer##number
192# define buffer_str "O!"
193# define buffer_var(number) (bgl_buffer##number)->buf.asvoid
194# define buffer_ref(number) &BGL_bufferType, &bgl_buffer##number
195# define buffer_def(number) Buffer *bgl_buffer##number
207#define GLenum_str "i"
208#define GLenum_var(num) bgl_var##num
209#define GLenum_ref(num) &bgl_var##num
210#define GLenum_def(num) int GLenum_var(num)
213#define GLboolean_str "b"
214#define GLboolean_var(num) bgl_var##num
215#define GLboolean_ref(num) &bgl_var##num
216#define GLboolean_def(num) char GLboolean_var(num)
219#define GLbitfield_str "i"
220#define GLbitfield_var(num) bgl_var##num
221#define GLbitfield_ref(num) &bgl_var##num
222#define GLbitfield_def(num) int GLbitfield_var(num)
226# define GLbyte_str "b"
227# define GLbyte_var(num) bgl_var##num
228# define GLbyte_ref(num) &bgl_var##num
229# define GLbyte_def(num) signed char GLbyte_var(num)
233#define GLshort_str "h"
234#define GLshort_var(num) bgl_var##num
235#define GLshort_ref(num) &bgl_var##num
236#define GLshort_def(num) short GLshort_var(num)
240#define GLint_var(num) bgl_var##num
241#define GLint_ref(num) &bgl_var##num
242#define GLint_def(num) int GLint_var(num)
245#define GLsizei_str "n"
246#define GLsizei_var(num) bgl_var##num
247#define GLsizei_ref(num) &bgl_var##num
248#define GLsizei_def(num) size_t GLsizei_var(num)
251#define GLsizeiptr_str "n"
252#define GLsizeiptr_var(num) bgl_var##num
253#define GLsizeiptr_ref(num) &bgl_var##num
254#define GLsizeiptr_def(num) size_t GLsizeiptr_var(num)
257#define GLintptr_str "n"
258#define GLintptr_var(num) bgl_var##num
259#define GLintptr_ref(num) &bgl_var##num
260#define GLintptr_def(num) size_t GLintptr_var(num)
263#define GLubyte_str "B"
264#define GLubyte_var(num) bgl_var##num
265#define GLubyte_ref(num) &bgl_var##num
266#define GLubyte_def(num) char GLubyte_var(num)
270# define GLushort_str "H"
271# define GLushort_var(num) bgl_var##num
272# define GLushort_ref(num) &bgl_var##num
273# define GLushort_def(num) short GLushort_var(num)
277#define GLuint_str "I"
278#define GLuint_var(num) bgl_var##num
279#define GLuint_ref(num) &bgl_var##num
280#define GLuint_def(num) int GLuint_var(num)
284# define GLuint64_str "Q"
285# define GLuint64_var(num) bgl_var##num
286# define GLuint64_ref(num) &bgl_var##num
287# define GLuint64_def(num) int GLuint64_var(num)
292# define GLsync_str "I"
293# define GLsync_var(num) bgl_var##num
294# define GLsync_ref(num) &bgl_var##num
295# define GLsync_def(num) int GLsync_var(num)
299#define GLfloat_str "f"
300#define GLfloat_var(num) bgl_var##num
301#define GLfloat_ref(num) &bgl_var##num
302#define GLfloat_def(num) float GLfloat_var(num)
305#define GLstring_str "s"
306#define GLstring_var(number) bgl_var##number
307#define GLstring_ref(number) &bgl_var##number
308#define GLstring_def(number) char *GLstring_var(number)
312# define GLclampf_str "f"
313# define GLclampf_var(num) bgl_var##num
314# define GLclampf_ref(num) &bgl_var##num
315# define GLclampf_def(num) float GLclampf_var(num)
319#define GLdouble_str "d"
320#define GLdouble_var(num) bgl_var##num
321#define GLdouble_ref(num) &bgl_var##num
322#define GLdouble_def(num) double GLdouble_var(num)
326# define GLclampd_str "d"
327# define GLclampd_var(num) bgl_var##num
328# define GLclampd_ref(num) &bgl_var##num
329# define GLclampd_def(num) double GLclampd_var(num)
332#define _arg_def1(a1) a1##_def(1)
333#define _arg_def2(a1, a2) \
336#define _arg_def3(a1, a2, a3) \
339#define _arg_def4(a1, a2, a3, a4) \
340 _arg_def3(a1, a2, a3); \
342#define _arg_def5(a1, a2, a3, a4, a5) \
343 _arg_def4(a1, a2, a3, a4); \
345#define _arg_def6(a1, a2, a3, a4, a5, a6) \
346 _arg_def5(a1, a2, a3, a4, a5); \
348#define _arg_def7(a1, a2, a3, a4, a5, a6, a7) \
349 _arg_def6(a1, a2, a3, a4, a5, a6); \
351#define _arg_def8(a1, a2, a3, a4, a5, a6, a7, a8) \
352 _arg_def7(a1, a2, a3, a4, a5, a6, a7); \
354#define _arg_def9(a1, a2, a3, a4, a5, a6, a7, a8, a9) \
355 _arg_def8(a1, a2, a3, a4, a5, a6, a7, a8); \
357#define _arg_def10(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) \
358 _arg_def9(a1, a2, a3, a4, a5, a6, a7, a8, a9); \
360#define _arg_def11(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) \
361 _arg_def10(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10); \
363#define arg_def(...) VA_NARGS_CALL_OVERLOAD(_arg_def, __VA_ARGS__)
365#define _arg_var1(a1) a1##_var(1)
366#define _arg_var2(a1, a2) _arg_var1(a1), a2##_var(2)
367#define _arg_var3(a1, a2, a3) _arg_var2(a1, a2), a3##_var(3)
368#define _arg_var4(a1, a2, a3, a4) _arg_var3(a1, a2, a3), a4##_var(4)
369#define _arg_var5(a1, a2, a3, a4, a5) _arg_var4(a1, a2, a3, a4), a5##_var(5)
370#define _arg_var6(a1, a2, a3, a4, a5, a6) _arg_var5(a1, a2, a3, a4, a5), a6##_var(6)
371#define _arg_var7(a1, a2, a3, a4, a5, a6, a7) _arg_var6(a1, a2, a3, a4, a5, a6), a7##_var(7)
372#define _arg_var8(a1, a2, a3, a4, a5, a6, a7, a8) \
373 _arg_var7(a1, a2, a3, a4, a5, a6, a7), a8##_var(8)
374#define _arg_var9(a1, a2, a3, a4, a5, a6, a7, a8, a9) \
375 _arg_var8(a1, a2, a3, a4, a5, a6, a7, a8), a9##_var(9)
376#define _arg_var10(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) \
377 _arg_var9(a1, a2, a3, a4, a5, a6, a7, a8, a9), a10##_var(10)
378#define _arg_var11(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) \
379 _arg_var10(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10), a11##_var(11)
380#define arg_var(...) VA_NARGS_CALL_OVERLOAD(_arg_var, __VA_ARGS__)
382#define _arg_ref1(a1) a1##_ref(1)
383#define _arg_ref2(a1, a2) _arg_ref1(a1), a2##_ref(2)
384#define _arg_ref3(a1, a2, a3) _arg_ref2(a1, a2), a3##_ref(3)
385#define _arg_ref4(a1, a2, a3, a4) _arg_ref3(a1, a2, a3), a4##_ref(4)
386#define _arg_ref5(a1, a2, a3, a4, a5) _arg_ref4(a1, a2, a3, a4), a5##_ref(5)
387#define _arg_ref6(a1, a2, a3, a4, a5, a6) _arg_ref5(a1, a2, a3, a4, a5), a6##_ref(6)
388#define _arg_ref7(a1, a2, a3, a4, a5, a6, a7) _arg_ref6(a1, a2, a3, a4, a5, a6), a7##_ref(7)
389#define _arg_ref8(a1, a2, a3, a4, a5, a6, a7, a8) \
390 _arg_ref7(a1, a2, a3, a4, a5, a6, a7), a8##_ref(8)
391#define _arg_ref9(a1, a2, a3, a4, a5, a6, a7, a8, a9) \
392 _arg_ref8(a1, a2, a3, a4, a5, a6, a7, a8), a9##_ref(9)
393#define _arg_ref10(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) \
394 _arg_ref9(a1, a2, a3, a4, a5, a6, a7, a8, a9), a10##_ref(10)
395#define _arg_ref11(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) \
396 _arg_ref10(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10), a11##_ref(11)
397#define arg_ref(...) VA_NARGS_CALL_OVERLOAD(_arg_ref, __VA_ARGS__)
399#define _arg_str1(a1) a1##_str
400#define _arg_str2(a1, a2) _arg_str1(a1) a2##_str
401#define _arg_str3(a1, a2, a3) _arg_str2(a1, a2) a3##_str
402#define _arg_str4(a1, a2, a3, a4) _arg_str3(a1, a2, a3) a4##_str
403#define _arg_str5(a1, a2, a3, a4, a5) _arg_str4(a1, a2, a3, a4) a5##_str
404#define _arg_str6(a1, a2, a3, a4, a5, a6) _arg_str5(a1, a2, a3, a4, a5) a6##_str
405#define _arg_str7(a1, a2, a3, a4, a5, a6, a7) _arg_str6(a1, a2, a3, a4, a5, a6) a7##_str
406#define _arg_str8(a1, a2, a3, a4, a5, a6, a7, a8) _arg_str7(a1, a2, a3, a4, a5, a6, a7) a8##_str
407#define _arg_str9(a1, a2, a3, a4, a5, a6, a7, a8, a9) \
408 _arg_str8(a1, a2, a3, a4, a5, a6, a7, a8) a9##_str
409#define _arg_str10(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) \
410 _arg_str9(a1, a2, a3, a4, a5, a6, a7, a8, a9) a10##_str
411#define _arg_str11(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) \
412 _arg_str10(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) a11##_str
413#define arg_str(...) VA_NARGS_CALL_OVERLOAD(_arg_str, __VA_ARGS__)
417#define ret_default_void
418#define ret_ret_void return Py_INCREF(Py_None), Py_None
420#define ret_def_GLint int ret_int
421#define ret_set_GLint ret_int =
422#define ret_default_GLint -1
423#define ret_ret_GLint return PyLong_FromLong(ret_int)
425#define ret_def_GLuint uint ret_uint
426#define ret_set_GLuint ret_uint =
427#define ret_default_GLuint 0
428#define ret_ret_GLuint return PyLong_FromLong(long(ret_uint))
431# define ret_def_GLsizei size_t ret_size_t
432# define ret_set_GLsizei ret_size_t =
433# define ret_ret_GLsizei return PyLong_FromSsize_t(ret_size_t)
437# define ret_def_GLsync uint ret_sync
438# define ret_set_GLsync ret_sync =
439# define ret_ret_GLsync return PyLong_FromLong(long(ret_sync))
442#define ret_def_GLenum uint ret_uint
443#define ret_set_GLenum ret_uint =
444#define ret_default_GLenum 0
445#define ret_ret_GLenum return PyLong_FromLong(long(ret_uint))
447#define ret_def_GLboolean uchar ret_bool
448#define ret_set_GLboolean ret_bool =
449#define ret_default_GLboolean GL_FALSE
450#define ret_ret_GLboolean return PyLong_FromLong(long(ret_bool))
452#define ret_def_GLstring \
453 const char *default_GLstring = ""; \
455#define ret_set_GLstring ret_str =
456#define ret_default_GLstring (const uchar *)default_GLstring
458#define ret_ret_GLstring \
460 return PyUnicode_FromString((const char *)ret_str); \
463 PyErr_SetString(PyExc_AttributeError, "could not get opengl string"); \
471static PyObject *
Buffer_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
494 return sizeof(short);
498 return sizeof(float);
500 return sizeof(double);
508 const Py_ssize_t itemsize = pybuffer->itemsize;
535 for (
int i = 0;
i < ndim;
i++) {
536 if (dim1[
i] != dim2[
i]) {
574 PyObject *list = PyList_New(
len);
576 for (
i = 0;
i <
len;
i++) {
587 if (
self->ndimensions > 1) {
589 list = PyList_New(
len);
591 for (
i = 0;
i <
len;
i++) {
606 PyObject *list = PyList_New(
self->ndimensions);
609 for (
i = 0;
i <
self->ndimensions;
i++) {
610 PyList_SET_ITEM(list,
i, PyLong_FromLong(
self->dimensions[
i]));
618# pragma clang diagnostic push
619# pragma clang diagnostic ignored "-Wcast-function-type"
621# pragma GCC diagnostic push
622# pragma GCC diagnostic ignored "-Wcast-function-type"
628 {
nullptr,
nullptr, 0,
nullptr},
633# pragma clang diagnostic pop
635# pragma GCC diagnostic pop
641 {
nullptr,
nullptr,
nullptr,
nullptr,
nullptr},
645 PyVarObject_HEAD_INIT(
nullptr, 0)
697 PyObject *parent,
int type,
int ndimensions,
const int *dimensions,
void *buf)
702 buffer->parent = parent;
703 buffer->ndimensions = ndimensions;
705 memcpy(buffer->dimensions, dimensions, ndimensions *
sizeof(
int));
707 buffer->buf.asvoid = buf;
712Buffer *
BGL_MakeBuffer(
int type,
int ndimensions,
const int *dimensions,
const void *initbuffer)
718 for (
i = 0;
i < ndimensions;
i++) {
719 size *= dimensions[
i];
727 memcpy(buffer->buf.asvoid, initbuffer,
size);
730 memset(buffer->buf.asvoid, 0,
size);
735#ifdef WITH_OPENGL_BACKEND
739static int BGL_BufferOrOffsetConverter(PyObject *
object,
BufferOrOffset *buffer)
741 if (
object == Py_None) {
746 if (PyNumber_Check(
object)) {
747 const Py_ssize_t offset = PyNumber_AsSsize_t(
object, PyExc_IndexError);
748 if (offset == -1 && PyErr_Occurred()) {
753 buffer->
offset = (
void *)offset;
757 buffer->
buffer = (Buffer *)
object;
762 PyErr_SetString(PyExc_TypeError,
"expected a bgl.Buffer or None");
767#define MAX_DIMENSIONS 256
768static PyObject *
Buffer_new(PyTypeObject * , PyObject *args, PyObject *kwds)
770 PyObject *length_ob =
nullptr, *
init =
nullptr;
771 Buffer *buffer =
nullptr;
775 Py_ssize_t
i, ndimensions = 0;
777 if (kwds && PyDict_Size(kwds)) {
778 PyErr_SetString(PyExc_TypeError,
"bgl.Buffer(): takes no keyword args");
782 if (!PyArg_ParseTuple(args,
"iO|O: bgl.Buffer", &type, &length_ob, &
init)) {
785 if (!
ELEM(type, GL_BYTE, GL_SHORT, GL_INT, GL_FLOAT, GL_DOUBLE)) {
786 PyErr_SetString(PyExc_AttributeError,
787 "invalid first argument type, should be one of "
788 "GL_BYTE, GL_SHORT, GL_INT, GL_FLOAT or GL_DOUBLE");
792 if (PyLong_Check(length_ob)) {
794 if ((dimensions[0] = PyLong_AsLong(length_ob)) < 1) {
795 PyErr_SetString(PyExc_AttributeError,
800 else if (PySequence_Check(length_ob)) {
801 ndimensions = PySequence_Size(length_ob);
803 PyErr_SetString(PyExc_AttributeError,
807 if (ndimensions < 1) {
808 PyErr_SetString(PyExc_AttributeError,
"sequence must have at least one dimension");
811 for (
i = 0;
i < ndimensions;
i++) {
812 PyObject *ob = PySequence_GetItem(length_ob,
i);
814 if (!PyLong_Check(ob)) {
818 dimensions[
i] = PyLong_AsLong(ob);
822 if (dimensions[
i] < 1) {
823 PyErr_SetString(PyExc_AttributeError,
830 PyErr_Format(PyExc_TypeError,
831 "invalid second argument expected a sequence "
832 "or an int, not a %.200s",
833 Py_TYPE(length_ob)->tp_name);
837 if (
init && PyObject_CheckBuffer(
init)) {
840 if (PyObject_GetBuffer(
init, &pybuffer, PyBUF_ND | PyBUF_FORMAT) == -1) {
846 PyErr_Format(PyExc_TypeError,
847 "`GL_TYPE` and `typestr` of object with buffer interface do not match. '%s'",
850 else if (ndimensions != pybuffer.ndim ||
853 PyErr_Format(PyExc_TypeError,
"array size does not match");
859 PyBuffer_Release(&pybuffer);
869 return (PyObject *)buffer;
876 return self->dimensions[0];
881 if (
i >=
self->dimensions[0] ||
i < 0) {
882 PyErr_SetString(PyExc_IndexError,
"array index out of range");
886 if (
self->ndimensions == 1) {
887 switch (
self->type) {
889 return Py_BuildValue(
"b",
self->buf.asbyte[
i]);
891 return Py_BuildValue(
"h",
self->buf.asshort[
i]);
893 return Py_BuildValue(
"i",
self->buf.asint[
i]);
895 return PyFloat_FromDouble(
self->buf.asfloat[
i]);
897 return Py_BuildValue(
"d",
self->buf.asdouble[
i]);
903 for (j = 1; j <
self->ndimensions; j++) {
904 offset *=
self->dimensions[j];
909 self->ndimensions - 1,
910 self->dimensions + 1,
911 self->buf.asbyte + offset);
922 end = std::min<Py_ssize_t>(end,
self->dimensions[0]);
925 list = PyList_New(end -
begin);
935 if (
i >=
self->dimensions[0] ||
i < 0) {
936 PyErr_SetString(PyExc_IndexError,
"array assignment index out of range");
940 if (
self->ndimensions != 1) {
952 switch (
self->type) {
954 return PyArg_Parse(
v,
"b:Expected ints", &
self->buf.asbyte[
i]) ? 0 : -1;
956 return PyArg_Parse(
v,
"h:Expected ints", &
self->buf.asshort[
i]) ? 0 : -1;
958 return PyArg_Parse(
v,
"i:Expected ints", &
self->buf.asint[
i]) ? 0 : -1;
960 return PyArg_Parse(
v,
"f:Expected floats", &
self->buf.asfloat[
i]) ? 0 : -1;
962 return PyArg_Parse(
v,
"d:Expected floats", &
self->buf.asdouble[
i]) ? 0 : -1;
975 end = std::min<Py_ssize_t>(end,
self->dimensions[0]);
978 if (!PySequence_Check(seq)) {
979 PyErr_Format(PyExc_TypeError,
980 "buffer[:] = value, invalid assignment. "
981 "Expected a sequence, not an %.200s type",
982 Py_TYPE(seq)->tp_name);
987 if ((
count = PySequence_Size(seq)) != (end -
begin)) {
988 PyErr_Format(PyExc_TypeError,
989 "buffer[:] = value, size mismatch in assignment. "
990 "Expected: %d (given: %d)",
997 item = PySequence_GetItem(seq,
count -
begin);
1014 if (PyIndex_Check(item)) {
1016 i = PyNumber_AsSsize_t(item, PyExc_IndexError);
1017 if (
i == -1 && PyErr_Occurred()) {
1021 i +=
self->dimensions[0];
1025 if (PySlice_Check(item)) {
1026 Py_ssize_t start,
stop,
step, slicelength;
1028 if (PySlice_GetIndicesEx(item,
self->dimensions[0], &start, &
stop, &
step, &slicelength) < 0) {
1032 if (slicelength <= 0) {
1033 return PyTuple_New(0);
1039 PyErr_SetString(PyExc_IndexError,
"slice steps not supported with vectors");
1044 PyExc_TypeError,
"buffer indices must be integers, not %.200s", Py_TYPE(item)->tp_name);
1050 if (PyIndex_Check(item)) {
1051 Py_ssize_t
i = PyNumber_AsSsize_t(item, PyExc_IndexError);
1052 if (
i == -1 && PyErr_Occurred()) {
1056 i +=
self->dimensions[0];
1060 if (PySlice_Check(item)) {
1061 Py_ssize_t start,
stop,
step, slicelength;
1063 if (PySlice_GetIndicesEx(item,
self->dimensions[0], &start, &
stop, &
step, &slicelength) < 0) {
1071 PyErr_SetString(PyExc_IndexError,
"slice steps not supported with vectors");
1076 PyExc_TypeError,
"buffer indices must be integers, not %.200s", Py_TYPE(item)->tp_name);
1083 Py_DECREF(
self->parent);
1098 const char *typestr;
1100 switch (
self->type) {
1102 typestr =
"GL_BYTE";
1105 typestr =
"GL_SHORT";
1111 typestr =
"GL_FLOAT";
1114 typestr =
"GL_DOUBLE";
1117 typestr =
"UNKNOWN";
1121 repr = PyUnicode_FromFormat(
"Buffer(%s, %R)", typestr, list);
1133#ifdef WITH_OPENGL_BACKEND
1134# define BGL_Wrap(funcname, ret, arg_list) \
1135 static PyObject *Method_##funcname(PyObject * , PyObject *args) \
1139 report_deprecated_call(#funcname); \
1140 if (!PyArg_ParseTuple(args, arg_str arg_list, arg_ref arg_list)) { \
1143 const bool has_opengl_backend = GPU_backend_get_type() == GPU_BACKEND_OPENGL; \
1144 if (has_opengl_backend) { \
1146 ret_set_##ret gl##funcname(arg_var arg_list); \
1149 report_deprecated_call_to_user(); \
1150 ret_set_##ret ret_default_##ret; \
1158 PyErr_SetString(PyExc_RuntimeError,
"Built without OpenGL support");
1161# define BGL_Wrap(funcname, ret, arg_list) \
1162 static PyObject *Method_##funcname(PyObject * , PyObject *args) \
1165 bgl_no_opengl_error(); \
1173BGL_Wrap(ClearColor,
void, (GLfloat, GLfloat, GLfloat, GLfloat));
1176BGL_Wrap(ColorMask,
void, (GLboolean, GLboolean, GLboolean, GLboolean));
1193BGL_Wrap(GetTexImage,
void, (GLenum, GLint, GLenum, GLenum, GLvoidP));
1194BGL_Wrap(GetTexLevelParameterfv,
void, (GLenum, GLint, GLenum, GLfloatP));
1195BGL_Wrap(GetTexLevelParameteriv,
void, (GLenum, GLint, GLenum, GLintP));
1196BGL_Wrap(GetTexParameterfv,
void, (GLenum, GLenum, GLfloatP));
1197BGL_Wrap(GetTexParameteriv,
void, (GLenum, GLenum, GLintP));
1207BGL_Wrap(ReadPixels,
void, (GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, GLvoidP));
1208BGL_Wrap(Scissor,
void, (GLint, GLint, GLsizei, GLsizei));
1212BGL_Wrap(TexImage1D,
void, (GLenum, GLint, GLint, GLsizei, GLint, GLenum, GLenum, GLvoidP));
1215 (GLenum, GLint, GLint, GLsizei, GLsizei, GLint, GLenum, GLenum, GLvoidP));
1216BGL_Wrap(TexParameterf,
void, (GLenum, GLenum, GLfloat));
1217BGL_Wrap(TexParameterfv,
void, (GLenum, GLenum, GLfloatP));
1219BGL_Wrap(TexParameteriv,
void, (GLenum, GLenum, GLintP));
1220BGL_Wrap(Viewport,
void, (GLint, GLint, GLsizei, GLsizei));
1224BGL_Wrap(CopyTexImage1D,
void, (GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLint));
1225BGL_Wrap(CopyTexImage2D,
void, (GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLsizei, GLint));
1226BGL_Wrap(CopyTexSubImage1D,
void, (GLenum, GLint, GLint, GLint, GLint, GLsizei));
1227BGL_Wrap(CopyTexSubImage2D,
void, (GLenum, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei));
1230BGL_Wrap(DrawElements,
void, (GLenum, GLsizei, GLenum, GLvoidP));
1234BGL_Wrap(TexSubImage1D,
void, (GLenum, GLint, GLint, GLsizei, GLenum, GLenum, GLvoidP));
1237 (GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, GLvoidP));
1242 (GLenum, GLint, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei));
1243BGL_Wrap(DrawRangeElements,
void, (GLenum, GLuint, GLuint, GLsizei, GLenum, GLvoidP));
1246 (GLenum, GLint, GLint, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, GLvoidP));
1249 (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum, GLvoidP));
1253BGL_Wrap(CompressedTexImage1D,
void, (GLenum, GLint, GLenum, GLsizei, GLint, GLsizei, GLvoidP));
1256 (GLenum, GLint, GLenum, GLsizei, GLsizei, GLint, GLsizei, GLvoidP));
1259 (GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLsizei, GLvoidP));
1260BGL_Wrap(CompressedTexSubImage1D,
void, (GLenum, GLint, GLint, GLsizei, GLenum, GLsizei, GLvoidP));
1263 (GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLsizei, GLvoidP));
1265 CompressedTexSubImage3D,
1267 (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLsizei, GLvoidP));
1268BGL_Wrap(GetCompressedTexImage,
void, (GLenum, GLint, GLvoidP));
1272BGL_Wrap(BlendColor,
void, (GLfloat, GLfloat, GLfloat, GLfloat));
1278BGL_Wrap(BufferData,
void, (GLenum, GLsizeiptr, GLvoidP, GLenum));
1279BGL_Wrap(BufferSubData,
void, (GLenum, GLintptr, GLsizeiptr, GLvoidP));
1285BGL_Wrap(GetBufferParameteriv,
void, (GLenum, GLenum, GLintP));
1286BGL_Wrap(GetBufferPointerv,
void, (GLenum, GLenum, GLvoidP));
1287BGL_Wrap(GetBufferSubData,
void, (GLenum, GLintptr, GLsizeiptr, GLvoidP));
1288BGL_Wrap(GetQueryObjectiv,
void, (GLuint, GLenum, GLintP));
1289BGL_Wrap(GetQueryObjectuiv,
void, (GLuint, GLenum, GLuintP));
1298BGL_Wrap(BindAttribLocation,
void, (GLuint, GLuint, GLstring));
1299BGL_Wrap(BlendEquationSeparate,
void, (GLenum, GLenum));
1309BGL_Wrap(GetActiveAttrib,
void, (GLuint, GLuint, GLsizei, GLsizeiP, GLintP, GLenumP, GLcharP));
1310BGL_Wrap(GetActiveUniform,
void, (GLuint, GLuint, GLsizei, GLsizeiP, GLintP, GLenumP, GLcharP));
1311BGL_Wrap(GetAttachedShaders,
void, (GLuint, GLsizei, GLsizeiP, GLuintP));
1313BGL_Wrap(GetProgramInfoLog,
void, (GLuint, GLsizei, GLsizeiP, GLcharP));
1315BGL_Wrap(GetShaderInfoLog,
void, (GLuint, GLsizei, GLsizeiP, GLcharP));
1316BGL_Wrap(GetShaderSource,
void, (GLuint, GLsizei, GLsizeiP, GLcharP));
1318BGL_Wrap(GetUniformLocation, GLint, (GLuint, GLstring));
1319BGL_Wrap(GetUniformfv,
void, (GLuint, GLint, GLfloatP));
1321BGL_Wrap(GetVertexAttribPointerv,
void, (GLuint, GLenum, GLvoidP));
1322BGL_Wrap(GetVertexAttribdv,
void, (GLuint, GLenum, GLdoubleP));
1323BGL_Wrap(GetVertexAttribfv,
void, (GLuint, GLenum, GLfloatP));
1324BGL_Wrap(GetVertexAttribiv,
void, (GLuint, GLenum, GLintP));
1328BGL_Wrap(StencilFuncSeparate,
void, (GLenum, GLenum, GLint, GLuint));
1330BGL_Wrap(StencilOpSeparate,
void, (GLenum, GLenum, GLenum, GLenum));
1339BGL_Wrap(Uniform3f,
void, (GLint, GLfloat, GLfloat, GLfloat));
1341BGL_Wrap(Uniform3i,
void, (GLint, GLint, GLint, GLint));
1343BGL_Wrap(Uniform4f,
void, (GLint, GLfloat, GLfloat, GLfloat, GLfloat));
1345BGL_Wrap(Uniform4i,
void, (GLint, GLint, GLint, GLint, GLint));
1347BGL_Wrap(UniformMatrix2fv,
void, (GLint, GLsizei, GLboolean, GLfloatP));
1348BGL_Wrap(UniformMatrix3fv,
void, (GLint, GLsizei, GLboolean, GLfloatP));
1349BGL_Wrap(UniformMatrix4fv,
void, (GLint, GLsizei, GLboolean, GLfloatP));
1358BGL_Wrap(VertexAttrib2d,
void, (GLuint, GLdouble, GLdouble));
1360BGL_Wrap(VertexAttrib2f,
void, (GLuint, GLfloat, GLfloat));
1362BGL_Wrap(VertexAttrib2s,
void, (GLuint, GLshort, GLshort));
1364BGL_Wrap(VertexAttrib3d,
void, (GLuint, GLdouble, GLdouble, GLdouble));
1366BGL_Wrap(VertexAttrib3f,
void, (GLuint, GLfloat, GLfloat, GLfloat));
1368BGL_Wrap(VertexAttrib3s,
void, (GLuint, GLshort, GLshort, GLshort));
1373BGL_Wrap(VertexAttrib4Nub,
void, (GLuint, GLubyte, GLubyte, GLubyte, GLubyte));
1378BGL_Wrap(VertexAttrib4d,
void, (GLuint, GLdouble, GLdouble, GLdouble, GLdouble));
1380BGL_Wrap(VertexAttrib4f,
void, (GLuint, GLfloat, GLfloat, GLfloat, GLfloat));
1383BGL_Wrap(VertexAttrib4s,
void, (GLuint, GLshort, GLshort, GLshort, GLshort));
1388BGL_Wrap(VertexAttribPointer,
void, (GLuint, GLint, GLenum, GLboolean, GLsizei, GLvoidP));
1391BGL_Wrap(UniformMatrix2x3fv,
void, (GLint, GLsizei, GLboolean, GLfloatP));
1392BGL_Wrap(UniformMatrix2x4fv,
void, (GLint, GLsizei, GLboolean, GLfloatP));
1393BGL_Wrap(UniformMatrix3x2fv,
void, (GLint, GLsizei, GLboolean, GLfloatP));
1394BGL_Wrap(UniformMatrix3x4fv,
void, (GLint, GLsizei, GLboolean, GLfloatP));
1395BGL_Wrap(UniformMatrix4x2fv,
void, (GLint, GLsizei, GLboolean, GLfloatP));
1396BGL_Wrap(UniformMatrix4x3fv,
void, (GLint, GLsizei, GLboolean, GLfloatP));
1404 (GLint, GLint, GLint, GLint, GLint, GLint, GLint, GLint, GLbitfield, GLenum));
1407BGL_Wrap(DeleteRenderbuffers,
void, (GLsizei, GLuintP));
1409BGL_Wrap(FramebufferRenderbuffer,
void, (GLenum, GLenum, GLenum, GLuint));
1415BGL_Wrap(RenderbufferStorage,
void, (GLenum, GLenum, GLsizei, GLsizei));
1416BGL_Wrap(VertexAttribIPointer,
void, (GLuint, GLint, GLenum, GLsizei, GLvoidP));
1419BGL_Wrap(BindBufferBase,
void, (GLenum, GLuint, GLuint));
1420BGL_Wrap(BindBufferRange,
void, (GLenum, GLuint, GLuint, GLintptr, GLsizeiptr));
1421BGL_Wrap(GetActiveUniformBlockName,
void, (GLuint, GLuint, GLsizei, GLsizeiP, GLcharP));
1422BGL_Wrap(GetActiveUniformBlockiv,
void, (GLuint, GLuint, GLenum, GLintP));
1423BGL_Wrap(GetActiveUniformName,
void, (GLuint, GLuint, GLsizei, GLsizeiP, GLcharP));
1424BGL_Wrap(GetActiveUniformsiv,
void, (GLuint, GLsizei, GLuintP, GLenum, GLintP));
1425BGL_Wrap(GetIntegeri_v,
void, (GLenum, GLuint, GLintP));
1426BGL_Wrap(GetUniformBlockIndex, GLuint, (GLuint, GLstring));
1427BGL_Wrap(GetUniformIndices,
void, (GLuint, GLsizei, GLcharP, GLuintP));
1428BGL_Wrap(UniformBlockBinding,
void, (GLuint, GLuint, GLuint));
1431BGL_Wrap(FramebufferTexture,
void, (GLenum, GLenum, GLuint, GLint));
1432BGL_Wrap(GetBufferParameteri64v,
void, (GLenum, GLenum, GLint64P));
1433BGL_Wrap(GetInteger64i_v,
void, (GLenum, GLuint, GLint64P));
1434BGL_Wrap(GetMultisamplefv,
void, (GLenum, GLuint, GLfloatP));
1436BGL_Wrap(TexImage2DMultisample,
void, (GLenum, GLsizei, GLenum, GLsizei, GLsizei, GLboolean));
1439 (GLenum, GLsizei, GLenum, GLsizei, GLsizei, GLsizei, GLboolean));
1465 PyDict_SetItemString(dict, name, item = PyLong_FromLong(value));
1472 PyDict_SetItemString(dict, name, item = PyLong_FromLongLong(value));
1478 PyMethodDef *method_def,
1483 m = PyCFunction_NewEx(method_def,
nullptr, submodule);
1484 PyDict_SetItemString(dict, method_def->ml_name, m);
1488 PyDict_SetItemString(dict, method_def->ml_name, Py_None);
1494# pragma GCC diagnostic ignored "-Waddress"
1497#ifdef WITH_OPENGL_BACKEND
1498# define PY_MOD_ADD_METHOD(func) \
1500 static PyMethodDef method_def = {"gl" #func, Method_##func, METH_VARARGS}; \
1501 py_module_dict_add_method(submodule, dict, &method_def, (gl##func != nullptr)); \
1505# define PY_MOD_ADD_METHOD(func) \
1507 static PyMethodDef method_def = {"gl" #func, Method_##func, METH_VARARGS}; \
1508 py_module_dict_add_method(submodule, dict, &method_def, false); \
1789#define PY_DICT_ADD_INT(x) py_module_dict_add_int(dict, #x, x)
1790#define PY_DICT_ADD_INT64(x) py_module_dict_add_int64(dict, #x, x)
2657 PyObject *submodule, *dict;
2659 dict = PyModule_GetDict(submodule);
2669#ifndef WITH_PYTHON_MODULE
2672 "'bgl' imported without an OpenGL backend. Please update your add-ons to use the "
2679 PyModule_AddObjectRef(submodule,
"Buffer", (PyObject *)&
BGL_bufferType);
2714 if (!PyArg_ParseTuple(args,
"Is", &shader, &source)) {
2719 glShaderSource(shader, 1, (
const char **)&source,
nullptr);
#define SNPRINTF(dst, format,...)
#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
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
VecBase< float, D > step(VecOp< float, D >, VecOp< float, D >) RET
void * MEM_mallocN(size_t len, const char *str)
void * MEM_malloc_arrayN(size_t len, size_t size, const char *str)
void MEM_freeN(void *vmemh)
static void init(bNodeTree *, bNode *node)
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)