2010-08-13 13 views
5

No tengo ninguna experiencia con OpenGL, así que tal vez me estoy perdiendo algo.¿Por qué presionar numlock se bloquea OCaml opengl program?

Tengo este código ocaml usando lablGL. Para compilar utilizo

ocamlopt -I + lablGL lablglut.cmxa lablgl.cmxa gl.ml -o gl.opt

o

ocamlc -I + lablGL lablglut.cma lablgl.cma gl.ml -o gl.byte

let keyboard ~key ~x ~y = 
    match key with 
    | 27 -> exit 0 
    | _ -> ignore (Printf.printf "Key: %c %d pressed.\n%!" (char_of_int key) key) 
;; 

let keyboard_up ~key ~x ~y = 
    match key with 
    | _ -> ignore (Printf.printf "Key: %c %d released.\n%!" key (int_of_char key)) 
;; 

let special ~key ~x ~y = 
    try 
    match key with 
     | Glut.KEY_F1 -> Printf.printf "F1 pressed.\n%!" 
     | Glut.KEY_F2 -> Printf.printf "F2 pressed.\n%!" 
     | Glut.KEY_F3 -> Printf.printf "F3 pressed.\n%!" 
     | Glut.KEY_F4 -> Printf.printf "F4 pressed.\n%!" 
     | Glut.KEY_F5 -> Printf.printf "F5 pressed.\n%!" 
     | Glut.KEY_F6 -> Printf.printf "F6 pressed.\n%!" 
     | Glut.KEY_F7 -> Printf.printf "F7 pressed.\n%!" 
     | Glut.KEY_F8 -> Printf.printf "F8 pressed.\n%!" 
     | Glut.KEY_F9 -> Printf.printf "F9 pressed.\n%!" 
     | Glut.KEY_F10 -> Printf.printf "F10 pressed.\n%!" 
     | Glut.KEY_F11 -> Printf.printf "F11 pressed.\n%!" 
     | Glut.KEY_F12 -> Printf.printf "F12 pressed.\n%!" 
     | Glut.KEY_LEFT -> Printf.printf "Left pressed.\n%!" 
     | Glut.KEY_UP -> Printf.printf "Up pressed.\n%!" 
     | Glut.KEY_RIGHT -> Printf.printf "Right pressed.\n%!" 
     | Glut.KEY_DOWN -> Printf.printf "Down pressed.\n%!" 
     | Glut.KEY_PAGE_UP -> Printf.printf "PgUp pressed.\n%!" 
     | Glut.KEY_PAGE_DOWN -> Printf.printf "PgDown pressed.\n%!" 
     | Glut.KEY_HOME -> Printf.printf "Home pressed.\n%!" 
     | Glut.KEY_END -> Printf.printf "End pressed.\n%!" 
     | Glut.KEY_INSERT -> Printf.printf "Insert pressed.\n%!" 
    with 
    | Glut.BadEnum m -> Printf.printf "%s\n" m 
;; 

let() = 
    ignore (Glut.init Sys.argv); 
    ignore (Glut.createWindow ~title:"OpenGL Demo"); 
    GlClear.color (1.0, 1.0, 1.0); 
    Glut.keyboardFunc ~cb:(keyboard); 
    Glut.specialFunc ~cb:(special); 
    Glut.displayFunc ~cb:(fun() -> GlClear.clear [ `color ]; Gl.flush()); 
    Glut.mainLoop() 

Y ahora aquí está el problema. Al presionar numlock o cualquier otra tecla del teclado numérico cuando BloqNum está desactivado, se bloquea el programa lanzando una excepción. Tratar de atrapar esta excepción en una función especial no ayuda.

Aquí está el ejemplo ejecutar.

> ./gl.opt 
Up pressed. 
Down pressed. 
Key: 1 49 pressed. 
Key: 2 50 pressed. 
Fatal error: exception Glut.BadEnum("key in special_of_int") 

¿Puede alguien explicarme por qué funciona así y cómo solucionarlo?

Respuesta

4

Según this código parece que el usuario que lo escribió sólo trató de eludir el error de la siguiente manera:

let rec handlelablglutbug() = 
    try 
     Glut.mainLoop(); 
    with Glut.BadEnum "key in special_of_int" -> 
     showtext '!' " LablGlut bug: special key not recognized"; 
     Glut.swapBuffers(); 
     handlelablglutbug() 
    in 
    handlelablglutbug(); 

Esto me hace pensar que se trata de un error con el puerto ocaml de la biblioteca de saturación. así que no hay forma de tener una solución perfecta.

+0

Gracias por mostrarme este código. – stmi

3

Parece que la biblioteca OpenGL informa un número de clave que el enlace OCaml no admite.

Si esto sucede con la última versión de lablGL, es posible que desee informar de esto como un error, y sugieren que sería una buena idea para añadir un KEY_UNKNOWN of int para manejar las claves que la gente inventa ahora y entonces (tales como teclas "multimedia").

+2

Esto ya está solucionado en CVS - http://camlcvs.inria.fr/cgi-bin/cvsweb/bazar-ocaml/lablGL/CHANGES?rev=1.34 – ygrek

Cuestiones relacionadas