|
Blender
V2.59
|
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 */