Moved old SDL::Palette to SDL::Game::Palette.
[sdlgit/SDL_perl.git] / src / OpenGL.xs
index 4c54228..841d92b 100644 (file)
 
 #include <SDL.h>
 
+#ifdef PERL_DARWIN
 #include <gl.h>
 #include <glu.h>
+#else
+#include <GL/gl.h>
+
+#if defined(__WIN32__) && defined(__MINGW32__)
+/* 
+this is a sort of dirty hack - MS Windows supports just OpenGL 1.1 and all 1.2+
+related stuff was moved from GL/gl.h to GL/glext.h; however this separation
+was done not properly and even if we are OK with OpenGL 1.1 there are some
+constants missing in GL/gl.h thus we need also GL/glext.h
+*/
+#include <GL/glext.h>
+#undef GL_VERSION_1_3
+#undef GL_VERSION_1_2
+#endif
+
+#include <GL/glu.h>
+#endif
+
 
 #ifdef USE_THREADS
 #define HAVE_TLS_CONTEXT
@@ -48,7 +67,9 @@
 #define GL_ALL_CLIENT_ATTRIB_BITS 0xFFFFFFF
 #endif /* GL_ALL_CLIENT_BITS */  
 
-#include "../defines.h"
+#define GL_HAS_NURBS
+
+#include "../../src/defines.h"
 
 SV* sdl_perl_nurbs_error_hook;
 void
@@ -869,6 +890,8 @@ glDrawElements ( mode, count, type, indices )
        CODE:
                glDrawElements( mode, count, type, indices);
 
+#ifdef GL_VERSION_1_2
+
 void
 glDrawRangeElements ( mode, start, end, count, type, indices )
        GLenum mode
@@ -880,6 +903,8 @@ glDrawRangeElements ( mode, start, end, count, type, indices )
        CODE:
                glDrawRangeElements(mode,start,end,count,type,indices);
 
+#endif // GL_VERSION_1_2
+
 void
 glDrawArrays ( mode, first, count )
        GLenum mode
@@ -935,7 +960,7 @@ glLoadMatrix (  ... )
                int i;
                double mat[16];
                for ( i = 0; i < 16; i++ ) {
-                       mat[i] = (i < items  && SvNOK(ST(i)) ? SvNV(ST(i)) : 0.0 );
+                       mat[i] = i < items ? SvNV(ST(i)) : 0.0;
                }
                glLoadMatrixd(mat);
 
@@ -945,7 +970,7 @@ glMultMatrix ( ... )
                int i;
                double mat[16];
                for ( i = 0; i < 16; i++ ) {
-                       mat[i] = (i < items  && SvNOK(ST(i)) ? SvNV(ST(i)) : 0.0 );
+                       mat[i] = i < items ? SvNV(ST(i)) : 0.0;
                }
                glMultMatrixd(mat);
 
@@ -1029,7 +1054,7 @@ glClipPlane ( plane, ... )
                double v[4];
                int i;
                for (i = 0; i < 4; i++ ) {
-                       v[i] = (i+1 < items && SvNOK(ST(i+1))) ? SvNV(ST(i+1)) : 0.0;
+                       v[i] = i+1 < items ? SvNV(ST(i+1)) : 0.0;
                }
                glClipPlane(plane,v);
        
@@ -1068,13 +1093,13 @@ glLight ( light, name, ... )
                if ( items == 6 ) {
                        float v[4];     
                        for ( i = 0; i < 4; i++ ) {
-                               v[i] = (SvNOK(ST(i+2))) ? SvNV(ST(i+2)) : 0.0;
+                               v[i] = SvNV(ST(i+2));
                        }
                        glLightfv(light,name,v);        
                } else if ( items == 5 ) {
                        float v[3];
                        for ( i = 0; i < 3; i++ ) {
-                               v[i] = (SvNOK(ST(i+2))) ? SvNV(ST(i+2)) : 0.0;
+                               v[i] = SvNV(ST(i+2));
                        }
                        glLightfv(light,name,v);        
                } else if ( items == 3 ) {
@@ -1113,13 +1138,13 @@ glMaterial ( face, name, ... )
                if ( items == 6 ) {
                        float v[4];
                        for ( i = 0; i < 4; i++ ) {
-                               v[i] = (SvNOK(ST(i+2))) ? SvNV(ST(i+2)) : 0.0;
+                               v[i] = SvNV(ST(i+2));
                        }
                        glMaterialfv(face,name,v);
                } else if ( items == 5 ) {
                        float v[3];
-                       for ( i = 0; i < 4; i++ ) {
-                               v[i] = (SvNOK(ST(i+2))) ? SvNV(ST(i+2)) : 0.0;
+                       for ( i = 0; i < 3; i++ ) {
+                               v[i] = SvNV(ST(i+2));
                        }
                        glMaterialfv(face,name,v);
                } else if ( items == 3 ) {      
@@ -2418,8 +2443,10 @@ gluNurbsCallback ( obj, which, cb )
                                gluNurbsCallback(obj,GLU_ERROR,(GLvoid*)sdl_perl_nurbs_error_callback);
                                break;
 #ifdef GLU_NURBS_BEGIN
+#ifdef GLU_VERSION_1_3
                        case GLU_NURBS_BEGIN:
                        case GLU_NURBS_BEGIN_DATA:
+
                                gluNurbsCallbackData(obj,(void*)cb);
                                gluNurbsCallback(obj,GLU_NURBS_BEGIN_DATA,
                                        (GLvoid*)sdl_perl_nurbs_being_callback);        
@@ -2454,11 +2481,14 @@ gluNurbsCallback ( obj, which, cb )
                                gluNurbsCallback(obj,GLU_NURBS_END_DATA,
                                        (GLvoid*)sdl_perl_nurbs_end_callback);  
                                break;
-#endif
+#endif // GLU_VERSION_1_3
+#endif // GLU_NURBS_BEGIN
                        default:
                                Perl_croak(aTHX_ "SDL::OpenGL::NurbsCallback - invalid type");
                }
 
+#ifdef GLU_VERSION_1_3
+
 void
 gluNurbsCallbackData ( obj, cb )
        GLUnurbsObj *obj
@@ -2466,6 +2496,8 @@ gluNurbsCallbackData ( obj, cb )
        CODE:
                gluNurbsCallbackData(obj,(void*)cb);
 
+#endif
+
 void
 gluBeginSurface ( obj )
        GLUnurbsObj *obj
@@ -2728,5 +2760,60 @@ gluTessVertex ( tessobj, coords, vd )
        
 #endif
 
+GLUquadric *
+gluNewQuadric ()
+       CODE:
+               RETVAL = gluNewQuadric ();
+       OUTPUT:
+               RETVAL
+
+void
+gluDeleteQuadric (quad)
+       GLUquadric      *quad
+
+void
+gluQuadricNormals ( quad, normal )
+       GLUquadric *quad
+       GLenum  normal
+
+void
+gluQuadricTexture ( quad, texture )
+       GLUquadric *quad
+       GLboolean  texture
+
+void
+gluCylinder ( quad, base, top, height, slices, stacks )
+       GLUquadric *quad
+       GLdouble  base
+       GLdouble  top
+       GLdouble  height
+       GLint  slices
+       GLint  stacks
+
+void
+gluDisk ( quad, inner, outer, slices, loops )
+       GLUquadric *quad
+       GLdouble inner
+       GLdouble outer
+       GLint slices
+       GLint loops
+
+void
+gluPartialDisk ( quad, inner, outer, slices, loops, start, sweep )
+       GLUquadric *quad
+       GLdouble inner
+       GLdouble outer
+       GLint slices
+       GLint loops
+       GLdouble start
+       GLdouble sweep
+
+void
+gluSphere ( quad, radius, slices, stacks )
+       GLUquadric *quad
+       GLdouble radius
+       GLint  slices
+       GLint  stacks
+
 #endif