package halfedge Vec3 :: [3]f32 Vertex :: struct { pos: Vec3, edge: Edge_Index, } Face :: struct { edge: Edge_Index, } Vertex_Index :: distinct u16 Face_Index :: distinct u16 Edge_Index :: distinct i16 Half_Edge :: struct { origin: Vertex_Index, twin: Edge_Index, face: Face_Index, next: Edge_Index, prev: Edge_Index, } Half_Edge_Mesh :: struct { vertices: []Vertex, faces: []Face, edges: []Half_Edge, } mesh_from_vertex_index_list :: proc( vertices: []Vec3, indices: []u16, vertices_per_face: int = 3, allocator := context.allocator, ) -> Half_Edge_Mesh { num_faces := len(indices) / vertices_per_face mesh: Half_Edge_Mesh verts := make([]Vertex, len(vertices), allocator) faces := make([]Face, num_faces, allocator) edges := make([]Half_Edge, len(indices), allocator) mesh.vertices = verts mesh.faces = faces mesh.edges = edges for pos, i in vertices { verts[i].pos = pos verts[i].edge = -1 } temp_edges: map[[2]u16]Edge_Index = make_map(map[[2]u16]Edge_Index, context.temp_allocator) for f in 0 ..< num_faces { for i in 0..