views:

100

answers:

2

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?

+3  A: 

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.

Jack
Thanks for showing me this code.
stmi
+2  A: 

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).

Gilles
This is already fixed in CVS - http://camlcvs.inria.fr/cgi-bin/cvsweb/bazar-ocaml/lablGL/CHANGES?rev=1.34
ygrek