Max 5 API Reference
00001 // jit.gl.c 00002 // 00003 // 00004 // author: randall jones 00005 // � 2002 cycling '74 00006 00007 00008 #include "jit.common.h" 00009 #include "jit.gl.h" 00010 #include "jit.gl.ob3d.internal.h" 00011 #include "trackball.h" 00012 #include "jit.half.h" 00013 #include "jit.vecmath.h" 00014 #include <string.h> // for strstr 00015 00016 // -------------------------------------------------------------------------------- 00017 00018 t_symbol *ps_setup,*ps_draw,*ps_drawto,*ps_ob3d_draw,*ps_get_ob3d,*ps_ob3d_ui; 00019 t_symbol *ps_jit_gl_render,*ps_render_ptr,*ps_get_render_ptr,*ps_draw_chunk,*ps_get_chunk; 00020 t_symbol *ps_ignore_textures,*ps_ignore_normals,*ps_ignore_colors,*ps_ignore_edges; 00021 t_symbol *ps_getoffset,*ps_getoffsetcount,*ps_dest_closing; 00022 t_symbol *ps_JIT_CLASS3D_FINDER,*ps_jit_gl_shader,*ps_jit_glchunk,*ps_rebuild_geometry; 00023 t_symbol *ps_jit_gl_texture; 00024 t_symbol *ps_jit_gl_cubemap; 00025 t_symbol *ps_bind_texture; 00026 t_symbol *ps_bind; 00027 t_symbol *ps_unbind; 00028 t_symbol *ps_begin_capture; 00029 t_symbol *ps_end_capture; 00030 t_symbol *ps_capture; 00031 t_symbol *ps_none; 00032 t_symbol *ps_capturing; 00033 t_symbol *ps_shared_context; 00034 00035 void jit_gl_mesh_init(); 00036 void jit_gl_shader_init(); 00037 void jit_gl_texture_init(); 00038 void jit_gl_pbo_init(); 00039 void jit_gl_vbo_init(); 00040 void jit_gl_slab_init(); 00041 void jit_gl_readback_init(); 00042 // -------------------------------------------------------------------------------- 00043 // utility functions 00044 00045 void jit_gl_init(void) 00046 { 00047 if (!jit_gl_available()) 00048 { 00049 post("warning: OpenGL not available."); 00050 } 00051 00052 #ifdef MAC_VERSION 00053 aglInitEntryPoints(); 00054 #endif 00055 00056 g_jit_gl_current_context = 0; 00057 g_jit_gl_current_ob3d = 0; 00058 00059 jit_gl_mesh_init(); 00060 jit_gl_shader_init(); 00061 jit_gl_texture_init(); 00062 jit_gl_pbo_init(); 00063 jit_gl_vbo_init(); 00064 00065 // slab init *must* be after shader and texture 00066 jit_gl_slab_init(); 00067 jit_gl_readback_init(); 00068 00069 ps_setup = gensym("setup"); 00070 ps_draw = gensym("draw"); 00071 ps_drawto = gensym("drawto"); 00072 ps_ob3d_draw = gensym("ob3d_draw"); 00073 ps_get_ob3d = gensym("get_ob3d"); 00074 ps_ob3d_ui = gensym("ob3d_ui"); 00075 ps_jit_gl_render = gensym("jit_gl_render"); 00076 ps_render_ptr = gensym("render_ptr"); 00077 ps_get_render_ptr = gensym("get_render_ptr"); 00078 ps_draw_chunk = gensym("draw_chunk"); 00079 ps_get_chunk = gensym("get_chunk"); 00080 ps_ignore_textures = gensym("ignore_textures"); 00081 ps_ignore_normals = gensym("ignore_normals"); 00082 ps_ignore_colors = gensym("ignore_colors"); 00083 ps_ignore_edges = gensym("ignore_edges"); 00084 ps_getoffset = gensym("getoffset"); 00085 ps_getoffsetcount = gensym("getoffsetcount"); 00086 ps_dest_closing = gensym("dest_closing"); 00087 ps_jit_gl_texture = gensym("jit_gl_texture"); 00088 ps_jit_gl_cubemap = gensym("jit_gl_cubemap"); 00089 ps_bind_texture = gensym("bind_texture"); 00090 ps_none = gensym("none"); 00091 ps_capturing = gensym("capturing"); 00092 ps_shared_context = gensym("shared_context"); 00093 00094 ps_bind = gensym("bind"); 00095 ps_unbind = gensym("unbind"); 00096 ps_begin_capture = gensym("begin_capture"); 00097 ps_end_capture = gensym("end_capture"); 00098 ps_capture = gensym("capture"); 00099 ps_JIT_CLASS3D_FINDER = gensym(JIT_CLASS3D_FINDER); 00100 ps_jit_gl_shader = gensym("jit_gl_shader"); 00101 ps_jit_glchunk = gensym("jit_glchunk"); 00102 ps_rebuild_geometry = gensym("rebuild_geometry"); 00103 00104 } 00105 00106 long jit_gl_available(void) 00107 { 00108 #ifdef MAC_VERSION 00109 return ((Ptr) kUnresolvedCFragSymbolAddress != (Ptr) aglChoosePixelFormat); 00110 #endif 00111 #ifdef WIN_VERSION 00112 return TRUE; 00113 #endif 00114 } 00115 00116 // set n floats given array ptr, number, and n values. 00117 // conversion to double has to take place for va_arg stuff. 00118 // so this routine isn't fast, but it's handy for new() methods. 00119 void jit_gl_set_floats(float *pf, int count, ...) 00120 { 00121 va_list ap; 00122 double f; 00123 int i; 00124 00125 va_start(ap, count); 00126 for (i = 0; i < count; i++) 00127 { 00128 f = va_arg(ap, double); 00129 pf[i] = f; 00130 } 00131 va_end(ap); 00132 } 00133 00134 int jit_gl_get_blend_mode(int index) 00135 { 00136 int result; 00137 switch (index) 00138 { 00139 case 0: result = GL_ZERO; break; 00140 case 1: result = GL_ONE; break; 00141 case 2: result = GL_DST_COLOR; break; 00142 case 3: result = GL_SRC_COLOR; break; 00143 case 4: result = GL_ONE_MINUS_DST_COLOR; break; 00144 case 5: result = GL_ONE_MINUS_SRC_COLOR; break; 00145 case 6: result = GL_SRC_ALPHA; break; 00146 case 7: result = GL_ONE_MINUS_SRC_ALPHA; break; 00147 case 8: result = GL_DST_ALPHA; break; 00148 case 9: result = GL_ONE_MINUS_DST_ALPHA; break; 00149 case 10: result = GL_SRC_ALPHA_SATURATE; break; 00150 default: result = 0; break; 00151 } 00152 return result; 00153 } 00154 00155 /** 00156 * Tests for OpenGL error and reports to Max window. 00157 * 00158 * @ingroup ob3dmod 00159 * 00160 * @param prefix prefix string 00161 * 00162 * @return OpenGL error code 00163 * 00164 */ 00165 long jit_gl_report_error (char *prefix) 00166 { 00167 GLenum err=GL_NO_ERROR; 00168 00169 if (_jit_glerrorcheck) 00170 err = glGetError(); 00171 00172 // useful place to query OpenGL state at diferent stages...leaving this texture matrix debugging code as an example 00173 if (_jit_glmatrixdebug) 00174 { 00175 int mode; 00176 00177 post("BEGIN: %s",prefix); 00178 post("\tCONTEXT: %x",jit_gl_get_context()->context); 00179 00180 glGetIntegerv(GL_MATRIX_MODE, (long *)&mode); 00181 00182 if(mode == GL_TEXTURE) 00183 post("\tmode is GL_TEXTURE"); 00184 00185 glGetIntegerv(GL_TEXTURE_STACK_DEPTH, (long *)&mode); 00186 post("\tGL_TEXTURE_STACK_DEPTH: %d", mode); 00187 glGetIntegerv(GL_MODELVIEW_STACK_DEPTH, (long *)&mode); 00188 post("\tGL_MODELVIEW_STACK_DEPTH: %d", mode); 00189 glGetIntegerv(GL_PROJECTION_STACK_DEPTH, (long *)&mode); 00190 post("\tGL_PROJECTION_STACK_DEPTH: %d", mode); 00191 } 00192 00193 switch (err) 00194 { 00195 case GL_INVALID_ENUM: 00196 post ("%s: GL Error: Invalid enumeration", prefix); 00197 return err; 00198 case GL_INVALID_VALUE: 00199 post ("%s: GL Error: Invalid value", prefix); 00200 return err; 00201 case GL_INVALID_OPERATION: 00202 post ("%s: GL Error: Invalid operation", prefix); 00203 return err; 00204 case GL_STACK_OVERFLOW: 00205 post ("%s: GL Error: Stack overflow", prefix); 00206 return err; 00207 case GL_STACK_UNDERFLOW: 00208 post ("%s: GL Error: Stack underflow", prefix); 00209 return err; 00210 case GL_OUT_OF_MEMORY: 00211 post ("%s: GL Error: Out of memory", prefix); 00212 return err; 00213 case GL_NO_ERROR: 00214 return JIT_ERR_NONE; 00215 } 00216 00217 #ifdef WIN_VERSION 00218 { 00219 LPVOID msg; 00220 switch(err) 00221 { 00222 case ERROR_INVALID_PIXEL_FORMAT: 00223 error("%s : opengl error : invalid pixel format!", prefix); 00224 return JIT_ERR_GENERIC; 00225 case ERROR_NO_SYSTEM_RESOURCES: 00226 error("%s : opengl error : no system resources!", prefix); 00227 return JIT_ERR_GENERIC; 00228 case ERROR_INVALID_DATA: 00229 error("%s : opengl error : invalid data!", prefix); 00230 return JIT_ERR_GENERIC; 00231 case ERROR_INVALID_WINDOW_HANDLE: 00232 error("%s : opengl error : invalid window handle!", prefix); 00233 return JIT_ERR_GENERIC; 00234 case ERROR_RESOURCE_TYPE_NOT_FOUND: 00235 error("%s : opengl error : resource type not found!", prefix); 00236 return JIT_ERR_GENERIC; 00237 case ERROR_SUCCESS: 00238 // no error 00239 return JIT_ERR_NONE; 00240 default: 00241 FormatMessage( 00242 FORMAT_MESSAGE_ALLOCATE_BUFFER | 00243 FORMAT_MESSAGE_FROM_SYSTEM | 00244 FORMAT_MESSAGE_IGNORE_INSERTS, 00245 NULL, err, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), 00246 (LPTSTR) &msg, 0, NULL); 00247 00248 error("%s : opengl error %d : %s", prefix, err, msg); 00249 LocalFree( msg ); 00250 return JIT_ERR_GENERIC; 00251 } 00252 SetLastError(0); 00253 } 00254 #endif // WIN_VERSION 00255 00256 #ifdef MAC_VERSION 00257 00258 if (_jit_glerrorcheck) 00259 err = aglGetError(); 00260 00261 if (AGL_NO_ERROR != err) 00262 { 00263 error("%s: opengl error : %s", prefix, aglErrorString(err)); 00264 } 00265 00266 #endif // MAC_VERSION 00267 00268 return (long) err; 00269 } 00270 00271 /** 00272 * Retrieves OpenGL vendor string. 00273 * Equivalent to glGetString(GL_VENDOR). Assumes a valid context has been set. 00274 * 00275 * @ingroup ob3dmod 00276 * 00277 * @return OpenGL vendor string 00278 * 00279 */ 00280 const char* jit_gl_get_vendor() 00281 { 00282 return (const char*)glGetString(GL_VENDOR); 00283 } 00284 00285 /** 00286 * Retrieves OpenGL renderer string. 00287 * Equivalent to glGetString(GL_RENDERER). Assumes a valid context has been set. 00288 * 00289 * @ingroup ob3dmod 00290 * 00291 * @return OpenGL renderer string 00292 * 00293 */ 00294 const char* jit_gl_get_renderer() 00295 { 00296 return (const char*)glGetString(GL_RENDERER); 00297 } 00298 00299 /** 00300 * Retrieves OpenGL version string. 00301 * Equivalent to glGetString(GL_VERSION). Assumes a valid context has been set. 00302 * 00303 * @ingroup ob3dmod 00304 * 00305 * @return OpenGL version string 00306 * 00307 */ 00308 const char* jit_gl_get_version() 00309 { 00310 return (const char*)glGetString(GL_VERSION); 00311 } 00312 00313 /** 00314 * Retrieves OpenGL GL Utilities version string. 00315 * Equivalent to glGetString(GL_GLU_VERSION). Assumes a valid context has been set. 00316 * 00317 * @ingroup ob3dmod 00318 * 00319 * @return OpenGL GL Utilities version string 00320 * 00321 */ 00322 const char* jit_gl_get_glu_version() 00323 { 00324 return (const char*)glGetString((GLenum)GLU_VERSION); 00325 } 00326 00327 /** 00328 * Retrieves OpenGL extensions string. 00329 * Equivalent to glGetString(GL_EXTENSIONS). Assumes a valid context has been set. 00330 * 00331 * @ingroup ob3dmod 00332 * 00333 * @return OpenGL GL extensions string 00334 * 00335 */ 00336 const char* jit_gl_get_extensions() 00337 { 00338 return (const char*)glGetString(GL_EXTENSIONS); 00339 } 00340 00341 /** 00342 * Tests current OpenGL version to be greater than or equal to the version provided. 00343 * Assumes a valid context has been set. 00344 * 00345 * @ingroup ob3dmod 00346 * 00347 * @param major major version number 00348 * @param minor minor version number 00349 * @param release release version number 00350 * 00351 * @return 1 if true, 0 if false. 00352 * 00353 */ 00354 char jit_gl_is_min_version(int major, int minor, int release) 00355 { 00356 int sysmajor = 0, sysminor = 0, sysrelease = 0; 00357 sscanf(jit_gl_get_version(),"%d.%d.%d",&sysmajor,&sysminor,&sysrelease); 00358 00359 if ( sysmajor < major ) 00360 return FALSE; 00361 00362 if ( sysmajor > major ) 00363 return TRUE; 00364 00365 if ( sysminor < minor ) 00366 return FALSE; 00367 00368 if ( sysminor > minor ) 00369 return TRUE; 00370 00371 if ( sysrelease < release ) 00372 return FALSE; 00373 00374 return TRUE; 00375 } 00376 00377 #define GL_IS_SEP(c) (((c)=='\n')||((c)=='\r')||((c)=='\t')||((c)==' ')) 00378 00379 /** 00380 * Given a t_jit_gl_context pointer, checks to see if it suppports the provided extension. 00381 * Equivalent to testing for the substring within the 00382 * string returned by glGetString(GL_EXTENSIONS). 00383 * 00384 * @ingroup ob3dmod 00385 * 00386 * @param ctx t_jit_gl_context pointer 00387 * @param ext extension string 00388 * 00389 * @return 1 if true, 0 if false. 00390 * 00391 */ 00392 char jit_gl_is_extension_supported(t_jit_gl_context ctx, const char* ext) 00393 { 00394 long i; 00395 long pos; 00396 long maxpos; 00397 long len; 00398 const char *other; 00399 00400 if ( !ext || ext[0] == 0 || !ctx || !ctx->extensions) 00401 return FALSE; 00402 00403 pos = 0; 00404 len = strlen(ctx->extensions); 00405 maxpos = strlen(ext) - 1; 00406 00407 for (i=0; i<len; i++) 00408 { 00409 if ((i==0) || ((i>1) && GL_IS_SEP(ctx->extensions[i-1]))) 00410 { 00411 other = &ctx->extensions[i]; 00412 pos = 0; 00413 00414 while ((i<len)&&(!GL_IS_SEP(ctx->extensions[i]))) 00415 { 00416 if (pos <= maxpos && ctx->extensions[i] == ext[pos]) 00417 pos++; 00418 00419 if ((pos > maxpos) && GL_IS_SEP(ctx->extensions[i+1])) 00420 return TRUE; 00421 i++; 00422 } 00423 } 00424 } 00425 return FALSE; 00426 } 00427 00428 long jit_gl_get_datasize_from_datatype(GLenum e) 00429 { 00430 switch (e) 00431 { 00432 case GL_UNSIGNED_BYTE: 00433 { 00434 return sizeof(GLubyte); 00435 } 00436 case GL_UNSIGNED_INT: 00437 { 00438 return sizeof(GLuint); 00439 } 00440 case GL_INT: 00441 { 00442 return sizeof(GLint); 00443 } 00444 case GL_UNSIGNED_SHORT_8_8_APPLE: 00445 case GL_UNSIGNED_SHORT_8_8_REV_APPLE: 00446 { 00447 return sizeof(GLushort); 00448 } 00449 case GL_UNSIGNED_INT_8_8_8_8: 00450 case GL_UNSIGNED_INT_8_8_8_8_REV: 00451 { 00452 return sizeof(GLubyte); // datatype in our code assumes we have prim type here, not packed type 00453 } 00454 case GL_HALF_APPLE: 00455 { 00456 return sizeof(half); 00457 } 00458 case GL_FLOAT: 00459 { 00460 return sizeof(GLfloat); 00461 } 00462 case GL_DOUBLE: 00463 { 00464 return sizeof(GLdouble); 00465 } 00466 } 00467 return sizeof(GLfloat); 00468 }
Copyright © 2008, Cycling '74