let marbling : (Shape.t * Js.js_string Js.t) list ref = ref []
-let add_drop c r color =
- marbling :=
- List.fold_right (fun (sh, color) rest -> (apply_drop c r sh, color) :: rest) !marbling [(drop c r, color)]
+let marbling_view : (Shape.t * Js.js_string Js.t) list ref = ref []
+
+let add_drop c r color marbling =
+ List.fold_right (fun (sh, color) rest -> (apply_drop c r sh, color) :: rest) marbling [(drop c r, color)]
let main () =
ctx##.fillStyle := Js.string "#00001f";
ctx##.fillStyle := color;
Shape.path ctx shape;
ctx##fill)
- !marbling
+ !marbling_view
let _interval_id = Dom_html.window##setInterval (Js.wrap_callback main) (1000.0 /. 60.0)
-let _mouse_listener =
- Dom_html.addEventListener canvas Dom_html.Event.click
- (Dom.handler (fun ev ->
- add_drop
- (float_of_int ev##.offsetX, float_of_int ev##.offsetY)
- (Random.float 50. +. 25.)
- (Js.string
+let _mouse_listener, _click_listener, _mouseout_listener =
+ let r = ref 0.
+ and color = ref (Js.string "") in
+ let reset () =
+ r := Random.float 50. +. 25.;
+ color :=
+ Js.string
("rgb("
^ string_of_int (Random.int 128 + 127)
^ " "
^ string_of_int (Random.int 128 + 127)
^ " "
^ string_of_int (Random.int 128 + 127)
- ^ ")"));
- Js.bool true))
- (Js.bool false)
+ ^ ")")
+ in
+ reset ();
+ ( Dom_html.addEventListener canvas Dom_html.Event.mousemove
+ (Dom.handler (fun ev ->
+ marbling_view := add_drop (float_of_int ev##.offsetX, float_of_int ev##.offsetY) !r !color !marbling;
+ Js.bool true))
+ (Js.bool false),
+ Dom_html.addEventListener canvas Dom_html.Event.click
+ (Dom.handler (fun ev ->
+ marbling := add_drop (float_of_int ev##.offsetX, float_of_int ev##.offsetY) !r !color !marbling;
+ reset ();
+ marbling_view := add_drop (float_of_int ev##.offsetX, float_of_int ev##.offsetY) !r !color !marbling;
+ Js.bool true))
+ (Js.bool false),
+ Dom_html.addEventListener canvas Dom_html.Event.mouseout
+ (Dom.handler (fun _ev ->
+ marbling_view := !marbling;
+ Js.bool true))
+ (Js.bool false) )