3 // Copyright (C) 2002,2003,2004 David J. Goehrig
20 #define HAVE_TLS_CONTEXT
23 #ifndef GL_ALL_CLIENT_ATTRIB_BITS
24 #define GL_ALL_CLIENT_ATTRIB_BITS 0xFFFFFFF
25 #endif /* GL_ALL_CLIENT_BITS */
29 SV* sdl_perl_nurbs_error_hook;
31 sdl_perl_nurbs_error_callback ( GLenum errorCode )
39 XPUSHs(sv_2mortal(newSViv(errorCode)));
42 call_sv(sdl_perl_nurbs_error_hook,G_VOID);
50 sdl_perl_nurbs_being_callback ( GLenum type, void *cb )
61 XPUSHs(sv_2mortal(newSViv(type)));
72 sdl_perl_nurbs_multi_callback ( GLfloat *vec, void *cb )
83 XPUSHs(sv_2mortal(newSViv(PTR2IV(vec))));
94 sdl_perl_nurbs_end_callback ( void *cb )
112 sdl_perl_tess_end_callback ( void *cb )
123 XPUSHs(sv_2mortal(newSViv(GLU_TESS_BEGIN)));
134 sdl_perl_tess_begin_callback ( GLenum type, void *cb )
145 XPUSHs(sv_2mortal(newSViv(GLU_TESS_BEGIN)));
146 XPUSHs(sv_2mortal(newSViv(type)));
157 sdl_perl_tess_error_callback ( GLenum type, void *cb )
168 XPUSHs(sv_2mortal(newSViv(GLU_TESS_ERROR)));
169 XPUSHs(sv_2mortal(newSViv(type)));
180 sdl_perl_tess_edge_flag_callback ( GLenum flag, void *cb )
191 XPUSHs(sv_2mortal(newSViv(GLU_TESS_EDGE_FLAG)));
192 XPUSHs(sv_2mortal(newSViv(flag)));
203 sdl_perl_tess_vertex_callback ( double *vd, void *cb )
214 XPUSHs(sv_2mortal(newSViv(GLU_TESS_VERTEX)));
215 XPUSHs(sv_2mortal(newSVnv(vd[0])));
216 XPUSHs(sv_2mortal(newSVnv(vd[1])));
217 XPUSHs(sv_2mortal(newSVnv(vd[2])));
218 XPUSHs(sv_2mortal(newSVnv(vd[3])));
219 XPUSHs(sv_2mortal(newSVnv(vd[4])));
220 XPUSHs(sv_2mortal(newSVnv(vd[5])));
231 sdl_perl_tess_combine_callback ( GLdouble coords[3], double *vd[4], GLfloat weight[4],
232 GLdouble **out, void *cb )
245 XPUSHs(sv_2mortal(newSViv(GLU_TESS_COMBINE)));
246 XPUSHs(sv_2mortal(newSVpvn((char*)coords,sizeof(GLdouble)*3)));
247 XPUSHs(sv_2mortal(newSVpvn((char*)vd,sizeof(GLdouble*)*4)));
248 XPUSHs(sv_2mortal(newSVpvn((char*)weight,sizeof(GLfloat)*4)));
251 if ( 1 != call_sv(cmd,G_SCALAR) ) {
252 Perl_croak(aTHX_ "sdl_perl_tess_combine_callback failed");
255 data = (double*)POPp;
257 *out = (double*)malloc(sizeof(double)*width);
258 memcpy(*out,data,sizeof(double)*width);
265 MODULE = SDL::OpenGL PACKAGE = SDL::OpenGL
271 glClearColor ( r, g, b, a)
277 glClearColor((GLfloat)r,(GLfloat)g,(GLfloat)b,(GLfloat)a);
280 glClearIndex ( index )
286 glClearDepth ( depth )
298 glClearAccum ( r, g, b, a )
304 glClearAccum((GLfloat)r,(GLfloat)g,(GLfloat)b,(GLfloat)a);
326 glRecti(r->x,r->y,r->x+r->w,r->y+r->h);
329 glVertex ( x, y, ... )
338 } else if ( items == 3 ) {
373 case GL_EDGE_FLAG_ARRAY:
374 case GL_MAP1_TEXTURE_COORD_1:
375 case GL_LIGHT_MODEL_TWO_SIDE:
376 case GL_INDEX_LOGIC_OP:
377 case GL_PACK_ALIGNMENT:
379 case GL_TEXTURE_GEN_S:
380 case GL_MAP1_VERTEX_3:
383 case GL_NORMAL_ARRAY:
387 case GL_POLYGON_OFFSET_FILL:
388 case GL_MAP1_TEXTURE_COORD_4:
391 case GL_UNPACK_SWAP_BYTES:
393 case GL_POLYGON_OFFSET_POINT:
394 case GL_POINT_SMOOTH:
396 case GL_MAP2_TEXTURE_COORD_4:
398 case GL_POLYGON_OFFSET_LINE:
401 case GL_PACK_LSB_FIRST:
402 case GL_MAP1_TEXTURE_COORD_2:
403 case GL_MAP2_VERTEX_3:
404 case GL_MAP2_TEXTURE_COORD_2:
406 case GL_DOUBLEBUFFER:
407 case GL_UNPACK_LSB_FIRST:
408 case GL_TEXTURE_COORD_ARRAY:
410 case GL_TEXTURE_GEN_Q:
418 case GL_TEXTURE_GEN_R:
419 case GL_PACK_SWAP_BYTES:
420 case GL_DEPTH_WRITEMASK:
421 case GL_COLOR_LOGIC_OP:
426 case GL_COLOR_MATERIAL:
429 case GL_MAP1_VERTEX_4:
433 case GL_POLYGON_SMOOTH:
435 case GL_MAP2_COLOR_4:
437 case GL_VERTEX_ARRAY:
438 case GL_MAP1_TEXTURE_COORD_3:
439 case GL_STENCIL_TEST:
440 case GL_MAP2_TEXTURE_COORD_3:
441 case GL_TEXTURE_GEN_T:
442 case GL_LIGHT_MODEL_LOCAL_VIEWER:
444 case GL_MAP1_COLOR_4:
445 case GL_MAP2_TEXTURE_COORD_1:
446 case GL_CURRENT_RASTER_POSITION_VALID:
448 case GL_SCISSOR_TEST:
450 case GL_POLYGON_STIPPLE:
453 case GL_LINE_STIPPLE:
454 case GL_MAP2_VERTEX_4:
458 glGetBooleanv(param, ret);
460 for (i = 0; i < 1; i++) {
461 XPUSHs(sv_2mortal(newSViv(ret[i])));
465 case GL_COLOR_WRITEMASK:
469 glGetBooleanv(param, ret);
471 for (i = 0; i < 4; i++) {
472 XPUSHs(sv_2mortal(newSViv(ret[i])));
477 case GL_ALPHA_TEST_REF:
478 case GL_POINT_SIZE_GRANULARITY:
479 case GL_CURRENT_RASTER_DISTANCE:
485 case GL_DEPTH_CLEAR_VALUE:
492 case GL_POLYGON_OFFSET_FACTOR:
495 case GL_POLYGON_OFFSET_UNITS:
497 case GL_LINE_WIDTH_GRANULARITY:
503 glGetDoublev(param, ret);
505 for (i = 0; i < 1; i++) {
506 XPUSHs(sv_2mortal(newSVnv(ret[i])));
510 case GL_MODELVIEW_MATRIX:
511 case GL_TEXTURE_MATRIX:
512 case GL_PROJECTION_MATRIX:
516 glGetDoublev(param, ret);
518 for (i = 0; i < 16; i++) {
519 XPUSHs(sv_2mortal(newSVnv(ret[i])));
523 case GL_POINT_SIZE_RANGE:
524 case GL_LINE_WIDTH_RANGE:
525 case GL_MAP1_GRID_DOMAIN:
530 glGetDoublev(param, ret);
532 for (i = 0; i < 2; i++) {
533 XPUSHs(sv_2mortal(newSVnv(ret[i])));
537 case GL_CURRENT_NORMAL:
541 glGetDoublev(param, ret);
543 for (i = 0; i < 3; i++) {
544 XPUSHs(sv_2mortal(newSVnv(ret[i])));
549 case GL_MAP2_GRID_DOMAIN:
550 case GL_CURRENT_RASTER_POSITION:
551 case GL_CURRENT_COLOR:
552 case GL_LIGHT_MODEL_AMBIENT:
553 case GL_CURRENT_RASTER_TEXTURE_COORDS:
554 case GL_TEXTURE_ENV_COLOR:
555 case GL_CURRENT_RASTER_COLOR:
556 case GL_CURRENT_TEXTURE_COORDS:
557 case GL_COLOR_CLEAR_VALUE:
558 case GL_ACCUM_CLEAR_VALUE:
562 glGetDoublev(param, ret);
564 for (i = 0; i < 4; i++) {
565 XPUSHs(sv_2mortal(newSVnv(ret[i])));
569 case GL_CULL_FACE_MODE:
570 case GL_PIXEL_MAP_I_TO_A_SIZE:
571 case GL_PIXEL_MAP_A_TO_A_SIZE:
573 case GL_EDGE_FLAG_ARRAY_STRIDE:
578 case GL_POINT_SMOOTH_HINT:
579 case GL_PACK_SKIP_PIXELS:
581 case GL_STENCIL_CLEAR_VALUE:
583 case GL_COLOR_MATERIAL_PARAMETER:
584 case GL_ACCUM_BLUE_BITS:
586 case GL_VERTEX_ARRAY_STRIDE:
587 case GL_STENCIL_PASS_DEPTH_PASS:
588 case GL_CLIENT_ATTRIB_STACK_DEPTH:
590 case GL_LINE_STIPPLE_REPEAT:
592 case GL_PIXEL_MAP_B_TO_B_SIZE:
593 case GL_MAX_PIXEL_MAP_TABLE:
594 case GL_MAX_TEXTURE_SIZE:
595 case GL_PIXEL_MAP_S_TO_S_SIZE:
596 case GL_LOGIC_OP_MODE:
599 case GL_LINE_SMOOTH_HINT:
600 case GL_ALPHA_TEST_FUNC:
603 case GL_MAX_NAME_STACK_DEPTH:
604 case GL_INDEX_ARRAY_TYPE:
605 case GL_TEXTURE_COORD_ARRAY_TYPE:
606 case GL_COLOR_ARRAY_TYPE:
607 case GL_MAX_LIST_NESTING:
608 case GL_STENCIL_WRITEMASK:
610 case GL_ACCUM_ALPHA_BITS:
611 case GL_INDEX_ARRAY_STRIDE:
612 case GL_PIXEL_MAP_I_TO_B_SIZE:
614 case GL_STENCIL_FAIL:
615 case GL_UNPACK_ALIGNMENT:
616 case GL_STENCIL_PASS_DEPTH_FAIL:
617 case GL_ATTRIB_STACK_DEPTH:
618 case GL_PACK_SKIP_ROWS:
619 case GL_TEXTURE_STACK_DEPTH:
621 case GL_COLOR_ARRAY_STRIDE:
623 case GL_UNPACK_SKIP_PIXELS:
624 case GL_PIXEL_MAP_G_TO_G_SIZE:
625 case GL_VERTEX_ARRAY_TYPE:
627 case GL_MAX_CLIENT_ATTRIB_STACK_DEPTH:
628 case GL_INDEX_CLEAR_VALUE:
629 case GL_PIXEL_MAP_I_TO_G_SIZE:
631 case GL_PIXEL_MAP_I_TO_R_SIZE:
632 case GL_COLOR_ARRAY_SIZE:
633 case GL_TEXTURE_COORD_ARRAY_SIZE:
634 case GL_MAP1_GRID_SEGMENTS:
635 case GL_VERTEX_ARRAY_SIZE:
636 case GL_PIXEL_MAP_R_TO_R_SIZE:
637 case GL_TEXTURE_COORD_ARRAY_STRIDE:
638 case GL_MODELVIEW_STACK_DEPTH:
639 case GL_MAX_TEXTURE_STACK_DEPTH:
640 case GL_PIXEL_MAP_I_TO_I_SIZE:
642 case GL_INDEX_WRITEMASK:
643 case GL_PACK_ROW_LENGTH:
644 case GL_CURRENT_INDEX:
645 case GL_STENCIL_VALUE_MASK:
646 case GL_UNPACK_SKIP_ROWS:
647 case GL_MAX_PROJECTION_STACK_DEPTH:
649 case GL_STENCIL_FUNC:
650 case GL_INDEX_OFFSET:
651 case GL_UNPACK_ROW_LENGTH:
652 case GL_COLOR_MATERIAL_FACE:
653 case GL_NORMAL_ARRAY_TYPE:
654 case GL_STENCIL_BITS:
655 case GL_PROJECTION_STACK_DEPTH:
656 case GL_CURRENT_RASTER_INDEX:
658 case GL_TEXTURE_ENV_MODE:
659 case GL_NORMAL_ARRAY_STRIDE:
660 case GL_PERSPECTIVE_CORRECTION_HINT:
661 case GL_MAX_CLIP_PLANES:
662 case GL_MAX_MODELVIEW_STACK_DEPTH:
663 case GL_SUBPIXEL_BITS:
664 case GL_ACCUM_RED_BITS:
667 case GL_MAX_EVAL_ORDER:
668 case GL_LINE_STIPPLE_PATTERN:
669 case GL_NAME_STACK_DEPTH:
670 case GL_MAX_ATTRIB_STACK_DEPTH:
671 case GL_POLYGON_SMOOTH_HINT:
672 case GL_ACCUM_GREEN_BITS:
673 case GL_MAX_TEXTURE_UNITS_ARB:
677 glGetIntegerv(param, ret);
679 for (i = 0; i < 1; i++) {
680 XPUSHs(sv_2mortal(newSViv(ret[i])));
684 case GL_POLYGON_MODE:
685 case GL_MAX_VIEWPORT_DIMS:
686 case GL_MAP2_GRID_SEGMENTS:
690 glGetIntegerv(param, ret);
692 for (i = 0; i < 2; i++) {
693 XPUSHs(sv_2mortal(newSViv(ret[i])));
702 glGetIntegerv(param, ret);
704 for (i = 0; i < 4; i++) {
705 XPUSHs(sv_2mortal(newSViv(ret[i])));
710 croak("Unknown glGet parameter!");
713 const char * glGetString ( name )
716 RETVAL = (const char *)glGetString (name);
724 RETVAL = glIsEnabled(cap);
732 glPointSize((GLfloat)size);
738 glLineWidth((GLfloat)size);
741 glLineStipple ( factor, pattern )
745 glLineStipple(factor,pattern);
748 glPolygonMode ( face, mode )
752 glPolygonMode(face,mode);
767 glPolygonStipple ( mask )
770 glPolygonStipple(mask);
787 glEnableClientState ( array )
790 glEnableClientState(array);
793 glDisableClientState ( array )
796 glDisableClientState(array);
799 glVertexPointer ( size, type, stride, pointer)
805 glVertexPointer(size,type,stride,pointer);
808 glColorPointer ( size, type, stride, pointer )
814 glColorPointer(size,type,stride,pointer);
817 glNormalPointer ( type, stride, pointer )
822 glNormalPointer(type,stride,pointer);
825 glTexCoordPointer ( size, type, stride, pointer )
831 glTexCoordPointer(size,type,stride,pointer);
834 glEdgeFlagPointer ( stride, pointer )
838 glEdgeFlagPointer(stride,pointer);
841 glArrayElement ( ith )
847 glDrawElements ( mode, count, type, indices )
853 glDrawElements( mode, count, type, indices);
856 glDrawRangeElements ( mode, start, end, count, type, indices )
864 glDrawRangeElements(mode,start,end,count,type,indices);
867 glDrawArrays ( mode, first, count )
872 glDrawArrays(mode,first,count);
875 glInterleavedArrays ( format, stride, pointer )
880 glInterleavedArrays(format,stride,pointer);
883 glPushAttrib ( mask )
894 glPushClientAttrib ( mask )
897 glPushClientAttrib(mask);
905 glMatrixMode ( mode )
920 for ( i = 0; i < 16; i++ ) {
921 mat[i] = (i < items && SvNOK(ST(i)) ? SvNV(ST(i)) : 0.0 );
930 for ( i = 0; i < 16; i++ ) {
931 mat[i] = (i < items && SvNOK(ST(i)) ? SvNV(ST(i)) : 0.0 );
936 glTranslate ( x, y, z )
944 glRotate ( angle, x, y, z )
950 glRotated(angle,x,y,z);
961 glFrustum ( left, right, bottom, top, n, f )
969 glFrustum(left,right,bottom,top,n,f);
972 glOrtho ( left, right, bottom, top, n, f )
980 glOrtho(left,right,bottom,top,n,f);
983 glViewport ( x, y, width, height )
989 glViewport(x,y,width,height);
992 glDepthRange ( n, f )
1009 glClipPlane ( plane, ... )
1014 for (i = 0; i < 4; i++ ) {
1015 v[i] = (i+1 < items && SvNOK(ST(i+1))) ? SvNV(ST(i+1)) : 0.0;
1017 glClipPlane(plane,v);
1020 glColor ( r, g, b, ... )
1040 glShadeModel ( mode )
1046 glLight ( light, name, ... )
1053 for ( i = 0; i < 4; i++ ) {
1054 v[i] = (SvNOK(ST(i+2))) ? SvNV(ST(i+2)) : 0.0;
1056 glLightfv(light,name,v);
1057 } else if ( items == 5 ) {
1059 for ( i = 0; i < 3; i++ ) {
1060 v[i] = (SvNOK(ST(i+2))) ? SvNV(ST(i+2)) : 0.0;
1062 glLightfv(light,name,v);
1063 } else if ( items == 3 ) {
1066 glLightf(light,name,v);
1068 Perl_croak(aTHX_ "SDL::OpenGL::Light invalid arguments");
1072 glLightModel ( pname, ... )
1076 if ( pname == GL_LIGHT_MODEL_LOCAL_VIEWER ||
1077 pname == GL_LIGHT_MODEL_TWO_SIDE ||
1078 pname == GL_LIGHT_MODEL_COLOR_CONTROL ) {
1079 glLightModelf(pname,SvNV(ST(1)));
1080 } else if ( pname == GL_LIGHT_MODEL_AMBIENT) {
1081 vec[0] = SvNV(ST(1));
1082 vec[1] = SvNV(ST(2));
1083 vec[2] = SvNV(ST(3));
1084 vec[3] = SvNV(ST(4));
1085 glLightModelfv(pname,vec);
1087 Perl_croak(aTHX_ "SDL::OpenGL::glLightModel unknown model %d",pname);
1091 glMaterial ( face, name, ... )
1098 for ( i = 0; i < 4; i++ ) {
1099 v[i] = (SvNOK(ST(i+2))) ? SvNV(ST(i+2)) : 0.0;
1101 glMaterialfv(face,name,v);
1102 } else if ( items == 5 ) {
1104 for ( i = 0; i < 4; i++ ) {
1105 v[i] = (SvNOK(ST(i+2))) ? SvNV(ST(i+2)) : 0.0;
1107 glMaterialfv(face,name,v);
1108 } else if ( items == 3 ) {
1111 glMaterialf(face,name,v);
1113 Perl_croak(aTHX_ "SDL::OpenGL::Material invalid arguments");
1117 glColorMaterial ( face, mode )
1121 glColorMaterial(face,mode);
1124 glBlendFunc ( sfactor, dfactor )
1128 glBlendFunc(sfactor,dfactor);
1132 glHint ( target, hint )
1136 glHint(target,hint);
1149 } else if ( items == 2 ) {
1154 Perl_croak(aTHX_ "SDL::OpenGL::Material invalid arguments");
1158 glPolygonOffset ( factor, units )
1162 glPolygonOffset(factor,units);
1165 glGenLists ( range )
1168 RETVAL = glGenLists(range);
1173 glNewList ( list, mode )
1177 glNewList(list,mode);
1185 glDeleteLists ( base, count )
1189 glDeleteLists(base, count);
1201 RETVAL = glIsList(list);
1216 i = (int*)safemalloc(sizeof(int)* (items));
1217 for ( j = 0; j < items; j++ ) {
1221 Perl_croak(aTHX_ "usage: SDL::OpenGL::CallLists(type,...)");
1223 glCallLists(items, GL_INT, i);
1227 glCallListsString ( string )
1232 str = SvPV(string,len);
1233 glCallLists(len,GL_BYTE,str);
1236 glRasterPos ( x, y, ... )
1242 glRasterPos2d (x,y);
1244 else if (items == 3)
1246 double z = SvNV (ST(2));
1247 glRasterPos3d (x,y,z);
1249 else if (items == 4)
1251 double z = SvNV (ST(2));
1252 double w = SvNV (ST(3));
1253 glRasterPos4d (x,y,z,w);
1257 glBitmap ( width, height, x1, y1, x2, y2, data )
1266 glBitmap(width,height,x1,y1,x2,y2,data);
1269 glDrawPixels ( width, height, format, type, pixels )
1276 glDrawPixels(width,height,format,type,pixels);
1280 glReadPixels ( x, y, width, height, format, type )
1290 size = 1; /* ALPHA, BLUE, GREEN or RED */
1291 if (format == GL_BGR || format == GL_RGB)
1293 if (format == GL_BGRA || format == GL_RGBA)
1295 len = height * width * size; /* in bytes */
1296 RETVAL = newSV(len); /* alloc len+1 bytes */
1297 SvPOK_on(RETVAL); /* make an PV */
1298 buf = SvPVX(RETVAL); /* get ptr to buffer */
1299 glReadPixels(x,y,width,height,format,type,buf);
1300 SvCUR_set(RETVAL, len); /* set real length */
1305 glReadPixel ( x, y )
1309 int rgba[4]; /* r,g,b,a */
1311 glReadPixels(x,y,1,1,GL_RGBA,GL_UNSIGNED_INT,rgba);
1313 for ( i = 0; i < 4; i++ ) {
1314 av_push(RETVAL,newSViv(rgba[i]));
1320 glCopyPixels ( x, y, width, height, buffer )
1327 glCopyPixels(x,y,width,height,buffer);
1330 glPixelStore ( name, param )
1334 glPixelStorei(name,param);
1337 glPixelTransfer ( name, ... )
1342 case GL_MAP_STENCIL:
1343 case GL_INDEX_SHIFT:
1344 case GL_INDEX_OFFSET:
1345 glPixelTransferi(name,SvIV(ST(1)));
1348 glPixelTransferf(name,SvNV(ST(1)));
1353 glPixelMap ( type, map, mapsize, values )
1360 case GL_UNSIGNED_INT:
1361 glPixelMapuiv(map,mapsize,(GLint*)values);
1363 case GL_UNSIGNED_SHORT:
1364 glPixelMapusv(map,mapsize,(GLushort*)values);
1367 glPixelMapfv(map,mapsize,(GLfloat*)values);
1372 glPixelZoom ( zoomx, zoomy )
1376 glPixelZoom(zoomx,zoomy);
1378 #ifdef GL_VERSION_1_3
1381 glColorTable ( target, internalFormat, width, format, type, data )
1383 GLenum internalFormat
1389 glColorTable(target,internalFormat,width,format,type,data);
1392 glColorTableParameter ( target, name, r, g, b, a)
1405 glColorTableParameterfv(target,name,vec);
1408 glCopyColorTable ( target, internalFormat, x, y, width )
1410 GLenum internalFormat
1415 glCopyColorTable(target,internalFormat,x,y,width);
1418 glColorSubTable ( target, start, count, format, type, data )
1426 glColorSubTable(target,start,count,format,type,data);
1429 glCopyColorSubTable ( target, start, x, y, count )
1436 glCopyColorSubTable(target,start,x,y,count);
1439 glConvolutionFilter2D ( target, internalFormat, width, height, format, type, image )
1441 Uint32 internalFormat
1448 glConvolutionFilter2D(target,internalFormat,width,height,format,type,image);
1451 glCopyConvolutionFilter2D ( target, internalFormat, x, y, width, height )
1453 Uint32 internalFormat
1459 glCopyConvolutionFilter2D(target,internalFormat,x,y,width,height);
1462 glSeparableFilter2D ( target, internalFormat, width, height, format, type, row, column )
1464 Uint32 internalFormat
1472 glSeparableFilter2D(target,internalFormat,width,height,format,type,row,column);
1475 glConvolutionFilter1D ( target, internalFormat, width, format, type, image )
1477 Uint32 internalFormat
1483 glConvolutionFilter1D(target,internalFormat,width,format,type,image);
1486 glCopyConvolutionFilter1D ( target, internalFormat, x, y, width )
1488 Uint32 internalFormat
1493 glCopyConvolutionFilter1D(target,internalFormat,x,y,width);
1496 glConvolutionParameter ( target, pname, ... )
1503 case GL_CONVOLUTION_BORDER_MODE:
1505 Perl_croak(aTHX_ "Usage: ConvolutionParameter(target,pname,...)");
1507 glConvolutionParameteri(target,pname,pi);
1509 case GL_CONVOLUTION_FILTER_SCALE:
1510 case GL_CONVOLUTION_FILTER_BIAS:
1512 Perl_croak(aTHX_ "Usage: ConvolutionParameter(target,pname,...)");
1513 pv[0] = (GLfloat)SvNV(ST(2));
1514 pv[1] = (GLfloat)SvNV(ST(3));
1515 pv[2] = (GLfloat)SvNV(ST(4));
1516 pv[3] = (GLfloat)SvNV(ST(5));
1517 glConvolutionParameterfv(target,pname,pv);
1520 Perl_croak(aTHX_ "ConvolutionParameter invalid parameter");
1525 glHistogram ( target, width, internalFormat, sink )
1528 Uint32 internalFormat
1531 glHistogram(target,width,internalFormat,sink);
1534 glGetHistogram ( target, reset, format, type, values )
1541 glGetHistogram(target,reset,format,type,values);
1544 glResetHistogram ( target )
1547 glResetHistogram(target);
1550 glMinmax ( target, internalFormat, sink )
1552 Uint32 internalFormat
1555 glMinmax(target,internalFormat,sink);
1558 glGetMinmax ( target, reset, format, type, values )
1565 glGetMinmax(target,reset,format,type,values);
1568 glResetMinmax ( target )
1571 glResetMinmax(target);
1574 glBlendEquation ( mode )
1577 glBlendEquation(mode);
1579 #endif // GL_VERSION_1_3
1582 glTexImage2D ( target, level, internalFormat, width, height, border, format, type, data )
1585 Sint32 internalFormat
1593 glTexImage2D(target,level,internalFormat,width,height,border,format,type,data);
1596 glCopyTexImage2D ( target, level, internalFormat, x, y, width, height, border )
1599 Sint32 internalFormat
1606 glCopyTexImage2D(target,level,internalFormat,x,y,width,height,border);
1609 glTexSubImage2D ( target, level, xoffset, yoffset, width, height, format, type, data )
1620 glTexSubImage2D(target,level,xoffset,yoffset,width,height,format,type,data);
1623 glCopyTexSubImage2D ( target, level, xoffset, yoffset, x, y, width, height )
1633 glCopyTexSubImage2D(target,level,xoffset,yoffset,x,y,width,height);
1636 glTexImage1D ( target, level, internalFormat, width, border, format, type, data )
1639 Sint32 internalFormat
1646 glTexImage1D(target,level,internalFormat,width,border,format,type,data);
1649 glTexSubImage1D ( target, level, xoffset, width, format, type, data )
1658 glTexSubImage1D(target,level,xoffset,width,format,type,data);
1661 glCopyTexImage1D ( target, level, internalFormat, x, y, width, border )
1664 Sint32 internalFormat
1670 glCopyTexImage1D(target,level,internalFormat,x,y,width,border);
1673 glCopyTexSubImage1D ( target, level, xoffset, x, y, width )
1681 glCopyTexSubImage1D(target,level,xoffset,x,y,width);
1683 #ifdef GL_VERSION_1_3
1686 glTexImage3D ( target, level, internalFormat, width, height, depth, border, format, type, data )
1689 Sint32 internalFormat
1698 glTexImage3D(target,level,internalFormat,width,height,depth,border,format,type,data);
1701 glTexSubImage3D ( target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, data )
1714 glTexSubImage3D(target,level,xoffset,yoffset,zoffset,
1715 width,height,depth,format,type,data);
1718 glCopyTexSubImage3D ( target, level, xoffset, yoffset, zoffset, x, y, width, height )
1729 glCopyTexSubImage3D(target,level,xoffset,yoffset,zoffset,x,y,width,height);
1731 #endif // GL_VERSION_1_3
1739 names = (Uint32*)safemalloc(sizeof(Uint32)*n);
1741 glGenTextures(n,names);
1742 for ( i = 0; i < n; i++ ) {
1743 av_push(RETVAL,newSViv(names[i]));
1750 glIsTexture ( texture )
1753 RETVAL = glIsTexture(texture);
1758 glBindTexture ( target, texture )
1762 glBindTexture(target,texture);
1765 glDeleteTextures ( ... )
1769 textures = (Uint32*)safemalloc(sizeof(Uint32) * items);
1771 for ( i = 0; i < items; i++ ) {
1772 textures[i] = SvIV(ST(i));
1775 glDeleteTextures(items,textures);
1779 glAreTexturesResident ( ... )
1785 textures = (Uint32*)safemalloc(sizeof(Uint32) * items);
1786 homes = (GLboolean*)safemalloc(sizeof(GLboolean) * items);
1788 for ( i = 0; i < items; i++ ) {
1789 textures[i] = SvIV(ST(i));
1792 if ( GL_FALSE != glAreTexturesResident(items,textures,homes)) {
1793 for (i = 0; i < items; i++ ) {
1794 av_push(RETVAL,newSViv(homes[i]));
1803 glPrioritizeTextures ( n, names, priorities )
1808 glPrioritizeTextures(n,(GLuint*)names,(const GLclampf *)priorities);
1811 glTexEnv ( target, name, ... )
1818 case GL_TEXTURE_ENV_MODE:
1820 glTexEnvi(target,name,p);
1822 case GL_TEXTURE_ENV_COLOR:
1823 pv[0] = SvNV(ST(2));
1824 pv[1] = SvNV(ST(3));
1825 pv[2] = SvNV(ST(4));
1826 pv[3] = SvNV(ST(5));
1827 glTexEnvfv(target,name,pv);
1835 if ( items < 1 || items > 4 )
1836 Perl_croak (aTHX_ "usage: SDL::OpenGL::TexCoord(s,[t,[r,[q]]])");
1849 glTexCoord4d(s,t,r,q);
1852 glTexParameter ( target, name, ... )
1859 case GL_TEXTURE_BORDER_COLOR:
1860 pv[0] = SvNV(ST(2));
1861 pv[1] = SvNV(ST(3));
1862 pv[2] = SvNV(ST(4));
1863 pv[3] = SvNV(ST(5));
1864 glTexParameterfv(target,name,pv);
1866 case GL_TEXTURE_PRIORITY:
1867 case GL_TEXTURE_MIN_LOD:
1868 case GL_TEXTURE_MAX_LOD:
1869 pv[0] = SvNV(ST(2));
1870 glTexParameterf(target,name,pv[0]);
1872 case GL_TEXTURE_BASE_LEVEL:
1873 case GL_TEXTURE_MAX_LEVEL:
1876 glTexParameteri(target,name,p);
1881 glTexGen ( coord, name, ... )
1889 case GL_TEXTURE_GEN_MODE:
1891 glTexGeni(coord,name,p);
1895 Perl_croak(aTHX_ "usage: glTexGen(coord,name,...)");
1896 pv = (GLdouble*)safemalloc(sizeof(GLdouble)*(items-2));
1897 for ( i = 0; i < items - 2; i++ ) {
1898 pv[i] = SvNV(ST(i+2));
1900 glTexGendv(coord,name,pv);
1905 #ifdef GL_VERSION_1_3
1908 glActiveTextureARB ( texUnit )
1911 glActiveTextureARB(texUnit);
1914 glMultiTexCoord ( texUnit, ... )
1918 if ( items < 2 || items > 5 )
1919 Perl_croak (aTHX_ "usage: SDL::OpenGL::MultiTexCoord(tex,s,[t,[r,[q]]])");
1932 glMultiTexCoord4dARB(texUnit,s,t,r,q);
1934 #endif // GL_VERSION_1_3
1937 glDrawBuffer ( mode )
1943 glReadBuffer ( mode )
1949 glIndexMask ( mask )
1955 glColorMask ( red, green, blue, alpha )
1961 glColorMask(red,green,blue,alpha);
1964 glDepthMask ( flag )
1970 glStencilMask ( mask )
1973 glStencilMask(mask);
1976 glScissor ( x , y, width, height )
1982 glScissor(x,y,width,height);
1985 glAlphaFunc ( func, ref )
1989 glAlphaFunc(func,ref);
1992 glStencilFunc ( func, ref, mask )
1997 glStencilFunc(func,ref,mask);
2000 glStencilOp ( fail, zfail, zpass )
2005 glStencilOp(fail,zfail,zpass);
2008 glDepthFunc ( func )
2014 glLogicOp ( opcode )
2020 glAccum ( op, value )
2027 glMap1 ( target, u1, u2, stride, order, points )
2035 glMap1d(target,u1,u2,stride,order,(double*)points);
2044 glMapGrid1 ( n, u1, u2 )
2049 glMapGrid1d(n,u1,u2);
2052 glEvalMesh1 ( mode, p1, p2 )
2057 glEvalMesh1(mode,p1,p2);
2060 glMap2 ( target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points )
2072 glMap2d(target,u1,u2,ustride,uorder,v1,v2,vstride,vorder,(double*)points);
2075 glEvalCoord2 ( u, v )
2082 glMapGrid2 ( nu, u1, u2, nv, v1, v2 )
2090 glMapGrid2d(nu,u1,u2,nv,v1,v2);
2093 glEvalMesh2 ( mode, i1, i2, j1, j2 )
2100 glEvalMesh2(mode,i1,i2,j1,j2);
2105 RETVAL = glGetError();
2110 glRenderMode ( mode )
2113 RETVAL = glRenderMode( mode );
2140 glFeedbackBuffer ( size, type, buffer )
2145 glFeedbackBuffer(size,type,buffer);
2148 glPassThrough ( token )
2151 glPassThrough(token);
2159 gluLookAt ( eyex, eyey, eyez, centerx, centery, centerz, upx, upy, upz )
2170 gluLookAt(eyex,eyey,eyez,centerx,centery,centerz,upx,upy,upz);
2173 gluPerspective ( fovy, aspect, n, f )
2179 gluPerspective(fovy,aspect,n,f);
2182 gluPickMatrix ( x, y, delx, dely, viewport )
2189 gluPickMatrix(x,y,delx,dely,viewport);
2192 gluOrtho2D ( left, right, bottom, top )
2198 gluOrtho2D(left,right,bottom,top);
2201 gluScaleImage ( format, widthin, heightin, typein, datain, widthout, heightout, typeout, dataout )
2212 RETVAL = gluScaleImage(format,widthin,heightin,typein,datain,
2213 widthout,heightout,typeout,dataout);
2218 gluBuild1DMipmaps ( target, internalFormat, width, format, type, data )
2220 Sint32 internalFormat
2226 RETVAL = gluBuild1DMipmaps(target,internalFormat,width,format,type,data);
2231 gluBuild2DMipmaps ( target, internalFormat, width, height, format, type, data )
2233 Sint32 internalFormat
2240 RETVAL = gluBuild2DMipmaps(target,internalFormat,width,height,format,type,data);
2245 #if HAVE_GLU_VERSION >= 12
2247 gluBuild3DMipmaps ( target, internalFormat, width, height, depth, format, type, data )
2249 Sint32 internalFormat
2257 RETVAL = gluBuild3DMipmaps(target,internalFormat,width,height,depth,
2264 gluBuild3DMipmaps ( )
2266 Perl_croak (aTHX_ "SDL::OpenGL::Build3DMipmaps requires GLU 1.2");
2270 #if HAVE_GLU_VERSION >= 12
2272 gluBuild1DMipmapLevels ( target, internalFormat, width, format, type, level, base, max, data )
2274 Sint32 internalFormat
2283 RETVAL = gluBuild1DMipmapLevels(target,internalFormat,width,
2284 format,type,level,base,max,data);
2290 gluBuild1DMipmapLevels ()
2292 Perl_croak(aTHX_ "SDL::OpenGL::Build1DMipmapLevels requires GLU 1.2");
2296 #if HAVE_GLU_VERSION >= 12
2298 gluBuild2DMipmapLevels ( target, internalFormat, width, height, format, type, level, base, max, data )
2300 Sint32 internalFormat
2310 RETVAL = gluBuild2DMipmapLevels(target,internalFormat,width,height,
2311 format,type,level,base,max,data);
2317 gluBuild2DMipmapLevels ()
2319 Perl_croak(aTHX_ "SDL::OpenGL::Build2DMipmapLevels requires GLU 1.2");
2323 #if HAVE_GLU_VERSION >= 12
2325 gluBuild3DMipmapLevels ( target, internalFormat, width, height, depth, format, type, level, base, max, data )
2327 Sint32 internalFormat
2338 RETVAL = gluBuild3DMipmapLevels(target,internalFormat,width,height,depth,
2339 format,type,level,base,max,data);
2345 gluBuild3DMipmapLevels ()
2347 Perl_croak(aTHX_ "SDL::OpenGL::Build3DMipmapLevels requires GLU 1.2");
2352 gluErrorString ( code )
2355 RETVAL = (char*)gluErrorString(code);
2360 gluNewNurbsRenderer ()
2362 RETVAL = gluNewNurbsRenderer();
2367 gluDeleteNurbsRenderer ( obj )
2370 gluDeleteNurbsRenderer(obj);
2373 gluNurbsProperty ( obj, property, value )
2378 gluNurbsProperty(obj,property,(float)value);
2381 gluLoadSamplingMatrices ( obj, mm, pm, vp )
2387 gluLoadSamplingMatrices(obj,(GLfloat*)mm,(GLfloat*)pm,(GLint*)vp);
2390 gluGetNurbsProperty ( obj, property )
2395 gluGetNurbsProperty(obj,property,&f);
2401 gluNurbsCallback ( obj, which, cb )
2408 sdl_perl_nurbs_error_hook = cb;
2409 gluNurbsCallback(obj,GLU_ERROR,(GLvoid*)sdl_perl_nurbs_error_callback);
2411 #ifdef GLU_NURBS_BEGIN
2412 case GLU_NURBS_BEGIN:
2413 case GLU_NURBS_BEGIN_DATA:
2414 gluNurbsCallbackData(obj,(void*)cb);
2415 gluNurbsCallback(obj,GLU_NURBS_BEGIN_DATA,
2416 (GLvoid*)sdl_perl_nurbs_being_callback);
2418 case GLU_NURBS_TEXTURE_COORD:
2419 case GLU_NURBS_TEXTURE_COORD_DATA:
2420 gluNurbsCallbackData(obj,(void*)cb);
2421 gluNurbsCallback(obj,GLU_NURBS_TEXTURE_COORD_DATA,
2422 (GLvoid*)sdl_perl_nurbs_multi_callback);
2424 case GLU_NURBS_COLOR:
2425 case GLU_NURBS_COLOR_DATA:
2426 gluNurbsCallbackData(obj,(void*)cb);
2427 gluNurbsCallback(obj,GLU_NURBS_COLOR_DATA,
2428 (GLvoid*)sdl_perl_nurbs_multi_callback);
2430 case GLU_NURBS_NORMAL:
2431 case GLU_NURBS_NORMAL_DATA:
2432 gluNurbsCallbackData(obj,(void*)cb);
2433 gluNurbsCallback(obj,GLU_NURBS_NORMAL_DATA,
2434 (GLvoid*)sdl_perl_nurbs_multi_callback);
2436 case GLU_NURBS_VERTEX:
2437 case GLU_NURBS_VERTEX_DATA:
2438 gluNurbsCallbackData(obj,(void*)cb);
2439 gluNurbsCallback(obj,GLU_NURBS_VERTEX_DATA,
2440 (GLvoid*)sdl_perl_nurbs_multi_callback);
2443 case GLU_NURBS_END_DATA:
2444 gluNurbsCallbackData(obj,(void*)cb);
2445 gluNurbsCallback(obj,GLU_NURBS_END_DATA,
2446 (GLvoid*)sdl_perl_nurbs_end_callback);
2450 Perl_croak(aTHX_ "SDL::OpenGL::NurbsCallback - invalid type");
2454 gluNurbsCallbackData ( obj, cb )
2458 gluNurbsCallbackData(obj,(void*)cb);
2461 gluBeginSurface ( obj )
2464 gluBeginSurface(obj);
2467 gluEndSurface ( obj )
2473 gluNurbsSurface ( obj, uknot_count, uknot, vknot_count, vknot, u_stride, v_stride, ctlarray, uorder, vorder, type )
2486 gluNurbsSurface(obj,uknot_count,(GLfloat*)uknot,vknot_count,(GLfloat*)vknot,
2487 u_stride,v_stride,(GLfloat*)ctlarray,uorder,vorder,type);
2490 gluBeginCurve ( obj )
2502 gluNurbsCurve ( obj, uknot_count, uknot, u_stride, ctlarray, uorder, type )
2511 gluNurbsCurve(obj,uknot_count,(GLfloat*)uknot,u_stride,(GLfloat*)ctlarray,
2515 gluBeginTrim ( obj )
2527 gluPwlCurve ( obj, count, array, stride, type )
2534 gluPwlCurve(obj,count,(GLfloat*)array,stride,type);
2537 gluUnProject ( winx, winy, winz, mm, pm, vp )
2545 GLdouble objx, objy, objz;
2547 av_push(RETVAL,newSViv(gluUnProject(winx,winy,winz,(GLdouble*)mm,
2548 (GLdouble*)pm,(GLint*)vp,&objx,&objy,&objz)));
2549 av_push(RETVAL,newSVnv((double)objx));
2550 av_push(RETVAL,newSVnv((double)objy));
2551 av_push(RETVAL,newSVnv((double)objz));
2556 #ifdef GL_VERSION_1_3
2559 gluUnProject4 ( winx, winy, winz, clipw, mm, pm, vp, n, f )
2570 GLdouble objx, objy, objz, objw;
2572 av_push(RETVAL,newSViv(gluUnProject4(winx,winy,winz,clipw,(GLdouble*)mm,
2573 (GLdouble*)pm,(GLint*)vp,(GLclampd)n,(GLclampd)f,
2574 &objx,&objy,&objz,&objw)));
2575 av_push(RETVAL,newSVnv((double)objx));
2576 av_push(RETVAL,newSVnv((double)objy));
2577 av_push(RETVAL,newSVnv((double)objz));
2578 av_push(RETVAL,newSVnv((double)objw));
2582 #endif // GL_VERSION_1_3
2585 gluProject ( objx, objy, objz, mm, pm, vp )
2593 GLdouble winx, winy, winz;
2595 av_push(RETVAL,newSViv(gluUnProject(objx,objy,objz,(GLdouble*)mm,
2596 (GLdouble*)pm,(GLint*)vp,&winx,&winy,&winz)));
2597 av_push(RETVAL,newSVnv((double)winx));
2598 av_push(RETVAL,newSVnv((double)winy));
2599 av_push(RETVAL,newSVnv((double)winz));
2603 #ifdef GL_VERSION_1_2
2608 RETVAL = gluNewTess();
2613 gluTessCallback ( tess, type )
2618 case GLU_TESS_BEGIN:
2619 case GLU_TESS_BEGIN_DATA:
2620 gluTessCallback(tess,GLU_TESS_BEGIN_DATA,
2621 (GLvoid*)sdl_perl_tess_begin_callback);
2624 case GLU_TESS_EDGE_FLAG:
2625 case GLU_TESS_EDGE_FLAG_DATA:
2626 gluTessCallback(tess,GLU_TESS_EDGE_FLAG_DATA,
2627 (GLvoid*)sdl_perl_tess_edge_flag_callback);
2630 case GLU_TESS_VERTEX:
2631 case GLU_TESS_VERTEX_DATA:
2632 gluTessCallback(tess,GLU_TESS_VERTEX_DATA,
2633 (GLvoid*)sdl_perl_tess_vertex_callback);
2637 case GLU_TESS_END_DATA:
2638 gluTessCallback(tess,GLU_TESS_END_DATA,
2639 (GLvoid*)sdl_perl_tess_end_callback);
2642 case GLU_TESS_COMBINE:
2643 case GLU_TESS_COMBINE_DATA:
2644 gluTessCallback(tess,GLU_TESS_COMBINE_DATA,
2645 (GLvoid*)sdl_perl_tess_combine_callback);
2648 case GLU_TESS_ERROR:
2649 case GLU_TESS_ERROR_DATA:
2650 gluTessCallback(tess,GLU_TESS_ERROR_DATA,
2651 (GLvoid*)sdl_perl_tess_error_callback);
2656 gluTessProperty ( tessobj, property, value )
2657 GLUtesselator *tessobj
2661 gluTessProperty(tessobj,property,value);
2664 gluGetTessProperty ( tessobj, property )
2665 GLUtesselator *tessobj
2668 gluGetTessProperty(tessobj,property,&RETVAL);
2673 gluTessNormal ( tessobj, x, y, z )
2674 GLUtesselator *tessobj
2679 gluTessNormal(tessobj,x,y,z);
2682 gluTessBeginPolygon ( tessobj, cb )
2683 GLUtesselator *tessobj
2686 gluTessBeginPolygon(tessobj,cb);
2689 gluTessEndPolygon ( tessobj )
2690 GLUtesselator *tessobj
2692 gluTessEndPolygon(tessobj);
2695 gluTessBeginContour ( tessobj )
2696 GLUtesselator *tessobj
2698 gluTessBeginContour(tessobj);
2701 gluTessEndContour ( tessobj )
2702 GLUtesselator *tessobj
2704 gluTessEndContour(tessobj);
2707 gluDeleteTess ( tessobj )
2708 GLUtesselator *tessobj
2710 gluDeleteTess(tessobj);
2713 gluTessVertex ( tessobj, coords, vd )
2714 GLUtesselator *tessobj
2718 gluTessVertex(tessobj,(GLdouble*)coords,vd);
2725 RETVAL = gluNewQuadric ();
2730 gluDeleteQuadric (quad)
2733 gluDeleteQuadric(quad);
2736 gluQuadricNormals ( quad, normal )
2740 gluQuadricNormals(quad, normal);
2744 gluQuadricTexture ( quad, texture )
2748 gluQuadricTexture ( quad, texture );
2751 gluCylinder ( quad, base, top, height, slices, stacks )
2759 gluCylinder ( quad, base, top, height, slices, stacks );
2762 gluDisk ( quad, inner, outer, slices, loops )
2769 gluDisk ( quad, inner, outer, slices, loops );
2772 gluPartialDisk ( quad, inner, outer, slices, loops, start, sweep )
2782 gluPartialDisk ( quad, inner, outer, slices, loops, start, sweep );
2785 gluSphere ( quad, radius, slices, stacks )
2791 gluSphere ( quad, radius, slices, stacks );
2796 glXUseXFont ( font, first, count, list_base )
2802 glXUseXFont ( font, first, count, list_base );