open Graphics2D let obj1 = let r = [|0., 0.25; 0.25, 0.; 0.75, 0.; 1., 0.25; 1.5, 0.75; -0.5, 0.75; 0., 1.25; 0.25, 1.5; 0.75, 1.5; 1., 1.25|] |> Array.map (fun (x, y) -> vec2 x y) in let m1 = mat2 1. 0. 0.5 1. 0. 0. in let r = Array.map (( *|| ) (inverse m1)) r in let f f i = f (r.(i).x) (r.(i).y) in let f i j k = f (f (f curve_to i) j) k in let geo = ContourGeometry.make [Contour.Open r.(0), [f 1 2 3; f 4 5 6; f 7 8 9]] in let blue = Fill.color 0. 0.25 1. 1. in let style = Style.stroke 0.2 ~endcaps:(`Round, `Round) ~joins:`Round in let m2 = mat2 1. 0. 0. 1. (-0.5) (-0.75) in let m3 = mat2 2.25 0. 0. 2.25 0. 0. in transform (m3 *||| m2 *||| m1) (Shape([ Fill.flat blue, style ], geo)) let obj2 = let geo = [Contour.Closed, [curve_to (-0.8) 0. (-0.8) 0. (-1.) 1.; line_to 1. 1.; curve_to 0.8 0. 0.8 0. 1. (-1.); line_to (-1.) (-1.)]] |> ContourGeometry.make in let styles = let red = Fill.color 1. 0. 0. 1. in let orange1 = Fill.color 1. 0.3 0.1 1. in let orange2 = Fill.color 1. 0.3 0.1 0. in let white = Fill.color 1. 1. 1. 1. in let red1 = let r1 = vec2 (-0.5) (-0.5) and r2 = vec2 0.5 0.5 in Fill.gradient r1 red r2 orange1 in let red2 = let r1 = vec2 0.4 0.5 and r2 = vec2 0.6 0.7 and r3 = vec2 0.1 0.8 in Fill.radial r1 r2 r3 white orange2 in let blue = Fill.make 0. 0.5 1. 0.5 in let interior_style = Style.Interior `Odd in let stroke_style = Style.stroke 0.2 ~endcaps:(`None, `None) ~joins:`Round in [red1, interior_style; red2, interior_style; blue, stroke_style] in Shape(styles, geo) let portal = {view = Some(vec2 (-1.6) (-1.6), vec2 1.6 1.6); scene = Group [||]} let paint() = portal.scene <- Group [|obj1; transform (time() |> rot) obj2|] let () = let on_paint = Event.create() in Event.add paint on_paint; GUI.spawn ~on_paint portal