4 // Copyright (C) 2005 David J. Goehrig <dgoehrig@cpan.org>
6 // ------------------------------------------------------------------------------
8 // This library is free software; you can redistribute it and/or
9 // modify it under the terms of the GNU Lesser General Public
10 // License as published by the Free Software Foundation; either
11 // version 2.1 of the License, or (at your option) any later version.
13 // This library is distributed in the hope that it will be useful,
14 // but WITHOUT ANY WARRANTY; without even the implied warranty of
15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 // Lesser General Public License for more details.
18 // You should have received a copy of the GNU Lesser General Public
19 // License along with this library; if not, write to the Free Software
20 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 // ------------------------------------------------------------------------------
24 // Please feel free to send questions, suggestions or improvements to:
50 #define HAVE_TLS_CONTEXT
53 #ifndef GL_ALL_CLIENT_ATTRIB_BITS
54 #define GL_ALL_CLIENT_ATTRIB_BITS 0xFFFFFFF
55 #endif /* GL_ALL_CLIENT_BITS */
57 #include "../src/defines.h"
59 SV* sdl_perl_nurbs_error_hook;
61 sdl_perl_nurbs_error_callback ( GLenum errorCode )
69 XPUSHs(sv_2mortal(newSViv(errorCode)));
72 call_sv(sdl_perl_nurbs_error_hook,G_VOID);
80 sdl_perl_nurbs_being_callback ( GLenum type, void *cb )
91 XPUSHs(sv_2mortal(newSViv(type)));
102 sdl_perl_nurbs_multi_callback ( GLfloat *vec, void *cb )
113 XPUSHs(sv_2mortal(newSViv(PTR2IV(vec))));
124 sdl_perl_nurbs_end_callback ( void *cb )
142 sdl_perl_tess_end_callback ( void *cb )
153 XPUSHs(sv_2mortal(newSViv(GLU_TESS_BEGIN)));
164 sdl_perl_tess_begin_callback ( GLenum type, void *cb )
175 XPUSHs(sv_2mortal(newSViv(GLU_TESS_BEGIN)));
176 XPUSHs(sv_2mortal(newSViv(type)));
187 sdl_perl_tess_error_callback ( GLenum type, void *cb )
198 XPUSHs(sv_2mortal(newSViv(GLU_TESS_ERROR)));
199 XPUSHs(sv_2mortal(newSViv(type)));
210 sdl_perl_tess_edge_flag_callback ( GLenum flag, void *cb )
221 XPUSHs(sv_2mortal(newSViv(GLU_TESS_EDGE_FLAG)));
222 XPUSHs(sv_2mortal(newSViv(flag)));
233 sdl_perl_tess_vertex_callback ( double *vd, void *cb )
244 XPUSHs(sv_2mortal(newSViv(GLU_TESS_VERTEX)));
245 XPUSHs(sv_2mortal(newSVnv(vd[0])));
246 XPUSHs(sv_2mortal(newSVnv(vd[1])));
247 XPUSHs(sv_2mortal(newSVnv(vd[2])));
248 XPUSHs(sv_2mortal(newSVnv(vd[3])));
249 XPUSHs(sv_2mortal(newSVnv(vd[4])));
250 XPUSHs(sv_2mortal(newSVnv(vd[5])));
261 sdl_perl_tess_combine_callback ( GLdouble coords[3], double *vd[4], GLfloat weight[4],
262 GLdouble **out, void *cb )
275 XPUSHs(sv_2mortal(newSViv(GLU_TESS_COMBINE)));
276 XPUSHs(sv_2mortal(newSVpvn((char*)coords,sizeof(GLdouble)*3)));
277 XPUSHs(sv_2mortal(newSVpvn((char*)vd,sizeof(GLdouble*)*4)));
278 XPUSHs(sv_2mortal(newSVpvn((char*)weight,sizeof(GLfloat)*4)));
281 if ( 1 != call_sv(cmd,G_SCALAR) ) {
282 Perl_croak(aTHX_ "sdl_perl_tess_combine_callback failed");
285 data = (double*)POPp;
287 *out = (double*)malloc(sizeof(double)*width);
288 memcpy(*out,data,sizeof(double)*width);
295 MODULE = SDL::OpenGL PACKAGE = SDL::OpenGL
301 glClearColor ( r, g, b, a)
307 glClearColor((GLfloat)r,(GLfloat)g,(GLfloat)b,(GLfloat)a);
310 glClearIndex ( index )
316 glClearDepth ( depth )
328 glClearAccum ( r, g, b, a )
334 glClearAccum((GLfloat)r,(GLfloat)g,(GLfloat)b,(GLfloat)a);
356 glRecti(r->x,r->y,r->x+r->w,r->y+r->h);
359 glVertex ( x, y, ... )
368 } else if ( items == 3 ) {
403 case GL_EDGE_FLAG_ARRAY:
404 case GL_MAP1_TEXTURE_COORD_1:
405 case GL_LIGHT_MODEL_TWO_SIDE:
406 case GL_INDEX_LOGIC_OP:
407 case GL_PACK_ALIGNMENT:
409 case GL_TEXTURE_GEN_S:
410 case GL_MAP1_VERTEX_3:
413 case GL_NORMAL_ARRAY:
417 case GL_POLYGON_OFFSET_FILL:
418 case GL_MAP1_TEXTURE_COORD_4:
421 case GL_UNPACK_SWAP_BYTES:
423 case GL_POLYGON_OFFSET_POINT:
424 case GL_POINT_SMOOTH:
426 case GL_MAP2_TEXTURE_COORD_4:
428 case GL_POLYGON_OFFSET_LINE:
431 case GL_PACK_LSB_FIRST:
432 case GL_MAP1_TEXTURE_COORD_2:
433 case GL_MAP2_VERTEX_3:
434 case GL_MAP2_TEXTURE_COORD_2:
436 case GL_DOUBLEBUFFER:
437 case GL_UNPACK_LSB_FIRST:
438 case GL_TEXTURE_COORD_ARRAY:
440 case GL_TEXTURE_GEN_Q:
448 case GL_TEXTURE_GEN_R:
449 case GL_PACK_SWAP_BYTES:
450 case GL_DEPTH_WRITEMASK:
451 case GL_COLOR_LOGIC_OP:
456 case GL_COLOR_MATERIAL:
459 case GL_MAP1_VERTEX_4:
463 case GL_POLYGON_SMOOTH:
465 case GL_MAP2_COLOR_4:
467 case GL_VERTEX_ARRAY:
468 case GL_MAP1_TEXTURE_COORD_3:
469 case GL_STENCIL_TEST:
470 case GL_MAP2_TEXTURE_COORD_3:
471 case GL_TEXTURE_GEN_T:
472 case GL_LIGHT_MODEL_LOCAL_VIEWER:
474 case GL_MAP1_COLOR_4:
475 case GL_MAP2_TEXTURE_COORD_1:
476 case GL_CURRENT_RASTER_POSITION_VALID:
478 case GL_SCISSOR_TEST:
480 case GL_POLYGON_STIPPLE:
483 case GL_LINE_STIPPLE:
484 case GL_MAP2_VERTEX_4:
488 glGetBooleanv(param, ret);
490 for (i = 0; i < 1; i++) {
491 XPUSHs(sv_2mortal(newSViv(ret[i])));
495 case GL_COLOR_WRITEMASK:
499 glGetBooleanv(param, ret);
501 for (i = 0; i < 4; i++) {
502 XPUSHs(sv_2mortal(newSViv(ret[i])));
507 case GL_ALPHA_TEST_REF:
508 case GL_POINT_SIZE_GRANULARITY:
509 case GL_CURRENT_RASTER_DISTANCE:
515 case GL_DEPTH_CLEAR_VALUE:
522 case GL_POLYGON_OFFSET_FACTOR:
525 case GL_POLYGON_OFFSET_UNITS:
527 case GL_LINE_WIDTH_GRANULARITY:
533 glGetDoublev(param, ret);
535 for (i = 0; i < 1; i++) {
536 XPUSHs(sv_2mortal(newSVnv(ret[i])));
540 case GL_MODELVIEW_MATRIX:
541 case GL_TEXTURE_MATRIX:
542 case GL_PROJECTION_MATRIX:
546 glGetDoublev(param, ret);
548 for (i = 0; i < 16; i++) {
549 XPUSHs(sv_2mortal(newSVnv(ret[i])));
553 case GL_POINT_SIZE_RANGE:
554 case GL_LINE_WIDTH_RANGE:
555 case GL_MAP1_GRID_DOMAIN:
560 glGetDoublev(param, ret);
562 for (i = 0; i < 2; i++) {
563 XPUSHs(sv_2mortal(newSVnv(ret[i])));
567 case GL_CURRENT_NORMAL:
571 glGetDoublev(param, ret);
573 for (i = 0; i < 3; i++) {
574 XPUSHs(sv_2mortal(newSVnv(ret[i])));
579 case GL_MAP2_GRID_DOMAIN:
580 case GL_CURRENT_RASTER_POSITION:
581 case GL_CURRENT_COLOR:
582 case GL_LIGHT_MODEL_AMBIENT:
583 case GL_CURRENT_RASTER_TEXTURE_COORDS:
584 case GL_TEXTURE_ENV_COLOR:
585 case GL_CURRENT_RASTER_COLOR:
586 case GL_CURRENT_TEXTURE_COORDS:
587 case GL_COLOR_CLEAR_VALUE:
588 case GL_ACCUM_CLEAR_VALUE:
592 glGetDoublev(param, ret);
594 for (i = 0; i < 4; i++) {
595 XPUSHs(sv_2mortal(newSVnv(ret[i])));
599 case GL_CULL_FACE_MODE:
600 case GL_PIXEL_MAP_I_TO_A_SIZE:
601 case GL_PIXEL_MAP_A_TO_A_SIZE:
603 case GL_EDGE_FLAG_ARRAY_STRIDE:
608 case GL_POINT_SMOOTH_HINT:
609 case GL_PACK_SKIP_PIXELS:
611 case GL_STENCIL_CLEAR_VALUE:
613 case GL_COLOR_MATERIAL_PARAMETER:
614 case GL_ACCUM_BLUE_BITS:
616 case GL_VERTEX_ARRAY_STRIDE:
617 case GL_STENCIL_PASS_DEPTH_PASS:
618 case GL_CLIENT_ATTRIB_STACK_DEPTH:
620 case GL_LINE_STIPPLE_REPEAT:
622 case GL_PIXEL_MAP_B_TO_B_SIZE:
623 case GL_MAX_PIXEL_MAP_TABLE:
624 case GL_MAX_TEXTURE_SIZE:
625 case GL_PIXEL_MAP_S_TO_S_SIZE:
626 case GL_LOGIC_OP_MODE:
629 case GL_LINE_SMOOTH_HINT:
630 case GL_ALPHA_TEST_FUNC:
633 case GL_MAX_NAME_STACK_DEPTH:
634 case GL_INDEX_ARRAY_TYPE:
635 case GL_TEXTURE_COORD_ARRAY_TYPE:
636 case GL_COLOR_ARRAY_TYPE:
637 case GL_MAX_LIST_NESTING:
638 case GL_STENCIL_WRITEMASK:
640 case GL_ACCUM_ALPHA_BITS:
641 case GL_INDEX_ARRAY_STRIDE:
642 case GL_PIXEL_MAP_I_TO_B_SIZE:
644 case GL_STENCIL_FAIL:
645 case GL_UNPACK_ALIGNMENT:
646 case GL_STENCIL_PASS_DEPTH_FAIL:
647 case GL_ATTRIB_STACK_DEPTH:
648 case GL_PACK_SKIP_ROWS:
649 case GL_TEXTURE_STACK_DEPTH:
651 case GL_COLOR_ARRAY_STRIDE:
653 case GL_UNPACK_SKIP_PIXELS:
654 case GL_PIXEL_MAP_G_TO_G_SIZE:
655 case GL_VERTEX_ARRAY_TYPE:
657 case GL_MAX_CLIENT_ATTRIB_STACK_DEPTH:
658 case GL_INDEX_CLEAR_VALUE:
659 case GL_PIXEL_MAP_I_TO_G_SIZE:
661 case GL_PIXEL_MAP_I_TO_R_SIZE:
662 case GL_COLOR_ARRAY_SIZE:
663 case GL_TEXTURE_COORD_ARRAY_SIZE:
664 case GL_MAP1_GRID_SEGMENTS:
665 case GL_VERTEX_ARRAY_SIZE:
666 case GL_PIXEL_MAP_R_TO_R_SIZE:
667 case GL_TEXTURE_COORD_ARRAY_STRIDE:
668 case GL_MODELVIEW_STACK_DEPTH:
669 case GL_MAX_TEXTURE_STACK_DEPTH:
670 case GL_PIXEL_MAP_I_TO_I_SIZE:
672 case GL_INDEX_WRITEMASK:
673 case GL_PACK_ROW_LENGTH:
674 case GL_CURRENT_INDEX:
675 case GL_STENCIL_VALUE_MASK:
676 case GL_UNPACK_SKIP_ROWS:
677 case GL_MAX_PROJECTION_STACK_DEPTH:
679 case GL_STENCIL_FUNC:
680 case GL_INDEX_OFFSET:
681 case GL_UNPACK_ROW_LENGTH:
682 case GL_COLOR_MATERIAL_FACE:
683 case GL_NORMAL_ARRAY_TYPE:
684 case GL_STENCIL_BITS:
685 case GL_PROJECTION_STACK_DEPTH:
686 case GL_CURRENT_RASTER_INDEX:
688 case GL_TEXTURE_ENV_MODE:
689 case GL_NORMAL_ARRAY_STRIDE:
690 case GL_PERSPECTIVE_CORRECTION_HINT:
691 case GL_MAX_CLIP_PLANES:
692 case GL_MAX_MODELVIEW_STACK_DEPTH:
693 case GL_SUBPIXEL_BITS:
694 case GL_ACCUM_RED_BITS:
697 case GL_MAX_EVAL_ORDER:
698 case GL_LINE_STIPPLE_PATTERN:
699 case GL_NAME_STACK_DEPTH:
700 case GL_MAX_ATTRIB_STACK_DEPTH:
701 case GL_POLYGON_SMOOTH_HINT:
702 case GL_ACCUM_GREEN_BITS:
706 glGetIntegerv(param, ret);
708 for (i = 0; i < 1; i++) {
709 XPUSHs(sv_2mortal(newSViv(ret[i])));
713 case GL_POLYGON_MODE:
714 case GL_MAX_VIEWPORT_DIMS:
715 case GL_MAP2_GRID_SEGMENTS:
719 glGetIntegerv(param, ret);
721 for (i = 0; i < 2; i++) {
722 XPUSHs(sv_2mortal(newSViv(ret[i])));
731 glGetIntegerv(param, ret);
733 for (i = 0; i < 4; i++) {
734 XPUSHs(sv_2mortal(newSViv(ret[i])));
739 croak("Unknown glGet parameter!");
747 RETVAL = glIsEnabled(cap);
755 glPointSize((GLfloat)size);
761 glLineWidth((GLfloat)size);
764 glLineStipple ( factor, pattern )
768 glLineStipple(factor,pattern);
771 glPolygonMode ( face, mode )
775 glPolygonMode(face,mode);
790 glPolygonStipple ( mask )
793 glPolygonStipple(mask);
810 glEnableClientState ( array )
813 glEnableClientState(array);
816 glDisableClientState ( array )
819 glDisableClientState(array);
822 glVertexPointer ( size, type, stride, pointer)
828 glVertexPointer(size,type,stride,pointer);
831 glColorPointer ( size, type, stride, pointer )
837 glColorPointer(size,type,stride,pointer);
840 glNormalPointer ( type, stride, pointer )
845 glNormalPointer(type,stride,pointer);
848 glTexCoordPointer ( size, type, stride, pointer )
854 glTexCoordPointer(size,type,stride,pointer);
857 glEdgeFlagPointer ( stride, pointer )
861 glEdgeFlagPointer(stride,pointer);
864 glArrayElement ( ith )
870 glDrawElements ( mode, count, type, indices )
876 glDrawElements( mode, count, type, indices);
879 glDrawRangeElements ( mode, start, end, count, type, indices )
887 glDrawRangeElements(mode,start,end,count,type,indices);
890 glDrawArrays ( mode, first, count )
895 glDrawArrays(mode,first,count);
898 glInterleavedArrays ( format, stride, pointer )
903 glInterleavedArrays(format,stride,pointer);
906 glPushAttrib ( mask )
917 glPushClientAttrib ( mask )
920 glPushClientAttrib(mask);
928 glMatrixMode ( mode )
943 for ( i = 0; i < 16; i++ ) {
944 mat[i] = (i < items && SvNOK(ST(i)) ? SvNV(ST(i)) : 0.0 );
953 for ( i = 0; i < 16; i++ ) {
954 mat[i] = (i < items && SvNOK(ST(i)) ? SvNV(ST(i)) : 0.0 );
959 glTranslate ( x, y, z )
967 glRotate ( angle, x, y, z )
973 glRotated(angle,x,y,z);
984 glFrustum ( left, right, bottom, top, n, f )
992 glFrustum(left,right,bottom,top,n,f);
995 glOrtho ( left, right, bottom, top, n, f )
1003 glOrtho(left,right,bottom,top,n,f);
1006 glViewport ( x, y, width, height )
1012 glViewport(x,y,width,height);
1015 glDepthRange ( n, f )
1032 glClipPlane ( plane, ... )
1037 for (i = 0; i < 4; i++ ) {
1038 v[i] = (i+1 < items && SvNOK(ST(i+1))) ? SvNV(ST(i+1)) : 0.0;
1040 glClipPlane(plane,v);
1043 glColor ( r, g, b, ... )
1063 glShadeModel ( mode )
1069 glLight ( light, name, ... )
1076 for ( i = 0; i < 4; i++ ) {
1077 v[i] = (SvNOK(ST(i+2))) ? SvNV(ST(i+2)) : 0.0;
1079 glLightfv(light,name,v);
1080 } else if ( items == 5 ) {
1082 for ( i = 0; i < 3; i++ ) {
1083 v[i] = (SvNOK(ST(i+2))) ? SvNV(ST(i+2)) : 0.0;
1085 glLightfv(light,name,v);
1086 } else if ( items == 3 ) {
1089 glLightf(light,name,v);
1091 Perl_croak(aTHX_ "SDL::OpenGL::Light invalid arguments");
1095 glLightModel ( pname, ... )
1099 if ( pname == GL_LIGHT_MODEL_LOCAL_VIEWER ||
1100 pname == GL_LIGHT_MODEL_TWO_SIDE ||
1101 pname == GL_LIGHT_MODEL_COLOR_CONTROL ) {
1102 glLightModelf(pname,SvNV(ST(1)));
1103 } else if ( pname == GL_LIGHT_MODEL_AMBIENT) {
1104 vec[0] = SvNV(ST(1));
1105 vec[1] = SvNV(ST(2));
1106 vec[2] = SvNV(ST(3));
1107 vec[3] = SvNV(ST(4));
1108 glLightModelfv(pname,vec);
1110 Perl_croak(aTHX_ "SDL::OpenGL::glLightModel unknown model %d",pname);
1114 glMaterial ( face, name, ... )
1121 for ( i = 0; i < 4; i++ ) {
1122 v[i] = (SvNOK(ST(i+2))) ? SvNV(ST(i+2)) : 0.0;
1124 glMaterialfv(face,name,v);
1125 } else if ( items == 5 ) {
1127 for ( i = 0; i < 4; i++ ) {
1128 v[i] = (SvNOK(ST(i+2))) ? SvNV(ST(i+2)) : 0.0;
1130 glMaterialfv(face,name,v);
1131 } else if ( items == 3 ) {
1134 glMaterialf(face,name,v);
1136 Perl_croak(aTHX_ "SDL::OpenGL::Material invalid arguments");
1140 glColorMaterial ( face, mode )
1144 glColorMaterial(face,mode);
1147 glBlendFunc ( sfactor, dfactor )
1151 glBlendFunc(sfactor,dfactor);
1155 glHint ( target, hint )
1159 glHint(target,hint);
1172 } else if ( items == 2 ) {
1177 Perl_croak(aTHX_ "SDL::OpenGL::Material invalid arguments");
1181 glPolygonOffset ( factor, units )
1185 glPolygonOffset(factor,units);
1188 glGenLists ( range )
1191 RETVAL = glGenLists(range);
1196 glNewList ( list, mode )
1200 glNewList(list,mode);
1208 glDeleteLists ( base, count )
1212 glDeleteLists(base, count);
1224 RETVAL = glIsList(list);
1239 i = (int*)safemalloc(sizeof(int)* (items));
1240 for ( j = 0; j < items; j++ ) {
1244 Perl_croak(aTHX_ "usage: SDL::OpenGL::CallLists(type,...)");
1246 glCallLists(items, GL_INT, i);
1250 glCallListsString ( string )
1255 str = SvPV(string,len);
1256 glCallLists(len,GL_BYTE,str);
1259 glRasterPos ( x, y, z, ... )
1265 double w = SvNV(ST(3));
1266 glRasterPos4d(x,y,z,w);
1268 glRasterPos3d(x,y,z);
1272 glBitmap ( width, height, x1, y1, x2, y2, data )
1281 glBitmap(width,height,x1,y1,x2,y2,data);
1284 glDrawPixels ( width, height, format, type, pixels )
1291 glDrawPixels(width,height,format,type,pixels);
1295 glReadPixels ( x, y, width, height, format, type )
1305 size = 1; /* ALPHA, BLUE, GREEN or RED */
1306 if (format == GL_BGR || format == GL_RGB)
1308 if (format == GL_BGRA || format == GL_RGBA)
1310 len = height * width * size; /* in bytes */
1311 RETVAL = newSV(len); /* alloc len+1 bytes */
1312 SvPOK_on(RETVAL); /* make an PV */
1313 buf = SvPVX(RETVAL); /* get ptr to buffer */
1314 glReadPixels(x,y,width,height,format,type,buf);
1315 SvCUR_set(RETVAL, len); /* set real length */
1320 glReadPixel ( x, y )
1324 int rgba[4]; /* r,g,b,a */
1326 glReadPixels(x,y,1,1,GL_RGBA,GL_UNSIGNED_INT,rgba);
1328 for ( i = 0; i < 4; i++ ) {
1329 av_push(RETVAL,newSViv(rgba[i]));
1335 glCopyPixels ( x, y, width, height, buffer )
1342 glCopyPixels(x,y,width,height,buffer);
1345 glPixelStore ( name, param )
1349 glPixelStorei(name,param);
1352 glPixelTransfer ( name, ... )
1357 case GL_MAP_STENCIL:
1358 case GL_INDEX_SHIFT:
1359 case GL_INDEX_OFFSET:
1360 glPixelTransferi(name,SvIV(ST(1)));
1363 glPixelTransferf(name,SvNV(ST(1)));
1368 glPixelMap ( type, map, mapsize, values )
1375 case GL_UNSIGNED_INT:
1376 glPixelMapuiv(map,mapsize,(GLint*)values);
1378 case GL_UNSIGNED_SHORT:
1379 glPixelMapusv(map,mapsize,(GLushort*)values);
1382 glPixelMapfv(map,mapsize,(GLfloat*)values);
1387 glPixelZoom ( zoomx, zoomy )
1391 glPixelZoom(zoomx,zoomy);
1393 #ifdef GL_VERSION_1_3
1396 glColorTable ( target, internalFormat, width, format, type, data )
1398 GLenum internalFormat
1404 glColorTable(target,internalFormat,width,format,type,data);
1407 glColorTableParameter ( target, name, r, g, b, a)
1420 glColorTableParameterfv(target,name,vec);
1423 glCopyColorTable ( target, internalFormat, x, y, width )
1425 GLenum internalFormat
1430 glCopyColorTable(target,internalFormat,x,y,width);
1433 glColorSubTable ( target, start, count, format, type, data )
1441 glColorSubTable(target,start,count,format,type,data);
1444 glCopyColorSubTable ( target, start, x, y, count )
1451 glCopyColorSubTable(target,start,x,y,count);
1454 glConvolutionFilter2D ( target, internalFormat, width, height, format, type, image )
1456 Uint32 internalFormat
1463 glConvolutionFilter2D(target,internalFormat,width,height,format,type,image);
1466 glCopyConvolutionFilter2D ( target, internalFormat, x, y, width, height )
1468 Uint32 internalFormat
1474 glCopyConvolutionFilter2D(target,internalFormat,x,y,width,height);
1477 glSeparableFilter2D ( target, internalFormat, width, height, format, type, row, column )
1479 Uint32 internalFormat
1487 glSeparableFilter2D(target,internalFormat,width,height,format,type,row,column);
1490 glConvolutionFilter1D ( target, internalFormat, width, format, type, image )
1492 Uint32 internalFormat
1498 glConvolutionFilter1D(target,internalFormat,width,format,type,image);
1501 glCopyConvolutionFilter1D ( target, internalFormat, x, y, width )
1503 Uint32 internalFormat
1508 glCopyConvolutionFilter1D(target,internalFormat,x,y,width);
1511 glConvolutionParameter ( target, pname, ... )
1518 case GL_CONVOLUTION_BORDER_MODE:
1520 Perl_croak(aTHX_ "Usage: ConvolutionParameter(target,pname,...)");
1522 glConvolutionParameteri(target,pname,pi);
1524 case GL_CONVOLUTION_FILTER_SCALE:
1525 case GL_CONVOLUTION_FILTER_BIAS:
1527 Perl_croak(aTHX_ "Usage: ConvolutionParameter(target,pname,...)");
1528 pv[0] = (GLfloat)SvNV(ST(2));
1529 pv[1] = (GLfloat)SvNV(ST(3));
1530 pv[2] = (GLfloat)SvNV(ST(4));
1531 pv[3] = (GLfloat)SvNV(ST(5));
1532 glConvolutionParameterfv(target,pname,pv);
1535 Perl_croak(aTHX_ "ConvolutionParameter invalid parameter");
1540 glHistogram ( target, width, internalFormat, sink )
1543 Uint32 internalFormat
1546 glHistogram(target,width,internalFormat,sink);
1549 glGetHistogram ( target, reset, format, type, values )
1556 glGetHistogram(target,reset,format,type,values);
1559 glResetHistogram ( target )
1562 glResetHistogram(target);
1565 glMinmax ( target, internalFormat, sink )
1567 Uint32 internalFormat
1570 glMinmax(target,internalFormat,sink);
1573 glGetMinmax ( target, reset, format, type, values )
1580 glGetMinmax(target,reset,format,type,values);
1583 glResetMinmax ( target )
1586 glResetMinmax(target);
1589 glBlendEquation ( mode )
1592 glBlendEquation(mode);
1594 #endif // GL_VERSION_1_3
1597 glTexImage2D ( target, level, internalFormat, width, height, border, format, type, data )
1600 Sint32 internalFormat
1608 glTexImage2D(target,level,internalFormat,width,height,border,format,type,data);
1611 glCopyTexImage2D ( target, level, internalFormat, x, y, width, height, border )
1614 Sint32 internalFormat
1621 glCopyTexImage2D(target,level,internalFormat,x,y,width,height,border);
1624 glTexSubImage2D ( target, level, xoffset, yoffset, width, height, format, type, data )
1635 glTexSubImage2D(target,level,xoffset,yoffset,width,height,format,type,data);
1638 glCopyTexSubImage2D ( target, level, xoffset, yoffset, x, y, width, height )
1648 glCopyTexSubImage2D(target,level,xoffset,yoffset,x,y,width,height);
1651 glTexImage1D ( target, level, internalFormat, width, border, format, type, data )
1654 Sint32 internalFormat
1661 glTexImage1D(target,level,internalFormat,width,border,format,type,data);
1664 glTexSubImage1D ( target, level, xoffset, width, format, type, data )
1673 glTexSubImage1D(target,level,xoffset,width,format,type,data);
1676 glCopyTexImage1D ( target, level, internalFormat, x, y, width, border )
1679 Sint32 internalFormat
1685 glCopyTexImage1D(target,level,internalFormat,x,y,width,border);
1688 glCopyTexSubImage1D ( target, level, xoffset, x, y, width )
1696 glCopyTexSubImage1D(target,level,xoffset,x,y,width);
1698 #ifdef GL_VERSION_1_3
1701 glTexImage3D ( target, level, internalFormat, width, height, depth, border, format, type, data )
1704 Sint32 internalFormat
1713 glTexImage3D(target,level,internalFormat,width,height,depth,border,format,type,data);
1716 glTexSubImage3D ( target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, data )
1729 glTexSubImage3D(target,level,xoffset,yoffset,zoffset,
1730 width,height,depth,format,type,data);
1733 glCopyTexSubImage3D ( target, level, xoffset, yoffset, zoffset, x, y, width, height )
1744 glCopyTexSubImage3D(target,level,xoffset,yoffset,zoffset,x,y,width,height);
1746 #endif // GL_VERSION_1_3
1754 names = (GLuint*)safemalloc(sizeof(GLuint)*n);
1756 glGenTextures(n,names);
1757 for ( i = 0; i < n; i++ ) {
1758 av_push(RETVAL,newSViv(names[i]));
1765 glIsTexture ( texture )
1768 RETVAL = glIsTexture(texture);
1773 glBindTexture ( target, texture )
1777 glBindTexture(target,texture);
1780 glDeleteTextures ( ... )
1784 textures = (GLuint*)safemalloc(sizeof(GLuint) * items);
1786 for ( i = 0; i < items; i++ ) {
1787 textures[i] = SvIV(ST(i));
1790 glDeleteTextures(items,textures);
1794 glAreTexturesResident ( ... )
1800 textures = (GLuint*)safemalloc(sizeof(GLuint) * items);
1801 homes = (GLboolean*)safemalloc(sizeof(GLboolean) * items);
1803 for ( i = 0; i < items; i++ ) {
1804 textures[i] = SvIV(ST(i));
1807 if ( GL_FALSE != glAreTexturesResident(items,textures,homes)) {
1808 for (i = 0; i < items; i++ ) {
1809 av_push(RETVAL,newSViv(homes[i]));
1818 glPrioritizeTextures ( n, names, priorities )
1823 glPrioritizeTextures(n,(GLuint*)names,(const GLclampf *)priorities);
1826 glTexEnv ( target, name, ... )
1833 case GL_TEXTURE_ENV_MODE:
1835 glTexEnvi(target,name,p);
1837 case GL_TEXTURE_ENV_COLOR:
1838 pv[0] = SvNV(ST(2));
1839 pv[1] = SvNV(ST(3));
1840 pv[2] = SvNV(ST(4));
1841 pv[3] = SvNV(ST(5));
1842 glTexEnvfv(target,name,pv);
1850 if ( items < 1 || items > 4 )
1851 Perl_croak (aTHX_ "usage: SDL::OpenGL::TexCoord(s,[t,[r,[q]]])");
1864 glTexCoord4d(s,t,r,q);
1867 glTexParameter ( target, name, ... )
1874 case GL_TEXTURE_BORDER_COLOR:
1875 pv[0] = SvNV(ST(2));
1876 pv[1] = SvNV(ST(3));
1877 pv[2] = SvNV(ST(4));
1878 pv[3] = SvNV(ST(5));
1879 glTexParameterfv(target,name,pv);
1881 case GL_TEXTURE_PRIORITY:
1882 case GL_TEXTURE_MIN_LOD:
1883 case GL_TEXTURE_MAX_LOD:
1884 pv[0] = SvNV(ST(2));
1885 glTexParameterf(target,name,pv[0]);
1887 case GL_TEXTURE_BASE_LEVEL:
1888 case GL_TEXTURE_MAX_LEVEL:
1891 glTexParameteri(target,name,p);
1896 glTexGen ( coord, name, ... )
1904 case GL_TEXTURE_GEN_MODE:
1906 glTexGeni(coord,name,p);
1910 Perl_croak(aTHX_ "usage: glTexGen(coord,name,...)");
1911 pv = (GLdouble*)safemalloc(sizeof(GLdouble)*(items-2));
1912 for ( i = 0; i < items - 2; i++ ) {
1913 pv[i] = SvNV(ST(i+2));
1915 glTexGendv(coord,name,pv);
1920 #ifdef GL_VERSION_1_3
1923 glActiveTextureARB ( texUnit )
1926 glActiveTextureARB(texUnit);
1929 glMultiTexCoord ( texUnit, ... )
1933 if ( items < 2 || items > 5 )
1934 Perl_croak (aTHX_ "usage: SDL::OpenGL::MultiTexCoord(tex,s,[t,[r,[q]]])");
1947 glMultiTexCoord4dARB(texUnit,s,t,r,q);
1949 #endif // GL_VERSION_1_3
1952 glDrawBuffer ( mode )
1958 glReadBuffer ( mode )
1964 glIndexMask ( mask )
1970 glColorMask ( red, green, blue, alpha )
1976 glColorMask(red,green,blue,alpha);
1979 glDepthMask ( flag )
1985 glStencilMask ( mask )
1988 glStencilMask(mask);
1991 glScissor ( x , y, width, height )
1997 glScissor(x,y,width,height);
2000 glAlphaFunc ( func, ref )
2004 glAlphaFunc(func,ref);
2007 glStencilFunc ( func, ref, mask )
2012 glStencilFunc(func,ref,mask);
2015 glStencilOp ( fail, zfail, zpass )
2020 glStencilOp(fail,zfail,zpass);
2023 glDepthFunc ( func )
2029 glLogicOp ( opcode )
2035 glAccum ( op, value )
2042 glMap1 ( target, u1, u2, stride, order, points )
2050 glMap1d(target,u1,u2,stride,order,(double*)points);
2059 glMapGrid1 ( n, u1, u2 )
2064 glMapGrid1d(n,u1,u2);
2067 glEvalMesh1 ( mode, p1, p2 )
2072 glEvalMesh1(mode,p1,p2);
2075 glMap2 ( target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points )
2087 glMap2d(target,u1,u2,ustride,uorder,v1,v2,vstride,vorder,(double*)points);
2090 glEvalCoord2 ( u, v )
2097 glMapGrid2 ( nu, u1, u2, nv, v1, v2 )
2105 glMapGrid2d(nu,u1,u2,nv,v1,v2);
2108 glEvalMesh2 ( mode, i1, i2, j1, j2 )
2115 glEvalMesh2(mode,i1,i2,j1,j2);
2120 RETVAL = glGetError();
2125 glRenderMode ( mode )
2128 RETVAL = glRenderMode( mode );
2155 glFeedbackBuffer ( size, type, buffer )
2160 glFeedbackBuffer(size,type,buffer);
2163 glPassThrough ( token )
2166 glPassThrough(token);
2174 gluLookAt ( eyex, eyey, eyez, centerx, centery, centerz, upx, upy, upz )
2185 gluLookAt(eyex,eyey,eyez,centerx,centery,centerz,upx,upy,upz);
2188 gluPerspective ( fovy, aspect, n, f )
2194 gluPerspective(fovy,aspect,n,f);
2197 gluPickMatrix ( x, y, delx, dely, viewport )
2204 gluPickMatrix(x,y,delx,dely,viewport);
2207 gluOrtho2D ( left, right, bottom, top )
2213 gluOrtho2D(left,right,bottom,top);
2216 gluScaleImage ( format, widthin, heightin, typein, datain, widthout, heightout, typeout, dataout )
2227 RETVAL = gluScaleImage(format,widthin,heightin,typein,datain,
2228 widthout,heightout,typeout,dataout);
2233 gluBuild1DMipmaps ( target, internalFormat, width, format, type, data )
2235 Sint32 internalFormat
2241 RETVAL = gluBuild1DMipmaps(target,internalFormat,width,format,type,data);
2246 gluBuild2DMipmaps ( target, internalFormat, width, height, format, type, data )
2248 Sint32 internalFormat
2255 RETVAL = gluBuild2DMipmaps(target,internalFormat,width,height,format,type,data);
2260 #if HAVE_GLU_VERSION >= 12
2262 gluBuild3DMipmaps ( target, internalFormat, width, height, depth, format, type, data )
2264 Sint32 internalFormat
2272 RETVAL = gluBuild3DMipmaps(target,internalFormat,width,height,depth,
2279 gluBuild3DMipmaps ( )
2281 Perl_croak (aTHX_ "SDL::OpenGL::Build3DMipmaps requires GLU 1.2");
2285 #if HAVE_GLU_VERSION >= 12
2287 gluBuild1DMipmapLevels ( target, internalFormat, width, format, type, level, base, max, data )
2289 Sint32 internalFormat
2298 RETVAL = gluBuild1DMipmapLevels(target,internalFormat,width,
2299 format,type,level,base,max,data);
2305 gluBuild1DMipmapLevels ()
2307 Perl_croak(aTHX_ "SDL::OpenGL::Build1DMipmapLevels requires GLU 1.2");
2311 #if HAVE_GLU_VERSION >= 12
2313 gluBuild2DMipmapLevels ( target, internalFormat, width, height, format, type, level, base, max, data )
2315 Sint32 internalFormat
2325 RETVAL = gluBuild2DMipmapLevels(target,internalFormat,width,height,
2326 format,type,level,base,max,data);
2332 gluBuild2DMipmapLevels ()
2334 Perl_croak(aTHX_ "SDL::OpenGL::Build2DMipmapLevels requires GLU 1.2");
2338 #if HAVE_GLU_VERSION >= 12
2340 gluBuild3DMipmapLevels ( target, internalFormat, width, height, depth, format, type, level, base, max, data )
2342 Sint32 internalFormat
2353 RETVAL = gluBuild3DMipmapLevels(target,internalFormat,width,height,depth,
2354 format,type,level,base,max,data);
2360 gluBuild3DMipmapLevels ()
2362 Perl_croak(aTHX_ "SDL::OpenGL::Build3DMipmapLevels requires GLU 1.2");
2367 gluErrorString ( code )
2370 RETVAL = (char*)gluErrorString(code);
2375 gluNewNurbsRenderer ()
2377 RETVAL = gluNewNurbsRenderer();
2382 gluDeleteNurbsRenderer ( obj )
2385 gluDeleteNurbsRenderer(obj);
2388 gluNurbsProperty ( obj, property, value )
2393 gluNurbsProperty(obj,property,(float)value);
2396 gluLoadSamplingMatrices ( obj, mm, pm, vp )
2402 gluLoadSamplingMatrices(obj,(GLfloat*)mm,(GLfloat*)pm,(GLint*)vp);
2405 gluGetNurbsProperty ( obj, property )
2410 gluGetNurbsProperty(obj,property,&f);
2416 gluNurbsCallback ( obj, which, cb )
2423 sdl_perl_nurbs_error_hook = cb;
2424 gluNurbsCallback(obj,GLU_ERROR,(GLvoid*)sdl_perl_nurbs_error_callback);
2426 #ifdef GLU_NURBS_BEGIN
2427 case GLU_NURBS_BEGIN:
2428 case GLU_NURBS_BEGIN_DATA:
2429 gluNurbsCallbackData(obj,(void*)cb);
2430 gluNurbsCallback(obj,GLU_NURBS_BEGIN_DATA,
2431 (GLvoid*)sdl_perl_nurbs_being_callback);
2433 case GLU_NURBS_TEXTURE_COORD:
2434 case GLU_NURBS_TEXTURE_COORD_DATA:
2435 gluNurbsCallbackData(obj,(void*)cb);
2436 gluNurbsCallback(obj,GLU_NURBS_TEXTURE_COORD_DATA,
2437 (GLvoid*)sdl_perl_nurbs_multi_callback);
2439 case GLU_NURBS_COLOR:
2440 case GLU_NURBS_COLOR_DATA:
2441 gluNurbsCallbackData(obj,(void*)cb);
2442 gluNurbsCallback(obj,GLU_NURBS_COLOR_DATA,
2443 (GLvoid*)sdl_perl_nurbs_multi_callback);
2445 case GLU_NURBS_NORMAL:
2446 case GLU_NURBS_NORMAL_DATA:
2447 gluNurbsCallbackData(obj,(void*)cb);
2448 gluNurbsCallback(obj,GLU_NURBS_NORMAL_DATA,
2449 (GLvoid*)sdl_perl_nurbs_multi_callback);
2451 case GLU_NURBS_VERTEX:
2452 case GLU_NURBS_VERTEX_DATA:
2453 gluNurbsCallbackData(obj,(void*)cb);
2454 gluNurbsCallback(obj,GLU_NURBS_VERTEX_DATA,
2455 (GLvoid*)sdl_perl_nurbs_multi_callback);
2458 case GLU_NURBS_END_DATA:
2459 gluNurbsCallbackData(obj,(void*)cb);
2460 gluNurbsCallback(obj,GLU_NURBS_END_DATA,
2461 (GLvoid*)sdl_perl_nurbs_end_callback);
2465 Perl_croak(aTHX_ "SDL::OpenGL::NurbsCallback - invalid type");
2469 gluNurbsCallbackData ( obj, cb )
2473 gluNurbsCallbackData(obj,(void*)cb);
2476 gluBeginSurface ( obj )
2479 gluBeginSurface(obj);
2482 gluEndSurface ( obj )
2488 gluNurbsSurface ( obj, uknot_count, uknot, vknot_count, vknot, u_stride, v_stride, ctlarray, uorder, vorder, type )
2501 gluNurbsSurface(obj,uknot_count,(GLfloat*)uknot,vknot_count,(GLfloat*)vknot,
2502 u_stride,v_stride,(GLfloat*)ctlarray,uorder,vorder,type);
2505 gluBeginCurve ( obj )
2517 gluNurbsCurve ( obj, uknot_count, uknot, u_stride, ctlarray, uorder, type )
2526 gluNurbsCurve(obj,uknot_count,(GLfloat*)uknot,u_stride,(GLfloat*)ctlarray,
2530 gluBeginTrim ( obj )
2542 gluPwlCurve ( obj, count, array, stride, type )
2549 gluPwlCurve(obj,count,(GLfloat*)array,stride,type);
2552 gluUnProject ( winx, winy, winz, mm, pm, vp )
2560 GLdouble objx, objy, objz;
2562 av_push(RETVAL,newSViv(gluUnProject(winx,winy,winz,(GLdouble*)mm,
2563 (GLdouble*)pm,(GLint*)vp,&objx,&objy,&objz)));
2564 av_push(RETVAL,newSVnv((double)objx));
2565 av_push(RETVAL,newSVnv((double)objy));
2566 av_push(RETVAL,newSVnv((double)objz));
2571 #ifdef GL_VERSION_1_3
2574 gluUnProject4 ( winx, winy, winz, clipw, mm, pm, vp, n, f )
2585 GLdouble objx, objy, objz, objw;
2587 av_push(RETVAL,newSViv(gluUnProject4(winx,winy,winz,clipw,(GLdouble*)mm,
2588 (GLdouble*)pm,(GLint*)vp,(GLclampd)n,(GLclampd)f,
2589 &objx,&objy,&objz,&objw)));
2590 av_push(RETVAL,newSVnv((double)objx));
2591 av_push(RETVAL,newSVnv((double)objy));
2592 av_push(RETVAL,newSVnv((double)objz));
2593 av_push(RETVAL,newSVnv((double)objw));
2597 #endif // GL_VERSION_1_3
2600 gluProject ( objx, objy, objz, mm, pm, vp )
2608 GLdouble winx, winy, winz;
2610 av_push(RETVAL,newSViv(gluUnProject(objx,objy,objz,(GLdouble*)mm,
2611 (GLdouble*)pm,(GLint*)vp,&winx,&winy,&winz)));
2612 av_push(RETVAL,newSVnv((double)winx));
2613 av_push(RETVAL,newSVnv((double)winy));
2614 av_push(RETVAL,newSVnv((double)winz));
2618 #ifdef GL_VERSION_1_2
2623 RETVAL = gluNewTess();
2628 gluTessCallback ( tess, type )
2633 case GLU_TESS_BEGIN:
2634 case GLU_TESS_BEGIN_DATA:
2635 gluTessCallback(tess,GLU_TESS_BEGIN_DATA,
2636 (GLvoid*)sdl_perl_tess_begin_callback);
2639 case GLU_TESS_EDGE_FLAG:
2640 case GLU_TESS_EDGE_FLAG_DATA:
2641 gluTessCallback(tess,GLU_TESS_EDGE_FLAG_DATA,
2642 (GLvoid*)sdl_perl_tess_edge_flag_callback);
2645 case GLU_TESS_VERTEX:
2646 case GLU_TESS_VERTEX_DATA:
2647 gluTessCallback(tess,GLU_TESS_VERTEX_DATA,
2648 (GLvoid*)sdl_perl_tess_vertex_callback);
2652 case GLU_TESS_END_DATA:
2653 gluTessCallback(tess,GLU_TESS_END_DATA,
2654 (GLvoid*)sdl_perl_tess_end_callback);
2657 case GLU_TESS_COMBINE:
2658 case GLU_TESS_COMBINE_DATA:
2659 gluTessCallback(tess,GLU_TESS_COMBINE_DATA,
2660 (GLvoid*)sdl_perl_tess_combine_callback);
2663 case GLU_TESS_ERROR:
2664 case GLU_TESS_ERROR_DATA:
2665 gluTessCallback(tess,GLU_TESS_ERROR_DATA,
2666 (GLvoid*)sdl_perl_tess_error_callback);
2671 gluTessProperty ( tessobj, property, value )
2672 GLUtesselator *tessobj
2676 gluTessProperty(tessobj,property,value);
2679 gluGetTessProperty ( tessobj, property )
2680 GLUtesselator *tessobj
2683 gluGetTessProperty(tessobj,property,&RETVAL);
2688 gluTessNormal ( tessobj, x, y, z )
2689 GLUtesselator *tessobj
2694 gluTessNormal(tessobj,x,y,z);
2697 gluTessBeginPolygon ( tessobj, cb )
2698 GLUtesselator *tessobj
2701 gluTessBeginPolygon(tessobj,cb);
2704 gluTessEndPolygon ( tessobj )
2705 GLUtesselator *tessobj
2707 gluTessEndPolygon(tessobj);
2710 gluTessBeginContour ( tessobj )
2711 GLUtesselator *tessobj
2713 gluTessBeginContour(tessobj);
2716 gluTessEndContour ( tessobj )
2717 GLUtesselator *tessobj
2719 gluTessEndContour(tessobj);
2722 gluDeleteTess ( tessobj )
2723 GLUtesselator *tessobj
2725 gluDeleteTess(tessobj);
2728 gluTessVertex ( tessobj, coords, vd )
2729 GLUtesselator *tessobj
2733 gluTessVertex(tessobj,(GLdouble*)coords,vd);