From f326071861796a616155762ffcca40cb07ee13ad Mon Sep 17 00:00:00 2001 From: Zack Buhman Date: Wed, 2 Apr 2025 11:49:32 -0500 Subject: [PATCH] frozen dataclasses --- generate_cpp.py | 8 ++++++-- obj.py | 23 ++++++++++++++++------- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/generate_cpp.py b/generate_cpp.py index 62da5d4..5b728fb 100644 --- a/generate_cpp.py +++ b/generate_cpp.py @@ -52,7 +52,7 @@ def generate_object_array(group_name, obj_file): yield f"&{group_name}_{object.name}," yield "};" -def generate_model(group_name): +def generate_model(group_name, obj_file): yield f"const struct model {group_name}_model = {{" yield f".position = {group_name}_position," yield f".texture = {group_name}_texture," @@ -62,6 +62,10 @@ def generate_model(group_name): yield "};" 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, "texture", generate_vec2, obj_file.texture) 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_array(group_name, obj_file) - yield from generate_model(group_name) + yield from generate_model(group_name, obj_file) if __name__ == "__main__": obj_file = parse_obj_file(sys.argv[1]) diff --git a/obj.py b/obj.py index c36c5fb..091260a 100644 --- a/obj.py +++ b/obj.py @@ -1,29 +1,30 @@ from dataclasses import dataclass import sys +import os -@dataclass +@dataclass(frozen=True) class VertexPosition: x: float y: float z: float -@dataclass +@dataclass(frozen=True) class VertexNormal: x: float y: float z: float -@dataclass +@dataclass(frozen=True) class VertexTexture: x: float y: float z: float -@dataclass +@dataclass(frozen=True) class ObjectEvent: name: str -@dataclass +@dataclass(frozen=True) class FacePTN: position: int texture: int @@ -70,7 +71,15 @@ def parse_float(s): f_digits = len(f) i = int(i, 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): assert len(line) == n @@ -151,7 +160,7 @@ def parse_obj_lines(lines): if object.faces: assert object.name != None file.objects.append(object) - object = Object(x.name) + object = Object(x.name.replace('-', '_').replace('.', '_')) elif type(x) is Face: object.faces.append(x) elif type(x) is Material: