obj: add support for lines
This commit is contained in:
parent
a3852c1a2c
commit
b7902001e0
@ -32,14 +32,26 @@ def generate_faces(group_name, model_name, faces, type, n):
|
|||||||
yield "}},"
|
yield "}},"
|
||||||
yield "};"
|
yield "};"
|
||||||
|
|
||||||
|
def generate_lines(group_name, model_name, lines, type, n):
|
||||||
|
yield f"const union {type} {group_name}_{model_name}_{type}[] = {{"
|
||||||
|
for line in lines:
|
||||||
|
yield "{"
|
||||||
|
yield f".a = {line.a},"
|
||||||
|
yield f".b = {line.b},"
|
||||||
|
yield "},"
|
||||||
|
yield "};"
|
||||||
|
|
||||||
def generate_object(group_name, object):
|
def generate_object(group_name, object):
|
||||||
yield f"const struct object {group_name}_{object.name} = {{"
|
yield f"const struct object {group_name}_{object.name} = {{"
|
||||||
yield f".triangle = &{group_name}_{object.name}_triangle[0],"
|
yield f".triangle = &{group_name}_{object.name}_triangle[0],"
|
||||||
yield f".quadrilateral = &{group_name}_{object.name}_quadrilateral[0],"
|
yield f".quadrilateral = &{group_name}_{object.name}_quadrilateral[0],"
|
||||||
|
yield f".line = &{group_name}_{object.name}_line[0],"
|
||||||
triangle_count = sum(1 for _ in filter_n(object.faces, 3))
|
triangle_count = sum(1 for _ in filter_n(object.faces, 3))
|
||||||
quadrilateral_count = sum(1 for _ in filter_n(object.faces, 4))
|
quadrilateral_count = sum(1 for _ in filter_n(object.faces, 4))
|
||||||
|
line_count = len(object.lines)
|
||||||
yield f".triangle_count = {triangle_count},"
|
yield f".triangle_count = {triangle_count},"
|
||||||
yield f".quadrilateral_count = {quadrilateral_count},"
|
yield f".quadrilateral_count = {quadrilateral_count},"
|
||||||
|
yield f".line_count = {line_count},"
|
||||||
if object.material is None:
|
if object.material is None:
|
||||||
yield ".material = 0,"
|
yield ".material = 0,"
|
||||||
else:
|
else:
|
||||||
@ -74,6 +86,7 @@ def generate_obj_file(group_name, obj_file):
|
|||||||
assert all(len(face.ptn) in {3, 4} for face in object.faces), object.name
|
assert all(len(face.ptn) in {3, 4} for face in object.faces), object.name
|
||||||
yield from generate_faces(group_name, object.name, object.faces, "triangle", 3)
|
yield from generate_faces(group_name, object.name, object.faces, "triangle", 3)
|
||||||
yield from generate_faces(group_name, object.name, object.faces, "quadrilateral", 4)
|
yield from generate_faces(group_name, object.name, object.faces, "quadrilateral", 4)
|
||||||
|
yield from generate_lines(group_name, object.name, object.lines, "line", 4)
|
||||||
yield from generate_object(group_name, object)
|
yield from generate_object(group_name, object)
|
||||||
|
|
||||||
yield from generate_object_array(group_name, obj_file)
|
yield from generate_object_array(group_name, obj_file)
|
||||||
|
21
obj.py
21
obj.py
@ -46,6 +46,11 @@ class FacePTN:
|
|||||||
class Face:
|
class Face:
|
||||||
ptn: list[FacePTN]
|
ptn: list[FacePTN]
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class Line:
|
||||||
|
a: int
|
||||||
|
b: int
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class Material:
|
class Material:
|
||||||
name: str
|
name: str
|
||||||
@ -54,11 +59,13 @@ class Material:
|
|||||||
class Object:
|
class Object:
|
||||||
name: str
|
name: str
|
||||||
faces: list[Face]
|
faces: list[Face]
|
||||||
|
lines: list[Line]
|
||||||
material: Material
|
material: Material
|
||||||
|
|
||||||
def __init__(self, name, faces=None, material=None):
|
def __init__(self, name, faces=None, lines=None, material=None):
|
||||||
self.name = name
|
self.name = name
|
||||||
self.faces = [] if faces is None else faces
|
self.faces = [] if faces is None else faces
|
||||||
|
self.lines = [] if lines is None else lines
|
||||||
self.material = material
|
self.material = material
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
@ -124,6 +131,12 @@ def parse_usemtl(line):
|
|||||||
name, = line
|
name, = line
|
||||||
return Material(name)
|
return Material(name)
|
||||||
|
|
||||||
|
def parse_polyline(line):
|
||||||
|
assert len(line) == 2
|
||||||
|
a, b = line
|
||||||
|
return Line(int(a, 10) - 1,
|
||||||
|
int(b, 10) - 1)
|
||||||
|
|
||||||
def parse_line(line):
|
def parse_line(line):
|
||||||
t, *line = line.split(' ')
|
t, *line = line.split(' ')
|
||||||
if t == '#':
|
if t == '#':
|
||||||
@ -147,7 +160,7 @@ def parse_line(line):
|
|||||||
return None
|
return None
|
||||||
if t == 'l':
|
if t == 'l':
|
||||||
# polyline
|
# polyline
|
||||||
return None
|
return parse_polyline(line)
|
||||||
assert False, (t, line)
|
assert False, (t, line)
|
||||||
|
|
||||||
def parse_obj_lines(lines):
|
def parse_obj_lines(lines):
|
||||||
@ -175,9 +188,11 @@ def parse_obj_lines(lines):
|
|||||||
file.objects.append(object)
|
file.objects.append(object)
|
||||||
object = Object(object.name + "_mtl_" + x.name)
|
object = Object(object.name + "_mtl_" + x.name)
|
||||||
object.material = x
|
object.material = x
|
||||||
|
elif type(x) is Line:
|
||||||
|
object.lines.append(x)
|
||||||
else:
|
else:
|
||||||
assert False, x
|
assert False, x
|
||||||
if object.faces:
|
if object.faces or object.lines:
|
||||||
assert object.name != None
|
assert object.name != None
|
||||||
file.objects.append(object)
|
file.objects.append(object)
|
||||||
return file
|
return file
|
||||||
|
Loading…
x
Reference in New Issue
Block a user