Improve mesh indexing.

This commit is contained in:
Roz K 2022-12-31 06:20:30 +01:00
parent c3e50b7d60
commit 2f3508ed3a
Signed by: roz
GPG Key ID: 51FBF4E483E1C822

View File

@ -192,22 +192,29 @@ class ObjArchive(Archive):
if name:
assert mesh
objects[name] = mesh
vertices = set()
for mesh in objects.values():
vertices |= frozenset(chain.from_iterable(mesh))
vertices = tuple(vertices)
vertices = []
indices = []
models = {}
for name, mesh in sorted(objects.items()):
offset = len(indices)
assert offset < 65536
indices.extend(map(vertices.index, chain.from_iterable(mesh)))
count = len(indices) - offset
mesh_vertices = []
for vertex in chain.from_iterable(mesh):
if vertex not in mesh_vertices:
mesh_vertices.append(vertex)
base_vertex = len(vertices)
mesh_indices = list(map(lambda v: mesh_vertices.index(v) + base_vertex, chain.from_iterable(mesh)))
assert max(mesh_indices) < 65536
count = len(mesh_indices)
print(name, ": vertices =", count, "packed =", len(mesh_vertices))
assert count % 3 == 0
count //= 3
assert count < 65536
print(name, ": offset =", offset, "triangles =", count)
vertices.extend(mesh_vertices)
indices.extend(mesh_indices)
models[name] = (offset, count)
name = str(objpath.stem)
assert name not in self.vertices_db.keys()
#TODO: move to math