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:
46 #if defined(__WIN32__) && defined(__MINGW32__)
48 this is a sort of dirty hack - MS Windows supports just OpenGL 1.1 and all 1.2+
49 related stuff was moved from GL/gl.h to GL/glext.h; however this separation
50 was done not properly and even if we are OK with OpenGL 1.1 there are some
51 constants missing in GL/gl.h thus we need also GL/glext.h
63 #define HAVE_TLS_CONTEXT
66 #ifndef GL_ALL_CLIENT_ATTRIB_BITS
67 #define GL_ALL_CLIENT_ATTRIB_BITS 0xFFFFFFF
68 #endif /* GL_ALL_CLIENT_BITS */
72 #include "../../src/defines.h"
74 SV* sdl_perl_nurbs_error_hook;
76 sdl_perl_nurbs_error_callback ( GLenum errorCode )
84 XPUSHs(sv_2mortal(newSViv(errorCode)));
87 call_sv(sdl_perl_nurbs_error_hook,G_VOID);
95 sdl_perl_nurbs_being_callback ( GLenum type, void *cb )
106 XPUSHs(sv_2mortal(newSViv(type)));
117 sdl_perl_nurbs_multi_callback ( GLfloat *vec, void *cb )
128 XPUSHs(sv_2mortal(newSViv(PTR2IV(vec))));
139 sdl_perl_nurbs_end_callback ( void *cb )
157 sdl_perl_tess_end_callback ( void *cb )
168 XPUSHs(sv_2mortal(newSViv(GLU_TESS_BEGIN)));
179 sdl_perl_tess_begin_callback ( GLenum type, void *cb )
190 XPUSHs(sv_2mortal(newSViv(GLU_TESS_BEGIN)));
191 XPUSHs(sv_2mortal(newSViv(type)));
202 sdl_perl_tess_error_callback ( GLenum type, void *cb )
213 XPUSHs(sv_2mortal(newSViv(GLU_TESS_ERROR)));
214 XPUSHs(sv_2mortal(newSViv(type)));
225 sdl_perl_tess_edge_flag_callback ( GLenum flag, void *cb )
236 XPUSHs(sv_2mortal(newSViv(GLU_TESS_EDGE_FLAG)));
237 XPUSHs(sv_2mortal(newSViv(flag)));
248 sdl_perl_tess_vertex_callback ( double *vd, void *cb )
259 XPUSHs(sv_2mortal(newSViv(GLU_TESS_VERTEX)));
260 XPUSHs(sv_2mortal(newSVnv(vd[0])));
261 XPUSHs(sv_2mortal(newSVnv(vd[1])));
262 XPUSHs(sv_2mortal(newSVnv(vd[2])));
263 XPUSHs(sv_2mortal(newSVnv(vd[3])));
264 XPUSHs(sv_2mortal(newSVnv(vd[4])));
265 XPUSHs(sv_2mortal(newSVnv(vd[5])));
276 sdl_perl_tess_combine_callback ( GLdouble coords[3], double *vd[4], GLfloat weight[4],
277 GLdouble **out, void *cb )
290 XPUSHs(sv_2mortal(newSViv(GLU_TESS_COMBINE)));
291 XPUSHs(sv_2mortal(newSVpvn((char*)coords,sizeof(GLdouble)*3)));
292 XPUSHs(sv_2mortal(newSVpvn((char*)vd,sizeof(GLdouble*)*4)));
293 XPUSHs(sv_2mortal(newSVpvn((char*)weight,sizeof(GLfloat)*4)));
296 if ( 1 != call_sv(cmd,G_SCALAR) ) {
297 Perl_croak(aTHX_ "sdl_perl_tess_combine_callback failed");
300 data = (double*)POPp;
302 *out = (double*)malloc(sizeof(double)*width);
303 memcpy(*out,data,sizeof(double)*width);
310 MODULE = SDL::OpenGL PACKAGE = SDL::OpenGL
316 glClearColor ( r, g, b, a)
322 glClearColor((GLfloat)r,(GLfloat)g,(GLfloat)b,(GLfloat)a);
325 glClearIndex ( index )
331 glClearDepth ( depth )
343 glClearAccum ( r, g, b, a )
349 glClearAccum((GLfloat)r,(GLfloat)g,(GLfloat)b,(GLfloat)a);
371 glRecti(r->x,r->y,r->x+r->w,r->y+r->h);
374 glVertex ( x, y, ... )
383 } else if ( items == 3 ) {
418 case GL_EDGE_FLAG_ARRAY:
419 case GL_MAP1_TEXTURE_COORD_1:
420 case GL_LIGHT_MODEL_TWO_SIDE:
421 case GL_INDEX_LOGIC_OP:
422 case GL_PACK_ALIGNMENT:
424 case GL_TEXTURE_GEN_S:
425 case GL_MAP1_VERTEX_3:
428 case GL_NORMAL_ARRAY:
432 case GL_POLYGON_OFFSET_FILL:
433 case GL_MAP1_TEXTURE_COORD_4:
436 case GL_UNPACK_SWAP_BYTES:
438 case GL_POLYGON_OFFSET_POINT:
439 case GL_POINT_SMOOTH:
441 case GL_MAP2_TEXTURE_COORD_4:
443 case GL_POLYGON_OFFSET_LINE:
446 case GL_PACK_LSB_FIRST:
447 case GL_MAP1_TEXTURE_COORD_2:
448 case GL_MAP2_VERTEX_3:
449 case GL_MAP2_TEXTURE_COORD_2:
451 case GL_DOUBLEBUFFER:
452 case GL_UNPACK_LSB_FIRST:
453 case GL_TEXTURE_COORD_ARRAY:
455 case GL_TEXTURE_GEN_Q:
463 case GL_TEXTURE_GEN_R:
464 case GL_PACK_SWAP_BYTES:
465 case GL_DEPTH_WRITEMASK:
466 case GL_COLOR_LOGIC_OP:
471 case GL_COLOR_MATERIAL:
474 case GL_MAP1_VERTEX_4:
478 case GL_POLYGON_SMOOTH:
480 case GL_MAP2_COLOR_4:
482 case GL_VERTEX_ARRAY:
483 case GL_MAP1_TEXTURE_COORD_3:
484 case GL_STENCIL_TEST:
485 case GL_MAP2_TEXTURE_COORD_3:
486 case GL_TEXTURE_GEN_T:
487 case GL_LIGHT_MODEL_LOCAL_VIEWER:
489 case GL_MAP1_COLOR_4:
490 case GL_MAP2_TEXTURE_COORD_1:
491 case GL_CURRENT_RASTER_POSITION_VALID:
493 case GL_SCISSOR_TEST:
495 case GL_POLYGON_STIPPLE:
498 case GL_LINE_STIPPLE:
499 case GL_MAP2_VERTEX_4:
503 glGetBooleanv(param, ret);
505 for (i = 0; i < 1; i++) {
506 XPUSHs(sv_2mortal(newSViv(ret[i])));
510 case GL_COLOR_WRITEMASK:
514 glGetBooleanv(param, ret);
516 for (i = 0; i < 4; i++) {
517 XPUSHs(sv_2mortal(newSViv(ret[i])));
522 case GL_ALPHA_TEST_REF:
523 case GL_POINT_SIZE_GRANULARITY:
524 case GL_CURRENT_RASTER_DISTANCE:
530 case GL_DEPTH_CLEAR_VALUE:
537 case GL_POLYGON_OFFSET_FACTOR:
540 case GL_POLYGON_OFFSET_UNITS:
542 case GL_LINE_WIDTH_GRANULARITY:
548 glGetDoublev(param, ret);
550 for (i = 0; i < 1; i++) {
551 XPUSHs(sv_2mortal(newSVnv(ret[i])));
555 case GL_MODELVIEW_MATRIX:
556 case GL_TEXTURE_MATRIX:
557 case GL_PROJECTION_MATRIX:
561 glGetDoublev(param, ret);
563 for (i = 0; i < 16; i++) {
564 XPUSHs(sv_2mortal(newSVnv(ret[i])));
568 case GL_POINT_SIZE_RANGE:
569 case GL_LINE_WIDTH_RANGE:
570 case GL_MAP1_GRID_DOMAIN:
575 glGetDoublev(param, ret);
577 for (i = 0; i < 2; i++) {
578 XPUSHs(sv_2mortal(newSVnv(ret[i])));
582 case GL_CURRENT_NORMAL:
586 glGetDoublev(param, ret);
588 for (i = 0; i < 3; i++) {
589 XPUSHs(sv_2mortal(newSVnv(ret[i])));
594 case GL_MAP2_GRID_DOMAIN:
595 case GL_CURRENT_RASTER_POSITION:
596 case GL_CURRENT_COLOR:
597 case GL_LIGHT_MODEL_AMBIENT:
598 case GL_CURRENT_RASTER_TEXTURE_COORDS:
599 case GL_TEXTURE_ENV_COLOR:
600 case GL_CURRENT_RASTER_COLOR:
601 case GL_CURRENT_TEXTURE_COORDS:
602 case GL_COLOR_CLEAR_VALUE:
603 case GL_ACCUM_CLEAR_VALUE:
607 glGetDoublev(param, ret);
609 for (i = 0; i < 4; i++) {
610 XPUSHs(sv_2mortal(newSVnv(ret[i])));
614 case GL_CULL_FACE_MODE:
615 case GL_PIXEL_MAP_I_TO_A_SIZE:
616 case GL_PIXEL_MAP_A_TO_A_SIZE:
618 case GL_EDGE_FLAG_ARRAY_STRIDE:
623 case GL_POINT_SMOOTH_HINT:
624 case GL_PACK_SKIP_PIXELS:
626 case GL_STENCIL_CLEAR_VALUE:
628 case GL_COLOR_MATERIAL_PARAMETER:
629 case GL_ACCUM_BLUE_BITS:
631 case GL_VERTEX_ARRAY_STRIDE:
632 case GL_STENCIL_PASS_DEPTH_PASS:
633 case GL_CLIENT_ATTRIB_STACK_DEPTH:
635 case GL_LINE_STIPPLE_REPEAT:
637 case GL_PIXEL_MAP_B_TO_B_SIZE:
638 case GL_MAX_PIXEL_MAP_TABLE:
639 case GL_MAX_TEXTURE_SIZE:
640 case GL_PIXEL_MAP_S_TO_S_SIZE:
641 case GL_LOGIC_OP_MODE:
644 case GL_LINE_SMOOTH_HINT:
645 case GL_ALPHA_TEST_FUNC:
648 case GL_MAX_NAME_STACK_DEPTH:
649 case GL_INDEX_ARRAY_TYPE:
650 case GL_TEXTURE_COORD_ARRAY_TYPE:
651 case GL_COLOR_ARRAY_TYPE:
652 case GL_MAX_LIST_NESTING:
653 case GL_STENCIL_WRITEMASK:
655 case GL_ACCUM_ALPHA_BITS:
656 case GL_INDEX_ARRAY_STRIDE:
657 case GL_PIXEL_MAP_I_TO_B_SIZE:
659 case GL_STENCIL_FAIL:
660 case GL_UNPACK_ALIGNMENT:
661 case GL_STENCIL_PASS_DEPTH_FAIL:
662 case GL_ATTRIB_STACK_DEPTH:
663 case GL_PACK_SKIP_ROWS:
664 case GL_TEXTURE_STACK_DEPTH:
666 case GL_COLOR_ARRAY_STRIDE:
668 case GL_UNPACK_SKIP_PIXELS:
669 case GL_PIXEL_MAP_G_TO_G_SIZE:
670 case GL_VERTEX_ARRAY_TYPE:
672 case GL_MAX_CLIENT_ATTRIB_STACK_DEPTH:
673 case GL_INDEX_CLEAR_VALUE:
674 case GL_PIXEL_MAP_I_TO_G_SIZE:
676 case GL_PIXEL_MAP_I_TO_R_SIZE:
677 case GL_COLOR_ARRAY_SIZE:
678 case GL_TEXTURE_COORD_ARRAY_SIZE:
679 case GL_MAP1_GRID_SEGMENTS:
680 case GL_VERTEX_ARRAY_SIZE:
681 case GL_PIXEL_MAP_R_TO_R_SIZE:
682 case GL_TEXTURE_COORD_ARRAY_STRIDE:
683 case GL_MODELVIEW_STACK_DEPTH:
684 case GL_MAX_TEXTURE_STACK_DEPTH:
685 case GL_PIXEL_MAP_I_TO_I_SIZE:
687 case GL_INDEX_WRITEMASK:
688 case GL_PACK_ROW_LENGTH:
689 case GL_CURRENT_INDEX:
690 case GL_STENCIL_VALUE_MASK:
691 case GL_UNPACK_SKIP_ROWS:
692 case GL_MAX_PROJECTION_STACK_DEPTH:
694 case GL_STENCIL_FUNC:
695 case GL_INDEX_OFFSET:
696 case GL_UNPACK_ROW_LENGTH:
697 case GL_COLOR_MATERIAL_FACE:
698 case GL_NORMAL_ARRAY_TYPE:
699 case GL_STENCIL_BITS:
700 case GL_PROJECTION_STACK_DEPTH:
701 case GL_CURRENT_RASTER_INDEX:
703 case GL_TEXTURE_ENV_MODE:
704 case GL_NORMAL_ARRAY_STRIDE:
705 case GL_PERSPECTIVE_CORRECTION_HINT:
706 case GL_MAX_CLIP_PLANES:
707 case GL_MAX_MODELVIEW_STACK_DEPTH:
708 case GL_SUBPIXEL_BITS:
709 case GL_ACCUM_RED_BITS:
712 case GL_MAX_EVAL_ORDER:
713 case GL_LINE_STIPPLE_PATTERN:
714 case GL_NAME_STACK_DEPTH:
715 case GL_MAX_ATTRIB_STACK_DEPTH:
716 case GL_POLYGON_SMOOTH_HINT:
717 case GL_ACCUM_GREEN_BITS:
721 glGetIntegerv(param, ret);
723 for (i = 0; i < 1; i++) {
724 XPUSHs(sv_2mortal(newSViv(ret[i])));
728 case GL_POLYGON_MODE:
729 case GL_MAX_VIEWPORT_DIMS:
730 case GL_MAP2_GRID_SEGMENTS:
734 glGetIntegerv(param, ret);
736 for (i = 0; i < 2; i++) {
737 XPUSHs(sv_2mortal(newSViv(ret[i])));
746 glGetIntegerv(param, ret);
748 for (i = 0; i < 4; i++) {
749 XPUSHs(sv_2mortal(newSViv(ret[i])));
754 croak("Unknown glGet parameter!");
762 RETVAL = glIsEnabled(cap);
770 glPointSize((GLfloat)size);
776 glLineWidth((GLfloat)size);
779 glLineStipple ( factor, pattern )
783 glLineStipple(factor,pattern);
786 glPolygonMode ( face, mode )
790 glPolygonMode(face,mode);
805 glPolygonStipple ( mask )
808 glPolygonStipple(mask);
825 glEnableClientState ( array )
828 glEnableClientState(array);
831 glDisableClientState ( array )
834 glDisableClientState(array);
837 glVertexPointer ( size, type, stride, pointer)
843 glVertexPointer(size,type,stride,pointer);
846 glColorPointer ( size, type, stride, pointer )
852 glColorPointer(size,type,stride,pointer);
855 glNormalPointer ( type, stride, pointer )
860 glNormalPointer(type,stride,pointer);
863 glTexCoordPointer ( size, type, stride, pointer )
869 glTexCoordPointer(size,type,stride,pointer);
872 glEdgeFlagPointer ( stride, pointer )
876 glEdgeFlagPointer(stride,pointer);
879 glArrayElement ( ith )
885 glDrawElements ( mode, count, type, indices )
891 glDrawElements( mode, count, type, indices);
893 #ifdef GL_VERSION_1_2
896 glDrawRangeElements ( mode, start, end, count, type, indices )
904 glDrawRangeElements(mode,start,end,count,type,indices);
906 #endif // GL_VERSION_1_2
909 glDrawArrays ( mode, first, count )
914 glDrawArrays(mode,first,count);
917 glInterleavedArrays ( format, stride, pointer )
922 glInterleavedArrays(format,stride,pointer);
925 glPushAttrib ( mask )
936 glPushClientAttrib ( mask )
939 glPushClientAttrib(mask);
947 glMatrixMode ( mode )
962 for ( i = 0; i < 16; i++ ) {
963 mat[i] = i < items ? SvNV(ST(i)) : 0.0;
972 for ( i = 0; i < 16; i++ ) {
973 mat[i] = i < items ? SvNV(ST(i)) : 0.0;
978 glTranslate ( x, y, z )
986 glRotate ( angle, x, y, z )
992 glRotated(angle,x,y,z);
1003 glFrustum ( left, right, bottom, top, n, f )
1011 glFrustum(left,right,bottom,top,n,f);
1014 glOrtho ( left, right, bottom, top, n, f )
1022 glOrtho(left,right,bottom,top,n,f);
1025 glViewport ( x, y, width, height )
1031 glViewport(x,y,width,height);
1034 glDepthRange ( n, f )
1051 glClipPlane ( plane, ... )
1056 for (i = 0; i < 4; i++ ) {
1057 v[i] = i+1 < items ? SvNV(ST(i+1)) : 0.0;
1059 glClipPlane(plane,v);
1062 glColor ( r, g, b, ... )
1082 glShadeModel ( mode )
1088 glLight ( light, name, ... )
1095 for ( i = 0; i < 4; i++ ) {
1096 v[i] = SvNV(ST(i+2));
1098 glLightfv(light,name,v);
1099 } else if ( items == 5 ) {
1101 for ( i = 0; i < 3; i++ ) {
1102 v[i] = SvNV(ST(i+2));
1104 glLightfv(light,name,v);
1105 } else if ( items == 3 ) {
1108 glLightf(light,name,v);
1110 Perl_croak(aTHX_ "SDL::OpenGL::Light invalid arguments");
1114 glLightModel ( pname, ... )
1118 if ( pname == GL_LIGHT_MODEL_LOCAL_VIEWER ||
1119 pname == GL_LIGHT_MODEL_TWO_SIDE ||
1120 pname == GL_LIGHT_MODEL_COLOR_CONTROL ) {
1121 glLightModelf(pname,SvNV(ST(1)));
1122 } else if ( pname == GL_LIGHT_MODEL_AMBIENT) {
1123 vec[0] = SvNV(ST(1));
1124 vec[1] = SvNV(ST(2));
1125 vec[2] = SvNV(ST(3));
1126 vec[3] = SvNV(ST(4));
1127 glLightModelfv(pname,vec);
1129 Perl_croak(aTHX_ "SDL::OpenGL::glLightModel unknown model %d",pname);
1133 glMaterial ( face, name, ... )
1140 for ( i = 0; i < 4; i++ ) {
1141 v[i] = SvNV(ST(i+2));
1143 glMaterialfv(face,name,v);
1144 } else if ( items == 5 ) {
1146 for ( i = 0; i < 3; i++ ) {
1147 v[i] = SvNV(ST(i+2));
1149 glMaterialfv(face,name,v);
1150 } else if ( items == 3 ) {
1153 glMaterialf(face,name,v);
1155 Perl_croak(aTHX_ "SDL::OpenGL::Material invalid arguments");
1159 glColorMaterial ( face, mode )
1163 glColorMaterial(face,mode);
1166 glBlendFunc ( sfactor, dfactor )
1170 glBlendFunc(sfactor,dfactor);
1174 glHint ( target, hint )
1178 glHint(target,hint);
1191 } else if ( items == 2 ) {
1196 Perl_croak(aTHX_ "SDL::OpenGL::Material invalid arguments");
1200 glPolygonOffset ( factor, units )
1204 glPolygonOffset(factor,units);
1207 glGenLists ( range )
1210 RETVAL = glGenLists(range);
1215 glNewList ( list, mode )
1219 glNewList(list,mode);
1227 glDeleteLists ( base, count )
1231 glDeleteLists(base, count);
1243 RETVAL = glIsList(list);
1258 i = (int*)safemalloc(sizeof(int)* (items));
1259 for ( j = 0; j < items; j++ ) {
1263 Perl_croak(aTHX_ "usage: SDL::OpenGL::CallLists(type,...)");
1265 glCallLists(items, GL_INT, i);
1269 glCallListsString ( string )
1274 str = SvPV(string,len);
1275 glCallLists(len,GL_BYTE,str);
1278 glRasterPos ( x, y, z, ... )
1284 double w = SvNV(ST(3));
1285 glRasterPos4d(x,y,z,w);
1287 glRasterPos3d(x,y,z);
1291 glBitmap ( width, height, x1, y1, x2, y2, data )
1300 glBitmap(width,height,x1,y1,x2,y2,data);
1303 glDrawPixels ( width, height, format, type, pixels )
1310 glDrawPixels(width,height,format,type,pixels);
1314 glReadPixels ( x, y, width, height, format, type )
1324 size = 1; /* ALPHA, BLUE, GREEN or RED */
1325 if (format == GL_BGR || format == GL_RGB)
1327 if (format == GL_BGRA || format == GL_RGBA)
1329 len = height * width * size; /* in bytes */
1330 RETVAL = newSV(len); /* alloc len+1 bytes */
1331 SvPOK_on(RETVAL); /* make an PV */
1332 buf = SvPVX(RETVAL); /* get ptr to buffer */
1333 glReadPixels(x,y,width,height,format,type,buf);
1334 SvCUR_set(RETVAL, len); /* set real length */
1339 glReadPixel ( x, y )
1343 int rgba[4]; /* r,g,b,a */
1345 glReadPixels(x,y,1,1,GL_RGBA,GL_UNSIGNED_INT,rgba);
1347 for ( i = 0; i < 4; i++ ) {
1348 av_push(RETVAL,newSViv(rgba[i]));
1354 glCopyPixels ( x, y, width, height, buffer )
1361 glCopyPixels(x,y,width,height,buffer);
1364 glPixelStore ( name, param )
1368 glPixelStorei(name,param);
1371 glPixelTransfer ( name, ... )
1376 case GL_MAP_STENCIL:
1377 case GL_INDEX_SHIFT:
1378 case GL_INDEX_OFFSET:
1379 glPixelTransferi(name,SvIV(ST(1)));
1382 glPixelTransferf(name,SvNV(ST(1)));
1387 glPixelMap ( type, map, mapsize, values )
1394 case GL_UNSIGNED_INT:
1395 glPixelMapuiv(map,mapsize,(GLint*)values);
1397 case GL_UNSIGNED_SHORT:
1398 glPixelMapusv(map,mapsize,(GLushort*)values);
1401 glPixelMapfv(map,mapsize,(GLfloat*)values);
1406 glPixelZoom ( zoomx, zoomy )
1410 glPixelZoom(zoomx,zoomy);
1412 #ifdef GL_VERSION_1_3
1415 glColorTable ( target, internalFormat, width, format, type, data )
1417 GLenum internalFormat
1423 glColorTable(target,internalFormat,width,format,type,data);
1426 glColorTableParameter ( target, name, r, g, b, a)
1439 glColorTableParameterfv(target,name,vec);
1442 glCopyColorTable ( target, internalFormat, x, y, width )
1444 GLenum internalFormat
1449 glCopyColorTable(target,internalFormat,x,y,width);
1452 glColorSubTable ( target, start, count, format, type, data )
1460 glColorSubTable(target,start,count,format,type,data);
1463 glCopyColorSubTable ( target, start, x, y, count )
1470 glCopyColorSubTable(target,start,x,y,count);
1473 glConvolutionFilter2D ( target, internalFormat, width, height, format, type, image )
1475 Uint32 internalFormat
1482 glConvolutionFilter2D(target,internalFormat,width,height,format,type,image);
1485 glCopyConvolutionFilter2D ( target, internalFormat, x, y, width, height )
1487 Uint32 internalFormat
1493 glCopyConvolutionFilter2D(target,internalFormat,x,y,width,height);
1496 glSeparableFilter2D ( target, internalFormat, width, height, format, type, row, column )
1498 Uint32 internalFormat
1506 glSeparableFilter2D(target,internalFormat,width,height,format,type,row,column);
1509 glConvolutionFilter1D ( target, internalFormat, width, format, type, image )
1511 Uint32 internalFormat
1517 glConvolutionFilter1D(target,internalFormat,width,format,type,image);
1520 glCopyConvolutionFilter1D ( target, internalFormat, x, y, width )
1522 Uint32 internalFormat
1527 glCopyConvolutionFilter1D(target,internalFormat,x,y,width);
1530 glConvolutionParameter ( target, pname, ... )
1537 case GL_CONVOLUTION_BORDER_MODE:
1539 Perl_croak(aTHX_ "Usage: ConvolutionParameter(target,pname,...)");
1541 glConvolutionParameteri(target,pname,pi);
1543 case GL_CONVOLUTION_FILTER_SCALE:
1544 case GL_CONVOLUTION_FILTER_BIAS:
1546 Perl_croak(aTHX_ "Usage: ConvolutionParameter(target,pname,...)");
1547 pv[0] = (GLfloat)SvNV(ST(2));
1548 pv[1] = (GLfloat)SvNV(ST(3));
1549 pv[2] = (GLfloat)SvNV(ST(4));
1550 pv[3] = (GLfloat)SvNV(ST(5));
1551 glConvolutionParameterfv(target,pname,pv);
1554 Perl_croak(aTHX_ "ConvolutionParameter invalid parameter");
1559 glHistogram ( target, width, internalFormat, sink )
1562 Uint32 internalFormat
1565 glHistogram(target,width,internalFormat,sink);
1568 glGetHistogram ( target, reset, format, type, values )
1575 glGetHistogram(target,reset,format,type,values);
1578 glResetHistogram ( target )
1581 glResetHistogram(target);
1584 glMinmax ( target, internalFormat, sink )
1586 Uint32 internalFormat
1589 glMinmax(target,internalFormat,sink);
1592 glGetMinmax ( target, reset, format, type, values )
1599 glGetMinmax(target,reset,format,type,values);
1602 glResetMinmax ( target )
1605 glResetMinmax(target);
1608 glBlendEquation ( mode )
1611 glBlendEquation(mode);
1613 #endif // GL_VERSION_1_3
1616 glTexImage2D ( target, level, internalFormat, width, height, border, format, type, data )
1619 Sint32 internalFormat
1627 glTexImage2D(target,level,internalFormat,width,height,border,format,type,data);
1630 glCopyTexImage2D ( target, level, internalFormat, x, y, width, height, border )
1633 Sint32 internalFormat
1640 glCopyTexImage2D(target,level,internalFormat,x,y,width,height,border);
1643 glTexSubImage2D ( target, level, xoffset, yoffset, width, height, format, type, data )
1654 glTexSubImage2D(target,level,xoffset,yoffset,width,height,format,type,data);
1657 glCopyTexSubImage2D ( target, level, xoffset, yoffset, x, y, width, height )
1667 glCopyTexSubImage2D(target,level,xoffset,yoffset,x,y,width,height);
1670 glTexImage1D ( target, level, internalFormat, width, border, format, type, data )
1673 Sint32 internalFormat
1680 glTexImage1D(target,level,internalFormat,width,border,format,type,data);
1683 glTexSubImage1D ( target, level, xoffset, width, format, type, data )
1692 glTexSubImage1D(target,level,xoffset,width,format,type,data);
1695 glCopyTexImage1D ( target, level, internalFormat, x, y, width, border )
1698 Sint32 internalFormat
1704 glCopyTexImage1D(target,level,internalFormat,x,y,width,border);
1707 glCopyTexSubImage1D ( target, level, xoffset, x, y, width )
1715 glCopyTexSubImage1D(target,level,xoffset,x,y,width);
1717 #ifdef GL_VERSION_1_3
1720 glTexImage3D ( target, level, internalFormat, width, height, depth, border, format, type, data )
1723 Sint32 internalFormat
1732 glTexImage3D(target,level,internalFormat,width,height,depth,border,format,type,data);
1735 glTexSubImage3D ( target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, data )
1748 glTexSubImage3D(target,level,xoffset,yoffset,zoffset,
1749 width,height,depth,format,type,data);
1752 glCopyTexSubImage3D ( target, level, xoffset, yoffset, zoffset, x, y, width, height )
1763 glCopyTexSubImage3D(target,level,xoffset,yoffset,zoffset,x,y,width,height);
1765 #endif // GL_VERSION_1_3
1773 names = (GLuint*)safemalloc(sizeof(GLuint)*n);
1775 glGenTextures(n,names);
1776 for ( i = 0; i < n; i++ ) {
1777 av_push(RETVAL,newSViv(names[i]));
1784 glIsTexture ( texture )
1787 RETVAL = glIsTexture(texture);
1792 glBindTexture ( target, texture )
1796 glBindTexture(target,texture);
1799 glDeleteTextures ( ... )
1803 textures = (GLuint*)safemalloc(sizeof(GLuint) * items);
1805 for ( i = 0; i < items; i++ ) {
1806 textures[i] = SvIV(ST(i));
1809 glDeleteTextures(items,textures);
1813 glAreTexturesResident ( ... )
1819 textures = (GLuint*)safemalloc(sizeof(GLuint) * items);
1820 homes = (GLboolean*)safemalloc(sizeof(GLboolean) * items);
1822 for ( i = 0; i < items; i++ ) {
1823 textures[i] = SvIV(ST(i));
1826 if ( GL_FALSE != glAreTexturesResident(items,textures,homes)) {
1827 for (i = 0; i < items; i++ ) {
1828 av_push(RETVAL,newSViv(homes[i]));
1837 glPrioritizeTextures ( n, names, priorities )
1842 glPrioritizeTextures(n,(GLuint*)names,(const GLclampf *)priorities);
1845 glTexEnv ( target, name, ... )
1852 case GL_TEXTURE_ENV_MODE:
1854 glTexEnvi(target,name,p);
1856 case GL_TEXTURE_ENV_COLOR:
1857 pv[0] = SvNV(ST(2));
1858 pv[1] = SvNV(ST(3));
1859 pv[2] = SvNV(ST(4));
1860 pv[3] = SvNV(ST(5));
1861 glTexEnvfv(target,name,pv);
1869 if ( items < 1 || items > 4 )
1870 Perl_croak (aTHX_ "usage: SDL::OpenGL::TexCoord(s,[t,[r,[q]]])");
1883 glTexCoord4d(s,t,r,q);
1886 glTexParameter ( target, name, ... )
1893 case GL_TEXTURE_BORDER_COLOR:
1894 pv[0] = SvNV(ST(2));
1895 pv[1] = SvNV(ST(3));
1896 pv[2] = SvNV(ST(4));
1897 pv[3] = SvNV(ST(5));
1898 glTexParameterfv(target,name,pv);
1900 case GL_TEXTURE_PRIORITY:
1901 case GL_TEXTURE_MIN_LOD:
1902 case GL_TEXTURE_MAX_LOD:
1903 pv[0] = SvNV(ST(2));
1904 glTexParameterf(target,name,pv[0]);
1906 case GL_TEXTURE_BASE_LEVEL:
1907 case GL_TEXTURE_MAX_LEVEL:
1910 glTexParameteri(target,name,p);
1915 glTexGen ( coord, name, ... )
1923 case GL_TEXTURE_GEN_MODE:
1925 glTexGeni(coord,name,p);
1929 Perl_croak(aTHX_ "usage: glTexGen(coord,name,...)");
1930 pv = (GLdouble*)safemalloc(sizeof(GLdouble)*(items-2));
1931 for ( i = 0; i < items - 2; i++ ) {
1932 pv[i] = SvNV(ST(i+2));
1934 glTexGendv(coord,name,pv);
1939 #ifdef GL_VERSION_1_3
1942 glActiveTextureARB ( texUnit )
1945 glActiveTextureARB(texUnit);
1948 glMultiTexCoord ( texUnit, ... )
1952 if ( items < 2 || items > 5 )
1953 Perl_croak (aTHX_ "usage: SDL::OpenGL::MultiTexCoord(tex,s,[t,[r,[q]]])");
1966 glMultiTexCoord4dARB(texUnit,s,t,r,q);
1968 #endif // GL_VERSION_1_3
1971 glDrawBuffer ( mode )
1977 glReadBuffer ( mode )
1983 glIndexMask ( mask )
1989 glColorMask ( red, green, blue, alpha )
1995 glColorMask(red,green,blue,alpha);
1998 glDepthMask ( flag )
2004 glStencilMask ( mask )
2007 glStencilMask(mask);
2010 glScissor ( x , y, width, height )
2016 glScissor(x,y,width,height);
2019 glAlphaFunc ( func, ref )
2023 glAlphaFunc(func,ref);
2026 glStencilFunc ( func, ref, mask )
2031 glStencilFunc(func,ref,mask);
2034 glStencilOp ( fail, zfail, zpass )
2039 glStencilOp(fail,zfail,zpass);
2042 glDepthFunc ( func )
2048 glLogicOp ( opcode )
2054 glAccum ( op, value )
2061 glMap1 ( target, u1, u2, stride, order, points )
2069 glMap1d(target,u1,u2,stride,order,(double*)points);
2078 glMapGrid1 ( n, u1, u2 )
2083 glMapGrid1d(n,u1,u2);
2086 glEvalMesh1 ( mode, p1, p2 )
2091 glEvalMesh1(mode,p1,p2);
2094 glMap2 ( target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points )
2106 glMap2d(target,u1,u2,ustride,uorder,v1,v2,vstride,vorder,(double*)points);
2109 glEvalCoord2 ( u, v )
2116 glMapGrid2 ( nu, u1, u2, nv, v1, v2 )
2124 glMapGrid2d(nu,u1,u2,nv,v1,v2);
2127 glEvalMesh2 ( mode, i1, i2, j1, j2 )
2134 glEvalMesh2(mode,i1,i2,j1,j2);
2139 RETVAL = glGetError();
2144 glRenderMode ( mode )
2147 RETVAL = glRenderMode( mode );
2174 glFeedbackBuffer ( size, type, buffer )
2179 glFeedbackBuffer(size,type,buffer);
2182 glPassThrough ( token )
2185 glPassThrough(token);
2193 gluLookAt ( eyex, eyey, eyez, centerx, centery, centerz, upx, upy, upz )
2204 gluLookAt(eyex,eyey,eyez,centerx,centery,centerz,upx,upy,upz);
2207 gluPerspective ( fovy, aspect, n, f )
2213 gluPerspective(fovy,aspect,n,f);
2216 gluPickMatrix ( x, y, delx, dely, viewport )
2223 gluPickMatrix(x,y,delx,dely,viewport);
2226 gluOrtho2D ( left, right, bottom, top )
2232 gluOrtho2D(left,right,bottom,top);
2235 gluScaleImage ( format, widthin, heightin, typein, datain, widthout, heightout, typeout, dataout )
2246 RETVAL = gluScaleImage(format,widthin,heightin,typein,datain,
2247 widthout,heightout,typeout,dataout);
2252 gluBuild1DMipmaps ( target, internalFormat, width, format, type, data )
2254 Sint32 internalFormat
2260 RETVAL = gluBuild1DMipmaps(target,internalFormat,width,format,type,data);
2265 gluBuild2DMipmaps ( target, internalFormat, width, height, format, type, data )
2267 Sint32 internalFormat
2274 RETVAL = gluBuild2DMipmaps(target,internalFormat,width,height,format,type,data);
2279 #if HAVE_GLU_VERSION >= 12
2281 gluBuild3DMipmaps ( target, internalFormat, width, height, depth, format, type, data )
2283 Sint32 internalFormat
2291 RETVAL = gluBuild3DMipmaps(target,internalFormat,width,height,depth,
2298 gluBuild3DMipmaps ( )
2300 Perl_croak (aTHX_ "SDL::OpenGL::Build3DMipmaps requires GLU 1.2");
2304 #if HAVE_GLU_VERSION >= 12
2306 gluBuild1DMipmapLevels ( target, internalFormat, width, format, type, level, base, max, data )
2308 Sint32 internalFormat
2317 RETVAL = gluBuild1DMipmapLevels(target,internalFormat,width,
2318 format,type,level,base,max,data);
2324 gluBuild1DMipmapLevels ()
2326 Perl_croak(aTHX_ "SDL::OpenGL::Build1DMipmapLevels requires GLU 1.2");
2330 #if HAVE_GLU_VERSION >= 12
2332 gluBuild2DMipmapLevels ( target, internalFormat, width, height, format, type, level, base, max, data )
2334 Sint32 internalFormat
2344 RETVAL = gluBuild2DMipmapLevels(target,internalFormat,width,height,
2345 format,type,level,base,max,data);
2351 gluBuild2DMipmapLevels ()
2353 Perl_croak(aTHX_ "SDL::OpenGL::Build2DMipmapLevels requires GLU 1.2");
2357 #if HAVE_GLU_VERSION >= 12
2359 gluBuild3DMipmapLevels ( target, internalFormat, width, height, depth, format, type, level, base, max, data )
2361 Sint32 internalFormat
2372 RETVAL = gluBuild3DMipmapLevels(target,internalFormat,width,height,depth,
2373 format,type,level,base,max,data);
2379 gluBuild3DMipmapLevels ()
2381 Perl_croak(aTHX_ "SDL::OpenGL::Build3DMipmapLevels requires GLU 1.2");
2386 gluErrorString ( code )
2389 RETVAL = (char*)gluErrorString(code);
2394 gluNewNurbsRenderer ()
2396 RETVAL = gluNewNurbsRenderer();
2401 gluDeleteNurbsRenderer ( obj )
2404 gluDeleteNurbsRenderer(obj);
2407 gluNurbsProperty ( obj, property, value )
2412 gluNurbsProperty(obj,property,(float)value);
2415 gluLoadSamplingMatrices ( obj, mm, pm, vp )
2421 gluLoadSamplingMatrices(obj,(GLfloat*)mm,(GLfloat*)pm,(GLint*)vp);
2424 gluGetNurbsProperty ( obj, property )
2429 gluGetNurbsProperty(obj,property,&f);
2435 gluNurbsCallback ( obj, which, cb )
2442 sdl_perl_nurbs_error_hook = cb;
2443 gluNurbsCallback(obj,GLU_ERROR,(GLvoid*)sdl_perl_nurbs_error_callback);
2445 #ifdef GLU_NURBS_BEGIN
2446 #ifdef GLU_VERSION_1_3
2447 case GLU_NURBS_BEGIN:
2448 case GLU_NURBS_BEGIN_DATA:
2450 gluNurbsCallbackData(obj,(void*)cb);
2451 gluNurbsCallback(obj,GLU_NURBS_BEGIN_DATA,
2452 (GLvoid*)sdl_perl_nurbs_being_callback);
2454 case GLU_NURBS_TEXTURE_COORD:
2455 case GLU_NURBS_TEXTURE_COORD_DATA:
2456 gluNurbsCallbackData(obj,(void*)cb);
2457 gluNurbsCallback(obj,GLU_NURBS_TEXTURE_COORD_DATA,
2458 (GLvoid*)sdl_perl_nurbs_multi_callback);
2460 case GLU_NURBS_COLOR:
2461 case GLU_NURBS_COLOR_DATA:
2462 gluNurbsCallbackData(obj,(void*)cb);
2463 gluNurbsCallback(obj,GLU_NURBS_COLOR_DATA,
2464 (GLvoid*)sdl_perl_nurbs_multi_callback);
2466 case GLU_NURBS_NORMAL:
2467 case GLU_NURBS_NORMAL_DATA:
2468 gluNurbsCallbackData(obj,(void*)cb);
2469 gluNurbsCallback(obj,GLU_NURBS_NORMAL_DATA,
2470 (GLvoid*)sdl_perl_nurbs_multi_callback);
2472 case GLU_NURBS_VERTEX:
2473 case GLU_NURBS_VERTEX_DATA:
2474 gluNurbsCallbackData(obj,(void*)cb);
2475 gluNurbsCallback(obj,GLU_NURBS_VERTEX_DATA,
2476 (GLvoid*)sdl_perl_nurbs_multi_callback);
2479 case GLU_NURBS_END_DATA:
2480 gluNurbsCallbackData(obj,(void*)cb);
2481 gluNurbsCallback(obj,GLU_NURBS_END_DATA,
2482 (GLvoid*)sdl_perl_nurbs_end_callback);
2484 #endif // GLU_VERSION_1_3
2485 #endif // GLU_NURBS_BEGIN
2487 Perl_croak(aTHX_ "SDL::OpenGL::NurbsCallback - invalid type");
2490 #ifdef GLU_VERSION_1_3
2493 gluNurbsCallbackData ( obj, cb )
2497 gluNurbsCallbackData(obj,(void*)cb);
2502 gluBeginSurface ( obj )
2505 gluBeginSurface(obj);
2508 gluEndSurface ( obj )
2514 gluNurbsSurface ( obj, uknot_count, uknot, vknot_count, vknot, u_stride, v_stride, ctlarray, uorder, vorder, type )
2527 gluNurbsSurface(obj,uknot_count,(GLfloat*)uknot,vknot_count,(GLfloat*)vknot,
2528 u_stride,v_stride,(GLfloat*)ctlarray,uorder,vorder,type);
2531 gluBeginCurve ( obj )
2543 gluNurbsCurve ( obj, uknot_count, uknot, u_stride, ctlarray, uorder, type )
2552 gluNurbsCurve(obj,uknot_count,(GLfloat*)uknot,u_stride,(GLfloat*)ctlarray,
2556 gluBeginTrim ( obj )
2568 gluPwlCurve ( obj, count, array, stride, type )
2575 gluPwlCurve(obj,count,(GLfloat*)array,stride,type);
2578 gluUnProject ( winx, winy, winz, mm, pm, vp )
2586 GLdouble objx, objy, objz;
2588 av_push(RETVAL,newSViv(gluUnProject(winx,winy,winz,(GLdouble*)mm,
2589 (GLdouble*)pm,(GLint*)vp,&objx,&objy,&objz)));
2590 av_push(RETVAL,newSVnv((double)objx));
2591 av_push(RETVAL,newSVnv((double)objy));
2592 av_push(RETVAL,newSVnv((double)objz));
2597 #ifdef GL_VERSION_1_3
2600 gluUnProject4 ( winx, winy, winz, clipw, mm, pm, vp, n, f )
2611 GLdouble objx, objy, objz, objw;
2613 av_push(RETVAL,newSViv(gluUnProject4(winx,winy,winz,clipw,(GLdouble*)mm,
2614 (GLdouble*)pm,(GLint*)vp,(GLclampd)n,(GLclampd)f,
2615 &objx,&objy,&objz,&objw)));
2616 av_push(RETVAL,newSVnv((double)objx));
2617 av_push(RETVAL,newSVnv((double)objy));
2618 av_push(RETVAL,newSVnv((double)objz));
2619 av_push(RETVAL,newSVnv((double)objw));
2623 #endif // GL_VERSION_1_3
2626 gluProject ( objx, objy, objz, mm, pm, vp )
2634 GLdouble winx, winy, winz;
2636 av_push(RETVAL,newSViv(gluUnProject(objx,objy,objz,(GLdouble*)mm,
2637 (GLdouble*)pm,(GLint*)vp,&winx,&winy,&winz)));
2638 av_push(RETVAL,newSVnv((double)winx));
2639 av_push(RETVAL,newSVnv((double)winy));
2640 av_push(RETVAL,newSVnv((double)winz));
2644 #ifdef GL_VERSION_1_2
2649 RETVAL = gluNewTess();
2654 gluTessCallback ( tess, type )
2659 case GLU_TESS_BEGIN:
2660 case GLU_TESS_BEGIN_DATA:
2661 gluTessCallback(tess,GLU_TESS_BEGIN_DATA,
2662 (GLvoid*)sdl_perl_tess_begin_callback);
2665 case GLU_TESS_EDGE_FLAG:
2666 case GLU_TESS_EDGE_FLAG_DATA:
2667 gluTessCallback(tess,GLU_TESS_EDGE_FLAG_DATA,
2668 (GLvoid*)sdl_perl_tess_edge_flag_callback);
2671 case GLU_TESS_VERTEX:
2672 case GLU_TESS_VERTEX_DATA:
2673 gluTessCallback(tess,GLU_TESS_VERTEX_DATA,
2674 (GLvoid*)sdl_perl_tess_vertex_callback);
2678 case GLU_TESS_END_DATA:
2679 gluTessCallback(tess,GLU_TESS_END_DATA,
2680 (GLvoid*)sdl_perl_tess_end_callback);
2683 case GLU_TESS_COMBINE:
2684 case GLU_TESS_COMBINE_DATA:
2685 gluTessCallback(tess,GLU_TESS_COMBINE_DATA,
2686 (GLvoid*)sdl_perl_tess_combine_callback);
2689 case GLU_TESS_ERROR:
2690 case GLU_TESS_ERROR_DATA:
2691 gluTessCallback(tess,GLU_TESS_ERROR_DATA,
2692 (GLvoid*)sdl_perl_tess_error_callback);
2697 gluTessProperty ( tessobj, property, value )
2698 GLUtesselator *tessobj
2702 gluTessProperty(tessobj,property,value);
2705 gluGetTessProperty ( tessobj, property )
2706 GLUtesselator *tessobj
2709 gluGetTessProperty(tessobj,property,&RETVAL);
2714 gluTessNormal ( tessobj, x, y, z )
2715 GLUtesselator *tessobj
2720 gluTessNormal(tessobj,x,y,z);
2723 gluTessBeginPolygon ( tessobj, cb )
2724 GLUtesselator *tessobj
2727 gluTessBeginPolygon(tessobj,cb);
2730 gluTessEndPolygon ( tessobj )
2731 GLUtesselator *tessobj
2733 gluTessEndPolygon(tessobj);
2736 gluTessBeginContour ( tessobj )
2737 GLUtesselator *tessobj
2739 gluTessBeginContour(tessobj);
2742 gluTessEndContour ( tessobj )
2743 GLUtesselator *tessobj
2745 gluTessEndContour(tessobj);
2748 gluDeleteTess ( tessobj )
2749 GLUtesselator *tessobj
2751 gluDeleteTess(tessobj);
2754 gluTessVertex ( tessobj, coords, vd )
2755 GLUtesselator *tessobj
2759 gluTessVertex(tessobj,(GLdouble*)coords,vd);
2766 RETVAL = gluNewQuadric ();
2771 gluDeleteQuadric (quad)
2775 gluQuadricNormals ( quad, normal )
2780 gluQuadricTexture ( quad, texture )
2785 gluCylinder ( quad, base, top, height, slices, stacks )
2794 gluDisk ( quad, inner, outer, slices, loops )
2802 gluPartialDisk ( quad, inner, outer, slices, loops, start, sweep )
2812 gluSphere ( quad, radius, slices, stacks )