20 #include "../generic/py_capi_utils.h"
39 #define void_ref(num) &bgl_var##num
40 #define void_def(num) char bgl_var##num
43 # define buffer_str "O!"
44 # define buffer_var(number) (bgl_buffer##number)->buf.asvoid
45 # define buffer_ref(number) &BGL_bufferType, &bgl_buffer##number
46 # define buffer_def(number) Buffer *bgl_buffer##number
52 #define GLbooleanP_str "O!"
53 #define GLbooleanP_var(number) (bgl_buffer##number)->buf.asvoid
54 #define GLbooleanP_ref(number) &BGL_bufferType, &bgl_buffer##number
55 #define GLbooleanP_def(number) Buffer *bgl_buffer##number
57 #define GLbyteP_str "O!"
58 #define GLbyteP_var(number) (bgl_buffer##number)->buf.asvoid
59 #define GLbyteP_ref(number) &BGL_bufferType, &bgl_buffer##number
60 #define GLbyteP_def(number) Buffer *bgl_buffer##number
62 #define GLubyteP_str "O!"
63 #define GLubyteP_var(number) (bgl_buffer##number)->buf.asvoid
64 #define GLubyteP_ref(number) &BGL_bufferType, &bgl_buffer##number
65 #define GLubyteP_def(number) Buffer *bgl_buffer##number
67 #define GLintP_str "O!"
68 #define GLintP_var(number) (bgl_buffer##number)->buf.asvoid
69 #define GLintP_ref(number) &BGL_bufferType, &bgl_buffer##number
70 #define GLintP_def(number) Buffer *bgl_buffer##number
72 #define GLint64P_str "O!"
73 #define GLint64P_var(number) (bgl_buffer##number)->buf.asvoid
74 #define GLint64P_ref(number) &BGL_bufferType, &bgl_buffer##number
75 #define GLint64P_def(number) Buffer *bgl_buffer##number
77 #define GLenumP_str "O!"
78 #define GLenumP_var(number) (bgl_buffer##number)->buf.asvoid
79 #define GLenumP_ref(number) &BGL_bufferType, &bgl_buffer##number
80 #define GLenumP_def(number) Buffer *bgl_buffer##number
82 #define GLuintP_str "O!"
83 #define GLuintP_var(number) (bgl_buffer##number)->buf.asvoid
84 #define GLuintP_ref(number) &BGL_bufferType, &bgl_buffer##number
85 #define GLuintP_def(number) Buffer *bgl_buffer##number
88 # define GLuint64P_str "O!"
89 # define GLuint64P_var(number) (bgl_buffer##number)->buf.asvoid
90 # define GLuint64P_ref(number) &BGL_bufferType, &bgl_buffer##number
91 # define GLuint64P_def(number) Buffer *bgl_buffer##number
94 #define GLshortP_str "O!"
95 #define GLshortP_var(number) (bgl_buffer##number)->buf.asvoid
96 #define GLshortP_ref(number) &BGL_bufferType, &bgl_buffer##number
97 #define GLshortP_def(number) Buffer *bgl_buffer##number
99 #define GLushortP_str "O!"
100 #define GLushortP_var(number) (bgl_buffer##number)->buf.asvoid
101 #define GLushortP_ref(number) &BGL_bufferType, &bgl_buffer##number
102 #define GLushortP_def(number) Buffer *bgl_buffer##number
104 #define GLfloatP_str "O!"
105 #define GLfloatP_var(number) (bgl_buffer##number)->buf.asvoid
106 #define GLfloatP_ref(number) &BGL_bufferType, &bgl_buffer##number
107 #define GLfloatP_def(number) Buffer *bgl_buffer##number
109 #define GLdoubleP_str "O!"
110 #define GLdoubleP_var(number) (bgl_buffer##number)->buf.asvoid
111 #define GLdoubleP_ref(number) &BGL_bufferType, &bgl_buffer##number
112 #define GLdoubleP_def(number) Buffer *bgl_buffer##number
115 # define GLclampfP_str "O!"
116 # define GLclampfP_var(number) (bgl_buffer##number)->buf.asvoid
117 # define GLclampfP_ref(number) &BGL_bufferType, &bgl_buffer##number
118 # define GLclampfP_def(number) Buffer *bgl_buffer##number
126 #define GLvoidP_str "O&"
127 #define GLvoidP_var(number) \
128 ((bgl_buffer##number.buffer) ? (bgl_buffer##number.buffer)->buf.asvoid : \
129 (bgl_buffer##number.offset))
130 #define GLvoidP_ref(number) BGL_BufferOrOffsetConverter, &bgl_buffer##number
131 #define GLvoidP_def(number) BufferOrOffset bgl_buffer##number
133 #define GLsizeiP_str "O!"
134 #define GLsizeiP_var(number) (bgl_buffer##number)->buf.asvoid
135 #define GLsizeiP_ref(number) &BGL_bufferType, &bgl_buffer##number
136 #define GLsizeiP_def(number) Buffer *bgl_buffer##number
138 #define GLcharP_str "O!"
139 #define GLcharP_var(number) (bgl_buffer##number)->buf.asvoid
140 #define GLcharP_ref(number) &BGL_bufferType, &bgl_buffer##number
141 #define GLcharP_def(number) Buffer *bgl_buffer##number
144 # define buffer_str "O!"
145 # define buffer_var(number) (bgl_buffer##number)->buf.asvoid
146 # define buffer_ref(number) &BGL_bufferType, &bgl_buffer##number
147 # define buffer_def(number) Buffer *bgl_buffer##number
159 #define GLenum_str "i"
160 #define GLenum_var(num) bgl_var##num
161 #define GLenum_ref(num) &bgl_var##num
162 #define GLenum_def(num) int GLenum_var(num)
165 #define GLboolean_str "b"
166 #define GLboolean_var(num) bgl_var##num
167 #define GLboolean_ref(num) &bgl_var##num
168 #define GLboolean_def(num) char GLboolean_var(num)
171 #define GLbitfield_str "i"
172 #define GLbitfield_var(num) bgl_var##num
173 #define GLbitfield_ref(num) &bgl_var##num
174 #define GLbitfield_def(num) int GLbitfield_var(num)
178 # define GLbyte_str "b"
179 # define GLbyte_var(num) bgl_var##num
180 # define GLbyte_ref(num) &bgl_var##num
181 # define GLbyte_def(num) signed char GLbyte_var(num)
185 #define GLshort_str "h"
186 #define GLshort_var(num) bgl_var##num
187 #define GLshort_ref(num) &bgl_var##num
188 #define GLshort_def(num) short GLshort_var(num)
191 #define GLint_str "i"
192 #define GLint_var(num) bgl_var##num
193 #define GLint_ref(num) &bgl_var##num
194 #define GLint_def(num) int GLint_var(num)
197 #define GLsizei_str "n"
198 #define GLsizei_var(num) bgl_var##num
199 #define GLsizei_ref(num) &bgl_var##num
200 #define GLsizei_def(num) size_t GLsizei_var(num)
203 #define GLsizeiptr_str "n"
204 #define GLsizeiptr_var(num) bgl_var##num
205 #define GLsizeiptr_ref(num) &bgl_var##num
206 #define GLsizeiptr_def(num) size_t GLsizeiptr_var(num)
209 #define GLintptr_str "n"
210 #define GLintptr_var(num) bgl_var##num
211 #define GLintptr_ref(num) &bgl_var##num
212 #define GLintptr_def(num) size_t GLintptr_var(num)
215 #define GLubyte_str "B"
216 #define GLubyte_var(num) bgl_var##num
217 #define GLubyte_ref(num) &bgl_var##num
218 #define GLubyte_def(num) char GLubyte_var(num)
222 # define GLushort_str "H"
223 # define GLushort_var(num) bgl_var##num
224 # define GLushort_ref(num) &bgl_var##num
225 # define GLushort_def(num) short GLushort_var(num)
229 #define GLuint_str "I"
230 #define GLuint_var(num) bgl_var##num
231 #define GLuint_ref(num) &bgl_var##num
232 #define GLuint_def(num) int GLuint_var(num)
236 # define GLuint64_str "Q"
237 # define GLuint64_var(num) bgl_var##num
238 # define GLuint64_ref(num) &bgl_var##num
239 # define GLuint64_def(num) int GLuint64_var(num)
244 # define GLsync_str "I"
245 # define GLsync_var(num) bgl_var##num
246 # define GLsync_ref(num) &bgl_var##num
247 # define GLsync_def(num) int GLsync_var(num)
251 #define GLfloat_str "f"
252 #define GLfloat_var(num) bgl_var##num
253 #define GLfloat_ref(num) &bgl_var##num
254 #define GLfloat_def(num) float GLfloat_var(num)
257 #define GLstring_str "s"
258 #define GLstring_var(number) bgl_var##number
259 #define GLstring_ref(number) &bgl_var##number
260 #define GLstring_def(number) char *GLstring_var(number)
264 # define GLclampf_str "f"
265 # define GLclampf_var(num) bgl_var##num
266 # define GLclampf_ref(num) &bgl_var##num
267 # define GLclampf_def(num) float GLclampf_var(num)
271 #define GLdouble_str "d"
272 #define GLdouble_var(num) bgl_var##num
273 #define GLdouble_ref(num) &bgl_var##num
274 #define GLdouble_def(num) double GLdouble_var(num)
278 # define GLclampd_str "d"
279 # define GLclampd_var(num) bgl_var##num
280 # define GLclampd_ref(num) &bgl_var##num
281 # define GLclampd_def(num) double GLclampd_var(num)
284 #define _arg_def1(a1) a1##_def(1)
285 #define _arg_def2(a1, a2) \
288 #define _arg_def3(a1, a2, a3) \
291 #define _arg_def4(a1, a2, a3, a4) \
292 _arg_def3(a1, a2, a3); \
294 #define _arg_def5(a1, a2, a3, a4, a5) \
295 _arg_def4(a1, a2, a3, a4); \
297 #define _arg_def6(a1, a2, a3, a4, a5, a6) \
298 _arg_def5(a1, a2, a3, a4, a5); \
300 #define _arg_def7(a1, a2, a3, a4, a5, a6, a7) \
301 _arg_def6(a1, a2, a3, a4, a5, a6); \
303 #define _arg_def8(a1, a2, a3, a4, a5, a6, a7, a8) \
304 _arg_def7(a1, a2, a3, a4, a5, a6, a7); \
306 #define _arg_def9(a1, a2, a3, a4, a5, a6, a7, a8, a9) \
307 _arg_def8(a1, a2, a3, a4, a5, a6, a7, a8); \
309 #define _arg_def10(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) \
310 _arg_def9(a1, a2, a3, a4, a5, a6, a7, a8, a9); \
312 #define _arg_def11(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) \
313 _arg_def10(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10); \
315 #define arg_def(...) VA_NARGS_CALL_OVERLOAD(_arg_def, __VA_ARGS__)
317 #define _arg_var1(a1) a1##_var(1)
318 #define _arg_var2(a1, a2) _arg_var1(a1), a2##_var(2)
319 #define _arg_var3(a1, a2, a3) _arg_var2(a1, a2), a3##_var(3)
320 #define _arg_var4(a1, a2, a3, a4) _arg_var3(a1, a2, a3), a4##_var(4)
321 #define _arg_var5(a1, a2, a3, a4, a5) _arg_var4(a1, a2, a3, a4), a5##_var(5)
322 #define _arg_var6(a1, a2, a3, a4, a5, a6) _arg_var5(a1, a2, a3, a4, a5), a6##_var(6)
323 #define _arg_var7(a1, a2, a3, a4, a5, a6, a7) _arg_var6(a1, a2, a3, a4, a5, a6), a7##_var(7)
324 #define _arg_var8(a1, a2, a3, a4, a5, a6, a7, a8) \
325 _arg_var7(a1, a2, a3, a4, a5, a6, a7), a8##_var(8)
326 #define _arg_var9(a1, a2, a3, a4, a5, a6, a7, a8, a9) \
327 _arg_var8(a1, a2, a3, a4, a5, a6, a7, a8), a9##_var(9)
328 #define _arg_var10(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) \
329 _arg_var9(a1, a2, a3, a4, a5, a6, a7, a8, a9), a10##_var(10)
330 #define _arg_var11(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) \
331 _arg_var10(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10), a11##_var(11)
332 #define arg_var(...) VA_NARGS_CALL_OVERLOAD(_arg_var, __VA_ARGS__)
334 #define _arg_ref1(a1) a1##_ref(1)
335 #define _arg_ref2(a1, a2) _arg_ref1(a1), a2##_ref(2)
336 #define _arg_ref3(a1, a2, a3) _arg_ref2(a1, a2), a3##_ref(3)
337 #define _arg_ref4(a1, a2, a3, a4) _arg_ref3(a1, a2, a3), a4##_ref(4)
338 #define _arg_ref5(a1, a2, a3, a4, a5) _arg_ref4(a1, a2, a3, a4), a5##_ref(5)
339 #define _arg_ref6(a1, a2, a3, a4, a5, a6) _arg_ref5(a1, a2, a3, a4, a5), a6##_ref(6)
340 #define _arg_ref7(a1, a2, a3, a4, a5, a6, a7) _arg_ref6(a1, a2, a3, a4, a5, a6), a7##_ref(7)
341 #define _arg_ref8(a1, a2, a3, a4, a5, a6, a7, a8) \
342 _arg_ref7(a1, a2, a3, a4, a5, a6, a7), a8##_ref(8)
343 #define _arg_ref9(a1, a2, a3, a4, a5, a6, a7, a8, a9) \
344 _arg_ref8(a1, a2, a3, a4, a5, a6, a7, a8), a9##_ref(9)
345 #define _arg_ref10(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) \
346 _arg_ref9(a1, a2, a3, a4, a5, a6, a7, a8, a9), a10##_ref(10)
347 #define _arg_ref11(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) \
348 _arg_ref10(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10), a11##_ref(11)
349 #define arg_ref(...) VA_NARGS_CALL_OVERLOAD(_arg_ref, __VA_ARGS__)
351 #define _arg_str1(a1) a1##_str
352 #define _arg_str2(a1, a2) _arg_str1(a1) a2##_str
353 #define _arg_str3(a1, a2, a3) _arg_str2(a1, a2) a3##_str
354 #define _arg_str4(a1, a2, a3, a4) _arg_str3(a1, a2, a3) a4##_str
355 #define _arg_str5(a1, a2, a3, a4, a5) _arg_str4(a1, a2, a3, a4) a5##_str
356 #define _arg_str6(a1, a2, a3, a4, a5, a6) _arg_str5(a1, a2, a3, a4, a5) a6##_str
357 #define _arg_str7(a1, a2, a3, a4, a5, a6, a7) _arg_str6(a1, a2, a3, a4, a5, a6) a7##_str
358 #define _arg_str8(a1, a2, a3, a4, a5, a6, a7, a8) _arg_str7(a1, a2, a3, a4, a5, a6, a7) a8##_str
359 #define _arg_str9(a1, a2, a3, a4, a5, a6, a7, a8, a9) \
360 _arg_str8(a1, a2, a3, a4, a5, a6, a7, a8) a9##_str
361 #define _arg_str10(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) \
362 _arg_str9(a1, a2, a3, a4, a5, a6, a7, a8, a9) a10##_str
363 #define _arg_str11(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) \
364 _arg_str10(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) a11##_str
365 #define arg_str(...) VA_NARGS_CALL_OVERLOAD(_arg_str, __VA_ARGS__)
369 #define ret_ret_void return Py_INCREF(Py_None), Py_None
371 #define ret_def_GLint int ret_int
372 #define ret_set_GLint ret_int =
373 #define ret_ret_GLint return PyLong_FromLong(ret_int)
375 #define ret_def_GLuint uint ret_uint
376 #define ret_set_GLuint ret_uint =
377 #define ret_ret_GLuint return PyLong_FromLong((long)ret_uint)
380 # define ret_def_GLsizei size_t ret_size_t
381 # define ret_set_GLsizei ret_size_t =
382 # define ret_ret_GLsizei return PyLong_FromSsize_t(ret_size_t)
386 # define ret_def_GLsync uint ret_sync
387 # define ret_set_GLsync ret_sync =
388 # define ret_ret_GLsync return PyLong_FromLong((long)ret_sync)
391 #define ret_def_GLenum uint ret_uint
392 #define ret_set_GLenum ret_uint =
393 #define ret_ret_GLenum return PyLong_FromLong((long)ret_uint)
395 #define ret_def_GLboolean uchar ret_bool
396 #define ret_set_GLboolean ret_bool =
397 #define ret_ret_GLboolean return PyLong_FromLong((long)ret_bool)
399 #define ret_def_GLstring const uchar *ret_str
400 #define ret_set_GLstring ret_str =
402 #define ret_ret_GLstring \
404 return PyUnicode_FromString((const char *)ret_str); \
407 PyErr_SetString(PyExc_AttributeError, "could not get opengl string"); \
438 return sizeof(short);
442 return sizeof(
float);
452 const Py_ssize_t itemsize = pybuffer->itemsize;
479 for (
int i = 0; i < ndim; i++) {
480 if (dim1[i] != dim2[i]) {
498 (ssizessizeargfunc)
NULL,
500 (ssizessizeobjargproc)
NULL,
517 int i,
len =
self->dimensions[0];
518 PyObject *list = PyList_New(
len);
520 for (i = 0; i <
len; i++) {
531 if (
self->ndimensions > 1) {
532 int i,
len =
self->dimensions[0];
533 list = PyList_New(
len);
535 for (i = 0; i <
len; i++) {
550 PyObject *list = PyList_New(
self->ndimensions);
553 for (i = 0; i <
self->ndimensions; i++) {
554 PyList_SET_ITEM(list, i, PyLong_FromLong(
self->dimensions[i]));
571 PyVarObject_HEAD_INIT(
NULL, 0)
"bgl.Buffer",
640 PyObject *parent,
int type,
int ndimensions,
int *dimensions,
void *buf)
646 buffer->ndimensions = ndimensions;
647 buffer->dimensions =
MEM_mallocN(ndimensions *
sizeof(
int),
"Buffer dimensions");
648 memcpy(
buffer->dimensions, dimensions, ndimensions *
sizeof(
int));
661 for (i = 0; i < ndimensions; i++) {
662 size *= dimensions[i];
683 if (
object == Py_None) {
688 if (PyNumber_Check(
object)) {
689 const Py_ssize_t
offset = PyNumber_AsSsize_t(
object, PyExc_IndexError);
690 if (
offset == -1 && PyErr_Occurred()) {
704 PyErr_SetString(PyExc_TypeError,
"expected a bgl.Buffer or None");
708 #define MAX_DIMENSIONS 256
716 Py_ssize_t i, ndimensions = 0;
718 if (kwds && PyDict_Size(kwds)) {
719 PyErr_SetString(PyExc_TypeError,
"bgl.Buffer(): takes no keyword args");
723 if (!PyArg_ParseTuple(args,
"iO|O: bgl.Buffer", &
type, &length_ob, &
init)) {
726 if (!
ELEM(
type, GL_BYTE, GL_SHORT, GL_INT, GL_FLOAT, GL_DOUBLE)) {
727 PyErr_SetString(PyExc_AttributeError,
728 "invalid first argument type, should be one of "
729 "GL_BYTE, GL_SHORT, GL_INT, GL_FLOAT or GL_DOUBLE");
733 if (PyLong_Check(length_ob)) {
735 if (((dimensions[0] = PyLong_AsLong(length_ob)) < 1)) {
736 PyErr_SetString(PyExc_AttributeError,
741 else if (PySequence_Check(length_ob)) {
742 ndimensions = PySequence_Size(length_ob);
744 PyErr_SetString(PyExc_AttributeError,
748 if (ndimensions < 1) {
749 PyErr_SetString(PyExc_AttributeError,
"sequence must have at least one dimension");
752 for (i = 0; i < ndimensions; i++) {
753 PyObject *ob = PySequence_GetItem(length_ob, i);
755 if (!PyLong_Check(ob)) {
759 dimensions[i] = PyLong_AsLong(ob);
763 if (dimensions[i] < 1) {
764 PyErr_SetString(PyExc_AttributeError,
771 PyErr_Format(PyExc_TypeError,
772 "invalid second argument expected a sequence "
773 "or an int, not a %.200s",
774 Py_TYPE(length_ob)->tp_name);
778 if (
init && PyObject_CheckBuffer(
init)) {
781 if (PyObject_GetBuffer(
init, &pybuffer, PyBUF_ND | PyBUF_FORMAT) == -1) {
787 PyErr_Format(PyExc_TypeError,
788 "`GL_TYPE` and `typestr` of object with buffer interface do not match. '%s'",
791 else if (ndimensions != pybuffer.ndim ||
793 PyErr_Format(PyExc_TypeError,
"array size does not match");
799 PyBuffer_Release(&pybuffer);
809 return (PyObject *)
buffer;
816 return self->dimensions[0];
821 if (i >=
self->dimensions[0] || i < 0) {
822 PyErr_SetString(PyExc_IndexError,
"array index out of range");
826 if (
self->ndimensions == 1) {
827 switch (
self->type) {
829 return Py_BuildValue(
"b",
self->buf.asbyte[i]);
831 return Py_BuildValue(
"h",
self->buf.asshort[i]);
833 return Py_BuildValue(
"i",
self->buf.asint[i]);
835 return PyFloat_FromDouble(
self->buf.asfloat[i]);
837 return Py_BuildValue(
"d",
self->buf.asdouble[i]);
843 for (j = 1; j <
self->ndimensions; j++) {
844 offset *=
self->dimensions[j];
849 self->ndimensions - 1,
850 self->dimensions + 1,
865 if (end >
self->dimensions[0]) {
866 end =
self->dimensions[0];
872 list = PyList_New(end - begin);
882 if (i >=
self->dimensions[0] || i < 0) {
883 PyErr_SetString(PyExc_IndexError,
"array assignment index out of range");
887 if (
self->ndimensions != 1) {
899 switch (
self->type) {
901 return PyArg_Parse(
v,
"b:Expected ints", &
self->buf.asbyte[i]) ? 0 : -1;
903 return PyArg_Parse(
v,
"h:Expected ints", &
self->buf.asshort[i]) ? 0 : -1;
905 return PyArg_Parse(
v,
"i:Expected ints", &
self->buf.asint[i]) ? 0 : -1;
907 return PyArg_Parse(
v,
"f:Expected floats", &
self->buf.asfloat[i]) ? 0 : -1;
909 return PyArg_Parse(
v,
"d:Expected floats", &
self->buf.asdouble[i]) ? 0 : -1;
923 if (end >
self->dimensions[0]) {
924 end =
self->dimensions[0];
930 if (!PySequence_Check(seq)) {
931 PyErr_Format(PyExc_TypeError,
932 "buffer[:] = value, invalid assignment. "
933 "Expected a sequence, not an %.200s type",
934 Py_TYPE(seq)->tp_name);
939 if ((
count = PySequence_Size(seq)) != (end - begin)) {
940 PyErr_Format(PyExc_TypeError,
941 "buffer[:] = value, size mismatch in assignment. "
942 "Expected: %d (given: %d)",
949 item = PySequence_GetItem(seq,
count - begin);
966 if (PyIndex_Check(item)) {
968 i = PyNumber_AsSsize_t(item, PyExc_IndexError);
969 if (i == -1 && PyErr_Occurred()) {
973 i +=
self->dimensions[0];
977 if (PySlice_Check(item)) {
978 Py_ssize_t start, stop, step, slicelength;
980 if (PySlice_GetIndicesEx(item,
self->dimensions[0], &start, &stop, &step, &slicelength) < 0) {
984 if (slicelength <= 0) {
985 return PyTuple_New(0);
991 PyErr_SetString(PyExc_IndexError,
"slice steps not supported with vectors");
996 PyExc_TypeError,
"buffer indices must be integers, not %.200s", Py_TYPE(item)->tp_name);
1002 if (PyIndex_Check(item)) {
1003 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
1004 if (i == -1 && PyErr_Occurred()) {
1008 i +=
self->dimensions[0];
1012 if (PySlice_Check(item)) {
1013 Py_ssize_t start, stop, step, slicelength;
1015 if (PySlice_GetIndicesEx(item,
self->dimensions[0], &start, &stop, &step, &slicelength) < 0) {
1023 PyErr_SetString(PyExc_IndexError,
"slice steps not supported with vectors");
1028 PyExc_TypeError,
"buffer indices must be integers, not %.200s", Py_TYPE(item)->tp_name);
1035 Py_DECREF(
self->parent);
1050 const char *typestr;
1052 switch (
self->type) {
1054 typestr =
"GL_BYTE";
1057 typestr =
"GL_SHORT";
1063 typestr =
"GL_FLOAT";
1066 typestr =
"GL_DOUBLE";
1069 typestr =
"UNKNOWN";
1073 repr = PyUnicode_FromFormat(
"Buffer(%s, %R)", typestr, list);
1086 # define BGL_Wrap(funcname, ret, arg_list) \
1087 static PyObject *Method_##funcname(PyObject *UNUSED(self), PyObject *args) \
1091 if (!PyArg_ParseTuple(args, arg_str arg_list, arg_ref arg_list)) { \
1095 ret_set_##ret gl##funcname(arg_var arg_list); \
1102 PyErr_SetString(PyExc_RuntimeError,
"Built without OpenGL support");
1105 # define BGL_Wrap(funcname, ret, arg_list) \
1106 static PyObject *Method_##funcname(PyObject *UNUSED(self), PyObject *args) \
1109 bgl_no_opengl_error(); \
1117 BGL_Wrap(ClearColor,
void, (GLfloat, GLfloat, GLfloat, GLfloat));
1120 BGL_Wrap(ColorMask,
void, (GLboolean, GLboolean, GLboolean, GLboolean));
1137 BGL_Wrap(GetTexImage,
void, (GLenum, GLint, GLenum, GLenum, GLvoidP));
1138 BGL_Wrap(GetTexLevelParameterfv,
void, (GLenum, GLint, GLenum, GLfloatP));
1139 BGL_Wrap(GetTexLevelParameteriv,
void, (GLenum, GLint, GLenum, GLintP));
1140 BGL_Wrap(GetTexParameterfv,
void, (GLenum, GLenum, GLfloatP));
1141 BGL_Wrap(GetTexParameteriv,
void, (GLenum, GLenum, GLintP));
1151 BGL_Wrap(ReadPixels,
void, (GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, GLvoidP));
1152 BGL_Wrap(Scissor,
void, (GLint, GLint, GLsizei, GLsizei));
1156 BGL_Wrap(TexImage1D,
void, (GLenum, GLint, GLint, GLsizei, GLint, GLenum, GLenum, GLvoidP));
1159 (GLenum, GLint, GLint, GLsizei, GLsizei, GLint, GLenum, GLenum, GLvoidP));
1160 BGL_Wrap(TexParameterf,
void, (GLenum, GLenum, GLfloat));
1161 BGL_Wrap(TexParameterfv,
void, (GLenum, GLenum, GLfloatP));
1162 BGL_Wrap(TexParameteri,
void, (GLenum, GLenum, GLint));
1163 BGL_Wrap(TexParameteriv,
void, (GLenum, GLenum, GLintP));
1164 BGL_Wrap(Viewport,
void, (GLint, GLint, GLsizei, GLsizei));
1168 BGL_Wrap(CopyTexImage1D,
void, (GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLint));
1169 BGL_Wrap(CopyTexImage2D,
void, (GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLsizei, GLint));
1170 BGL_Wrap(CopyTexSubImage1D,
void, (GLenum, GLint, GLint, GLint, GLint, GLsizei));
1171 BGL_Wrap(CopyTexSubImage2D,
void, (GLenum, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei));
1174 BGL_Wrap(DrawElements,
void, (GLenum, GLsizei, GLenum, GLvoidP));
1178 BGL_Wrap(TexSubImage1D,
void, (GLenum, GLint, GLint, GLsizei, GLenum, GLenum, GLvoidP));
1181 (GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, GLvoidP));
1186 (GLenum, GLint, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei));
1187 BGL_Wrap(DrawRangeElements,
void, (GLenum, GLuint, GLuint, GLsizei, GLenum, GLvoidP));
1190 (GLenum, GLint, GLint, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, GLvoidP));
1193 (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum, GLvoidP));
1197 BGL_Wrap(CompressedTexImage1D,
void, (GLenum, GLint, GLenum, GLsizei, GLint, GLsizei, GLvoidP));
1200 (GLenum, GLint, GLenum, GLsizei, GLsizei, GLint, GLsizei, GLvoidP));
1203 (GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLsizei, GLvoidP));
1204 BGL_Wrap(CompressedTexSubImage1D,
void, (GLenum, GLint, GLint, GLsizei, GLenum, GLsizei, GLvoidP));
1207 (GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLsizei, GLvoidP));
1209 CompressedTexSubImage3D,
1211 (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLsizei, GLvoidP));
1212 BGL_Wrap(GetCompressedTexImage,
void, (GLenum, GLint, GLvoidP));
1216 BGL_Wrap(BlendColor,
void, (GLfloat, GLfloat, GLfloat, GLfloat));
1222 BGL_Wrap(BufferData,
void, (GLenum, GLsizeiptr, GLvoidP, GLenum));
1223 BGL_Wrap(BufferSubData,
void, (GLenum, GLintptr, GLsizeiptr, GLvoidP));
1229 BGL_Wrap(GetBufferParameteriv,
void, (GLenum, GLenum, GLintP));
1230 BGL_Wrap(GetBufferPointerv,
void, (GLenum, GLenum, GLvoidP));
1231 BGL_Wrap(GetBufferSubData,
void, (GLenum, GLintptr, GLsizeiptr, GLvoidP));
1232 BGL_Wrap(GetQueryObjectiv,
void, (GLuint, GLenum, GLintP));
1233 BGL_Wrap(GetQueryObjectuiv,
void, (GLuint, GLenum, GLuintP));
1242 BGL_Wrap(BindAttribLocation,
void, (GLuint, GLuint, GLstring));
1243 BGL_Wrap(BlendEquationSeparate,
void, (GLenum, GLenum));
1253 BGL_Wrap(GetActiveAttrib,
void, (GLuint, GLuint, GLsizei, GLsizeiP, GLintP, GLenumP, GLcharP));
1254 BGL_Wrap(GetActiveUniform,
void, (GLuint, GLuint, GLsizei, GLsizeiP, GLintP, GLenumP, GLcharP));
1255 BGL_Wrap(GetAttachedShaders,
void, (GLuint, GLsizei, GLsizeiP, GLuintP));
1256 BGL_Wrap(GetAttribLocation, GLint, (GLuint, GLstring));
1257 BGL_Wrap(GetProgramInfoLog,
void, (GLuint, GLsizei, GLsizeiP, GLcharP));
1258 BGL_Wrap(GetProgramiv,
void, (GLuint, GLenum, GLintP));
1259 BGL_Wrap(GetShaderInfoLog,
void, (GLuint, GLsizei, GLsizeiP, GLcharP));
1260 BGL_Wrap(GetShaderSource,
void, (GLuint, GLsizei, GLsizeiP, GLcharP));
1262 BGL_Wrap(GetUniformLocation, GLint, (GLuint, GLstring));
1263 BGL_Wrap(GetUniformfv,
void, (GLuint, GLint, GLfloatP));
1265 BGL_Wrap(GetVertexAttribPointerv,
void, (GLuint, GLenum, GLvoidP));
1266 BGL_Wrap(GetVertexAttribdv,
void, (GLuint, GLenum, GLdoubleP));
1267 BGL_Wrap(GetVertexAttribfv,
void, (GLuint, GLenum, GLfloatP));
1268 BGL_Wrap(GetVertexAttribiv,
void, (GLuint, GLenum, GLintP));
1272 BGL_Wrap(StencilFuncSeparate,
void, (GLenum, GLenum, GLint, GLuint));
1274 BGL_Wrap(StencilOpSeparate,
void, (GLenum, GLenum, GLenum, GLenum));
1276 BGL_Wrap(Uniform1fv,
void, (GLint, GLsizei, GLfloatP));
1280 BGL_Wrap(Uniform2fv,
void, (GLint, GLsizei, GLfloatP));
1283 BGL_Wrap(Uniform3f,
void, (GLint, GLfloat, GLfloat, GLfloat));
1284 BGL_Wrap(Uniform3fv,
void, (GLint, GLsizei, GLfloatP));
1285 BGL_Wrap(Uniform3i,
void, (GLint, GLint, GLint, GLint));
1287 BGL_Wrap(Uniform4f,
void, (GLint, GLfloat, GLfloat, GLfloat, GLfloat));
1288 BGL_Wrap(Uniform4fv,
void, (GLint, GLsizei, GLfloatP));
1289 BGL_Wrap(Uniform4i,
void, (GLint, GLint, GLint, GLint, GLint));
1291 BGL_Wrap(UniformMatrix2fv,
void, (GLint, GLsizei, GLboolean, GLfloatP));
1292 BGL_Wrap(UniformMatrix3fv,
void, (GLint, GLsizei, GLboolean, GLfloatP));
1293 BGL_Wrap(UniformMatrix4fv,
void, (GLint, GLsizei, GLboolean, GLfloatP));
1302 BGL_Wrap(VertexAttrib2d,
void, (GLuint, GLdouble, GLdouble));
1304 BGL_Wrap(VertexAttrib2f,
void, (GLuint, GLfloat, GLfloat));
1306 BGL_Wrap(VertexAttrib2s,
void, (GLuint, GLshort, GLshort));
1308 BGL_Wrap(VertexAttrib3d,
void, (GLuint, GLdouble, GLdouble, GLdouble));
1310 BGL_Wrap(VertexAttrib3f,
void, (GLuint, GLfloat, GLfloat, GLfloat));
1312 BGL_Wrap(VertexAttrib3s,
void, (GLuint, GLshort, GLshort, GLshort));
1317 BGL_Wrap(VertexAttrib4Nub,
void, (GLuint, GLubyte, GLubyte, GLubyte, GLubyte));
1320 BGL_Wrap(VertexAttrib4Nusv,
void, (GLuint, GLushortP));
1322 BGL_Wrap(VertexAttrib4d,
void, (GLuint, GLdouble, GLdouble, GLdouble, GLdouble));
1324 BGL_Wrap(VertexAttrib4f,
void, (GLuint, GLfloat, GLfloat, GLfloat, GLfloat));
1327 BGL_Wrap(VertexAttrib4s,
void, (GLuint, GLshort, GLshort, GLshort, GLshort));
1332 BGL_Wrap(VertexAttribPointer,
void, (GLuint, GLint, GLenum, GLboolean, GLsizei, GLvoidP));
1335 BGL_Wrap(UniformMatrix2x3fv,
void, (GLint, GLsizei, GLboolean, GLfloatP));
1336 BGL_Wrap(UniformMatrix2x4fv,
void, (GLint, GLsizei, GLboolean, GLfloatP));
1337 BGL_Wrap(UniformMatrix3x2fv,
void, (GLint, GLsizei, GLboolean, GLfloatP));
1338 BGL_Wrap(UniformMatrix3x4fv,
void, (GLint, GLsizei, GLboolean, GLfloatP));
1339 BGL_Wrap(UniformMatrix4x2fv,
void, (GLint, GLsizei, GLboolean, GLfloatP));
1340 BGL_Wrap(UniformMatrix4x3fv,
void, (GLint, GLsizei, GLboolean, GLfloatP));
1348 (GLint, GLint, GLint, GLint, GLint, GLint, GLint, GLint, GLbitfield, GLenum));
1350 BGL_Wrap(DeleteFramebuffers,
void, (GLsizei, GLuintP));
1351 BGL_Wrap(DeleteRenderbuffers,
void, (GLsizei, GLuintP));
1352 BGL_Wrap(DeleteVertexArrays,
void, (GLsizei, GLuintP));
1353 BGL_Wrap(FramebufferRenderbuffer,
void, (GLenum, GLenum, GLenum, GLuint));
1359 BGL_Wrap(RenderbufferStorage,
void, (GLenum, GLenum, GLsizei, GLsizei));
1360 BGL_Wrap(VertexAttribIPointer,
void, (GLuint, GLint, GLenum, GLsizei, GLvoidP));
1363 BGL_Wrap(BindBufferBase,
void, (GLenum, GLuint, GLuint));
1364 BGL_Wrap(BindBufferRange,
void, (GLenum, GLuint, GLuint, GLintptr, GLsizeiptr));
1365 BGL_Wrap(GetActiveUniformBlockName,
void, (GLuint, GLuint, GLsizei, GLsizeiP, GLcharP));
1366 BGL_Wrap(GetActiveUniformBlockiv,
void, (GLuint, GLuint, GLenum, GLintP));
1367 BGL_Wrap(GetActiveUniformName,
void, (GLuint, GLuint, GLsizei, GLsizeiP, GLcharP));
1368 BGL_Wrap(GetActiveUniformsiv,
void, (GLuint, GLsizei, GLuintP, GLenum, GLintP));
1369 BGL_Wrap(GetIntegeri_v,
void, (GLenum, GLuint, GLintP));
1370 BGL_Wrap(GetUniformBlockIndex, GLuint, (GLuint, GLstring));
1371 BGL_Wrap(GetUniformIndices,
void, (GLuint, GLsizei, GLcharP, GLuintP));
1372 BGL_Wrap(UniformBlockBinding,
void, (GLuint, GLuint, GLuint));
1375 BGL_Wrap(FramebufferTexture,
void, (GLenum, GLenum, GLuint, GLint));
1376 BGL_Wrap(GetBufferParameteri64v,
void, (GLenum, GLenum, GLint64P));
1377 BGL_Wrap(GetInteger64i_v,
void, (GLenum, GLuint, GLint64P));
1378 BGL_Wrap(GetMultisamplefv,
void, (GLenum, GLuint, GLfloatP));
1380 BGL_Wrap(TexImage2DMultisample,
void, (GLenum, GLsizei, GLenum, GLsizei, GLsizei, GLboolean));
1383 (GLenum, GLsizei, GLenum, GLsizei, GLsizei, GLsizei, GLboolean));
1395 PyModuleDef_HEAD_INIT,
1409 PyDict_SetItemString(dict, name, item = PyLong_FromLong(value));
1416 PyDict_SetItemString(dict, name, item = PyLong_FromLongLong(value));
1422 PyMethodDef *method_def,
1427 m = PyCFunction_NewEx(method_def,
NULL, submodule);
1428 PyDict_SetItemString(dict, method_def->ml_name, m);
1432 PyDict_SetItemString(dict, method_def->ml_name, Py_None);
1438 # pragma GCC diagnostic ignored "-Waddress"
1442 # define PY_MOD_ADD_METHOD(func) \
1444 static PyMethodDef method_def = {"gl" #func, Method_##func, METH_VARARGS}; \
1445 py_module_dict_add_method(submodule, dict, &method_def, (gl##func != NULL)); \
1449 # define PY_MOD_ADD_METHOD(func) \
1451 static PyMethodDef method_def = {"gl" #func, Method_##func, METH_VARARGS}; \
1452 py_module_dict_add_method(submodule, dict, &method_def, false); \
1733 #define PY_DICT_ADD_INT(x) py_module_dict_add_int(dict, #x, x)
1734 #define PY_DICT_ADD_INT64(x) py_module_dict_add_int64(dict, #x, x)
2601 PyObject *submodule, *dict;
2603 dict = PyModule_GetDict(submodule);
2609 PyModule_AddObject(submodule,
"Buffer", (PyObject *)&
BGL_bufferType);
2645 if (!PyArg_ParseTuple(args,
"Is", &shader, &source)) {
2650 glShaderSource(shader, 1, (
const char **)&source,
NULL);
typedef float(TangentPoint)[2]
typedef double(DMatrix)[4][4]
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum type
Read Guarded memory(de)allocation.
static int gl_buffer_type_from_py_buffer(Py_buffer *pybuffer)
static PyObject * Buffer_dimensions(Buffer *self, void *UNUSED(arg))
static PyObject * Buffer_slice(Buffer *self, int begin, int end)
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_to_list(Buffer *self)
static void init_bgl_version_1_2_methods(PyObject *submodule, PyObject *dict)
static PyObject * Buffer_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
static void Buffer_dealloc(Buffer *self)
static void init_bgl_version_3_0_constants(PyObject *dict)
PyObject * BPyInit_bgl(void)
static PyObject * Buffer_item(Buffer *self, int i)
int BGL_typeSize(int type)
PyTypeObject BGL_bufferType
static PyObject * Buffer_to_list_recursive(Buffer *self)
static void init_bgl_version_3_0_methods(PyObject *submodule, PyObject *dict)
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 PyObject * Method_ShaderSource(PyObject *self, PyObject *args)
static int BGL_BufferOrOffsetConverter(PyObject *object, BufferOrOffset *buffer)
static void init_bgl_version_1_3_methods(PyObject *submodule, PyObject *dict)
static void init_bgl_version_1_4_constants(PyObject *dict)
static void bgl_no_opengl_error(void)
static PyMappingMethods Buffer_AsMapping
static void init_bgl_version_3_2_methods(PyObject *submodule, PyObject *dict)
#define PY_DICT_ADD_INT(x)
static void init_bgl_version_1_0_methods(PyObject *submodule, PyObject *dict)
static void init_bgl_version_1_2_constants(PyObject *dict)
struct BufferOrOffset BufferOrOffset
static void init_bgl_version_1_5_methods(PyObject *submodule, PyObject *dict)
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 int Buffer_ass_item(Buffer *self, int i, PyObject *v)
static void init_bgl_version_1_1_constants(PyObject *dict)
#define PY_MOD_ADD_METHOD(func)
static PyObject * Buffer_repr(Buffer *self)
static void init_bgl_version_1_4_methods(PyObject *submodule, PyObject *dict)
static PyMethodDef Buffer_methods[]
static void init_bgl_version_3_2_constants(PyObject *dict)
static void init_bgl_version_3_3_methods(PyObject *UNUSED(submodule), PyObject *UNUSED(dict))
static void init_bgl_version_1_3_constants(PyObject *dict)
static void init_bgl_version_1_1_methods(PyObject *submodule, PyObject *dict)
static int Buffer_len(Buffer *self)
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 int Buffer_ass_slice(Buffer *self, int begin, int end, PyObject *seq)
static void init_bgl_version_2_0_methods(PyObject *submodule, PyObject *dict)
static struct PyModuleDef BGL_module_def
static void init_bgl_version_3_1_methods(PyObject *submodule, PyObject *dict)
static Buffer * BGL_MakeBuffer_FromData(PyObject *parent, int type, int ndimensions, int *dimensions, void *buf)
static void init_bgl_version_1_5_constants(PyObject *dict)
Buffer * BGL_MakeBuffer(int type, int ndimensions, int *dimensions, void *initbuffer)
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)
ATTR_WARN_UNUSED_RESULT const BMVert * v
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
ccl_global float * buffer
ccl_gpu_kernel_postfix ccl_global float int int int int float bool int offset
void(* MEM_freeN)(void *vmemh)
void *(* MEM_mallocN)(size_t len, const char *str)
static void Flush(png_structp png_ptr)
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)
bool PyC_StructFmt_type_is_float_any(char format)