1
0
Fork 0
mirror of https://github.com/zeldaret/oot.git synced 2025-08-23 23:41:24 +00:00

introduce RawPointers xml attribute to ignore specific pointers and keep them raw

This commit is contained in:
Dragorn421 2025-02-09 12:19:44 +01:00
parent 6b857c6c71
commit bb7215b25a
No known key found for this signature in database
GPG key ID: 381AEBAF3D429335
6 changed files with 49 additions and 5 deletions

View file

@ -1,10 +1,11 @@
<Root>
<ExternalFile OutPath="assets/objects/gameplay_keep"/>
<File Name="object_ny" Segment="6">
<Texture Name="gEnNyRockBodyTex" OutName="rock_body" Format="rgba16" Width="16" Height="16" Offset="0x0000"/>
<Texture Name="gEnNySpikeTex" OutName="spike" Format="rgba16" Width="32" Height="32" Offset="0x0200"/>
<Texture Name="gEnNyMetalBodyTex" OutName="metal_body" Format="rgba16" Width="32" Height="32" Offset="0x0A00"/>
<DList Name="gEnNyRockBodyDL" Offset="0x1DD0"/>
<DList Name="gEnNyMetalBodyDL" Offset="0x1EA8"/>
<DList Name="gEnNySpikeDL" Offset="0x1FC8"/>
<DList Name="gEnNyMetalBodyDL" Offset="0x1EA8" RawPointers="0x07000000"/>
<DList Name="gEnNySpikeDL" Offset="0x1FC8" RawPointers="0x07000000"/>
</File>
</Root>

View file

@ -1,4 +1,5 @@
<Root>
<ExternalFile OutPath="assets/objects/gameplay_keep"/>
<File Name="object_zf" Segment="6">
<Texture Name="gZfDinolfosTLUT" OutName="zf_dinolfos_tlut" Format="rgba16" Width="16" Height="16" Offset="0x0"/>
<Texture Name="object_zf_Tex_000200" OutName="tex_00000200" Format="ci8" Width="8" Height="8" Offset="0x200" TlutOffset="0x0"/>
@ -109,7 +110,7 @@
<DList Name="gZfLizalfosRightFootDL" Offset="0xD798"/>
<DList Name="gZfLizalfosRightUpperArmDL" Offset="0xD968"/>
<DList Name="gZfLizalfosRightForearmDL" Offset="0xDAA0"/>
<DList Name="gZfLizalfosSwordDL" Offset="0xDD20"/>
<DList Name="gZfLizalfosSwordDL" Offset="0xDD20" RawPointers="0x07000000"/>
<DList Name="gZfEmptyHandDL" Offset="0xE198"/>
<DList Name="gZfLizalfosJawDL" Offset="0xE3E8"/>
<DList Name="gZfLizalfosHeadDL" Offset="0xE7E0"/>

View file

@ -7,6 +7,7 @@
</File>
<File Name="MIZUsin_room_0" Segment="3">
<Room Name="MIZUsin_room_0" Offset="0x0"/>
<DList Name="MIZUsin_room_0_030001D0_RoomShapeCullable_030001DC_CullableEntries_03015330_DL" Offset="0x15330" RawPointers="0x06000000"/>
</File>
<File Name="MIZUsin_room_1" Segment="3">
<Room Name="MIZUsin_room_1" Offset="0x0"/>

View file

@ -21,6 +21,8 @@ class GfxMicroCode(enum.Enum):
@dataclasses.dataclass(eq=False)
class DListResourceDesc(ResourceDesc):
ucode: GfxMicroCode
raw_pointers: set[int] = dataclasses.field(default_factory=set)
"""Pointers in the dlist that are fine to keep raw ("in hex") instead of using symbols"""
def handler_DList(symbol_name, offset, collection, reselem: Element):
@ -28,7 +30,12 @@ def handler_DList(symbol_name, offset, collection, reselem: Element):
ucode = GfxMicroCode[reselem.attrib["Ucode"].upper()]
else:
ucode = GfxMicroCode.F3DEX2
return DListResourceDesc(symbol_name, offset, collection, reselem, ucode)
res = DListResourceDesc(symbol_name, offset, collection, reselem, ucode)
raw_pointers_str = reselem.attrib.get("RawPointers")
if raw_pointers_str:
for rp_str in raw_pointers_str.split(","):
res.raw_pointers.add(int(rp_str, 16))
return res
@dataclasses.dataclass(eq=False)

View file

@ -645,6 +645,7 @@ def gfxdis(
def timg_callback_wrapper(timg, fmt, siz, width, height, pal):
try:
ret = timg_callback(timg, fmt, siz, width, height, pal)
assert isinstance(ret, int)
except:
import sys
@ -1096,6 +1097,7 @@ class DListResource(Resource, can_size_be_unknown=True):
):
super().__init__(file, range_start, None, name)
self.target_ucode = target_ucode
self.ignored_raw_pointers: set[int] = set()
def try_parse_data(self, memory_context):
offset = self.range_start
@ -1104,6 +1106,9 @@ class DListResource(Resource, can_size_be_unknown=True):
print(self.name, hex(offset))
def vtx_cb(vtx, num):
if vtx in self.ignored_raw_pointers:
return 0
# TODO be smarter about buffer merging
# (don't merge buffers from two different DLs, if they can be split cleanly)
# if that even happens
@ -1122,6 +1127,9 @@ class DListResource(Resource, can_size_be_unknown=True):
)
def timg_cb(timg, fmt, siz, width, height, pal):
if timg in self.ignored_raw_pointers:
return 0
g_fmt = G_IM_FMT.by_i[fmt]
g_siz = G_IM_SIZ.by_i[siz]
@ -1145,10 +1153,16 @@ class DListResource(Resource, can_size_be_unknown=True):
return 0
def tlut_cb(tlut, idx, count):
if tlut in self.ignored_raw_pointers:
return 0
ci_tex_manager.tlut(tlut, idx, count)
return 0
def mtx_cb(mtx):
if mtx in self.ignored_raw_pointers:
return 0
memory_context.report_resource_at_segmented(
self,
mtx,
@ -1160,6 +1174,9 @@ class DListResource(Resource, can_size_be_unknown=True):
return 0
def dl_cb(dl):
if dl in self.ignored_raw_pointers:
return 0
memory_context.report_resource_at_segmented(
self,
dl,
@ -1346,10 +1363,16 @@ class DListResource(Resource, can_size_be_unknown=True):
pygfxd.gfxd_arg_dflt(arg_num)
def vtx_cb(vtx, num):
if vtx in self.ignored_raw_pointers:
return 0
pygfxd.gfxd_puts(memory_context.get_c_reference_at_segmented(vtx))
return 1
def timg_cb(timg, fmt, siz, width, height, pal):
if timg in self.ignored_raw_pointers:
return 0
try:
timg_c_ref = memory_context.get_c_reference_at_segmented(timg)
# except NoSegmentBaseError: # TODO
@ -1371,16 +1394,25 @@ class DListResource(Resource, can_size_be_unknown=True):
return 0
def tlut_cb(tlut, idx, count):
if tlut in self.ignored_raw_pointers:
return 0
tlut_c_ref = memory_context.get_c_reference_at_segmented(tlut)
pygfxd.gfxd_puts(tlut_c_ref)
return 1
def mtx_cb(mtx):
if mtx in self.ignored_raw_pointers:
return 0
mtx_c_ref = memory_context.get_c_reference_at_segmented(mtx)
pygfxd.gfxd_puts(mtx_c_ref)
return 1
def dl_cb(dl):
if dl in self.ignored_raw_pointers:
return 0
dl_c_ref = memory_context.get_c_reference_at_segmented(dl)
pygfxd.gfxd_puts(dl_c_ref)
return 1

View file

@ -234,7 +234,7 @@ def register_resource_handlers():
file: File,
resource_desc: n64resources.DListResourceDesc,
):
return dlist_resources.DListResource(
res = dlist_resources.DListResource(
file,
resource_desc.offset,
resource_desc.symbol_name,
@ -243,6 +243,8 @@ def register_resource_handlers():
n64resources.GfxMicroCode.F3DEX2: dlist_resources.Ucode.f3dex2,
}[resource_desc.ucode],
)
res.ignored_raw_pointers |= resource_desc.raw_pointers
return res
def texture_resource_handler(
file: File, resource_desc: n64resources.TextureResourceDesc