sig
  external gluPerspective :
    fovy:float -> aspect:float -> zNear:float -> zFar:float -> unit
    = "ml_gluperspective"
  external gluLookAt :
    eyeX:float ->
    eyeY:float ->
    eyeZ:float ->
    centerX:float ->
    centerY:float ->
    centerZ:float -> upX:float -> upY:float -> upZ:float -> unit
    = "ml_glulookat_bytecode" "ml_glulookat_native"
  external gluOrtho2D :
    left:float -> right:float -> bottom:float -> top:float -> unit
    = "ml_gluortho2d"
  external gluErrorString : error:GL.gl_error -> string = "ml_gluerrorstring"
  external gluPickMatrix :
    x:float ->
    y:float ->
    width:float -> height:float -> viewport:int * int * int * int -> unit
    = "ml_glupickmatrix"
  external gluUnProject :
    win_x:float ->
    win_y:float ->
    win_z:float ->
    model:float array array ->
    proj:float array array -> viewport:int array -> float * float * float
    = "ml_gluunproject_bytecode" "ml_gluunproject_native"
  external gluUnProjectFlat :
    win_x:float ->
    win_y:float ->
    win_z:float ->
    model:float array ->
    proj:float array -> viewport:int array -> float * float * float
    = "ml_gluunproject_flat_bytecode" "ml_gluunproject_flat_native"
  external gluUnProjectUtil : x:int -> y:int -> float * float * float
    = "ml_util_gluunproject"
  external gluUnProjectPixel : x:int -> y:int -> float * float * float
    = "ml_gluunproject_pixel"
  external gluProject :
    win_x:float ->
    win_y:float ->
    win_z:float ->
    model:float array array ->
    proj:float array array -> viewport:int array -> float * float * float
    = "ml_gluproject_bytecode" "ml_gluproject_native"
  external gluProjectFlat :
    win_x:float ->
    win_y:float ->
    win_z:float ->
    model:float array ->
    proj:float array -> viewport:int array -> float * float * float
    = "ml_gluproject_flat_bytecode" "ml_gluproject_flat_native"
  external gluProjectUtil :
    obj_x:float -> obj_y:float -> obj_z:float -> float * float * float
    = "ml_gluproject_util"
  type glu_desc = GLU_VERSION | GLU_EXTENSIONS
  external gluGetString : name:Glu.glu_desc -> string = "ml_glugetstring"
  external gluBuild2DMipmaps :
    internal_format:GL.InternalFormat.internal_format ->
    width:int ->
    height:int ->
    format_:GL.pixel_data_format ->
    type_:GL.pixel_data_type -> pixels:GL.image_data -> unit
    = "ml_glubuild2dmipmaps_bytecode" "ml_glubuild2dmipmaps_native"
  external gluBuild1DMipmaps :
    internal_format:GL.InternalFormat.internal_format ->
    width:int ->
    format_:GL.pixel_data_format ->
    type_:GL.pixel_data_type -> pixels:GL.image_data -> unit
    = "ml_glubuild1dmipmaps"
  external gluBuild3DMipmaps :
    internal_format:GL.InternalFormat.internal_format ->
    width:int ->
    height:int ->
    depth:int ->
    format_:GL.pixel_data_format ->
    type_:GL.pixel_data_type -> pixels:GL.image_data -> unit
    = "ml_glubuild3dmipmaps_bytecode" "ml_glubuild3dmipmaps_native"
  type glu_quadric
  external gluNewQuadric : unit -> Glu.glu_quadric = "ml_glunewquadric"
  external gluDeleteQuadric : quad:Glu.glu_quadric -> unit
    = "ml_gludeletequadric"
  type draw_style = GLU_POINT | GLU_LINE | GLU_FILL | GLU_SILHOUETTE
  external gluQuadricDrawStyle :
    quad:Glu.glu_quadric -> draw_style:Glu.draw_style -> unit
    = "ml_gluquadricdrawstyle"
  external gluQuadricTexture : quad:Glu.glu_quadric -> texture:bool -> unit
    = "ml_gluquadrictexture"
  external gluSphere :
    quad:Glu.glu_quadric -> radius:float -> slices:int -> stacks:int -> unit
    = "ml_glusphere"
  external gluCylinder :
    quad:Glu.glu_quadric ->
    base:float ->
    top:float -> height:float -> slices:int -> stacks:int -> unit
    = "ml_glucylinder_bytecode" "ml_glucylinder_native"
  external gluDisk :
    quad:Glu.glu_quadric ->
    inner:float -> outer:float -> slices:int -> loops:int -> unit
    = "ml_gludisk"
  external gluPartialDisk :
    quad:Glu.glu_quadric ->
    inner:float ->
    outer:float ->
    slices:int -> loops:int -> start:float -> sweep:float -> unit
    = "ml_glupartialdisk_bytecode" "ml_glupartialdisk_native"
  type orientation = GLU_OUTSIDE | GLU_INSIDE
  external gluQuadricOrientation :
    quad:Glu.glu_quadric -> orientation:Glu.orientation -> unit
    = "ml_gluquadricorientation"
  type normal = GLU_NONE | GLU_FLAT | GLU_SMOOTH
  external gluQuadricNormals :
    quad:Glu.glu_quadric -> normal:Glu.normal -> unit
    = "ml_gluquadricnormals"
  type glu_tesselator
  external gluNewTess : unit -> Glu.glu_tesselator = "ml_glunewtess"
  external gluDeleteTess : tess:Glu.glu_tesselator -> unit
    = "ml_gludeletetess"
  external gluBeginPolygon : tess:Glu.glu_tesselator -> unit
    = "ml_glubeginpolygon"
  external gluEndPolygon : tess:Glu.glu_tesselator -> unit
    = "ml_gluendpolygon"
  external gluTessBeginPolygon : tess:Glu.glu_tesselator -> unit
    = "ml_glutessbeginpolygon"
  external gluTessBeginPolygonData :
    tess:Glu.glu_tesselator -> data:'-> unit
    = "ml_glutessbeginpolygon_data"
  external gluTessEndPolygon : tess:Glu.glu_tesselator -> unit
    = "ml_glutessendpolygon"
  external gluTessBeginContour : tess:Glu.glu_tesselator -> unit
    = "ml_glutessbegincontour"
  external gluTessEndContour : tess:Glu.glu_tesselator -> unit
    = "ml_glutessendcontour"
  type tess_contour =
      GLU_CW
    | GLU_CCW
    | GLU_INTERIOR
    | GLU_EXTERIOR
    | GLU_UNKNOWN
  external gluNextContour :
    tess:Glu.glu_tesselator -> contour:Glu.tess_contour -> unit
    = "ml_glunextcontour"
  external gluTessVertex :
    tess:Glu.glu_tesselator -> x:float -> y:float -> z:float -> unit
    = "ml_glutessvertex"
  external gluTessNormal :
    tess:Glu.glu_tesselator -> x:float -> y:float -> z:float -> unit
    = "ml_glutessnormal"
  external gluTesselate :
    Glu.glu_tesselator -> (float * float * float) array -> unit
    = "tesselate_points"
  val gluTesselateIter :
    tess:Glu.glu_tesselator ->
    data:(float * float * float) array list -> unit
  type tess_winding =
      GLU_TESS_WINDING_ODD
    | GLU_TESS_WINDING_NONZERO
    | GLU_TESS_WINDING_POSITIVE
    | GLU_TESS_WINDING_NEGATIVE
    | GLU_TESS_WINDING_ABS_GEQ_TWO
  type tess_property =
      GLU_TESS_WINDING_RULE of Glu.tess_winding
    | GLU_TESS_BOUNDARY_ONLY of bool
    | GLU_TESS_TOLERANCE of float
  external gluGetTessWindingRule :
    tess:Glu.glu_tesselator -> winding:Glu.tess_winding -> unit
    = "ml_glugettesswindingrule"
  external gluGetTessBoundaryOnly :
    tess:Glu.glu_tesselator -> boundary_only:bool -> unit
    = "ml_glugettessboundaryonly"
  external gluGetTessTolerance :
    tess:Glu.glu_tesselator -> tolerance:float -> unit
    = "ml_glugettesstolerance"
  val gluTessProperty :
    tess:Glu.glu_tesselator -> prop:Glu.tess_property -> unit
  type tess_callback =
      GLU_TESS_BEGIN
    | GLU_TESS_BEGIN_DATA
    | GLU_TESS_EDGE_FLAG
    | GLU_TESS_EDGE_FLAG_DATA
    | GLU_TESS_VERTEX
    | GLU_TESS_VERTEX_DATA
    | GLU_TESS_END
    | GLU_TESS_END_DATA
    | GLU_TESS_COMBINE
    | GLU_TESS_COMBINE_DATA
    | GLU_TESS_ERROR
    | GLU_TESS_ERROR_DATA
  external gluTessDefaultCallback :
    tess:Glu.glu_tesselator -> cb:Glu.tess_callback -> unit
    = "ml_glutesscallback_default"
  type tess_error =
      GLU_TESS_MISSING_BEGIN_POLYGON
    | GLU_TESS_MISSING_BEGIN_CONTOUR
    | GLU_TESS_MISSING_END_POLYGON
    | GLU_TESS_MISSING_END_CONTOUR
    | GLU_TESS_COORD_TOO_LARGE
    | GLU_TESS_NEED_COMBINE_CALLBACK
    | GLU_OUT_OF_MEMORY
    | GLU_TESS_ERROR7
    | GLU_TESS_ERROR8
  val gluCallbackTessVertex :
    tess:Glu.glu_tesselator ->
    tess_vertex:(x:float -> y:float -> z:float -> unit) -> unit
  val gluCallbackTessBegin :
    tess:Glu.glu_tesselator -> tess_begin:(prim:GL.primitive -> unit) -> unit
  val gluCallbackTessEnd :
    tess:Glu.glu_tesselator -> tess_end:(unit -> unit) -> unit
  val gluCallbackTessError :
    tess:Glu.glu_tesselator ->
    tess_error:(error:Glu.tess_error -> unit) -> unit
  external gluTessErrorString : error:Glu.tess_error -> string
    = "ml_glutesserrorstring"
  type glu_nurbs
  external gluNewNurbsRenderer : unit -> Glu.glu_nurbs
    = "ml_glunewnurbsrenderer"
  external gluBeginSurface : nurb:Glu.glu_nurbs -> unit
    = "ml_glubeginsurface"
  external gluEndSurface : nurb:Glu.glu_nurbs -> unit = "ml_gluendsurface"
  type nurbs_mode = GLU_NURBS_RENDERER | GLU_NURBS_TESSELLATOR
  type sampling_method =
      GLU_PATH_LENGTH
    | GLU_PARAMETRIC_ERROR
    | GLU_DOMAIN_DISTANCE
    | GLU_OBJECT_PATH_LENGTH
    | GLU_OBJECT_PARAMETRIC_ERROR
  module Disp :
    sig
      type display_mode = GLU_OUTLINE_POLYGON | GLU_FILL | GLU_OUTLINE_PATCH
    end
  type nurbs_property =
      GLU_SAMPLING_TOLERANCE of float
    | GLU_DISPLAY_MODE of Glu.Disp.display_mode
    | GLU_CULLING of bool
    | GLU_AUTO_LOAD_MATRIX of bool
    | GLU_PARAMETRIC_TOLERANCE of float
    | GLU_SAMPLING_METHOD of Glu.sampling_method
    | GLU_U_STEP of int
    | GLU_V_STEP of int
    | GLU_NURBS_MODE of Glu.nurbs_mode
  val gluNurbsProperty :
    nurb:Glu.glu_nurbs -> property:Glu.nurbs_property -> unit
  type surface_type = GLU_MAP2_VERTEX_3 | GLU_MAP2_VERTEX_4
  external gluNurbsSurface :
    nurb:Glu.glu_nurbs ->
    sKnots:float array ->
    tKnots:float array ->
    sStride:int ->
    tStride:int ->
    control:float array ->
    sOrder:int -> tOrder:int -> surface_type:Glu.surface_type -> unit
    = "ml_glunurbssurface_bytecode" "ml_glunurbssurface_native"
end