I don't have any experience with openGL, so maybe I'm just missing something.
I have this ocaml code using lablGL. To compile I use
ocamlopt -I +lablGL lablglut.cmxa lablgl.cmxa gl.ml -o gl.opt
or
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 () ->开发者_JAVA技巧; GlClear.clear [ `color ]; Gl.flush ());
Glut.mainLoop ()
And now here's the problem. Pressing numlock or any other numpad key when numlock is off crashes the program by throwing exception. Trying to catch this exception in special function doesn't help.
Here's the example run.
> ./gl.opt
Up pressed.
Down pressed.
Key: 1 49 pressed.
Key: 2 50 pressed.
Fatal error: exception Glut.BadEnum("key in special_of_int")
Can someone explain to me why it works like this and how to work around it?
According to this code it seems that the user that wrote it just tried to circumvent the error in the following way:
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 ();
This makes me think that it is a bug with ocaml port of glut library.. so no way to have a seamless fix.
It looks like the OpenGL library is reporting a key number that the OCaml binding does not support.
If this happens with the latest version of lablGL, you might want to report this as a bug,
and suggest that it would be a good idea to add a KEY_UNKNOWN of int
to handle the keys that people invent now and then (such as “multimedia” keys).
精彩评论