diff -ru OpenGL-0.54_old\Makefile.PL OpenGL-0.54\Makefile.PL
--- OpenGL-0.54_old\Makefile.PL	Wed Jun 20 10:39:14 2001
+++ OpenGL-0.54\Makefile.PL	Mon Mar 29 21:40:12 2004
@@ -5,6 +5,30 @@
 # See lib/ExtUtils/MakeMaker.pm for details of how to influence
 # the contents of the Makefile that is written.
 
+if ($^O eq 'MSWin32') {     # for Win32
+
+$DEFS  = "-DHAVE_GL";         # Primary OpenGL system
+$DEFS .= " -DHAVE_GLU";       # GL Utility library
+$DEFS .= " -DHAVE_GLUT";      # Simple User interface Toolkit
+# $DEFS .= " -DHAVE_GLX";       # Interface to X/Windows for OpenGL --
+                              # emulated on several non-X systems
+                              # ...but not on Windows!
+
+WriteMakefile(
+  'NAME'	=> 'OpenGL',
+  'VERSION_FROM'	=> 'OpenGL.pm',
+  'DEFINE'	=> $DEFS,
+	'XSPROTOARG' => '-noprototypes',
+	'OBJECT' => '$(BASEEXT)$(OBJ_EXT) gl_util$(OBJ_EXT)',
+	'LIBS' => ["-lOPENGL32 -lGLU32 -lglut32",],
+  'INC'		=> "",
+	'PM' => {'OpenGL.pm' => '$(INST_LIBDIR)/OpenGL.pm'},
+	'dist' => { COMPRESS=>"gzip", SUFFIX=>"gz" }
+);
+}
+
+else {
+
 # ExtUtils::Liblist is broken
 @findlib::ISA = qw(ExtUtils::Liblist);
 sub findlib::lsdir { shift; grep /$_[0]/, <$_[1]>}
@@ -114,3 +138,5 @@
 	'INC' => $includes,
 	'PM' => {'OpenGL.pm' => '$(INST_LIBDIR)/OpenGL.pm'},
 );
+
+}
diff -ru OpenGL-0.54_old\MANIFEST OpenGL-0.54\MANIFEST
--- OpenGL-0.54_old\MANIFEST	Thu Nov 16 23:47:04 2000
+++ OpenGL-0.54\MANIFEST	Fri Apr 02 22:52:36 2004
@@ -7,6 +7,7 @@
 OpenGL.xs
 README
 README.os2
+README.Win32
 SUPPORTS
 TODO
 examples/RCS/planets,v
@@ -49,3 +50,4 @@
 ppport.h
 test.pl
 typemap
+META.yml                                 Module meta-data (added by MakeMaker)
Only in OpenGL-0.54: META.yml
diff -ru OpenGL-0.54_old\OpenGL.pm OpenGL-0.54\OpenGL.pm
--- OpenGL-0.54_old\OpenGL.pm	Wed Jun 20 10:41:56 2001
+++ OpenGL-0.54\OpenGL.pm	Fri Apr 02 22:44:26 2004
@@ -3336,7 +3336,7 @@
                 'parent'=> 0,
                 'steal'=> 0,
 		'mask'	=> (_have_glx() ? StructureNotifyMask() : 0),
-                'attributes'=> [GLX_RGBA()],
+                # 'attributes'=> [GLX_RGBA()],
         );
 
 sub glpOpenWindow {
diff -ru OpenGL-0.54_old\OpenGL.xs OpenGL-0.54\OpenGL.xs
--- OpenGL-0.54_old\OpenGL.xs	Wed Nov 29 04:05:46 2000
+++ OpenGL-0.54\OpenGL.xs	Fri Apr 23 19:19:08 2004
@@ -49,6 +49,28 @@
  */
 
 
+#ifdef _WIN32 /* OpenGL 1.2 extensions for Windows */
+
+typedef void (APIENTRY * PFNGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+static PFNGLCOPYTEXSUBIMAGE3DPROC glCopyTexSubImage3D;
+
+typedef void (APIENTRY * PFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices);
+static PFNGLDRAWRANGEELEMENTSPROC glDrawRangeElements;
+
+typedef void (APIENTRY * PFNGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+static PFNGLTEXIMAGE3DPROC glTexImage3D; 
+
+typedef void (APIENTRY * PFNGLTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels);
+static PFNGLTEXSUBIMAGE3DPROC glTexSubImage3D;
+
+typedef void (APIENTRY * PFNGLBLENDEQUATIONEXTPROC) (GLenum mode);
+static PFNGLBLENDEQUATIONEXTPROC glBlendEquationEXT;
+
+typedef void (APIENTRY * PFNGLBLENDCOLOREXTPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
+static PFNGLBLENDCOLOREXTPROC glBlendColorEXT;
+
+#endif /* End Windows extensions */
+
 
 static int
 not_here(s)
@@ -337,7 +359,6 @@
 static void destroy_glut_win_handlers(int win)
 {
 	SV ** h;
-	AV * a;
 	
 	if (!glut_handlers)
 		return;
@@ -781,7 +802,6 @@
 	CODE:
 	{
 		oga_struct * oga = malloc(sizeof(oga_struct));
-		int i,j;
 		
 		oga->type_count = 1;
 		oga->item_count = length;
@@ -1490,6 +1510,14 @@
 	GLint	y
 	GLsizei	width
 	GLsizei	height
+	CODE:
+	{
+#ifdef _WIN32
+	glCopyTexSubImage3D = (void *) wglGetProcAddress("glCopyTexSubImage3D");
+	if (glCopyTexSubImage3D == NULL) croak("glCopyTexSubImage3D is not supported by this renderer");  
+#endif		
+	glCopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height);
+	}
 
 #endif
 
@@ -1678,6 +1706,10 @@
 	CODE:
 	{
 	void * indices_s = EL(indices, gl_type_size(type) * count);
+#ifdef _WIN32
+	glDrawRangeElements = (void *) wglGetProcAddress("glDrawRangeElements");
+	if (glDrawRangeElements == NULL) croak("glDrawRangeElements is not supported by this renderer");  
+#endif	
 	glDrawRangeElements(mode, start, end, count, type, indices);
 	}
 
@@ -1690,6 +1722,10 @@
 	GLenum	type
 	void *	indices
 	CODE:
+#ifdef _WIN32
+	glDrawRangeElements = (void *) wglGetProcAddress("glDrawRangeElements");
+	if (glDrawRangeElements == NULL) croak("glDrawRangeElements is not supported by this renderer");  
+#endif	
 	glDrawRangeElements(mode, start, end, count, type, indices);
 
 #endif
@@ -4580,6 +4616,10 @@
 	CODE:
 	{
 	GLvoid * ptr = ELI(pixels, width, height, format, type, gl_pixelbuffer_unpack);
+#ifdef _WIN32
+	glTexImage3D = (void *) wglGetProcAddress("glTexImage3D");
+	if (glTexImage3D == NULL) croak("glTexImage3D is not supported by this renderer");  
+#endif	
 	glTexImage3D(target, level, internalformat, width, height, depth, border, format, type, ptr);
 	}
 
@@ -4597,6 +4637,10 @@
 	GLenum	type
 	void *	pixels
 	CODE:
+#ifdef _WIN32
+	glTexImage3D = (void *) wglGetProcAddress("glTexImage3D");
+	if (glTexImage3D == NULL) croak("glTexImage3D is not supported by this renderer");  
+#endif	
 	glTexImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
 
 # 1.2
@@ -4618,6 +4662,10 @@
 	glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
 	glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
 	ptr = pack_image_ST(&(ST(9)), items-9, width, height, depth, format, type, 0);
+#ifdef _WIN32
+	glTexImage3D = (void *) wglGetProcAddress("glTexImage3D");
+	if (glTexImage3D == NULL) croak("glTexImage3D is not supported by this renderer");  
+#endif	
 	glTexImage3D(target, level, internalformat, width, height, depth, border, format, type, ptr);
 	glPopClientAttrib();
 	free(ptr);
@@ -4842,6 +4890,10 @@
 	CODE:
 	{
 	GLvoid * ptr = ELI(pixels, width, height, format, type, gl_pixelbuffer_unpack);
+#ifdef _WIN32
+	glTexSubImage3D = (void *) wglGetProcAddress("glTexSubImage3D");
+	if (glTexSubImage3D == NULL) croak("glTexSubImage3D is not supported by this renderer");  
+#endif	
 	glTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, ptr);
 	}
 
@@ -4860,6 +4912,10 @@
 	GLenum	type
 	void *	pixels
 	CODE:
+#ifdef _WIN32
+	glTexSubImage3D = (void *) wglGetProcAddress("glTexSubImage3D");
+	if (glTexSubImage3D == NULL) croak("glTexSubImage3D is not supported by this renderer");  
+#endif	
 	glTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
 
 # 1.1
@@ -4882,6 +4938,10 @@
 	glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
 	glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
 	ptr = pack_image_ST(&(ST(10)), items-10, width, height, depth, format, type, 0);
+#ifdef _WIN32
+	glTexSubImage3D = (void *) wglGetProcAddress("glTexSubImage3D");
+	if (glTexSubImage3D == NULL) croak("glTexSubImage3D is not supported by this renderer");  
+#endif	
 	glTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, ptr);
 	glPopClientAttrib();
 	free(ptr);
@@ -7247,6 +7307,12 @@
 void
 glBlendEquationEXT(mode)
 	GLenum	mode
+	CODE:
+#ifdef _WIN32
+	glBlendEquationEXT = (void *) wglGetProcAddress("glBlendEquationEXT");
+	if (glBlendEquationEXT == NULL) croak("glBlendEquationEXT is not supported by this renderer");  
+#endif
+  glBlendEquationEXT(mode);
 
 #endif
 
@@ -7258,6 +7324,12 @@
 	GLclampf	green
 	GLclampf	blue
 	GLclampf	alpha
+	CODE:
+#ifdef _WIN32
+	glBlendColorEXT = (void *) wglGetProcAddress("glBlendColorEXT");
+	if (glBlendColorEXT == NULL) croak("glBlendColorEXT is not supported by this renderer");  
+#endif
+  glBlendColorEXT(red, green, blue, alpha);
 
 #endif
 
@@ -7432,8 +7504,10 @@
 	CODE:
 	{
 	GLvoid * ptr = ELI(data, width, 1, format, type, gl_pixelbuffer_unpack);
-	gluBuild1DMipmaps(target, internalformat, width, format, type, ptr);
+	RETVAL=gluBuild1DMipmaps(target, internalformat, width, format, type, ptr);
 	}
+	OUTPUT:
+	  RETVAL
 
 GLint
 gluBuild2DMipmaps_s(target, internalformat, width, height, format, type, data)
@@ -7447,8 +7521,10 @@
 	CODE:
 	{
 	GLvoid * ptr = ELI(data, width, height, format, type, gl_pixelbuffer_unpack);
-	gluBuild2DMipmaps(target, internalformat, width, height, format, type, ptr);
+	RETVAL=gluBuild2DMipmaps(target, internalformat, width, height, format, type, ptr);
 	}
+	OUTPUT:
+	  RETVAL
 
 void
 gluCylinder(quad, base, top, height, slices, stacks)
@@ -7523,6 +7599,12 @@
 	}
 	OUTPUT:
 	RETVAL
+	
+void
+gluNurbsProperty(nurb, property, value)
+	GLUnurbsObj *	nurb
+	GLenum	property
+	GLfloat value
 
 #ifdef GLU_VERSION_1_1
 
@@ -7854,12 +7936,12 @@
 			case GLU_TESS_BEGIN:
 			case GLU_TESS_BEGIN_DATA:
 				tess->begin_callback = callback;
-				gluTessCallback(tess->triangulator, which, _s_marshal_glu_t_callback_begin);
+				gluTessCallback(tess->triangulator, which, (void (CALLBACK*)()) _s_marshal_glu_t_callback_begin);
 				break;
 			case GLU_TESS_END:
 			case GLU_TESS_END_DATA:
 				tess->end_callback = callback;
-				gluTessCallback(tess->triangulator, which, _s_marshal_glu_t_callback_end);
+				gluTessCallback(tess->triangulator, which, (void (CALLBACK*)()) _s_marshal_glu_t_callback_end);
 				break;
 			}
 		}
Only in OpenGL-0.54: README.Win32
diff -ru OpenGL-0.54_old\typemap OpenGL-0.54\typemap
--- OpenGL-0.54_old\typemap	Mon Nov 06 05:12:42 2000
+++ OpenGL-0.54\typemap	Sat Apr 10 15:47:40 2004
@@ -15,8 +15,8 @@
 GLboolean		T_BOOL
 GLenum			T_INT
 GLbitfield		T_INT
-GLUnurbsObj *		T_FASTPTROBJ
-GLUquadricObj *	T_FASTPTROBJ
+GLUnurbsObj *		T_PTROBJ
+GLUquadricObj *	T_PTROBJ
 
 PGLUtess *	T_FASTPTROBJ
 
