Function gluErrorStringWIN(errCode As GLenum) As PTSTR
#ifndef UNICODE
	gluErrorStringWIN = gluErrorString(errCode) As PTSTR
#else
	gluErrorStringWIN = gluErrorUnicodeStringEXT(errCode) As PTSTR
#endif
End Function

Declare Function gluErrorString Lib "glu32"  (errCode As GLenum) As *GLubyte
Declare Function gluErrorUnicodeStringEXT Lib "glu32"  (errCode As GLenum) As PWSTR
Declare Function gluGetString Lib "glu32"  (name As GLenum) As *GLubyte

Declare Sub gluOrtho2D Lib "glu32"  (left As GLdouble, right As GLdouble, bottom As GLdouble, top As GLdouble)
Declare Sub gluPerspective Lib "glu32"  (fovy As GLdouble, aspect As GLdouble, zNear As GLdouble, zFar As GLdouble)
Declare Sub gluPickMatrix Lib "glu32"  (x As GLdouble, y As GLdouble, width As GLdouble, height As GLdouble, viewport As *GLint)
Declare Sub gluLookAt Lib "glu32"  (eyex As GLdouble, eyey As GLdouble, eyez As GLdouble, centerx As GLdouble, centery As GLdouble, centerz As GLdouble, upx As GLdouble, upy As GLdouble, upz As GLdouble)
Declare Function gluProject Lib "glu32"  (objx As GLdouble, objy As GLdouble, objz As GLdouble, modelMatrix As *GLdouble, projMatrix As *GLdouble, viewport As *GLint, winx As *GLdouble, winy As *GLdouble, winz As *GLdouble) As Long
Declare Function gluUnProject Lib "glu32"  (winx As GLdouble, winy As GLdouble, winz As GLdouble, modelMatrix As *GLdouble, projMatrix As *GLdouble, viewport As *GLint, objx As *GLdouble, objy As *GLdouble, objz As *GLdouble) As Long
Declare Function gluScaleImage Lib "glu32"  (format As GLenum, widthin As GLint, heightin As GLint, typein As GLenum, datain As VoidPtr, widthout As GLint, heightout As GLint, typeout As GLenum, dataout As VoidPtr) As Long
Declare Function gluBuild1DMipmaps Lib "glu32"  (target As GLenum, components As GLint, width As GLint, format As GLenum, type_ As GLenum, data As VoidPtr) As Long
Declare Function gluBuild2DMipmaps Lib "glu32"  (target As GLenum, components As GLint, width As GLint, height As GLint, format As GLenum, type_ As GLenum, data As VoidPtr) As Long

TypeDef GLUnurbs = VoidPtr
TypeDef GLUquadric = VoidPtr
TypeDef GLUtesselator = VoidPtr

TypeDef  GLUnurbsObj = GLUnurbs
TypeDef  GLUquadricObj = GLUquadric
TypeDef  GLUtesselatorObj = GLUtesselator
TypeDef  GLUtriangulatorObj = GLUtesselator

Declare Function gluNewQuadric Lib "glu32"  () As *GLUquadric
Declare Sub gluDeleteQuadric Lib "glu32"  (state As *GLUquadric)
Declare Sub gluQuadricNormals Lib "glu32"  (quadObject As *GLUquadric, normals As GLenum)
Declare Sub gluQuadricTexture Lib "glu32"  (quadObject As *GLUquadric, textureCoords As GLboolean)
Declare Sub gluQuadricOrientation Lib "glu32"  (quadObject As *GLUquadric, orientation As GLenum)
Declare Sub gluQuadricDrawStyle Lib "glu32"  (quadObject As *GLUquadric, drawStyle As GLenum)
Declare Sub gluCylinder Lib "glu32"  (qobj As *GLUquadric, baseRadius As GLdouble, topRadius As GLdouble, height As GLdouble, slices As GLint, stacks As GLint)
Declare Sub gluDisk Lib "glu32"  (qobj As *GLUquadric, innerRadius As GLdouble, outerRadius As GLdouble, slices As GLint, loops As GLint)
Declare Sub gluPartialDisk Lib "glu32"  (qobj As *GLUquadric, innerRadius As GLdouble, outerRadius As GLdouble, slices As GLint, loops As GLint, startAngle As GLdouble, sweepAngle As GLdouble)
Declare Sub gluSphere Lib "glu32"  (qobj As *GLUquadric, radius As GLdouble, slices As GLint, stacks As GLint)
TypeDef PFN_QUADRICCALLBACK = *Sub()
Declare Sub gluQuadricCallback Lib "glu32"  (qobj As *GLUquadric, which As GLenum, fn As PFN_QUADRICCALLBACK)
Declare Function gluNewTess Lib "glu32" () As *GLUtesselator
Declare Sub gluDeleteTess Lib "glu32" (tess As *GLUtesselator)
Declare Sub gluTessBeginPolygon Lib "glu32" (tess As *GLUtesselator, polygon_data As VoidPtr)
Declare Sub gluTessBeginContour Lib "glu32" (tess As *GLUtesselator)
Declare Sub gluTessVertex Lib "glu32" (tess As *GLUtesselator, coords As *GLdouble, data As VoidPtr)
Declare Sub gluTessEndContour Lib "glu32" (tess As *GLUtesselator)
Declare Sub gluTessEndPolygon Lib "glu32" (tess As *GLUtesselator)
Declare Sub gluTessProperty Lib "glu32" (tess As *GLUtesselator, which As GLenum, value As GLdouble)
Declare Sub gluTessNormal Lib "glu32" (tess As *GLUtesselator, x As GLdouble, y As GLdouble, z As GLdouble)
TypeDef PFN_TESSCALLBACK = *Sub()
Declare Sub gluTessCallback Lib "glu32" (tess As *GLUtesselator, which As GLenum, fn As PFN_TESSCALLBACK)
Declare Sub gluGetTessProperty Lib "glu32" (tess As *GLUtesselator, which As GLenum, value As *GLdouble)
Declare Function gluNewNurbsRenderer Lib "glu32"  () As *GLUnurbs
Declare Sub gluDeleteNurbsRenderer Lib "glu32"  (nobj As *GLUnurbs)
Declare Sub gluBeginSurface Lib "glu32"  (nobj As *GLUnurbs)
Declare Sub gluBeginCurve Lib "glu32"  (nobj As *GLUnurbs)
Declare Sub gluEndCurve Lib "glu32"  (nobj As *GLUnurbs)
Declare Sub gluEndSurface Lib "glu32"  (nobj As *GLUnurbs)
Declare Sub gluBeginTrim Lib "glu32"  (nobj As *GLUnurbs)
Declare Sub gluEndTrim Lib "glu32"  (nobj As *GLUnurbs)
Declare Sub gluPwlCurve Lib "glu32"  (nobj As *GLUnurbs, count As GLint, array As *GLfloat, stride As GLint, type_ As GLenum)
Declare Sub gluNurbsCurve Lib "glu32"  (nobj As *GLUnurbs, nknots As GLint, knot As *GLfloat, stride As GLint, ctlarray As *GLfloat, order As GLint, type_ As GLenum)
Declare Sub gluNurbsSurface Lib "glu32" (nobj As *GLUnurbs, sknot_count As GLint, sknot As *Single, tknot_count As GLint, tknot As *GLfloat, s_stride As GLint, t_stride As GLint, ctlarray As *GLfloat, sorder As GLint, torder As GLint, type_ As GLenum)
Declare Sub gluLoadSamplingMatrices Lib "glu32"  (nobj As *GLUnurbs, modelMatrix As *GLfloat, projMatrix As *GLfloat, viewport As *GLint)
Declare Sub gluNurbsProperty Lib "glu32"  (nobj As *GLUnurbs, property As GLenum, value As GLfloat)
Declare Sub gluGetNurbsProperty Lib "glu32"  (nobj As *GLUnurbs, property As GLenum, value As *GLfloat)
TypeDef PFN_NURBSCALLBACK = *Sub()
Declare Sub gluNurbsCallback Lib "glu32"  (nobj As *GLUnurbs, which As GLenum, fn As PFN_NURBSCALLBACK)

TypeDef GLUquadricErrorProc= *Sub(e As GLenum)
TypeDef GLUtessBeginProc= *Sub(e As GLenum)
TypeDef GLUtessEdgeFlagProc= *Sub(b As GLboolean)
TypeDef GLUtessVertexProc= *Sub(pv As VoidPtr)
TypeDef GLUtessEndProc= *Sub()
TypeDef GLUtessErrorProc= *Sub(e As GLenum)
TypeDef GLUtessCombineProc= *Sub(dbl As *GLdouble, v As *VoidPtr, f As *GLfloat, ppv As VoidPtr)
TypeDef GLUtessBeginDataProc= *Sub(e As GLenum, pv As VoidPtr)
TypeDef GLUtessEdgeFlagDataProc= *Sub(b As GLboolean, pv As VoidPtr)
TypeDef GLUtessVertexDataProc= *Sub(pv As VoidPtr, pv As VoidPtr)
TypeDef GLUtessEndDataProc= *Sub(pv As VoidPtr)
TypeDef GLUtessErrorDataProc= *Sub(e As GLenum, pv As VoidPtr)
TypeDef GLUtessCombineDataProc= *Sub(dbl As GLdouble, v As VoidPtr, f As *GLfloat, ppv As *VoidPtr, ppv As *VoidPtr)
TypeDef GLUnurbsErrorProc= *Sub(e As GLenum)

Const GLU_VERSION_1_1 = 1
Const GLU_VERSION_1_2 = 1

Const GLU_INVALID_ENUM = 100900
Const GLU_INVALID_VALUE = 100901
Const GLU_OUT_OF_MEMORY = 100902
Const GLU_INCOMPATIBLE_GL_VERSION = 100903

Const GLU_VERSION = 100800
Const GLU_EXTENSIONS = 100801

'Const GLU_TRUE = GL_TRUE
'Const GLU_FALSE = GL_FALSE

Const GLU_SMOOTH = 100000
Const GLU_FLAT = 100001
Const GLU_NONE = 100002

Const GLU_POINT = 100010
Const GLU_LINE = 100011
Const GLU_FILL = 100012
Const GLU_SILHOUETTE = 100013

Const GLU_OUTSIDE = 100020
Const GLU_INSIDE = 100021

Const GLU_TESS_MAX_COORD = 1.0e150

Const GLU_TESS_WINDING_RULE = 100140
Const GLU_TESS_BOUNDARY_ONLY = 100141
Const GLU_TESS_TOLERANCE = 100142

Const GLU_TESS_WINDING_ODD = 100130
Const GLU_TESS_WINDING_NONZERO = 100131
Const GLU_TESS_WINDING_POSITIVE = 100132
Const GLU_TESS_WINDING_NEGATIVE = 100133
Const GLU_TESS_WINDING_ABS_GEQ_TWO = 100134

Const GLU_TESS_BEGIN = 100100
Const GLU_TESS_VERTEX = 100101
Const GLU_TESS_END = 100102
Const GLU_TESS_ERROR = 100103
Const GLU_TESS_EDGE_FLAG = 100104
Const GLU_TESS_COMBINE = 100105
Const GLU_TESS_BEGIN_DATA = 100106
Const GLU_TESS_VERTEX_DATA = 100107
Const GLU_TESS_END_DATA = 100108
Const GLU_TESS_ERROR_DATA = 100109
Const GLU_TESS_EDGE_FLAG_DATA = 100110
Const GLU_TESS_COMBINE_DATA = 100111

Const GLU_TESS_ERROR1 = 100151
Const GLU_TESS_ERROR2 = 100152
Const GLU_TESS_ERROR3 = 100153
Const GLU_TESS_ERROR4 = 100154
Const GLU_TESS_ERROR5 = 100155
Const GLU_TESS_ERROR6 = 100156
Const GLU_TESS_ERROR7 = 100157
Const GLU_TESS_ERROR8 = 100158

Const GLU_TESS_MISSING_BEGIN_POLYGON = GLU_TESS_ERROR1
Const GLU_TESS_MISSING_BEGIN_CONTOUR = GLU_TESS_ERROR2
Const GLU_TESS_MISSING_END_POLYGON = GLU_TESS_ERROR3
Const GLU_TESS_MISSING_END_CONTOUR = GLU_TESS_ERROR4
Const GLU_TESS_COORD_TOO_LARGE = GLU_TESS_ERROR5
Const GLU_TESS_NEED_COMBINE_CALLBACK = GLU_TESS_ERROR6

Const GLU_AUTO_LOAD_MATRIX = 100200
Const GLU_CULLING = 100201
Const GLU_SAMPLING_TOLERANCE = 100203
Const GLU_DISPLAY_MODE = 100204
Const GLU_PARAMETRIC_TOLERANCE = 100202
Const GLU_SAMPLING_METHOD = 100205
Const GLU_U_STEP = 100206
Const GLU_V_STEP = 100207

Const GLU_PATH_LENGTH = 100215
Const GLU_PARAMETRIC_ERROR = 100216
Const GLU_DOMAIN_DISTANCE = 100217

Const GLU_MAP1_TRIM_2 = 100210
Const GLU_MAP1_TRIM_3 = 100211

Const GLU_OUTLINE_POLYGON = 100240
Const GLU_OUTLINE_PATCH = 100241

Const GLU_NURBS_ERROR1 = 100251
Const GLU_NURBS_ERROR2 = 100252
Const GLU_NURBS_ERROR3 = 100253
Const GLU_NURBS_ERROR4 = 100254
Const GLU_NURBS_ERROR5 = 100255
Const GLU_NURBS_ERROR6 = 100256
Const GLU_NURBS_ERROR7 = 100257
Const GLU_NURBS_ERROR8 = 100258
Const GLU_NURBS_ERROR9 = 100259
Const GLU_NURBS_ERROR10 = 100260
Const GLU_NURBS_ERROR11 = 100261
Const GLU_NURBS_ERROR12 = 100262
Const GLU_NURBS_ERROR13 = 100263
Const GLU_NURBS_ERROR14 = 100264
Const GLU_NURBS_ERROR15 = 100265
Const GLU_NURBS_ERROR16 = 100266
Const GLU_NURBS_ERROR17 = 100267
Const GLU_NURBS_ERROR18 = 100268
Const GLU_NURBS_ERROR19 = 100269
Const GLU_NURBS_ERROR20 = 100270
Const GLU_NURBS_ERROR21 = 100271
Const GLU_NURBS_ERROR22 = 100272
Const GLU_NURBS_ERROR23 = 100273
Const GLU_NURBS_ERROR24 = 100274
Const GLU_NURBS_ERROR25 = 100275
Const GLU_NURBS_ERROR26 = 100276
Const GLU_NURBS_ERROR27 = 100277
Const GLU_NURBS_ERROR28 = 100278
Const GLU_NURBS_ERROR29 = 100279
Const GLU_NURBS_ERROR30 = 100280
Const GLU_NURBS_ERROR31 = 100281
Const GLU_NURBS_ERROR32 = 100282
Const GLU_NURBS_ERROR33 = 100283
Const GLU_NURBS_ERROR34 = 100284
Const GLU_NURBS_ERROR35 = 100285
Const GLU_NURBS_ERROR36 = 100286
Const GLU_NURBS_ERROR37 = 100287

Declare Sub gluBeginPolygon Lib "glu32" (tess As *GLUtesselator)
Declare Sub gluNextContour Lib "glu32" (tess As *GLUtesselator, type_ As GLenum)
Declare Sub gluEndPolygon Lib "glu32" (tess As *GLUtesselator)

Const GLU_CW = 100120
Const GLU_CCW = 100121
Const GLU_INTERIOR = 100122
Const GLU_EXTERIOR = 100123
Const GLU_UNKNOWN = 100124

Const GLU_BEGIN = GLU_TESS_BEGIN
Const GLU_VERTEX = GLU_TESS_VERTEX
Const GLU_END = GLU_TESS_END
Const GLU_ERROR = GLU_TESS_ERROR
Const GLU_EDGE_FLAG = GLU_TESS_EDGE_FLAG
