mirror of
https://github.com/zeldaret/oot.git
synced 2025-08-28 01:41:20 +00:00
implement more skeleton-related types, cleanups, fixups
This commit is contained in:
parent
f70a07f8cf
commit
66db26a999
18 changed files with 459 additions and 128 deletions
|
@ -1,16 +1,12 @@
|
|||
from __future__ import annotations
|
||||
import io
|
||||
from typing import TYPE_CHECKING
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from ..extase.memorymap import MemoryContext
|
||||
|
||||
from ..extase import (
|
||||
File,
|
||||
ResourceParseWaiting,
|
||||
)
|
||||
from ..extase.cdata_resources import (
|
||||
CDataResource,
|
||||
CDataArrayResource,
|
||||
CDataExt_Value,
|
||||
CDataExt_Struct,
|
||||
CDataExt_Array,
|
||||
|
@ -40,15 +36,38 @@ class StandardLimbResource(CDataResource):
|
|||
raise ValueError()
|
||||
|
||||
|
||||
class LimbsArrayResource(CDataResource, can_size_be_unknown=True):
|
||||
class LODLimbResource(CDataResource):
|
||||
cdata_ext = CDataExt_Struct(
|
||||
(
|
||||
("jointPos", cdata_ext_Vec3s),
|
||||
("child", CDataExt_Value.u8),
|
||||
("sibling", CDataExt_Value.u8),
|
||||
("dLists", CDataExt_Array(dlist_resources.cdata_ext_gfx_segmented, 2)),
|
||||
)
|
||||
)
|
||||
|
||||
def get_c_declaration_base(self):
|
||||
return f"LodLimb {self.symbol_name}"
|
||||
|
||||
def get_c_reference(self, resource_offset: int):
|
||||
if resource_offset == 0:
|
||||
return f"&{self.symbol_name}"
|
||||
else:
|
||||
raise ValueError()
|
||||
|
||||
|
||||
class LimbsArrayResourceABC(CDataArrayResource):
|
||||
limb_type: type[CDataResource]
|
||||
c_limb_type: str
|
||||
|
||||
def report_limb_element(resource, memory_context: "MemoryContext", v):
|
||||
assert isinstance(v, int)
|
||||
address = v
|
||||
memory_context.report_resource_at_segmented(
|
||||
resource,
|
||||
address,
|
||||
StandardLimbResource,
|
||||
lambda file, offset: StandardLimbResource(
|
||||
resource.limb_type,
|
||||
lambda file, offset: resource.limb_type(
|
||||
file, offset, f"{resource.name}_{address:08X}"
|
||||
),
|
||||
)
|
||||
|
@ -68,51 +87,39 @@ class LimbsArrayResource(CDataResource, can_size_be_unknown=True):
|
|||
.set_write(write_limb_element)
|
||||
)
|
||||
|
||||
def __init__(self, file: File, range_start: int, name: str):
|
||||
super().__init__(file, range_start, name)
|
||||
self.length = None
|
||||
|
||||
def try_parse_data(self, memory_context: "MemoryContext"):
|
||||
if self.length is not None:
|
||||
self.cdata_ext = CDataExt_Array(self.elem_cdata_ext, self.length)
|
||||
self.range_end = self.range_start + self.cdata_ext.size
|
||||
return super().try_parse_data(memory_context)
|
||||
else:
|
||||
raise ResourceParseWaiting(waiting_for=["self.length"])
|
||||
|
||||
def get_c_declaration_base(self):
|
||||
return f"void* {self.symbol_name}[]"
|
||||
|
||||
def get_c_reference(self, resource_offset: int):
|
||||
if resource_offset == 0:
|
||||
return f"{self.symbol_name}"
|
||||
else:
|
||||
raise ValueError()
|
||||
|
||||
def get_c_expression_length(self, resource_offset: int):
|
||||
if resource_offset == 0:
|
||||
return f"ARRAY_COUNT({self.symbol_name})"
|
||||
else:
|
||||
raise ValueError()
|
||||
return f"{self.c_limb_type}* {self.symbol_name}[]"
|
||||
|
||||
|
||||
class SkeletonNormalResource(CDataResource):
|
||||
class StandardLimbsArrayResource(LimbsArrayResourceABC):
|
||||
limb_type = StandardLimbResource
|
||||
c_limb_type = "StandardLimb"
|
||||
|
||||
|
||||
class LODLimbsArrayResource(LimbsArrayResourceABC):
|
||||
limb_type = LODLimbResource
|
||||
c_limb_type = "LodLimb"
|
||||
|
||||
|
||||
class SkeletonResourceABC(CDataResource):
|
||||
limbs_array_type: type[LimbsArrayResourceABC]
|
||||
|
||||
def report_segment(resource, memory_context: "MemoryContext", v):
|
||||
assert isinstance(v, int)
|
||||
address = v
|
||||
resource_limbs = memory_context.report_resource_at_segmented(
|
||||
resource,
|
||||
address,
|
||||
LimbsArrayResource,
|
||||
lambda file, offset: LimbsArrayResource(
|
||||
resource.limbs_array_type,
|
||||
lambda file, offset: resource.limbs_array_type(
|
||||
file,
|
||||
offset,
|
||||
f"{resource.name}_{address:08X}_Limbs",
|
||||
),
|
||||
)
|
||||
resource_limbs.length = resource.get_skeleton_header_cdata_unpacked()[
|
||||
"limbCount"
|
||||
]
|
||||
resource_limbs.set_length(
|
||||
resource.get_skeleton_header_cdata_unpacked()["limbCount"]
|
||||
)
|
||||
|
||||
def write_segment(
|
||||
resource, memory_context: "MemoryContext", v, f: io.TextIOBase, line_prefix
|
||||
|
@ -162,18 +169,32 @@ class SkeletonNormalResource(CDataResource):
|
|||
return f"SkeletonHeader {self.symbol_name}"
|
||||
|
||||
|
||||
class SkeletonFlexResource(CDataResource):
|
||||
cdata_ext = CDataExt_Struct(
|
||||
(
|
||||
class SkeletonNormalResource(SkeletonResourceABC):
|
||||
limbs_array_type = StandardLimbsArrayResource
|
||||
|
||||
|
||||
class SkeletonNormalLODResource(SkeletonResourceABC):
|
||||
limbs_array_type = LODLimbsArrayResource
|
||||
|
||||
|
||||
class SkeletonFlexResourceABC(CDataResource):
|
||||
skeleton_type: type[SkeletonResourceABC]
|
||||
|
||||
# For SkeletonResourceABC.report_segment
|
||||
@property
|
||||
def limbs_array_type(self):
|
||||
return self.skeleton_type.limbs_array_type
|
||||
|
||||
def __init__(self, file, range_start, name):
|
||||
self.cdata_ext = CDataExt_Struct(
|
||||
(
|
||||
"sh",
|
||||
SkeletonNormalResource.cdata_ext,
|
||||
), # TODO FIXME this is bad, it ends up using StandardLimb s (or is it fine?)
|
||||
("dListCount", CDataExt_Value.u8),
|
||||
("pad9", CDataExt_Value.pad8),
|
||||
("pad10", CDataExt_Value.pad16),
|
||||
("sh", self.skeleton_type.cdata_ext),
|
||||
("dListCount", CDataExt_Value.u8),
|
||||
("pad9", CDataExt_Value.pad8),
|
||||
("pad10", CDataExt_Value.pad16),
|
||||
)
|
||||
)
|
||||
)
|
||||
super().__init__(file, range_start, name)
|
||||
|
||||
def get_skeleton_header_cdata_unpacked(self):
|
||||
return self.cdata_unpacked["sh"]
|
||||
|
@ -186,3 +207,11 @@ class SkeletonFlexResource(CDataResource):
|
|||
|
||||
def get_c_declaration_base(self):
|
||||
return f"FlexSkeletonHeader {self.symbol_name}"
|
||||
|
||||
|
||||
class SkeletonFlexResource(SkeletonFlexResourceABC):
|
||||
skeleton_type = SkeletonNormalResource
|
||||
|
||||
|
||||
class SkeletonFlexLODResource(SkeletonFlexResourceABC):
|
||||
skeleton_type = SkeletonNormalLODResource
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue