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 () -> 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?