At last... this merge should finally do the trick!
[blender.git] / source / blender / python / generic / BGL.h
1 /* 
2  * $Id$
3  *
4  * ***** BEGIN GPL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
19  *
20  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
21  * All rights reserved.
22  *
23  * This is a new part of Blender.
24  *
25  * Contributor(s): Willian P. Germano
26  *
27  * ***** END GPL LICENSE BLOCK *****
28 */
29
30 /* This is the Blender.BGL part of opy_draw.c, from the old bpython/intern
31  * dir, with minor changes to adapt it to the new Python implementation.
32  * The BGL submodule "wraps" OpenGL functions and constants, allowing script
33  * writers to make OpenGL calls in their Python scripts for Blender.  The
34  * more important original comments are marked with an @ symbol. */
35
36 #ifndef EXPP_BGL_H
37 #define EXPP_BGL_H
38
39 #ifdef HAVE_CONFIG_H
40 #include <config.h>
41 #endif
42
43 #include <Python.h>
44 #include <GL/glew.h>
45 #include "../intern/bpy_compat.h"
46
47 PyObject *BGL_Init( const char *from );
48
49 /*@ Buffer Object */
50 /*@ For Python access to OpenGL functions requiring a pointer. */
51
52 typedef struct _Buffer {
53         PyObject_VAR_HEAD 
54         PyObject * parent;
55
56         int type;               /* GL_BYTE, GL_SHORT, GL_INT, GL_FLOAT */
57         int ndimensions;
58         int *dimensions;
59
60         union {
61                 char *asbyte;
62                 short *asshort;
63                 int *asint;
64                 float *asfloat;
65                 double *asdouble;
66
67                 void *asvoid;
68         } buf;
69 } Buffer;
70
71
72 /*@ By golly George! It looks like fancy pants macro time!!! */
73
74 /*
75 #define int_str       "i"
76 #define int_var(number)   bgl_int##number
77 #define int_ref(number)   &bgl_int##number
78 #define int_def(number)   int int_var(number)
79
80 #define float_str     "f"
81 #define float_var(number) bgl_float##number
82 #define float_ref(number) &bgl_float##number
83 #define float_def(number) float float_var(number)
84 */
85
86 /* TYPE_str is the string to pass to Py_ArgParse (for the format) */
87 /* TYPE_var is the name to pass to the GL function */
88 /* TYPE_ref is the pointer to pass to Py_ArgParse (to store in) */
89 /* TYPE_def is the C initialization of the variable */
90
91 #define void_str      ""
92 #define void_var(num)
93 #define void_ref(num)   &bgl_var##num
94 #define void_def(num)   char bgl_var##num
95
96 #define buffer_str      "O!"
97 #define buffer_var(number)  (bgl_buffer##number)->buf.asvoid
98 #define buffer_ref(number)  &buffer_Type, &bgl_buffer##number
99 #define buffer_def(number)  Buffer *bgl_buffer##number
100
101 /* GL Pointer fields, handled by buffer type */
102 /* GLdoubleP, GLfloatP, GLintP, GLuintP, GLshortP */
103
104 #define GLbooleanP_str      "O!"
105 #define GLbooleanP_var(number)  (bgl_buffer##number)->buf.asvoid
106 #define GLbooleanP_ref(number)  &buffer_Type, &bgl_buffer##number
107 #define GLbooleanP_def(number)  Buffer *bgl_buffer##number
108
109 #define GLbyteP_str     "O!"
110 #define GLbyteP_var(number) (bgl_buffer##number)->buf.asvoid
111 #define GLbyteP_ref(number) &buffer_Type, &bgl_buffer##number
112 #define GLbyteP_def(number) Buffer *bgl_buffer##number
113
114 #define GLubyteP_str      "O!"
115 #define GLubyteP_var(number)  (bgl_buffer##number)->buf.asvoid
116 #define GLubyteP_ref(number)  &buffer_Type, &bgl_buffer##number
117 #define GLubyteP_def(number)  Buffer *bgl_buffer##number
118
119 #define GLintP_str      "O!"
120 #define GLintP_var(number)  (bgl_buffer##number)->buf.asvoid
121 #define GLintP_ref(number)  &buffer_Type, &bgl_buffer##number
122 #define GLintP_def(number)  Buffer *bgl_buffer##number
123
124 #define GLuintP_str     "O!"
125 #define GLuintP_var(number) (bgl_buffer##number)->buf.asvoid
126 #define GLuintP_ref(number) &buffer_Type, &bgl_buffer##number
127 #define GLuintP_def(number) Buffer *bgl_buffer##number
128
129 #define GLshortP_str      "O!"
130 #define GLshortP_var(number)  (bgl_buffer##number)->buf.asvoid
131 #define GLshortP_ref(number)  &buffer_Type, &bgl_buffer##number
132 #define GLshortP_def(number)  Buffer *bgl_buffer##number
133
134 #define GLushortP_str     "O!"
135 #define GLushortP_var(number) (bgl_buffer##number)->buf.asvoid
136 #define GLushortP_ref(number) &buffer_Type, &bgl_buffer##number
137 #define GLushortP_def(number) Buffer *bgl_buffer##number
138
139 #define GLfloatP_str      "O!"
140 #define GLfloatP_var(number)  (bgl_buffer##number)->buf.asvoid
141 #define GLfloatP_ref(number)  &buffer_Type, &bgl_buffer##number
142 #define GLfloatP_def(number)  Buffer *bgl_buffer##number
143
144 #define GLdoubleP_str     "O!"
145 #define GLdoubleP_var(number) (bgl_buffer##number)->buf.asvoid
146 #define GLdoubleP_ref(number) &buffer_Type, &bgl_buffer##number
147 #define GLdoubleP_def(number) Buffer *bgl_buffer##number
148
149 #define GLclampfP_str     "O!"
150 #define GLclampfP_var(number) (bgl_buffer##number)->buf.asvoid
151 #define GLclampfP_ref(number) &buffer_Type, &bgl_buffer##number
152 #define GLclampfP_def(number) Buffer *bgl_buffer##number
153
154 #define GLvoidP_str     "O!"
155 #define GLvoidP_var(number) (bgl_buffer##number)->buf.asvoid
156 #define GLvoidP_ref(number) &buffer_Type, &bgl_buffer##number
157 #define GLvoidP_def(number) Buffer *bgl_buffer##number
158
159 #define buffer_str      "O!"
160 #define buffer_var(number)  (bgl_buffer##number)->buf.asvoid
161 #define buffer_ref(number)  &buffer_Type, &bgl_buffer##number
162 #define buffer_def(number)  Buffer *bgl_buffer##number
163
164 /*@The standard GL typedefs are used as prototypes, we can't
165  * use the GL type directly because Py_ArgParse expects normal
166  * C types.
167  * 
168  * Py_ArgParse doesn't grok writing into unsigned variables, 
169  * so we use signed everything (even stuff that should be unsigned.
170  */
171
172 /* typedef unsigned int GLenum; */
173 #define GLenum_str      "i"
174 #define GLenum_var(num)   bgl_var##num
175 #define GLenum_ref(num)   &bgl_var##num
176 #define GLenum_def(num)   /* unsigned */ int GLenum_var(num)
177
178 /* typedef unsigned int GLboolean; */
179 #define GLboolean_str     "b"
180 #define GLboolean_var(num)    bgl_var##num
181 #define GLboolean_ref(num)    &bgl_var##num
182 #define GLboolean_def(num)    /* unsigned */ char GLboolean_var(num)
183
184 /* typedef unsigned int GLbitfield; */
185 #define GLbitfield_str      "i"
186 #define GLbitfield_var(num)   bgl_var##num
187 #define GLbitfield_ref(num)   &bgl_var##num
188 #define GLbitfield_def(num)   /* unsigned */ int GLbitfield_var(num)
189
190 /* typedef signed char GLbyte; */
191 #define GLbyte_str        "b"
192 #define GLbyte_var(num)     bgl_var##num
193 #define GLbyte_ref(num)     &bgl_var##num
194 #define GLbyte_def(num)     signed char GLbyte_var(num)
195
196 /* typedef short GLshort; */
197 #define GLshort_str       "h"
198 #define GLshort_var(num)    bgl_var##num
199 #define GLshort_ref(num)    &bgl_var##num
200 #define GLshort_def(num)    short GLshort_var(num)
201
202 /* typedef int GLint; */
203 #define GLint_str       "i"
204 #define GLint_var(num)      bgl_var##num
205 #define GLint_ref(num)      &bgl_var##num
206 #define GLint_def(num)      int GLint_var(num)
207
208 /* typedef int GLsizei; */
209 #define GLsizei_str       "i"
210 #define GLsizei_var(num)    bgl_var##num
211 #define GLsizei_ref(num)    &bgl_var##num
212 #define GLsizei_def(num)    int GLsizei_var(num)
213
214 /* typedef unsigned char GLubyte; */
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)    /* unsigned */ char GLubyte_var(num)
219
220 /* typedef unsigned short GLushort; */
221 #define GLushort_str      "h"
222 #define GLushort_var(num)   bgl_var##num
223 #define GLushort_ref(num)   &bgl_var##num
224 #define GLushort_def(num)   /* unsigned */ short GLushort_var(num)
225
226 /* typedef unsigned int GLuint; */
227 #define GLuint_str        "i"
228 #define GLuint_var(num)     bgl_var##num
229 #define GLuint_ref(num)     &bgl_var##num
230 #define GLuint_def(num)     /* unsigned */ int GLuint_var(num)
231
232 /* typedef float GLfloat; */
233 #define GLfloat_str       "f"
234 #define GLfloat_var(num)    bgl_var##num
235 #define GLfloat_ref(num)    &bgl_var##num
236 #define GLfloat_def(num)    float GLfloat_var(num)
237
238 /* typedef float GLclampf; */
239 #define GLclampf_str      "f"
240 #define GLclampf_var(num)   bgl_var##num
241 #define GLclampf_ref(num)   &bgl_var##num
242 #define GLclampf_def(num)   float GLclampf_var(num)
243
244 /* typedef double GLdouble; */
245 #define GLdouble_str      "d"
246 #define GLdouble_var(num)   bgl_var##num
247 #define GLdouble_ref(num)   &bgl_var##num
248 #define GLdouble_def(num)   double GLdouble_var(num)
249
250 /* typedef double GLclampd; */
251 #define GLclampd_str      "d"
252 #define GLclampd_var(num)   bgl_var##num
253 #define GLclampd_ref(num)   &bgl_var##num
254 #define GLclampd_def(num)   double GLclampd_var(num)
255
256 /* typedef void GLvoid; */
257 /* #define GLvoid_str       "" */
258 /* #define GLvoid_var(num)      bgl_var##num */
259 /* #define GLvoid_ref(num)      &bgl_var##num */
260 /* #define GLvoid_def(num)      char bgl_var##num */
261
262 #define arg_def1(a1)          a1##_def(1)
263 #define arg_def2(a1, a2)        arg_def1(a1); a2##_def(2)
264 #define arg_def3(a1, a2, a3)      arg_def2(a1, a2); a3##_def(3)
265 #define arg_def4(a1, a2, a3, a4)    arg_def3(a1, a2, a3); a4##_def(4)
266 #define arg_def5(a1, a2, a3, a4, a5)  arg_def4(a1, a2, a3, a4); a5##_def(5)
267 #define arg_def6(a1, a2, a3, a4, a5, a6)arg_def5(a1, a2, a3, a4, a5); a6##_def(6)
268 #define arg_def7(a1, a2, a3, a4, a5, a6, a7)arg_def6(a1, a2, a3, a4, a5, a6); a7##_def(7)
269 #define arg_def8(a1, a2, a3, a4, a5, a6, a7, a8)arg_def7(a1, a2, a3, a4, a5, a6, a7); a8##_def(8)
270 #define arg_def9(a1, a2, a3, a4, a5, a6, a7, a8, a9)arg_def8(a1, a2, a3, a4, a5, a6, a7, a8); a9##_def(9)
271 #define arg_def10(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10)arg_def9(a1, a2, a3, a4, a5, a6, a7, a8, a9); a10##_def(10)
272
273 #define arg_var1(a1)          a1##_var(1)
274 #define arg_var2(a1, a2)        arg_var1(a1), a2##_var(2)
275 #define arg_var3(a1, a2, a3)      arg_var2(a1, a2), a3##_var(3)
276 #define arg_var4(a1, a2, a3, a4)    arg_var3(a1, a2, a3), a4##_var(4)
277 #define arg_var5(a1, a2, a3, a4, a5)  arg_var4(a1, a2, a3, a4), a5##_var(5)
278 #define arg_var6(a1, a2, a3, a4, a5, a6)arg_var5(a1, a2, a3, a4, a5), a6##_var(6)
279 #define arg_var7(a1, a2, a3, a4, a5, a6, a7)arg_var6(a1, a2, a3, a4, a5, a6), a7##_var(7)
280 #define arg_var8(a1, a2, a3, a4, a5, a6, a7, a8)arg_var7(a1, a2, a3, a4, a5, a6, a7), a8##_var(8)
281 #define arg_var9(a1, a2, a3, a4, a5, a6, a7, a8, a9)arg_var8(a1, a2, a3, a4, a5, a6, a7, a8), a9##_var(9)
282 #define arg_var10(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10)arg_var9(a1, a2, a3, a4, a5, a6, a7, a8, a9), a10##_var(10)
283
284 #define arg_ref1(a1)          a1##_ref(1)
285 #define arg_ref2(a1, a2)        arg_ref1(a1), a2##_ref(2)
286 #define arg_ref3(a1, a2, a3)      arg_ref2(a1, a2), a3##_ref(3)
287 #define arg_ref4(a1, a2, a3, a4)    arg_ref3(a1, a2, a3), a4##_ref(4)
288 #define arg_ref5(a1, a2, a3, a4, a5)  arg_ref4(a1, a2, a3, a4), a5##_ref(5)
289 #define arg_ref6(a1, a2, a3, a4, a5, a6)arg_ref5(a1, a2, a3, a4, a5), a6##_ref(6)
290 #define arg_ref7(a1, a2, a3, a4, a5, a6, a7)arg_ref6(a1, a2, a3, a4, a5, a6), a7##_ref(7)
291 #define arg_ref8(a1, a2, a3, a4, a5, a6, a7, a8)arg_ref7(a1, a2, a3, a4, a5, a6, a7), a8##_ref(8)
292 #define arg_ref9(a1, a2, a3, a4, a5, a6, a7, a8, a9)arg_ref8(a1, a2, a3, a4, a5, a6, a7, a8), a9##_ref(9)
293 #define arg_ref10(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10)arg_ref9(a1, a2, a3, a4, a5, a6, a7, a8, a9), a10##_ref(10)
294
295 #define arg_str1(a1)          a1##_str
296 #define arg_str2(a1, a2)        arg_str1(a1) a2##_str
297 #define arg_str3(a1, a2, a3)      arg_str2(a1, a2) a3##_str
298 #define arg_str4(a1, a2, a3, a4)    arg_str3(a1, a2, a3) a4##_str
299 #define arg_str5(a1, a2, a3, a4, a5)  arg_str4(a1, a2, a3, a4) a5##_str
300 #define arg_str6(a1, a2, a3, a4, a5, a6)arg_str5(a1, a2, a3, a4, a5) a6##_str
301 #define arg_str7(a1, a2, a3, a4, a5, a6, a7)arg_str6(a1, a2, a3, a4, a5, a6) a7##_str
302 #define arg_str8(a1, a2, a3, a4, a5, a6, a7, a8)arg_str7(a1, a2, a3, a4, a5, a6, a7) a8##_str
303 #define arg_str9(a1, a2, a3, a4, a5, a6, a7, a8, a9)arg_str8(a1, a2, a3, a4, a5, a6, a7, a8) a9##_str
304 #define arg_str10(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10)arg_str9(a1, a2, a3, a4, a5, a6, a7, a8, a9) a10##_str
305
306 #define ret_def_void
307 #define ret_set_void
308 /* would use Py_RETURN_NONE - except for py 2.3 doesnt have it */
309 #define ret_ret_void    { Py_INCREF(Py_None); return Py_None; }
310
311 #define ret_def_GLint   int ret_int
312 #define ret_set_GLint   ret_int=
313 #define ret_ret_GLint   return PyLong_FromLong(ret_int);
314
315 #define ret_def_GLuint    unsigned int ret_uint
316 #define ret_set_GLuint    ret_uint=
317 #define ret_ret_GLuint    return PyLong_FromLong((long) ret_uint);
318
319 #define ret_def_GLenum    unsigned int ret_uint
320 #define ret_set_GLenum    ret_uint=
321 #define ret_ret_GLenum    return PyLong_FromLong((long) ret_uint);
322
323 #define ret_def_GLboolean unsigned char ret_bool
324 #define ret_set_GLboolean ret_bool=
325 #define ret_ret_GLboolean return PyLong_FromLong((long) ret_bool);
326
327 #define ret_def_GLstring  const unsigned char *ret_str;
328 #define ret_set_GLstring  ret_str=
329
330 #define ret_ret_GLstring \
331         if (ret_str) {\
332                 return PyUnicode_FromString(ret_str);\
333         } else {\
334                 PyErr_SetString(PyExc_AttributeError, "could not get opengl string");\
335                 return NULL;\
336         }
337
338 #endif  /*  EXPP_BGL_H */