1    let create_mesh (width : u32
2                     height : u32
3                     left : u32
4                     right : u32
5                     up : u32
6                     down : u32) =
7        let border_z = 0
8        let left_quad =
9            let up_left = Vector3 0 0 border_z
10           let up_right = Vector3 left.as<f32> 0 border_z
11           let down_left = Vector3 0 (height as f32 - down as f32) border_z
12           let down_right = Vector3 left.as<f32> (height as f32 - down as f32) border_z
13   
14           Quad.create =up_left =up_right =down_left =down_right
15                       color = Vector3 1 1 1
16   
17       let right_quad =
18           let up_left = Vector3 (width as f32 - right as f32) 0 border_z
19           let up_right = Vector3 (width as f32 - right as f32 + right as f32)
20                                  0
21                                  border_z
22   
23           let down_left = Vector3 (width as f32 - right as f32)
24                                   (height as f32 - down as f32)
25                                   border_z
26   
27           let down_right = Vector3 width.as<f32>
28                                    (height as f32 - down as f32)
29                                    border_z
30   
31           Quad.create =up_left =up_right =down_left =down_right
32                       color = Vector3 1 1 1
33   
34       let up_quad =
35           let up_left = Vector3 0 0 border_z
36           let up_right = Vector3 (width as f32 - left as f32) 0 border_z
37           let down_left = Vector3 0 up.as<f32> border_z
38           let down_right = Vector3 (width as f32 - left as f32) up.as<f32>
39                                    border_z
40   
41           Quad.create =up_left =up_right =down_left =down_right
42                       color = Vector3 1 1 1
43   
44       let down_quad =
45           let up_left = Vector3 0 (height as f32 - down as f32) border_z
46           let up_right = Vector3 width.as<f32>
47                                  (height as f32 - down as f32)
48                                  border_z
49   
50           let down_left = Vector3 0 height.as<f32> border_z
51           let down_right = Vector3 width.as<f32>
52                                    height.as<f32>
53                                    border_z
54   
55           Quad.create =up_left =up_right =down_left =down_right
56                       color = Vector3 1 1 1
57   
58       let quads = [left_quad, right_quad, up_quad, down_quad]
59       MeshMemory.from_quads quads
60   
61   type Border
62       let material : ControlMaterial @auto
63   
64       let size = get_size_atom self
65       let thickness =
66           (left@atom, right@atom, up@atom, down@atom) |> to_atom
67   
68       val memory@atom = (size, thickness)
69           |> to_atom
70           |> map { self ((width, height), thickness) ->
71               if width == 0 || height == 0
72               then None
73               else Some (width, height, thickness) }
74   
75           |> option_map_discard { self (width, height, (left, right, up, down)) ->
76               create_mesh width height left right up down }
77   
78       val drawable = Drawable
79           mesh = Mesh.from_memory memory@atom
80           material = material.unwrap
81   
82       maybe_drawable = drawable
83       color@atom.bind { drawable.color = _ } |> push_token
84