From 6e9b4d1a5968db986638ace9500e178979bfd917 Mon Sep 17 00:00:00 2001 From: Dragorn421 Date: Wed, 12 Feb 2025 22:37:26 +0100 Subject: [PATCH] refactor CDataExt.set_write callback args to use a dataclass --- .../assets/extract/extase/cdata_resources.py | 22 +++-- .../extase_oot64/animation_resources.py | 19 ++-- .../extase_oot64/collision_resources.py | 98 +++++++++---------- .../extract/extase_oot64/dlist_resources.py | 26 ++--- .../extase_oot64/playeranim_resources.py | 15 ++- .../extase_oot64/room_shape_resources.py | 75 +++++++------- .../extase_oot64/scene_commands_resource.py | 9 +- .../extase_oot64/scene_rooms_resources.py | 50 +++++----- .../skelanime_legacy_resources.py | 21 ++-- .../extase_oot64/skelcurve_resources.py | 31 +++--- .../extase_oot64/skeleton_resources.py | 24 ++--- .../extase_oot64/skeleton_skin_resources.py | 27 ++--- 12 files changed, 215 insertions(+), 202 deletions(-) diff --git a/tools/assets/extract/extase/cdata_resources.py b/tools/assets/extract/extase/cdata_resources.py index 7cc290425c..e5522cb7cd 100644 --- a/tools/assets/extract/extase/cdata_resources.py +++ b/tools/assets/extract/extase/cdata_resources.py @@ -1,5 +1,5 @@ -from __future__ import annotations import abc +import dataclasses import io from typing import TYPE_CHECKING, Callable, Any, Sequence, Union @@ -21,6 +21,12 @@ from .repr_c_struct import ( ) +@dataclasses.dataclass +class CDataExtWriteContext: + f: io.TextIOBase + line_prefix: str + + class CDataExt(CData, abc.ABC): report_f = None @@ -37,7 +43,7 @@ class CDataExt(CData, abc.ABC): def set_write( self, write_f: Callable[ - ["CDataResource", "MemoryContext", Any, io.TextIOBase, str], + ["CDataResource", "MemoryContext", Any, CDataExtWriteContext], bool, ], ): @@ -88,7 +94,9 @@ class CDataExt(CData, abc.ABC): (typically, False will be returned if this data is struct padding) """ if self.write_f: - ret = self.write_f(resource, memory_context, v, f, line_prefix) + ret = self.write_f( + resource, memory_context, v, CDataExtWriteContext(f, line_prefix) + ) # This assert is meant to ensure the function returns a value at all, # since it's easy to forget to return a value (typically True) assert isinstance(ret, bool), ("must return a bool", self.write_f) @@ -116,11 +124,10 @@ class CDataExt_Value(CData_Value, CDataExt): resource: "CDataResource", memory_context: "MemoryContext", v: Any, - f: io.TextIOBase, - line_prefix: str, + wctx: CDataExtWriteContext, ): - f.write(line_prefix) - f.write(str_v(v)) + wctx.f.write(wctx.line_prefix) + wctx.f.write(str_v(v)) return True self.set_write(write_f) @@ -395,6 +402,7 @@ class S16ArrayResource(CDataResource): else: raise ValueError() + cdata_ext_Vec3f = CDataExt_Struct( ( ("x", CDataExt_Value.f32), diff --git a/tools/assets/extract/extase_oot64/animation_resources.py b/tools/assets/extract/extase_oot64/animation_resources.py index d8519e7a97..78233baa0b 100644 --- a/tools/assets/extract/extase_oot64/animation_resources.py +++ b/tools/assets/extract/extase_oot64/animation_resources.py @@ -15,13 +15,14 @@ from ..extase.cdata_resources import ( CDataExt_Value, CDataExt_Struct, CDataExt_Array, + CDataExtWriteContext, ) class AnimationFrameDataResource(CDataResource, can_size_be_unknown=True): - def write_binang(resource, memory_context, v, f: io.TextIOBase, line_prefix): - f.write(line_prefix) - f.write(f" 0x{v:04X}" if v >= 0 else "-0x" + f"{v:04X}".removeprefix("-")) + def write_binang(resource, memory_context, v, wctx:CDataExtWriteContext): + wctx.f.write(wctx.line_prefix) + wctx.f.write(f" 0x{v:04X}" if v >= 0 else "-0x" + f"{v:04X}".removeprefix("-")) return True elem_cdata_ext = CDataExt_Value("h").set_write(write_binang) @@ -81,21 +82,21 @@ class AnimationJointIndicesResource(CDataResource, can_size_be_unknown=True): class AnimationResource(CDataResource): def write_frameData( - resource, memory_context: "MemoryContext", v, f: io.TextIOBase, line_prefix + resource, memory_context: "MemoryContext", v, wctx: CDataExtWriteContext ): assert isinstance(v, int) address = v - f.write(line_prefix) - f.write(memory_context.get_c_reference_at_segmented(address)) + wctx.f.write(wctx.line_prefix) + wctx.f.write(memory_context.get_c_reference_at_segmented(address)) return True def write_jointIndices( - resource, memory_context: "MemoryContext", v, f: io.TextIOBase, line_prefix + resource, memory_context: "MemoryContext", v, wctx: CDataExtWriteContext ): assert isinstance(v, int) address = v - f.write(line_prefix) - f.write(memory_context.get_c_reference_at_segmented(address)) + wctx.f.write(wctx.line_prefix) + wctx.f.write(memory_context.get_c_reference_at_segmented(address)) return True cdata_ext = CDataExt_Struct( diff --git a/tools/assets/extract/extase_oot64/collision_resources.py b/tools/assets/extract/extase_oot64/collision_resources.py index 79874a77a3..86df422203 100644 --- a/tools/assets/extract/extase_oot64/collision_resources.py +++ b/tools/assets/extract/extase_oot64/collision_resources.py @@ -17,6 +17,7 @@ from ..extase.cdata_resources import ( CDataExt_Struct, CDataExt_Array, CDataExt_Value, + CDataExtWriteContext, cdata_ext_Vec3s, INDENT, ) @@ -60,13 +61,13 @@ class CollisionPolyListResource(CDataResource): resource: "CollisionPolyListResource", memory_context: "MemoryContext", v, - f: io.TextIOBase, - line_prefix, + wctx: CDataExtWriteContext, ): assert isinstance(v, list) assert len(v) == 3 vtxData = v - f.write(line_prefix) + f = wctx.f + f.write(wctx.line_prefix) f.write("{\n") for i in range(3): vI = vtxData[i] @@ -93,10 +94,10 @@ class CollisionPolyListResource(CDataResource): flags_str = " | ".join(flags_str_list) else: flags_str = "0" - f.write(line_prefix) + f.write(wctx.line_prefix) f.write(INDENT) f.write(f"{vtxId} | (({flags_str}) << 13), // {i}\n") - f.write(line_prefix) + f.write(wctx.line_prefix) f.write("}") return True @@ -104,13 +105,12 @@ class CollisionPolyListResource(CDataResource): resource: "CollisionPolyListResource", memory_context: "MemoryContext", v, - f: io.TextIOBase, - line_prefix, + wctx: CDataExtWriteContext, ): assert isinstance(v, int) nf = v / 0x7FFF - f.write(line_prefix) - f.write(f"COLPOLY_SNORMAL({nf})") + wctx.f.write(wctx.line_prefix) + wctx.f.write(f"COLPOLY_SNORMAL({nf})") return True @@ -166,13 +166,13 @@ class CollisionSurfaceTypeListResource(CDataResource): resource: "CollisionSurfaceTypeListResource", memory_context: "MemoryContext", v, - f: io.TextIOBase, - line_prefix, + wctx: CDataExtWriteContext, ): assert isinstance(v, list) assert len(v) == 2 + f = wctx.f - f.write(line_prefix) + f.write(wctx.line_prefix) f.write("{\n") for i_data, bitfield_info in ( @@ -206,7 +206,7 @@ class CollisionSurfaceTypeListResource(CDataResource): data_val = v[i_data] - f.write(line_prefix) + f.write(wctx.line_prefix) f.write(INDENT) f.write("(\n") @@ -214,7 +214,7 @@ class CollisionSurfaceTypeListResource(CDataResource): for mask, shift, name in bitfield_info: val = (data_val & mask) >> shift - f.write(line_prefix) + f.write(wctx.line_prefix) f.write(INDENT * 2) if has_prev: f.write("| ") @@ -225,11 +225,11 @@ class CollisionSurfaceTypeListResource(CDataResource): has_prev = True - f.write(line_prefix) + f.write(wctx.line_prefix) f.write(INDENT) f.write(f"), // {i_data}\n") - f.write(line_prefix) + f.write(wctx.line_prefix) f.write("}") return True @@ -294,16 +294,15 @@ class CollisionBgCamListResource(CDataResource): resource: "CollisionSurfaceTypeListResource", memory_context: "MemoryContext", v, - f: io.TextIOBase, - line_prefix, + wctx: CDataExtWriteContext, ): assert isinstance(v, int) address = v - f.write(line_prefix) + wctx.f.write(wctx.line_prefix) if address != 0: - f.write(memory_context.get_c_reference_at_segmented(address)) + wctx.f.write(memory_context.get_c_reference_at_segmented(address)) else: - f.write("NULL") + wctx.f.write("NULL") return True cdata_ext_elem = CDataExt_Struct( @@ -428,11 +427,10 @@ class CollisionResource(CDataResource): resource: "CollisionResource", memory_context: "MemoryContext", v, - f: io.TextIOBase, - line_prefix, + wctx: CDataExtWriteContext, ): - f.write(line_prefix) - f.write( + wctx.f.write(wctx.line_prefix) + wctx.f.write( memory_context.get_c_expression_length_at_segmented( resource.cdata_unpacked["vtxList"] ) @@ -463,23 +461,21 @@ class CollisionResource(CDataResource): resource: "CollisionResource", memory_context: "MemoryContext", v, - f: io.TextIOBase, - line_prefix, + wctx: CDataExtWriteContext, ): assert isinstance(v, int) - f.write(line_prefix) - f.write(memory_context.get_c_reference_at_segmented(v)) + wctx.f.write(wctx.line_prefix) + wctx.f.write(memory_context.get_c_reference_at_segmented(v)) return True def write_numPolygons( resource: "CollisionResource", memory_context: "MemoryContext", v, - f: io.TextIOBase, - line_prefix, + wctx: CDataExtWriteContext, ): - f.write(line_prefix) - f.write( + wctx.f.write(wctx.line_prefix) + wctx.f.write( memory_context.get_c_expression_length_at_segmented( resource.cdata_unpacked["polyList"] ) @@ -510,32 +506,30 @@ class CollisionResource(CDataResource): resource: "CollisionResource", memory_context: "MemoryContext", v, - f: io.TextIOBase, - line_prefix, + wctx: CDataExtWriteContext, ): assert isinstance(v, int) address = v - f.write(line_prefix) - f.write(memory_context.get_c_reference_at_segmented(address)) + wctx.f.write(wctx.line_prefix) + wctx.f.write(memory_context.get_c_reference_at_segmented(address)) return True def write_numWaterBoxes( resource: "CollisionResource", memory_context: "MemoryContext", v, - f: io.TextIOBase, - line_prefix, + wctx: CDataExtWriteContext, ): - f.write(line_prefix) + wctx.f.write(wctx.line_prefix) length = resource.cdata_unpacked["numWaterBoxes"] if length != 0: - f.write( + wctx.f.write( memory_context.get_c_expression_length_at_segmented( resource.cdata_unpacked["waterBoxes"] ) ) else: - f.write("0") + wctx.f.write("0") return True def report_waterBoxes( @@ -565,36 +559,34 @@ class CollisionResource(CDataResource): resource: "CollisionResource", memory_context: "MemoryContext", v, - f: io.TextIOBase, - line_prefix, + wctx: CDataExtWriteContext, ): assert isinstance(v, int) - f.write(line_prefix) - f.write(memory_context.get_c_reference_at_segmented(v)) + wctx.f.write(wctx.line_prefix) + wctx.f.write(memory_context.get_c_reference_at_segmented(v)) return True def write_bgCamList( resource: "CollisionResource", memory_context: "MemoryContext", v, - f: io.TextIOBase, - line_prefix, + wctx: CDataExtWriteContext, ): assert isinstance(v, int) - f.write(line_prefix) - f.write(memory_context.get_c_reference_at_segmented(v)) + wctx.f.write(wctx.line_prefix) + wctx.f.write(memory_context.get_c_reference_at_segmented(v)) return True def write_waterBoxes( resource: "CollisionResource", memory_context: "MemoryContext", v, - f: io.TextIOBase, - line_prefix, + wctx: CDataExtWriteContext, ): assert isinstance(v, int) length = resource.cdata_unpacked["numWaterBoxes"] - f.write(line_prefix) + f = wctx.f + f.write(wctx.line_prefix) if length != 0: f.write(memory_context.get_c_reference_at_segmented(v)) else: diff --git a/tools/assets/extract/extase_oot64/dlist_resources.py b/tools/assets/extract/extase_oot64/dlist_resources.py index f2ec53997d..a89f377e01 100644 --- a/tools/assets/extract/extase_oot64/dlist_resources.py +++ b/tools/assets/extract/extase_oot64/dlist_resources.py @@ -27,6 +27,7 @@ from ..extase.cdata_resources import ( CDataExt_Array, CDataExt_Struct, CDataExt_Value, + CDataExtWriteContext, INDENT, ) @@ -38,19 +39,21 @@ VERBOSE_BEST_EFFORT_TLUT_NO_REAL_USER = True class MtxResource(CDataResource): - def write_mtx(resource, memory_context, v, f: io.TextIOBase, line_prefix): + + def write_mtx(resource, memory_context, v, wctx: CDataExtWriteContext): assert isinstance(v, dict) assert v.keys() == {"intPart", "fracPart"} intPart = v["intPart"] fracPart = v["fracPart"] - f.write(line_prefix) + f = wctx.f + f.write(wctx.line_prefix) f.write("gdSPDefMtx(\n") for i in range(4): if i != 0: f.write(",\n") - f.write(line_prefix + INDENT) + f.write(wctx.line_prefix + INDENT) for j in range(4): # #define IPART(x) (((s32)((x) * 0x10000) >> 16) & 0xFFFF) @@ -75,7 +78,7 @@ class MtxResource(CDataResource): f.write(f"{x}f") f.write("\n") - f.write(line_prefix) + f.write(wctx.line_prefix) f.write(")") return True @@ -98,10 +101,10 @@ class MtxResource(CDataResource): class VtxArrayResource(CDataResource): - def write_elem(resource, memory_context, v, f: io.TextIOBase, line_prefix): + def write_elem(resource, memory_context, v, wctx: CDataExtWriteContext): assert isinstance(v, dict) - f.write(line_prefix) - f.write( + wctx.f.write(wctx.line_prefix) + wctx.f.write( f"VTX({v['x']:6}, {v['y']:6}, {v['z']:6}, " f"{v['s']:#7X}, {v['t']:#7X}, " f"{v['crnx']:#04X}, {v['cgny']:#04X}, {v['cbnz']:#04X}, {v['a']:#04X})" @@ -1464,16 +1467,15 @@ def write_gfx_segmented( resource: Resource, memory_context: "MemoryContext", v, - f: io.TextIOBase, - line_prefix: str, + wctx:CDataExtWriteContext, ): assert isinstance(v, int) address = v - f.write(line_prefix) + wctx.f.write(wctx.line_prefix) if address == 0: - f.write("NULL") + wctx.f.write("NULL") else: - f.write(memory_context.get_c_reference_at_segmented(address)) + wctx.f.write(memory_context.get_c_reference_at_segmented(address)) return True diff --git a/tools/assets/extract/extase_oot64/playeranim_resources.py b/tools/assets/extract/extase_oot64/playeranim_resources.py index f825d0e8e7..b3fa17a4bc 100644 --- a/tools/assets/extract/extase_oot64/playeranim_resources.py +++ b/tools/assets/extract/extase_oot64/playeranim_resources.py @@ -1,8 +1,6 @@ from typing import TYPE_CHECKING if TYPE_CHECKING: - import io - from ..extase import MemoryContext from ..extase.cdata_resources import ( @@ -10,6 +8,7 @@ from ..extase.cdata_resources import ( CDataArrayResource, CDataExt_Struct, CDataExt_Value, + CDataExtWriteContext, ) @@ -49,12 +48,12 @@ class PlayerAnimationResource(CDataResource): player_animation_data_res.set_frame_count(v["common"]["frameCount"]) def write_frameCount( - resource, memory_context: "MemoryContext", v, f: "io.TextIOBase", line_prefix + resource, memory_context: "MemoryContext", v, wctx: CDataExtWriteContext ): address = resource.cdata_unpacked["segment"] assert isinstance(address, int) - f.write(line_prefix) - f.write( + wctx.f.write(wctx.line_prefix) + wctx.f.write( memory_context.resolve_segmented(address) .get_resource(PlayerAnimationDataResource) .frame_count_name @@ -62,12 +61,12 @@ class PlayerAnimationResource(CDataResource): return True def write_segment( - resource, memory_context: "MemoryContext", v, f: "io.TextIOBase", line_prefix + resource, memory_context: "MemoryContext", v, wctx: CDataExtWriteContext ): assert isinstance(v, int) address = v - f.write(line_prefix) - f.write(memory_context.get_c_reference_at_segmented(address)) + wctx.f.write(wctx.line_prefix) + wctx.f.write(memory_context.get_c_reference_at_segmented(address)) return True cdata_ext = CDataExt_Struct( diff --git a/tools/assets/extract/extase_oot64/room_shape_resources.py b/tools/assets/extract/extase_oot64/room_shape_resources.py index f07f63a539..f7a65285fa 100644 --- a/tools/assets/extract/extase_oot64/room_shape_resources.py +++ b/tools/assets/extract/extase_oot64/room_shape_resources.py @@ -20,6 +20,7 @@ from ..extase.cdata_resources import ( CDataArrayNamedLengthResource, CDataExt_Struct, CDataExt_Value, + CDataExtWriteContext, cdata_ext_Vec3s, ) @@ -114,12 +115,12 @@ class RoomShapeNormalEntryArrayResource(CDataArrayNamedLengthResource): class RoomShapeNormalResource(CDataResource): def write_numEntries( - resource, memory_context: "MemoryContext", v, f: io.TextIOBase, line_prefix: str + resource, memory_context: "MemoryContext", v, wctx: CDataExtWriteContext ): address = resource.cdata_unpacked["entries"] assert isinstance(address, int) - f.write(line_prefix) - f.write(memory_context.get_c_expression_length_at_segmented(address)) + wctx.f.write(wctx.line_prefix) + wctx.f.write(memory_context.get_c_expression_length_at_segmented(address)) return True def report_entries(resource, memory_context: "MemoryContext", v): @@ -139,23 +140,23 @@ class RoomShapeNormalResource(CDataResource): entries_resource.set_length(numEntries) def write_entries( - resource, memory_context: "MemoryContext", v, f: io.TextIOBase, line_prefix: str + resource, memory_context: "MemoryContext", v, wctx: CDataExtWriteContext ): assert isinstance(v, int) address = v - f.write(line_prefix) - f.write(memory_context.get_c_reference_at_segmented(address)) + wctx.f.write(wctx.line_prefix) + wctx.f.write(memory_context.get_c_reference_at_segmented(address)) return True def write_entriesEnd( - resource, memory_context: "MemoryContext", v, f: io.TextIOBase, line_prefix: str + resource, memory_context: "MemoryContext", v, wctx: CDataExtWriteContext ): address = resource.cdata_unpacked["entries"] assert isinstance(address, int) - f.write(line_prefix) - f.write(memory_context.get_c_reference_at_segmented(address)) - f.write(" + ") - f.write(memory_context.get_c_expression_length_at_segmented(address)) + wctx.f.write(wctx.line_prefix) + wctx.f.write(memory_context.get_c_reference_at_segmented(address)) + wctx.f.write(" + ") + wctx.f.write(memory_context.get_c_expression_length_at_segmented(address)) return True cdata_ext = CDataExt_Struct( @@ -211,12 +212,12 @@ def report_RoomShapeImageBase_entry(resource, memory_context: "MemoryContext", v def write_RoomShapeImageBase_entry( - resource, memory_context: "MemoryContext", v, f: io.TextIOBase, line_prefix + resource, memory_context: "MemoryContext", v, wctx: CDataExtWriteContext ): assert isinstance(v, int) address = v - f.write(line_prefix) - f.write(memory_context.get_c_reference_at_segmented(address)) + wctx.f.write(wctx.line_prefix) + wctx.f.write(memory_context.get_c_reference_at_segmented(address)) return True @@ -287,12 +288,12 @@ class RoomShapeImageSingleResource(CDataResource): ) def write_source( - resource, memory_context: "MemoryContext", v, f: io.TextIOBase, line_prefix + resource, memory_context: "MemoryContext", v, wctx: CDataExtWriteContext ): assert isinstance(v, int) address = v - f.write(line_prefix) - f.write(memory_context.get_c_reference_at_segmented(address)) + wctx.f.write(wctx.line_prefix) + wctx.f.write(memory_context.get_c_reference_at_segmented(address)) return True cdata_ext = CDataExt_Struct( @@ -340,12 +341,12 @@ class RoomShapeImageMultiBgEntryArrayResource(CDataArrayNamedLengthResource): ) def write_source( - resource, memory_context: "MemoryContext", v, f: io.TextIOBase, line_prefix + resource, memory_context: "MemoryContext", v, wctx: CDataExtWriteContext ): assert isinstance(v, int) address = v - f.write(line_prefix) - f.write(memory_context.get_c_reference_at_segmented(address)) + wctx.f.write(wctx.line_prefix) + wctx.f.write(memory_context.get_c_reference_at_segmented(address)) return True elem_cdata_ext = CDataExt_Struct( @@ -375,15 +376,15 @@ class RoomShapeImageMultiBgEntryArrayResource(CDataArrayNamedLengthResource): class RoomShapeImageMultiResource(CDataResource): def write_numBackgrounds( - resource, memory_context: "MemoryContext", v, f: io.TextIOBase, line_prefix + resource, memory_context: "MemoryContext", v, wctx: CDataExtWriteContext ): address = resource.cdata_unpacked["backgrounds"] assert isinstance(address, int) backgrounds_resource = memory_context.resolve_segmented(address).get_resource( RoomShapeImageMultiBgEntryArrayResource ) - f.write(line_prefix) - f.write(backgrounds_resource.length_name) + wctx.f.write(wctx.line_prefix) + wctx.f.write(backgrounds_resource.length_name) return True def report_backgrounds(resource, memory_context: "MemoryContext", v): @@ -402,12 +403,12 @@ class RoomShapeImageMultiResource(CDataResource): backgrounds_resource.set_length(resource.cdata_unpacked["numBackgrounds"]) def write_backgrounds( - resource, memory_context: "MemoryContext", v, f: io.TextIOBase, line_prefix + resource, memory_context: "MemoryContext", v, wctx: CDataExtWriteContext ): assert isinstance(v, int) address = v - f.write(line_prefix) - f.write(memory_context.get_c_reference_at_segmented(address)) + wctx.f.write(wctx.line_prefix) + wctx.f.write(memory_context.get_c_reference_at_segmented(address)) return True cdata_ext = CDataExt_Struct( @@ -453,12 +454,12 @@ class RoomShapeCullableEntryArrayResource(CDataArrayNamedLengthResource): class RoomShapeCullableResource(CDataResource): def write_numEntries( - resource, memory_context: "MemoryContext", v, f: io.TextIOBase, line_prefix: str + resource, memory_context: "MemoryContext", v, wctx: CDataExtWriteContext ): address = resource.cdata_unpacked["entries"] assert isinstance(address, int) - f.write(line_prefix) - f.write(memory_context.get_c_expression_length_at_segmented(address)) + wctx.f.write(wctx.line_prefix) + wctx.f.write(memory_context.get_c_expression_length_at_segmented(address)) return True def report_entries(resource, memory_context: "MemoryContext", v): @@ -478,23 +479,23 @@ class RoomShapeCullableResource(CDataResource): entries_resource.set_length(numEntries) def write_entries( - resource, memory_context: "MemoryContext", v, f: io.TextIOBase, line_prefix: str + resource, memory_context: "MemoryContext", v, wctx: CDataExtWriteContext ): assert isinstance(v, int) address = v - f.write(line_prefix) - f.write(memory_context.get_c_reference_at_segmented(address)) + wctx.f.write(wctx.line_prefix) + wctx.f.write(memory_context.get_c_reference_at_segmented(address)) return True def write_entriesEnd( - resource, memory_context: "MemoryContext", v, f: io.TextIOBase, line_prefix: str + resource, memory_context: "MemoryContext", v, wctx: CDataExtWriteContext ): address = resource.cdata_unpacked["entries"] assert isinstance(address, int) - f.write(line_prefix) - f.write(memory_context.get_c_reference_at_segmented(address)) - f.write(" + ") - f.write(memory_context.get_c_expression_length_at_segmented(address)) + wctx.f.write(wctx.line_prefix) + wctx.f.write(memory_context.get_c_reference_at_segmented(address)) + wctx.f.write(" + ") + wctx.f.write(memory_context.get_c_expression_length_at_segmented(address)) return True cdata_ext = CDataExt_Struct( diff --git a/tools/assets/extract/extase_oot64/scene_commands_resource.py b/tools/assets/extract/extase_oot64/scene_commands_resource.py index 4abfacc137..4f22b3696f 100644 --- a/tools/assets/extract/extase_oot64/scene_commands_resource.py +++ b/tools/assets/extract/extase_oot64/scene_commands_resource.py @@ -17,6 +17,7 @@ from ..extase import ( from ..extase.cdata_resources import ( CDataArrayResource, CDataExt_Value, + CDataExtWriteContext, ) from .. import oot64_data @@ -638,15 +639,15 @@ class AltHeadersResource(CDataArrayResource): ) def write_elem( - resource, memory_context: "MemoryContext", v, f: io.TextIOBase, line_prefix: str + resource, memory_context: "MemoryContext", v, wctx: CDataExtWriteContext ): assert isinstance(v, int) address = v - f.write(line_prefix) + wctx.f.write(wctx.line_prefix) if address == 0: - f.write("NULL") + wctx.f.write("NULL") else: - f.write(memory_context.get_c_reference_at_segmented(address)) + wctx.f.write(memory_context.get_c_reference_at_segmented(address)) return True elem_cdata_ext = ( diff --git a/tools/assets/extract/extase_oot64/scene_rooms_resources.py b/tools/assets/extract/extase_oot64/scene_rooms_resources.py index 6ad9aa7af2..43bb44a341 100644 --- a/tools/assets/extract/extase_oot64/scene_rooms_resources.py +++ b/tools/assets/extract/extase_oot64/scene_rooms_resources.py @@ -17,6 +17,7 @@ from ..extase.cdata_resources import ( CDataExt_Struct, CDataExt_Array, CDataExt_Value, + CDataExtWriteContext, cdata_ext_Vec3s, INDENT, Vec3sArrayResource, @@ -65,26 +66,27 @@ def fmt_hex_u(v: int, nibbles: int = 0): class ActorEntryListResource(CDataArrayNamedLengthResource): - def write_elem(resource, memory_context, v, f: io.TextIOBase, line_prefix: str): + def write_elem(resource, memory_context, v, wctx: CDataExtWriteContext): assert isinstance(v, dict) - f.write(line_prefix) + f = wctx.f + f.write(wctx.line_prefix) f.write("{\n") - f.write(line_prefix + INDENT) + f.write(wctx.line_prefix + INDENT) f.write(oot64_data.get_actor_id_name(v["id"])) f.write(",\n") - f.write(line_prefix + INDENT) + f.write(wctx.line_prefix + INDENT) f.write("{ ") f.write(", ".join(f"{p:6}" for p in (v["pos"][axis] for axis in "xyz"))) f.write(" }, // pos\n") - f.write(line_prefix + INDENT) + f.write(wctx.line_prefix + INDENT) f.write("{ ") f.write(", ".join(fmt_hex_s(r, 4) for r in (v["rot"][axis] for axis in "xyz"))) f.write(" }, // rot\n") - f.write(line_prefix + INDENT) + f.write(wctx.line_prefix + INDENT) params = v["params"] f.write(fmt_hex_s(params, 4)) if params < 0: @@ -92,7 +94,7 @@ class ActorEntryListResource(CDataArrayNamedLengthResource): f.write(f" /* 0x{params_u16:04X} */") f.write(", // params\n") - f.write(line_prefix) + f.write(wctx.line_prefix) f.write("}") return True @@ -120,7 +122,7 @@ class ObjectListResource(CDataArrayNamedLengthResource): def write_RomFile( - resource, memory_context: "MemoryContext", v, f: io.TextIOBase, line_prefix: str + resource, memory_context: "MemoryContext", v, wctx: CDataExtWriteContext ): assert isinstance(v, dict) vromStart = v["vromStart"] @@ -128,8 +130,8 @@ def write_RomFile( rom_file_name = memory_context.get_dmadata_table_rom_file_name_from_vrom( vromStart, vromEnd ) - f.write(line_prefix) - f.write(f"ROM_FILE({rom_file_name})") + wctx.f.write(wctx.line_prefix) + wctx.f.write(f"ROM_FILE({rom_file_name})") return True @@ -302,40 +304,41 @@ class EnvLightSettingsListResource(CDataArrayNamedLengthResource): class TransitionActorEntryListResource(CDataArrayNamedLengthResource): - def write_elem(resource, memory_context, v, f: io.TextIOBase, line_prefix: str): + def write_elem(resource, memory_context, v, wctx: CDataExtWriteContext): assert isinstance(v, dict) - f.write(line_prefix) + f = wctx.f + f.write(wctx.line_prefix) f.write("{\n") - f.write(line_prefix + INDENT) + f.write(wctx.line_prefix + INDENT) f.write("{\n") - f.write(line_prefix + 2 * INDENT) + f.write(wctx.line_prefix + 2 * INDENT) f.write("// { room, bgCamIndex }\n") for side_i in range(2): side = v["sides"][side_i] room = side["room"] bgCamIndex = side["bgCamIndex"] - f.write(line_prefix + 2 * INDENT) + f.write(wctx.line_prefix + 2 * INDENT) f.write("{ ") f.write(f"{room}, {bgCamIndex}") f.write(" },\n") - f.write(line_prefix + INDENT) + f.write(wctx.line_prefix + INDENT) f.write("}, // sides\n") - f.write(line_prefix + INDENT) + f.write(wctx.line_prefix + INDENT) f.write(oot64_data.get_actor_id_name(v["id"])) f.write(",\n") - f.write(line_prefix + INDENT) + f.write(wctx.line_prefix + INDENT) f.write("{ ") f.write(", ".join(f"{p:6}" for p in (v["pos"][axis] for axis in "xyz"))) f.write(" }, // pos\n") - f.write(line_prefix + INDENT) + f.write(wctx.line_prefix + INDENT) f.write(fmt_hex_s(v["rotY"], 4)) f.write(", // rotY\n") - f.write(line_prefix + INDENT) + f.write(wctx.line_prefix + INDENT) params = v["params"] f.write(fmt_hex_s(params, 4)) if params < 0: @@ -343,7 +346,7 @@ class TransitionActorEntryListResource(CDataArrayNamedLengthResource): f.write(f" /* 0x{params_u16:04X} */") f.write(", // params\n") - f.write(line_prefix) + f.write(wctx.line_prefix) f.write("}") return True @@ -390,14 +393,15 @@ class PathListResource(CDataArrayResource): ) def write_elem( - resource, memory_context: "MemoryContext", v, f: io.TextIOBase, line_prefix: str + resource, memory_context: "MemoryContext", v, wctx: CDataExtWriteContext ): assert isinstance(v, dict) count = v["count"] assert isinstance(count, int) points = v["points"] assert isinstance(points, int) - f.write(line_prefix) + f = wctx.f + f.write(wctx.line_prefix) f.write("{ ") f.write(memory_context.get_c_expression_length_at_segmented(points)) f.write(", ") diff --git a/tools/assets/extract/extase_oot64/skelanime_legacy_resources.py b/tools/assets/extract/extase_oot64/skelanime_legacy_resources.py index 72c6e42ce4..4e2899b93a 100644 --- a/tools/assets/extract/extase_oot64/skelanime_legacy_resources.py +++ b/tools/assets/extract/extase_oot64/skelanime_legacy_resources.py @@ -10,6 +10,7 @@ from ..extase.cdata_resources import ( CDataResource, CDataArrayResource, CDataExt_Struct, + CDataExtWriteContext, cdata_ext_Vec3f, cdata_ext_Vec3s, CDataExt_Value, @@ -38,15 +39,15 @@ class LegacyLimbResource(CDataResource): ) def write_limb( - resource, memory_context: "MemoryContext", v, f: io.TextIOBase, line_prefix + resource, memory_context: "MemoryContext", v, wctx: CDataExtWriteContext ): assert isinstance(v, int) address = v - f.write(line_prefix) + wctx.f.write(wctx.line_prefix) if address == 0: - f.write("NULL") + wctx.f.write("NULL") else: - f.write(memory_context.get_c_reference_at_segmented(address)) + wctx.f.write(memory_context.get_c_reference_at_segmented(address)) return True cdata_ext = CDataExt_Struct( @@ -101,21 +102,21 @@ class LegacyJointKeyArrayResource(CDataArrayResource): class LegacyAnimationResource(CDataResource): def write_frameData( - resource, memory_context: "MemoryContext", v, f: io.TextIOBase, line_prefix + resource, memory_context: "MemoryContext", v, wctx: CDataExtWriteContext ): assert isinstance(v, int) address = v - f.write(line_prefix) - f.write(memory_context.get_c_reference_at_segmented(address)) + wctx.f.write(wctx.line_prefix) + wctx.f.write(memory_context.get_c_reference_at_segmented(address)) return True def write_jointKey( - resource, memory_context: "MemoryContext", v, f: io.TextIOBase, line_prefix + resource, memory_context: "MemoryContext", v, wctx: CDataExtWriteContext ): assert isinstance(v, int) address = v - f.write(line_prefix) - f.write(memory_context.get_c_reference_at_segmented(address)) + wctx.f.write(wctx.line_prefix) + wctx.f.write(memory_context.get_c_reference_at_segmented(address)) return True cdata_ext = CDataExt_Struct( diff --git a/tools/assets/extract/extase_oot64/skelcurve_resources.py b/tools/assets/extract/extase_oot64/skelcurve_resources.py index d3c3e9c730..eacde3e854 100644 --- a/tools/assets/extract/extase_oot64/skelcurve_resources.py +++ b/tools/assets/extract/extase_oot64/skelcurve_resources.py @@ -15,6 +15,7 @@ from ..extase.cdata_resources import ( CDataExt_Struct, CDataExt_Value, CDataExt_Array, + CDataExtWriteContext, ) from . import dlist_resources @@ -117,12 +118,12 @@ class CurveAnimationHeaderResource(CDataResource): ) def write_knotCounts( - resource, memory_context: "MemoryContext", v, f: io.TextIOBase, line_prefix + resource, memory_context: "MemoryContext", v, wctx: CDataExtWriteContext ): assert isinstance(v, int) address = v - f.write(line_prefix) - f.write(memory_context.get_c_reference_at_segmented(address)) + wctx.f.write(wctx.line_prefix) + wctx.f.write(memory_context.get_c_reference_at_segmented(address)) return True def report_interpolationData(resource, memory_context: "MemoryContext", v): @@ -138,12 +139,12 @@ class CurveAnimationHeaderResource(CDataResource): ) def write_interpolationData( - resource, memory_context: "MemoryContext", v, f: io.TextIOBase, line_prefix + resource, memory_context: "MemoryContext", v, wctx: CDataExtWriteContext ): assert isinstance(v, int) address = v - f.write(line_prefix) - f.write(memory_context.get_c_reference_at_segmented(address)) + wctx.f.write(wctx.line_prefix) + wctx.f.write(memory_context.get_c_reference_at_segmented(address)) return True def report_constantData(resource, memory_context: "MemoryContext", v): @@ -159,12 +160,12 @@ class CurveAnimationHeaderResource(CDataResource): ) def write_constantData( - resource, memory_context: "MemoryContext", v, f: io.TextIOBase, line_prefix + resource, memory_context: "MemoryContext", v, wctx: CDataExtWriteContext ): assert isinstance(v, int) address = v - f.write(line_prefix) - f.write(memory_context.get_c_reference_at_segmented(address)) + wctx.f.write(wctx.line_prefix) + wctx.f.write(memory_context.get_c_reference_at_segmented(address)) return True cdata_ext = CDataExt_Struct( @@ -283,12 +284,12 @@ class SkelCurveLimbArrayResource(CDataResource): ) def write_limb_element( - resource, memory_context: "MemoryContext", v, f: io.TextIOBase, line_prefix + resource, memory_context: "MemoryContext", v, wctx: CDataExtWriteContext ): assert isinstance(v, int) address = v - f.write(line_prefix) - f.write(memory_context.get_c_reference_at_segmented(address)) + wctx.f.write(wctx.line_prefix) + wctx.f.write(memory_context.get_c_reference_at_segmented(address)) return True elem_cdata_ext = ( @@ -328,12 +329,12 @@ class CurveSkeletonHeaderResource(CDataResource): ) def write_limbs( - resource, memory_context: "MemoryContext", v, f: io.TextIOBase, line_prefix + resource, memory_context: "MemoryContext", v, wctx: CDataExtWriteContext ): assert isinstance(v, int) address = v - f.write(line_prefix) - f.write(memory_context.get_c_reference_at_segmented(address)) + wctx.f.write(wctx.line_prefix) + wctx.f.write(memory_context.get_c_reference_at_segmented(address)) return True cdata_ext = CDataExt_Struct( diff --git a/tools/assets/extract/extase_oot64/skeleton_resources.py b/tools/assets/extract/extase_oot64/skeleton_resources.py index d4c99a7dec..1d67213783 100644 --- a/tools/assets/extract/extase_oot64/skeleton_resources.py +++ b/tools/assets/extract/extase_oot64/skeleton_resources.py @@ -17,6 +17,7 @@ from ..extase.cdata_resources import ( CDataExt_Value, CDataExt_Struct, CDataExt_Array, + CDataExtWriteContext, cdata_ext_Vec3s, ) @@ -25,10 +26,11 @@ from . import dlist_resources class StandardLimbResource(CDataResource): def write_limb_index( - resource, memory_context: "MemoryContext", v, f: io.TextIOBase, line_prefix + resource, memory_context: "MemoryContext", v, wctx: CDataExtWriteContext ): assert isinstance(v, int) - f.write(line_prefix) + f = wctx.f + f.write(wctx.line_prefix) if resource.skeleton_resource is None: f.write(f"{v}") else: @@ -109,12 +111,12 @@ class LimbsArrayResourceABC(CDataArrayResource): c_limb_type: str def write_limb_element( - resource, memory_context: "MemoryContext", v, f: io.TextIOBase, line_prefix + resource, memory_context: "MemoryContext", v, wctx: CDataExtWriteContext ): assert isinstance(v, int) address = v - f.write(line_prefix) - f.write(memory_context.get_c_reference_at_segmented(address)) + wctx.f.write(wctx.line_prefix) + wctx.f.write(memory_context.get_c_reference_at_segmented(address)) return True elem_cdata_ext = CDataExt_Value("I").set_write(write_limb_element) @@ -239,19 +241,19 @@ class SkeletonResourceABC(SkeletonResourceBaseABC): ) def write_segment( - resource, memory_context: "MemoryContext", v, f: io.TextIOBase, line_prefix + resource, memory_context: "MemoryContext", v, wctx: CDataExtWriteContext ): assert isinstance(v, int) address = v - f.write(line_prefix) - f.write(memory_context.get_c_reference_at_segmented(address)) + wctx.f.write(wctx.line_prefix) + wctx.f.write(memory_context.get_c_reference_at_segmented(address)) return True def write_limbCount( - resource, memory_context: "MemoryContext", v, f: io.TextIOBase, line_prefix + resource, memory_context: "MemoryContext", v, wctx: CDataExtWriteContext ): - f.write(line_prefix) - f.write( + wctx.f.write(wctx.line_prefix) + wctx.f.write( memory_context.get_c_expression_length_at_segmented( resource.get_skeleton_header_cdata_unpacked()["segment"] ) diff --git a/tools/assets/extract/extase_oot64/skeleton_skin_resources.py b/tools/assets/extract/extase_oot64/skeleton_skin_resources.py index 0a3794ab4c..8d6ef20b4b 100644 --- a/tools/assets/extract/extase_oot64/skeleton_skin_resources.py +++ b/tools/assets/extract/extase_oot64/skeleton_skin_resources.py @@ -11,6 +11,7 @@ from ..extase.cdata_resources import ( CDataArrayResource, CDataExt_Value, CDataExt_Struct, + CDataExtWriteContext, cdata_ext_Vec3s, ) @@ -85,21 +86,21 @@ class SkinLimbModifArrayResource(CDataArrayResource): skin_vertices_res.set_length(v["transformCount"]) def write_skinVertices( - resource, memory_context: "MemoryContext", v, f: io.TextIOBase, line_prefix + resource, memory_context: "MemoryContext", v, wctx: CDataExtWriteContext ): assert isinstance(v, int) address = v - f.write(line_prefix) - f.write(memory_context.get_c_reference_at_segmented(address)) + wctx.f.write(wctx.line_prefix) + wctx.f.write(memory_context.get_c_reference_at_segmented(address)) return True def write_limbTransformations( - resource, memory_context: "MemoryContext", v, f: io.TextIOBase, line_prefix + resource, memory_context: "MemoryContext", v, wctx: CDataExtWriteContext ): assert isinstance(v, int) address = v - f.write(line_prefix) - f.write(memory_context.get_c_reference_at_segmented(address)) + wctx.f.write(wctx.line_prefix) + wctx.f.write(memory_context.get_c_reference_at_segmented(address)) return True elem_cdata_ext = CDataExt_Struct( @@ -140,12 +141,12 @@ class SkinAnimatedLimbDataResource(CDataResource): skin_vertices_res.set_length(resource.cdata_unpacked["limbModifCount"]) def write_limbModifications( - resource, memory_context: "MemoryContext", v, f: io.TextIOBase, line_prefix + resource, memory_context: "MemoryContext", v, wctx: CDataExtWriteContext ): assert isinstance(v, int) address = v - f.write(line_prefix) - f.write(memory_context.get_c_reference_at_segmented(address)) + wctx.f.write(wctx.line_prefix) + wctx.f.write(memory_context.get_c_reference_at_segmented(address)) return True cdata_ext = CDataExt_Struct( @@ -196,15 +197,15 @@ class SkinLimbResource(CDataResource): dlist_resources.report_gfx_segmented(resource, memory_context, address) def write_segment( - resource, memory_context: "MemoryContext", v, f: io.TextIOBase, line_prefix + resource, memory_context: "MemoryContext", v, wctx: CDataExtWriteContext ): assert isinstance(v, int) address = v - f.write(line_prefix) + wctx.f.write(wctx.line_prefix) if address == 0: - f.write("NULL") + wctx.f.write("NULL") else: - f.write(memory_context.get_c_reference_at_segmented(address)) + wctx.f.write(memory_context.get_c_reference_at_segmented(address)) return True cdata_ext = CDataExt_Struct(