rewrite C TypeTreeHelper to match new version · roundRekt/UnityPy@229f23e · GitHub
Skip to content

Commit 229f23e

Browse files
committed
rewrite C TypeTreeHelper to match new version
1 parent ff2d036 commit 229f23e

19 files changed

Lines changed: 930 additions & 938 deletions

‎.gitignore‎

Lines changed: 1 addition & 0 deletions

‎UnityPy/classes/PPtr.py‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
T = TypeVar("T")
1111

1212

13-
@define
13+
@define(slots=True, kw_only=True)
1414
class PPtr(Generic[T]):
1515
m_FileID: int
1616
m_PathID: int

‎UnityPy/files/ObjectReader.py‎

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,11 @@ def read_typetree(
194194
self.reset()
195195
node = self._get_typetree_node(nodes)
196196
ret = TypeTreeHelper.read_typetree(
197-
node, self.reader, as_dict=not wrap, assetsfile=self.assets_file
197+
node,
198+
self.reader,
199+
as_dict=not wrap,
200+
assetsfile=self.assets_file,
201+
expected_read=self.byte_size,
198202
)
199203
if wrap:
200204
ret.set_object_reader(self)

‎UnityPy/helpers/TypeTreeHelper.py‎

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,12 @@
1414
if TYPE_CHECKING:
1515
from ..files.SerializedFile import SerializedFile
1616

17+
18+
try:
19+
from ..UnityPyBoost import read_typetree as read_typetree_boost
20+
except ImportError:
21+
read_typetree_boost = None
22+
1723
kAlignBytes = 0x4000
1824

1925
FUNCTION_MAP = {
@@ -85,6 +91,12 @@ def read_typetree(
8591
dict | objects.Object
8692
The parsed typtree
8793
"""
94+
if expected_read and read_typetree_boost:
95+
data = reader.read_bytes(expected_read)
96+
return read_typetree_boost(
97+
data, root_node, reader.endian, as_dict, assetsfile, classes, clean_name
98+
)
99+
88100
pos = reader.Position
89101
obj = read_value(root_node, reader, as_dict, assetsfile)
90102

@@ -136,7 +148,7 @@ def read_value(
136148
value = None
137149
# raise NotImplementedError(f"Reference type {node.m_Type} not implemented")
138150
# Vector
139-
elif node.m_Children[0].m_Type == "Array":
151+
elif node.m_Children and node.m_Children[0].m_Type == "Array":
140152
if metaflag_is_aligned(node.m_Children[0].m_MetaFlag):
141153
align = True
142154

@@ -220,7 +232,7 @@ def read_value_array(
220232
value = None
221233
# raise NotImplementedError(f"Reference type {node.m_Type} not implemented")
222234
# Vector
223-
elif node.m_Children[0].m_Type == "Array":
235+
elif node.m_Children and node.m_Children[0].m_Type == "Array":
224236
if metaflag_is_aligned(node.m_Children[0].m_MetaFlag):
225237
align = True
226238
subtype = node.m_Children[0].m_Children[1]
@@ -359,11 +371,8 @@ def write_value(
359371
write_value(value[0], node.m_Children[0], writer)
360372
write_value(value[1], node.m_Children[1], writer)
361373
case _:
362-
if not node.m_Children:
363-
value = None
364-
# raise NotImplementedError(f"Reference type {node.m_Type} not implemented")
365374
# Vector
366-
elif node.m_Children and node.m_Children[0].m_Type == "Array":
375+
if node.m_Children and node.m_Children[0].m_Type == "Array":
367376
if metaflag_is_aligned(node.m_Children[0].m_MetaFlag):
368377
align = True
369378

‎UnityPy/helpers/TypeTreeNode.py‎

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -10,21 +10,26 @@
1010
if TYPE_CHECKING:
1111
from .Tpk import UnityVersion
1212

13-
14-
@define
15-
class TypeTreeNode:
16-
m_Level: int
17-
m_Type: str
18-
m_Name: str
19-
m_ByteSize: int
20-
m_TypeFlags: int
21-
m_Version: int
22-
m_Children: List[TypeTreeNode] = field(factory=list)
23-
m_VariableCount: Optional[int] = None
24-
m_Index: Optional[int] = None
25-
m_MetaFlag: Optional[int] = None
26-
m_RefTypeHash: Optional[int] = None
27-
13+
try:
14+
from ..UnityPyBoost import TypeTreeNode as TypeTreeNodeC
15+
except ImportError:
16+
17+
@define(slots=True)
18+
class TypeTreeNodeC:
19+
m_Level: int
20+
m_Type: str
21+
m_Name: str
22+
m_ByteSize: int
23+
m_TypeFlags: int
24+
m_Version: int
25+
m_Children: List[TypeTreeNode] = field(factory=list)
26+
m_VariableCount: Optional[int] = None
27+
m_Index: Optional[int] = None
28+
m_MetaFlag: Optional[int] = None
29+
m_RefTypeHash: Optional[int] = None
30+
31+
32+
class TypeTreeNode(TypeTreeNodeC):
2833
def traverse(self) -> Iterator[TypeTreeNode]:
2934
stack: list[TypeTreeNode] = [self]
3035
while stack:
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#include "AnimationClip.h"
1+
#include "AnimationClip.hpp"
22
#include <Python.h>
33

44
#define MIN(x, y) (((x) < (y)) ? (x) : (y))
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
#include "Mesh.h"
1+
#include "Mesh.hpp"
22
#include <Python.h>
3-
#include <swap.h>
3+
#include <swap.hpp>
44

55
#define MAX(x, y) (((x) > (y)) ? (x) : (y))
66

@@ -99,7 +99,7 @@ PyObject *unpack_vertexdata(PyObject *self, PyObject *args)
9999
}
100100
}
101101

102-
PyObject *res = PyByteArray_FromStringAndSize(componentBytes, componentBytesLength);
102+
PyObject *res = PyByteArray_FromStringAndSize((const char*)componentBytes, componentBytesLength);
103103
PyMem_Free(componentBytes);
104104
PyBuffer_Release(&vertexDataView);
105105
return res;
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#define PY_SSIZE_T_CLEAN
22
#pragma once
3-
#include "AnimationClip.h"
3+
#include "AnimationClip.hpp"
44
#include <Python.h>
55

66
PyObject *unpack_vertexdata(PyObject *self, PyObject *args);
Lines changed: 1 addition & 1 deletion

0 commit comments

Comments
 (0)