PLY: Cleanup and simplify collecting faces info

This commit is contained in:
Mikhail Rachinskiy 2021-12-31 12:40:57 +04:00
parent 5533f703fb
commit 5df5a211c5
1 changed files with 23 additions and 14 deletions

View File

@ -24,7 +24,15 @@ colors, and texture coordinates per face or per vertex.
"""
def _write_binary(fw, ply_verts, ply_faces, mesh_verts):
class _PLYface:
__slots__ = "verts", "sides"
def __init__(self, sides: int) -> None:
self.verts = []
self.sides = sides
def _write_binary(fw, ply_verts: list, ply_faces: list[_PLYface], mesh_verts: list) -> None:
from struct import pack
# Vertex data
@ -43,11 +51,10 @@ def _write_binary(fw, ply_verts, ply_faces, mesh_verts):
# ---------------------------
for pf in ply_faces:
length = len(pf)
fw(pack("<B%dI" % length, length, *pf))
fw(pack(f"<B{pf.sides}I", pf.sides, *pf.verts))
def _write_ascii(fw, ply_verts, ply_faces, mesh_verts):
def _write_ascii(fw, ply_verts: list, ply_faces: list[_PLYface], mesh_verts: list) -> None:
# Vertex data
# ---------------------------
@ -66,8 +73,8 @@ def _write_ascii(fw, ply_verts, ply_faces, mesh_verts):
# ---------------------------
for pf in ply_faces:
fw(b"%d" % len(pf))
for index in pf:
fw(b"%d" % pf.sides)
for index in pf.verts:
fw(b" %d" % index)
fw(b"\n")
@ -96,12 +103,12 @@ def save_mesh(filepath, mesh, use_ascii, use_normals, use_uv_coords, use_colors)
mesh_verts = mesh.vertices
# vdict = {} # (index, normal, uv) -> new index
vdict = [{} for i in range(len(mesh_verts))]
vdict = [{} for _ in range(len(mesh_verts))]
ply_verts = []
ply_faces = [[] for f in range(len(mesh.polygons))]
ply_faces = []
vert_count = 0
for i, f in enumerate(mesh.polygons):
for f in mesh.polygons:
if use_normals:
smooth = f.use_smooth
@ -120,8 +127,8 @@ def save_mesh(filepath, mesh, use_ascii, use_normals, use_uv_coords, use_colors)
for l in range(f.loop_start, f.loop_start + f.loop_total)
]
pf = ply_faces[i]
for j, vidx in enumerate(f.vertices):
pf = _PLYface(f.loop_total)
for i, vidx in enumerate(f.vertices):
v = mesh_verts[vidx]
if use_normals and smooth:
@ -129,11 +136,11 @@ def save_mesh(filepath, mesh, use_ascii, use_normals, use_uv_coords, use_colors)
normal_key = rvec3d(normal)
if use_uv_coords:
uvcoord = uv[j][0], uv[j][1]
uvcoord = uv[i][0], uv[i][1]
uvcoord_key = rvec2d(uvcoord)
if use_colors:
color = col[j]
color = col[i]
color = (
int(color[0] * 255.0),
int(color[1] * 255.0),
@ -150,7 +157,9 @@ def save_mesh(filepath, mesh, use_ascii, use_normals, use_uv_coords, use_colors)
ply_verts.append((vidx, normal, uvcoord, color))
vert_count += 1
pf.append(pf_vidx)
pf.verts.append(pf_vidx)
ply_faces.append(pf)
with open(filepath, "wb") as file:
fw = file.write