module Make(Repr: Repr.PRINTER) = struct type t = Path.Point.t type repr = { path: (Repr.t) } let create_path : 'b -> repr = fun _ -> { path = Repr.create () } (* Start a new path. *) let start : Path.Point.t -> repr -> repr = fun t {path} -> let path = Repr.move_to (Path.Point.get_coord t) path in let path = Repr.line_to (Path.Point.get_coord' t) path in { path } let line_to : Path.Point.t -> Path.Point.t -> repr -> repr = fun _ t {path} -> let path = Repr.move_to (Path.Point.get_coord t) path in let path = Repr.line_to (Path.Point.get_coord' t) path in { path } let quadratic_to : Path.Point.t -> Gg.v2 -> Gg.v2 -> Path.Point.t -> repr -> repr = fun p0 ctrl0 ctrl1 p1 { path } -> let path = ref path in let bezier = { Shapes.Bezier.p0 = Path.Point.get_coord p0 ; ctrl0 ; ctrl1 ; p1 = Path.Point.get_coord p1 } in (* Mark each point on the bezier curve. The first point is the most recent point *) let delay = ((Path.Point.get_stamp p0) -. (Path.Point.get_stamp p1)) *. 100. /. 3. in for i = 0 to (Int.of_float delay) do let bezier', _ = Shapes.Bezier.slice (0.1 *. (Float.of_int i)) bezier in let point = Path.Point.copy p1 bezier'.Shapes.Bezier.p1 in path := Repr.move_to (Path.Point.get_coord point) !path; path := Repr.line_to (Path.Point.get_coord' point) !path; done; { path = !path } let stop : repr -> repr = fun path -> path let get : repr -> Repr.t = fun {path; _} -> path end