frozen dataclasses

This commit is contained in:
Zack Buhman 2025-04-02 11:49:32 -05:00
parent 00e7d75fda
commit f326071861
2 changed files with 22 additions and 9 deletions

View File

@ -52,7 +52,7 @@ def generate_object_array(group_name, obj_file):
yield f"&{group_name}_{object.name}," yield f"&{group_name}_{object.name},"
yield "};" yield "};"
def generate_model(group_name): def generate_model(group_name, obj_file):
yield f"const struct model {group_name}_model = {{" yield f"const struct model {group_name}_model = {{"
yield f".position = {group_name}_position," yield f".position = {group_name}_position,"
yield f".texture = {group_name}_texture," yield f".texture = {group_name}_texture,"
@ -62,6 +62,10 @@ def generate_model(group_name):
yield "};" yield "};"
def generate_obj_file(group_name, obj_file): def generate_obj_file(group_name, obj_file):
yield "#pragma once"
yield '#include "../model.h"'
yield ''
yield from generate_vec(group_name, "position", generate_vec3, obj_file.position) yield from generate_vec(group_name, "position", generate_vec3, obj_file.position)
yield from generate_vec(group_name, "texture", generate_vec2, obj_file.texture) yield from generate_vec(group_name, "texture", generate_vec2, obj_file.texture)
yield from generate_vec(group_name, "normal", generate_vec3, obj_file.normal) yield from generate_vec(group_name, "normal", generate_vec3, obj_file.normal)
@ -73,7 +77,7 @@ def generate_obj_file(group_name, obj_file):
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)
yield from generate_model(group_name) yield from generate_model(group_name, obj_file)
if __name__ == "__main__": if __name__ == "__main__":
obj_file = parse_obj_file(sys.argv[1]) obj_file = parse_obj_file(sys.argv[1])

23
obj.py
View File

@ -1,29 +1,30 @@
from dataclasses import dataclass from dataclasses import dataclass
import sys import sys
import os
@dataclass @dataclass(frozen=True)
class VertexPosition: class VertexPosition:
x: float x: float
y: float y: float
z: float z: float
@dataclass @dataclass(frozen=True)
class VertexNormal: class VertexNormal:
x: float x: float
y: float y: float
z: float z: float
@dataclass @dataclass(frozen=True)
class VertexTexture: class VertexTexture:
x: float x: float
y: float y: float
z: float z: float
@dataclass @dataclass(frozen=True)
class ObjectEvent: class ObjectEvent:
name: str name: str
@dataclass @dataclass(frozen=True)
class FacePTN: class FacePTN:
position: int position: int
texture: int texture: int
@ -70,7 +71,15 @@ def parse_float(s):
f_digits = len(f) f_digits = len(f)
i = int(i, 10) i = int(i, 10)
f = int(f, 10) f = int(f, 10)
return sign * (i + (f / 10 ** f_digits))
if 'ROUND_PRECISION' in os.environ:
max_digits = 4
if f_digits > max_digits:
f = int(f / (f_digits - max_digits))
f_digits = max_digits
f_10 = (f / 10 ** f_digits)
return sign * (i + f_10)
def parse_vertex(line, n, type): def parse_vertex(line, n, type):
assert len(line) == n assert len(line) == n
@ -151,7 +160,7 @@ def parse_obj_lines(lines):
if object.faces: if object.faces:
assert object.name != None assert object.name != None
file.objects.append(object) file.objects.append(object)
object = Object(x.name) object = Object(x.name.replace('-', '_').replace('.', '_'))
elif type(x) is Face: elif type(x) is Face:
object.faces.append(x) object.faces.append(x)
elif type(x) is Material: elif type(x) is Material: