2010-08-13 8 views
5

Non ho alcuna esperienza con openGL, quindi forse mi manca qualcosa.Perché premendo numlock si blocca il programma OCaml opengl?

Ho questo codice ocaml che utilizza lablGL. Per compilare Io uso

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

E ora ecco il problema. Premendo numlock o qualsiasi altro tasto del tastierino numerico disattivato, il programma genera un'eccezione. Cercare di catturare questa eccezione in una funzione speciale non aiuta.

Ecco l'esempio di esecuzione.

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

Qualcuno può spiegarmi perché funziona così e come risolverlo?

risposta

4

Secondo this codice sembra che l'utente che ha scritto è solo cercato di aggirare l'errore nel seguente modo:

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

Questo mi fa pensare che si tratta di un bug con la porta ocaml della libreria di sovrabbondanza. . quindi non c'è modo di avere una soluzione senza problemi.

+0

Grazie per avermi mostrato questo codice. – stmi

3

Sembra che la libreria OpenGL stia riportando un numero chiave che il binding di OCaml non supporta.

Se questo accade con l'ultima versione di lablGL, si potrebbe desiderare di segnalare questo come un bug, e suggeriscono che sarebbe una buona idea per aggiungere un KEY_UNKNOWN of int per gestire le chiavi che la gente inventa ora e poi (come ad come tasti "multimediali").

+2

Questo è già stato risolto in CVS - http://camlcvs.inria.fr/cgi-bin/cvsweb/bazar-ocaml/lablGL/CHANGES?rev=1.34 – ygrek

Problemi correlati