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:
parent
6b857c6c71
commit
bb7215b25a
6 changed files with 49 additions and 5 deletions
|
@ -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>
|
||||
|
|
|
@ -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"/>
|
||||
|
|
|
@ -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"/>
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue