2010-08-13 4 views
5

Je n'ai aucune expérience avec openGL, alors peut-être que je manque quelque chose. J'ai ce code ocaml en utilisant lablGL. Pour compiler j'utiliserPourquoi appuyer sur numlock crash OCaml opengl programme?

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

ou

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

Et maintenant, voici le problème. Appuyer sur numlock ou sur une autre touche du pavé numérique lorsque numlock est désactivé bloque le programme en lançant une exception. Essayer d'attraper cette exception dans la fonction spéciale n'aide pas.

Voici l'exemple d'exécution. Est-ce que quelqu'un peut m'expliquer pourquoi cela fonctionne ainsi et comment contourner ce problème?

Répondre

4

Selon le code this il semble que l'utilisateur qui l'a écrit juste essayé de contourner l'erreur de la manière suivante:

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

Cela me fait penser qu'il est un bug avec le port OCaml de GLUT. Donc, aucun moyen d'avoir une solution transparente.

+0

Merci de m'indiquer ce code. – stmi

3

Il semble que la bibliothèque OpenGL signale un nombre clé que la liaison OCaml ne prend pas en charge.

Si cela se produit avec la dernière version de lablGL, vous pouvez signaler un bug, et suggère que ce serait une bonne idée d'ajouter un KEY_UNKNOWN of int pour gérer les clés que les gens inventent maintenant et (par exemple comme touches "multimédia").

+2

Ceci est déjà corrigé dans CVS - http://camlcvs.inria.fr/cgi-bin/cvsweb/bazar-ocaml/lablGL/CHANGES?rev=1.34 – ygrek