Blender  V2.59
bgl.h
Go to the documentation of this file.
00001 /* 
00002  * $Id: bgl.h 37088 2011-06-02 08:29:16Z campbellbarton $
00003  *
00004  * ***** BEGIN GPL LICENSE BLOCK *****
00005  *
00006  * This program is free software; you can redistribute it and/or
00007  * modify it under the terms of the GNU General Public License
00008  * as published by the Free Software Foundation; either version 2
00009  * of the License, or (at your option) any later version.
00010  *
00011  * This program is distributed in the hope that it will be useful,
00012  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00013  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014  * GNU General Public License for more details.
00015  *
00016  * You should have received a copy of the GNU General Public License
00017  * along with this program; if not, write to the Free Software Foundation,
00018  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
00019  *
00020  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
00021  * All rights reserved.
00022  *
00023  * This is a new part of Blender.
00024  *
00025  * Contributor(s): Willian P. Germano
00026  *
00027  * ***** END GPL LICENSE BLOCK *****
00028 */
00029 
00035 /* This is the Blender.BGL part of opy_draw.c, from the old bpython/intern
00036  * dir, with minor changes to adapt it to the new Python implementation.
00037  * The BGL submodule "wraps" OpenGL functions and constants, allowing script
00038  * writers to make OpenGL calls in their Python scripts for Blender.  The
00039  * more important original comments are marked with an @ symbol. */
00040 
00041 #ifndef BGL_H
00042 #define BGL_H
00043 
00044 PyObject *BPyInit_bgl(void);
00045 
00046 /*@ Create a buffer object */
00047 /*@ dimensions is an array of ndimensions integers representing the size of each dimension */
00048 /*@ initbuffer if not NULL holds a contiguous buffer with the correct format from which the buffer will be initialized */
00049 struct _Buffer *BGL_MakeBuffer( int type, int ndimensions, int *dimensions, void *initbuffer );
00050 /*@ Return the size of buffer element, type must be one of GL_BYTE, GL_SHORT, GL_INT, GL_FLOAT or GL_DOUBLE */
00051 /*@ returns -1 otherwise */
00052 int BGL_typeSize( int type );
00053 
00054 /*@ Buffer Object */
00055 /*@ For Python access to OpenGL functions requiring a pointer. */
00056 typedef struct _Buffer {
00057         PyObject_VAR_HEAD 
00058         PyObject *parent;
00059 
00060         int type;               /* GL_BYTE, GL_SHORT, GL_INT, GL_FLOAT */
00061         int ndimensions;
00062         int *dimensions;
00063 
00064         union {
00065                 char *asbyte;
00066                 short *asshort;
00067                 int *asint;
00068                 float *asfloat;
00069                 double *asdouble;
00070 
00071                 void *asvoid;
00072         } buf;
00073 } Buffer;
00074 
00075 /*@ The type object */
00076 extern PyTypeObject BGL_bufferType;
00077 
00078 /*@ By golly George! It looks like fancy pants macro time!!! */
00079 
00080 /*
00081 #define int_str       "i"
00082 #define int_var(number)   bgl_int##number
00083 #define int_ref(number)   &bgl_int##number
00084 #define int_def(number)   int int_var(number)
00085 
00086 #define float_str     "f"
00087 #define float_var(number) bgl_float##number
00088 #define float_ref(number) &bgl_float##number
00089 #define float_def(number) float float_var(number)
00090 */
00091 
00092 /* TYPE_str is the string to pass to Py_ArgParse (for the format) */
00093 /* TYPE_var is the name to pass to the GL function */
00094 /* TYPE_ref is the pointer to pass to Py_ArgParse (to store in) */
00095 /* TYPE_def is the C initialization of the variable */
00096 
00097 #define void_str      ""
00098 #define void_var(num)
00099 #define void_ref(num)   &bgl_var##num
00100 #define void_def(num)   char bgl_var##num
00101 
00102 #define buffer_str      "O!"
00103 #define buffer_var(number)  (bgl_buffer##number)->buf.asvoid
00104 #define buffer_ref(number)  &BGL_bufferType, &bgl_buffer##number
00105 #define buffer_def(number)  Buffer *bgl_buffer##number
00106 
00107 /* GL Pointer fields, handled by buffer type */
00108 /* GLdoubleP, GLfloatP, GLintP, GLuintP, GLshortP */
00109 
00110 #define GLbooleanP_str      "O!"
00111 #define GLbooleanP_var(number)  (bgl_buffer##number)->buf.asvoid
00112 #define GLbooleanP_ref(number)  &BGL_bufferType, &bgl_buffer##number
00113 #define GLbooleanP_def(number)  Buffer *bgl_buffer##number
00114 
00115 #define GLbyteP_str     "O!"
00116 #define GLbyteP_var(number) (bgl_buffer##number)->buf.asvoid
00117 #define GLbyteP_ref(number) &BGL_bufferType, &bgl_buffer##number
00118 #define GLbyteP_def(number) Buffer *bgl_buffer##number
00119 
00120 #define GLubyteP_str      "O!"
00121 #define GLubyteP_var(number)  (bgl_buffer##number)->buf.asvoid
00122 #define GLubyteP_ref(number)  &BGL_bufferType, &bgl_buffer##number
00123 #define GLubyteP_def(number)  Buffer *bgl_buffer##number
00124 
00125 #define GLintP_str      "O!"
00126 #define GLintP_var(number)  (bgl_buffer##number)->buf.asvoid
00127 #define GLintP_ref(number)  &BGL_bufferType, &bgl_buffer##number
00128 #define GLintP_def(number)  Buffer *bgl_buffer##number
00129 
00130 #define GLuintP_str     "O!"
00131 #define GLuintP_var(number) (bgl_buffer##number)->buf.asvoid
00132 #define GLuintP_ref(number) &BGL_bufferType, &bgl_buffer##number
00133 #define GLuintP_def(number) Buffer *bgl_buffer##number
00134 
00135 #define GLshortP_str      "O!"
00136 #define GLshortP_var(number)  (bgl_buffer##number)->buf.asvoid
00137 #define GLshortP_ref(number)  &BGL_bufferType, &bgl_buffer##number
00138 #define GLshortP_def(number)  Buffer *bgl_buffer##number
00139 
00140 #define GLushortP_str     "O!"
00141 #define GLushortP_var(number) (bgl_buffer##number)->buf.asvoid
00142 #define GLushortP_ref(number) &BGL_bufferType, &bgl_buffer##number
00143 #define GLushortP_def(number) Buffer *bgl_buffer##number
00144 
00145 #define GLfloatP_str      "O!"
00146 #define GLfloatP_var(number)  (bgl_buffer##number)->buf.asvoid
00147 #define GLfloatP_ref(number)  &BGL_bufferType, &bgl_buffer##number
00148 #define GLfloatP_def(number)  Buffer *bgl_buffer##number
00149 
00150 #define GLdoubleP_str     "O!"
00151 #define GLdoubleP_var(number) (bgl_buffer##number)->buf.asvoid
00152 #define GLdoubleP_ref(number) &BGL_bufferType, &bgl_buffer##number
00153 #define GLdoubleP_def(number) Buffer *bgl_buffer##number
00154 
00155 #define GLclampfP_str     "O!"
00156 #define GLclampfP_var(number) (bgl_buffer##number)->buf.asvoid
00157 #define GLclampfP_ref(number) &BGL_bufferType, &bgl_buffer##number
00158 #define GLclampfP_def(number) Buffer *bgl_buffer##number
00159 
00160 #define GLvoidP_str     "O!"
00161 #define GLvoidP_var(number) (bgl_buffer##number)->buf.asvoid
00162 #define GLvoidP_ref(number) &BGL_bufferType, &bgl_buffer##number
00163 #define GLvoidP_def(number) Buffer *bgl_buffer##number
00164 
00165 #define buffer_str      "O!"
00166 #define buffer_var(number)  (bgl_buffer##number)->buf.asvoid
00167 #define buffer_ref(number)  &BGL_bufferType, &bgl_buffer##number
00168 #define buffer_def(number)  Buffer *bgl_buffer##number
00169 
00170 /*@The standard GL typedefs are used as prototypes, we can't
00171  * use the GL type directly because Py_ArgParse expects normal
00172  * C types.
00173  * 
00174  * Py_ArgParse doesn't grok writing into unsigned variables, 
00175  * so we use signed everything (even stuff that should be unsigned.
00176  */
00177 
00178 /* typedef unsigned int GLenum; */
00179 #define GLenum_str      "i"
00180 #define GLenum_var(num)   bgl_var##num
00181 #define GLenum_ref(num)   &bgl_var##num
00182 #define GLenum_def(num)   /* unsigned */ int GLenum_var(num)
00183 
00184 /* typedef unsigned int GLboolean; */
00185 #define GLboolean_str     "b"
00186 #define GLboolean_var(num)    bgl_var##num
00187 #define GLboolean_ref(num)    &bgl_var##num
00188 #define GLboolean_def(num)    /* unsigned */ char GLboolean_var(num)
00189 
00190 /* typedef unsigned int GLbitfield; */
00191 #define GLbitfield_str      "i"
00192 #define GLbitfield_var(num)   bgl_var##num
00193 #define GLbitfield_ref(num)   &bgl_var##num
00194 #define GLbitfield_def(num)   /* unsigned */ int GLbitfield_var(num)
00195 
00196 /* typedef signed char GLbyte; */
00197 #define GLbyte_str        "b"
00198 #define GLbyte_var(num)     bgl_var##num
00199 #define GLbyte_ref(num)     &bgl_var##num
00200 #define GLbyte_def(num)     signed char GLbyte_var(num)
00201 
00202 /* typedef short GLshort; */
00203 #define GLshort_str       "h"
00204 #define GLshort_var(num)    bgl_var##num
00205 #define GLshort_ref(num)    &bgl_var##num
00206 #define GLshort_def(num)    short GLshort_var(num)
00207 
00208 /* typedef int GLint; */
00209 #define GLint_str       "i"
00210 #define GLint_var(num)      bgl_var##num
00211 #define GLint_ref(num)      &bgl_var##num
00212 #define GLint_def(num)      int GLint_var(num)
00213 
00214 /* typedef int GLsizei; */
00215 #define GLsizei_str       "i"
00216 #define GLsizei_var(num)    bgl_var##num
00217 #define GLsizei_ref(num)    &bgl_var##num
00218 #define GLsizei_def(num)    int GLsizei_var(num)
00219 
00220 /* typedef unsigned char GLubyte; */
00221 #define GLubyte_str       "B"
00222 #define GLubyte_var(num)    bgl_var##num
00223 #define GLubyte_ref(num)    &bgl_var##num
00224 #define GLubyte_def(num)    /* unsigned */ char GLubyte_var(num)
00225 
00226 /* typedef unsigned short GLushort; */
00227 #define GLushort_str      "H"
00228 #define GLushort_var(num)   bgl_var##num
00229 #define GLushort_ref(num)   &bgl_var##num
00230 #define GLushort_def(num)   /* unsigned */ short GLushort_var(num)
00231 
00232 /* typedef unsigned int GLuint; */
00233 #define GLuint_str        "I"
00234 #define GLuint_var(num)     bgl_var##num
00235 #define GLuint_ref(num)     &bgl_var##num
00236 #define GLuint_def(num)     /* unsigned */ int GLuint_var(num)
00237 
00238 /* typedef float GLfloat; */
00239 #define GLfloat_str       "f"
00240 #define GLfloat_var(num)    bgl_var##num
00241 #define GLfloat_ref(num)    &bgl_var##num
00242 #define GLfloat_def(num)    float GLfloat_var(num)
00243 
00244 /* typedef float GLclampf; */
00245 #define GLclampf_str      "f"
00246 #define GLclampf_var(num)   bgl_var##num
00247 #define GLclampf_ref(num)   &bgl_var##num
00248 #define GLclampf_def(num)   float GLclampf_var(num)
00249 
00250 /* typedef double GLdouble; */
00251 #define GLdouble_str      "d"
00252 #define GLdouble_var(num)   bgl_var##num
00253 #define GLdouble_ref(num)   &bgl_var##num
00254 #define GLdouble_def(num)   double GLdouble_var(num)
00255 
00256 /* typedef double GLclampd; */
00257 #define GLclampd_str      "d"
00258 #define GLclampd_var(num)   bgl_var##num
00259 #define GLclampd_ref(num)   &bgl_var##num
00260 #define GLclampd_def(num)   double GLclampd_var(num)
00261 
00262 /* typedef void GLvoid; */
00263 /* #define GLvoid_str       "" */
00264 /* #define GLvoid_var(num)      bgl_var##num */
00265 /* #define GLvoid_ref(num)      &bgl_var##num */
00266 /* #define GLvoid_def(num)      char bgl_var##num */
00267 
00268 #define arg_def1(a1)          a1##_def(1)
00269 #define arg_def2(a1, a2)        arg_def1(a1); a2##_def(2)
00270 #define arg_def3(a1, a2, a3)      arg_def2(a1, a2); a3##_def(3)
00271 #define arg_def4(a1, a2, a3, a4)    arg_def3(a1, a2, a3); a4##_def(4)
00272 #define arg_def5(a1, a2, a3, a4, a5)  arg_def4(a1, a2, a3, a4); a5##_def(5)
00273 #define arg_def6(a1, a2, a3, a4, a5, a6)arg_def5(a1, a2, a3, a4, a5); a6##_def(6)
00274 #define arg_def7(a1, a2, a3, a4, a5, a6, a7)arg_def6(a1, a2, a3, a4, a5, a6); a7##_def(7)
00275 #define arg_def8(a1, a2, a3, a4, a5, a6, a7, a8)arg_def7(a1, a2, a3, a4, a5, a6, a7); a8##_def(8)
00276 #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)
00277 #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)
00278 
00279 #define arg_var1(a1)          a1##_var(1)
00280 #define arg_var2(a1, a2)        arg_var1(a1), a2##_var(2)
00281 #define arg_var3(a1, a2, a3)      arg_var2(a1, a2), a3##_var(3)
00282 #define arg_var4(a1, a2, a3, a4)    arg_var3(a1, a2, a3), a4##_var(4)
00283 #define arg_var5(a1, a2, a3, a4, a5)  arg_var4(a1, a2, a3, a4), a5##_var(5)
00284 #define arg_var6(a1, a2, a3, a4, a5, a6)arg_var5(a1, a2, a3, a4, a5), a6##_var(6)
00285 #define arg_var7(a1, a2, a3, a4, a5, a6, a7)arg_var6(a1, a2, a3, a4, a5, a6), a7##_var(7)
00286 #define arg_var8(a1, a2, a3, a4, a5, a6, a7, a8)arg_var7(a1, a2, a3, a4, a5, a6, a7), a8##_var(8)
00287 #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)
00288 #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)
00289 
00290 #define arg_ref1(a1)          a1##_ref(1)
00291 #define arg_ref2(a1, a2)        arg_ref1(a1), a2##_ref(2)
00292 #define arg_ref3(a1, a2, a3)      arg_ref2(a1, a2), a3##_ref(3)
00293 #define arg_ref4(a1, a2, a3, a4)    arg_ref3(a1, a2, a3), a4##_ref(4)
00294 #define arg_ref5(a1, a2, a3, a4, a5)  arg_ref4(a1, a2, a3, a4), a5##_ref(5)
00295 #define arg_ref6(a1, a2, a3, a4, a5, a6)arg_ref5(a1, a2, a3, a4, a5), a6##_ref(6)
00296 #define arg_ref7(a1, a2, a3, a4, a5, a6, a7)arg_ref6(a1, a2, a3, a4, a5, a6), a7##_ref(7)
00297 #define arg_ref8(a1, a2, a3, a4, a5, a6, a7, a8)arg_ref7(a1, a2, a3, a4, a5, a6, a7), a8##_ref(8)
00298 #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)
00299 #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)
00300 
00301 #define arg_str1(a1)          a1##_str
00302 #define arg_str2(a1, a2)        arg_str1(a1) a2##_str
00303 #define arg_str3(a1, a2, a3)      arg_str2(a1, a2) a3##_str
00304 #define arg_str4(a1, a2, a3, a4)    arg_str3(a1, a2, a3) a4##_str
00305 #define arg_str5(a1, a2, a3, a4, a5)  arg_str4(a1, a2, a3, a4) a5##_str
00306 #define arg_str6(a1, a2, a3, a4, a5, a6)arg_str5(a1, a2, a3, a4, a5) a6##_str
00307 #define arg_str7(a1, a2, a3, a4, a5, a6, a7)arg_str6(a1, a2, a3, a4, a5, a6) a7##_str
00308 #define arg_str8(a1, a2, a3, a4, a5, a6, a7, a8)arg_str7(a1, a2, a3, a4, a5, a6, a7) a8##_str
00309 #define arg_str9(a1, a2, a3, a4, a5, a6, a7, a8, a9)arg_str8(a1, a2, a3, a4, a5, a6, a7, a8) a9##_str
00310 #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
00311 
00312 #define ret_def_void
00313 #define ret_set_void
00314 #define ret_ret_void    return Py_INCREF(Py_None), Py_None
00315 
00316 #define ret_def_GLint   int ret_int
00317 #define ret_set_GLint   ret_int=
00318 #define ret_ret_GLint   return PyLong_FromLong(ret_int)
00319 
00320 #define ret_def_GLuint    unsigned int ret_uint
00321 #define ret_set_GLuint    ret_uint=
00322 #define ret_ret_GLuint    return PyLong_FromLong((long) ret_uint)
00323 
00324 #define ret_def_GLenum    unsigned int ret_uint
00325 #define ret_set_GLenum    ret_uint=
00326 #define ret_ret_GLenum    return PyLong_FromLong((long) ret_uint)
00327 
00328 #define ret_def_GLboolean unsigned char ret_bool
00329 #define ret_set_GLboolean ret_bool=
00330 #define ret_ret_GLboolean return PyLong_FromLong((long) ret_bool)
00331 
00332 #define ret_def_GLstring  const unsigned char *ret_str;
00333 #define ret_set_GLstring  ret_str=
00334 
00335 #define ret_ret_GLstring \
00336         if (ret_str) {\
00337                 return PyUnicode_FromString((const char *)ret_str);\
00338         } else {\
00339                 PyErr_SetString(PyExc_AttributeError, "could not get opengl string");\
00340                 return NULL;\
00341         }
00342 
00343 #endif /* BGL_H */