diff --git a/game/container/spanpool/doc.odin b/game/container/spanpool/doc.odin new file mode 100644 index 0000000..0151e5d --- /dev/null +++ b/game/container/spanpool/doc.odin @@ -0,0 +1,81 @@ +package spanpool + +import "core:slice" + +Element :: struct($E: typeid) { + value: $T, + gen: i32, +} + +Span :: struct { + first, len: i32, +} + +Span_Pool :: struct($E: typeid) { + elems: [dynamic]Element(E), + free_spans: [dynamic]Span, +} + +Handle :: struct { + first: i32, + len: i32, + gen: i32, +} + +allocate :: proc(s: ^$T/Span_Pool($E), elems: []T) -> (handle: Handle) { + handle = _allocate(s, len(elems)) + + for i in 0.. (handle: Handle) { + handle.len = count + + maybe_existing_span: Maybe(i32) + for span, i in s.free_spans { + if span.len >= count { + maybe_existing_span = i + break + } + } + + existing_span, ok := maybe_existing_span.? + if ok { + span := s.free_spans[existing_span] + handle.first = span.first + new_len := span.len - count + + if new_len == 0 { + ordered_remove(&s.free_spans, existing_span) + } else { + s.free_spans[existing_span].first += count + s.free_spans[existing_span].len = new_len + } + } else { + handle.first = len(s.elems) + resize(&s.elems, len(s.elems) + count) + } + + // Now figure out the generation index + max_gen := 0 + for i in handle.first.. Half_Edge_Mesh { + num_faces := len(indices) / vertices_per_face mesh: Half_Edge_Mesh verts := make([]Vertex, len(vertices), allocator) - faces := make([]Face, len(indices) / 3, allocator) + faces := make([]Face, num_faces, allocator) edges := make([]Half_Edge, len(indices), allocator) mesh.vertices = verts @@ -50,49 +52,35 @@ mesh_from_vertex_index_list :: proc( temp_edges: map[[2]u16]Edge_Index = make_map(map[[2]u16]Edge_Index, context.temp_allocator) - triangle_num := len(indices) / 3 - for i in 0 ..< triangle_num { - i1, i2, i3 := indices[i * 3 + 0], indices[i * 3 + 1], indices[i * 3 + 2] - // v1, v2, v3 := vertices[i1], vertices[i2], vertices[i3] - e1, e2, e3 := i * 3 + 0, i * 3 + 1, i * 3 + 2 + for f in 0 ..< num_faces { + for i in 0..