1    type Mesh =
2        var format : VertexFormat
3        val vertex_buffer : VertexBuffer
4        val index_buffer : IndexBuffer
5        var index_count : u32
6        val memory : Atom<Option<MeshMemory>>
7        let token : Token @late
8    
9        def discard = token.discard
10   
11   object Mesh =
12       def from_memory (memory : Atom<Option<MeshMemory>>) =
13           let vertex_buffer = VertexBuffer.create
14           let index_buffer = IndexBuffer.create
15           let mesh = Mesh
16               format = VertexFormat.regular
17               =vertex_buffer =index_buffer
18               index_count = 0
19               =memory
20   
21           let token = memory.bind { maybe_x ->
22               let is_empty = maybe_x.is_none || maybe_x.unwrap.vertices.is_empty
23               if is_empty then
24                   mesh.index_count = 0
25               else
26                   let x = maybe_x.unwrap
27                   mesh.vertex_buffer.ensure_size x.vertices.size
28                                      update x.vertices.as_slice BarrierFlags@all
29   
30                   mesh.index_buffer.ensure_size (x.indices.size * 4)
31                                     update x.indices.as_slice BarrierFlags@all
32   
33                   mesh.format = case x.format of
34                       MeshFormat/Regular -> VertexFormat.regular
35                       MeshFormat/Skinned -> VertexFormat.skinned
36   
37                   mesh.index_count = x.indices.size }
38   
39           mesh.token = token
40   
41           mesh
42