aboutsummaryrefslogtreecommitdiff
path: root/script.it/worker.ml
blob: 62104ec1f91fa0f4eed9f1b15196ccf13c4fdf37 (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
61
62
63
64
65
66
67
open Js_of_ocaml

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