aboutsummaryrefslogtreecommitdiff
path: root/script.it/worker.ml
blob: 9455765e4aba952729642cd0f54a0a433cca400d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
open Js_of_ocaml
module Path = Script_path

let ( let=? ) : 'a option -> ('a -> unit) -> unit =
 fun f opt -> Option.iter opt f


let post_message : Worker_messages.from_worker -> unit = Worker.post_message

let rebuild outline =
  let path = outline.Outline.path in

  let=? path = Path.Fixed.rebuild path in
  let back =
    Path.Fixed.map path (fun pt ->
        Path.Point.copy pt @@ Path.Point.get_coord' pt )
  in
  let=? back = Path.Fixed.rebuild back in
  post_message (`Complete { outline with path; back })


let execute (command : Worker_messages.to_worker) =
  match command with
  (* Full rebuild, evaluate the whole path *)
  | `Complete outline -> rebuild outline
  (* Remove the point from the main line, and reevaluate the whole path *)
  | `DeletePoint (point, outline) ->
      let=? path = Path.Fixed.remove_point outline.Outline.path point in
      rebuild { outline with path }
  (* Only evaluate the interior *)
  | `Back outline ->
      let back =
        Path.Fixed.map outline.Outline.path (fun pt ->
            Path.Point.copy pt @@ Path.Point.get_coord' pt )
      in
      let=? back = Path.Fixed.rebuild back in
      post_message (`Complete { outline with back })
  | `TranslatePath (outline, delta) ->
      let path =
        Path.Fixed.map outline.path (fun pt ->
            Path.Point.get_coord pt |> Gg.V2.add delta |> Path.Point.copy pt )
      and back =
        Path.Fixed.map outline.back (fun pt ->
            Path.Point.get_coord pt |> Gg.V2.add delta |> Path.Point.copy pt )
      in
      post_message (`Complete { outline with path; back })
  | `TranslatePoint (point, outline) ->
      (* I do not use the function Path.Fixed.replace_point here, I just
         replace the point position and run a full rebuild *)
      let path =
        Path.Fixed.map outline.path (fun pt ->
            match Path.Point.id pt = Path.Point.id point with
            | true -> point
            | false -> pt )
      in

      rebuild { outline with path }


let () = Worker.set_onmessage execute