Docs GODI Archive
Projects Blog Link DB

Search GODI:


More options
File lib/ocaml/pkg-lib/lablGL/glut.ml GODI Package godi-lablgl
Library lablGL
 
   glut.cmi_pretty    glut.ml    glut.mli    Sources  
(* ==== types ==== *)

type button_t = 
    | LEFT_BUTTON 
    | MIDDLE_BUTTON 
    | RIGHT_BUTTON
    | OTHER_BUTTON of int

type mouse_button_state_t = 
    | DOWN 
    | UP 

type special_key_t = 
    | KEY_F1
    | KEY_F2                    
    | KEY_F3            
    | KEY_F4    
    | KEY_F5
    | KEY_F6                    
    | KEY_F7                    
    | KEY_F8                    
    | KEY_F9                    
    | KEY_F10                   
    | KEY_F11                   
    | KEY_F12                   
     (* directional keys *)
    | KEY_LEFT                  
    | KEY_UP                    
    | KEY_RIGHT                 
    | KEY_DOWN                  
    | KEY_PAGE_UP               
    | KEY_PAGE_DOWN             
    | KEY_HOME                  
    | KEY_END                   
    | KEY_INSERT                        

type entry_exit_state_t =
    | LEFT                      
    | ENTERED

type menu_state_t = 
    | MENU_NOT_IN_USE   
    | MENU_IN_USE               

type visibility_state_t =
    | NOT_VISIBLE               
    | VISIBLE                   

type window_status_t = 
    | HIDDEN                    
    | FULLY_RETAINED            
    | PARTIALLY_RETAINED                
    | FULLY_COVERED             

type color_index_component_t =
    | RED                       
    | GREEN                     
    | BLUE                      

type layer_t =
    | NORMAL                    
    | OVERLAY                   

type font_t =
    | STROKE_ROMAN              
    | STROKE_MONO_ROMAN         
    | BITMAP_9_BY_15            
    | BITMAP_8_BY_13            
    | BITMAP_TIMES_ROMAN_10     
    | BITMAP_TIMES_ROMAN_24     
    | BITMAP_HELVETICA_10       
    | BITMAP_HELVETICA_12       
    | BITMAP_HELVETICA_18       

type glut_get_t =
    | WINDOW_X                  
    | WINDOW_Y                  
    | WINDOW_WIDTH              
    | WINDOW_HEIGHT             
    | WINDOW_BUFFER_SIZE                
    | WINDOW_STENCIL_SIZE       
    | WINDOW_DEPTH_SIZE         
    | WINDOW_RED_SIZE           
    | WINDOW_GREEN_SIZE         
    | WINDOW_BLUE_SIZE          
    | WINDOW_ALPHA_SIZE         
    | WINDOW_ACCUM_RED_SIZE     
    | WINDOW_ACCUM_GREEN_SIZE   
    | WINDOW_ACCUM_BLUE_SIZE    
    | WINDOW_ACCUM_ALPHA_SIZE   
    | WINDOW_DOUBLEBUFFER       
    | WINDOW_RGBA               
    | WINDOW_PARENT             
    | WINDOW_NUM_CHILDREN       
    | WINDOW_COLORMAP_SIZE      
    | WINDOW_NUM_SAMPLES                
    | WINDOW_STEREO             
    | WINDOW_CURSOR             
    | SCREEN_WIDTH              
    | SCREEN_HEIGHT             
    | SCREEN_WIDTH_MM           
    | SCREEN_HEIGHT_MM          
    | MENU_NUM_ITEMS            
    (* | DISPLAY_MODE_POSSIBLE : use getBool *)
    | INIT_WINDOW_X             
    | INIT_WINDOW_Y             
    | INIT_WINDOW_WIDTH         
    | INIT_WINDOW_HEIGHT                
    | INIT_DISPLAY_MODE         
    | ELAPSED_TIME              
    | WINDOW_FORMAT_ID 

type glut_get_bool_t = 
    | DISPLAY_MODE_POSSIBLE

let rgb = 0;;
let rgba = rgb;; (* same as in glut.h *)
let index = 1;;
let single = 0;;
let double = 2;;
let accum = 4;;
let alpha = 8;;
let depth = 16;;
let stencil = 32;;
let multisample = 128;;
let stereo = 256;;
let luminance = 512;;

type device_get_t =
    | HAS_KEYBOARD              
    | HAS_MOUSE                 
    | HAS_SPACEBALL             
    | HAS_DIAL_AND_BUTTON_BOX   
    | HAS_TABLET                        
    | NUM_MOUSE_BUTTONS         
    | NUM_SPACEBALL_BUTTONS     
    | NUM_BUTTON_BOX_BUTTONS    
    | NUM_DIALS                 
    | NUM_TABLET_BUTTONS                
    | DEVICE_IGNORE_KEY_REPEAT   
    | DEVICE_KEY_REPEAT          
    | HAS_JOYSTICK              
    | OWNS_JOYSTICK             
    | JOYSTICK_BUTTONS          
    | JOYSTICK_AXES             
    | JOYSTICK_POLL_RATE                

type layerget_t = 
    | OVERLAY_POSSIBLE           
    (* | LAYER_IN_USE : use layerGetInUse *)
    | HAS_OVERLAY               
    (* | TRANSPARENT_INDEX : use layerGetTransparentIndex *)
    | NORMAL_DAMAGED            
    | OVERLAY_DAMAGED           

type video_resize_t = 
    | VIDEO_RESIZE_POSSIBLE     
    | VIDEO_RESIZE_IN_USE       
    | VIDEO_RESIZE_X_DELTA      
    | VIDEO_RESIZE_Y_DELTA      
    | VIDEO_RESIZE_WIDTH_DELTA  
    | VIDEO_RESIZE_HEIGHT_DELTA 
    | VIDEO_RESIZE_X            
    | VIDEO_RESIZE_Y            
    | VIDEO_RESIZE_WIDTH                
    | VIDEO_RESIZE_HEIGHT       

type get_modifiers_t = 
    | ACTIVE_SHIFT               
    | ACTIVE_CTRL                
    | ACTIVE_ALT                 

let active_shift = 1
let active_ctrl = 2
let active_alt = 4

type cursor_t = 
     (* Basic arrows. *)
    | CURSOR_RIGHT_ARROW                
    | CURSOR_LEFT_ARROW         
     (* Symbolic cursor shapes. *)
    | CURSOR_INFO               
    | CURSOR_DESTROY            
    | CURSOR_HELP               
    | CURSOR_CYCLE              
    | CURSOR_SPRAY              
    | CURSOR_WAIT               
    | CURSOR_TEXT               
    | CURSOR_CROSSHAIR          
     (* Directional cursors. *)
    | CURSOR_UP_DOWN            
    | CURSOR_LEFT_RIGHT         
     (* Sizing cursors. *)
    | CURSOR_TOP_SIDE           
    | CURSOR_BOTTOM_SIDE                
    | CURSOR_LEFT_SIDE          
    | CURSOR_RIGHT_SIDE         
    | CURSOR_TOP_LEFT_CORNER    
    | CURSOR_TOP_RIGHT_CORNER   
    | CURSOR_BOTTOM_RIGHT_CORNER        
    | CURSOR_BOTTOM_LEFT_CORNER 
    | CURSOR_INHERIT              (* inherit cursor from parent window *)
    | CURSOR_NONE                     (* blank cursor *)
    | CURSOR_FULL_CROSSHAIR   (* full-screen crosshair  : if available *)

type game_mode_t = 
    | GAME_MODE_ACTIVE
    | GAME_MODE_POSSIBLE
    | GAME_MODE_WIDTH
    | GAME_MODE_HEIGHT
    | GAME_MODE_PIXEL_DEPTH
    | GAME_MODE_REFRESH_RATE
    | GAME_MODE_DISPLAY_CHANGED

type key_repeat_t = 
    | KEY_REPEAT_OFF
    | KEY_REPEAT_ON
    | KEY_REPEAT_DEFAULT

exception BadEnum of string
exception InvalidState of string 
exception OverlayNotInUse of string

open Printf;;

external getWindow: unit -> int = "ml_glutGetWindow"

(* generate name for callbacks, based on window id *)
let cbname glutname = 
    let name = sprintf "ocaml_%s_cb_%i" glutname (getWindow()) in
    (* printf "ocaml cbname: %s" name; print_newline(); *)
    name;;

(* general routine to set up a glut callback *)
let setup glutname glutwrapper cb = 
    let _ = Callback.register (cbname glutname) cb in
    glutwrapper (); (* register the callback with GLUT *)
    ;;


(* ==== file-local variables ==== *)

let is_init = ref false;;
let is_displayModeInit = ref false;;
let is_windowSizeInit = ref false;;
let is_windowPositionInit = ref false;;
let has_createdWindow = ref false;;

 (* === GLUT initialization sub-API. === *)
external _glutInit : int -> string array -> unit = "ml_glutInit" 

let new_argv = ref [];; (* built by a callback from _glutInit *)

let add_arg str =
    new_argv := str :: !new_argv;;

let init ~argv = 
    is_init := true;
    let argc = (Array.length argv) in
    let _ = Callback.register "add_arg" add_arg in
    _glutInit argc argv;
    let retargs = Array.of_list(List.rev !new_argv) in
    retargs;;

external _glutInitDisplayMode : 
    double_buffer:bool ->
    index:bool ->
    accum:bool ->
    alpha:bool ->
    depth:bool ->
    stencil:bool ->
    multisample:bool ->
    stereo:bool ->
    luminance:bool ->
    unit =
    "bytecode_glutInitDisplayMode"
    "native_glutInitDisplayMode"

let initDisplayMode 
    ?(double_buffer=false)
    ?(index=false) 
    ?(accum=false)
    ?(alpha=false) 
    ?(depth=false) 
    ?(stencil=false) 
    ?(multisample=false) 
    ?(stereo=false) 
    ?(luminance=false) 
    dummy_unit
    = 
    is_displayModeInit := true;
    _glutInitDisplayMode 
        double_buffer
        index
        accum
        alpha
        depth
        stencil
        multisample
        stereo
        luminance
    ;;

external _glutInitWindowSize : int->int->unit = "ml_glutInitWindowSize"

external _glutInitWindowPosition : int->int->unit = "ml_glutInitWindowPosition"
let initWindowPosition ~x ~y =
    is_windowPositionInit := true;
    _glutInitWindowPosition x y;;

let initWindowSize ~w ~h =   
    is_windowSizeInit := true;
    _glutInitWindowSize w h;;

external mainLoop : unit->unit = "ml_glutMainLoop"

 (* === GLUT window sub-API. === *)

external _glutCreateWindow : string->int = "ml_glutCreateWindow"

let createWindow ~title =
    has_createdWindow := true;
    let winid = _glutCreateWindow title in
    winid;;

external postRedisplay : unit->unit = 
    "ml_glutPostRedisplay"
external swapBuffers : unit->unit = 
    "ml_glutSwapBuffers" 
external createSubWindow: win:int->x:int->y:int->w:int->h:int->int = 
    "ml_glutCreateSubWindow"
external destroyWindow: win:int -> unit = 
    "ml_glutDestroyWindow"
external setWindow: win:int -> unit = 
    "ml_glutSetWindow"
external setWindowTitle: title:string -> unit  = 
    "ml_glutSetWindowTitle"
external setIconTitle: title:string -> unit = 
    "ml_glutSetIconTitle"
external positionWindow: x:int -> y:int -> unit = 
    "ml_glutPositionWindow"
external reshapeWindow: w:int -> h:int -> unit = 
    "ml_glutReshapeWindow"
external popWindow: unit -> unit = 
    "ml_glutPopWindow"
external pushWindow: unit -> unit = 
    "ml_glutPushWindow"
external iconifyWindow: unit -> unit = 
    "ml_glutIconifyWindow"
external showWindow: unit -> unit = 
    "ml_glutShowWindow"
external hideWindow: unit -> unit = 
    "ml_glutHideWindow"
external fullScreen: unit -> unit = 
    "ml_glutFullScreen"

external _setCursor: c:int -> unit = "ml_glutSetCursor"
let setCursor c = 
    let ic = match c with 
     (* Basic arrows. *)
    | CURSOR_RIGHT_ARROW -> 0  (* values from glut.h *)
    | CURSOR_LEFT_ARROW -> 1 
     (* Symbolic cursor shapes. *)
    | CURSOR_INFO -> 2
    | CURSOR_DESTROY -> 3
    | CURSOR_HELP -> 4
    | CURSOR_CYCLE -> 5
    | CURSOR_SPRAY -> 6
    | CURSOR_WAIT -> 7
    | CURSOR_TEXT -> 8
    | CURSOR_CROSSHAIR -> 9
     (* Directional cursors. *)
    | CURSOR_UP_DOWN -> 10
    | CURSOR_LEFT_RIGHT -> 11
     (* Sizing cursors. *)
    | CURSOR_TOP_SIDE -> 12
    | CURSOR_BOTTOM_SIDE -> 13
    | CURSOR_LEFT_SIDE -> 14
    | CURSOR_RIGHT_SIDE -> 15
    | CURSOR_TOP_LEFT_CORNER -> 16
    | CURSOR_TOP_RIGHT_CORNER -> 17
    | CURSOR_BOTTOM_RIGHT_CORNER -> 18
    | CURSOR_BOTTOM_LEFT_CORNER -> 19
    | CURSOR_INHERIT -> 100
    | CURSOR_NONE -> 101
    | CURSOR_FULL_CROSSHAIR -> 102
    in _setCursor ic
    ;;

 (* === GLUT overlay sub-API. === *)
external establishOverlay: unit->unit  = "ml_glutEstablishOverlay"
external removeOverlay: unit->unit = "ml_glutRemoveOverlay"
external postOverlayRedisplay: unit->unit = "ml_glutPostOverlayRedisplay"
external showOverlay: unit->unit = "ml_glutShowOverlay"
external hideOverlay: unit->unit = "ml_glutHideOverlay"

external _useLayer: int -> unit = "ml_glutUseLayer"
let useLayer layer = _useLayer (match layer with NORMAL -> 0 | OVERLAY -> 1)

 (* === GLUT menu sub-API. === *)

external _glutCreateMenu : unit->int = "ml_glutCreateMenu"
let createMenu ~cb =
    let _ = Callback.register "ocaml_glutCreateMenu" cb in
    let menu_id = _glutCreateMenu() in
    menu_id
    ;;
    
external destroyMenu: menu:int->unit = 
    "ml_glutDestroyMenu"
external getMenu: unit->int = 
    "ml_glutGetMenu"
external setMenu: menu:int->unit  = 
    "ml_glutSetMenu"
external addMenuEntry: label:string->value:int->unit  = 
    "ml_glutAddMenuEntry"
external addSubMenu: label:string->submenu:int->unit  = 
    "ml_glutAddSubMenu"
external changeToMenuEntry: item:int->label:string->value:int->unit = 
    "ml_glutChangeToMenuEntry"
external changeToSubMenu: item:int->label:string->submenu:int->unit = 
    "ml_glutChangeToSubMenu"
external removeMenuItem: item:int->unit= 
    "ml_glutRemoveMenuItem"

let int_of_button b = match b with
    | LEFT_BUTTON -> 0
    | MIDDLE_BUTTON -> 1
    | RIGHT_BUTTON -> 2
    | OTHER_BUTTON n -> n

let b2i b = int_of_button b;;

external _attachMenu: button:int->unit= "ml_glutAttachMenu"
let attachMenu ~button = _attachMenu (b2i button);;

external _detachMenu: button:int->unit= "ml_glutDetachMenu"
let detachMenu ~button =