/* 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 #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 #if defined(HAVE_GLUT) || defined(HAVE_FREEGLUT) #ifndef GLUT_API_VERSION #define GLUT_API_VERSION 4 #endif #include "glut_util.h" #endif static int _done_glutInit = 0; #ifndef M_PI #ifdef PI #define M_PI PI #else #define M_PI 3.1415926535897932384626433832795 #endif #endif GLint FBO_MAX = -1; static char *SWIZZLE[4] = {"x","y","z","w"}; 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; } /* Main event handler for callbacks */ 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() /* Spin a thread for a callback */ 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 #if defined(_WIN32) || (defined(__CYGWIN__) && defined(HAVE_W32API)) #define loadProc(proc,name) \ { \ if (!proc) \ { \ proc = (void *)wglGetProcAddress(name); \ if (!proc) croak(name " is not supported by this renderer"); \ } \ } #define testProc(proc,name) ((proc) ? 1 : !!(proc = (void *)wglGetProcAddress(name))) #else #define loadProc(proc,name) #define testProc(proc,name) 1 #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; /* !! 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)))); /* End a gluTess callback handler */ #define end_tess_marshaller() \ end_void_specific_marshaller() /* Declare gluTess BEGIN */ begin_tess_marshaller(begin, (GLenum type, void * polygon_data)) XPUSHs(sv_2mortal(newSViv(type))); end_tess_marshaller() /* Declare gluTess END */ begin_tess_marshaller(end, (void * polygon_data)) end_tess_marshaller() /* Declare gluTess EDGEFLAG */ begin_tess_marshaller(edgeFlag, (GLboolean flag, void * polygon_data)) XPUSHs(sv_2mortal(newSViv(flag))); end_tess_marshaller() /* Declare gluTess VERTEX */ 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() /* Declare gluTess ERROR */ begin_tess_marshaller(error, (GLenum errno_, void * polygon_data)) XPUSHs(sv_2mortal(newSViv(errno_))); end_tess_marshaller() /* Declare gluTess COMBINE */ 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; /* Get a Perl parameter, cast to C type */ #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] = (GLubyte)SvIV(ST(i+(offset))); \ } \ break; \ case GL_BYTE: \ for (i=0;i<(count);i++) \ { \ ((GLbyte*)(dst))[i] = (GLbyte)SvIV(ST(i+(offset))); \ } \ break; \ case GL_UNSIGNED_SHORT: \ for (i=0;i<(count);i++) \ { \ ((GLushort*)(dst))[i] = (GLushort)SvIV(ST(i+(offset))); \ } \ break; \ case GL_SHORT: \ for (i=0;i<(count);i++) \ { \ ((GLshort*)(dst))[i] = (GLshort)SvIV(ST(i+(offset))); \ } \ break; \ case GL_UNSIGNED_INT: \ for (i=0;i<(count);i++) \ { \ ((GLuint*)(dst))[i] = (GLuint)SvIV(ST(i+(offset))); \ } \ break; \ case GL_INT: \ for (i=0;i<(count);i++) \ { \ ((GLint*)(dst))[i] = (GLint)SvIV(ST(i+(offset))); \ } \ break; \ case GL_FLOAT: \ for (i=0;i<(count);i++) \ { \ ((GLfloat*)(dst))[i] = (GLfloat)SvNV(ST(i+(offset))); \ } \ break; \ case GL_DOUBLE: \ for (i=0;i<(count);i++) \ { \ ((GLdouble*)(dst))[i] = (GLdouble)SvNV(ST(i+(offset))); \ } \ break; \ default: \ croak("unknown type"); \ } \ } /********************/ /* RPN Processor */ /********************/ /* RPN Ops */ enum { RPN_NOP = 0, RPN_PSH, RPN_POP, RPN_CNT, RPN_IDX, RPN_CLS, RPN_COL, RPN_RWS, RPN_ROW, RPN_SET, RPN_GET, RPN_STO, RPN_LOD, RPN_TST, RPN_NOT, RPN_EQU, RPN_GRE, RPN_LES, RPN_END, RPN_EIF, RPN_ERW, RPN_ERI, RPN_RET, RPN_RIF, RPN_RRW, RPN_RRI, RPN_SUM, RPN_AVG, RPN_RND, RPN_DUP, RPN_SWP, RPN_ABS, RPN_NEG, RPN_INC, RPN_DEC, RPN_ADD, // Also OR RPN_MUL, // ALSO AND RPN_DIV, RPN_POW, RPN_MOD, RPN_MIN, RPN_MAX, RPN_SIN, RPN_COS, RPN_TAN, RPN_AT2 }; /* RPN OP link-list */ struct tag_rpn_op { int op; GLfloat value; struct tag_rpn_op * next; }; typedef struct tag_rpn_op rpn_op; /* RPN OP stack for a given column */ struct tag_rpn_stack { int count; GLfloat * data; rpn_op * ops; }; typedef struct tag_rpn_stack rpn_stack; /* RPN Object */ struct tag_rpn_context { int rows; int cols; int oga_count; oga_struct ** oga_list; GLfloat * store; rpn_stack ** stacks; }; typedef struct tag_rpn_context rpn_context; /* RPN Parser */ rpn_stack * rpn_parse(int size,char * string) { rpn_stack * stack = malloc(sizeof(rpn_stack)); rpn_op * op = NULL; rpn_op * last = NULL; char * data = NULL; /* Will destroy string, so make a copy */ memset(stack,0,sizeof(rpn_stack)); if (string && *string) { /* Assumes ASCII */ data = malloc(strlen(string)+1); strcpy(data,string); string = data; } /* OPs are comma-separated */ while (string && *string) { rpn_op * cur = NULL; char * pos = string; char * end = strchr(pos,','); int len; /* Grab op */ if (end) { *end = 0; string = end+1; len = end - pos; } else { len = strlen(string); string += len; } /* Empty op is a NOP */ if (!len) continue; /* Update linklist */ cur = malloc(sizeof(rpn_op)); memset(cur,0,sizeof(rpn_op)); if (last) { last->next = cur; } else { op = cur; } last = cur; /* Check for primitive OPs */ if (len == 1) { switch (*pos) { case '!': { cur->op = RPN_NOT; continue; } case '-': { cur->op = RPN_NEG; continue; } case '+': { cur->op = RPN_ADD; continue; } case '*': { cur->op = RPN_MUL; continue; } case '/': { cur->op = RPN_DIV; continue; } case '%': { cur->op = RPN_MOD; continue; } case '=': { cur->op = RPN_EQU; continue; } case '>': { cur->op = RPN_GRE; continue; } case '<': { cur->op = RPN_LES; continue; } case '?': { cur->op = RPN_TST; continue; } } } /* Check for textual OPs */ if (!strcmp(pos,"pop")) { cur->op = RPN_POP; } else if (!strcmp(pos,"rand")) { cur->op = RPN_RND; size++; } else if (!strcmp(pos,"dup")) { cur->op = RPN_DUP; size++; } else if (!strcmp(pos,"swap")) { cur->op = RPN_SWP; } else if (!strcmp(pos,"set")) { cur->op = RPN_SET; } else if (!strcmp(pos,"get")) { cur->op = RPN_GET; size++; } else if (!strcmp(pos,"store")) { cur->op = RPN_STO; } else if (!strcmp(pos,"load")) { cur->op = RPN_LOD; } else if (!strcmp(pos,"end")) { cur->op = RPN_END; } else if (!strcmp(pos,"endif")) { cur->op = RPN_EIF; } else if (!strcmp(pos,"endrow")) { cur->op = RPN_ERW; } else if (!strcmp(pos,"endrowif")) { cur->op = RPN_ERI; } else if (!strcmp(pos,"return")) { cur->op = RPN_RET; } else if (!strcmp(pos,"returnif")) { cur->op = RPN_RIF; } else if (!strcmp(pos,"returnrow")) { cur->op = RPN_RRW; } else if (!strcmp(pos,"returnrowif")) { cur->op = RPN_RRI; } else if (!strcmp(pos,"if")) { cur->op = RPN_TST; } else if (!strcmp(pos,"or")) { cur->op = RPN_ADD; } else if (!strcmp(pos,"and")) { cur->op = RPN_MUL; } else if (!strcmp(pos,"inc")) { cur->op = RPN_INC; } else if (!strcmp(pos,"dec")) { cur->op = RPN_DEC; } else if (!strcmp(pos,"sum")) { cur->op = RPN_SUM; } else if (!strcmp(pos,"avg")) { cur->op = RPN_AVG; } else if (!strcmp(pos,"abs")) { cur->op = RPN_ABS; } else if (!strcmp(pos,"power")) { cur->op = RPN_POW; } else if (!strcmp(pos,"min")) { cur->op = RPN_MIN; } else if (!strcmp(pos,"max")) { cur->op = RPN_MAX; } else if (!strcmp(pos,"sin")) { cur->op = RPN_SIN; } else if (!strcmp(pos,"cos")) { cur->op = RPN_COS; } else if (!strcmp(pos,"tan")) { cur->op = RPN_TAN; } else if (!strcmp(pos,"atan2")) { cur->op = RPN_AT2; } else if (!strcmp(pos,"count")) { cur->op = RPN_CNT; size++; } else if (!strcmp(pos,"index")) { cur->op = RPN_IDX; size++; } else if (!strcmp(pos,"columns")) { cur->op = RPN_CLS; size++; } else if (!strcmp(pos,"column")) { cur->op = RPN_COL; size++; } else if (!strcmp(pos,"rows")) { cur->op = RPN_RWS; size++; } else if (!strcmp(pos,"row")) { cur->op = RPN_ROW; size++; } else if (!strcmp(pos,"pi")) { cur->op = RPN_PSH; cur->value = (float)M_PI; size++; } /* Default to a numeric push */ else { cur->op = RPN_PSH; cur->value = (float)atof(pos); size++; } } /* release string copy */ if (data) free(data); stack->data = malloc(sizeof(GLfloat)*size); stack->ops = op; return(stack); } /* Instantiate an RPN Object */ rpn_context * rpn_init(int oga_count,oga_struct ** oga_list,int col_count,char ** col_ops) { rpn_context * ctx = NULL; int elements = 0; int i,j; if (!oga_count) croak("Missing OGA count"); if (!oga_list) croak("Missing OGA list"); if (!col_count) croak("Missing column count"); /* Validate OGAs */ for (i=0; iitem_count) croak("Empty OGA %d",i); /* Check that all OGAs have the same dimension */ if (!i) { elements = oga_list[i]->item_count; if (elements % col_count) croak("Invalid OGA size for %d columns",col_count); } else if (elements != oga_list[i]->item_count) { croak("Invalid length in OGA %d",i); } /* Only supporting GLfloat for now */ for (j=0; jtype_count; j++) { if (oga_list[i]->types[j] != GL_FLOAT) croak("Unsupported type in OGA %d",i); } } /* Alloc Object data */ ctx = malloc(sizeof(rpn_context)); if (!ctx) croak("Unable to alloc rpn context"); /* Alloc current row store */ ctx->store = malloc(sizeof(GLfloat) * col_count); if (!ctx->store) croak("Unable to alloc rpn store"); /* Alloc column stack array */ ctx->stacks = malloc(sizeof(rpn_stack *) * col_count); if (!ctx->stacks) croak("Unable to alloc rpn stacks"); ctx->cols =col_count; ctx->rows = elements / col_count; ctx->oga_count = oga_count; ctx->oga_list = oga_list; /* Parse and populate column stacks */ for (i=0; istacks[i] = rpn_parse(oga_count,col_ops[i]); return(ctx); } /* Release OP link-list */ void rpn_delete_ops(rpn_op * ops) { if (!ops) return; rpn_delete_ops(ops->next); free(ops); } /* Release OPS stack */ void rpn_delete_stack(rpn_stack * stack) { if (!stack) return; rpn_delete_ops(stack->ops); free(stack->data); free(stack); } /* Release RPN Object */ void rpn_term(rpn_context * ctx) { if (ctx) { int i; for (i=0; icols; i++) rpn_delete_stack(ctx->stacks[i]); free(ctx->stacks); free(ctx->store); free(ctx); } } /* Push an RPN value on the stack */ void rpn_push(rpn_stack * stack, GLfloat value) { if (stack) stack->data[stack->count++] = value; } /* Pop an RPN value from the stack */ GLfloat rpn_pop(rpn_stack * stack) { GLfloat value = 0.0; if (stack && stack->count) { value = stack->data[--stack->count]; if (!stack->count) rpn_push(stack,0.0); } return(value); } /* Execute RPN OPs stack */ void rpn_exec(rpn_context * ctx) { int elements = ctx->rows * ctx->cols; int i,j,k,r = 0; GLfloat v1,v2; for (i=0;irows;i++) { for (j=0;jcols;j++) { rpn_stack * stack = ctx->stacks[j]; int end = 0; rpn_op * ops; /* Skip for NOP columns */ if (!stack || !stack->ops) continue; stack->count = 0; /* Push oga data on stack - reverse order */ for (k=ctx->oga_count-1;k>=0;k--) rpn_push(stack,((GLfloat *)ctx->oga_list[k]->data)[r+j]); /* Process RPN ops */ ops = stack->ops; while (ops) { int pos = stack->count - 1; switch(ops->op) { case RPN_PSH: { //printf("RPN_PSH: %f\n",ops->value); rpn_push(stack,ops->value); break; } case RPN_POP: { //printf("RPN_POP\n"); rpn_pop(stack); break; } case RPN_CNT: { //printf("RPN_CNT: %f\n",elements); rpn_push(stack,(float)elements); break; } case RPN_IDX: { //printf("RPN_IDX: %f\n",r+j); rpn_push(stack,(float)r+j); break; } case RPN_CLS: { //printf("RPN_CLS: %f\n",ctx->cols); rpn_push(stack,(float)ctx->cols); break; } case RPN_COL: { //printf("RPN_COL: %f\n",j); rpn_push(stack,(float)j); break; } case RPN_RWS: { //printf("RPN_RWS: %f\n",ctx->rows); rpn_push(stack,(float)ctx->rows); break; } case RPN_ROW: { //printf("RPN_ROW: %f\n",i); rpn_push(stack,(float)i); break; } case RPN_SET: { //printf("RPN_SET %d: %f\n",j,stack->data[pos]); ctx->store[j] = stack->data[pos]; break; } case RPN_GET: { //printf("RPN_Get %d: %f\n",j,ctx->store[j]); rpn_push(stack,ctx->store[j]); break; } case RPN_STO: { //printf("RPN_STO row %d\n",r); v1 = rpn_pop(stack); k = ((int)v1) % ctx->oga_count; if (k < 0) k += ctx->oga_count; memcpy(ctx->store,&((GLfloat *)ctx->oga_list[k]->data)[r], ctx->cols*sizeof(GLfloat)); break; } case RPN_LOD: { //printf("RPN_LOD rwo %d\n",r); v1 = rpn_pop(stack); k = ((int)v1) % ctx->oga_count; if (k < 0) k += ctx->oga_count; memcpy(&((GLfloat *)ctx->oga_list[k]->data)[r],ctx->store, ctx->cols*sizeof(GLfloat)); break; } case RPN_TST: { //printf("RPN_TST\n"); v1 = rpn_pop(stack); if (v1 != 0.0) { rpn_pop(stack); } else { v1 = rpn_pop(stack); rpn_pop(stack); rpn_push(stack,v1); } break; } case RPN_NOT: { //printf("RPN_NOT\n"); if (!stack->count) { rpn_push(stack,1.0); } else if (stack->data[pos] == 0.0) { stack->data[pos] = 1.0; } else { stack->data[pos] = 0.0; } break; } case RPN_EQU: { //printf("RPN_EQU\n"); v1 = (stack->count) ? rpn_pop(stack) : (float)0.0; v2 = (stack->count) ? rpn_pop(stack) : (float)0.0; rpn_push(stack,(float)((v1 == v2) ? 1.0 : 0.0)); break; } case RPN_GRE: { //printf("RPN_GRE\n"); v1 = (stack->count) ? rpn_pop(stack) : (float)0.0; v2 = (stack->count) ? rpn_pop(stack) : (float)0.0; rpn_push(stack,(float)((v1 > v2) ? 1.0 : 0.0)); break; } case RPN_LES: { //printf("RPN_LES\n"); v1 = (stack->count) ? rpn_pop(stack) : (float)0.0; v2 = (stack->count) ? rpn_pop(stack) : (float)0.0; rpn_push(stack,(float)((v1 < v2) ? 1.0 : 0.0)); break; } case RPN_END: { //printf("RPN_END\n"); end = 1; ops = 0; continue; } case RPN_EIF: { //printf("RPN_EIF\n"); v1 = rpn_pop(stack); if (v1 != 0.0) { end = 1; ops = 0; continue; } break; } case RPN_ERW: { //printf("RPN_ERW\n"); j = ctx->rows; end = 1; ops = 0; continue; } case RPN_ERI: { //printf("RPN_ERI\n"); v1 = rpn_pop(stack); if (v1 != 0.0) { j = ctx->rows; end = 1; ops = 0; continue; } break; } case RPN_RET: { //printf("RPN_RET\n"); ops = 0; continue; } case RPN_RIF: { //printf("RPN_RIF\n"); v1 = rpn_pop(stack); if (v1 != 0.0) { ops = 0; continue; } break; } case RPN_RRW: { //printf("RPN_RRW\n"); j = ctx->rows; ops = 0; continue; } case RPN_RRI: { //printf("RPN_RRI\n"); v1 = rpn_pop(stack); if (v1 != 0.0) { j = ctx->rows; ops = 0; continue; } break; } case RPN_RND: { //printf("RPN_RND\n"); rpn_push(stack,(float)(1.0*rand()/RAND_MAX)); break; } case RPN_DUP: { //printf("RPN_DUP\n"); rpn_push(stack,stack->data[pos]); break; } case RPN_SWP: { //printf("RPN_SWP\n"); if (stack->count > 1) { v1 = stack->data[pos]; stack->data[pos] = stack->data[--pos]; stack->data[pos] = v1; } break; } case RPN_ABS: { //printf("RPN_ABS\n"); stack->data[pos] = (float)fabs(stack->data[pos]); break; } case RPN_NEG: { //printf("RPN_NEG\n"); stack->data[pos] *= (float)-1.0; break; } case RPN_INC: { //printf("RPN_INC\n"); stack->data[pos] += (float)1.0; break; } case RPN_DEC: { //printf("RPN_DEC\n"); stack->data[pos] -= (float)1.0; break; } case RPN_AVG: case RPN_SUM: { //printf("RPN_SUM/AVG\n"); v1 = 0; for(pos=0; poscount; pos++) v1 += stack->data[pos]; if (ops->op == RPN_AVG) v1 /= stack->count; stack->data[0] = v1; stack->count = 1; break; } case RPN_ADD: { //printf("RPN_ADD\n"); if (stack->count > 1) { v1 = rpn_pop(stack); stack->data[--pos] += v1; } break; } case RPN_MUL: { //printf("RPN_MUL\n"); if (stack->count > 1) { v1 = rpn_pop(stack); stack->data[--pos] *= v1; } break; } case RPN_DIV: { //printf("RPN_DIV\n"); if (stack->count > 1) { v1 = rpn_pop(stack); if (v1 != 0.0) stack->data[--pos] /= v1; } break; } case RPN_POW: { //printf("RPN_POW\n"); if (stack->count > 1) { v1 = rpn_pop(stack); stack->data[--pos] = (float)pow(stack->data[pos],v1); } break; } case RPN_MOD: { //printf("RPN_MOD\n"); if (stack->count > 1) { v1 = rpn_pop(stack); stack->data[--pos] = (float)fmod(stack->data[pos],v1); } break; } case RPN_MIN: { //printf("RPN_MIN\n"); if (stack->count > 1) { v1 = rpn_pop(stack); if (stack->data[--pos] > v1) stack->data[pos] = v1; } break; } case RPN_MAX: { //printf("RPN_MAX\n"); if (stack->count > 1) { v1 = rpn_pop(stack); if (stack->data[--pos] < v1) stack->data[pos] = v1; } break; } case RPN_SIN: { //printf("RPN_SIN\n"); stack->data[pos] = (float)sin(stack->data[pos]); break; } case RPN_COS: { //printf("RPN_COS\n"); stack->data[pos] = (float)cos(stack->data[pos]); break; } case RPN_TAN: { //printf("RPN_TAN\n"); stack->data[pos] = (float)tan(stack->data[pos]); break; } case RPN_AT2: { //printf("RPN_AT2\n"); v2 = rpn_pop(stack); v1 = rpn_pop(stack); if (v1 != 0.0 || v2 != 0.0) rpn_push(stack,(float)atan2(v1,v2)); break; } case RPN_NOP: { //printf("RPN_NOP\n"); break; } default: { croak("Unknown RPN op: %d\n",ops->op); } } ops = ops->next; } if (!end) ((GLfloat *)ctx->oga_list[0]->data)[r+j] = rpn_pop(stack); } r += ctx->cols; } } /********************/ /* GPGPU Utils */ /********************/ /* Get max GPGPU data size */ int gpgpu_size(void) { #if defined(GL_ARB_texture_rectangle) && defined(GL_ARB_texture_float) && \ defined(GL_ARB_fragment_program) && defined(GL_EXT_framebuffer_object) if (FBO_MAX == -1) { if (testProc(glProgramStringARB,"glProgramStringARB") && testProc(glGenProgramsARB,"glGenProgramsARB") && testProc(glBindProgramARB,"glBindProgramARB") && testProc(glIsProgramARB,"glIsProgramARB") && testProc(glProgramLocalParameter4fvARB,"glProgramLocalParameter4fvARB") && testProc(glDeleteProgramsARB,"glDeleteProgramsARB") && testProc(glGenFramebuffersEXT,"glGenFramebuffersEXT") && testProc(glGenRenderbuffersEXT,"glGenRenderbuffersEXT") && testProc(glBindFramebufferEXT,"glBindFramebufferEXT") && testProc(glFramebufferTexture2DEXT,"glFramebufferTexture2DEXT") && testProc(glBindRenderbufferEXT,"glBindRenderbufferEXT") && testProc(glRenderbufferStorageEXT,"glRenderbufferStorageEXT") && testProc(glFramebufferRenderbufferEXT,"glFramebufferRenderbufferEXT") && testProc(glCheckFramebufferStatusEXT,"glCheckFramebufferStatusEXT") && testProc(glDeleteRenderbuffersEXT,"glDeleteRenderbuffersEXT") && testProc(glDeleteFramebuffersEXT,"glDeleteFramebuffersEXT")) { glGetIntegerv(GL_MAX_RENDERBUFFER_SIZE_EXT,&FBO_MAX); } else { FBO_MAX = 0; } } return(FBO_MAX); #else return(0); #endif } /* Get max square array width for a given GPGPU data size */ int gpgpu_width(int len) { int max = gpgpu_size(); if (max && len && !(len%3)) { int count = len / 3; int w = (int)sqrt(count); while ((w <= count) && (w <= max)) { if (!(count%w)) return(w); w++; } } return(0); } #ifdef GL_ARB_fragment_program static char affine_prog[] = "!!ARBfp1.0\n" "PARAM affine[4] = {program.local[0..3]};\n" "TEMP decal;\n" "TEX decal, fragment.texcoord[0], texture[0], RECT;\n" "MOV decal.w, 1.0;\n" "DP4 result.color.x, decal, affine[0];\n" "DP4 result.color.y, decal, affine[1];\n" "DP4 result.color.z, decal, affine[2];\n" "END\n"; /* Enable affine shader program */ void enable_affine(oga_struct * oga) { if (!oga) return; if (!oga->affine_handle) { /* Load shader program */ glGenProgramsARB(1,&oga->affine_handle); glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB,oga->affine_handle); glProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, strlen(affine_prog),affine_prog); /* Validate shader program */ if (!glIsProgramARB(oga->affine_handle)) { GLint errorPos; glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB,&errorPos); if (errorPos < 0) errorPos = strlen(affine_prog); croak("Affine fragment program error\n%s",&affine_prog[errorPos]); } } glEnable(GL_FRAGMENT_PROGRAM_ARB); } /* Disable affine shader program */ void disable_affine(oga_struct * oga) { if (!oga) return; if (oga->affine_handle) glDisable(GL_FRAGMENT_PROGRAM_ARB); } #endif #ifdef GL_EXT_framebuffer_object /* Unbind an FBO to an OGA */ void release_fbo(oga_struct * oga) { if (oga->fbo_handle) { glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); glDeleteFramebuffersEXT(1,&oga->fbo_handle); } if (oga->tex_handle) { glBindTexture(oga->target,0); if (oga->tex_handle[0]) glDeleteTextures(1,&oga->tex_handle[0]); if (oga->tex_handle[1]) glDeleteTextures(1,&oga->tex_handle[1]); } } /* Enable an FBO bound to an OGA */ void enable_fbo(oga_struct * oga, int w, int h, GLuint target, GLuint pixel_type, GLuint pixel_format, GLuint element_size) { if (!oga) return; if ((oga->fbo_w != w) || (oga->fbo_h != h) || (oga->target != target) || (oga->pixel_type != pixel_type) || (oga->pixel_format != pixel_format) || (oga->element_size != element_size)) release_fbo(oga); if (!oga->fbo_handle) { GLenum status; /* Save params */ oga->fbo_w = w; oga->fbo_h = h; oga->target = target; oga->pixel_type = pixel_type; oga->pixel_format = pixel_format; oga->element_size = element_size; /* Set up FBO */ glGenTextures(2,oga->tex_handle); glGenFramebuffersEXT(1,&oga->fbo_handle); glBindFramebufferEXT(GL_FRAMEBUFFER_EXT,oga->fbo_handle); glViewport(0,0,w,h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0,w,0,h); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glBindTexture(target,oga->tex_handle[1]); glTexParameteri(target,GL_TEXTURE_MIN_FILTER,GL_NEAREST); glTexParameteri(target,GL_TEXTURE_MAG_FILTER,GL_NEAREST); glTexParameteri(target,GL_TEXTURE_WRAP_S,GL_CLAMP); glTexParameteri(target,GL_TEXTURE_WRAP_T,GL_CLAMP); glTexImage2D(target,0,pixel_type,w,h,0, pixel_format,element_size,0); glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,target,oga->tex_handle[1],0); status = glCheckFramebufferStatusEXT(GL_RENDERBUFFER_EXT); if (status) croak("enable_fbo status: %04X\n",status); } else { glBindFramebufferEXT(GL_FRAMEBUFFER_EXT,oga->fbo_handle); } /* Load data */ glBindTexture(target,oga->tex_handle[0]); glTexImage2D(target,0,pixel_type,w,h,0, pixel_format,element_size,oga->data); glEnable(target); //glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT); glBindTexture(target,oga->tex_handle[0]); glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECAL); } /* Disable an FBO bound to an OGA */ void disable_fbo(oga_struct * oga) { if (!oga) return; if (oga->fbo_handle) { glDisable(oga->target); glBindFramebufferEXT(GL_FRAMEBUFFER_EXT,0); } } #endif MODULE = OpenGL PACKAGE = OpenGL::Array #//# $oga = OpenGL::Array->new($count, @types); #//- Contructor for multi-type OGA - unpopulated OpenGL::Array new(Class, count, type, ...) GLsizei count GLenum type CODE: { int oga_len = sizeof(oga_struct); oga_struct * oga = malloc(oga_len); int i,j; memset(oga,0,oga_len); 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); # vas is das? count; oga->data = malloc(oga->data_length); memset(oga->data,0,oga->data_length); oga->free_data = 1; RETVAL = oga; } OUTPUT: RETVAL #//# $oga = OpenGL::Array->new_list($type, @data); #//- Contructor for mono-type OGA - populated OpenGL::Array new_list(Class, type, ...) GLenum type CODE: { int oga_len = sizeof(oga_struct); oga_struct * oga = malloc(oga_len); memset(oga,0,oga_len); 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 #//# $oga = OpenGL::Array->new_scalar($type, (PACKED)data, $length); #//- Contructor for mono-type OGA - populated by string OpenGL::Array new_scalar(Class, type, data, length) GLenum type SV * data GLsizei length CODE: { int width = gl_type_size(type); void * data_s = EL(data, width*length); int oga_len = sizeof(oga_struct); oga_struct * oga = malloc(oga_len); memset(oga,0,oga_len); oga->type_count = 1; oga->item_count = length / width; oga->total_types_width = width; oga->data_length = length; 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; memcpy(oga->data,data_s,oga->data_length); RETVAL = oga; } OUTPUT: RETVAL #//# $oga = OpenGL::Array->new_pointer($type, (CPTR)ptr, $elements); #//- Contructor for mono-type OGA wrapper over a C pointer OpenGL::Array new_pointer(Class, type, ptr, elements) GLenum type void * ptr GLsizei elements CODE: { int width = gl_type_size(type); int oga_len = sizeof(oga_struct); oga_struct * oga = malloc(sizeof(oga_struct)); memset(oga,0,oga_len); oga->type_count = 1; oga->item_count = elements; oga->types = malloc(sizeof(GLenum) * oga->type_count); oga->type_offset = malloc(sizeof(GLint) * oga->type_count); oga->types[0] = type; oga->type_offset[0] = 0; oga->total_types_width = 1; oga->data_length = elements * width; oga->data = ptr; oga->free_data = 0; RETVAL = oga; } OUTPUT: RETVAL #//# $oga = OpenGL::Array->new_from_pointer((CPTR)ptr, $length); #//- Contructor for GLubyte OGA wrapper over a C pointer OpenGL::Array new_from_pointer(Class, ptr, length) void * ptr GLsizei length CODE: { int oga_len = sizeof(oga_struct); oga_struct * oga = malloc(sizeof(oga_struct)); memset(oga,0,oga_len); 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 #//# $oga->update_pointer((CPTR)ptr); #//- Replace OGA's C pointer - old one is not released GLboolean update_pointer(oga, ptr) OpenGL::Array oga void * ptr CODE: { RETVAL = (oga->data != ptr); oga->data = ptr; } OUTPUT: RETVAL #//# $oga->bind($vboID); #//- Bind a VBO to an OGA void bind(oga, bind) OpenGL::Array oga GLint bind INIT: #ifdef GL_ARB_vertex_buffer_object loadProc(glBindBufferARB,"glBindBufferARB"); #endif CODE: { #ifdef GL_ARB_vertex_buffer_object oga->bind = bind; glBindBufferARB(GL_ARRAY_BUFFER_ARB,bind); #else croak("OpenGL::Array::bind requires GL_ARB_vertex_buffer_object"); #endif } #//# $vboID = $oga->bound(); #//- Return OGA's bound VBO ID GLint bound(oga) OpenGL::Array oga CODE: RETVAL = oga->bind; OUTPUT: RETVAL #//# $oga->calc([@(OGA)moreOGAs,]@rpnOPs); #//- Execute RPN instructions on one or more OGAs void calc(...) CODE: { rpn_context * ctx; oga_struct ** oga_list; int oga_count = 0; int ops_count,i; char ** ops; /* Determine number of OGAs passed in */ for (i=0; iassign($pos,@data); #//- Set OGA values starting from offset 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; /* Handle multi-type OGAs */ 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) = (GLubyte)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) = (GLushort)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) = (GLuint)SvIV(ST(j)); offset += sizeof(GLuint); break; #endif case GL_UNSIGNED_BYTE: case GL_BITMAP: (*(GLubyte*)offset) = (GLubyte)SvIV(ST(j)); offset += sizeof(GLubyte); break; case GL_BYTE: (*(GLbyte*)offset) = (GLbyte)SvIV(ST(j)); offset += sizeof(GLbyte); break; case GL_UNSIGNED_SHORT: (*(GLushort*)offset) = (GLushort)SvIV(ST(j)); offset += sizeof(GLushort); break; case GL_SHORT: (*(GLshort*)offset) = (GLshort)SvIV(ST(j)); offset += sizeof(GLshort); break; case GL_UNSIGNED_INT: (*(GLuint*)offset) = (GLuint)SvIV(ST(j)); offset += sizeof(GLuint); break; case GL_INT: (*(GLint*)offset) = (GLint)SvIV(ST(j)); offset += sizeof(GLint); break; case GL_FLOAT: (*(GLfloat*)offset) = (GLfloat)SvNV(ST(j)); offset += sizeof(GLfloat); break; case GL_DOUBLE: (*(GLdouble*)offset) = (GLdouble)SvNV(ST(j)); offset += sizeof(GLdouble); break; case GL_2_BYTES: { unsigned long v = (unsigned long)SvIV(ST(j)); (*(GLubyte*)offset) = (GLubyte)(v >> 8); offset++; (*(GLubyte*)offset) = (GLubyte)v & 0xff; offset++; break; } case GL_3_BYTES: { unsigned long v = (unsigned long)SvIV(ST(j)); (*(GLubyte*)offset) = (GLubyte)(v >> 16)& 0xff; offset++; (*(GLubyte*)offset) = (GLubyte)(v >> 8) & 0xff; offset++; (*(GLubyte*)offset) = (GLubyte)(v >> 0) & 0xff; offset++; break; } case GL_4_BYTES: { unsigned long v = (unsigned long)SvIV(ST(j)); (*(GLubyte*)offset) = (GLubyte)(v >> 24)& 0xff; offset++; (*(GLubyte*)offset) = (GLubyte)(v >> 16)& 0xff; offset++; (*(GLubyte*)offset) = (GLubyte)(v >> 8) & 0xff; offset++; (*(GLubyte*)offset) = (GLubyte)(v >> 0) & 0xff; offset++; break; } default: croak("unknown type"); } } } #//# $oga->assign_data($pos,(PACKED)data); #//- Set OGA values by string, starting from offset 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); } #//# @data = $oga->retrieve($pos,$len); #//- Get OGA data array, by offset and length void retrieve(oga, ...) OpenGL::Array oga PPCODE: { GLint pos = (items > 1) ? SvIV(ST(1)) : 0; GLint len = (items > 2) ? SvIV(ST(2)) : (oga->item_count - pos); 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"); } } } #//# $data = $oga->retrieve_data($pos,$len); #//- Get OGA data as packed string, by offset and length SV * retrieve_data(oga, ...) OpenGL::Array oga CODE: { GLint pos = (items > 1) ? SvIV(ST(1)) : 0; GLint len = (items > 2) ? SvIV(ST(2)) : (oga->item_count - pos); 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 #//# $count = $oga->elements(); #//- Get number of OGA elements GLsizei elements(oga) OpenGL::Array oga CODE: RETVAL = oga->item_count; OUTPUT: RETVAL #//# $len = $oga->length(); #//- Get size of OGA in bytes GLsizei length(oga) OpenGL::Array oga CODE: RETVAL = oga->data_length; OUTPUT: RETVAL #//# (CPTR)ptr = $oga->ptr(); #//- Get C pointer to OGA data void * ptr(oga) OpenGL::Array oga CODE: RETVAL = oga->data; OUTPUT: RETVAL #//# (CPTR)ptr = $oga->offset($pos); #//- Get C pointer to OGA data, by element offset 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 #//# $oga->affine((OGA)matrix|@matrix|$scalar); #//- Perform affine transform on an OGA void affine(oga, ...) OpenGL::Array oga CODE: { GLfloat * data = (GLfloat *)oga->data; GLfloat * mat = NULL; int len = oga->item_count; int fbo_width = 0; int i,j,count,dim,cols; SV * sv = ST(1); int free_mat = 0; /* Get transform matrix OGA */ if (sv != &PL_sv_undef && sv_derived_from(sv,"OpenGL::Array")) { IV ref = SvIV((SV*)SvRV(sv)); oga_struct *oga_mat = INT2PTR(OpenGL__Array,ref); count = oga_mat->item_count; for (i=0;itype_count;i++) { if (oga_mat->types[i] != GL_FLOAT) croak("Unsupported datatype in affine matrix"); } mat = (GLfloat *)oga_mat->data; } else { count = items - 1; free_mat = 1; } if (!count) croak("No matrix values"); /* Currently only support GLfloat */ for (i=0;itype_count;i++) { if (oga->types[i] != GL_FLOAT) croak("Unsupported datatype"); } /* Scalar Multiply */ if (count == 1) { GLfloat scalar = mat ? mat[0] : (GLfloat)SvNV(ST(1)); for (i=0;idata); disable_fbo(oga); } /* Use CPU to do transform */ else #endif { int s = sizeof(GLfloat) * cols; GLfloat *vec = malloc(s); int k,r; /* Iterate each data row */ for (i=0; i < len; i+=cols) { /* Iterate each result column */ for (j=0,r=0; jaffine_handle) { glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, 0); glDeleteProgramsARB(1,&oga->affine_handle); } #endif #ifdef GL_EXT_framebuffer_object release_fbo(oga); #endif #endif #if 0 #ifdef GL_ARB_vertex_buffer_object if (oga->bind) { glBindBufferARB(GL_ARRAY_BUFFER_ARB,0); glDeleteBuffersARB(1,&oga->bind); } #endif #endif 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 #// Define a POGL Constant SV * constant(name,arg) char * name int arg CODE: { RETVAL = neoconstant(name, arg); if (!RETVAL) RETVAL = newSVsv(&PL_sv_undef); } OUTPUT: RETVAL #// Test for GL int _have_gl() CODE: #ifdef HAVE_GL RETVAL = 1; #else RETVAL = 0; #endif OUTPUT: RETVAL #// Test for GLU int _have_glu() CODE: #ifdef HAVE_GLU RETVAL = 1; #else RETVAL = 0; #endif OUTPUT: RETVAL #// Test for GLUT/FreeGLUT int _have_glut() CODE: #if defined(HAVE_GLUT) || defined(HAVE_FREEGLUT) RETVAL = 1; #else RETVAL = 0; #endif OUTPUT: RETVAL #// Test for GLX int _have_glx() CODE: #ifdef HAVE_GLX RETVAL = 1; #else RETVAL = 0; #endif OUTPUT: RETVAL #// Test for GLpc int _have_glp() CODE: #ifdef HAVE_GLpc RETVAL = 1; #else RETVAL = 0; #endif OUTPUT: RETVAL #// Test for done with glutInit int done_glutInit() CODE: RETVAL = _done_glutInit; OUTPUT: RETVAL #ifdef HAVE_GL #// 1.0 #//# glAccum($op, $value); void glAccum(op, value) GLenum op GLfloat value #// 1.0 #//# glAlphaFunc($func, $ref); void glAlphaFunc(func, ref) GLenum func GLclampf ref #ifdef GL_VERSION_1_1 #//# glAreTexturesResident_c($n, (CPTR)textures, (CPTR)residences); void glAreTexturesResident_c(n, textures, residences) GLsizei n void * textures void * residences CODE: glAreTexturesResident(n, textures, residences); #//# glAreTexturesResident_s($n, (PACKED)textures, (PACKED)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 #//# (result,@residences) = glAreTexturesResident_p(@textureIDs); 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;ibind); } glColorPointer(size, oga->types[0], 0, oga->bind ? 0 : oga->data); #else glColorPointer(size, oga->types[0], 0, oga->data); #endif } #endif #// 1.0 #//# glCopyPixels($x, $y, $width, $height, $type); void glCopyPixels(x, y, width, height, type) GLint x GLint y GLsizei width GLsizei height GLenum type #ifdef GL_VERSION_1_1 #// 1.1 #//# glCopyTexImage1D($target, $level, $internalFormat, $x, $y, $width, $border); 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 #//# glCopyTexImage2D($target, $level, $internalFormat, $x, $y, $width, $height, $border); 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 #//# glCopyTexSubImage1D($target, $level, $xoffset, $x, $y, $width); void glCopyTexSubImage1D(target, level, xoffset, x, y, width) GLenum target GLint level GLint xoffset GLint x GLint y GLsizei width #// 1.1 #//# glCopyTexSubImage2D($target, $level, $xoffset, $yoffset, $x, $y, $width, $height); 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 #//# glCopyTexSubImage3D($target, $level, $xoffset, $yoffset, $zoffset, $x, $y, $width, $height); 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 #//# glCullFace($mode); void glCullFace(mode) GLenum mode #// 1.0 #//# glDeleteLists($list, $range); void glDeleteLists(list, range) GLenum list GLsizei range #ifdef GL_VERSION_1_1 #// 1.1 #//# glDeleteTextures_c($items, (CPTR)list); void glDeleteTextures_c(items, list) GLint items void * list CODE: glDeleteTextures(items,list); #// 1.1 #//# glDeleteTextures_s($items, (PACKED)list); void glDeleteTextures_s(items, list) GLint items SV * list CODE: { void * list_s = EL(list, sizeof(GLuint) * items); glDeleteTextures(items,list_s); } #// 1.1 #//# glDeleteTextures_p(@textureIDs); 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; ibind); } glEdgeFlagPointer(0, oga->bind ? 0 : oga->data); #else glEdgeFlagPointer(0, oga->data); #endif } #endif #// 1.0 #//# glEnable($cap); void glEnable(cap) GLenum cap #// 1.0 #//# glDisable($cap); void glDisable(cap) GLenum cap #ifdef GL_VERSION_1_1 #// 1.1 #//# glEnableClientState($cap); void glEnableClientState(cap) GLenum cap #// 1.1 #//# glDisableClientState($cap); void glDisableClientState(cap) GLenum cap #endif #// 1.0 #//# glEvalCoord1d($u); void glEvalCoord1d(u) GLdouble u #// 1.0 #//# glEvalCoord1f($u); void glEvalCoord1f(u) GLfloat u #// 1.0 #//# glEvalCoord2d($u, $v); void glEvalCoord2d(u, v) GLdouble u GLdouble v #// 1.0 #//# glEvalCoord2f($u, $v); void glEvalCoord2f(u, v) GLfloat u GLfloat v #// 1.0 #//# glEvalMesh1($mode, $i1, $i2); void glEvalMesh1(mode, i1, i2) GLenum mode GLint i1 GLint i2 #// 1.0 #//# glEvalMesh2($mode, $i1, $i2, $j1, $j2); void glEvalMesh2(mode, i1, i2, j1, j2) GLenum mode GLint i1 GLint i2 GLint j1 GLint j2 #// 1.0 #//# glEvalPoint1($i); void glEvalPoint1(i) GLint i #// 1.0 #//# glEvalPoint2($i, $j); void glEvalPoint2(i, j) GLint i GLint j #// 1.0 #//# glFeedbackBuffer_c($size, $type, (CPTR)buffer); void glFeedbackBuffer_c(size, type, buffer) GLsizei size GLenum type void * buffer CODE: glFeedbackBuffer(size, type, (GLfloat*)(buffer)); #// 1.0 #//# glFinish(); void glFinish() #// 1.0 #//# glFlush(); void glFlush() #// 1.0 #//# glFogf($pname, $param); void glFogf(pname, param) GLenum pname GLfloat param #// 1.0 #//# glFogi($pname, $param); void glFogi(pname, param) GLenum pname GLint param #// 1.0 #//# glFogfv_c($pname, (CPTR)params); void glFogfv_c(pname, params) GLenum pname void * params CODE: glFogfv(pname, params); #// 1.0 #//# glFogiv_c($pname, (CPTR)params); void glFogiv_c(pname, params) GLenum pname void * params CODE: glFogiv(pname, params); #// 1.0 #//# glFogfv_s($pname, (PACKED)params); 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 #//# glFogiv_s($pname, (PACKED)params); 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 #//# glFogfv_p($pname, $param1, $param2=0, $param3=0, $param4=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 #//# glFogiv_p($pname, $param1, $param2=0, $param3=0, $param4=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 #//# glFrontFace($mode); void glFrontFace(mode) GLenum mode #// 1.0 #//# glFrustum($left, $right, $bottom, $top, $zNear, $zFar); void glFrustum(left, right, bottom, top, zNear, zFar) GLdouble left GLdouble right GLdouble bottom GLdouble top GLdouble zNear GLdouble zFar #// 1.0 #//# glGenLists($range); GLuint glGenLists(range) GLsizei range #ifdef GL_VERSION_1_1 #// 1.1 #//# glGenTextures_c($n, (CPTR)textures); void glGenTextures_c(n, textures) GLint n void * textures CODE: glGenTextures(n, textures); #// 1.1 #//# glGenTextures_s($n, (PACKED)textures); void glGenTextures_s(n, textures) GLint n SV * textures CODE: { void * textures_s = EL(textures, sizeof(GLuint)*n); glGenTextures(n, textures_s); } #// 1.1 #//# @textureIDs = glGenTextures_p($n); 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;ibind); } glIndexPointer(oga->types[0], 0, oga->bind ? 0 : oga->data); #else glIndexPointer(oga->types[0], 0, oga->data); #endif } #endif #// 1.0 #//# glInitNames(); void glInitNames() #ifdef GL_VERSION_1_1 #// 1.1 #//# glInterleavedArrays_c($format, $stride, (CPTR)pointer); void glInterleavedArrays_c(format, stride, pointer) GLenum format GLsizei stride void * pointer CODE: glInterleavedArrays(format, stride, pointer); #endif #// 1.0 #//# glIsEnabled($cap); GLboolean glIsEnabled(cap) GLenum cap #// 1.0 #//# glIsList(list); GLboolean glIsList(list) GLuint list #ifdef GL_VERSION_1_1 #// 1.1 #//# glIsTexture($list); GLboolean glIsTexture(list) GLuint list #endif #// 1.0 #//# glLightf($light, $pname, $param); void glLightf(light, pname, param) GLenum light GLenum pname GLfloat param #// 1.0 #//# glLighti($light, $pname, $param); void glLighti(light, pname, param) GLenum light GLenum pname GLint param #// 1.0 #//# glLightfv_c($light, $pname, (CPTR)params); void glLightfv_c(light, pname, params) GLenum light GLenum pname void * params CODE: glLightfv(light, pname, params); #// 1.0 #//# glLightiv_c($light, $pname, (CPTR)params); void glLightiv_c(light, pname, params) GLenum light GLenum pname void * params CODE: glLightiv(light, pname, params); #// 1.0 #//# glLightfv_s($light, $pname, (PACKED)params); 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 #//# glLightiv_s($light, $pname, (PACKED)params); 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 #//# glLightfv_p($light, $pname, @params); 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;ibind); } glNormalPointer(oga->types[0], 0, oga->bind ? 0 : oga->data); #else glNormalPointer(oga->types[0], 0, oga->data); #endif } #endif #// 1.0 #//# glOrtho($left, $right, $bottom, $top, $zNear, $zFar); void glOrtho(left, right, bottom, top, zNear, zFar) GLdouble left GLdouble right GLdouble bottom GLdouble top GLdouble zNear GLdouble zFar #// 1.0 #//# glPassThrough($token); void glPassThrough(token) GLfloat token #// 1.0 #//# glPixelMapfv_c($map, $mapsize, (CPTR)values); void glPixelMapfv_c(map, mapsize, values) GLenum map GLsizei mapsize void * values CODE: glPixelMapfv(map, mapsize, values); #// 1.0 #//# glPixelMapuiv_c($map, $mapsize, (CPTR)values); void glPixelMapuiv_c(map, mapsize, values) GLenum map GLsizei mapsize void * values CODE: glPixelMapuiv(map, mapsize, values); #// 1.0 #//# glPixelMapusv_c($map, $mapsize, (CPTR)values); void glPixelMapusv_c(map, mapsize, values) GLenum map GLsizei mapsize void * values CODE: glPixelMapusv(map, mapsize, values); #// 1.0 #//# glPixelMapfv_s($map, $mapsize, (PACKED)values); 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 #//# glPixelMapuiv_s($map, $mapsize, (PACKED)values); 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 #//# glPixelMapusv_s($map, $mapsize, (PACKED)values); 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 #//# glPixelMapfv_p($map, @values); void glPixelMapfv_p(map, ...) GLenum map CODE: { GLint mapsize = items-1; GLfloat * values; int i; values = malloc(sizeof(GLfloat) * (mapsize+1)); for (i=0;ibind); } glTexCoordPointer(size, oga->types[0], 0, oga->bind ? 0 : oga->data); #else glTexCoordPointer(size, oga->types[0], 0, oga->data); #endif } #endif #// 1.0 #//# glTexEnvf($target, $pname, $param); void glTexEnvf(target, pname, param) GLenum target GLenum pname GLfloat param #// 1.0 #//# glTexEnvi($target, $pname, $param); void glTexEnvi(target, pname, param) GLenum target GLenum pname GLint param #// 1.0 #//# glTexEnvfv_s(target, pname, (PACKED)params); 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 #//# glTexEnviv_s(target, pname, (PACKED)params); 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 #//# glTexEnvfv_p(target, pname, @params); 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;ibind); } glVertexPointer(size, oga->types[0], 0, oga->bind ? 0 : oga->data); #else glVertexPointer(size, oga->types[0], 0, oga->data); #endif } #endif #// 1.0 #//# glViewport($x, $y, $width, $height); void glViewport(x, y, width, height) GLint x GLint y GLsizei width GLsizei height # Generated declarations #//# glVertex2d($x, $y); void glVertex2d(x, y) GLdouble x GLdouble y #//# glVertex2dv_c((CPTR)v); void glVertex2dv_c(v) void * v CODE: glVertex2dv(v); #//# glVertex2dv_s((PACKED)v); void glVertex2dv_s(v) SV * v CODE: { GLdouble * v_s = EL(v, sizeof(GLdouble)*2); glVertex2dv(v_s); } #//!!! Do we really need this? It duplicates glVertex2d #//# glVertex2dv_p($x, $y); void glVertex2dv_p(x, y) GLdouble x GLdouble y CODE: { GLdouble param[2]; param[0] = x; param[1] = y; glVertex2dv(param); } #//# glVertex2f($x, $y); void glVertex2f(x, y) GLfloat x GLfloat y #//# glVertex2f_s((PACKED)v); void glVertex2fv_s(v) SV * v CODE: { GLfloat * v_s = EL(v, sizeof(GLfloat)*2); glVertex2fv(v_s); } #//# glVertex2f_s((CPTR)v); void glVertex2fv_c(v) void * v CODE: glVertex2fv(v); #//!!! Do we really need this? It duplicates glVertex2f #//# glVertex2fv_p($x, $y); void glVertex2fv_p(x, y) GLfloat x GLfloat y CODE: { GLfloat param[2]; param[0] = x; param[1] = y; glVertex2fv(param); } #//# glVertex2i($x, $y); void glVertex2i(x, y) GLint x GLint y #//# glVertex2iv_c((CPTR)v); void glVertex2iv_c(v) void * v CODE: glVertex2iv(v); #//# glVertex2iv_s((PACKED)v); void glVertex2iv_s(v) SV * v CODE: { GLint * v_s = EL(v, sizeof(GLint)*2); glVertex2iv(v_s); } #//!!! Do we really need this? It duplicates glVertex2i #//# glVertex2iv_p($x, $y); void glVertex2iv_p(x, y) GLint x GLint y CODE: { GLint param[2]; param[0] = x; param[1] = y; glVertex2iv(param); } #//# glVertex2s($x, $y); void glVertex2s(x, y) GLshort x GLshort y #//# glVertex2sv_c((CPTR)v); void glVertex2sv_c(v) void * v CODE: glVertex2sv(v); #//# glVertex2sv_c((PACKED)v); void glVertex2sv_s(v) SV * v CODE: { GLshort * v_s = EL(v, sizeof(GLshort)*2); glVertex2sv(v_s); } #//!!! Do we really need this? It duplicates glVertex2s #//# glVertex2sv_p($x, $y); void glVertex2sv_p(x, y) GLshort x GLshort y CODE: { GLshort param[2]; param[0] = x; param[1] = y; glVertex2sv(param); } #//# glVertex3d($x, $y, $z); void glVertex3d(x, y, z) GLdouble x GLdouble y GLdouble z #//# glVertex3dv_c((CPTR)v); void glVertex3dv_c(v) void * v CODE: glVertex3dv(v); #//# glVertex3dv_s((PACKED)v); void glVertex3dv_s(v) SV * v CODE: { GLdouble * v_s = EL(v, sizeof(GLdouble)*3); glVertex3dv(v_s); } #//!!! Do we really need this? It duplicates glVertex3d #//# glVertex3dv_p($x, $y, $z); 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); } #//# glVertex3f($x, $y, $z); void glVertex3f(x, y, z) GLfloat x GLfloat y GLfloat z #//# glVertex3fv_c((CPTR)v); void glVertex3fv_c(v) void * v CODE: glVertex3fv(v); #//# glVertex3fv_s((PACKED)v); void glVertex3fv_s(v) SV * v CODE: { GLfloat * v_s = EL(v, sizeof(GLfloat)*3); glVertex3fv(v_s); } #//!!! Do we really need this? It duplicates glVertex3f #//# glVertex3fv_p($x, $y, $z); 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); } #//# glVertex3i(x, y, z); void glVertex3i(x, y, z) GLint x GLint y GLint z #//# glVertex3iv_c((CPTR)v); void glVertex3iv_c(v) void * v CODE: glVertex3iv(v); #//# glVertex3iv_s((PACKED)v); void glVertex3iv_s(v) SV * v CODE: { GLint * v_s = EL(v, sizeof(GLint)*3); glVertex3iv(v_s); } #//!!! Do we really need this? It duplicates glVertex3i #//# glVertex3iv_p($x, $y, $z); 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); } #//# glVertex3s($x, $y, $z); void glVertex3s(x, y, z) GLshort x GLshort y GLshort z #//# glVertex3sv_c((CPTR)v); void glVertex3sv_c(v) void * v CODE: glVertex3sv(v); #//# glVertex3sv_s((PACKED)v); void glVertex3sv_s(v) SV * v CODE: { GLshort * v_s = EL(v, sizeof(GLshort)*3); glVertex3sv(v_s); } #//!!! Do we really need this? It duplicates glVertex3s #//# glVertex3sv_p($x, $y, $z); 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); } #//# glVertex4d($x, $y, $z, $w); void glVertex4d(x, y, z, w) GLdouble x GLdouble y GLdouble z GLdouble w #//# glVertex4dv_c((CPTR)v); void glVertex4dv_c(v) void * v CODE: glVertex4dv(v); #//# glVertex4dv_s((PACKED)v); void glVertex4dv_s(v) SV * v CODE: { GLdouble * v_s = EL(v, sizeof(GLdouble)*4); glVertex4dv(v_s); } #//!!! Do we really need this? It duplicates glVertex4d #//# glVertex4dv_p($x, $y, $z, $w); 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); } #//# glVertex4f($x, $y, $z, $w); void glVertex4f(x, y, z, w) GLfloat x GLfloat y GLfloat z GLfloat w #//# glVertex4fv_c((CPTR)v); void glVertex4fv_c(v) void * v CODE: glVertex4fv(v); #//# glVertex4fv_s((PACKED)v); void glVertex4fv_s(v) SV * v CODE: { GLfloat * v_s = EL(v, sizeof(GLfloat)*4); glVertex4fv(v_s); } #//!!! Do we really need this? It duplicates glVertex4f #//# glVertex4fv_p($x, $y, $z, $w); 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); } #//# glVertex4i($x, $y, $z, $w); void glVertex4i(x, y, z, w) GLint x GLint y GLint z GLint w #//# glVertex4iv_c((CPTR)v); void glVertex4iv_c(v) void * v CODE: glVertex4iv(v); #//# glVertex4iv_s((PACKED)v); void glVertex4iv_s(v) SV * v CODE: { GLint * v_s = EL(v, sizeof(GLint)*4); glVertex4iv(v_s); } #//!!! Do we really need this? It duplicates glVertex4i #//# glVertex4iv_p($x, $y, $z, $w); 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); } #//# glVertex4s($x, $y, $z, $w); void glVertex4s(x, y, z, w) GLshort x GLshort y GLshort z GLshort w #//# glVertex4sv_s((PACKED)v); void glVertex4sv_s(v) SV * v CODE: { GLshort * v_s = EL(v, sizeof(GLshort)*4); glVertex4sv(v_s); } #//# glVertex4sv_c((CPTR)v); void glVertex4sv_c(v) void * v CODE: glVertex4sv(v); #//!!! Do we really need this? It duplicates glVertex4s #//# glVertex4sv_p($x, $y, $z, $w); 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); } #//# glNormal3b($nx, $ny, $nz); void glNormal3b(nx, ny, nz) GLbyte nx GLbyte ny GLbyte nz #//# glNormal3bv_c((CPTR)v); void glNormal3bv_c(v) void * v CODE: glNormal3bv(v); #//# glNormal3bv_s((PACKED)v); void glNormal3bv_s(v) SV * v CODE: { GLbyte * v_s = EL(v, sizeof(GLbyte)*3); glNormal3bv(v_s); } #//!!! Do we really need this? It duplicates glNormal3b #//# glNormal3bv_p($nx, $ny, $nz); 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); } #//# glNormal3d($nx, $ny, $nz); void glNormal3d(nx, ny, nz) GLdouble nx GLdouble ny GLdouble nz #//# glNormal3dv_c((CPTR)v); void glNormal3dv_c(v) void * v CODE: glNormal3dv(v); #//# glNormal3dv_s((PACKED)v); void glNormal3dv_s(v) SV * v CODE: { GLdouble * v_s = EL(v, sizeof(GLdouble)*3); glNormal3dv(v_s); } #//!!! Do we really need this? It duplicates glNormal3d #//# glNormal3dv_p($nx, $ny, $nz); 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); } #//# glNormal3f($nx, $ny, $nz); void glNormal3f(nx, ny, nz) GLfloat nx GLfloat ny GLfloat nz #//# glNormal3fv_c((CPTR)v); void glNormal3fv_c(v) void * v CODE: glNormal3fv(v); #//# glNormal3fv_s((PACKED)v); void glNormal3fv_s(v) SV * v CODE: { GLfloat * v_s = EL(v, sizeof(GLfloat)*3); glNormal3fv(v_s); } #//!!! Do we really need this? It duplicates glNormal3f #//# glNormal3fv_p($nx, $ny, $nz); 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); } #//# glNormal3i($nx, $ny, $nz); void glNormal3i(nx, ny, nz) GLint nx GLint ny GLint nz #//# glNormal3iv_c((CPTR)v); void glNormal3iv_c(v) void * v CODE: glNormal3iv(v); #//# glNormal3iv_s((PACKED)v); void glNormal3iv_s(v) SV * v CODE: { GLint * v_s = EL(v, sizeof(GLint)*3); glNormal3iv(v_s); } #//!!! Do we really need this? It duplicates glNormal3i #//# glNormal3iv_p($nx, $ny, $nz); 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); } #//# glNormal3s($nx, $ny, $nz); void glNormal3s(nx, ny, nz) GLshort nx GLshort ny GLshort nz #//# glNormal3sv_c((CPTR)v); void glNormal3sv_c(v) void * v CODE: glNormal3sv(v); #//# glNormal3sv_s((PACKED)v); void glNormal3sv_s(v) SV * v CODE: { GLshort * v_s = EL(v, sizeof(GLshort)*3); glNormal3sv(v_s); } #//!!! Do we really need this? It duplicates glNormal3s #//# glNormal3sv_p($nx, $ny, $nz); 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); } #//# glColor3b($red, $green, $blue); void glColor3b(red, green, blue) GLbyte red GLbyte green GLbyte blue #//# glColor3bv_c((CPTR)v); void glColor3bv_c(v) void * v CODE: glColor3bv(v); #//# glColor3bv_s((PACKED)v); void glColor3bv_s(v) SV * v CODE: { GLbyte * v_s = EL(v, sizeof(GLbyte)*3); glColor3bv(v_s); } #//!!! Do we really need this? It duplicates glColor3b #//# glColor3bv_p($red, $green, $blue); 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); } #//# glColor3d($red, $green, $blue); void glColor3d(red, green, blue) GLdouble red GLdouble green GLdouble blue #//# glColor3dv_c((CPTR)v); void glColor3dv_c(v) void * v CODE: glColor3dv(v); #//# glColor3dv_s((PACKED)v); void glColor3dv_s(v) SV * v CODE: { GLdouble * v_s = EL(v, sizeof(GLdouble)*3); glColor3dv(v_s); } #//!!! Do we really need this? It duplicates glColor3d #//# glColor3dv_p($red, $green, $blue); 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); } #//# glColor3f($red, $green, $blue); void glColor3f(red, green, blue) GLfloat red GLfloat green GLfloat blue #//# glColor3fv_c((CPTR)v); void glColor3fv_c(v) void * v CODE: glColor3fv(v); #//# glColor3fv_s((PACKED)v); void glColor3fv_s(v) SV * v CODE: { GLfloat * v_s = EL(v, sizeof(GLfloat)*3); glColor3fv(v_s); } #//!!! Do we really need this? It duplicates glColor3s #//# glColor3sv_p($red, $green, $blue); 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); } #//# glColor3i($red, $green, $blue); void glColor3i(red, green, blue) GLint red GLint green GLint blue #//# glColor3iv_c((CPTR)v); void glColor3iv_c(v) void * v CODE: glColor3iv(v); #//# glColor3iv_s((PACKED)v); void glColor3iv_s(v) SV * v CODE: { GLint * v_s = EL(v, sizeof(GLint)*3); glColor3iv(v_s); } #//!!! Do we really need this? It duplicates glColor3i #//# glColor3iv_p($red, $green, $blue); 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); } #//# glColor3s($red, $green, $blue); void glColor3s(red, green, blue) GLshort red GLshort green GLshort blue #//# glColor3sv_c((CPTR)v); void glColor3sv_c(v) void * v CODE: glColor3sv(v); #//# glColor3sv_s((PACKED)v); void glColor3sv_s(v) SV * v CODE: { GLshort * v_s = EL(v, sizeof(GLshort)*3); glColor3sv(v_s); } #//!!! Do we really need this? It duplicates glColor3s #//# glColor3sv_p($red, $green, $blue); 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); } #//# glColor3ub($red, $green, $blue); void glColor3ub(red, green, blue) GLubyte red GLubyte green GLubyte blue #//# glColor3ubv_c((CPTR)v); void glColor3ubv_c(v) void * v CODE: glColor3ubv(v); #//# glColor3ubv_s((PACKED)v); void glColor3ubv_s(v) SV * v CODE: { GLubyte * v_s = EL(v, sizeof(GLubyte)*3); glColor3ubv(v_s); } #//!!! Do we really need this? It duplicates glColor3ub #//# glColor3ubv_p($red, $green, $blue); 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); } #//# glColor3ui($red, $green, $blue); void glColor3ui(red, green, blue) GLuint red GLuint green GLuint blue #//# glColor3uiv_c((CPTR)v); void glColor3uiv_c(v) void * v CODE: glColor3uiv(v); #//# glColor3uiv_s((PACKED)v); void glColor3uiv_s(v) SV * v CODE: { GLuint * v_s = EL(v, sizeof(GLuint)*3); glColor3uiv(v_s); } #//!!! Do we really need this? It duplicates glColor3ui #//# glColor3uiv_p($red, $green, $blue); 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); } #//# glColor3us($red, $green, $blue); void glColor3us(red, green, blue) GLushort red GLushort green GLushort blue #//# glColor3usv_c((CPTR)v); void glColor3usv_c(v) void * v CODE: glColor3usv(v); #//# glColor3usv_s((PACKED)v); void glColor3usv_s(v) SV * v CODE: { GLushort * v_s = EL(v, sizeof(GLushort)*3); glColor3usv(v_s); } #//!!! Do we really need this? It duplicates glColor3us #//# glColor3usv_p($red, $green, $blue); 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); } #//# glColor4b($red, $green, $blue, $alpha); void glColor4b(red, green, blue, alpha) GLbyte red GLbyte green GLbyte blue GLbyte alpha #//# glColor4bv_c((CPTR)v); void glColor4bv_c(v) void * v CODE: glColor4bv(v); #//# glColor4bv_s((PACKED)v); void glColor4bv_s(v) SV * v CODE: { GLbyte * v_s = EL(v, sizeof(GLbyte)*4); glColor4bv(v_s); } #//!!! Do we really need this? It duplicates glColor3b #//# glColor3bv_p($red, $green, $blue, $alpha); 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); } #//# glColor4d($red, $green, $blue, $alpha); void glColor4d(red, green, blue, alpha) GLdouble red GLdouble green GLdouble blue GLdouble alpha #//# glColor4dv_c((CPTR)v); void glColor4dv_c(v) void * v CODE: glColor4dv(v); #//# glColor4dv_s((PACKED)v); void glColor4dv_s(v) SV * v CODE: { GLdouble * v_s = EL(v, sizeof(GLdouble)*4); glColor4dv(v_s); } #//!!! Do we really need this? It duplicates glColor3d #//# glColor3dv_p($red, $green, $blue, $alpha); 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); } #//# glColor4f($red, $green, $blue, $alpha); void glColor4f(red, green, blue, alpha) GLfloat red GLfloat green GLfloat blue GLfloat alpha #//# glColor4fv_c((CPTR)v); void glColor4fv_c(v) void * v CODE: glColor4fv(v); #//# glColor4fv_s((PACKED)v); void glColor4fv_s(v) SV * v CODE: { GLfloat * v_s = EL(v, sizeof(GLfloat)*4); glColor4fv(v_s); } #//!!! Do we really need this? It duplicates glColor3f #//# glColor3fv_p($red, $green, $blue, $alpha); 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); } #//# glColor4i($red, $green, $blue, $alpha); void glColor4i(red, green, blue, alpha) GLint red GLint green GLint blue GLint alpha #//# glColor4iv_c((CPTR)v); void glColor4iv_c(v) void * v CODE: glColor4iv(v); #//# glColor4iv_s((PACKED)v); void glColor4iv_s(v) SV * v CODE: { GLint * v_s = EL(v, sizeof(GLint)*4); glColor4iv(v_s); } #//!!! Do we really need this? It duplicates glColor3i #//# glColor3iv_p($red, $green, $blue, $alpha); 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); } #//# glColor4s($red, $green, $blue, $alpha); void glColor4s(red, green, blue, alpha) GLshort red GLshort green GLshort blue GLshort alpha #//# glColor4sv_c((CPTR)v); void glColor4sv_c(v) void * v CODE: glColor4sv(v); #//# glColor4sv_s((PACKED)v); void glColor4sv_s(v) SV * v CODE: { GLshort * v_s = EL(v, sizeof(GLshort)*4); glColor4sv(v_s); } #//!!! Do we really need this? It duplicates glColor3s #//# glColor3sv_p($red, $green, $blue, $alpha); 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); } #//# glColor4ub(red, green, blue, alpha); void glColor4ub(red, green, blue, alpha) GLubyte red GLubyte green GLubyte blue GLubyte alpha #//# glColor4ubv_c((CPTR)v); void glColor4ubv_c(v) void * v CODE: glColor4ubv(v); #//# glColor4ubv_s((PACKED)v); void glColor4ubv_s(v) SV * v CODE: { GLubyte * v_s = EL(v, sizeof(GLubyte)*4); glColor4ubv(v_s); } #//!!! Do we really need this? It duplicates glColor3ub #//# glColor3ubv_p($red, $green, $blue, $alpha); 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); } #//# glColor4ui($red, $green, $blue, $alpha); void glColor4ui(red, green, blue, alpha) GLuint red GLuint green GLuint blue GLuint alpha #//# glColor4uiv_s((PACKED)v); void glColor4uiv_s(v) SV * v CODE: { GLuint * v_s = EL(v, sizeof(GLuint)*4); glColor4uiv(v_s); } #//# glColor4uiv_c((CPTR)v); void glColor4uiv_c(v) void * v CODE: glColor4uiv(v); #//!!! Do we really need this? It duplicates glColor3ui #//# glColor3uiv_p($red, $green, $blue, $alpha); 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); } #//# glColor4us($red, $green, $blue, $alpha); void glColor4us(red, green, blue, alpha) GLushort red GLushort green GLushort blue GLushort alpha #//# glColor4usv_c((CPTR)v); void glColor4usv_c(v) void * v CODE: glColor4usv(v); #//# glColor4usv_s((PACKED)v); void glColor4usv_s(v) SV * v CODE: { GLushort * v_s = EL(v, sizeof(GLushort)*4); glColor4usv(v_s); } #//!!! Do we really need this? It duplicates glColor3us #//# glColor3usv_p($red, $green, $blue, $alpha); 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); } #//# glTexCoord1d($s); void glTexCoord1d(s) GLdouble s #//# glTexCoord1dv_c((CPTR)v); void glTexCoord1dv_c(v) void * v CODE: glTexCoord1dv(v); #//# glTexCoord1dv_c((PACKED)v); void glTexCoord1dv_s(v) SV * v CODE: { GLdouble * v_s = EL(v, sizeof(GLdouble)*1); glTexCoord1dv(v_s); } #//!!! Do we really need this? It duplicates glTexCoord1d #//# glTexCoord1dv_p($s); void glTexCoord1dv_p(s) GLdouble s CODE: { GLdouble param[1]; param[0] = s; glTexCoord1dv(param); } #//# glTexCoord1f($s); void glTexCoord1f(s) GLfloat s #//# glTexCoord1fv_c((CPTR)v); void glTexCoord1fv_c(v) void * v CODE: glTexCoord1fv(v); #//# glTexCoord1fv_s((PACKED)v); void glTexCoord1fv_s(v) SV * v CODE: { GLfloat * v_s = EL(v, sizeof(GLfloat)*1); glTexCoord1fv(v_s); } #//!!! Do we really need this? It duplicates glTexCoord1f #//# glTexCoord1fv_p($s); void glTexCoord1fv_p(s) GLfloat s CODE: { GLfloat param[1]; param[0] = s; glTexCoord1fv(param); } #//# glTexCoord1i($s); void glTexCoord1i(s) GLint s #//# glTexCoord1iv_c((CPTR)v); void glTexCoord1iv_c(v) void * v CODE: glTexCoord1iv(v); #//# glTexCoord1iv_s((PACKED)v); void glTexCoord1iv_s(v) SV * v CODE: { GLint * v_s = EL(v, sizeof(GLint)*1); glTexCoord1iv(v_s); } #//!!! Do we really need this? It duplicates glTexCoord1i #//# glTexCoord1iv_p($s); void glTexCoord1iv_p(s) GLint s CODE: { GLint param[1]; param[0] = s; glTexCoord1iv(param); } #//# glTexCoord1s($s); void glTexCoord1s(s) GLshort s #//# glTexCoord1sv_c((CPTR)v) void glTexCoord1sv_c(v) void * v CODE: glTexCoord1sv(v); #//# glTexCoord1sv_s((PACKED)v) void glTexCoord1sv_s(v) SV * v CODE: { GLshort * v_s = EL(v, sizeof(GLshort)*1); glTexCoord1sv(v_s); } #//!!! Do we really need this? It duplicates glTexCoord1s #//# glTexCoord1sv_p($s); void glTexCoord1sv_p(s) GLshort s CODE: { GLshort param[1]; param[0] = s; glTexCoord1sv(param); } #//# glTexCoord2d($s, $t); void glTexCoord2d(s, t) GLdouble s GLdouble t #//# glTexCoord2dv_c((CPTR)v); void glTexCoord2dv_c(v) void * v CODE: glTexCoord2dv(v); #//# glTexCoord2dv_s((PACKED)v); void glTexCoord2dv_s(v) SV * v CODE: { GLdouble * v_s = EL(v, sizeof(GLdouble)*2); glTexCoord2dv(v_s); } #//!!! Do we really need this? It duplicates glTexCoord2d #//# glTexCoord2dv_p($s, $t); void glTexCoord2dv_p(s, t) GLdouble s GLdouble t CODE: { GLdouble param[2]; param[0] = s; param[1] = t; glTexCoord2dv(param); } #//# glTexCoord2f($s, $t); void glTexCoord2f(s, t) GLfloat s GLfloat t #//# glTexCoord2fv_c((CPTR)v); void glTexCoord2fv_c(v) void * v CODE: glTexCoord2fv(v); #//# glTexCoord2fv_s((PACKED)v); void glTexCoord2fv_s(v) SV * v CODE: { GLfloat * v_s = EL(v, sizeof(GLfloat)*2); glTexCoord2fv(v_s); } #//!!! Do we really need this? It duplicates glTexCoord2f #//# glTexCoord2fv_p($s, $t); void glTexCoord2fv_p(s, t) GLfloat s GLfloat t CODE: { GLfloat param[2]; param[0] = s; param[1] = t; glTexCoord2fv(param); } #//# glTexCoord2i($s, $t); void glTexCoord2i(s, t) GLint s GLint t #//# glTexCoord2iv_c((CPTR)v); void glTexCoord2iv_c(v) void * v CODE: glTexCoord2iv(v); #//# glTexCoord2iv_s((PACKED)v); void glTexCoord2iv_s(v) SV * v CODE: { GLint * v_s = EL(v, sizeof(GLint)*2); glTexCoord2iv(v_s); } #//!!! Do we really need this? It duplicates glTexCoord2i #//# glTexCoord2iv_p($s, $t); void glTexCoord2iv_p(s, t) GLint s GLint t CODE: { GLint param[2]; param[0] = s; param[1] = t; glTexCoord2iv(param); } #//# glTexCoord2s($s, $t); void glTexCoord2s(s, t) GLshort s GLshort t #//# glTexCoord2sv_c((CPTR)v); void glTexCoord2sv_c(v) void * v CODE: glTexCoord2sv(v); #//# glTexCoord2sv_c((PACKED)v); void glTexCoord2sv_s(v) SV * v CODE: { GLshort * v_s = EL(v, sizeof(GLshort)*2); glTexCoord2sv(v_s); } #//!!! Do we really need this? It duplicates glTexCoord2s #//# glTexCoord2sv_p($s, $t); void glTexCoord2sv_p(s, t) GLshort s GLshort t CODE: { GLshort param[2]; param[0] = s; param[1] = t; glTexCoord2sv(param); } #//# glTexCoord3d($s, $t, $r); void glTexCoord3d(s, t, r) GLdouble s GLdouble t GLdouble r #//# glTexCoord3dv_c((CPTR)v); void glTexCoord3dv_c(v) void * v CODE: glTexCoord3dv(v); #//# glTexCoord3dv_s((PACKED)v); void glTexCoord3dv_s(v) SV * v CODE: { GLdouble * v_s = EL(v, sizeof(GLdouble)*3); glTexCoord3dv(v_s); } #//!!! Do we really need this? It duplicates glTexCoord3d #//# glTexCoord3dv_p($s, $t, $r); 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); } #//# glTexCoord3f($s, $t, $r); void glTexCoord3f(s, t, r) GLfloat s GLfloat t GLfloat r #//# glTexCoord3fv_c((CPTR)v); void glTexCoord3fv_c(v) void * v CODE: glTexCoord3fv(v); #//# glTexCoord3fv_s((PACKED)v); void glTexCoord3fv_s(v) SV * v CODE: { GLfloat * v_s = EL(v, sizeof(GLfloat)*3); glTexCoord3fv(v_s); } #//!!! Do we really need this? It duplicates glTexCoord3f #//# glTexCoord3fv_p($s, $t, $r); 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); } #//# glTexCoord3i($s, $t, $r); void glTexCoord3i(s, t, r) GLint s GLint t GLint r #//# glTexCoord3iv_c((CPTR)v); void glTexCoord3iv_c(v) void * v CODE: glTexCoord3iv(v); #//# glTexCoord3iv_s((PACKED)v); void glTexCoord3iv_s(v) SV * v CODE: { GLint * v_s = EL(v, sizeof(GLint)*3); glTexCoord3iv(v_s); } #//!!! Do we really need this? It duplicates glTexCoord3i #//# glTexCoord3iv_p($s, $t, $r); 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); } #//# glTexCoord3s($s, $t, $r); void glTexCoord3s(s, t, r) GLshort s GLshort t GLshort r #//# glTexCoord3sv_s((PACKED)v); void glTexCoord3sv_s(v) SV * v CODE: { GLshort * v_s = EL(v, sizeof(GLshort)*3); glTexCoord3sv(v_s); } #//# glTexCoord3sv_c((CPTR)v); void glTexCoord3sv_c(v) void * v CODE: glTexCoord3sv(v); #//!!! Do we really need this? It duplicates glTexCoord3s #//# glTexCoord3sv_p($s, $t, $r); 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); } #//# glTexCoord4d($s, $t, $r, $q); void glTexCoord4d(s, t, r, q) GLdouble s GLdouble t GLdouble r GLdouble q #//# glTexCoord4dv_c((CPTR)v); void glTexCoord4dv_c(v) void * v CODE: glTexCoord4dv(v); #//# glTexCoord4dv_s((PACKED)v); void glTexCoord4dv_s(v) SV * v CODE: { GLdouble * v_s = EL(v, sizeof(GLdouble)*4); glTexCoord4dv(v_s); } #//!!! Do we really need this? It duplicates glTexCoord4d #//# glTexCoord4dv_p($s, $t, $r, $q); 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); } #//# glTexCoord4f($s, $t, $r, $q); void glTexCoord4f(s, t, r, q) GLfloat s GLfloat t GLfloat r GLfloat q #//# glTexCoord4fv_c((CPTR)v); void glTexCoord4fv_c(v) void * v CODE: glTexCoord4fv(v); #//# glTexCoord4fv_s((PACKED)v); void glTexCoord4fv_s(v) SV * v CODE: { GLfloat * v_s = EL(v, sizeof(GLfloat)*4); glTexCoord4fv(v_s); } #//!!! Do we really need this? It duplicates glTexCoord4f #//# glTexCoord4fv_p($s, $t, $r, $q); 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); } #//# glTexCoord4i($s, $t, $r, $q); void glTexCoord4i(s, t, r, q) GLint s GLint t GLint r GLint q #//# glTexCoord4iv_c((CPTR)v); void glTexCoord4iv_c(v) void * v CODE: glTexCoord4iv(v); #//# glTexCoord4iv_s((PACKED)v); void glTexCoord4iv_s(v) SV * v CODE: { GLint * v_s = EL(v, sizeof(GLint)*4); glTexCoord4iv(v_s); } #//!!! Do we really need this? It duplicates glTexCoord4i #//# glTexCoord4iv_p($s, $t, $r, $q); 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); } #//# glTexCoord4s($s, $t, $r, $q); void glTexCoord4s(s, t, r, q) GLshort s GLshort t GLshort r GLshort q #//# glTexCoord4sv_c((CPTR)v); void glTexCoord4sv_c(v) void * v CODE: glTexCoord4sv(v); #//# glTexCoord4sv_s((PACKED)v); void glTexCoord4sv_s(v) SV * v CODE: { GLshort * v_s = EL(v, sizeof(GLshort)*4); glTexCoord4sv(v_s); } #//!!! Do we really need this? It duplicates glTexCoord4s #//# glTexCoord4sv_p($s, $t, $r, $q); 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); } #//# glRasterPos2d(x, y); void glRasterPos2d(x, y) GLdouble x GLdouble y #//# glRasterPos2dv_c((CPTR)v); void glRasterPos2dv_c(v) void * v CODE: glRasterPos2dv(v); #//# glRasterPos2dv_s((PACKED)v); void glRasterPos2dv_s(v) SV * v CODE: { GLdouble * v_s = EL(v, sizeof(GLdouble)*2); glRasterPos2dv(v_s); } #//!!! Do we really need this? It duplicates glRasterPos2d #//# glRasterPos2dv_p($x, $y); void glRasterPos2dv_p(x, y) GLdouble x GLdouble y CODE: { GLdouble param[2]; param[0] = x; param[1] = y; glRasterPos2dv(param); } #//# glRasterPos2f($x, $y); void glRasterPos2f(x, y) GLfloat x GLfloat y #//# glRasterPos2fv_c((CPTR)v); void glRasterPos2fv_c(v) void * v CODE: glRasterPos2fv(v); #//# glRasterPos2fv_s((PACKED)v); void glRasterPos2fv_s(v) SV * v CODE: { GLfloat * v_s = EL(v, sizeof(GLfloat)*2); glRasterPos2fv(v_s); } #//!!! Do we really need this? It duplicates glRasterPos2f #//# glRasterPos2fv_p($x, $y); void glRasterPos2fv_p(x, y) GLfloat x GLfloat y CODE: { GLfloat param[2]; param[0] = x; param[1] = y; glRasterPos2fv(param); } #//# glRasterPos2i($x, $y); void glRasterPos2i(x, y) GLint x GLint y #//# glRasterPos2iv_c((CPTR)v); void glRasterPos2iv_c(v) void * v CODE: glRasterPos2iv(v); #//# glRasterPos2iv_s((PACKED)v); void glRasterPos2iv_s(v) SV * v CODE: { GLint * v_s = EL(v, sizeof(GLint)*2); glRasterPos2iv(v_s); } #//!!! Do we really need this? It duplicates glRasterPos2i #//# glRasterPos2iv_p($x, $y); void glRasterPos2iv_p(x, y) GLint x GLint y CODE: { GLint param[2]; param[0] = x; param[1] = y; glRasterPos2iv(param); } #//# glRasterPos2s($x, $y); void glRasterPos2s(x, y) GLshort x GLshort y #//# glRasterPos2sv_c((CPTR)v); void glRasterPos2sv_c(v) void * v CODE: glRasterPos2sv(v); #//# glRasterPos2sv_s((PACKED)v); void glRasterPos2sv_s(v) SV * v CODE: { GLshort * v_s = EL(v, sizeof(GLshort)*2); glRasterPos2sv(v_s); } #//!!! Do we really need this? It duplicates glRasterPos2s #//# glRasterPos2sv_p($x, $y); void glRasterPos2sv_p(x, y) GLshort x GLshort y CODE: { GLshort param[2]; param[0] = x; param[1] = y; glRasterPos2sv(param); } #//# glRasterPos3d($x, $y, $z); void glRasterPos3d(x, y, z) GLdouble x GLdouble y GLdouble z #//# glRasterPos3dv_c((CPTR)v); void glRasterPos3dv_c(v) void * v CODE: glRasterPos3dv(v); #//# glRasterPos3dv_s((PACKED)v); void glRasterPos3dv_s(v) SV * v CODE: { GLdouble * v_s = EL(v, sizeof(GLdouble)*3); glRasterPos3dv(v_s); } #//!!! Do we really need this? It duplicates glRasterPos3d #//# glRasterPos3dv_p($x, $y, $z); 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); } #//# glRasterPos3f($x, $y, $z); void glRasterPos3f(x, y, z) GLfloat x GLfloat y GLfloat z #//# glRasterPos3fv_c((CPTR)v); void glRasterPos3fv_c(v) void * v CODE: glRasterPos3fv(v); #//# glRasterPos3fv_s((PACKED)v); void glRasterPos3fv_s(v) SV * v CODE: { GLfloat * v_s = EL(v, sizeof(GLfloat)*3); glRasterPos3fv(v_s); } #//!!! Do we really need this? It duplicates glRasterPos3f #//# glRasterPos3fv_p($x, $y, $z); 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); } #//# glRasterPos3i($x, $y, $z); void glRasterPos3i(x, y, z) GLint x GLint y GLint z #//# glRasterPos3iv_c((CPTR)v); void glRasterPos3iv_c(v) void * v CODE: glRasterPos3iv(v); #//# glRasterPos3iv_s((PACKED)v); void glRasterPos3iv_s(v) SV * v CODE: { GLint * v_s = EL(v, sizeof(GLint)*3); glRasterPos3iv(v_s); } #//!!! Do we really need this? It duplicates glRasterPos3i #//# glRasterPos3iv_p($x, $y, $z); 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); } #//# glRasterPos3s($x, $y, $z); void glRasterPos3s(x, y, z) GLshort x GLshort y GLshort z #//# glRasterPos3sv_c((CPTR)v); void glRasterPos3sv_c(v) void * v CODE: glRasterPos3sv(v); #//# glRasterPos3sv_s((PACKED)v); void glRasterPos3sv_s(v) SV * v CODE: { GLshort * v_s = EL(v, sizeof(GLshort)*3); glRasterPos3sv(v_s); } #//!!! Do we really need this? It duplicates glRasterPos3s #//# glRasterPos3sv_p($x, $y, $z); 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); } #//# glRasterPos4d($x, $y, $z, $w); void glRasterPos4d(x, y, z, w) GLdouble x GLdouble y GLdouble z GLdouble w #//# glRasterPos4dv_c((CPTR)v); void glRasterPos4dv_c(v) void * v CODE: glRasterPos4dv(v); #//# glRasterPos4dv_s((PACKED)v); void glRasterPos4dv_s(v) SV * v CODE: { GLdouble * v_s = EL(v, sizeof(GLdouble)*4); glRasterPos4dv(v_s); } #//!!! Do we really need this? It duplicates glRasterPos4d #//# glRasterPos4dv_p($x, $y, $z, $w); 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); } #//# glRasterPos4f($x, $y, $z, $w); void glRasterPos4f(x, y, z, w) GLfloat x GLfloat y GLfloat z GLfloat w #//# glRasterPos4fv_c((CPTR)v); void glRasterPos4fv_c(v) void * v CODE: glRasterPos4fv(v); #//# glRasterPos4fv_s((PACKED)v); void glRasterPos4fv_s(v) SV * v CODE: { GLfloat * v_s = EL(v, sizeof(GLfloat)*4); glRasterPos4fv(v_s); } #//!!! Do we really need this? It duplicates glRasterPos4f #//# glRasterPos4fv_p($x, $y, $z, $w); 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); } #//# glRasterPos4i($x, $y, $z, $w); void glRasterPos4i(x, y, z, w) GLint x GLint y GLint z GLint w #//# glRasterPos4iv_c((CPTR)v); void glRasterPos4iv_c(v) void * v CODE: glRasterPos4iv(v); #//# glRasterPos4iv_s((PACKED)v); void glRasterPos4iv_s(v) SV * v CODE: { GLint * v_s = EL(v, sizeof(GLint)*4); glRasterPos4iv(v_s); } #//!!! Do we really need this? It duplicates glRasterPos4i #//# glRasterPos4iv_p($x, $y, $z, $w); 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); } #//# glRasterPos4s($x, $y, $z, $w); void glRasterPos4s(x, y, z, w) GLshort x GLshort y GLshort z GLshort w #//# glRasterPos4sv_c((CPTR)v); void glRasterPos4sv_c(v) void * v CODE: glRasterPos4sv(v); #//# glRasterPos4sv_s((PACKED)v); void glRasterPos4sv_s(v) SV * v CODE: { GLshort * v_s = EL(v, sizeof(GLshort)*4); glRasterPos4sv(v_s); } #//!!! Do we really need this? It duplicates glRasterPos4s #//# glRasterPos4sv_p($x, $y, $z, $w); 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 #// glPolygonOffsetEXT($factor, $bias); void glPolygonOffsetEXT(factor, bias) GLfloat factor GLfloat units #endif #ifdef GL_EXT_texture_object #// glIsTextureEXT($list); GLboolean glIsTextureEXT(list) GLuint list #// glPrioritizeTexturesEXT_p(@textureIDs,@priorities); 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;ibind); } glVertexPointerEXT(size, oga->types[0], 0, oga->item_count/size, oga->bind ? 0 : oga->data); #else glVertexPointerEXT(size, oga->types[0], 0, oga->item_count/size, oga->data); #endif } #//# glNormalPointerEXT_c($type, $stride, $count, (CPTR)pointer); 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); #//# glNormalPointerEXT_s($type, $stride, $count, (PACKED)pointer); void glNormalPointerEXT_s(type, stride, count, pointer) GLenum type GLsizei stride GLsizei count SV * pointer INIT: loadProc(glNormalPointerEXT,"glNormalPointerEXT"); CODE: { int width = stride ? stride : (sizeof(type)*3); void * pointer_s = EL(pointer, width*count); glNormalPointerEXT(type, stride, count, pointer_s); } #//# glNormalPointerEXT_p((OGA)pointer); void glNormalPointerEXT_p(oga) OpenGL::Array oga INIT: loadProc(glNormalPointerEXT,"glNormalPointerEXT"); CODE: { #ifdef GL_ARB_vertex_buffer_object if (testProc(glBindBufferARB,"glBindBufferARB")) { glBindBufferARB(GL_ARRAY_BUFFER_ARB, oga->bind); } glNormalPointerEXT(oga->types[0], 0, oga->item_count/3, oga->bind ? 0 : oga->data); #else glNormalPointerEXT(oga->types[0], 0, oga->item_count/3, oga->data); #endif } #//# glColorPointerEXT_c($size, $type, $stride, $count, (CPTR)pointer); 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); #//# glColorPointerEXT_s($size, $type, $stride, $count, (PACKED)pointer); void glColorPointerEXT_s(size, type, stride, count, pointer) GLint size GLenum type GLsizei stride GLsizei count SV * pointer INIT: loadProc(glColorPointerEXT,"glColorPointerEXT"); CODE: { int width = stride ? stride : (sizeof(type)*size); void * pointer_s = EL(pointer, width*count); glColorPointerEXT(size, type, stride, count, pointer_s); } #//# glColorPointerEXT_p($size, (OGA)pointer); void glColorPointerEXT_p(size, oga) GLint size OpenGL::Array oga INIT: loadProc(glColorPointerEXT,"glColorPointerEXT"); CODE: { #ifdef GL_ARB_vertex_buffer_object if (testProc(glBindBufferARB,"glBindBufferARB")) { glBindBufferARB(GL_ARRAY_BUFFER_ARB, oga->bind); } glColorPointerEXT(size, oga->types[0], 0, oga->item_count/size, oga->bind ? 0 : oga->data); #else glColorPointerEXT(size, oga->types[0], 0, oga->item_count/size, oga->data); #endif } #//# glIndexPointerEXT_c($type, $stride, $count, (CPTR)pointer); 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); #//# glIndexPointerEXT_s($type, $stride, $count, (PACKED)pointer); void glIndexPointerEXT_s(type, stride, count, pointer) GLenum type GLsizei stride GLsizei count SV * pointer INIT: loadProc(glIndexPointerEXT,"glIndexPointerEXT"); CODE: { int width = stride ? stride : (sizeof(type)); void * pointer_s = EL(pointer, width*count); glIndexPointerEXT(type, stride, count, pointer_s); } #//# glIndexPointerEXT_p((OGA)pointer); void glIndexPointerEXT_p(oga) OpenGL::Array oga INIT: loadProc(glIndexPointerEXT,"glIndexPointerEXT"); CODE: { #ifdef GL_ARB_vertex_buffer_object if (testProc(glBindBufferARB,"glBindBufferARB")) { glBindBufferARB(GL_ARRAY_BUFFER_ARB, oga->bind); } glIndexPointerEXT(oga->types[0], 0, oga->item_count, oga->bind ? 0 : oga->data); #else glIndexPointerEXT(oga->types[0], 0, oga->item_count, oga->data); #endif } #//# glTexCoordPointerEXT_c($size, $type, $stride, $count, (CPTR)pointer); 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); #//# glTexCoordPointerEXT_s($size, $type, $stride, $count, (PACKED)pointer); void glTexCoordPointerEXT_s(size, type, stride, count, pointer) GLint size GLenum type GLsizei stride GLsizei count SV * pointer INIT: loadProc(glTexCoordPointerEXT,"glTexCoordPointerEXT"); CODE: { int width = stride ? stride : (sizeof(type)*size); void * pointer_s = EL(pointer, width*count); glTexCoordPointerEXT(size, type, stride, count, pointer_s); } #//# glTexCoordPointerEXT_p($size, (OGA)pointer); void glTexCoordPointerEXT_p(size, oga) GLint size OpenGL::Array oga INIT: loadProc(glTexCoordPointerEXT,"glTexCoordPointerEXT"); CODE: { #ifdef GL_ARB_vertex_buffer_object if (testProc(glBindBufferARB,"glBindBufferARB")) { glBindBufferARB(GL_ARRAY_BUFFER_ARB, oga->bind); } glTexCoordPointerEXT(size, oga->types[0], 0, oga->item_count/size, oga->bind ? 0 : oga->data); #else glTexCoordPointerEXT(size, oga->types[0], 0, oga->item_count/size, oga->data); #endif } #//# glEdgeFlagPointerEXT_c($stride, $count, (CPTR)pointer); void glEdgeFlagPointerEXT_c(stride, count, pointer) GLint stride GLsizei count void * pointer INIT: loadProc(glEdgeFlagPointerEXT,"glEdgeFlagPointerEXT"); CODE: glEdgeFlagPointerEXT(stride, count, pointer); #//# glEdgeFlagPointerEXT_s($stride, $count, (PACKED)pointer); void glEdgeFlagPointerEXT_s(stride, count, pointer) GLsizei stride GLsizei count SV * pointer INIT: loadProc(glEdgeFlagPointerEXT,"glEdgeFlagPointerEXT"); CODE: { int width = stride ? stride : (sizeof(GLboolean)); void * pointer_s = EL(pointer, width*count); glEdgeFlagPointerEXT(stride, count, pointer_s); } #//# glEdgeFlagPointerEXT_p((OGA)pointer); void glEdgeFlagPointerEXT_p(oga) OpenGL::Array oga INIT: loadProc(glEdgeFlagPointerEXT,"glEdgeFlagPointerEXT"); CODE: { #ifdef GL_ARB_vertex_buffer_object if (testProc(glBindBufferARB,"glBindBufferARB")) { glBindBufferARB(GL_ARRAY_BUFFER_ARB, oga->bind); } glEdgeFlagPointerEXT(0, oga->item_count, oga->bind ? 0 : oga->data); #else glEdgeFlagPointerEXT(0, oga->item_count, oga->data); #endif } #endif #ifdef GL_MESA_window_pos #// glWindowPos2iMESA($x, $y); void glWindowPos2iMESA(x, y) GLint x GLint y #// glWindowPos2dMESA($x, $y); void glWindowPos2dMESA(x, y) GLdouble x GLdouble y #// glWindowPos3iMESA($x, $y, $z); void glWindowPos3iMESA(x, y, z) GLint x GLint y GLint z #// glWindowPos3dMESA($x, $y, $z); void glWindowPos3dMESA(x, y, z) GLdouble x GLdouble y GLdouble z #// glWindowPos4iMESA($x, $y, $z, $w); void glWindowPos4iMESA(x, y, z, w) GLint x GLint y GLint z GLint w #// glWindowPos4dMESA($x, $y, $z, $w); void glWindowPos4dMESA(x, y, z, w) GLdouble x GLdouble y GLdouble z GLdouble w #endif #ifdef GL_MESA_resize_buffers #// glResizeBuffersMESA(); void glResizeBuffersMESA() #endif #ifdef GL_ARB_draw_buffers #//# glDrawBuffersARB_c($n,(CPTR)buffers); void glDrawBuffersARB_c(n,buffers) GLsizei n void * buffers INIT: loadProc(glDrawBuffersARB,"glDrawBuffersARB"); CODE: { glDrawBuffersARB(n,buffers); } #//# glDrawBuffersARB_s($n,(PACKED)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); } #//# glDrawBuffersARB_p(@buffers); 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); } #//# glBufferSubDataARB_c($target,$offset,$size,(CPTR)data); 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); } #//# glBufferSubDataARB_s($target,$offset,$size,(PACKED)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); } #//# glBufferSubDataARB_p($target,$offset,(OGA)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); } #//# glGetBufferSubDataARB_c($target,$offset,$size,(CPTR)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); #//# glGetBufferSubDataARB_s($target,$offset,$size,(PACKED)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); } #//# $oga = glGetBufferSubDataARB_p($target,$offset,$count,@types); #//- If no types are provided, GLubyte is assumed 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 #//# (CPTR)buffer = glMapBufferARB_c($target,$access); 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 */ #//# $oga = glMapBufferARB_p($target,$access,@types); #//- If no types are provided, GLubyte is assumed 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 #//# glUnmapBufferARB($target); GLboolean glUnmapBufferARB(target) GLenum target INIT: loadProc(glUnmapBufferARB,"glUnmapBufferARB"); CODE: RETVAL = glUnmapBufferARB(target); OUTPUT: RETVAL #//# glGetBufferParameterivARB_c($target,$pname,(CPTR)params); void glGetBufferParameterivARB_c(target,pname,params) GLenum target GLenum pname void * params INIT: loadProc(glGetBufferParameterivARB,"glGetBufferParameterivARB"); CODE: glGetBufferParameterivARB(target,pname,params); #//# glGetBufferParameterivARB_s($target,$pname,(PACKED)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); } #//# @params = glGetBufferParameterivARB_p($target,$pname); 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))); } #//# glGetBufferPointervARB_c($target,$pname,(CPTR)params); void glGetBufferPointervARB_c(target,pname,params) GLenum target GLenum pname void * params INIT: loadProc(glGetBufferPointervARB,"glGetBufferPointervARB"); CODE: glGetBufferPointervARB(target,pname,¶ms); #//# glGetBufferPointervARB_s($target,$pname,(PACKED)params); 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); } #//# $oga = glGetBufferPointervARB_p($target,$pname,@types); #//- If no types are provided, GLubyte is assumed 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 #//# glActiveTextureARB($texture); void glActiveTextureARB(texture) GLenum texture INIT: loadProc(glActiveTextureARB,"glActiveTextureARB"); CODE: glActiveTextureARB(texture); #//# glClientActiveTextureARB($texture); void glClientActiveTextureARB(texture) GLenum texture INIT: loadProc(glClientActiveTextureARB,"glClientActiveTextureARB"); CODE: glClientActiveTextureARB(texture); #//# glMultiTexCoord1dARB($target,$s) void glMultiTexCoord1dARB(target,s) GLenum target GLdouble s INIT: loadProc(glMultiTexCoord1dARB,"glMultiTexCoord1dARB"); CODE: glMultiTexCoord1dARB(target,s); #//# glMultiTexCoord1dvARB_c($target,(CPTR)v); void glMultiTexCoord1dvARB_c(target,v) GLenum target void *v INIT: loadProc(glMultiTexCoord1dvARB,"glMultiTexCoord1dvARB"); CODE: glMultiTexCoord1dvARB(target,v); #//# glMultiTexCoord1dvARB_s($target,(PACKED)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); } #//!!! Do we really need this? It duplicates glMultiTexCoord1dARB #//# glMultiTexCoord1dvARB_p($target,$s); void glMultiTexCoord1dvARB_p(target,s) GLenum target GLdouble s INIT: loadProc(glMultiTexCoord1dvARB,"glMultiTexCoord1dvARB"); CODE: { glMultiTexCoord1dvARB(target,&s); } #//# glMultiTexCoord1fARB($target,$s); void glMultiTexCoord1fARB(target,s) GLenum target GLfloat s INIT: loadProc(glMultiTexCoord1fARB,"glMultiTexCoord1fARB"); CODE: glMultiTexCoord1fARB(target,s); #//# glMultiTexCoord1fvARB_c($target,(CPTR)v); void glMultiTexCoord1fvARB_c(target,v) GLenum target void *v INIT: loadProc(glMultiTexCoord1fvARB,"glMultiTexCoord1fvARB"); CODE: glMultiTexCoord1fvARB(target,v); #//# glMultiTexCoord1fvARB_s($target,(PACKED)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); } #//!!! Do we really need this? It duplicates glMultiTexCoord1fARB #//# glMultiTexCoord1fvARB_p($target,$s); void glMultiTexCoord1fvARB_p(target,s) GLenum target GLfloat s INIT: loadProc(glMultiTexCoord1fvARB,"glMultiTexCoord1fvARB"); CODE: { glMultiTexCoord1fvARB(target,&s); } #//# glMultiTexCoord1iARB($target,$s); void glMultiTexCoord1iARB(target,s) GLenum target GLint s INIT: loadProc(glMultiTexCoord1iARB,"glMultiTexCoord1iARB"); CODE: glMultiTexCoord1iARB(target,s); #//# glMultiTexCoord1ivARB_c($target,(CPTR)v); void glMultiTexCoord1ivARB_c(target,v) GLenum target void *v INIT: loadProc(glMultiTexCoord1ivARB,"glMultiTexCoord1ivARB"); CODE: glMultiTexCoord1ivARB(target,v); #//# glMultiTexCoord1ivARB_s($target,(PACKED)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); } #//!!! Do we really need this? It duplicates glMultiTexCoord1iARB #//# glMultiTexCoord1ivARB_p($target,$s); void glMultiTexCoord1ivARB_p(target,s) GLenum target GLint s INIT: loadProc(glMultiTexCoord1ivARB,"glMultiTexCoord1ivARB"); CODE: { glMultiTexCoord1ivARB(target,&s); } #//# glMultiTexCoord1sARB($target,$s); void glMultiTexCoord1sARB(target,s) GLenum target GLshort s INIT: loadProc(glMultiTexCoord1sARB,"glMultiTexCoord1sARB"); CODE: glMultiTexCoord1sARB(target,s); #//# glMultiTexCoord1svARB_c($target,(CPTR)v); void glMultiTexCoord1svARB_c(target,v) GLenum target void *v INIT: loadProc(glMultiTexCoord1svARB,"glMultiTexCoord1svARB"); CODE: glMultiTexCoord1svARB(target,v); #//# glMultiTexCoord1svARB_s($target,(PACKED)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); } #//!!! Do we really need this? It duplicates glMultiTexCoord1sARB #//# glMultiTexCoord1svARB_p($target,$s); void glMultiTexCoord1svARB_p(target,s) GLenum target GLshort s INIT: loadProc(glMultiTexCoord1svARB,"glMultiTexCoord1svARB"); CODE: { glMultiTexCoord1svARB(target,&s); } #//# glMultiTexCoord2dARB($target,$s,$t); void glMultiTexCoord2dARB(target,s,t) GLenum target GLdouble s GLdouble t INIT: loadProc(glMultiTexCoord2dARB,"glMultiTexCoord2dARB"); CODE: glMultiTexCoord2dARB(target,s,t); #//# glMultiTexCoord2dvARB_c(target,(CPTR)v); void glMultiTexCoord2dvARB_c(target,v) GLenum target void *v INIT: loadProc(glMultiTexCoord2dvARB,"glMultiTexCoord2dvARB"); CODE: glMultiTexCoord2dvARB(target,v); #//# glMultiTexCoord2dvARB_s(target,(PACKED)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); } #//!!! Do we really need this? It duplicates glMultiTexCoord2dARB #//# glMultiTexCoord2dvARB_p($target,$s,$t); 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); } #//# glMultiTexCoord2fARB($target,$s,$t); void glMultiTexCoord2fARB(target,s,t) GLenum target GLfloat s GLfloat t INIT: loadProc(glMultiTexCoord2fARB,"glMultiTexCoord2fARB"); CODE: glMultiTexCoord2fARB(target,s,t); #//# glMultiTexCoord2fvARB_c($target,(CPTR)v); void glMultiTexCoord2fvARB_c(target,v) GLenum target void *v INIT: loadProc(glMultiTexCoord2fvARB,"glMultiTexCoord2fvARB"); CODE: glMultiTexCoord2fvARB(target,v); #//# glMultiTexCoord2fvARB_s($target,(PACKED)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); } #//!!! Do we really need this? It duplicates glMultiTexCoord2fARB #//# glMultiTexCoord2fvARB_p($target,$s,$t); 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); } #//# glMultiTexCoord2iARB($target,$s,$t); void glMultiTexCoord2iARB(target,s,t) GLenum target GLint s GLint t INIT: loadProc(glMultiTexCoord2iARB,"glMultiTexCoord2iARB"); CODE: glMultiTexCoord2iARB(target,s,t); #//# glMultiTexCoord2ivARB_c($target,(CPTR)v); void glMultiTexCoord2ivARB_c(target,v) GLenum target void *v INIT: loadProc(glMultiTexCoord2ivARB,"glMultiTexCoord2ivARB"); CODE: glMultiTexCoord2ivARB(target,v); #//# glMultiTexCoord2ivARB_s($target,(PACKED)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); } #//!!! Do we really need this? It duplicates glMultiTexCoord2iARB #//# glMultiTexCoord2ivARB_p($target,$s,$t); 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); } #//# glMultiTexCoord2sARB($target,$s,$t); void glMultiTexCoord2sARB(target,s,t) GLenum target GLshort s GLshort t INIT: loadProc(glMultiTexCoord2sARB,"glMultiTexCoord2sARB"); CODE: glMultiTexCoord2sARB(target,s,t); #//# glMultiTexCoord2svARB_c($target,(CPTR)v); void glMultiTexCoord2svARB_c(target,v) GLenum target void *v INIT: loadProc(glMultiTexCoord2svARB,"glMultiTexCoord2svARB"); CODE: glMultiTexCoord2svARB(target,v); #//# glMultiTexCoord2svARB_s($target,(PACKED)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); } #//!!! Do we really need this? It duplicates glMultiTexCoord2sARB #//# glMultiTexCoord2svARB_p($target,$s,$t); 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); } #//# glMultiTexCoord3dARB($target,$s,$t,$r); void glMultiTexCoord3dARB(target,s,t,r) GLenum target GLdouble s GLdouble t GLdouble r INIT: loadProc(glMultiTexCoord3dARB,"glMultiTexCoord3dARB"); CODE: glMultiTexCoord3dARB(target,s,t,r); #//# glMultiTexCoord3dvARB_c(target,(CPTR)v); void glMultiTexCoord3dvARB_c(target,v) GLenum target void *v INIT: loadProc(glMultiTexCoord3dvARB,"glMultiTexCoord3dvARB"); CODE: glMultiTexCoord3dvARB(target,v); #//# glMultiTexCoord3dvARB_s(target,(PACKED)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); } #//!!! Do we really need this? It duplicates glMultiTexCoord3dARB #//# glMultiTexCoord3dvARB_p($target,$s,$t,$r); 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); } #//# glMultiTexCoord3fARB($target,$s,$t,$r); void glMultiTexCoord3fARB(target,s,t,r) GLenum target GLfloat s GLfloat t GLfloat r INIT: loadProc(glMultiTexCoord3fARB,"glMultiTexCoord3fARB"); CODE: glMultiTexCoord3fARB(target,s,t,r); #//# glMultiTexCoord3fvARB_c($target,(CPTR)v); void glMultiTexCoord3fvARB_c(target,v) GLenum target void *v INIT: loadProc(glMultiTexCoord3fvARB,"glMultiTexCoord3fvARB"); CODE: glMultiTexCoord3fvARB(target,v); #//# glMultiTexCoord3fvARB_s($target,(PACKED)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); } #//!!! Do we really need this? It duplicates glMultiTexCoord3fARB #//# glMultiTexCoord3fvARB_p($target,$s,$t,$r); 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); } #//# glMultiTexCoord3iARB($target,$s,$t,$r); void glMultiTexCoord3iARB(target,s,t,r) GLenum target GLint s GLint t GLint r INIT: loadProc(glMultiTexCoord3iARB,"glMultiTexCoord3iARB"); CODE: glMultiTexCoord3iARB(target,s,t,r); #//# glMultiTexCoord3ivARB_c($target,(CPTR)v); void glMultiTexCoord3ivARB_c(target,v) GLenum target void *v INIT: loadProc(glMultiTexCoord3ivARB,"glMultiTexCoord3ivARB"); CODE: glMultiTexCoord3ivARB(target,v); #//# glMultiTexCoord3ivARB_s($target,(PACKED)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); } #//!!! Do we really need this? It duplicates glMultiTexCoord3iARB #//# glMultiTexCoord3ivARB_p($target,$s,$t,$r); 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); } #//# glMultiTexCoord3sARB($target,$s,$t,$r); void glMultiTexCoord3sARB(target,s,t,r) GLenum target GLshort s GLshort t GLshort r INIT: loadProc(glMultiTexCoord3sARB,"glMultiTexCoord3sARB"); CODE: glMultiTexCoord3sARB(target,s,t,r); #//# glMultiTexCoord3svARB_c($target,(CPTR)v); void glMultiTexCoord3svARB_c(target,v) GLenum target void *v INIT: loadProc(glMultiTexCoord3svARB,"glMultiTexCoord3svARB"); CODE: glMultiTexCoord3svARB(target,v); #//# glMultiTexCoord3svARB_s($target,(PACKED)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); } #//!!! Do we really need this? It duplicates glMultiTexCoord3sARB #//# glMultiTexCoord3svARB_p($target,$s,$t,$r); 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); } #//# glMultiTexCoord4dARB($target,$s,$t,$r,$q); 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); #//# glMultiTexCoord4dvARB_c($target,(CPTR)v); void glMultiTexCoord4dvARB_c(target,v) GLenum target void *v INIT: loadProc(glMultiTexCoord4dvARB,"glMultiTexCoord4dvARB"); CODE: glMultiTexCoord4dvARB(target,v); #//# glMultiTexCoord4dvARB_s($target,(PACKED)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); } #//!!! Do we really need this? It duplicates glMultiTexCoord4dARB #//# glMultiTexCoord4dvARB_p($target,$s,$t,$r,$q); 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); } #//# glMultiTexCoord4fARB($target,$s,$t,$r,$q); 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); #//# glMultiTexCoord4fvARB_c($target,(CPTR)v); void glMultiTexCoord4fvARB_c(target,v) GLenum target void *v INIT: loadProc(glMultiTexCoord4fvARB,"glMultiTexCoord4fvARB"); CODE: glMultiTexCoord4fvARB(target,v); #//# glMultiTexCoord4fvARB_s($target,(PACKED)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); } #//!!! Do we really need this? It duplicates glMultiTexCoord4fARB #//# glMultiTexCoord4fvARB_p($target,$s,$t,$r,$q); 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); } #//# glMultiTexCoord4iARB($target,$s,$t,$r,$q) 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); #//# glMultiTexCoord4ivARB_c($target,(CPTR)v); void glMultiTexCoord4ivARB_c(target,v) GLenum target void *v INIT: loadProc(glMultiTexCoord4ivARB,"glMultiTexCoord4ivARB"); CODE: glMultiTexCoord4ivARB(target,v); #//# glMultiTexCoord4ivARB_s($target,(PACKED)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); } #//!!! Do we really need this? It duplicates glMultiTexCoord4iARB #//# glMultiTexCoord4ivARB_p($target,$s,$t,$r,$q); 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); } #//# glMultiTexCoord4sARB($target,$s,$t,$r,$q); 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); #//# glMultiTexCoord4svARB_c($target,(CPTR)v); void glMultiTexCoord4svARB_c(target,v) GLenum target void *v INIT: loadProc(glMultiTexCoord4svARB,"glMultiTexCoord4svARB"); CODE: glMultiTexCoord4svARB(target,v); #//# glMultiTexCoord4svARB_s($target,(PACKED)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); } #//!!! Do we really need this? It duplicates glMultiTexCoord4sARB #//# glMultiTexCoord4svARB_p($target,$s,$t,$r,$q); 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 #ifdef GL_ARB_shader_objects #//# glDeleteObjectARB($obj); void glDeleteObjectARB(obj) GLhandleARB obj INIT: loadProc(glDeleteObjectARB,"glDeleteObjectARB"); CODE: { glDeleteObjectARB(obj); } #//# glGetHandleARB($pname); GLhandleARB glGetHandleARB(pname) GLenum pname INIT: loadProc(glGetHandleARB,"glGetHandleARB"); CODE: { RETVAL = glGetHandleARB(pname); } OUTPUT: RETVAL #//# glDetachObjectARB($containerObj, $attachedObj); void glDetachObjectARB(containerObj, attachedObj) GLhandleARB containerObj GLhandleARB attachedObj INIT: loadProc(glDetachObjectARB,"glDetachObjectARB"); CODE: { glDetachObjectARB(containerObj, attachedObj); } #//# glCreateShaderObjectARB($shaderType); GLhandleARB glCreateShaderObjectARB(shaderType) GLenum shaderType INIT: loadProc(glCreateShaderObjectARB,"glCreateShaderObjectARB"); CODE: { RETVAL = glCreateShaderObjectARB(shaderType); } OUTPUT: RETVAL #//# glShaderSourceARB_c($shaderObj, $count, (CPTR)string, (CPTR)length); void glShaderSourceARB_c(shaderObj, count, string, length) GLhandleARB shaderObj GLsizei count void *string void *length INIT: loadProc(glShaderSourceARB,"glShaderSourceARB"); CODE: { glShaderSourceARB(shaderObj, count, string, length); } #//# glShaderSourceARB_p($shaderObj, @string); void glShaderSourceARB_p(shaderObj, ...) GLhandleARB shaderObj INIT: loadProc(glShaderSourceARB,"glShaderSourceARB"); CODE: { int i; int count = items - 1; GLcharARB **string = malloc(sizeof(GLcharARB *) * count); GLint *length = malloc(sizeof(GLint) * count); for(i=0;i> 1; GLfloat *value = malloc(sizeof(GLfloat) * elements); for(i=0;i> 2; GLfloat *value = malloc(sizeof(GLfloat) * elements); for(i=0;i> 1; GLint *value = malloc(sizeof(GLint) * elements); for(i=0;i> 2; GLint *value = malloc(sizeof(GLint) * elements); for(i=0;igluBeginCurve($nurb); void gluBeginCurve(nurb) GLUnurbsObj * nurb #// gluEndCurve($nurb); void gluEndCurve(nurb) GLUnurbsObj * nurb #// gluBeginPolygon($tess); void gluBeginPolygon(tess) PGLUtess * tess CODE: gluBeginPolygon(tess->triangulator); #// gluEndPolygon($tess); void gluEndPolygon(tess) PGLUtess * tess CODE: gluEndPolygon(tess->triangulator); #// gluBeginSurface($nurb); void gluBeginSurface(nurb) GLUnurbsObj * nurb #// gluEndSurface($nurb); void gluEndSurface(nurb) GLUnurbsObj * nurb #// gluBeginTrim($nurb); void gluBeginTrim(nurb) GLUnurbsObj * nurb #// gluEndTrim($nurb); void gluEndTrim(nurb) GLUnurbsObj * nurb #//# gluBuild1DMipmaps_c($target, $internalformat, $width, $format, $type, (CPTR)data); GLint gluBuild1DMipmaps_c(target, internalformat, width, format, type, data) GLenum target GLuint internalformat GLsizei width GLenum format GLenum type void * data CODE: { RETVAL=gluBuild1DMipmaps(target, internalformat, width, format, type, data); } OUTPUT: RETVAL #//# gluBuild1DMipmaps_s($target, $internalformat, $width, $format, $type, (PACKED)data); 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 #//# gluBuild2DMipmaps_c($target, $internalformat, $width, $height, $format, $type, (CPTR)data); GLint gluBuild2DMipmaps_c(target, internalformat, width, height, format, type, data) GLenum target GLuint internalformat GLsizei width GLsizei height GLenum format GLenum type void * data CODE: { RETVAL=gluBuild2DMipmaps(target, internalformat, width, height, format, type, data); } OUTPUT: RETVAL #//# gluBuild2DMipmaps_s($target, $internalformat, $width, $height, $format, $type, (PACKED)data); 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 #// gluCylinder($quad, $base, $top, $height, $slices, $stacks); void gluCylinder(quad, base, top, height, slices, stacks) GLUquadricObj * quad GLdouble base GLdouble top GLdouble height GLint slices GLint stacks #// gluDeleteNurbsRenderer($nurb); void gluDeleteNurbsRenderer(nurb) GLUnurbsObj * nurb #// gluDeleteQuadric($quad); void gluDeleteQuadric(quad) GLUquadricObj * quad #// gluDeleteTess($tess); 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); } #// gluDisk($quad, $inner, $outer, $slices, $loops); void gluDisk(quad, inner, outer, slices, loops) GLUquadricObj * quad GLdouble inner GLdouble outer GLint slices GLint loops #//# gluErrorString($error); char * gluErrorString(error) GLenum error CODE: RETVAL = (char*)gluErrorString(error); OUTPUT: RETVAL #// gluGetNurbsProperty_p($nurb, $property); GLfloat gluGetNurbsProperty_p(nurb, property) GLUnurbsObj * nurb GLenum property CODE: { GLfloat param; gluGetNurbsProperty(nurb, property, ¶m); RETVAL = param; } OUTPUT: RETVAL #// gluNurbsProperty(nurb, property, value); void gluNurbsProperty(nurb, property, value) GLUnurbsObj * nurb GLenum property GLfloat value #ifdef GLU_VERSION_1_1 #//# gluGetString($name); char * gluGetString(name) GLenum name CODE: RETVAL = (char*)gluGetString(name); OUTPUT: RETVAL #endif #// 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); 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] = (GLfloat)SvNV(ST(i+1)); for (i=0;i<16;i++) p[i] = (GLfloat)SvNV(ST(i+1+16)); for (i=0;i<4;i++) v[i] = SvIV(ST(i+1+16+16)); gluLoadSamplingMatrices(nurb, m, p, v); } #//# gluLookAt($eyeX, $eyeY, $eyeZ, $centerX, $centerY, $centerZ, $upX, $upY, $upZ); 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 #// gluNewNurbsRenderer(); GLUnurbsObj * gluNewNurbsRenderer() #// gluNewQuadric(); GLUquadricObj * gluNewQuadric() #// gluNewTess(); PGLUtess * gluNewTess() CODE: { RETVAL = calloc(sizeof(PGLUtess), 1); RETVAL->triangulator = gluNewTess(); } OUTPUT: RETVAL #// gluNextContour(tess, type); void gluNextContour(tess, type) PGLUtess * tess GLenum type CODE: gluNextContour(tess->triangulator, type); #// gluNurbsCurve_c(nurb, nknots, knot, stride, ctlarray, order, 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); #// gluNurbsSurface_c(nurb, sknot_count, sknot, tknot_count, tknot, s_stride, t_stride, ctrlarray, sorder, torder, 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); #//# gluOrtho2D($left, $right, $bottom, $top); void gluOrtho2D(left, right, bottom, top) GLdouble left GLdouble right GLdouble bottom GLdouble top #// gluPartialDisk(quad, inner, outer, slices, loops, start, sweep); void gluPartialDisk(quad, inner, outer, slices, loops, start, sweep) GLUquadricObj* quad GLdouble inner GLdouble outer GLint slices GLint loops GLdouble start GLdouble sweep #//# gluPerspective($fovy, $aspect, $zNear, $zFar); void gluPerspective(fovy, aspect, zNear, zFar) GLdouble fovy GLdouble aspect GLdouble zNear GLdouble zFar #//# gluPickMatrix_p($x, $y, $delX, $delY, $m1,$m2,$m3,$m4); 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]); } #//# gluProject_p($objx, $objy, $objz, @m4x4, @o4x4, $v1,$v2,$v3,$v4); 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] = SvNV(ST(i+3)); for (i=0;i<16;i++) p[i] = SvNV(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))); } } #// gluPwlCurve_c(nurb, count, data, stride, type); 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); #// gluQuadricDrawStyle(quad, draw); void gluQuadricDrawStyle(quad, draw) GLUquadricObj * quad GLenum draw #// gluQuadricNormals(quad, normal); void gluQuadricNormals(quad, normal) GLUquadricObj * quad GLenum normal #// gluQuadricOrientation(quad, orientation); void gluQuadricOrientation(quad, orientation) GLUquadricObj * quad GLenum orientation #// gluQuadricTexture(quad, texture); void gluQuadricTexture(quad, texture) GLUquadricObj * quad GLboolean texture #//# gluScaleImage_s($format, $wIn, $hIn, $typeIn, (PACKED)dataIn, $wOut, $hOut, $typeOut, (PACKED)dataOut); 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 #// gluSphere(quad, radius, slices, stacks); void gluSphere(quad, radius, slices, stacks) GLUquadricObj * quad GLdouble radius GLint slices GLint stacks #ifdef GLU_VERSION_1_2 #// gluGetTessProperty_p(tess, property); GLdouble gluGetTessProperty_p(tess, property) PGLUtess * tess GLenum property CODE: { GLdouble param; gluGetTessProperty(tess->triangulator, property, ¶m); RETVAL = param; } OUTPUT: RETVAL #// #gluNurbsCallback_p(nurb, which, handler, ...); #void #gluNurbsCallback_p(nurb, which, handler, ...) #// gluNurbsCallbackDataEXT #void #gluNurbsCallbackDataEXT #// gluQuadricCallback #void #gluQuadricCallback #// gluTessBeginCountour(tess); void gluTessBeginCountour(tess) PGLUtess * tess CODE: gluTessBeginContour(tess->triangulator); #// gluTessEndContour(tess); void gluTessEndContour(tess) PGLUtess * tess CODE: gluTessEndContour(tess->triangulator); #// gluTessBeginPolygon(tess, ...); 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); } #// gluTessEndPolygon(tess); void gluTessEndPolygon(tess) PGLUtess * tess CODE: { if (tess->polygon_data_av) { SvREFCNT_dec(tess->polygon_data_av); tess->polygon_data_av = 0; } } #// gluTessNormal(tess, valueX, valueY, valueZ) void gluTessNormal(tess, valueX, valueY, valueZ) PGLUtess * tess GLdouble valueX GLdouble valueY GLdouble valueZ CODE: gluTessNormal(tess->triangulator, valueX, valueY, valueZ); #// gluTessProperty(tess, which, data); void gluTessProperty(tess, which, data) PGLUtess * tess GLenum which GLdouble data CODE: gluTessProperty(tess->triangulator, which, data); #// gluTessCallback(tess, which, ...); 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 #// gluTessVertex(tess, x, y, z, ...); 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); } #//# gluUnProject_p($winx,$winy,$winz, @m4x4, @o4x4, $v1,$v2,$v3,$v4); 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] = SvNV(ST(i+3)); for (i=0;i<16;i++) p[i] = SvNV(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 #//# glutInit(); void glutInit() CODE: { int argc; char ** argv; AV * ARGV; SV * ARGV0; SV * sv; int i; if (_done_glutInit) croak("illegal glutInit() reinitialization attempt"); 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); _done_glutInit = 1; while(argc= 3 #//# glutFullScreen(); void glutFullScreen() #endif #//# glutPopWindow(); void glutPopWindow() #//# glutPushWindow(); void glutPushWindow() #//# glutShowWindow(); void glutShowWindow() #//# glutHideWindow(); void glutHideWindow() #//# glutIconifyWindow(); void glutIconifyWindow() #//# glutSetWindowTitle($title); void glutSetWindowTitle(title) char * title #//# glutSetIconTitle($title); void glutSetIconTitle(title) char * title #if GLUT_API_VERSION >= 3 #//# glutSetCursor(cursor); void glutSetCursor(cursor) int cursor #endif # Overlays #if GLUT_API_VERSION >= 3 #//# glutEstablishOverlay(); void glutEstablishOverlay() #//# glutUseLayer(layer); void glutUseLayer(layer) GLenum layer #//# glutRemoveOverlay(); void glutRemoveOverlay() #//# glutPostOverlayRedisplay(); void glutPostOverlayRedisplay() #//# glutShowOverlay(); void glutShowOverlay() #//# glutHideOverlay(); void glutHideOverlay() #endif # Menus #//# $ID = glutCreateMenu(\&callback); 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 #//# glutSetMenu($menu); void glutSetMenu(menu) int menu #//# glutGetMenu(); int glutGetMenu() #//# glutDestroyMenu($menu); void glutDestroyMenu(menu) int menu CODE: { glutDestroyMenu(menu); av_store(glut_menu_handlers, menu, newSVsv(&PL_sv_undef)); } #//# glutAddMenuEntry($name, $value); void glutAddMenuEntry(name, value) char * name int value #//# glutAddSubMenu($name, $menu); void glutAddSubMenu(name, menu) char * name int menu #//# glutChangeToMenuEntry($entry, $name, $value); void glutChangeToMenuEntry(entry, name, value) int entry char * name int value #//# glutChangeToSubMenu($entry, $name, $menu); void glutChangeToSubMenu(entry, name, menu) int entry char * name int menu #//# glutRemoveMenuItem($entry); void glutRemoveMenuItem(entry) int entry #//# glutAttachMenu(button); void glutAttachMenu(button) int button #//# glutDetachMenu(button); void glutDetachMenu(button) int button # Callbacks #//# glutDisplayFunc(\&callback); void glutDisplayFunc(handler=0, ...) SV * handler CODE: decl_gwh_xs_nullfail(Display, ("Display function must be specified")) #if GLUT_API_VERSION >= 3 #//# glutOverlayDisplayFunc(\&callback); void glutOverlayDisplayFunc(handler=0, ...) SV * handler CODE: decl_gwh_xs(OverlayDisplay) #endif #//# glutReshapeFunc(\&callback); void glutReshapeFunc(handler=0, ...) SV * handler CODE: decl_gwh_xs(Reshape) #//# glutKeyboardFunc(\&callback); void glutKeyboardFunc(handler=0, ...) SV * handler CODE: decl_gwh_xs(Keyboard) #if GLUT_API_VERSION >= 4 #//# glutKeyboardUpFunc(\&callback); void glutKeyboardUpFunc(handler=0, ...) SV * handler CODE: decl_gwh_xs(KeyboardUp) #//# glutWindowStatusFunc(\&callback); void glutWindowStatusFunc(handler=0, ...) SV * handler CODE: decl_gwh_xs(WindowStatus) #endif #//# glutMouseFunc(\&callback); void glutMouseFunc(handler=0, ...) SV * handler CODE: decl_gwh_xs(Mouse) #//# glutMouseWheelFunc(\&callback); void glutMouseWheelFunc(handler=0, ...) SV * handler CODE: decl_gwh_xs(MouseWheel) #//# glutMotionFunc(\&callback); void glutMotionFunc(handler=0, ...) SV * handler CODE: decl_gwh_xs(Motion) #//# glutPassiveMotionFunc(\&callback); void glutPassiveMotionFunc(handler=0, ...) SV * handler CODE: decl_gwh_xs(PassiveMotion) #//# glutVisibilityFunc(\&callback); 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) #//# glutEntryFunc(\&callback); void glutEntryFunc(handler=0, ...) SV * handler CODE: decl_gwh_xs(Entry) #endif #if GLUT_API_VERSION >= 2 #//# glutSpecialFunc(\&callback); 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) #//# glutJoystickFunc(\&callback); /* Open/FreeGLUT -chm */ # void /* Not implemented, don't know how */ # glutJoystickFunc(handler=0, ...) # SV * handler # CODE: # decl_gwh_xs(Joystick) #//# glutSpaceballMotionFunc(\&callback); void glutSpaceballMotionFunc(handler=0, ...) SV * handler CODE: decl_gwh_xs(SpaceballMotion) #//# glutSpaceballRotateFunc(\&callback); void glutSpaceballRotateFunc(handler=0, ...) SV * handler CODE: decl_gwh_xs(SpaceballRotate) #//# glutSpaceballButtonFunc(\&callback); void glutSpaceballButtonFunc(handler=0, ...) SV * handler CODE: decl_gwh_xs(SpaceballButton) #//# glutButtonBoxFunc(\&callback); void glutButtonBoxFunc(handler=0, ...) SV * handler CODE: decl_gwh_xs(ButtonBox) #//# glutDialsFunc(\&callback); void glutDialsFunc(handler=0, ...) SV * handler CODE: decl_gwh_xs(Dials) #//# glutTabletMotionFunc(\&callback); void glutTabletMotionFunc(handler=0, ...) SV * handler CODE: decl_gwh_xs(TabletMotion) #//# glutTabletButtonFunc(\&callback); void glutTabletButtonFunc(handler=0, ...) SV * handler CODE: decl_gwh_xs(TabletButton) # endif #endif #if GLUT_API_VERSION >= 3 #//# glutMenuStatusFunc(\&callback); void glutMenuStatusFunc(handler=0, ...) SV * handler CODE: decl_ggh_xs(MenuStatus) #endif #//# glutMenuStateFunc(\&callback); void glutMenuStateFunc(handler=0, ...) SV * handler CODE: decl_ggh_xs(MenuState) #//# glutIdleFunc(\&callback); void glutIdleFunc(handler=0, ...) SV * handler CODE: decl_ggh_xs(Idle) #//# glutTimerFunc($msecs, \&callback); 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 #//# glutSetColor($cell, $red, $green, $blue) void glutSetColor(cell, red, green, blue) int cell GLfloat red GLfloat green GLfloat blue #//# glutGetColor($cell, $component); GLfloat glutGetColor(cell, component) int cell int component #//# glutCopyColormap($win); void glutCopyColormap(win) int win # State #//# glutGet($state); int glutGet(state) GLenum state #if GLUT_API_VERSION >= 3 #//# glutLayerGet(info); int glutLayerGet(info) GLenum info #endif int glutDeviceGet(info) GLenum info #if GLUT_API_VERSION >= 3 #//# glutGetModifiers(); int glutGetModifiers() #endif #if GLUT_API_VERSION >= 2 #//# glutExtensionSupported($extension); int glutExtensionSupported(extension) char * extension #endif # Font #//# glutBitmapCharacter($font, $character); void glutBitmapCharacter(font, character) void * font int character #//# glutStrokeCharacter($font, $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)) #//# glutBitmapWidth($font, $character); int glutBitmapWidth(font, character) void * font int character #//# glutStrokeWidth($font, $character); int glutStrokeWidth(font, character) void * font int character #endif #if GLUT_API_VERSION >= 3 #//# glutIgnoreKeyRepeat($ignore); void glutIgnoreKeyRepeat(ignore) int ignore #//# glutSetKeyRepeat($repeatMode); void glutSetKeyRepeat(repeatMode) int repeatMode #//# glutForceJoystickFunc(); void glutForceJoystickFunc() #endif # Solids #//# glutSolidSphere($radius, $slices, $stacks); void glutSolidSphere(radius, slices, stacks) GLdouble radius GLint slices GLint stacks #//# glutWireSphere($radius, $slices, $stacks); void glutWireSphere(radius, slices, stacks) GLdouble radius GLint slices GLint stacks #//# glutSolidCube($size); void glutSolidCube(size) GLdouble size #//# glutWireCube($size); void glutWireCube(size) GLdouble size #//# glutSolidCone($base, $height, $slices, $stacks); void glutSolidCone(base, height, slices, stacks) GLdouble base GLdouble height GLint slices GLint stacks #//# glutWireCone($base, $height, $slices, $stacks); void glutWireCone(base, height, slices, stacks) GLdouble base GLdouble height GLint slices GLint stacks #//# glutSolidTorus($innerRadius, $outerRadius, $nsides, $rings); void glutSolidTorus(innerRadius, outerRadius, nsides, rings) GLdouble innerRadius GLdouble outerRadius GLint nsides GLint rings #//# glutWireTorus($innerRadius, $outerRadius, $nsides, $rings); void glutWireTorus(innerRadius, outerRadius, nsides, rings) GLdouble innerRadius GLdouble outerRadius GLint nsides GLint rings #//# glutSolidDodecahedron(); void glutSolidDodecahedron() #//# glutWireDodecahedron(); void glutWireDodecahedron() #//# glutSolidOctahedron(); void glutSolidOctahedron() #//# glutWireOctahedron(); void glutWireOctahedron() #//# glutSolidTetrahedron(); void glutSolidTetrahedron() #//# glutWireTetrahedron(); void glutWireTetrahedron() #//# glutSolidIcosahedron(); void glutSolidIcosahedron() #//# glutWireIcosahedron(); void glutWireIcosahedron() #//# glutSolidTeapot(size); void glutSolidTeapot(size) GLdouble size #//# glutWireTeapot($size); void glutWireTeapot(size) GLdouble size #if GLUT_API_VERSION >= 4 #//# glutSpecialUpFunc(\&callback); void glutSpecialUpFunc(handler=0, ...) SV * handler CODE: decl_gwh_xs(SpecialUp) #//# glutGameModeString($string); GLboolean glutGameModeString(string) char * string CODE: { char mode[1024]; if (!string || !string[0]) { int w = glutGet(0x00C8); // GLUT_SCREEN_WIDTH int h = glutGet(0x00C9); // GLUT_SCREEN_HEIGHT sprintf(mode,"%dx%d:%d@%d",w,h,32,60); string = mode; } glutGameModeString(string); RETVAL = glutGameModeGet(0x0001); // GLUT_GAME_MODE_POSSIBLE } OUTPUT: RETVAL #//# glutEnterGameMode(); int glutEnterGameMode() #//# glutLeaveGameMode(); void glutLeaveGameMode() #//# glutGameModeGet($mode); int glutGameModeGet(mode) GLenum mode ##//## CHM implementation of missing FreeGLUT/OpenGLUT features #//# int glutBitmapHeight (void *font) int glutBitmapHeight(font) void * font #//# int glutBitmapLength (void *font, const unsigned char *string) int glutBitmapLength(font, string) void * font const unsigned char * string #//# void glutBitmapString (void *font, const unsigned char *string) void glutBitmapString(font, string) void * font const unsigned char * string #//# void * glutGetMenuData (void) # void * # glutGetMenuData() #//# void * glutGetProcAddress (const char *procName) # void * # glutGetProcAddress(procName) # const char * procName #//# void * glutGetWindowData (void) # void * # glutGetWindowData() #//# void glutMainLoopEvent (void) void glutMainLoopEvent() #//# void glutPostWindowOverlayRedisplay (int windowID) void glutPostWindowOverlayRedisplay(windowID) int windowID #//# void glutPostWindowRedisplay (int windowID) void glutPostWindowRedisplay(windowID) int windowID #//# void glutReportErrors (void) void glutReportErrors() #//# void glutSetMenuData (void *data) # void # glutSetMenuData(data) # void * data #//# void glutSetWindowData (void *data) # void # glutSetWindowData(data) # void * data #//# void glutSolidCylinder (GLdouble radius, GLdouble height, GLint slices, GLint stacks) void glutSolidCylinder(radius, height, slices, stacks) GLdouble radius GLdouble height GLint slices GLint stacks #//# void glutSolidRhombicDodecahedron (void) void glutSolidRhombicDodecahedron() #//# void glutSolidSierpinskiSponge (int num_levels, const GLdouble offset[3], GLdouble scale) # void # glutSolidSierpinskiSponge(num_levels, offset, scale) # int num_levels # const GLdouble offset[3] # GLdouble scale #//# float glutStrokeHeight (void *font) GLfloat glutStrokeHeight(font) void * font #//# float glutStrokeLength (void *font, const unsigned char *string) GLfloat glutStrokeLength(font, string) void * font const unsigned char * string #//# void glutStrokeString (void *fontID, const unsigned char *string) void glutStrokeString(font, string) void * font const unsigned char * string #//# void glutWarpPointer (int x, int y) void glutWarpPointer(x, y) int x int y #//# void glutWireCylinder (GLdouble radius, GLdouble height, GLint slices, GLint stacks) void glutWireCylinder(radius, height, slices, stacks) GLdouble radius GLdouble height GLint slices GLint stacks #//# void glutWireRhombicDodecahedron (void) void glutWireRhombicDodecahedron() #//# void glutWireSierpinskiSponge (int num_levels, const GLdouble offset[3], GLdouble scale) # void # glutWireSierpinskiSponge(num_levels, offset, scale) # int num_levels # const GLdouble offset[3] # GLdouble scale #endif # /* FreeGLUT APIs */ #//# glutSetOption($option_flag, $value); void glutSetOption(option_flag, value) GLenum option_flag int value CODE: { #if defined HAVE_FREEGLUT glutSetOption(option_flag, value); #endif } #//# glutLeaveMainLoop(); void glutLeaveMainLoop() CODE: { #if defined HAVE_FREEGLUT glutLeaveMainLoop(); #else int win = glutGetWindow(); glutDestroyWindow(win); destroy_glut_win_handlers(win); #endif } #//# glutMenuDestroyFunc(\&callback); void glutMenuDestroyFunc(handler=0, ...) SV * handler CODE: decl_gwh_xs(MenuDestroy) #//# glutCloseFunc(\&callback); void glutCloseFunc(handler=0, ...) SV * handler CODE: { #if defined HAVE_FREEGLUT decl_gwh_xs(Close) #endif } #endif /* def GLUT_API_VERSION */ # /* The following material is directly copied from Stan Melax's original OpenGL-0.4 */ #ifdef __PM__ #// morphPM(); void morphPM() #endif int __had_dbuffer_hack() #ifdef HAVE_GLpc /* GLX or __PM__ */ #// $ID = glpcOpenWindow($x,$y,$w,$h,$pw,$steal,$event_mask,@attribs); 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; } #// glpDisplay(); void * glpDisplay() CODE: /* get a connection */ if (!dpy_open) { dpy = XOpenDisplay(0); dpy_open = 1; } if (!dpy) croak("No display!"); RETVAL = dpy; #// glpMoveResizeWindow($x, $y, $width, $height[, $winID[, $display]]); void glpMoveResizeWindow(x, y, width, height, w=win, d=dpy) void* d GLXDrawable w int x int y unsigned int width unsigned int height #// glpMoveWindow($x, $y[, $winID[, $display]]); void glpMoveWindow(x, y, w=win, d=dpy) void* d GLXDrawable w int x int y #// glpResizeWindow($width, $height[, $winID[, $display]]) 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) #// glXSwapBuffers([$winID[, $display]]) void glXSwapBuffers(w=win,d=dpy) void * d GLXDrawable w CODE: { glXSwapBuffers(d,w); } #// XPending([$display]); int XPending(d=dpy) void * d CODE: { RETVAL = XPending(d); } OUTPUT: RETVAL #// glpXNextEvent([$display]); 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; } } #// glpXQueryPointer([$winID[, $display]]); 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 #//# glpReadTex($file); void glpReadTex(file) char * file CODE: { GLsizei w,h; int d,i; char buf[250]; unsigned char *image; FILE *fp; char *ret; fp=fopen(file,"r"); if(!fp) croak("couldn't open file %s",file); ret = fgets(buf,250,fp); /* P3 */ if (buf[0] != 'P' || buf[1] != '3') croak("Format is not P3 in file %s",file); ret = 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