let on_mouse ~button:btn ~state:state ~x:x ~y:y =
if btn = Glut.LEFT_BUTTON && state = Glut.DOWN then
let x, y =
float_of_int x, float_of_int ((Glut.get Glut.WINDOW_WIDTH) - y - 1)
in
let p0, p1 =
GlMat.push ();
cam_transfo () ;
let p0, p1 =
GluMat.unproject (x, y, 0.),
GluMat.unproject (x, y, 1.) in
GlMat.pop (); p0, p1
in
let pv = Vect.normalize (Vect.sub p1 p0) in
selected :=
(
let mi = ref (-1) in
let md = ref infinity in
for i = 0 to ((Array.length Solver.pos) - 1)
do
let md' = Vect.dist_from_point p0 pv Solver.pos.(i) in
if md' < !md then
(
mi := i;
md := md'
)
done; !mi
) ;
let sx, sy, sz = Solver.pos.(!selected) in
let zv = Vect.proj3 pv in
let nx, ny, nz =
Vect.add p0 (Vect.mult pv ((sz -. (Vect.proj3 p0)) /. zv))
in
let move = Skel.Constraints.empty (Array.length Solver.skel.(0)) in
move.(!selected) <- Some (nx -. sx, ny -. sy, nz -. sz);
Printf.printf "moving %d from %f %f %f to %f %f %f\n%!"
!selected sx sy sz nx ny nz;
do_move move