3 // Copyright (C) 2002,2003,2004 David J. Goehrig
19 #define HAVE_TLS_CONTEXT
22 #ifndef GL_ALL_CLIENT_ATTRIB_BITS
23 #define GL_ALL_CLIENT_ATTRIB_BITS 0xFFFFFFF
24 #endif /* GL_ALL_CLIENT_BITS */
28 SV* sdl_perl_nurbs_error_hook;
30 sdl_perl_nurbs_error_callback ( GLenum errorCode )
38 XPUSHs(sv_2mortal(newSViv(errorCode)));
41 call_sv(sdl_perl_nurbs_error_hook,G_VOID);
49 sdl_perl_nurbs_being_callback ( GLenum type, void *cb )
60 XPUSHs(sv_2mortal(newSViv(type)));
71 sdl_perl_nurbs_multi_callback ( GLfloat *vec, void *cb )
82 XPUSHs(sv_2mortal(newSViv(PTR2IV(vec))));
93 sdl_perl_nurbs_end_callback ( void *cb )
111 sdl_perl_tess_end_callback ( void *cb )
122 XPUSHs(sv_2mortal(newSViv(GLU_TESS_BEGIN)));
133 sdl_perl_tess_begin_callback ( GLenum type, void *cb )
144 XPUSHs(sv_2mortal(newSViv(GLU_TESS_BEGIN)));
145 XPUSHs(sv_2mortal(newSViv(type)));
156 sdl_perl_tess_error_callback ( GLenum type, void *cb )
167 XPUSHs(sv_2mortal(newSViv(GLU_TESS_ERROR)));
168 XPUSHs(sv_2mortal(newSViv(type)));
179 sdl_perl_tess_edge_flag_callback ( GLenum flag, void *cb )
190 XPUSHs(sv_2mortal(newSViv(GLU_TESS_EDGE_FLAG)));
191 XPUSHs(sv_2mortal(newSViv(flag)));
202 sdl_perl_tess_vertex_callback ( double *vd, void *cb )
213 XPUSHs(sv_2mortal(newSViv(GLU_TESS_VERTEX)));
214 XPUSHs(sv_2mortal(newSVnv(vd[0])));
215 XPUSHs(sv_2mortal(newSVnv(vd[1])));
216 XPUSHs(sv_2mortal(newSVnv(vd[2])));
217 XPUSHs(sv_2mortal(newSVnv(vd[3])));
218 XPUSHs(sv_2mortal(newSVnv(vd[4])));
219 XPUSHs(sv_2mortal(newSVnv(vd[5])));
230 sdl_perl_tess_combine_callback ( GLdouble coords[3], double *vd[4], GLfloat weight[4],
231 GLdouble **out, void *cb )
244 XPUSHs(sv_2mortal(newSViv(GLU_TESS_COMBINE)));
245 XPUSHs(sv_2mortal(newSVpvn((char*)coords,sizeof(GLdouble)*3)));
246 XPUSHs(sv_2mortal(newSVpvn((char*)vd,sizeof(GLdouble*)*4)));
247 XPUSHs(sv_2mortal(newSVpvn((char*)weight,sizeof(GLfloat)*4)));
250 if ( 1 != call_sv(cmd,G_SCALAR) ) {
251 Perl_croak(aTHX_ "sdl_perl_tess_combine_callback failed");
254 data = (double*)POPp;
256 *out = (double*)malloc(sizeof(double)*width);
257 memcpy(*out,data,sizeof(double)*width);
264 MODULE = SDL::OpenGL PACKAGE = SDL::OpenGL
270 glClearColor ( r, g, b, a)
276 glClearColor((GLfloat)r,(GLfloat)g,(GLfloat)b,(GLfloat)a);
279 glClearIndex ( index )
285 glClearDepth ( depth )
297 glClearAccum ( r, g, b, a )
303 glClearAccum((GLfloat)r,(GLfloat)g,(GLfloat)b,(GLfloat)a);
325 glRecti(r->x,r->y,r->x+r->w,r->y+r->h);
328 glVertex ( x, y, ... )
337 } else if ( items == 3 ) {
372 case GL_EDGE_FLAG_ARRAY:
373 case GL_MAP1_TEXTURE_COORD_1:
374 case GL_LIGHT_MODEL_TWO_SIDE:
375 case GL_INDEX_LOGIC_OP:
376 case GL_PACK_ALIGNMENT:
378 case GL_TEXTURE_GEN_S:
379 case GL_MAP1_VERTEX_3:
382 case GL_NORMAL_ARRAY:
386 case GL_POLYGON_OFFSET_FILL:
387 case GL_MAP1_TEXTURE_COORD_4:
390 case GL_UNPACK_SWAP_BYTES:
392 case GL_POLYGON_OFFSET_POINT:
393 case GL_POINT_SMOOTH:
395 case GL_MAP2_TEXTURE_COORD_4:
397 case GL_POLYGON_OFFSET_LINE:
400 case GL_PACK_LSB_FIRST:
401 case GL_MAP1_TEXTURE_COORD_2:
402 case GL_MAP2_VERTEX_3:
403 case GL_MAP2_TEXTURE_COORD_2:
405 case GL_DOUBLEBUFFER:
406 case GL_UNPACK_LSB_FIRST:
407 case GL_TEXTURE_COORD_ARRAY:
409 case GL_TEXTURE_GEN_Q:
417 case GL_TEXTURE_GEN_R:
418 case GL_PACK_SWAP_BYTES:
419 case GL_DEPTH_WRITEMASK:
420 case GL_COLOR_LOGIC_OP:
425 case GL_COLOR_MATERIAL:
428 case GL_MAP1_VERTEX_4:
432 case GL_POLYGON_SMOOTH:
434 case GL_MAP2_COLOR_4:
436 case GL_VERTEX_ARRAY:
437 case GL_MAP1_TEXTURE_COORD_3:
438 case GL_STENCIL_TEST:
439 case GL_MAP2_TEXTURE_COORD_3:
440 case GL_TEXTURE_GEN_T:
441 case GL_LIGHT_MODEL_LOCAL_VIEWER:
443 case GL_MAP1_COLOR_4:
444 case GL_MAP2_TEXTURE_COORD_1:
445 case GL_CURRENT_RASTER_POSITION_VALID:
447 case GL_SCISSOR_TEST:
449 case GL_POLYGON_STIPPLE:
452 case GL_LINE_STIPPLE:
453 case GL_MAP2_VERTEX_4:
457 glGetBooleanv(param, ret);
459 for (i = 0; i < 1; i++) {
460 XPUSHs(sv_2mortal(newSViv(ret[i])));
464 case GL_COLOR_WRITEMASK:
468 glGetBooleanv(param, ret);
470 for (i = 0; i < 4; i++) {
471 XPUSHs(sv_2mortal(newSViv(ret[i])));
476 case GL_ALPHA_TEST_REF:
477 case GL_POINT_SIZE_GRANULARITY:
478 case GL_CURRENT_RASTER_DISTANCE:
484 case GL_DEPTH_CLEAR_VALUE:
491 case GL_POLYGON_OFFSET_FACTOR:
494 case GL_POLYGON_OFFSET_UNITS:
496 case GL_LINE_WIDTH_GRANULARITY:
502 glGetDoublev(param, ret);
504 for (i = 0; i < 1; i++) {
505 XPUSHs(sv_2mortal(newSVnv(ret[i])));
509 case GL_MODELVIEW_MATRIX:
510 case GL_TEXTURE_MATRIX:
511 case GL_PROJECTION_MATRIX:
515 glGetDoublev(param, ret);
517 for (i = 0; i < 16; i++) {
518 XPUSHs(sv_2mortal(newSVnv(ret[i])));
522 case GL_POINT_SIZE_RANGE:
523 case GL_LINE_WIDTH_RANGE:
524 case GL_MAP1_GRID_DOMAIN:
529 glGetDoublev(param, ret);
531 for (i = 0; i < 2; i++) {
532 XPUSHs(sv_2mortal(newSVnv(ret[i])));
536 case GL_CURRENT_NORMAL:
540 glGetDoublev(param, ret);
542 for (i = 0; i < 3; i++) {
543 XPUSHs(sv_2mortal(newSVnv(ret[i])));
548 case GL_MAP2_GRID_DOMAIN:
549 case GL_CURRENT_RASTER_POSITION:
550 case GL_CURRENT_COLOR:
551 case GL_LIGHT_MODEL_AMBIENT:
552 case GL_CURRENT_RASTER_TEXTURE_COORDS:
553 case GL_TEXTURE_ENV_COLOR:
554 case GL_CURRENT_RASTER_COLOR:
555 case GL_CURRENT_TEXTURE_COORDS:
556 case GL_COLOR_CLEAR_VALUE:
557 case GL_ACCUM_CLEAR_VALUE:
561 glGetDoublev(param, ret);
563 for (i = 0; i < 4; i++) {
564 XPUSHs(sv_2mortal(newSVnv(ret[i])));
568 case GL_CULL_FACE_MODE:
569 case GL_PIXEL_MAP_I_TO_A_SIZE:
570 case GL_PIXEL_MAP_A_TO_A_SIZE:
572 case GL_EDGE_FLAG_ARRAY_STRIDE:
577 case GL_POINT_SMOOTH_HINT:
578 case GL_PACK_SKIP_PIXELS:
580 case GL_STENCIL_CLEAR_VALUE:
582 case GL_COLOR_MATERIAL_PARAMETER:
583 case GL_ACCUM_BLUE_BITS:
585 case GL_VERTEX_ARRAY_STRIDE:
586 case GL_STENCIL_PASS_DEPTH_PASS:
587 case GL_CLIENT_ATTRIB_STACK_DEPTH:
589 case GL_LINE_STIPPLE_REPEAT:
591 case GL_PIXEL_MAP_B_TO_B_SIZE:
592 case GL_MAX_PIXEL_MAP_TABLE:
593 case GL_MAX_TEXTURE_SIZE:
594 case GL_PIXEL_MAP_S_TO_S_SIZE:
595 case GL_LOGIC_OP_MODE:
598 case GL_LINE_SMOOTH_HINT:
599 case GL_ALPHA_TEST_FUNC:
602 case GL_MAX_NAME_STACK_DEPTH:
603 case GL_INDEX_ARRAY_TYPE:
604 case GL_TEXTURE_COORD_ARRAY_TYPE:
605 case GL_COLOR_ARRAY_TYPE:
606 case GL_MAX_LIST_NESTING:
607 case GL_STENCIL_WRITEMASK:
609 case GL_ACCUM_ALPHA_BITS:
610 case GL_INDEX_ARRAY_STRIDE:
611 case GL_PIXEL_MAP_I_TO_B_SIZE:
613 case GL_STENCIL_FAIL:
614 case GL_UNPACK_ALIGNMENT:
615 case GL_STENCIL_PASS_DEPTH_FAIL:
616 case GL_ATTRIB_STACK_DEPTH:
617 case GL_PACK_SKIP_ROWS:
618 case GL_TEXTURE_STACK_DEPTH:
620 case GL_COLOR_ARRAY_STRIDE:
622 case GL_UNPACK_SKIP_PIXELS:
623 case GL_PIXEL_MAP_G_TO_G_SIZE:
624 case GL_VERTEX_ARRAY_TYPE:
626 case GL_MAX_CLIENT_ATTRIB_STACK_DEPTH:
627 case GL_INDEX_CLEAR_VALUE:
628 case GL_PIXEL_MAP_I_TO_G_SIZE:
630 case GL_PIXEL_MAP_I_TO_R_SIZE:
631 case GL_COLOR_ARRAY_SIZE:
632 case GL_TEXTURE_COORD_ARRAY_SIZE:
633 case GL_MAP1_GRID_SEGMENTS:
634 case GL_VERTEX_ARRAY_SIZE:
635 case GL_PIXEL_MAP_R_TO_R_SIZE:
636 case GL_TEXTURE_COORD_ARRAY_STRIDE:
637 case GL_MODELVIEW_STACK_DEPTH:
638 case GL_MAX_TEXTURE_STACK_DEPTH:
639 case GL_PIXEL_MAP_I_TO_I_SIZE:
641 case GL_INDEX_WRITEMASK:
642 case GL_PACK_ROW_LENGTH:
643 case GL_CURRENT_INDEX:
644 case GL_STENCIL_VALUE_MASK:
645 case GL_UNPACK_SKIP_ROWS:
646 case GL_MAX_PROJECTION_STACK_DEPTH:
648 case GL_STENCIL_FUNC:
649 case GL_INDEX_OFFSET:
650 case GL_UNPACK_ROW_LENGTH:
651 case GL_COLOR_MATERIAL_FACE:
652 case GL_NORMAL_ARRAY_TYPE:
653 case GL_STENCIL_BITS:
654 case GL_PROJECTION_STACK_DEPTH:
655 case GL_CURRENT_RASTER_INDEX:
657 case GL_TEXTURE_ENV_MODE:
658 case GL_NORMAL_ARRAY_STRIDE:
659 case GL_PERSPECTIVE_CORRECTION_HINT:
660 case GL_MAX_CLIP_PLANES:
661 case GL_MAX_MODELVIEW_STACK_DEPTH:
662 case GL_SUBPIXEL_BITS:
663 case GL_ACCUM_RED_BITS:
666 case GL_MAX_EVAL_ORDER:
667 case GL_LINE_STIPPLE_PATTERN:
668 case GL_NAME_STACK_DEPTH:
669 case GL_MAX_ATTRIB_STACK_DEPTH:
670 case GL_POLYGON_SMOOTH_HINT:
671 case GL_ACCUM_GREEN_BITS:
675 glGetIntegerv(param, ret);
677 for (i = 0; i < 1; i++) {
678 XPUSHs(sv_2mortal(newSViv(ret[i])));
682 case GL_POLYGON_MODE:
683 case GL_MAX_VIEWPORT_DIMS:
684 case GL_MAP2_GRID_SEGMENTS:
688 glGetIntegerv(param, ret);
690 for (i = 0; i < 2; i++) {
691 XPUSHs(sv_2mortal(newSViv(ret[i])));
700 glGetIntegerv(param, ret);
702 for (i = 0; i < 4; i++) {
703 XPUSHs(sv_2mortal(newSViv(ret[i])));
708 croak("Unknown glGet parameter!");
711 const char * glGetString ( name )
714 RETVAL = (const char *)glGetString (name);
722 RETVAL = glIsEnabled(cap);
730 glPointSize((GLfloat)size);
736 glLineWidth((GLfloat)size);
739 glLineStipple ( factor, pattern )
743 glLineStipple(factor,pattern);
746 glPolygonMode ( face, mode )
750 glPolygonMode(face,mode);
765 glPolygonStipple ( mask )
768 glPolygonStipple(mask);
785 glEnableClientState ( array )
788 glEnableClientState(array);
791 glDisableClientState ( array )
794 glDisableClientState(array);
797 glVertexPointer ( size, type, stride, pointer)
803 glVertexPointer(size,type,stride,pointer);
806 glColorPointer ( size, type, stride, pointer )
812 glColorPointer(size,type,stride,pointer);
815 glNormalPointer ( type, stride, pointer )
820 glNormalPointer(type,stride,pointer);
823 glTexCoordPointer ( size, type, stride, pointer )
829 glTexCoordPointer(size,type,stride,pointer);
832 glEdgeFlagPointer ( stride, pointer )
836 glEdgeFlagPointer(stride,pointer);
839 glArrayElement ( ith )
845 glDrawElements ( mode, count, type, indices )
851 glDrawElements( mode, count, type, indices);
854 glDrawRangeElements ( mode, start, end, count, type, indices )
862 glDrawRangeElements(mode,start,end,count,type,indices);
865 glDrawArrays ( mode, first, count )
870 glDrawArrays(mode,first,count);
873 glInterleavedArrays ( format, stride, pointer )
878 glInterleavedArrays(format,stride,pointer);
881 glPushAttrib ( mask )
892 glPushClientAttrib ( mask )
895 glPushClientAttrib(mask);
903 glMatrixMode ( mode )
918 for ( i = 0; i < 16; i++ ) {
919 mat[i] = (i < items && SvNOK(ST(i)) ? SvNV(ST(i)) : 0.0 );
928 for ( i = 0; i < 16; i++ ) {
929 mat[i] = (i < items && SvNOK(ST(i)) ? SvNV(ST(i)) : 0.0 );
934 glTranslate ( x, y, z )
942 glRotate ( angle, x, y, z )
948 glRotated(angle,x,y,z);
959 glFrustum ( left, right, bottom, top, n, f )
967 glFrustum(left,right,bottom,top,n,f);
970 glOrtho ( left, right, bottom, top, n, f )
978 glOrtho(left,right,bottom,top,n,f);
981 glViewport ( x, y, width, height )
987 glViewport(x,y,width,height);
990 glDepthRange ( n, f )
1007 glClipPlane ( plane, ... )
1012 for (i = 0; i < 4; i++ ) {
1013 v[i] = (i+1 < items && SvNOK(ST(i+1))) ? SvNV(ST(i+1)) : 0.0;
1015 glClipPlane(plane,v);
1018 glColor ( r, g, b, ... )
1038 glShadeModel ( mode )
1044 glLight ( light, name, ... )
1051 for ( i = 0; i < 4; i++ ) {
1052 v[i] = (SvNOK(ST(i+2))) ? SvNV(ST(i+2)) : 0.0;
1054 glLightfv(light,name,v);
1055 } else if ( items == 5 ) {
1057 for ( i = 0; i < 3; i++ ) {
1058 v[i] = (SvNOK(ST(i+2))) ? SvNV(ST(i+2)) : 0.0;
1060 glLightfv(light,name,v);
1061 } else if ( items == 3 ) {
1064 glLightf(light,name,v);
1066 Perl_croak(aTHX_ "SDL::OpenGL::Light invalid arguments");
1070 glLightModel ( pname, ... )
1074 if ( pname == GL_LIGHT_MODEL_LOCAL_VIEWER ||
1075 pname == GL_LIGHT_MODEL_TWO_SIDE ||
1076 pname == GL_LIGHT_MODEL_COLOR_CONTROL ) {
1077 glLightModelf(pname,SvNV(ST(1)));
1078 } else if ( pname == GL_LIGHT_MODEL_AMBIENT) {
1079 vec[0] = SvNV(ST(1));
1080 vec[1] = SvNV(ST(2));
1081 vec[2] = SvNV(ST(3));
1082 vec[3] = SvNV(ST(4));
1083 glLightModelfv(pname,vec);
1085 Perl_croak(aTHX_ "SDL::OpenGL::glLightModel unknown model %d",pname);
1089 glMaterial ( face, name, ... )
1096 for ( i = 0; i < 4; i++ ) {
1097 v[i] = (SvNOK(ST(i+2))) ? SvNV(ST(i+2)) : 0.0;
1099 glMaterialfv(face,name,v);
1100 } else if ( items == 5 ) {
1102 for ( i = 0; i < 4; i++ ) {
1103 v[i] = (SvNOK(ST(i+2))) ? SvNV(ST(i+2)) : 0.0;
1105 glMaterialfv(face,name,v);
1106 } else if ( items == 3 ) {
1109 glMaterialf(face,name,v);
1111 Perl_croak(aTHX_ "SDL::OpenGL::Material invalid arguments");
1115 glColorMaterial ( face, mode )
1119 glColorMaterial(face,mode);
1122 glBlendFunc ( sfactor, dfactor )
1126 glBlendFunc(sfactor,dfactor);
1130 glHint ( target, hint )
1134 glHint(target,hint);
1147 } else if ( items == 2 ) {
1152 Perl_croak(aTHX_ "SDL::OpenGL::Material invalid arguments");
1156 glPolygonOffset ( factor, units )
1160 glPolygonOffset(factor,units);
1163 glGenLists ( range )
1166 RETVAL = glGenLists(range);
1171 glNewList ( list, mode )
1175 glNewList(list,mode);
1183 glDeleteLists ( base, count )
1187 glDeleteLists(base, count);
1199 RETVAL = glIsList(list);
1214 i = (int*)safemalloc(sizeof(int)* (items));
1215 for ( j = 0; j < items; j++ ) {
1219 Perl_croak(aTHX_ "usage: SDL::OpenGL::CallLists(type,...)");
1221 glCallLists(items, GL_INT, i);
1225 glCallListsString ( string )
1230 str = SvPV(string,len);
1231 glCallLists(len,GL_BYTE,str);
1234 glRasterPos ( x, y, ... )
1240 glRasterPos2d (x,y);
1242 else if (items == 3)
1244 double z = SvNV (ST(2));
1245 glRasterPos3d (x,y,z);
1247 else if (items == 4)
1249 double z = SvNV (ST(2));
1250 double w = SvNV (ST(3));
1251 glRasterPos4d (x,y,z,w);
1255 glBitmap ( width, height, x1, y1, x2, y2, data )
1264 glBitmap(width,height,x1,y1,x2,y2,data);
1267 glDrawPixels ( width, height, format, type, pixels )
1274 glDrawPixels(width,height,format,type,pixels);
1278 glReadPixels ( x, y, width, height, format, type )
1288 size = 1; /* ALPHA, BLUE, GREEN or RED */
1289 if (format == GL_BGR || format == GL_RGB)
1291 if (format == GL_BGRA || format == GL_RGBA)
1293 len = height * width * size; /* in bytes */
1294 RETVAL = newSV(len); /* alloc len+1 bytes */
1295 SvPOK_on(RETVAL); /* make an PV */
1296 buf = SvPVX(RETVAL); /* get ptr to buffer */
1297 glReadPixels(x,y,width,height,format,type,buf);
1298 SvCUR_set(RETVAL, len); /* set real length */
1303 glReadPixel ( x, y )
1307 int rgba[4]; /* r,g,b,a */
1309 glReadPixels(x,y,1,1,GL_RGBA,GL_UNSIGNED_INT,rgba);
1311 for ( i = 0; i < 4; i++ ) {
1312 av_push(RETVAL,newSViv(rgba[i]));
1318 glCopyPixels ( x, y, width, height, buffer )
1325 glCopyPixels(x,y,width,height,buffer);
1328 glPixelStore ( name, param )
1332 glPixelStorei(name,param);
1335 glPixelTransfer ( name, ... )
1340 case GL_MAP_STENCIL:
1341 case GL_INDEX_SHIFT:
1342 case GL_INDEX_OFFSET:
1343 glPixelTransferi(name,SvIV(ST(1)));
1346 glPixelTransferf(name,SvNV(ST(1)));
1351 glPixelMap ( type, map, mapsize, values )
1358 case GL_UNSIGNED_INT:
1359 glPixelMapuiv(map,mapsize,(GLint*)values);
1361 case GL_UNSIGNED_SHORT:
1362 glPixelMapusv(map,mapsize,(GLushort*)values);
1365 glPixelMapfv(map,mapsize,(GLfloat*)values);
1370 glPixelZoom ( zoomx, zoomy )
1374 glPixelZoom(zoomx,zoomy);
1376 #ifdef GL_VERSION_1_3
1379 glColorTable ( target, internalFormat, width, format, type, data )
1381 GLenum internalFormat
1387 glColorTable(target,internalFormat,width,format,type,data);
1390 glColorTableParameter ( target, name, r, g, b, a)
1403 glColorTableParameterfv(target,name,vec);
1406 glCopyColorTable ( target, internalFormat, x, y, width )
1408 GLenum internalFormat
1413 glCopyColorTable(target,internalFormat,x,y,width);
1416 glColorSubTable ( target, start, count, format, type, data )
1424 glColorSubTable(target,start,count,format,type,data);
1427 glCopyColorSubTable ( target, start, x, y, count )
1434 glCopyColorSubTable(target,start,x,y,count);
1437 glConvolutionFilter2D ( target, internalFormat, width, height, format, type, image )
1439 Uint32 internalFormat
1446 glConvolutionFilter2D(target,internalFormat,width,height,format,type,image);
1449 glCopyConvolutionFilter2D ( target, internalFormat, x, y, width, height )
1451 Uint32 internalFormat
1457 glCopyConvolutionFilter2D(target,internalFormat,x,y,width,height);
1460 glSeparableFilter2D ( target, internalFormat, width, height, format, type, row, column )
1462 Uint32 internalFormat
1470 glSeparableFilter2D(target,internalFormat,width,height,format,type,row,column);
1473 glConvolutionFilter1D ( target, internalFormat, width, format, type, image )
1475 Uint32 internalFormat
1481 glConvolutionFilter1D(target,internalFormat,width,format,type,image);
1484 glCopyConvolutionFilter1D ( target, internalFormat, x, y, width )
1486 Uint32 internalFormat
1491 glCopyConvolutionFilter1D(target,internalFormat,x,y,width);
1494 glConvolutionParameter ( target, pname, ... )
1501 case GL_CONVOLUTION_BORDER_MODE:
1503 Perl_croak(aTHX_ "Usage: ConvolutionParameter(target,pname,...)");
1505 glConvolutionParameteri(target,pname,pi);
1507 case GL_CONVOLUTION_FILTER_SCALE:
1508 case GL_CONVOLUTION_FILTER_BIAS:
1510 Perl_croak(aTHX_ "Usage: ConvolutionParameter(target,pname,...)");
1511 pv[0] = (GLfloat)SvNV(ST(2));
1512 pv[1] = (GLfloat)SvNV(ST(3));
1513 pv[2] = (GLfloat)SvNV(ST(4));
1514 pv[3] = (GLfloat)SvNV(ST(5));
1515 glConvolutionParameterfv(target,pname,pv);
1518 Perl_croak(aTHX_ "ConvolutionParameter invalid parameter");
1523 glHistogram ( target, width, internalFormat, sink )
1526 Uint32 internalFormat
1529 glHistogram(target,width,internalFormat,sink);
1532 glGetHistogram ( target, reset, format, type, values )
1539 glGetHistogram(target,reset,format,type,values);
1542 glResetHistogram ( target )
1545 glResetHistogram(target);
1548 glMinmax ( target, internalFormat, sink )
1550 Uint32 internalFormat
1553 glMinmax(target,internalFormat,sink);
1556 glGetMinmax ( target, reset, format, type, values )
1563 glGetMinmax(target,reset,format,type,values);
1566 glResetMinmax ( target )
1569 glResetMinmax(target);
1572 glBlendEquation ( mode )
1575 glBlendEquation(mode);
1577 #endif // GL_VERSION_1_3
1580 glTexImage2D ( target, level, internalFormat, width, height, border, format, type, data )
1583 Sint32 internalFormat
1591 glTexImage2D(target,level,internalFormat,width,height,border,format,type,data);
1594 glCopyTexImage2D ( target, level, internalFormat, x, y, width, height, border )
1597 Sint32 internalFormat
1604 glCopyTexImage2D(target,level,internalFormat,x,y,width,height,border);
1607 glTexSubImage2D ( target, level, xoffset, yoffset, width, height, format, type, data )
1618 glTexSubImage2D(target,level,xoffset,yoffset,width,height,format,type,data);
1621 glCopyTexSubImage2D ( target, level, xoffset, yoffset, x, y, width, height )
1631 glCopyTexSubImage2D(target,level,xoffset,yoffset,x,y,width,height);
1634 glTexImage1D ( target, level, internalFormat, width, border, format, type, data )
1637 Sint32 internalFormat
1644 glTexImage1D(target,level,internalFormat,width,border,format,type,data);
1647 glTexSubImage1D ( target, level, xoffset, width, format, type, data )
1656 glTexSubImage1D(target,level,xoffset,width,format,type,data);
1659 glCopyTexImage1D ( target, level, internalFormat, x, y, width, border )
1662 Sint32 internalFormat
1668 glCopyTexImage1D(target,level,internalFormat,x,y,width,border);
1671 glCopyTexSubImage1D ( target, level, xoffset, x, y, width )
1679 glCopyTexSubImage1D(target,level,xoffset,x,y,width);
1681 #ifdef GL_VERSION_1_3
1684 glTexImage3D ( target, level, internalFormat, width, height, depth, border, format, type, data )
1687 Sint32 internalFormat
1696 glTexImage3D(target,level,internalFormat,width,height,depth,border,format,type,data);
1699 glTexSubImage3D ( target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, data )
1712 glTexSubImage3D(target,level,xoffset,yoffset,zoffset,
1713 width,height,depth,format,type,data);
1716 glCopyTexSubImage3D ( target, level, xoffset, yoffset, zoffset, x, y, width, height )
1727 glCopyTexSubImage3D(target,level,xoffset,yoffset,zoffset,x,y,width,height);
1729 #endif // GL_VERSION_1_3
1737 names = (Uint32*)safemalloc(sizeof(Uint32)*n);
1739 glGenTextures(n,names);
1740 for ( i = 0; i < n; i++ ) {
1741 av_push(RETVAL,newSViv(names[i]));
1748 glIsTexture ( texture )
1751 RETVAL = glIsTexture(texture);
1756 glBindTexture ( target, texture )
1760 glBindTexture(target,texture);
1763 glDeleteTextures ( ... )
1767 textures = (Uint32*)safemalloc(sizeof(Uint32) * items);
1769 for ( i = 0; i < items; i++ ) {
1770 textures[i] = SvIV(ST(i));
1773 glDeleteTextures(items,textures);
1777 glAreTexturesResident ( ... )
1783 textures = (Uint32*)safemalloc(sizeof(Uint32) * items);
1784 homes = (GLboolean*)safemalloc(sizeof(GLboolean) * items);
1786 for ( i = 0; i < items; i++ ) {
1787 textures[i] = SvIV(ST(i));
1790 if ( GL_FALSE != glAreTexturesResident(items,textures,homes)) {
1791 for (i = 0; i < items; i++ ) {
1792 av_push(RETVAL,newSViv(homes[i]));
1801 glPrioritizeTextures ( n, names, priorities )
1806 glPrioritizeTextures(n,(GLuint*)names,(const GLclampf *)priorities);
1809 glTexEnv ( target, name, ... )
1816 case GL_TEXTURE_ENV_MODE:
1818 glTexEnvi(target,name,p);
1820 case GL_TEXTURE_ENV_COLOR:
1821 pv[0] = SvNV(ST(2));
1822 pv[1] = SvNV(ST(3));
1823 pv[2] = SvNV(ST(4));
1824 pv[3] = SvNV(ST(5));
1825 glTexEnvfv(target,name,pv);
1833 if ( items < 1 || items > 4 )
1834 Perl_croak (aTHX_ "usage: SDL::OpenGL::TexCoord(s,[t,[r,[q]]])");
1847 glTexCoord4d(s,t,r,q);
1850 glTexParameter ( target, name, ... )
1857 case GL_TEXTURE_BORDER_COLOR:
1858 pv[0] = SvNV(ST(2));
1859 pv[1] = SvNV(ST(3));
1860 pv[2] = SvNV(ST(4));
1861 pv[3] = SvNV(ST(5));
1862 glTexParameterfv(target,name,pv);
1864 case GL_TEXTURE_PRIORITY:
1865 case GL_TEXTURE_MIN_LOD:
1866 case GL_TEXTURE_MAX_LOD:
1867 pv[0] = SvNV(ST(2));
1868 glTexParameterf(target,name,pv[0]);
1870 case GL_TEXTURE_BASE_LEVEL:
1871 case GL_TEXTURE_MAX_LEVEL:
1874 glTexParameteri(target,name,p);
1879 glTexGen ( coord, name, ... )
1887 case GL_TEXTURE_GEN_MODE:
1889 glTexGeni(coord,name,p);
1893 Perl_croak(aTHX_ "usage: glTexGen(coord,name,...)");
1894 pv = (GLdouble*)safemalloc(sizeof(GLdouble)*(items-2));
1895 for ( i = 0; i < items - 2; i++ ) {
1896 pv[i] = SvNV(ST(i+2));
1898 glTexGendv(coord,name,pv);
1903 #ifdef GL_VERSION_1_3
1906 glActiveTextureARB ( texUnit )
1909 glActiveTextureARB(texUnit);
1912 glMultiTexCoord ( texUnit, ... )
1916 if ( items < 2 || items > 5 )
1917 Perl_croak (aTHX_ "usage: SDL::OpenGL::MultiTexCoord(tex,s,[t,[r,[q]]])");
1930 glMultiTexCoord4dARB(texUnit,s,t,r,q);
1932 #endif // GL_VERSION_1_3
1935 glDrawBuffer ( mode )
1941 glReadBuffer ( mode )
1947 glIndexMask ( mask )
1953 glColorMask ( red, green, blue, alpha )
1959 glColorMask(red,green,blue,alpha);
1962 glDepthMask ( flag )
1968 glStencilMask ( mask )
1971 glStencilMask(mask);
1974 glScissor ( x , y, width, height )
1980 glScissor(x,y,width,height);
1983 glAlphaFunc ( func, ref )
1987 glAlphaFunc(func,ref);
1990 glStencilFunc ( func, ref, mask )
1995 glStencilFunc(func,ref,mask);
1998 glStencilOp ( fail, zfail, zpass )
2003 glStencilOp(fail,zfail,zpass);
2006 glDepthFunc ( func )
2012 glLogicOp ( opcode )
2018 glAccum ( op, value )
2025 glMap1 ( target, u1, u2, stride, order, points )
2033 glMap1d(target,u1,u2,stride,order,(double*)points);
2042 glMapGrid1 ( n, u1, u2 )
2047 glMapGrid1d(n,u1,u2);
2050 glEvalMesh1 ( mode, p1, p2 )
2055 glEvalMesh1(mode,p1,p2);
2058 glMap2 ( target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points )
2070 glMap2d(target,u1,u2,ustride,uorder,v1,v2,vstride,vorder,(double*)points);
2073 glEvalCoord2 ( u, v )
2080 glMapGrid2 ( nu, u1, u2, nv, v1, v2 )
2088 glMapGrid2d(nu,u1,u2,nv,v1,v2);
2091 glEvalMesh2 ( mode, i1, i2, j1, j2 )
2098 glEvalMesh2(mode,i1,i2,j1,j2);
2103 RETVAL = glGetError();
2108 glRenderMode ( mode )
2111 RETVAL = glRenderMode( mode );
2138 glFeedbackBuffer ( size, type, buffer )
2143 glFeedbackBuffer(size,type,buffer);
2146 glPassThrough ( token )
2149 glPassThrough(token);
2157 gluLookAt ( eyex, eyey, eyez, centerx, centery, centerz, upx, upy, upz )
2168 gluLookAt(eyex,eyey,eyez,centerx,centery,centerz,upx,upy,upz);
2171 gluPerspective ( fovy, aspect, n, f )
2177 gluPerspective(fovy,aspect,n,f);
2180 gluPickMatrix ( x, y, delx, dely, viewport )
2187 gluPickMatrix(x,y,delx,dely,viewport);
2190 gluOrtho2D ( left, right, bottom, top )
2196 gluOrtho2D(left,right,bottom,top);
2199 gluScaleImage ( format, widthin, heightin, typein, datain, widthout, heightout, typeout, dataout )
2210 RETVAL = gluScaleImage(format,widthin,heightin,typein,datain,
2211 widthout,heightout,typeout,dataout);
2216 gluBuild1DMipmaps ( target, internalFormat, width, format, type, data )
2218 Sint32 internalFormat
2224 RETVAL = gluBuild1DMipmaps(target,internalFormat,width,format,type,data);
2229 gluBuild2DMipmaps ( target, internalFormat, width, height, format, type, data )
2231 Sint32 internalFormat
2238 RETVAL = gluBuild2DMipmaps(target,internalFormat,width,height,format,type,data);
2243 #if HAVE_GLU_VERSION >= 12
2245 gluBuild3DMipmaps ( target, internalFormat, width, height, depth, format, type, data )
2247 Sint32 internalFormat
2255 RETVAL = gluBuild3DMipmaps(target,internalFormat,width,height,depth,
2262 gluBuild3DMipmaps ( )
2264 Perl_croak (aTHX_ "SDL::OpenGL::Build3DMipmaps requires GLU 1.2");
2268 #if HAVE_GLU_VERSION >= 12
2270 gluBuild1DMipmapLevels ( target, internalFormat, width, format, type, level, base, max, data )
2272 Sint32 internalFormat
2281 RETVAL = gluBuild1DMipmapLevels(target,internalFormat,width,
2282 format,type,level,base,max,data);
2288 gluBuild1DMipmapLevels ()
2290 Perl_croak(aTHX_ "SDL::OpenGL::Build1DMipmapLevels requires GLU 1.2");
2294 #if HAVE_GLU_VERSION >= 12
2296 gluBuild2DMipmapLevels ( target, internalFormat, width, height, format, type, level, base, max, data )
2298 Sint32 internalFormat
2308 RETVAL = gluBuild2DMipmapLevels(target,internalFormat,width,height,
2309 format,type,level,base,max,data);
2315 gluBuild2DMipmapLevels ()
2317 Perl_croak(aTHX_ "SDL::OpenGL::Build2DMipmapLevels requires GLU 1.2");
2321 #if HAVE_GLU_VERSION >= 12
2323 gluBuild3DMipmapLevels ( target, internalFormat, width, height, depth, format, type, level, base, max, data )
2325 Sint32 internalFormat
2336 RETVAL = gluBuild3DMipmapLevels(target,internalFormat,width,height,depth,
2337 format,type,level,base,max,data);
2343 gluBuild3DMipmapLevels ()
2345 Perl_croak(aTHX_ "SDL::OpenGL::Build3DMipmapLevels requires GLU 1.2");
2350 gluErrorString ( code )
2353 RETVAL = (char*)gluErrorString(code);
2358 gluNewNurbsRenderer ()
2360 RETVAL = gluNewNurbsRenderer();
2365 gluDeleteNurbsRenderer ( obj )
2368 gluDeleteNurbsRenderer(obj);
2371 gluNurbsProperty ( obj, property, value )
2376 gluNurbsProperty(obj,property,(float)value);
2379 gluLoadSamplingMatrices ( obj, mm, pm, vp )
2385 gluLoadSamplingMatrices(obj,(GLfloat*)mm,(GLfloat*)pm,(GLint*)vp);
2388 gluGetNurbsProperty ( obj, property )
2393 gluGetNurbsProperty(obj,property,&f);
2399 gluNurbsCallback ( obj, which, cb )
2406 sdl_perl_nurbs_error_hook = cb;
2407 gluNurbsCallback(obj,GLU_ERROR,(GLvoid*)sdl_perl_nurbs_error_callback);
2409 #ifdef GLU_NURBS_BEGIN
2410 case GLU_NURBS_BEGIN:
2411 case GLU_NURBS_BEGIN_DATA:
2412 gluNurbsCallbackData(obj,(void*)cb);
2413 gluNurbsCallback(obj,GLU_NURBS_BEGIN_DATA,
2414 (GLvoid*)sdl_perl_nurbs_being_callback);
2416 case GLU_NURBS_TEXTURE_COORD:
2417 case GLU_NURBS_TEXTURE_COORD_DATA:
2418 gluNurbsCallbackData(obj,(void*)cb);
2419 gluNurbsCallback(obj,GLU_NURBS_TEXTURE_COORD_DATA,
2420 (GLvoid*)sdl_perl_nurbs_multi_callback);
2422 case GLU_NURBS_COLOR:
2423 case GLU_NURBS_COLOR_DATA:
2424 gluNurbsCallbackData(obj,(void*)cb);
2425 gluNurbsCallback(obj,GLU_NURBS_COLOR_DATA,
2426 (GLvoid*)sdl_perl_nurbs_multi_callback);
2428 case GLU_NURBS_NORMAL:
2429 case GLU_NURBS_NORMAL_DATA:
2430 gluNurbsCallbackData(obj,(void*)cb);
2431 gluNurbsCallback(obj,GLU_NURBS_NORMAL_DATA,
2432 (GLvoid*)sdl_perl_nurbs_multi_callback);
2434 case GLU_NURBS_VERTEX:
2435 case GLU_NURBS_VERTEX_DATA:
2436 gluNurbsCallbackData(obj,(void*)cb);
2437 gluNurbsCallback(obj,GLU_NURBS_VERTEX_DATA,
2438 (GLvoid*)sdl_perl_nurbs_multi_callback);
2441 case GLU_NURBS_END_DATA:
2442 gluNurbsCallbackData(obj,(void*)cb);
2443 gluNurbsCallback(obj,GLU_NURBS_END_DATA,
2444 (GLvoid*)sdl_perl_nurbs_end_callback);
2448 Perl_croak(aTHX_ "SDL::OpenGL::NurbsCallback - invalid type");
2452 gluNurbsCallbackData ( obj, cb )
2456 gluNurbsCallbackData(obj,(void*)cb);
2459 gluBeginSurface ( obj )
2462 gluBeginSurface(obj);
2465 gluEndSurface ( obj )
2471 gluNurbsSurface ( obj, uknot_count, uknot, vknot_count, vknot, u_stride, v_stride, ctlarray, uorder, vorder, type )
2484 gluNurbsSurface(obj,uknot_count,(GLfloat*)uknot,vknot_count,(GLfloat*)vknot,
2485 u_stride,v_stride,(GLfloat*)ctlarray,uorder,vorder,type);
2488 gluBeginCurve ( obj )
2500 gluNurbsCurve ( obj, uknot_count, uknot, u_stride, ctlarray, uorder, type )
2509 gluNurbsCurve(obj,uknot_count,(GLfloat*)uknot,u_stride,(GLfloat*)ctlarray,
2513 gluBeginTrim ( obj )
2525 gluPwlCurve ( obj, count, array, stride, type )
2532 gluPwlCurve(obj,count,(GLfloat*)array,stride,type);
2535 gluUnProject ( winx, winy, winz, mm, pm, vp )
2543 GLdouble objx, objy, objz;
2545 av_push(RETVAL,newSViv(gluUnProject(winx,winy,winz,(GLdouble*)mm,
2546 (GLdouble*)pm,(GLint*)vp,&objx,&objy,&objz)));
2547 av_push(RETVAL,newSVnv((double)objx));
2548 av_push(RETVAL,newSVnv((double)objy));
2549 av_push(RETVAL,newSVnv((double)objz));
2554 #ifdef GL_VERSION_1_3
2557 gluUnProject4 ( winx, winy, winz, clipw, mm, pm, vp, n, f )
2568 GLdouble objx, objy, objz, objw;
2570 av_push(RETVAL,newSViv(gluUnProject4(winx,winy,winz,clipw,(GLdouble*)mm,
2571 (GLdouble*)pm,(GLint*)vp,(GLclampd)n,(GLclampd)f,
2572 &objx,&objy,&objz,&objw)));
2573 av_push(RETVAL,newSVnv((double)objx));
2574 av_push(RETVAL,newSVnv((double)objy));
2575 av_push(RETVAL,newSVnv((double)objz));
2576 av_push(RETVAL,newSVnv((double)objw));
2580 #endif // GL_VERSION_1_3
2583 gluProject ( objx, objy, objz, mm, pm, vp )
2591 GLdouble winx, winy, winz;
2593 av_push(RETVAL,newSViv(gluUnProject(objx,objy,objz,(GLdouble*)mm,
2594 (GLdouble*)pm,(GLint*)vp,&winx,&winy,&winz)));
2595 av_push(RETVAL,newSVnv((double)winx));
2596 av_push(RETVAL,newSVnv((double)winy));
2597 av_push(RETVAL,newSVnv((double)winz));
2601 #ifdef GL_VERSION_1_2
2606 RETVAL = gluNewTess();
2611 gluTessCallback ( tess, type )
2616 case GLU_TESS_BEGIN:
2617 case GLU_TESS_BEGIN_DATA:
2618 gluTessCallback(tess,GLU_TESS_BEGIN_DATA,
2619 (GLvoid*)sdl_perl_tess_begin_callback);
2622 case GLU_TESS_EDGE_FLAG:
2623 case GLU_TESS_EDGE_FLAG_DATA:
2624 gluTessCallback(tess,GLU_TESS_EDGE_FLAG_DATA,
2625 (GLvoid*)sdl_perl_tess_edge_flag_callback);
2628 case GLU_TESS_VERTEX:
2629 case GLU_TESS_VERTEX_DATA:
2630 gluTessCallback(tess,GLU_TESS_VERTEX_DATA,
2631 (GLvoid*)sdl_perl_tess_vertex_callback);
2635 case GLU_TESS_END_DATA:
2636 gluTessCallback(tess,GLU_TESS_END_DATA,
2637 (GLvoid*)sdl_perl_tess_end_callback);
2640 case GLU_TESS_COMBINE:
2641 case GLU_TESS_COMBINE_DATA:
2642 gluTessCallback(tess,GLU_TESS_COMBINE_DATA,
2643 (GLvoid*)sdl_perl_tess_combine_callback);
2646 case GLU_TESS_ERROR:
2647 case GLU_TESS_ERROR_DATA:
2648 gluTessCallback(tess,GLU_TESS_ERROR_DATA,
2649 (GLvoid*)sdl_perl_tess_error_callback);
2654 gluTessProperty ( tessobj, property, value )
2655 GLUtesselator *tessobj
2659 gluTessProperty(tessobj,property,value);
2662 gluGetTessProperty ( tessobj, property )
2663 GLUtesselator *tessobj
2666 gluGetTessProperty(tessobj,property,&RETVAL);
2671 gluTessNormal ( tessobj, x, y, z )
2672 GLUtesselator *tessobj
2677 gluTessNormal(tessobj,x,y,z);
2680 gluTessBeginPolygon ( tessobj, cb )
2681 GLUtesselator *tessobj
2684 gluTessBeginPolygon(tessobj,cb);
2687 gluTessEndPolygon ( tessobj )
2688 GLUtesselator *tessobj
2690 gluTessEndPolygon(tessobj);
2693 gluTessBeginContour ( tessobj )
2694 GLUtesselator *tessobj
2696 gluTessBeginContour(tessobj);
2699 gluTessEndContour ( tessobj )
2700 GLUtesselator *tessobj
2702 gluTessEndContour(tessobj);
2705 gluDeleteTess ( tessobj )
2706 GLUtesselator *tessobj
2708 gluDeleteTess(tessobj);
2711 gluTessVertex ( tessobj, coords, vd )
2712 GLUtesselator *tessobj
2716 gluTessVertex(tessobj,(GLdouble*)coords,vd);
2723 RETVAL = gluNewQuadric ();
2728 gluDeleteQuadric (quad)
2731 gluDeleteQuadric(quad);
2734 gluQuadricNormals ( quad, normal )
2738 gluQuadricNormals(quad, normal);
2742 gluQuadricTexture ( quad, texture )
2746 gluQuadricTexture ( quad, texture );
2749 gluCylinder ( quad, base, top, height, slices, stacks )
2757 gluCylinder ( quad, base, top, height, slices, stacks );
2760 gluDisk ( quad, inner, outer, slices, loops )
2767 gluDisk ( quad, inner, outer, slices, loops );
2770 gluPartialDisk ( quad, inner, outer, slices, loops, start, sweep )
2780 gluPartialDisk ( quad, inner, outer, slices, loops, start, sweep );
2783 gluSphere ( quad, radius, slices, stacks )
2789 gluSphere ( quad, radius, slices, stacks );