/* Copyright (c) 1998 Kenneth Albanowski. All rights reserved. * Copyright (c) 2007 Bob Free. All rights reserved. * This program is free software; you can redistribute it and/or * modify it under the same terms as Perl itself. */ #include "EXTERN.h" #include "perl.h" #include "XSUB.h" #include "ppport.h" #ifdef HAVE_GL #include "gl_util.h" #endif #ifdef HAVE_GLX #include "glx_util.h" #endif #ifdef HAVE_GLU #include "glu_util.h" #endif #ifdef HAVE_GLUT #include "glut_util.h" #endif static int not_here(s) char *s; { croak("%s not implemented on this architecture", s); return -1; } /* GLUT on OS/2 PM runs callbacks from a secondary thread. This thread is not instrumented to run EMX CRTL functions. Basically, no Perl function may be run from this thread. We create a ternary thread via CRTL _beginthread() call, and communicate the requests to this thread via inter-thread communication (ITC). */ #ifndef __PM__ # define DO_perl_call_sv(handler, flag) perl_call_sv(handler, flag) # define ENSURE_callback_thread # define GLUT_PUSH_NEW_SV(sv) XPUSHs(sv_2mortal(newSVsv(sv))) # define GLUT_PUSH_NEW_IV(i) XPUSHs(sv_2mortal(newSViv(i))) # define GLUT_PUSH_NEW_U8(c) XPUSHs(sv_2mortal(newSViv((int)c))) # define GLUT_EXTEND_STACK(sp,n) # define GLUT_PUSHMARK(sp) PUSHMARK(sp) #else # define GLUT_PUSHMARK(sp) # include "sys/builtin.h" # include "sys/fmutex.h" # include "os2pm_X.h" # define DO_perl_call_sv(handler, flag) \ STMT_START { PUSHs(handler); \ PUTBACK; \ extend_by = 0; \ RUN_perl_call_sv(); \ } STMT_END # define GLUT_START_PUSHING 7 # define GLUT_PUSHING_IVP 17 # define GLUT_PUSHING_U8 27 # define GLUT_PUSHING_SV 37 # define GLUT_EXTEND_STACK(p,n) \ STMT_START { if (PL_stack_max - p < 2*(n)+4) { \ extend_by = 2*(n)+4; \ RUN_perl_call_sv(); \ } \ SPAGAIN; \ PUSHs((SV*)GLUT_START_PUSHING); \ } STMT_END # define GLUT_PUSH_NEW_SV(sv) (PUSHs(sv), PUSHs((SV*)GLUT_PUSHING_SV)) # define GLUT_PUSH_NEW_IV(i) (PUSHs((SV*)&i), PUSHs((SV*)GLUT_PUSHING_IVP)) # define GLUT_PUSH_NEW_U8(c) (PUSHs((SV*)(int)c), PUSHs((SV*)GLUT_PUSHING_U8)) _fmutex run_mutex, result_mutex; static int worker_started; static int extend_by; void RUN_perl_call_sv(void) { char *s = NULL; if (_fmutex_release(&run_mutex)) s = "Error unlocking the callback thread"; /* result_mutex is requested on entry! Block until looper finishes. */ else if (_fmutex_request(&result_mutex, _FMR_IGNINT)) s = "Error requesting the callback thread"; if (s) write(2, s, strlen(s)); return; } void callback_thread_looper(void *dummy) { while (1) { /* It is requested already! Wait until somebody requests a run */ if (_fmutex_request(&run_mutex, _FMR_IGNINT)) { warn("Error unlocking in the callback thread"); worker_started = 0; return; } if (extend_by) { /* Need to extend the stack */ dSP; EXTEND(sp, extend_by); } else { dSP; SV* handler = POPs; STRLEN n_a; SV **last = sp, **f; /* The rest is put on stack in a "raw" pointer form */ while (1) { switch ((IV)*sp) { case GLUT_START_PUSHING: goto start_found; break; case GLUT_PUSHING_IVP: case GLUT_PUSHING_SV: case GLUT_PUSHING_U8: break; default: croak("Panic: broken descriptor/down when ITC for Glut: %#lx", (unsigned long)*sp); break; } sp -= 2; } start_found: f = sp + 1; sp--; PUSHMARK(sp); while (f < last) { switch ((IV)f[1]) { case GLUT_PUSHING_IVP: PUSHs(sv_2mortal(newSViv(*(IV*)*f))); break; case GLUT_PUSHING_U8: PUSHs(sv_2mortal(newSViv((IV)*f))); break; case GLUT_PUSHING_SV: PUSHs(sv_2mortal(newSVsv(*f))); break; default: croak("Panic: broken descriptor/up when ITC for Glut: %#lx", (unsigned long)f[1]); break; } f += 2; } PUTBACK; perl_call_sv(handler, G_DISCARD|G_EVAL); if (SvTRUE(ERRSV)) fprintf(stderr, "Error in a GLUT Callback: %s", SvPV(ERRSV, n_a)); } if (_fmutex_release(&result_mutex)) { warn("Error in a callback thread"); worker_started = 0; return; } } } # define ENSURE_callback_thread \ if (!worker_started) \ start_callback_thread() void start_callback_thread() { unsigned long rc; if (worker_started) return; if ( CheckOSError(_fmutex_create(&run_mutex, 0)) || CheckOSError(_fmutex_create(&result_mutex, 0)) || CheckOSError(_fmutex_request(&run_mutex, _FMR_IGNINT)) || CheckOSError(_fmutex_request(&result_mutex, _FMR_IGNINT))) croak("Error creating semaphores"); worker_started = _beginthread(&callback_thread_looper, NULL, 8*1024*1024, NULL); if (worker_started == -1) { worker_started = 0; croak("Error creating callback thread"); } } #endif /* __PM__ */ #define i(test) if (strEQ(name, #test)) return newSViv((int)test); #define f(test) if (strEQ(name, #test)) return newSVnv((double)test); #ifdef __PM__ #endif static SV * neoconstant(char * name, int arg) { #include "gl_const.h" #include "glu_const.h" #include "glut_const.h" #include "glx_const.h" #include "glpm_const.h" ; return 0; } #undef i #undef f /* Note: this is caching procs once for all contexts */ /* !!! This should instead cache per context */ #ifdef HAVE_GL #ifdef _WIN32 #define loadProc(proc,name) \ { \ if (!proc) proc = (void *)wglGetProcAddress(name); \ if (!proc) croak(name " is not supported by this renderer"); \ } #else #define loadProc(proc,name) #endif #endif #ifdef HAVE_GLX # define HAVE_GLpc /* Perl interface */ # define nativeWindowId(d, w) (w) static Bool WaitForNotify(Display *d, XEvent *e, char *arg) { return (e->type == MapNotify) && (e->xmap.window == (Window)arg); } # define glpResizeWindow(s1,s2,w,d) XResizeWindow(d,w,s1,s2) # define glpMoveWindow(s1,s2,w,d) XMoveWindow(d,w,s1,s2) # define glpMoveResizeWindow(s1,s2,s3,s4,w,d) XMoveResizeWindow(d,w,s1,s2,s3,s4) #endif /* defined HAVE_GLX */ #ifdef __PM__ # define HAVE_GLpc /* Perl interface */ # define auxXWindow() (croak("Not implemented: auxXWindow"),0) HMQ hmq; AV *EventAv; unsigned long LastEventMask; /* XXXX Common for all the windows */ Display myDisplay; #else # define InitSys() #endif /* defined __PM__ */ #ifdef HAVE_GLpc # define NUM_ARG 7 Display *dpy; int dpy_open; XVisualInfo *vi; Colormap cmap; XSetWindowAttributes swa; Window win; GLXContext cx; static int default_attributes[] = { GLX_DOUBLEBUFFER, GLX_RGBA }; #endif /* defined HAVE_GLpc */ static int DBUFFER_HACK = 0; #define __had_dbuffer_hack() (DBUFFER_HACK) #define PackCallbackST(av,first) \ if (SvROK(ST(first)) && (SvTYPE(SvRV(ST(first))) == SVt_PVAV)){ \ int i; \ AV * x = (AV*)SvRV(ST(first)); \ for(i=0;i<=av_len(x);i++) { \ av_push(av, newSVsv(*av_fetch(x, i, 0))); \ } \ } else { \ int i; \ for(i=first;i type ## _callback \ , params) \ if (t->polygon_data_av) \ for (i=0; i<=av_len(t->polygon_data_av); i++) \ XPUSHs(sv_2mortal(newSVsv(*av_fetch(t->polygon_data_av, i, 0)))); #define end_tess_marshaller() \ end_void_specific_marshaller() begin_tess_marshaller(begin, (GLenum type, void * polygon_data)) XPUSHs(sv_2mortal(newSViv(type))); end_tess_marshaller() begin_tess_marshaller(end, (void * polygon_data)) end_tess_marshaller() begin_tess_marshaller(edgeFlag, (GLboolean flag, void * polygon_data)) XPUSHs(sv_2mortal(newSViv(flag))); end_tess_marshaller() begin_tess_marshaller(vertex, (void * vertex_data, void * polygon_data)) if (vertex_data) { AV * vd = (AV*)vertex_data; for (i=0; i<=av_len(vd); i++) XPUSHs(sv_2mortal(newSVsv(*av_fetch(vd, i, 0)))); } end_tess_marshaller() begin_tess_marshaller(error, (GLenum errno_, void * polygon_data)) XPUSHs(sv_2mortal(newSViv(errno_))); end_tess_marshaller() begin_tess_marshaller(combine, (GLdouble coords[3], void * vertex_data[4], GLfloat weight[4], void ** outd, void * polygon_data)) croak("combine tess marshaller needs FIXME (see OpenGL.xs)"); end_tess_marshaller() #endif typedef void * ptr; #define SvItems(type,offset,count,dst) \ { \ GLuint i; \ switch (type) \ { \ case GL_UNSIGNED_BYTE: \ case GL_BITMAP: \ for (i=0;i<(count);i++) \ { \ ((GLubyte*)(dst))[i] = SvIV(ST(i+(offset))); \ } \ break; \ case GL_BYTE: \ for (i=0;i<(count);i++) \ { \ ((GLbyte*)(dst))[i] = SvIV(ST(i+(offset))); \ } \ break; \ case GL_UNSIGNED_SHORT: \ for (i=0;i<(count);i++) \ { \ ((GLushort*)(dst))[i] = SvIV(ST(i+(offset))); \ } \ break; \ case GL_SHORT: \ for (i=0;i<(count);i++) \ { \ ((GLshort*)(dst))[i] = SvIV(ST(i+(offset))); \ } \ break; \ case GL_UNSIGNED_INT: \ for (i=0;i<(count);i++) \ { \ ((GLuint*)(dst))[i] = SvIV(ST(i+(offset))); \ } \ break; \ case GL_INT: \ for (i=0;i<(count);i++) \ { \ ((GLint*)(dst))[i] = SvIV(ST(i+(offset))); \ } \ break; \ case GL_FLOAT: \ for (i=0;i<(count);i++) \ { \ ((GLfloat*)(dst))[i] = SvNV(ST(i+(offset))); \ } \ break; \ case GL_DOUBLE: \ for (i=0;i<(count);i++) \ { \ ((GLdouble*)(dst))[i] = SvNV(ST(i+(offset))); \ } \ break; \ default: \ croak("unknown type"); \ } \ } MODULE = OpenGL PACKAGE = OpenGL::Array OpenGL::Array new(Class, count, type, ...) GLsizei count GLenum type CODE: { oga_struct * oga = malloc(sizeof(oga_struct)); int i,j; oga->type_count = items - 2; oga->item_count = count; oga->types = malloc(sizeof(GLenum) * oga->type_count); oga->type_offset = malloc(sizeof(GLint) * oga->type_count); for(i=0,j=0;itype_count;i++) { oga->types[i] = SvIV(ST(i+2)); oga->type_offset[i] = j; j += gl_type_size(oga->types[i]); } oga->total_types_width = j; oga->data_length = oga->total_types_width * ((count + oga->type_count-1) / oga->type_count); oga->data = malloc(oga->data_length); oga->free_data = 1; memset(oga->data, '\0', oga->data_length); RETVAL = oga; } OUTPUT: RETVAL OpenGL::Array new_list(Class, type, ...) GLenum type CODE: { oga_struct * oga = malloc(sizeof(oga_struct)); oga->type_count = 1; oga->item_count = items - 2; oga->total_types_width = gl_type_size(type); oga->data_length = oga->total_types_width * oga->item_count; oga->types = malloc(sizeof(GLenum) * oga->type_count); oga->type_offset = malloc(sizeof(GLint) * oga->type_count); oga->data = malloc(oga->data_length); oga->free_data = 1; oga->type_offset[0] = 0; oga->types[0] = type; SvItems(type,2,(GLuint)oga->item_count,oga->data); RETVAL = oga; } OUTPUT: RETVAL OpenGL::Array new_from_pointer(Class, ptr, length) void * ptr GLsizei length CODE: { oga_struct * oga = malloc(sizeof(oga_struct)); oga->type_count = 1; oga->item_count = length; oga->types = malloc(sizeof(GLenum) * oga->type_count); oga->type_offset = malloc(sizeof(GLint) * oga->type_count); oga->types[0] = GL_UNSIGNED_BYTE; oga->type_offset[0] = 0; oga->total_types_width = 1; oga->data_length = oga->item_count; oga->data = ptr; oga->free_data = 0; RETVAL = oga; } OUTPUT: RETVAL void assign(oga, pos, ...) OpenGL::Array oga GLint pos CODE: { int i,j; int end; GLenum t; char* offset; i = pos; end = i + items - 2; if (end > oga->item_count) end = oga->item_count; /* FIXME: is this char* conversion what is intended? */ offset = ((char*)oga->data) + (pos / oga->type_count * oga->total_types_width) + oga->type_offset[pos % oga->type_count]; j = 2; for (;itypes[i % oga->type_count]; switch (t) { #ifdef GL_VERSION_1_2 case GL_UNSIGNED_BYTE_3_3_2: case GL_UNSIGNED_BYTE_2_3_3_REV: (*(GLubyte*)offset) = SvIV(ST(j)); offset += sizeof(GLubyte); break; case GL_UNSIGNED_SHORT_5_6_5: case GL_UNSIGNED_SHORT_5_6_5_REV: case GL_UNSIGNED_SHORT_4_4_4_4: case GL_UNSIGNED_SHORT_4_4_4_4_REV: case GL_UNSIGNED_SHORT_5_5_5_1: case GL_UNSIGNED_SHORT_1_5_5_5_REV: (*(GLushort*)offset) = SvIV(ST(j)); offset += sizeof(GLushort); break; case GL_UNSIGNED_INT_8_8_8_8: case GL_UNSIGNED_INT_8_8_8_8_REV: case GL_UNSIGNED_INT_10_10_10_2: case GL_UNSIGNED_INT_2_10_10_10_REV: (*(GLuint*)offset) = SvIV(ST(j)); offset += sizeof(GLuint); break; #endif case GL_UNSIGNED_BYTE: case GL_BITMAP: (*(GLubyte*)offset) = SvIV(ST(j)); offset += sizeof(GLubyte); break; case GL_BYTE: (*(GLbyte*)offset) = SvIV(ST(j)); offset += sizeof(GLbyte); break; case GL_UNSIGNED_SHORT: (*(GLushort*)offset) = SvIV(ST(j)); offset += sizeof(GLushort); break; case GL_SHORT: (*(GLshort*)offset) = SvIV(ST(j)); offset += sizeof(GLshort); break; case GL_UNSIGNED_INT: (*(GLuint*)offset) = SvIV(ST(j)); offset += sizeof(GLuint); break; case GL_INT: (*(GLint*)offset) = SvIV(ST(j)); offset += sizeof(GLint); break; case GL_FLOAT: (*(GLfloat*)offset) = SvNV(ST(j)); offset += sizeof(GLfloat); break; case GL_DOUBLE: (*(GLdouble*)offset) = SvNV(ST(j)); offset += sizeof(GLdouble); break; case GL_2_BYTES: { unsigned long v = SvIV(ST(j)); (*(GLubyte*)offset) = v >> 8; offset++; (*(GLubyte*)offset) = v & 0xff; offset++; break; } case GL_3_BYTES: { unsigned long v = SvIV(ST(j)); (*(GLubyte*)offset) = (v >> 16)& 0xff; offset++; (*(GLubyte*)offset) = (v >> 8) & 0xff; offset++; (*(GLubyte*)offset) = (v >> 0) & 0xff; offset++; break; } case GL_4_BYTES: { unsigned long v = SvIV(ST(j)); (*(GLubyte*)offset) = (v >> 24)& 0xff; offset++; (*(GLubyte*)offset) = (v >> 16)& 0xff; offset++; (*(GLubyte*)offset) = (v >> 8) & 0xff; offset++; (*(GLubyte*)offset) = (v >> 0) & 0xff; offset++; break; } default: croak("unknown type"); } } } void assign_data(oga, pos, data) OpenGL::Array oga GLint pos SV * data CODE: { void * offset; void * src; STRLEN len; offset = ((char*)oga->data) + (pos / oga->type_count * oga->total_types_width) + oga->type_offset[pos % oga->type_count]; src = SvPV(data, len); memcpy(offset, src, len); } void retrieve(oga, pos, len) OpenGL::Array oga GLint pos GLint len PPCODE: { char * offset; int end = pos + len; int i; offset = ((char*)oga->data) + (pos / oga->type_count * oga->total_types_width) + oga->type_offset[pos % oga->type_count]; if (end > oga->item_count) end = oga->item_count; EXTEND(sp, end-pos); i = pos; for (;itypes[i % oga->type_count]; switch (t) { #ifdef GL_VERSION_1_2 case GL_UNSIGNED_BYTE_3_3_2: case GL_UNSIGNED_BYTE_2_3_3_REV: PUSHs(sv_2mortal(newSViv( (*(GLubyte*)offset) ))); offset += sizeof(GLubyte); break; case GL_UNSIGNED_SHORT_5_6_5: case GL_UNSIGNED_SHORT_5_6_5_REV: case GL_UNSIGNED_SHORT_4_4_4_4: case GL_UNSIGNED_SHORT_4_4_4_4_REV: case GL_UNSIGNED_SHORT_5_5_5_1: case GL_UNSIGNED_SHORT_1_5_5_5_REV: PUSHs(sv_2mortal(newSViv( (*(GLushort*)offset) ))); offset += sizeof(GLushort); break; case GL_UNSIGNED_INT_8_8_8_8: case GL_UNSIGNED_INT_8_8_8_8_REV: case GL_UNSIGNED_INT_10_10_10_2: case GL_UNSIGNED_INT_2_10_10_10_REV: PUSHs(sv_2mortal(newSViv( (*(GLuint*)offset) ))); offset += sizeof(GLuint); break; #endif case GL_UNSIGNED_BYTE: case GL_BITMAP: PUSHs(sv_2mortal(newSViv( (*(GLubyte*)offset) ))); offset += sizeof(GLubyte); break; case GL_BYTE: PUSHs(sv_2mortal(newSViv( (*(GLbyte*)offset) ))); offset += sizeof(GLbyte); break; case GL_UNSIGNED_SHORT: PUSHs(sv_2mortal(newSViv( (*(GLushort*)offset) ))); offset += sizeof(GLushort); break; case GL_SHORT: PUSHs(sv_2mortal(newSViv( (*(GLshort*)offset) ))); offset += sizeof(GLshort); break; case GL_UNSIGNED_INT: PUSHs(sv_2mortal(newSViv( (*(GLuint*)offset) ))); offset += sizeof(GLuint); break; case GL_INT: PUSHs(sv_2mortal(newSViv( (*(GLint*)offset) ))); offset += sizeof(GLint); break; case GL_FLOAT: PUSHs(sv_2mortal(newSVnv( (*(GLfloat*)offset) ))); offset += sizeof(GLfloat); break; case GL_DOUBLE: PUSHs(sv_2mortal(newSVnv( (*(GLdouble*)offset) ))); offset += sizeof(GLdouble); break; case GL_2_BYTES: case GL_3_BYTES: case GL_4_BYTES: default: croak("unknown type"); } } } SV * retrieve_data(oga, pos, len) OpenGL::Array oga GLint pos GLint len CODE: { void * offset; offset = ((char*)oga->data) + (pos / oga->type_count * oga->total_types_width) + oga->type_offset[pos % oga->type_count]; RETVAL = newSVpv((char*)offset, len); } OUTPUT: RETVAL GLsizei elements(oga) OpenGL::Array oga CODE: RETVAL = oga->item_count; OUTPUT: RETVAL void * ptr(oga) OpenGL::Array oga CODE: RETVAL = oga->data; OUTPUT: RETVAL void * offset(oga, pos) OpenGL::Array oga GLint pos CODE: RETVAL = ((char*)oga->data) + (pos / oga->type_count * oga->total_types_width) + oga->type_offset[pos % oga->type_count]; OUTPUT: RETVAL void DESTROY(oga) OpenGL::Array oga CODE: { if (oga->free_data) { /* To make sure dangling pointers will be obvious */ memset(oga->data, '\0', oga->data_length); free(oga->data); } free(oga->types); free(oga->type_offset); free(oga); } MODULE = OpenGL PACKAGE = OpenGL SV * constant(name,arg) char * name int arg CODE: { RETVAL = neoconstant(name, arg); if (!RETVAL) RETVAL = newSVsv(&PL_sv_undef); } OUTPUT: RETVAL int _have_gl() CODE: #ifdef HAVE_GL RETVAL = 1; #else RETVAL = 0; #endif OUTPUT: RETVAL int _have_glu() CODE: #ifdef HAVE_GLU RETVAL = 1; #else RETVAL = 0; #endif OUTPUT: RETVAL int _have_glut() CODE: #ifdef HAVE_GLUT RETVAL = 1; #else RETVAL = 0; #endif OUTPUT: RETVAL int _have_glx() CODE: #ifdef HAVE_GLX RETVAL = 1; #else RETVAL = 0; #endif OUTPUT: RETVAL int _have_glp() CODE: #ifdef HAVE_GLpc RETVAL = 1; #else RETVAL = 0; #endif OUTPUT: RETVAL #ifdef HAVE_GL # 1.0 void glAccum(op, value) GLenum op GLfloat value # 1.0 void glAlphaFunc(func, ref) GLenum func GLclampf ref #ifdef GL_VERSION_1_1 void glAreTexturesResident_c(n, textures, residences) GLsizei n void * textures void * residences CODE: glAreTexturesResident(n, textures, residences); void glAreTexturesResident_s(n, textures, residences) GLsizei n SV * textures SV * residences CODE: { void * textures_s = EL(textures, sizeof(GLuint)*n); void * residences_s = EL(residences, sizeof(GLboolean)*n); glAreTexturesResident(n, textures_s, residences_s); } # 1.1 void glAreTexturesResident_p(...) PPCODE: { GLsizei n = items; GLuint * textures = malloc(sizeof(GLuint) * (n+1)); GLboolean * residences = malloc(sizeof(GLboolean) * (n+1)); GLboolean result; int i; for (i=0;itypes[0], 0, oga->data); #endif # 1.0 void glCopyPixels(x, y, width, height, type) GLint x GLint y GLsizei width GLsizei height GLenum type #ifdef GL_VERSION_1_1 # 1.1 void glCopyTexImage1D(target, level, internalFormat, x, y, width, border) GLenum target GLint level GLenum internalFormat GLint x GLint y GLsizei width GLint border # 1.1 void glCopyTexImage2D(target, level, internalFormat, x, y, width, height, border) GLenum target GLint level GLenum internalFormat GLint x GLint y GLsizei width GLsizei height GLint border # 1.1 void glCopyTexSubImage1D(target, level, xoffset, x, y, width) GLenum target GLint level GLint xoffset GLint x GLint y GLsizei width # 1.1 void glCopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height) GLenum target GLint level GLint xoffset GLint yoffset GLint x GLint y GLsizei width GLsizei height #ifdef GL_VERSION_1_2 # 1.2 void glCopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height) GLenum target GLint level GLint xoffset GLint yoffset GLint zoffset GLint x GLint y GLsizei width GLsizei height INIT: loadProc(glCopyTexSubImage3D,"glCopyTexSubImage3D"); CODE: { glCopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height); } #endif #endif # 1.0 void glCullFace(mode) GLenum mode # 1.0 void glDeleteLists(list, range) GLenum list GLsizei range #ifdef GL_VERSION_1_1 # 1.1 void glDeleteTextures_c(items, list) GLint items void * list CODE: glDeleteTextures(items,list); # 1.1 void glDeleteTextures_s(items, list) GLint items SV * list CODE: { void * list_s = EL(list, sizeof(GLuint) * items); glDeleteTextures(items,list_s); } # 1.1 void glDeleteTextures_p(...) CODE: if (items) { GLuint * list = malloc(sizeof(GLuint) * items); int i; for(i=0;i 3) { if (start < (GLuint)items-3) { GLuint * indices; GLuint i; if (start+count > (GLuint)(items-3)) count = (GLuint)items-(start+3); indices = malloc(sizeof(GLuint) * count); for (i=start; idata); #endif # 1.0 void glEnable(cap) GLenum cap # 1.0 void glDisable(cap) GLenum cap #ifdef GL_VERSION_1_1 # 1.1 void glEnableClientState(cap) GLenum cap # 1.1 void glDisableClientState(cap) GLenum cap #endif # 1.0 void glEvalCoord1d(u) GLdouble u # 1.0 void glEvalCoord1f(u) GLfloat u # 1.0 void glEvalCoord2d(u, v) GLdouble u GLdouble v # 1.0 void glEvalCoord2f(u, v) GLfloat u GLfloat v # 1.0 void glEvalMesh1(mode, i1, i2) GLenum mode GLint i1 GLint i2 # 1.0 void glEvalMesh2(mode, i1, i2, j1, j2) GLenum mode GLint i1 GLint i2 GLint j1 GLint j2 # 1.0 void glEvalPoint1(i) GLint i # 1.0 void glEvalPoint2(i, j) GLint i GLint j # 1.0 void glFeedbackBuffer_c(size, type, buffer) GLsizei size GLenum type void * buffer CODE: glFeedbackBuffer(size, type, (GLfloat*)(buffer)); # 1.0 void glFinish() # 1.0 void glFlush() # 1.0 void glFogf(pname, param) GLenum pname GLfloat param # 1.0 void glFogi(pname, param) GLenum pname GLint param # 1.0 void glFogfv_c(pname, params) GLenum pname void * params CODE: glFogfv(pname, params); # 1.0 void glFogiv_c(pname, params) GLenum pname void * params CODE: glFogiv(pname, params); # 1.0 void glFogfv_s(pname, params) GLenum pname SV * params CODE: { GLfloat * params_s = EL(params, sizeof(GLfloat)*gl_fog_count(pname)); glFogfv(pname, params_s); } # 1.0 void glFogiv_s(pname, params) GLenum pname SV * params CODE: { GLint * params_s = EL(params, sizeof(GLint)*gl_fog_count(pname)); glFogiv(pname, params_s); } # 1.0 void glFogfv_p(pname, param1, param2=0, param3=0, param4=0) GLenum pname GLfloat param1 GLfloat param2 GLfloat param3 GLfloat param4 CODE: { GLfloat p[4]; p[0] = param1; p[1] = param2; p[2] = param3; p[3] = param4; glFogfv(pname, &p[0]); } # 1.0 void glFogiv_p(pname, param1, param2=0, param3=0, param4=0) GLenum pname GLint param1 GLint param2 GLint param3 GLint param4 CODE: { GLint p[4]; p[0] = param1; p[1] = param2; p[2] = param3; p[3] = param4; glFogiv(pname, &p[0]); } # 1.0 void glFrontFace(mode) GLenum mode # 1.0 void glFrustum(left, right, bottom, top, zNear, zFar) GLdouble left GLdouble right GLdouble bottom GLdouble top GLdouble zNear GLdouble zFar # 1.0 GLuint glGenLists(range) GLsizei range #ifdef GL_VERSION_1_1 # 1.1 void glGenTextures_c(n, textures) GLint n void * textures CODE: glGenTextures(n, textures); # 1.1 void glGenTextures_s(n, textures) GLint n SV * textures CODE: { void * textures_s = EL(textures, sizeof(GLuint)*n); glGenTextures(n, textures_s); } # 1.1 void glGenTextures_p(n) GLint n PPCODE: if (n) { GLuint * textures = malloc(sizeof(GLuint) * n); int i; glGenTextures(n, textures); EXTEND(sp, n); for(i=0;itypes[0], 0, oga->data); #endif # 1.0 void glInitNames() #ifdef GL_VERSION_1_1 # 1.1 void glInterleavedArrays_c(format, stride, pointer) GLenum format GLsizei stride void * pointer CODE: glInterleavedArrays(format, stride, pointer); #endif # 1.0 GLboolean glIsEnabled(cap) GLenum cap # 1.0 GLboolean glIsList(list) GLuint list #ifdef GL_VERSION_1_1 # 1.1 GLboolean glIsTexture(list) GLuint list #endif # 1.0 void glLightf(light, pname, param) GLenum light GLenum pname GLfloat param # 1.0 void glLighti(light, pname, param) GLenum light GLenum pname GLint param # 1.0 void glLightfv_c(light, pname, params) GLenum light GLenum pname void * params CODE: glLightfv(light, pname, params); # 1.0 void glLightiv_c(light, pname, params) GLenum light GLenum pname void * params CODE: glLightiv(light, pname, params); # 1.0 void glLightfv_s(light, pname, params) GLenum light GLenum pname SV * params CODE: { GLfloat * params_s = EL(params, sizeof(GLfloat)*gl_light_count(pname)); glLightfv(light, pname, params_s); } # 1.0 void glLightiv_s(light, pname, params) GLenum light GLenum pname SV * params CODE: { GLint * params_s = EL(params, sizeof(GLint)*gl_light_count(pname)); glLightiv(light, pname, params_s); } # 1.0 void glLightfv_p(light, pname, ...) GLenum light GLenum pname CODE: { GLfloat p[MAX_GL_LIGHT_COUNT]; int i; if ((items-2) != gl_light_count(pname)) croak("Incorrect number of arguments"); for(i=2;itypes[0], 0, oga->data); #endif # 1.0 void glOrtho(left, right, bottom, top, zNear, zFar) GLdouble left GLdouble right GLdouble bottom GLdouble top GLdouble zNear GLdouble zFar # 1.0 void glPassThrough(token) GLfloat token # 1.0 void glPixelMapfv_c(map, mapsize, values) GLenum map GLsizei mapsize void * values CODE: glPixelMapfv(map, mapsize, values); # 1.0 void glPixelMapuiv_c(map, mapsize, values) GLenum map GLsizei mapsize void * values CODE: glPixelMapuiv(map, mapsize, values); # 1.0 void glPixelMapusv_c(map, mapsize, values) GLenum map GLsizei mapsize void * values CODE: glPixelMapusv(map, mapsize, values); # 1.0 void glPixelMapfv_s(map, mapsize, values) GLenum map GLsizei mapsize SV * values CODE: { GLfloat * values_s = EL(values, sizeof(GLfloat)*mapsize); glPixelMapfv(map, mapsize, values_s); } # 1.0 void glPixelMapuiv_s(map, mapsize, values) GLenum map GLsizei mapsize SV * values CODE: { GLuint * values_s = EL(values, sizeof(GLuint)*mapsize); glPixelMapuiv(map, mapsize, values_s); } # 1.0 void glPixelMapusv_s(map, mapsize, values) GLenum map GLsizei mapsize SV * values CODE: { GLushort * values_s = EL(values, sizeof(GLushort)*mapsize); glPixelMapusv(map, mapsize, values_s); } # 1.0 void glPixelMapfv_p(map, ...) GLenum map CODE: { GLint mapsize = items-1; GLfloat * values; int i; values = malloc(sizeof(GLfloat) * (mapsize+1)); for (i=0;itypes[0], 0, oga->data); #endif # 1.0 void glTexEnvf(target, pname, param) GLenum target GLenum pname GLfloat param # 1.0 void glTexEnvi(target, pname, param) GLenum target GLenum pname GLint param # 1.0 void glTexEnvfv_s(target, pname, params) GLenum target GLenum pname SV * params CODE: { GLfloat * params_s = EL(params, sizeof(GLfloat)*gl_texenv_count(pname)); glTexEnvfv(target, pname, params_s); } # 1.0 void glTexEnviv_s(target, pname, params) GLenum target GLenum pname SV * params CODE: { GLint * params_s = EL(params, sizeof(GLint)*gl_texenv_count(pname)); glTexEnviv(target, pname, params_s); } # 1.0 void glTexEnvfv_p(target, pname, ...) GLenum target GLenum pname CODE: { GLfloat p[MAX_GL_TEXENV_COUNT]; int n = items-2; int i; if (n != gl_texenv_count(pname)) croak("Incorrect number of arguments"); for (i=2;itypes[0], 0, oga->data); #endif # 1.0 void glViewport(x, y, width, height) GLint x GLint y GLsizei width GLsizei height # Generated declarations void glVertex2d(x, y) GLdouble x GLdouble y void glVertex2dv_c(v) void * v CODE: glVertex2dv(v); void glVertex2dv_s(v) SV * v CODE: { GLdouble * v_s = EL(v, sizeof(GLdouble)*2); glVertex2dv(v_s); } void glVertex2dv_p(x, y) GLdouble x GLdouble y CODE: { GLdouble param[2]; param[0] = x; param[1] = y; glVertex2dv(param); } void glVertex2f(x, y) GLfloat x GLfloat y void glVertex2fv_s(v) SV * v CODE: { GLfloat * v_s = EL(v, sizeof(GLfloat)*2); glVertex2fv(v_s); } void glVertex2fv_c(v) void * v CODE: glVertex2fv(v); void glVertex2fv_p(x, y) GLfloat x GLfloat y CODE: { GLfloat param[2]; param[0] = x; param[1] = y; glVertex2fv(param); } void glVertex2i(x, y) GLint x GLint y void glVertex2iv_c(v) void * v CODE: glVertex2iv(v); void glVertex2iv_s(v) SV * v CODE: { GLint * v_s = EL(v, sizeof(GLint)*2); glVertex2iv(v_s); } void glVertex2iv_p(x, y) GLint x GLint y CODE: { GLint param[2]; param[0] = x; param[1] = y; glVertex2iv(param); } void glVertex2s(x, y) GLshort x GLshort y void glVertex2sv_c(v) void * v CODE: glVertex2sv(v); void glVertex2sv_s(v) SV * v CODE: { GLshort * v_s = EL(v, sizeof(GLshort)*2); glVertex2sv(v_s); } void glVertex2sv_p(x, y) GLshort x GLshort y CODE: { GLshort param[2]; param[0] = x; param[1] = y; glVertex2sv(param); } void glVertex3d(x, y, z) GLdouble x GLdouble y GLdouble z void glVertex3dv_c(v) void * v CODE: glVertex3dv(v); void glVertex3dv_s(v) SV * v CODE: { GLdouble * v_s = EL(v, sizeof(GLdouble)*3); glVertex3dv(v_s); } void glVertex3dv_p(x, y, z) GLdouble x GLdouble y GLdouble z CODE: { GLdouble param[3]; param[0] = x; param[1] = y; param[2] = z; glVertex3dv(param); } void glVertex3f(x, y, z) GLfloat x GLfloat y GLfloat z void glVertex3fv_c(v) void * v CODE: glVertex3fv(v); void glVertex3fv_s(v) SV * v CODE: { GLfloat * v_s = EL(v, sizeof(GLfloat)*3); glVertex3fv(v_s); } void glVertex3fv_p(x, y, z) GLfloat x GLfloat y GLfloat z CODE: { GLfloat param[3]; param[0] = x; param[1] = y; param[2] = z; glVertex3fv(param); } void glVertex3i(x, y, z) GLint x GLint y GLint z void glVertex3iv_c(v) void * v CODE: glVertex3iv(v); void glVertex3iv_s(v) SV * v CODE: { GLint * v_s = EL(v, sizeof(GLint)*3); glVertex3iv(v_s); } void glVertex3iv_p(x, y, z) GLint x GLint y GLint z CODE: { GLint param[3]; param[0] = x; param[1] = y; param[2] = z; glVertex3iv(param); } void glVertex3s(x, y, z) GLshort x GLshort y GLshort z void glVertex3sv_c(v) void * v CODE: glVertex3sv(v); void glVertex3sv_s(v) SV * v CODE: { GLshort * v_s = EL(v, sizeof(GLshort)*3); glVertex3sv(v_s); } void glVertex3sv_p(x, y, z) GLshort x GLshort y GLshort z CODE: { GLshort param[3]; param[0] = x; param[1] = y; param[2] = z; glVertex3sv(param); } void glVertex4d(x, y, z, w) GLdouble x GLdouble y GLdouble z GLdouble w void glVertex4dv_c(v) void * v CODE: glVertex4dv(v); void glVertex4dv_s(v) SV * v CODE: { GLdouble * v_s = EL(v, sizeof(GLdouble)*4); glVertex4dv(v_s); } void glVertex4dv_p(x, y, z, w) GLdouble x GLdouble y GLdouble z GLdouble w CODE: { GLdouble param[4]; param[0] = x; param[1] = y; param[2] = z; param[3] = w; glVertex4dv(param); } void glVertex4f(x, y, z, w) GLfloat x GLfloat y GLfloat z GLfloat w void glVertex4fv_c(v) void * v CODE: glVertex4fv(v); void glVertex4fv_s(v) SV * v CODE: { GLfloat * v_s = EL(v, sizeof(GLfloat)*4); glVertex4fv(v_s); } void glVertex4fv_p(x, y, z, w) GLfloat x GLfloat y GLfloat z GLfloat w CODE: { GLfloat param[4]; param[0] = x; param[1] = y; param[2] = z; param[3] = w; glVertex4fv(param); } void glVertex4i(x, y, z, w) GLint x GLint y GLint z GLint w void glVertex4iv_c(v) void * v CODE: glVertex4iv(v); void glVertex4iv_s(v) SV * v CODE: { GLint * v_s = EL(v, sizeof(GLint)*4); glVertex4iv(v_s); } void glVertex4iv_p(x, y, z, w) GLint x GLint y GLint z GLint w CODE: { GLint param[4]; param[0] = x; param[1] = y; param[2] = z; param[3] = w; glVertex4iv(param); } void glVertex4s(x, y, z, w) GLshort x GLshort y GLshort z GLshort w void glVertex4sv_s(v) SV * v CODE: { GLshort * v_s = EL(v, sizeof(GLshort)*4); glVertex4sv(v_s); } void glVertex4sv_c(v) void * v CODE: glVertex4sv(v); void glVertex4sv_p(x, y, z, w) GLshort x GLshort y GLshort z GLshort w CODE: { GLshort param[4]; param[0] = x; param[1] = y; param[2] = z; param[3] = w; glVertex4sv(param); } void glNormal3b(nx, ny, nz) GLbyte nx GLbyte ny GLbyte nz void glNormal3bv_c(v) void * v CODE: glNormal3bv(v); void glNormal3bv_s(v) SV * v CODE: { GLbyte * v_s = EL(v, sizeof(GLbyte)*3); glNormal3bv(v_s); } void glNormal3bv_p(nx, ny, nz) GLbyte nx GLbyte ny GLbyte nz CODE: { GLbyte param[3]; param[0] = nx; param[1] = ny; param[2] = nz; glNormal3bv(param); } void glNormal3d(nx, ny, nz) GLdouble nx GLdouble ny GLdouble nz void glNormal3dv_c(v) void * v CODE: glNormal3dv(v); void glNormal3dv_s(v) SV * v CODE: { GLdouble * v_s = EL(v, sizeof(GLdouble)*3); glNormal3dv(v_s); } void glNormal3dv_p(nx, ny, nz) GLdouble nx GLdouble ny GLdouble nz CODE: { GLdouble param[3]; param[0] = nx; param[1] = ny; param[2] = nz; glNormal3dv(param); } void glNormal3f(nx, ny, nz) GLfloat nx GLfloat ny GLfloat nz void glNormal3fv_c(v) void * v CODE: glNormal3fv(v); void glNormal3fv_s(v) SV * v CODE: { GLfloat * v_s = EL(v, sizeof(GLfloat)*3); glNormal3fv(v_s); } void glNormal3fv_p(nx, ny, nz) GLfloat nx GLfloat ny GLfloat nz CODE: { GLfloat param[3]; param[0] = nx; param[1] = ny; param[2] = nz; glNormal3fv(param); } void glNormal3i(nx, ny, nz) GLint nx GLint ny GLint nz void glNormal3iv_c(v) void * v CODE: glNormal3iv(v); void glNormal3iv_s(v) SV * v CODE: { GLint * v_s = EL(v, sizeof(GLint)*3); glNormal3iv(v_s); } void glNormal3iv_p(nx, ny, nz) GLint nx GLint ny GLint nz CODE: { GLint param[3]; param[0] = nx; param[1] = ny; param[2] = nz; glNormal3iv(param); } void glNormal3s(nx, ny, nz) GLshort nx GLshort ny GLshort nz void glNormal3sv_c(v) void * v CODE: glNormal3sv(v); void glNormal3sv_s(v) SV * v CODE: { GLshort * v_s = EL(v, sizeof(GLshort)*3); glNormal3sv(v_s); } void glNormal3sv_p(nx, ny, nz) GLshort nx GLshort ny GLshort nz CODE: { GLshort param[3]; param[0] = nx; param[1] = ny; param[2] = nz; glNormal3sv(param); } void glColor3b(red, green, blue) GLbyte red GLbyte green GLbyte blue void glColor3bv_c(v) void * v CODE: glColor3bv(v); void glColor3bv_s(v) SV * v CODE: { GLbyte * v_s = EL(v, sizeof(GLbyte)*3); glColor3bv(v_s); } void glColor3bv_p(red, green, blue) GLbyte red GLbyte green GLbyte blue CODE: { GLbyte param[3]; param[0] = red; param[1] = green; param[2] = blue; glColor3bv(param); } void glColor3d(red, green, blue) GLdouble red GLdouble green GLdouble blue void glColor3dv_c(v) void * v CODE: glColor3dv(v); void glColor3dv_s(v) SV * v CODE: { GLdouble * v_s = EL(v, sizeof(GLdouble)*3); glColor3dv(v_s); } void glColor3dv_p(red, green, blue) GLdouble red GLdouble green GLdouble blue CODE: { GLdouble param[3]; param[0] = red; param[1] = green; param[2] = blue; glColor3dv(param); } void glColor3f(red, green, blue) GLfloat red GLfloat green GLfloat blue void glColor3fv_c(v) void * v CODE: glColor3fv(v); void glColor3fv_s(v) SV * v CODE: { GLfloat * v_s = EL(v, sizeof(GLfloat)*3); glColor3fv(v_s); } void glColor3fv_p(red, green, blue) GLfloat red GLfloat green GLfloat blue CODE: { GLfloat param[3]; param[0] = red; param[1] = green; param[2] = blue; glColor3fv(param); } void glColor3i(red, green, blue) GLint red GLint green GLint blue void glColor3iv_c(v) void * v CODE: glColor3iv(v); void glColor3iv_s(v) SV * v CODE: { GLint * v_s = EL(v, sizeof(GLint)*3); glColor3iv(v_s); } void glColor3iv_p(red, green, blue) GLint red GLint green GLint blue CODE: { GLint param[3]; param[0] = red; param[1] = green; param[2] = blue; glColor3iv(param); } void glColor3s(red, green, blue) GLshort red GLshort green GLshort blue void glColor3sv_c(v) void * v CODE: glColor3sv(v); void glColor3sv_s(v) SV * v CODE: { GLshort * v_s = EL(v, sizeof(GLshort)*3); glColor3sv(v_s); } void glColor3sv_p(red, green, blue) GLshort red GLshort green GLshort blue CODE: { GLshort param[3]; param[0] = red; param[1] = green; param[2] = blue; glColor3sv(param); } void glColor3ub(red, green, blue) GLubyte red GLubyte green GLubyte blue void glColor3ubv_c(v) void * v CODE: glColor3ubv(v); void glColor3ubv_s(v) SV * v CODE: { GLubyte * v_s = EL(v, sizeof(GLubyte)*3); glColor3ubv(v_s); } void glColor3ubv_p(red, green, blue) GLubyte red GLubyte green GLubyte blue CODE: { GLubyte param[3]; param[0] = red; param[1] = green; param[2] = blue; glColor3ubv(param); } void glColor3ui(red, green, blue) GLuint red GLuint green GLuint blue void glColor3uiv_c(v) void * v CODE: glColor3uiv(v); void glColor3uiv_s(v) SV * v CODE: { GLuint * v_s = EL(v, sizeof(GLuint)*3); glColor3uiv(v_s); } void glColor3uiv_p(red, green, blue) GLuint red GLuint green GLuint blue CODE: { GLuint param[3]; param[0] = red; param[1] = green; param[2] = blue; glColor3uiv(param); } void glColor3us(red, green, blue) GLushort red GLushort green GLushort blue void glColor3usv_c(v) void * v CODE: glColor3usv(v); void glColor3usv_s(v) SV * v CODE: { GLushort * v_s = EL(v, sizeof(GLushort)*3); glColor3usv(v_s); } void glColor3usv_p(red, green, blue) GLushort red GLushort green GLushort blue CODE: { GLushort param[3]; param[0] = red; param[1] = green; param[2] = blue; glColor3usv(param); } void glColor4b(red, green, blue, alpha) GLbyte red GLbyte green GLbyte blue GLbyte alpha void glColor4bv_c(v) void * v CODE: glColor4bv(v); void glColor4bv_s(v) SV * v CODE: { GLbyte * v_s = EL(v, sizeof(GLbyte)*4); glColor4bv(v_s); } void glColor4bv_p(red, green, blue, alpha) GLbyte red GLbyte green GLbyte blue GLbyte alpha CODE: { GLbyte param[4]; param[0] = red; param[1] = green; param[2] = blue; param[3] = alpha; glColor4bv(param); } void glColor4d(red, green, blue, alpha) GLdouble red GLdouble green GLdouble blue GLdouble alpha void glColor4dv_c(v) void * v CODE: glColor4dv(v); void glColor4dv_s(v) SV * v CODE: { GLdouble * v_s = EL(v, sizeof(GLdouble)*4); glColor4dv(v_s); } void glColor4dv_p(red, green, blue, alpha) GLdouble red GLdouble green GLdouble blue GLdouble alpha CODE: { GLdouble param[4]; param[0] = red; param[1] = green; param[2] = blue; param[3] = alpha; glColor4dv(param); } void glColor4f(red, green, blue, alpha) GLfloat red GLfloat green GLfloat blue GLfloat alpha void glColor4fv_c(v) void * v CODE: glColor4fv(v); void glColor4fv_s(v) SV * v CODE: { GLfloat * v_s = EL(v, sizeof(GLfloat)*4); glColor4fv(v_s); } void glColor4fv_p(red, green, blue, alpha) GLfloat red GLfloat green GLfloat blue GLfloat alpha CODE: { GLfloat param[4]; param[0] = red; param[1] = green; param[2] = blue; param[3] = alpha; glColor4fv(param); } void glColor4i(red, green, blue, alpha) GLint red GLint green GLint blue GLint alpha void glColor4iv_c(v) void * v CODE: glColor4iv(v); void glColor4iv_s(v) SV * v CODE: { GLint * v_s = EL(v, sizeof(GLint)*4); glColor4iv(v_s); } void glColor4iv_p(red, green, blue, alpha) GLint red GLint green GLint blue GLint alpha CODE: { GLint param[4]; param[0] = red; param[1] = green; param[2] = blue; param[3] = alpha; glColor4iv(param); } void glColor4s(red, green, blue, alpha) GLshort red GLshort green GLshort blue GLshort alpha void glColor4sv_c(v) void * v CODE: glColor4sv(v); void glColor4sv_s(v) SV * v CODE: { GLshort * v_s = EL(v, sizeof(GLshort)*4); glColor4sv(v_s); } void glColor4sv_p(red, green, blue, alpha) GLshort red GLshort green GLshort blue GLshort alpha CODE: { GLshort param[4]; param[0] = red; param[1] = green; param[2] = blue; param[3] = alpha; glColor4sv(param); } void glColor4ub(red, green, blue, alpha) GLubyte red GLubyte green GLubyte blue GLubyte alpha void glColor4ubv_c(v) void * v CODE: glColor4ubv(v); void glColor4ubv_s(v) SV * v CODE: { GLubyte * v_s = EL(v, sizeof(GLubyte)*4); glColor4ubv(v_s); } void glColor4ubv_p(red, green, blue, alpha) GLubyte red GLubyte green GLubyte blue GLubyte alpha CODE: { GLubyte param[4]; param[0] = red; param[1] = green; param[2] = blue; param[3] = alpha; glColor4ubv(param); } void glColor4ui(red, green, blue, alpha) GLuint red GLuint green GLuint blue GLuint alpha void glColor4uiv_s(v) SV * v CODE: { GLuint * v_s = EL(v, sizeof(GLuint)*4); glColor4uiv(v_s); } void glColor4uiv_c(v) void * v CODE: glColor4uiv(v); void glColor4uiv_p(red, green, blue, alpha) GLuint red GLuint green GLuint blue GLuint alpha CODE: { GLuint param[4]; param[0] = red; param[1] = green; param[2] = blue; param[3] = alpha; glColor4uiv(param); } void glColor4us(red, green, blue, alpha) GLushort red GLushort green GLushort blue GLushort alpha void glColor4usv_c(v) void * v CODE: glColor4usv(v); void glColor4usv_s(v) SV * v CODE: { GLushort * v_s = EL(v, sizeof(GLushort)*4); glColor4usv(v_s); } void glColor4usv_p(red, green, blue, alpha) GLushort red GLushort green GLushort blue GLushort alpha CODE: { GLushort param[4]; param[0] = red; param[1] = green; param[2] = blue; param[3] = alpha; glColor4usv(param); } void glTexCoord1d(s) GLdouble s void glTexCoord1dv_c(v) void * v CODE: glTexCoord1dv(v); void glTexCoord1dv_s(v) SV * v CODE: { GLdouble * v_s = EL(v, sizeof(GLdouble)*1); glTexCoord1dv(v_s); } void glTexCoord1dv_p(s) GLdouble s CODE: { GLdouble param[1]; param[0] = s; glTexCoord1dv(param); } void glTexCoord1f(s) GLfloat s void glTexCoord1fv_c(v) void * v CODE: glTexCoord1fv(v); void glTexCoord1fv_s(v) SV * v CODE: { GLfloat * v_s = EL(v, sizeof(GLfloat)*1); glTexCoord1fv(v_s); } void glTexCoord1fv_p(s) GLfloat s CODE: { GLfloat param[1]; param[0] = s; glTexCoord1fv(param); } void glTexCoord1i(s) GLint s void glTexCoord1iv_c(v) void * v CODE: glTexCoord1iv(v); void glTexCoord1iv_s(v) SV * v CODE: { GLint * v_s = EL(v, sizeof(GLint)*1); glTexCoord1iv(v_s); } void glTexCoord1iv_p(s) GLint s CODE: { GLint param[1]; param[0] = s; glTexCoord1iv(param); } void glTexCoord1s(s) GLshort s void glTexCoord1sv_c(v) void * v CODE: glTexCoord1sv(v); void glTexCoord1sv_s(v) SV * v CODE: { GLshort * v_s = EL(v, sizeof(GLshort)*1); glTexCoord1sv(v_s); } void glTexCoord1sv_p(s) GLshort s CODE: { GLshort param[1]; param[0] = s; glTexCoord1sv(param); } void glTexCoord2d(s, t) GLdouble s GLdouble t void glTexCoord2dv_c(v) void * v CODE: glTexCoord2dv(v); void glTexCoord2dv_s(v) SV * v CODE: { GLdouble * v_s = EL(v, sizeof(GLdouble)*2); glTexCoord2dv(v_s); } void glTexCoord2dv_p(s, t) GLdouble s GLdouble t CODE: { GLdouble param[2]; param[0] = s; param[1] = t; glTexCoord2dv(param); } void glTexCoord2f(s, t) GLfloat s GLfloat t void glTexCoord2fv_c(v) void * v CODE: glTexCoord2fv(v); void glTexCoord2fv_s(v) SV * v CODE: { GLfloat * v_s = EL(v, sizeof(GLfloat)*2); glTexCoord2fv(v_s); } void glTexCoord2fv_p(s, t) GLfloat s GLfloat t CODE: { GLfloat param[2]; param[0] = s; param[1] = t; glTexCoord2fv(param); } void glTexCoord2i(s, t) GLint s GLint t void glTexCoord2iv_c(v) void * v CODE: glTexCoord2iv(v); void glTexCoord2iv_s(v) SV * v CODE: { GLint * v_s = EL(v, sizeof(GLint)*2); glTexCoord2iv(v_s); } void glTexCoord2iv_p(s, t) GLint s GLint t CODE: { GLint param[2]; param[0] = s; param[1] = t; glTexCoord2iv(param); } void glTexCoord2s(s, t) GLshort s GLshort t void glTexCoord2sv_c(v) void * v CODE: glTexCoord2sv(v); void glTexCoord2sv_s(v) SV * v CODE: { GLshort * v_s = EL(v, sizeof(GLshort)*2); glTexCoord2sv(v_s); } void glTexCoord2sv_p(s, t) GLshort s GLshort t CODE: { GLshort param[2]; param[0] = s; param[1] = t; glTexCoord2sv(param); } void glTexCoord3d(s, t, r) GLdouble s GLdouble t GLdouble r void glTexCoord3dv_c(v) void * v CODE: glTexCoord3dv(v); void glTexCoord3dv_s(v) SV * v CODE: { GLdouble * v_s = EL(v, sizeof(GLdouble)*3); glTexCoord3dv(v_s); } void glTexCoord3dv_p(s, t, r) GLdouble s GLdouble t GLdouble r CODE: { GLdouble param[3]; param[0] = s; param[1] = t; param[2] = r; glTexCoord3dv(param); } void glTexCoord3f(s, t, r) GLfloat s GLfloat t GLfloat r void glTexCoord3fv_c(v) void * v CODE: glTexCoord3fv(v); void glTexCoord3fv_s(v) SV * v CODE: { GLfloat * v_s = EL(v, sizeof(GLfloat)*3); glTexCoord3fv(v_s); } void glTexCoord3fv_p(s, t, r) GLfloat s GLfloat t GLfloat r CODE: { GLfloat param[3]; param[0] = s; param[1] = t; param[2] = r; glTexCoord3fv(param); } void glTexCoord3i(s, t, r) GLint s GLint t GLint r void glTexCoord3iv_c(v) void * v CODE: glTexCoord3iv(v); void glTexCoord3iv_s(v) SV * v CODE: { GLint * v_s = EL(v, sizeof(GLint)*3); glTexCoord3iv(v_s); } void glTexCoord3iv_p(s, t, r) GLint s GLint t GLint r CODE: { GLint param[3]; param[0] = s; param[1] = t; param[2] = r; glTexCoord3iv(param); } void glTexCoord3s(s, t, r) GLshort s GLshort t GLshort r void glTexCoord3sv_s(v) SV * v CODE: { GLshort * v_s = EL(v, sizeof(GLshort)*3); glTexCoord3sv(v_s); } void glTexCoord3sv_c(v) void * v CODE: glTexCoord3sv(v); void glTexCoord3sv_p(s, t, r) GLshort s GLshort t GLshort r CODE: { GLshort param[3]; param[0] = s; param[1] = t; param[2] = r; glTexCoord3sv(param); } void glTexCoord4d(s, t, r, q) GLdouble s GLdouble t GLdouble r GLdouble q void glTexCoord4dv_c(v) void * v CODE: glTexCoord4dv(v); void glTexCoord4dv_s(v) SV * v CODE: { GLdouble * v_s = EL(v, sizeof(GLdouble)*4); glTexCoord4dv(v_s); } void glTexCoord4dv_p(s, t, r, q) GLdouble s GLdouble t GLdouble r GLdouble q CODE: { GLdouble param[4]; param[0] = s; param[1] = t; param[2] = r; param[3] = q; glTexCoord4dv(param); } void glTexCoord4f(s, t, r, q) GLfloat s GLfloat t GLfloat r GLfloat q void glTexCoord4fv_c(v) void * v CODE: glTexCoord4fv(v); void glTexCoord4fv_s(v) SV * v CODE: { GLfloat * v_s = EL(v, sizeof(GLfloat)*4); glTexCoord4fv(v_s); } void glTexCoord4fv_p(s, t, r, q) GLfloat s GLfloat t GLfloat r GLfloat q CODE: { GLfloat param[4]; param[0] = s; param[1] = t; param[2] = r; param[3] = q; glTexCoord4fv(param); } void glTexCoord4i(s, t, r, q) GLint s GLint t GLint r GLint q void glTexCoord4iv_c(v) void * v CODE: glTexCoord4iv(v); void glTexCoord4iv_s(v) SV * v CODE: { GLint * v_s = EL(v, sizeof(GLint)*4); glTexCoord4iv(v_s); } void glTexCoord4iv_p(s, t, r, q) GLint s GLint t GLint r GLint q CODE: { GLint param[4]; param[0] = s; param[1] = t; param[2] = r; param[3] = q; glTexCoord4iv(param); } void glTexCoord4s(s, t, r, q) GLshort s GLshort t GLshort r GLshort q void glTexCoord4sv_c(v) void * v CODE: glTexCoord4sv(v); void glTexCoord4sv_s(v) SV * v CODE: { GLshort * v_s = EL(v, sizeof(GLshort)*4); glTexCoord4sv(v_s); } void glTexCoord4sv_p(s, t, r, q) GLshort s GLshort t GLshort r GLshort q CODE: { GLshort param[4]; param[0] = s; param[1] = t; param[2] = r; param[3] = q; glTexCoord4sv(param); } void glRasterPos2d(x, y) GLdouble x GLdouble y void glRasterPos2dv_c(v) void * v CODE: glRasterPos2dv(v); void glRasterPos2dv_s(v) SV * v CODE: { GLdouble * v_s = EL(v, sizeof(GLdouble)*2); glRasterPos2dv(v_s); } void glRasterPos2dv_p(x, y) GLdouble x GLdouble y CODE: { GLdouble param[2]; param[0] = x; param[1] = y; glRasterPos2dv(param); } void glRasterPos2f(x, y) GLfloat x GLfloat y void glRasterPos2fv_c(v) void * v CODE: glRasterPos2fv(v); void glRasterPos2fv_s(v) SV * v CODE: { GLfloat * v_s = EL(v, sizeof(GLfloat)*2); glRasterPos2fv(v_s); } void glRasterPos2fv_p(x, y) GLfloat x GLfloat y CODE: { GLfloat param[2]; param[0] = x; param[1] = y; glRasterPos2fv(param); } void glRasterPos2i(x, y) GLint x GLint y void glRasterPos2iv_c(v) void * v CODE: glRasterPos2iv(v); void glRasterPos2iv_s(v) SV * v CODE: { GLint * v_s = EL(v, sizeof(GLint)*2); glRasterPos2iv(v_s); } void glRasterPos2iv_p(x, y) GLint x GLint y CODE: { GLint param[2]; param[0] = x; param[1] = y; glRasterPos2iv(param); } void glRasterPos2s(x, y) GLshort x GLshort y void glRasterPos2sv_c(v) void * v CODE: glRasterPos2sv(v); void glRasterPos2sv_s(v) SV * v CODE: { GLshort * v_s = EL(v, sizeof(GLshort)*2); glRasterPos2sv(v_s); } void glRasterPos2sv_p(x, y) GLshort x GLshort y CODE: { GLshort param[2]; param[0] = x; param[1] = y; glRasterPos2sv(param); } void glRasterPos3d(x, y, z) GLdouble x GLdouble y GLdouble z void glRasterPos3dv_c(v) void * v CODE: glRasterPos3dv(v); void glRasterPos3dv_s(v) SV * v CODE: { GLdouble * v_s = EL(v, sizeof(GLdouble)*3); glRasterPos3dv(v_s); } void glRasterPos3dv_p(x, y, z) GLdouble x GLdouble y GLdouble z CODE: { GLdouble param[3]; param[0] = x; param[1] = y; param[2] = z; glRasterPos3dv(param); } void glRasterPos3f(x, y, z) GLfloat x GLfloat y GLfloat z void glRasterPos3fv_c(v) void * v CODE: glRasterPos3fv(v); void glRasterPos3fv_s(v) SV * v CODE: { GLfloat * v_s = EL(v, sizeof(GLfloat)*3); glRasterPos3fv(v_s); } void glRasterPos3fv_p(x, y, z) GLfloat x GLfloat y GLfloat z CODE: { GLfloat param[3]; param[0] = x; param[1] = y; param[2] = z; glRasterPos3fv(param); } void glRasterPos3i(x, y, z) GLint x GLint y GLint z void glRasterPos3iv_c(v) void * v CODE: glRasterPos3iv(v); void glRasterPos3iv_s(v) SV * v CODE: { GLint * v_s = EL(v, sizeof(GLint)*3); glRasterPos3iv(v_s); } void glRasterPos3iv_p(x, y, z) GLint x GLint y GLint z CODE: { GLint param[3]; param[0] = x; param[1] = y; param[2] = z; glRasterPos3iv(param); } void glRasterPos3s(x, y, z) GLshort x GLshort y GLshort z void glRasterPos3sv_c(v) void * v CODE: glRasterPos3sv(v); void glRasterPos3sv_s(v) SV * v CODE: { GLshort * v_s = EL(v, sizeof(GLshort)*3); glRasterPos3sv(v_s); } void glRasterPos3sv_p(x, y, z) GLshort x GLshort y GLshort z CODE: { GLshort param[3]; param[0] = x; param[1] = y; param[2] = z; glRasterPos3sv(param); } void glRasterPos4d(x, y, z, w) GLdouble x GLdouble y GLdouble z GLdouble w void glRasterPos4dv_c(v) void * v CODE: glRasterPos4dv(v); void glRasterPos4dv_s(v) SV * v CODE: { GLdouble * v_s = EL(v, sizeof(GLdouble)*4); glRasterPos4dv(v_s); } void glRasterPos4dv_p(x, y, z, w) GLdouble x GLdouble y GLdouble z GLdouble w CODE: { GLdouble param[4]; param[0] = x; param[1] = y; param[2] = z; param[3] = w; glRasterPos4dv(param); } void glRasterPos4f(x, y, z, w) GLfloat x GLfloat y GLfloat z GLfloat w void glRasterPos4fv_c(v) void * v CODE: glRasterPos4fv(v); void glRasterPos4fv_s(v) SV * v CODE: { GLfloat * v_s = EL(v, sizeof(GLfloat)*4); glRasterPos4fv(v_s); } void glRasterPos4fv_p(x, y, z, w) GLfloat x GLfloat y GLfloat z GLfloat w CODE: { GLfloat param[4]; param[0] = x; param[1] = y; param[2] = z; param[3] = w; glRasterPos4fv(param); } void glRasterPos4i(x, y, z, w) GLint x GLint y GLint z GLint w void glRasterPos4iv_c(v) void * v CODE: glRasterPos4iv(v); void glRasterPos4iv_s(v) SV * v CODE: { GLint * v_s = EL(v, sizeof(GLint)*4); glRasterPos4iv(v_s); } void glRasterPos4iv_p(x, y, z, w) GLint x GLint y GLint z GLint w CODE: { GLint param[4]; param[0] = x; param[1] = y; param[2] = z; param[3] = w; glRasterPos4iv(param); } void glRasterPos4s(x, y, z, w) GLshort x GLshort y GLshort z GLshort w void glRasterPos4sv_c(v) void * v CODE: glRasterPos4sv(v); void glRasterPos4sv_s(v) SV * v CODE: { GLshort * v_s = EL(v, sizeof(GLshort)*4); glRasterPos4sv(v_s); } void glRasterPos4sv_p(x, y, z, w) GLshort x GLshort y GLshort z GLshort w CODE: { GLshort param[4]; param[0] = x; param[1] = y; param[2] = z; param[3] = w; glRasterPos4sv(param); } # End of generated declarations ################## DEPRECATED EXTENSIONS ######################## #ifdef DEPRECATED #ifdef GL_EXT_polygon_offset void glPolygonOffsetEXT(factor, bias) GLfloat factor GLfloat units #endif #ifdef GL_EXT_texture_object GLboolean glIsTextureEXT(list) GLuint list void glPrioritizeTexturesEXT_p(...) CODE: { GLsizei n = items/2; GLuint * textures = malloc(sizeof(GLuint) * (n+1)); GLclampf * prior = malloc(sizeof(GLclampf) * (n+1)); int i; for (i=0;itypes[0], 0, oga->item_count, oga->data); void glNormalPointerEXT_c(type, stride, count, pointer) GLenum type GLsizei stride GLsizei count void * pointer INIT: loadProc(glNormalPointerEXT,"glNormalPointerEXT"); CODE: glNormalPointerEXT(type, stride, count, pointer); void glNormalPointerEXT_p(oga) OpenGL::Array oga INIT: loadProc(glNormalPointerEXT,"glNormalPointerEXT"); CODE: glNormalPointerEXT(oga->types[0], 0, oga->item_count, oga->data); void glColorPointerEXT_c(size, type, stride, count, pointer) GLint size GLenum type GLsizei stride GLsizei count void * pointer INIT: loadProc(glColorPointerEXT,"glColorPointerEXT"); CODE: glColorPointerEXT(size, type, stride, count, pointer); void glColorPointerEXT_p(size, oga) GLint size OpenGL::Array oga INIT: loadProc(glColorPointerEXT,"glColorPointerEXT"); CODE: glColorPointerEXT(size, oga->types[0], 0, oga->item_count, oga->data); void glIndexPointerEXT_c(type, stride, count, pointer) GLenum type GLsizei stride GLsizei count void * pointer INIT: loadProc(glIndexPointerEXT,"glIndexPointerEXT"); CODE: glIndexPointerEXT(type, stride, count, pointer); void glIndexPointerEXT_p(oga) OpenGL::Array oga INIT: loadProc(glIndexPointerEXT,"glIndexPointerEXT"); CODE: glIndexPointerEXT(oga->types[0], 0, oga->item_count, oga->data); void glTexCoordPointerEXT_c(size, type, stride, count, pointer) GLint size GLenum type GLsizei count GLsizei stride void * pointer INIT: loadProc(glTexCoordPointerEXT,"glTexCoordPointerEXT"); CODE: glTexCoordPointerEXT(size, type, stride, count, pointer); void glTexCoordPointerEXT_p(size, oga) GLint size OpenGL::Array oga INIT: loadProc(glTexCoordPointerEXT,"glTexCoordPointerEXT"); CODE: glTexCoordPointerEXT(size, oga->types[0], 0, oga->item_count, oga->data); void glEdgeFlagPointerEXT_c(stride, count, pointer) GLint stride GLsizei count void * pointer INIT: loadProc(glEdgeFlagPointerEXT,"glEdgeFlagPointerEXT"); CODE: glEdgeFlagPointerEXT(stride, count, pointer); void glEdgeFlagPointerEXT_p(oga) OpenGL::Array oga INIT: loadProc(glEdgeFlagPointerEXT,"glEdgeFlagPointerEXT"); CODE: glEdgeFlagPointerEXT(0, oga->item_count, oga->data); #endif #ifdef GL_MESA_window_pos void glWindowPos2iMESA(x, y) GLint x GLint y void glWindowPos2dMESA(x, y) GLdouble x GLdouble y void glWindowPos3iMESA(x, y, z) GLint x GLint y GLint z void glWindowPos3dMESA(x, y, z) GLdouble x GLdouble y GLdouble z void glWindowPos4iMESA(x, y, z, w) GLint x GLint y GLint z GLint w void glWindowPos4dMESA(x, y, z, w) GLdouble x GLdouble y GLdouble z GLdouble w #endif #ifdef GL_MESA_resize_buffers void glResizeBuffersMESA() #endif #ifdef GL_ARB_draw_buffers void glDrawBuffersARB_c(n,buffers) GLsizei n void * buffers INIT: loadProc(glDrawBuffersARB,"glDrawBuffersARB"); CODE: { glDrawBuffersARB(n,buffers); } void glDrawBuffersARB_s(n,buffers) GLsizei n SV * buffers INIT: loadProc(glDrawBuffersARB,"glDrawBuffersARB"); CODE: { void * buffers_s = EL(buffers, sizeof(GLuint)*n); glDrawBuffersARB(n,buffers_s); } void glDrawBuffersARB_p(...) INIT: loadProc(glDrawBuffersARB,"glDrawBuffersARB"); CODE: { if (items) { GLuint * list = malloc(sizeof(GLuint) * items); int i; for (i=0;idata_length,oga->data,usage); } void glBufferSubDataARB_c(target,offset,size,data) GLenum target GLint offset GLsizei size void * data INIT: loadProc(glBufferSubDataARB,"glBufferSubDataARB"); CODE: { glBufferSubDataARB(target,offset,size,data); } void glBufferSubDataARB_s(target,offset,size,data) GLenum target GLint offset GLsizei size SV * data INIT: loadProc(glBufferSubDataARB,"glBufferSubDataARB"); CODE: { void * data_s = EL(data, size); glBufferSubDataARB(target,offset,size,data); } void glBufferSubDataARB_p(target,offset,oga) GLenum target GLint offset OpenGL::Array oga INIT: loadProc(glBufferSubDataARB,"glBufferSubDataARB"); CODE: { glBufferSubDataARB(target,offset*oga->total_types_width,oga->data_length,oga->data); } void glGetBufferSubDataARB_c(target,offset,size,data) GLenum target GLint offset GLsizei size void * data INIT: loadProc(glGetBufferSubDataARB,"glBufferSubDataARB"); CODE: glGetBufferSubDataARB(target,offset,size,data); void glGetBufferSubDataARB_s(target,offset,size,data) GLenum target GLint offset GLsizei size SV * data INIT: loadProc(glGetBufferSubDataARB,"glBufferSubDataARB"); CODE: { GLubyte * data_s = EL(data,size); glGetBufferSubDataARB(target,offset,size,data_s); } OpenGL::Array glGetBufferSubDataARB_p(target,offset,count,...) GLenum target GLint offset GLsizei count INIT: loadProc(glGetBufferSubDataARB,"glGetBufferSubDataARB"); loadProc(glGetBufferParameterivARB,"glGetBufferParameterivARB"); CODE: { oga_struct * oga = malloc(sizeof(oga_struct)); GLsizeiptrARB size; oga->item_count = count; oga->type_count = (items - 3); if (oga->type_count) { int i,j; oga->types = malloc(sizeof(GLenum) * oga->type_count); oga->type_offset = malloc(sizeof(GLint) * oga->type_count); for(i=0,j=0;itype_count;i++) { oga->types[i] = SvIV(ST(i+3)); oga->type_offset[i] = j; j += gl_type_size(oga->types[i]); } oga->total_types_width = j; } else { oga->type_count = 1; oga->types = malloc(sizeof(GLenum) * oga->type_count); oga->type_offset = malloc(sizeof(GLint) * oga->type_count); oga->types[0] = GL_UNSIGNED_BYTE; oga->type_offset[0] = 0; oga->total_types_width = gl_type_size(oga->types[0]); } if (!oga->total_types_width) croak("Unable to determine type sizes\n"); glGetBufferParameterivARB(target,GL_BUFFER_SIZE_ARB,(GLint*)&size); size /= oga->total_types_width; if (offset > size) croak("Offset is greater than elements in buffer: %d\n",size); if ((offset+count) > size) count = size - offset; oga->data_length = oga->total_types_width * count; oga->data = malloc(oga->data_length); glGetBufferSubDataARB(target,offset*oga->total_types_width, oga->data_length,oga->data); oga->free_data = 1; RETVAL = oga; } OUTPUT: RETVAL void * glMapBufferARB_c(target,access) GLenum target GLenum access INIT: loadProc(glMapBufferARB,"glMapBufferARB"); CODE: RETVAL = glMapBufferARB(target,access); OUTPUT: RETVAL #define FIXME /* !!! Need to refactor with glGetBufferPointervARB_p */ OpenGL::Array glMapBufferARB_p(target,access,...) GLenum target GLenum access INIT: loadProc(glMapBufferARB,"glMapBufferARB"); loadProc(glGetBufferParameterivARB,"glGetBufferParameterivARB"); CODE: { GLsizeiptrARB size; oga_struct * oga; int i,j; void * buffer = glMapBufferARB(target,access); if (!buffer) croak("Unable to map buffer\n"); glGetBufferParameterivARB(target,GL_BUFFER_SIZE_ARB,(GLint*)&size); if (!size) croak("Buffer has no size\n"); oga = malloc(sizeof(oga_struct)); oga->type_count = (items - 2); if (oga->type_count) { oga->types = malloc(sizeof(GLenum) * oga->type_count); oga->type_offset = malloc(sizeof(GLint) * oga->type_count); for(i=0,j=0;itype_count;i++) { oga->types[i] = SvIV(ST(i+2)); oga->type_offset[i] = j; j += gl_type_size(oga->types[i]); } oga->total_types_width = j; } else { oga->type_count = 1; oga->types = malloc(sizeof(GLenum) * oga->type_count); oga->type_offset = malloc(sizeof(GLint) * oga->type_count); oga->types[0] = GL_UNSIGNED_BYTE; oga->type_offset[0] = 0; oga->total_types_width = gl_type_size(oga->types[0]); } if (!oga->total_types_width) croak("Unable to determine type sizes\n"); oga->item_count = size / oga->total_types_width; oga->data_length = oga->total_types_width * oga->item_count; oga->data = buffer; oga->free_data = 0; RETVAL = oga; } OUTPUT: RETVAL GLboolean glUnmapBufferARB(target) GLenum target INIT: loadProc(glUnmapBufferARB,"glUnmapBufferARB"); CODE: RETVAL = glUnmapBufferARB(target); OUTPUT: RETVAL void glGetBufferParameterivARB_c(target,pname,params) GLenum target GLenum pname void * params INIT: loadProc(glGetBufferParameterivARB,"glGetBufferParameterivARB"); CODE: glGetBufferParameterivARB(target,pname,params); void glGetBufferParameterivARB_s(target,pname,params) GLenum target GLenum pname SV * params INIT: loadProc(glGetBufferParameterivARB,"glGetBufferParameterivARB"); CODE: { GLint * params_s = EL(params, sizeof(GLint)*1); glGetBufferParameterivARB(target,pname,params_s); } void glGetBufferParameterivARB_p(target,pname) GLenum target GLenum pname INIT: loadProc(glGetBufferParameterivARB,"glGetBufferParameterivARB"); PPCODE: { GLint ret; glGetBufferParameterivARB(target,pname,&ret); PUSHs(sv_2mortal(newSViv(ret))); } void glGetBufferPointervARB_c(target,pname,params) GLenum target GLenum pname void * params INIT: loadProc(glGetBufferPointervARB,"glGetBufferPointervARB"); CODE: glGetBufferPointervARB(target,pname,¶ms); void glGetBufferPointervARB_s(target,pname,params) GLenum target GLenum pname SV * params INIT: loadProc(glGetBufferPointervARB,"glGetBufferPointervARB"); CODE: { void ** params_s = EL(params, sizeof(void*)); glGetBufferPointervARB(target,pname,params_s); } OpenGL::Array glGetBufferPointervARB_p(target,pname,...) GLenum target GLenum pname INIT: loadProc(glGetBufferPointervARB,"glGetBufferPointervARB"); loadProc(glGetBufferParameterivARB,"glGetBufferParameterivARB"); CODE: { GLsizeiptrARB size; oga_struct * oga; void * buffer; int i,j; glGetBufferPointervARB(target,pname,&buffer); if (!buffer) croak("Buffer is not mapped\n"); glGetBufferParameterivARB(target,GL_BUFFER_SIZE_ARB,(GLint*)&size); if (!size) croak("Buffer has no size\n"); oga = malloc(sizeof(oga_struct)); oga->type_count = (items - 2); if (oga->type_count) { oga->types = malloc(sizeof(GLenum) * oga->type_count); oga->type_offset = malloc(sizeof(GLint) * oga->type_count); for(i=0,j=0;itype_count;i++) { oga->types[i] = SvIV(ST(i+2)); oga->type_offset[i] = j; j += gl_type_size(oga->types[i]); } oga->total_types_width = j; } else { oga->type_count = 1; oga->types = malloc(sizeof(GLenum) * oga->type_count); oga->type_offset = malloc(sizeof(GLint) * oga->type_count); oga->types[0] = GL_UNSIGNED_BYTE; oga->type_offset[0] = 0; oga->total_types_width = gl_type_size(oga->types[0]); } if (!oga->total_types_width) croak("Unable to determine type sizes\n"); oga->item_count = size / oga->total_types_width; oga->data_length = oga->total_types_width * oga->item_count; oga->data = buffer; oga->free_data = 0; RETVAL = oga; } OUTPUT: RETVAL #endif #ifdef GL_ARB_multitexture void glActiveTextureARB(texture) GLenum texture INIT: loadProc(glActiveTextureARB,"glActiveTextureARB"); CODE: glActiveTextureARB(texture); void glClientActiveTextureARB(texture) GLenum texture INIT: loadProc(glClientActiveTextureARB,"glClientActiveTextureARB"); CODE: glClientActiveTextureARB(texture); void glMultiTexCoord1dARB(target,s) GLenum target GLdouble s INIT: loadProc(glMultiTexCoord1dARB,"glMultiTexCoord1dARB"); CODE: glMultiTexCoord1dARB(target,s); void glMultiTexCoord1dvARB_c(target,v) GLenum target void *v INIT: loadProc(glMultiTexCoord1dvARB,"glMultiTexCoord1dvARB"); CODE: glMultiTexCoord1dvARB(target,v); void glMultiTexCoord1dvARB_s(target,v) GLenum target void *v INIT: loadProc(glMultiTexCoord1dvARB,"glMultiTexCoord1dvARB"); CODE: { GLdouble * v_s = EL(v, sizeof(GLdouble)); glMultiTexCoord1dvARB(target,v_s); } void glMultiTexCoord1dvARB_p(target,s) GLenum target GLdouble s INIT: loadProc(glMultiTexCoord1dvARB,"glMultiTexCoord1dvARB"); CODE: { glMultiTexCoord1dvARB(target,&s); } void glMultiTexCoord1fARB(target,s) GLenum target GLfloat s INIT: loadProc(glMultiTexCoord1fARB,"glMultiTexCoord1fARB"); CODE: glMultiTexCoord1fARB(target,s); void glMultiTexCoord1fvARB_c(target,v) GLenum target void *v INIT: loadProc(glMultiTexCoord1fvARB,"glMultiTexCoord1fvARB"); CODE: glMultiTexCoord1fvARB(target,v); void glMultiTexCoord1fvARB_s(target,v) GLenum target void *v INIT: loadProc(glMultiTexCoord1fvARB,"glMultiTexCoord1fvARB"); CODE: { GLfloat * v_s = EL(v, sizeof(GLfloat)); glMultiTexCoord1fvARB(target,v_s); } void glMultiTexCoord1fvARB_p(target,s) GLenum target GLfloat s INIT: loadProc(glMultiTexCoord1fvARB,"glMultiTexCoord1fvARB"); CODE: { glMultiTexCoord1fvARB(target,&s); } void glMultiTexCoord1iARB(target,s) GLenum target GLint s INIT: loadProc(glMultiTexCoord1iARB,"glMultiTexCoord1iARB"); CODE: glMultiTexCoord1iARB(target,s); void glMultiTexCoord1ivARB_c(target,v) GLenum target void *v INIT: loadProc(glMultiTexCoord1ivARB,"glMultiTexCoord1ivARB"); CODE: glMultiTexCoord1ivARB(target,v); void glMultiTexCoord1ivARB_s(target,v) GLenum target void *v INIT: loadProc(glMultiTexCoord1ivARB,"glMultiTexCoord1ivARB"); CODE: { GLint * v_s = EL(v, sizeof(GLint)); glMultiTexCoord1ivARB(target,v_s); } void glMultiTexCoord1ivARB_p(target,s) GLenum target GLint s INIT: loadProc(glMultiTexCoord1ivARB,"glMultiTexCoord1ivARB"); CODE: { glMultiTexCoord1ivARB(target,&s); } void glMultiTexCoord1sARB(target,s) GLenum target GLshort s INIT: loadProc(glMultiTexCoord1sARB,"glMultiTexCoord1sARB"); CODE: glMultiTexCoord1sARB(target,s); void glMultiTexCoord1svARB_c(target,v) GLenum target void *v INIT: loadProc(glMultiTexCoord1svARB,"glMultiTexCoord1svARB"); CODE: glMultiTexCoord1svARB(target,v); void glMultiTexCoord1svARB_s(target,v) GLenum target void *v INIT: loadProc(glMultiTexCoord1svARB,"glMultiTexCoord1svARB"); CODE: { GLshort * v_s = EL(v, sizeof(GLshort)); glMultiTexCoord1svARB(target,v_s); } void glMultiTexCoord1svARB_p(target,s) GLenum target GLshort s INIT: loadProc(glMultiTexCoord1svARB,"glMultiTexCoord1svARB"); CODE: { glMultiTexCoord1svARB(target,&s); } void glMultiTexCoord2dARB(target,s,t) GLenum target GLdouble s GLdouble t INIT: loadProc(glMultiTexCoord2dARB,"glMultiTexCoord2dARB"); CODE: glMultiTexCoord2dARB(target,s,t); void glMultiTexCoord2dvARB_c(target,v) GLenum target void *v INIT: loadProc(glMultiTexCoord2dvARB,"glMultiTexCoord2dvARB"); CODE: glMultiTexCoord2dvARB(target,v); void glMultiTexCoord2dvARB_s(target,v) GLenum target void *v INIT: loadProc(glMultiTexCoord2dvARB,"glMultiTexCoord2dvARB"); CODE: { GLdouble * v_s = EL(v, sizeof(GLdouble)); glMultiTexCoord2dvARB(target,v_s); } void glMultiTexCoord2dvARB_p(target,s,t) GLenum target GLdouble s GLdouble t INIT: loadProc(glMultiTexCoord2dvARB,"glMultiTexCoord2dvARB"); CODE: { GLdouble param[2]; param[0] = s; param[1] = t; glMultiTexCoord2dvARB(target,param); } void glMultiTexCoord2fARB(target,s,t) GLenum target GLfloat s GLfloat t INIT: loadProc(glMultiTexCoord2fARB,"glMultiTexCoord2fARB"); CODE: glMultiTexCoord2fARB(target,s,t); void glMultiTexCoord2fvARB_c(target,v) GLenum target void *v INIT: loadProc(glMultiTexCoord2fvARB,"glMultiTexCoord2fvARB"); CODE: glMultiTexCoord2fvARB(target,v); void glMultiTexCoord2fvARB_s(target,v) GLenum target void *v INIT: loadProc(glMultiTexCoord2fvARB,"glMultiTexCoord2fvARB"); CODE: { GLfloat * v_s = EL(v, sizeof(GLfloat)); glMultiTexCoord2fvARB(target,v_s); } void glMultiTexCoord2fvARB_p(target,s,t) GLenum target GLfloat s GLfloat t INIT: loadProc(glMultiTexCoord2fvARB,"glMultiTexCoord2fvARB"); CODE: { GLfloat param[2]; param[0] = s; param[1] = t; glMultiTexCoord2fvARB(target,param); } void glMultiTexCoord2iARB(target,s,t) GLenum target GLint s GLint t INIT: loadProc(glMultiTexCoord2iARB,"glMultiTexCoord2iARB"); CODE: glMultiTexCoord2iARB(target,s,t); void glMultiTexCoord2ivARB_c(target,v) GLenum target void *v INIT: loadProc(glMultiTexCoord2ivARB,"glMultiTexCoord2ivARB"); CODE: glMultiTexCoord2ivARB(target,v); void glMultiTexCoord2ivARB_s(target,v) GLenum target void *v INIT: loadProc(glMultiTexCoord2ivARB,"glMultiTexCoord2ivARB"); CODE: { GLint * v_s = EL(v, sizeof(GLint)); glMultiTexCoord2ivARB(target,v_s); } void glMultiTexCoord2ivARB_p(target,s,t) GLenum target GLint s GLint t INIT: loadProc(glMultiTexCoord2ivARB,"glMultiTexCoord2ivARB"); CODE: { GLint param[2]; param[0] = s; param[1] = t; glMultiTexCoord2ivARB(target,param); } void glMultiTexCoord2sARB(target,s,t) GLenum target GLshort s GLshort t INIT: loadProc(glMultiTexCoord2sARB,"glMultiTexCoord2sARB"); CODE: glMultiTexCoord2sARB(target,s,t); void glMultiTexCoord2svARB_c(target,v) GLenum target void *v INIT: loadProc(glMultiTexCoord2svARB,"glMultiTexCoord2svARB"); CODE: glMultiTexCoord2svARB(target,v); void glMultiTexCoord2svARB_s(target,v) GLenum target void *v INIT: loadProc(glMultiTexCoord2svARB,"glMultiTexCoord2svARB"); CODE: { GLshort * v_s = EL(v, sizeof(GLshort)); glMultiTexCoord2svARB(target,v_s); } void glMultiTexCoord2svARB_p(target,s,t) GLenum target GLshort s GLshort t INIT: loadProc(glMultiTexCoord2svARB,"glMultiTexCoord2svARB"); CODE: { GLshort param[2]; param[0] = s; param[1] = t; glMultiTexCoord2svARB(target,param); } void glMultiTexCoord3dARB(target,s,t,r) GLenum target GLdouble s GLdouble t GLdouble r INIT: loadProc(glMultiTexCoord3dARB,"glMultiTexCoord3dARB"); CODE: glMultiTexCoord3dARB(target,s,t,r); void glMultiTexCoord3dvARB_c(target,v) GLenum target void *v INIT: loadProc(glMultiTexCoord3dvARB,"glMultiTexCoord3dvARB"); CODE: glMultiTexCoord3dvARB(target,v); void glMultiTexCoord3dvARB_s(target,v) GLenum target void *v INIT: loadProc(glMultiTexCoord3dvARB,"glMultiTexCoord3dvARB"); CODE: { GLdouble * v_s = EL(v, sizeof(GLdouble)); glMultiTexCoord3dvARB(target,v_s); } void glMultiTexCoord3dvARB_p(target,s,t,r) GLenum target GLdouble s GLdouble t GLdouble r INIT: loadProc(glMultiTexCoord3dvARB,"glMultiTexCoord3dvARB"); CODE: { GLdouble param[3]; param[0] = s; param[1] = t; param[2] = r; glMultiTexCoord3dvARB(target,param); } void glMultiTexCoord3fARB(target,s,t,r) GLenum target GLfloat s GLfloat t GLfloat r INIT: loadProc(glMultiTexCoord3fARB,"glMultiTexCoord3fARB"); CODE: glMultiTexCoord3fARB(target,s,t,r); void glMultiTexCoord3fvARB_c(target,v) GLenum target void *v INIT: loadProc(glMultiTexCoord3fvARB,"glMultiTexCoord3fvARB"); CODE: glMultiTexCoord3fvARB(target,v); void glMultiTexCoord3fvARB_s(target,v) GLenum target void *v INIT: loadProc(glMultiTexCoord3fvARB,"glMultiTexCoord3fvARB"); CODE: { GLfloat * v_s = EL(v, sizeof(GLfloat)); glMultiTexCoord3fvARB(target,v_s); } void glMultiTexCoord3fvARB_p(target,s,t,r) GLenum target GLfloat s GLfloat t GLfloat r INIT: loadProc(glMultiTexCoord3fvARB,"glMultiTexCoord3fvARB"); CODE: { GLfloat param[3]; param[0] = s; param[1] = t; param[2] = r; glMultiTexCoord3fvARB(target,param); } void glMultiTexCoord3iARB(target,s,t,r) GLenum target GLint s GLint t GLint r INIT: loadProc(glMultiTexCoord3iARB,"glMultiTexCoord3iARB"); CODE: glMultiTexCoord3iARB(target,s,t,r); void glMultiTexCoord3ivARB_c(target,v) GLenum target void *v INIT: loadProc(glMultiTexCoord3ivARB,"glMultiTexCoord3ivARB"); CODE: glMultiTexCoord3ivARB(target,v); void glMultiTexCoord3ivARB_s(target,v) GLenum target void *v INIT: loadProc(glMultiTexCoord3ivARB,"glMultiTexCoord3ivARB"); CODE: { GLint * v_s = EL(v, sizeof(GLint)); glMultiTexCoord3ivARB(target,v_s); } void glMultiTexCoord3ivARB_p(target,s,t,r) GLenum target GLint s GLint t GLint r INIT: loadProc(glMultiTexCoord3ivARB,"glMultiTexCoord3ivARB"); CODE: { GLint param[3]; param[0] = s; param[1] = t; param[2] = r; glMultiTexCoord3ivARB(target,param); } void glMultiTexCoord3sARB(target,s,t,r) GLenum target GLshort s GLshort t GLshort r INIT: loadProc(glMultiTexCoord3sARB,"glMultiTexCoord3sARB"); CODE: glMultiTexCoord3sARB(target,s,t,r); void glMultiTexCoord3svARB_c(target,v) GLenum target void *v INIT: loadProc(glMultiTexCoord3svARB,"glMultiTexCoord3svARB"); CODE: glMultiTexCoord3svARB(target,v); void glMultiTexCoord3svARB_s(target,v) GLenum target void *v INIT: loadProc(glMultiTexCoord3svARB,"glMultiTexCoord3svARB"); CODE: { GLshort * v_s = EL(v, sizeof(GLshort)); glMultiTexCoord3svARB(target,v_s); } void glMultiTexCoord3svARB_p(target,s,t,r) GLenum target GLshort s GLshort t GLshort r INIT: loadProc(glMultiTexCoord3svARB,"glMultiTexCoord3svARB"); CODE: { GLshort param[3]; param[0] = s; param[1] = t; param[2] = r; glMultiTexCoord3svARB(target,param); } void glMultiTexCoord4dARB(target,s,t,r,q) GLenum target GLdouble s GLdouble t GLdouble r GLdouble q INIT: loadProc(glMultiTexCoord4dARB,"glMultiTexCoord4dARB"); CODE: glMultiTexCoord4dARB(target,s,t,r,q); void glMultiTexCoord4dvARB_c(target,v) GLenum target void *v INIT: loadProc(glMultiTexCoord4dvARB,"glMultiTexCoord4dvARB"); CODE: glMultiTexCoord4dvARB(target,v); void glMultiTexCoord4dvARB_s(target,v) GLenum target void *v INIT: loadProc(glMultiTexCoord4dvARB,"glMultiTexCoord4dvARB"); CODE: { GLdouble * v_s = EL(v, sizeof(GLdouble)); glMultiTexCoord4dvARB(target,v_s); } void glMultiTexCoord4dvARB_p(target,s,t,r,q) GLenum target GLdouble s GLdouble t GLdouble r GLdouble q INIT: loadProc(glMultiTexCoord4dvARB,"glMultiTexCoord4dvARB"); CODE: { GLdouble param[4]; param[0] = s; param[1] = t; param[2] = r; param[3] = q; glMultiTexCoord4dvARB(target,param); } void glMultiTexCoord4fARB(target,s,t,r,q) GLenum target GLfloat s GLfloat t GLfloat r GLfloat q INIT: loadProc(glMultiTexCoord4fARB,"glMultiTexCoord4fARB"); CODE: glMultiTexCoord4fARB(target,s,t,r,q); void glMultiTexCoord4fvARB_c(target,v) GLenum target void *v INIT: loadProc(glMultiTexCoord4fvARB,"glMultiTexCoord4fvARB"); CODE: glMultiTexCoord4fvARB(target,v); void glMultiTexCoord4fvARB_s(target,v) GLenum target void *v INIT: loadProc(glMultiTexCoord4fvARB,"glMultiTexCoord4fvARB"); CODE: { GLfloat * v_s = EL(v, sizeof(GLfloat)); glMultiTexCoord4fvARB(target,v_s); } void glMultiTexCoord4fvARB_p(target,s,t,r,q) GLenum target GLfloat s GLfloat t GLfloat r GLfloat q INIT: loadProc(glMultiTexCoord4fvARB,"glMultiTexCoord4fvARB"); CODE: { GLfloat param[4]; param[0] = s; param[1] = t; param[2] = r; param[3] = q; glMultiTexCoord4fvARB(target,param); } void glMultiTexCoord4iARB(target,s,t,r,q) GLenum target GLint s GLint t GLint r GLint q INIT: loadProc(glMultiTexCoord4iARB,"glMultiTexCoord4iARB"); CODE: glMultiTexCoord4iARB(target,s,t,r,q); void glMultiTexCoord4ivARB_c(target,v) GLenum target void *v INIT: loadProc(glMultiTexCoord4ivARB,"glMultiTexCoord4ivARB"); CODE: glMultiTexCoord4ivARB(target,v); void glMultiTexCoord4ivARB_s(target,v) GLenum target void *v INIT: loadProc(glMultiTexCoord4ivARB,"glMultiTexCoord4ivARB"); CODE: { GLint * v_s = EL(v, sizeof(GLint)); glMultiTexCoord4ivARB(target,v_s); } void glMultiTexCoord4ivARB_p(target,s,t,r,q) GLenum target GLint s GLint t GLint r GLint q INIT: loadProc(glMultiTexCoord4ivARB,"glMultiTexCoord4ivARB"); CODE: { GLint param[4]; param[0] = s; param[1] = t; param[2] = r; param[3] = q; glMultiTexCoord4ivARB(target,param); } void glMultiTexCoord4sARB(target,s,t,r,q) GLenum target GLshort s GLshort t GLshort r GLshort q INIT: loadProc(glMultiTexCoord4sARB,"glMultiTexCoord4sARB"); CODE: glMultiTexCoord4sARB(target,s,t,r,q); void glMultiTexCoord4svARB_c(target,v) GLenum target void *v INIT: loadProc(glMultiTexCoord4svARB,"glMultiTexCoord4svARB"); CODE: glMultiTexCoord4svARB(target,v); void glMultiTexCoord4svARB_s(target,v) GLenum target void *v INIT: loadProc(glMultiTexCoord4svARB,"glMultiTexCoord4svARB"); CODE: { GLshort * v_s = EL(v, sizeof(GLshort)); glMultiTexCoord4svARB(target,v_s); } void glMultiTexCoord4svARB_p(target,s,t,r,q) GLenum target GLshort s GLshort t GLshort r GLshort q INIT: loadProc(glMultiTexCoord4svARB,"glMultiTexCoord4svARB"); CODE: { GLshort param[4]; param[0] = s; param[1] = t; param[2] = r; param[3] = q; glMultiTexCoord4svARB(target,param); } #endif #endif /* HAVE_GL */ ##################### GLU ######################### #ifdef HAVE_GLU void gluBeginCurve(nurb) GLUnurbsObj * nurb void gluEndCurve(nurb) GLUnurbsObj * nurb void gluBeginPolygon(tess) PGLUtess * tess CODE: gluBeginPolygon(tess->triangulator); void gluEndPolygon(tess) PGLUtess * tess CODE: gluEndPolygon(tess->triangulator); void gluBeginSurface(nurb) GLUnurbsObj * nurb void gluEndSurface(nurb) GLUnurbsObj * nurb void gluBeginTrim(nurb) GLUnurbsObj * nurb void gluEndTrim(nurb) GLUnurbsObj * nurb GLint gluBuild1DMipmaps_s(target, internalformat, width, format, type, data) GLenum target GLuint internalformat GLsizei width GLenum format GLenum type SV * data CODE: { GLvoid * ptr = ELI(data, width, 1, format, type, gl_pixelbuffer_unpack); RETVAL=gluBuild1DMipmaps(target, internalformat, width, format, type, ptr); } OUTPUT: RETVAL GLint gluBuild2DMipmaps_s(target, internalformat, width, height, format, type, data) GLenum target GLuint internalformat GLsizei width GLsizei height GLenum format GLenum type SV * data CODE: { GLvoid * ptr = ELI(data, width, height, format, type, gl_pixelbuffer_unpack); RETVAL=gluBuild2DMipmaps(target, internalformat, width, height, format, type, ptr); } OUTPUT: RETVAL void gluCylinder(quad, base, top, height, slices, stacks) GLUquadricObj * quad GLdouble base GLdouble top GLdouble height GLint slices GLint stacks void gluDeleteNurbsRenderer(nurb) GLUnurbsObj * nurb void gluDeleteQuadric(quad) GLUquadricObj * quad void gluDeleteTess(tess) PGLUtess * tess CODE: { if (tess->triangulator) gluDeleteTess(tess->triangulator); #ifdef GLU_VERSION_1_2 if (tess->polygon_data_av) SvREFCNT_dec(tess->polygon_data_av); if (tess->begin_callback) SvREFCNT_dec(tess->begin_callback); if (tess->edgeFlag_callback) SvREFCNT_dec(tess->edgeFlag_callback); if (tess->vertex_callback) SvREFCNT_dec(tess->vertex_callback); if (tess->end_callback) SvREFCNT_dec(tess->end_callback); if (tess->error_callback) SvREFCNT_dec(tess->error_callback); if (tess->combine_callback) SvREFCNT_dec(tess->combine_callback); if (tess->vertex_datas) SvREFCNT_dec(tess->vertex_datas); #endif free(tess); } void gluDisk(quad, inner, outer, slices, loops) GLUquadricObj * quad GLdouble inner GLdouble outer GLint slices GLint loops char * gluErrorString(error) GLenum error CODE: RETVAL = (char*)gluErrorString(error); OUTPUT: RETVAL GLfloat gluGetNurbsProperty_p(nurb, property) GLUnurbsObj * nurb GLenum property CODE: { GLfloat param; gluGetNurbsProperty(nurb, property, ¶m); RETVAL = param; } OUTPUT: RETVAL void gluNurbsProperty(nurb, property, value) GLUnurbsObj * nurb GLenum property GLfloat value #ifdef GLU_VERSION_1_1 char * gluGetString(name) GLenum name CODE: RETVAL = (char*)gluGetString(name); OUTPUT: RETVAL #endif void gluLoadSamplingMatrices_p(nurb, m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11,m12,m13,m14,m15,m16, o1,o2,o3,o4,o5,o6,o7,o8,o9,o10,o11,o12,o13,o14,o15,o16, v1,v2,v3,v4) GLUnurbsObj * nurb CODE: { GLfloat m[16], p[16]; GLint v[4]; int i; for (i=0;i<16;i++) m[i] = SvIV(ST(i+1)); for (i=0;i<16;i++) p[i] = SvIV(ST(i+1+16)); for (i=0;i<4;i++) v[i] = SvIV(ST(i+1+16+16)); gluLoadSamplingMatrices(nurb, m, p, v); } void gluLookAt(eyeX, eyeY, eyeZ, centerX, centerY, centerZ, upX, upY, upZ) GLdouble eyeX GLdouble eyeY GLdouble eyeZ GLdouble centerX GLdouble centerY GLdouble centerZ GLdouble upX GLdouble upY GLdouble upZ GLUnurbsObj * gluNewNurbsRenderer() GLUquadricObj * gluNewQuadric() PGLUtess * gluNewTess() CODE: { RETVAL = calloc(sizeof(PGLUtess), 1); RETVAL->triangulator = gluNewTess(); } OUTPUT: RETVAL void gluNextContour(tess, type) PGLUtess * tess GLenum type CODE: gluNextContour(tess->triangulator, type); void gluNurbsCurve_c(nurb, nknots, knot, stride, ctlarray, order, type) GLUnurbsObj * nurb GLint nknots void * knot GLint stride void * ctlarray GLint order GLenum type CODE: gluNurbsCurve(nurb, nknots, knot, stride, ctlarray, order, type); void gluNurbsSurface_c(nurb, sknot_count, sknot, tknot_count, tknot, s_stride, t_stride, ctrlarray, sorder, torder, type) GLUnurbsObj * nurb GLint sknot_count void * sknot GLint tknot_count void * tknot GLint s_stride GLint t_stride void * ctrlarray GLint sorder GLint torder GLenum type CODE: gluNurbsSurface(nurb, sknot_count, sknot, tknot_count, tknot, s_stride, t_stride, ctrlarray, sorder, torder, type); void gluOrtho2D(left, right, bottom, top) GLdouble left GLdouble right GLdouble bottom GLdouble top void gluPartialDisk(quad, inner, outer, slices, loops, start, sweep) GLUquadricObj* quad GLdouble inner GLdouble outer GLint slices GLint loops GLdouble start GLdouble sweep void gluPerspective(fovy, aspect, zNear, zFar) GLdouble fovy GLdouble aspect GLdouble zNear GLdouble zFar void gluPickMatrix_p(x, y, delX, delY, m1,m2,m3,m4) GLdouble x GLdouble y GLdouble delX GLdouble delY CODE: { GLint m[4]; int i; for (i=0;i<4;i++) m[i] = SvIV(ST(i+4)); gluPickMatrix(x, y, delX, delY, &m[0]); } void gluProject_p(objx, objy, objz, m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11,m12,m13,m14,m15,m16, o1,o2,o3,o4,o5,o6,o7,o8,o9,o10,o11,o12,o13,o14,o15,o16, v1,v2,v3,v4) GLdouble objx GLdouble objy GLdouble objz PPCODE: { GLdouble m[16], p[16], winx, winy, winz; GLint v[4]; int i; for (i=0;i<16;i++) m[i] = SvIV(ST(i+3)); for (i=0;i<16;i++) p[i] = SvIV(ST(i+3+16)); for (i=0;i<4;i++) v[i] = SvIV(ST(i+3+16+16)); i = gluProject(objx, objy, objz, m, p, v, &winx, &winy, &winz); if (i) { EXTEND(sp, 3); PUSHs(sv_2mortal(newSVnv(winx))); PUSHs(sv_2mortal(newSVnv(winy))); PUSHs(sv_2mortal(newSVnv(winz))); } } void gluPwlCurve_c(nurb, count, data, stride, type) GLUnurbsObj * nurb GLint count void * data GLint stride GLenum type CODE: gluPwlCurve(nurb, count, data, stride, type); void gluQuadricDrawStyle(quad, draw) GLUquadricObj * quad GLenum draw void gluQuadricNormals(quad, normal) GLUquadricObj * quad GLenum normal void gluQuadricOrientation(quad, orientation) GLUquadricObj * quad GLenum orientation void gluQuadricTexture(quad, texture) GLUquadricObj * quad GLboolean texture GLint gluScaleImage_s(format, wIn, hIn, typeIn, dataIn, wOut, hOut, typeOut, dataOut) GLenum format GLsizei wIn GLsizei hIn GLenum typeIn SV * dataIn GLsizei wOut GLsizei hOut GLenum typeOut SV * dataOut CODE: { GLvoid * inptr, * outptr; STRLEN discard; ELI(dataIn, wIn, hIn, format, typeIn, gl_pixelbuffer_unpack); ELI(dataOut, wOut, hOut, format, typeOut, gl_pixelbuffer_pack); inptr = SvPV(dataIn, discard); outptr = SvPV(dataOut, discard); RETVAL = gluScaleImage(format, wIn, hIn, typeIn, inptr, wOut, hOut, typeOut, outptr); } OUTPUT: RETVAL void gluSphere(quad, radius, slices, stacks) GLUquadricObj * quad GLdouble radius GLint slices GLint stacks #ifdef GLU_VERSION_1_2 GLdouble gluGetTessProperty_p(tess, property) PGLUtess * tess GLenum property CODE: { GLdouble param; gluGetTessProperty(tess->triangulator, property, ¶m); RETVAL = param; } OUTPUT: RETVAL #void #gluNurbsCallback_p(nurb, which, handler, ...) #void #gluNurbsCallbackDataEXT #void #gluQuadricCallback void gluTessBeginCountour(tess) PGLUtess * tess CODE: gluTessBeginContour(tess->triangulator); void gluTessEndContour(tess) PGLUtess * tess CODE: gluTessEndContour(tess->triangulator); void gluTessBeginPolygon(tess, ...) PGLUtess * tess CODE: { if (tess->polygon_data_av) { SvREFCNT_dec(tess->polygon_data_av); tess->polygon_data_av = 0; } if (items > 1) { tess->polygon_data_av = newAV(); PackCallbackST(tess->polygon_data_av, 1); } gluTessBeginPolygon(tess->triangulator, tess); } void gluTessEndPolygon(tess) PGLUtess * tess CODE: { if (tess->polygon_data_av) { SvREFCNT_dec(tess->polygon_data_av); tess->polygon_data_av = 0; } } void gluTessNormal(tess, valueX, valueY, valueZ) PGLUtess * tess GLdouble valueX GLdouble valueY GLdouble valueZ CODE: gluTessNormal(tess->triangulator, valueX, valueY, valueZ); void gluTessProperty(tess, which, data) PGLUtess * tess GLenum which GLdouble data CODE: gluTessProperty(tess->triangulator, which, data); void gluTessCallback(tess, which, ...) PGLUtess * tess GLenum which CODE: { switch (which) { case GLU_TESS_BEGIN: case GLU_TESS_BEGIN_DATA: if (tess->begin_callback) { SvREFCNT_dec(tess->begin_callback); tess->begin_callback = 0; } break; case GLU_TESS_END: case GLU_TESS_END_DATA: if (tess->end_callback) { SvREFCNT_dec(tess->end_callback); tess->end_callback = 0; } break; } if ((items > 3) && !SvOK(ST(2))) { AV * callback = newAV(); PackCallbackST(callback, 2); switch (which) { case GLU_TESS_BEGIN: case GLU_TESS_BEGIN_DATA: tess->begin_callback = callback; gluTessCallback(tess->triangulator, which, (void (CALLBACK*)()) _s_marshal_glu_t_callback_begin); break; case GLU_TESS_END: case GLU_TESS_END_DATA: tess->end_callback = callback; gluTessCallback(tess->triangulator, which, (void (CALLBACK*)()) _s_marshal_glu_t_callback_end); break; } } } #endif void gluTessVertex(tess, x, y, z, ...) PGLUtess * tess GLdouble x GLdouble y GLdouble z CODE: { AV * data = 0; GLdouble v[3]; v[0] = x; v[1] = y; v[2] = z; if (items > 4) { data = newAV(); PackCallbackST(data, 4); if (!tess->vertex_datas) tess->vertex_datas = newAV(); av_push(tess->vertex_datas, newRV_inc((SV*)data)); SvREFCNT_dec(data); } gluTessVertex(tess->triangulator, &v[0], (void*)data); } void gluUnProject_p(winx, winy, winz, m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11,m12,m13,m14,m15,m16, o1,o2,o3,o4,o5,o6,o7,o8,o9,o10,o11,o12,o13,o14,o15,o16, v1,v2,v3,v4) GLdouble winx GLdouble winy GLdouble winz PPCODE: { GLdouble m[16], p[16], objx, objy, objz; GLint v[4]; int i; for (i=0;i<16;i++) m[i] = SvIV(ST(i+3)); for (i=0;i<16;i++) p[i] = SvIV(ST(i+3+16)); for (i=0;i<4;i++) v[i] = SvIV(ST(i+3+16+16)); i = gluUnProject(winx, winy, winz, m, p, v, &objx, &objy, &objz); if (i) { EXTEND(sp, 3); PUSHs(sv_2mortal(newSVnv(objx))); PUSHs(sv_2mortal(newSVnv(objy))); PUSHs(sv_2mortal(newSVnv(objz))); } } #endif ############################## GLUT ######################### #ifdef GLUT_API_VERSION # GLUT void glutInit() CODE: { int argc; char ** argv; AV * ARGV; SV * ARGV0; int i; argv = 0; ARGV = perl_get_av("ARGV", FALSE); ARGV0 = perl_get_sv("0", FALSE); argc = av_len(ARGV)+2; if (argc) { argv = malloc(sizeof(char*)*argc); argv[0] = SvPV(ARGV0, PL_na); for(i=0;i<=av_len(ARGV);i++) argv[i+1] = SvPV(*av_fetch(ARGV, i, 0), PL_na); } i = argc; glutInit(&argc, argv); while(argc= 3 void glutFullScreen() #endif void glutPopWindow() void glutPushWindow() void glutShowWindow() void glutHideWindow() void glutIconifyWindow() void glutSetWindowTitle(title) char * title void glutSetIconTitle(title) char * title #if GLUT_API_VERSION >= 3 void glutSetCursor(cursor) int cursor #endif # Overlays #if GLUT_API_VERSION >= 3 void glutEstablishOverlay() void glutUseLayer(layer) GLenum layer void glutRemoveOverlay() void glutPostOverlayRedisplay() void glutShowOverlay() void glutHideOverlay() #endif # Menus int glutCreateMenu(handler=0, ...) SV * handler CODE: { if (!handler || !SvOK(handler)) { croak("A handler must be specified"); } else { AV * handler_data = newAV(); PackCallbackST(handler_data, 0); RETVAL = glutCreateMenu(generic_glut_menu_handler); if (!glut_menu_handlers) glut_menu_handlers = newAV(); av_store(glut_menu_handlers, RETVAL, newRV_inc((SV*)handler_data)); SvREFCNT_dec(handler_data); } } OUTPUT: RETVAL void glutSetMenu(menu) int menu int glutGetMenu() void glutDestroyMenu(menu) int menu CODE: { glutDestroyMenu(menu); av_store(glut_menu_handlers, menu, newSVsv(&PL_sv_undef)); } void glutAddMenuEntry(name, value) char * name int value void glutAddSubMenu(name, menu) char * name int menu void glutChangeToMenuEntry(entry, name, value) int entry char * name int value void glutChangeToSubMenu(entry, name, menu) int entry char * name int menu void glutRemoveMenuItem(entry) int entry void glutAttachMenu(button) int button void glutDetachMenu(button) int button # Callbacks void glutDisplayFunc(handler=0, ...) SV * handler CODE: decl_gwh_xs_nullfail(Display, ("Display function must be specified")) #if GLUT_API_VERSION >= 3 void glutOverlayDisplayFunc(handler=0, ...) SV * handler CODE: decl_gwh_xs(OverlayDisplay) #endif void glutReshapeFunc(handler=0, ...) SV * handler CODE: decl_gwh_xs(Reshape) void glutKeyboardFunc(handler=0, ...) SV * handler CODE: decl_gwh_xs(Keyboard) void glutMouseFunc(handler=0, ...) SV * handler CODE: decl_gwh_xs(Mouse) void glutMotionFunc(handler=0, ...) SV * handler CODE: decl_gwh_xs(Motion) void glutPassiveMotionFunc(handler=0, ...) SV * handler CODE: decl_gwh_xs(PassiveMotion) void glutVisibilityFunc(handler=0, ...) SV * handler CODE: decl_gwh_xs(Visibility) # OS/2 PM implementation calls itself v2, but does not support these functions # It is very hard to test for this, so we check for some other omission... #if !defined(GL_SRC_ALPHA_SATURATE) || defined(GL_CONSTANT_COLOR) void glutEntryFunc(handler=0, ...) SV * handler CODE: decl_gwh_xs(Entry) #endif #if GLUT_API_VERSION >= 2 void glutSpecialFunc(handler=0, ...) SV * handler CODE: decl_gwh_xs(Special) # OS/2 PM implementation calls itself v2, but does not support these functions # It is very hard to test for this, so we check for some other omission... # if !defined(GL_SRC_ALPHA_SATURATE) || defined(GL_CONSTANT_COLOR) void glutSpaceballMotionFunc(handler=0, ...) SV * handler CODE: decl_gwh_xs(SpaceballMotion) void glutSpaceballRotateFunc(handler=0, ...) SV * handler CODE: decl_gwh_xs(SpaceballRotate) void glutSpaceballButtonFunc(handler=0, ...) SV * handler CODE: decl_gwh_xs(SpaceballButton) void glutButtonBoxFunc(handler=0, ...) SV * handler CODE: decl_gwh_xs(ButtonBox) void glutDialsFunc(handler=0, ...) SV * handler CODE: decl_gwh_xs(Dials) void glutTabletMotionFunc(handler=0, ...) SV * handler CODE: decl_gwh_xs(TabletMotion) void glutTabletButtonFunc(handler=0, ...) SV * handler CODE: decl_gwh_xs(TabletButton) # endif #endif #if GLUT_API_VERSION >= 3 void glutMenuStatusFunc(handler=0, ...) SV * handler CODE: decl_ggh_xs(MenuStatus) #endif void glutMenuStateFunc(handler=0, ...) SV * handler CODE: decl_ggh_xs(MenuState) void glutIdleFunc(handler=0, ...) SV * handler CODE: decl_ggh_xs(Idle) void glutTimerFunc(msecs, handler=0, ...) unsigned int msecs SV * handler CODE: { if (!handler || !SvOK(handler)) { croak("A handler must be specified"); } else { AV * handler_data = newAV(); PackCallbackST(handler_data, 1); glutTimerFunc(msecs, generic_glut_timer_handler, (int)handler_data); } ENSURE_callback_thread;} # Colors void glutSetColor(cell, red, green, blue) int cell GLdouble red GLdouble green GLdouble blue GLfloat glutGetColor(cell, component) int cell int component void glutCopyColormap(win) int win # State int glutGet(state) GLenum state #if GLUT_API_VERSION >= 3 int glutLayerGet(info) GLenum info #endif int glutDeviceGet(info) GLenum info #if GLUT_API_VERSION >= 3 int glutGetModifiers() #endif #if GLUT_API_VERSION >= 2 int glutExtensionSupported(extension) char * extension #endif # Font void glutBitmapCharacter(font, character) void * font int character void glutStrokeCharacter(font, character) void * font int character # OS/2 PM implementation calls itself v2, but does not support these functions # It is very hard to test for this, so we check for some other omission... #if GLUT_API_VERSION >= 2 && (!defined(GL_SRC_ALPHA_SATURATE) || defined(GL_CONSTANT_COLOR)) int glutBitmapWidth(font, character) void * font int character int glutStrokeWidth(font, character) void * font int character #endif # Solids void glutSolidSphere(radius, slices, stacks) GLdouble radius GLint slices GLint stacks void glutWireSphere(radius, slices, stacks) GLdouble radius GLint slices GLint stacks void glutSolidCube(size) GLdouble size void glutWireCube(size) GLdouble size void glutSolidCone(base, height, slices, stacks) GLdouble base GLdouble height GLint slices GLint stacks void glutWireCone(base, height, slices, stacks) GLdouble base GLdouble height GLint slices GLint stacks void glutSolidTorus(innerRadius, outerRadius, nsides, rings) GLdouble innerRadius GLdouble outerRadius GLint nsides GLint rings void glutWireTorus(innerRadius, outerRadius, nsides, rings) GLdouble innerRadius GLdouble outerRadius GLint nsides GLint rings void glutSolidDodecahedron() void glutWireDodecahedron() void glutSolidOctahedron() void glutWireOctahedron() void glutSolidTetrahedron() void glutWireTetrahedron() void glutSolidIcosahedron() void glutWireIcosahedron() void glutSolidTeapot(size) GLdouble size void glutWireTeapot(size) GLdouble size #endif /* def GLUT_API_VERSION */ # /* The following material is directly copied from Stan Melax's original OpenGL-0.4 */ #ifdef __PM__ void morphPM() #endif int __had_dbuffer_hack() #ifdef HAVE_GLpc /* GLX or __PM__ */ GLXDrawable glpcOpenWindow(x,y,w,h,pw,steal,event_mask, ...) int x int y int w int h int pw int steal long event_mask CODE: { XEvent event; Window pwin=(Window)pw; int *attributes = default_attributes + 1; int *a_buf = NULL; if(items>NUM_ARG){ int i; a_buf = (int *)malloc((items-NUM_ARG+2)* sizeof(int)); a_buf[0] = GLX_DOUBLEBUFFER; /* Preallocate */ attributes = a_buf + 1; for(i=NUM_ARG;iscreen), vi->visual, AllocNone); /* create a window */ swa.colormap = cmap; swa.border_pixel = 0; swa.event_mask = event_mask; #endif /* defined HAVE_GLX */ if(!pwin){pwin=RootWindow(dpy, vi->screen);} if (steal) win = nativeWindowId(dpy, pwin); /* What about depth/visual */ else win = XCreateWindow(dpy, pwin, x, y, w, h, 0, vi->depth, InputOutput, vi->visual, CWBorderPixel|CWColormap|CWEventMask, &swa); if(!win) croak("No Window"); XMapWindow(dpy, win); #ifndef HAVE_GLX /* On OS/2: cannot create a context before mapping something... */ /* create a GLX context */ cx = glXCreateContext(dpy, vi, 0, GL_TRUE); if(!cx) croak("No context!\n"); LastEventMask = event_mask; #else /* HAVE_GLX */ if((event_mask & StructureNotifyMask) && !steal) { XIfEvent(dpy, &event, WaitForNotify, (char*)win); } #endif /* HAVE_GLX */ /* connect the context to the window */ if (!glXMakeCurrent(dpy, win, cx)) croak("Non current"); /* clear the buffer */ glClearColor(0,0,0,1); RETVAL = win; } void * glpDisplay() CODE: /* get a connection */ if (!dpy_open) { dpy = XOpenDisplay(0); dpy_open = 1; } if (!dpy) croak("No display!"); RETVAL = dpy; void glpMoveResizeWindow(x, y, width, height, w=win, d=dpy) void* d GLXDrawable w int x int y unsigned int width unsigned int height void glpMoveWindow(x, y, w=win, d=dpy) void* d GLXDrawable w int x int y void glpResizeWindow(width, height, w=win, d=dpy) void* d GLXDrawable w unsigned int width unsigned int height # If glpOpenWindow was used then glXSwapBuffers should be called # without parameters (i.e. use the default parameters) void glXSwapBuffers(w=win,d=dpy) void * d GLXDrawable w CODE: { glXSwapBuffers(d,w); } int XPending(d=dpy) void * d CODE: { RETVAL = XPending(d); } OUTPUT: RETVAL void glpXNextEvent(d=dpy) void * d PPCODE: { XEvent event; char buf[10]; KeySym ks; XNextEvent(d,&event); switch(event.type) { case ConfigureNotify: EXTEND(sp,3); PUSHs(sv_2mortal(newSViv(event.type))); PUSHs(sv_2mortal(newSViv(event.xconfigure.width))); PUSHs(sv_2mortal(newSViv(event.xconfigure.height))); break; case KeyPress: case KeyRelease: EXTEND(sp,2); PUSHs(sv_2mortal(newSViv(event.type))); XLookupString(&event.xkey,buf,sizeof(buf),&ks,0); buf[0]=(char)ks;buf[1]='\0'; PUSHs(sv_2mortal(newSVpv(buf,1))); break; case ButtonPress: case ButtonRelease: EXTEND(sp,4); PUSHs(sv_2mortal(newSViv(event.type))); PUSHs(sv_2mortal(newSViv(event.xbutton.button))); PUSHs(sv_2mortal(newSViv(event.xbutton.x))); PUSHs(sv_2mortal(newSViv(event.xbutton.y))); break; case MotionNotify: EXTEND(sp,4); PUSHs(sv_2mortal(newSViv(event.type))); PUSHs(sv_2mortal(newSViv(event.xmotion.state))); PUSHs(sv_2mortal(newSViv(event.xmotion.x))); PUSHs(sv_2mortal(newSViv(event.xmotion.y))); break; case Expose: default: EXTEND(sp,1); PUSHs(sv_2mortal(newSViv(event.type))); break; } } void glpXQueryPointer(w=win,d=dpy) void * d GLXDrawable w PPCODE: { int x,y,rx,ry; Window r,c; unsigned int m; XQueryPointer(d,w,&r,&c,&rx,&ry,&x,&y,&m); EXTEND(sp,3); PUSHs(sv_2mortal(newSViv(x))); PUSHs(sv_2mortal(newSViv(y))); PUSHs(sv_2mortal(newSViv(m))); } #endif void glpReadTex(file) char * file CODE: { GLsizei w,h; int d,i; char buf[250]; unsigned char *image; FILE *fp; fp=fopen(file,"r"); if(!fp) croak("couldn't open file %s",file); fgets(buf,250,fp); /* P3 */ if (buf[0] != 'P' || buf[1] != '3') croak("Format is not P3 in file %s",file); fgets(buf,250,fp); while (buf[0] == '#' && fgets(buf,250,fp)) ; /* Empty */ if (2 != sscanf(buf,"%d%d",&w,&h)) croak("couldn't read image size from file %s",file); if (1 != fscanf(fp,"%d",&d)) croak("couldn't read image depth from file %s",file); if(d != 255) croak("image depth != 255 in file %s unsupported",file); if(w>10000 || h>10000) croak("suspicious size w=%d d=%d in file %s", w, d, file); New(1431, image, w*h*3, unsigned char); for(i=0;i