Hardware skinning
[dormin.git] / skin.ml
blobcfd1e77176fa7110d94b60345fb34a8bff825e49
1 type skin = (float * float * float * int) array
2 type skel = (int * float array) array
3 type anim = Qtr.t array
4 type vertices = float array
5 type normals = float array
6 type coords = float array
8 module SW = struct
9 external init : bool -> (vertices * normals * coords * skin * string) -> unit
10 = "ml_skin_init"
12 external draw_begin : unit -> unit = "ml_skin_draw_begin"
13 external draw_end : unit -> unit = "ml_skin_draw_end"
15 external set_skel : skel -> unit = "ml_skin_set_skel"
16 external set_anim : anim -> unit = "ml_skin_set_anim"
17 external anim : unit -> unit = "ml_skin_anim"
18 end
20 module HW = struct
21 external init :
22 string -> bool -> (vertices * normals * coords * skin * string) -> unit
23 = "ml_skin_init_vp"
25 external draw_begin : unit -> unit = "ml_skin_draw_begin_vp"
26 external draw_end : unit -> unit = "ml_skin_draw_end_vp"
28 external set_skel : skel -> unit = "ml_skin_set_skel_vp"
29 external set_anim : anim -> unit = "ml_skin_set_anim_vp"
30 external anim : unit -> unit = "ml_skin_anim_vp"
31 end
33 let sw = object (self)
34 method init = SW.init
35 method draw_begin = SW.draw_begin
36 method draw_end = SW.draw_end
37 method set_skel = SW.set_skel
38 method set_anim = SW.set_anim
39 method anim = SW.anim
40 end;;
42 let hw prog = object (self)
43 method init = HW.init prog
44 method draw_begin = HW.draw_begin
45 method draw_end = HW.draw_end
46 method set_skel = HW.set_skel
47 method set_anim = HW.set_anim
48 method anim = HW.anim
49 end;;
51 let skin = ref sw;;
53 let set path =
54 if String.length path = 0
55 then skin := sw
56 else (
57 if Glut.extensionSupported "GL_ARB_vertex_program"
58 then
59 let prog =
60 let ic = open_in path in
61 let b = Buffer.create 100 in
62 begin try
63 while true do
64 Buffer.add_string b (input_line ic);
65 Buffer.add_char b '\n';
66 done
67 with End_of_file -> ()
68 end;
69 Buffer.contents b
71 skin := hw prog
72 else (
73 Format.eprintf "GL_ARB_vertex_program not supported falling back to sw@.";
74 skin := sw
79 let init a = !skin#init a;;
80 let draw_begin a = !skin#draw_begin a;;
81 let draw_end a = !skin#draw_end a;;
82 let set_skel a = !skin#set_skel a;;
83 let set_anim a = !skin#set_anim a;;
84 let anim a = !skin#anim a;;