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 "};"
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])

23
obj.py
View File

@ -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: