Skip to content

Commit

Permalink
1.4.6
Browse files Browse the repository at this point in the history
EndianBinaryReader - memoryview
Material and AnimationController fix
Unity 2020 update
Nodehelper todict fix for ptrs
  • Loading branch information
K0lb3 committed Sep 4, 2020
1 parent 9a4cfba commit 291f8e8
Show file tree
Hide file tree
Showing 19 changed files with 372 additions and 246 deletions.
1 change: 1 addition & 0 deletions UnityPy/CommonString.py
Original file line number Diff line number Diff line change
Expand Up @@ -106,4 +106,5 @@
1093: "m_CorrespondingSourceObject",
1121: "m_PrefabInstance",
1138: "m_PrefabAsset",
1152: "FileSize",
}
2 changes: 1 addition & 1 deletion UnityPy/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
__version__ = "1.4.5"
__version__ = "1.4.6"

from .environment import Environment

Expand Down
2 changes: 1 addition & 1 deletion UnityPy/classes/AnimationClip.py
Original file line number Diff line number Diff line change
Expand Up @@ -199,7 +199,7 @@ def __init__(self, reader):
self.curve = AnimationCurve(reader, reader.read_float) # Float
self.attribute = reader.read_aligned_string()
self.path = reader.read_aligned_string()
self.classID = reader.read_int()
self.classID = ClassIDType(reader.read_int())
self.script = PPtr(reader) # MonoScript


Expand Down
2 changes: 1 addition & 1 deletion UnityPy/classes/AnimatorController.py
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,7 @@ def __init__(self, reader):
self.m_BlendDirectData = BlendDirectDataConstant(reader)

self.m_ClipID = reader.read_u_int()
if version >= (4, 5): # 4.5 - 5.0
if (4, 5) <= version <= (5, 0): # 4.5 - 5.0

This comment has been minimized.

Copy link
@UserUnknownFactor

UserUnknownFactor Sep 5, 2020

Contributor

Please be careful with tuple comparisons like this because the > and <= operators only work as expected here with tuples of the same dimension. For example (5,0,0,0) <= (5,0) => False and (5,0,0,0)[:2] <= (5,0) => True.

This comment has been minimized.

Copy link
@K0lb3

K0lb3 Sep 5, 2020

Author Owner

Thanks,
I forgot about that part.

self.m_ClipIndex = reader.read_u_int()

self.m_Duration = reader.read_float()
Expand Down
4 changes: 2 additions & 2 deletions UnityPy/classes/AudioClip.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ def __init__(self, reader):
m_Size = reader.read_int()
tsize = m_Size + 4 - m_Size % 4 if (m_Size % 4 != 0) else m_Size
if reader.byte_size + reader.byte_start - reader.Position != tsize:
m_Offset = reader.read_int()
m_Offset = reader.read_u_int()
self.m_Source = self.assets_file.full_name + ".resS"
else:
m_Size = reader.read_int()
Expand All @@ -41,7 +41,7 @@ def __init__(self, reader):
self.m_Legacy3D = reader.read_boolean()
reader.align_stream()
self.m_Source = reader.read_aligned_string()
m_Offset = reader.read_long()
m_Offset = reader.read_u_long()
m_Size = reader.read_long()
self.m_CompressionFormat = AudioCompressionFormat(reader.read_int())

Expand Down
5 changes: 3 additions & 2 deletions UnityPy/classes/Material.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,14 @@ def __init__(self, reader):
super().__init__(reader=reader)
version = self.version
self.m_Shader = PPtr(reader) # Shader
if version >= (4, 1): # 4.x
self.m_ShaderKeywords = reader.read_string_array()

if version >= (5,): # 5.0 and up
self.m_ShaderKeywords = reader.read_aligned_string()
self.m_LightmapFlags = reader.read_u_int()

elif version >= (4, 1): # 4.x
self.m_ShaderKeywords = reader.read_string_array()

if version >= (5, 6): # 5.6 and up
self.m_EnableInstancingVariants = reader.read_boolean()
# var m_DoubleSidedGI = a_Stream.read_boolean() //2017 and up
Expand Down
35 changes: 28 additions & 7 deletions UnityPy/classes/Object.py
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,10 @@ def __getattr__(self, item):
def __repr__(self):
return "<%s %s>" % (self.__class__.__name__, self.name)


from .PPtr import PPtr


class NodeHelper(object):
def __init__(self, data, assets_file):
if "m_PathID" in data and "m_FileID" in data:
Expand All @@ -90,18 +93,36 @@ def __init__(self, data, assets_file):
self.assets_file = assets_file
self.__class__ = PPtr
else:
self.__dict__ = {key:NodeHelper(val, assets_file) for key, val in data.items()}
self.__dict__ = {
str(key): NodeHelper(val, assets_file) for key, val in data.items()
}


def __new__(cls, data, assets_file):
if isinstance(data, dict):
return super(NodeHelper, cls).__new__(cls)
elif isinstance(data, list):
return [NodeHelper(x, assets_file) for x in data]
return data


def __item__(self, key):
return self.__dict__[key]

def to_dict(self):
return {
key:(val.dump() if isinstance(val, NodeHelper) else val)
for key,val in self.__dict__.items()
}
def dump(val):
return (
val.to_dict()
if isinstance(val, NodeHelper)
else [dump(item) for item in val]
if isinstance(val, list)
else {"m_PathID": val.path_id, "m_FileID": val.file_id}
if isinstance(val, PPtr)
else [x for x in val]
if isinstance(val, (bytearray, bytes))
else val
)

return {key: dump(val) for key, val in self.__dict__.items()}

def __repr__(self):
return "<NodeHelper - %s>" % self.__dict__.__repr__()

7 changes: 4 additions & 3 deletions UnityPy/classes/Renderer.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,14 +22,15 @@ def __init__(self, reader):
self.m_Enabled = reader.read_boolean()
self.m_CastShadows = reader.read_byte()
self.m_ReceiveShadows = reader.read_byte()
# 2017.2 and up
if version[:2] > (2017, 2):
if version[:2] > (2017, 2): # 2017.2 and up
self.m_DynamicOccludee = reader.read_byte()
self.m_MotionVectors = reader.read_byte()
self.m_LightProbeUsage = reader.read_byte()
self.m_ReflectionProbeUsage = reader.read_byte()
if version >= (2019, 3): # 2019.3 and up
if version >= (2019, 3): # 2019.3 and up
self.m_RayTracingMode = reader.ReadByte()
if version >= (2020,): # 2020.1 and up
self.m_RayTraceProcedural = reader.read_byte()
reader.align_stream()
else:
self.m_Enabled = reader.read_boolean()
Expand Down
10 changes: 5 additions & 5 deletions UnityPy/classes/Sprite.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
from .NamedObject import NamedObject
from .PPtr import PPtr
from ..export import SpriteHelper
from ..enums import SpriteMeshType


class Sprite(NamedObject):
Expand All @@ -21,7 +22,8 @@ def __init__(self, reader):

self.m_PixelsToUnits = reader.read_float()
if version >= (5, 4, 2) or (
version >= (5, 4, 1, 3) and self.build_type.IsPatch): # 5.4.1p3 and up
version >= (5, 4, 1, 3) and self.build_type.IsPatch
): # 5.4.1p3 and up
self.m_Pivot = reader.read_vector2()

self.m_Extrude = reader.read_u_int()
Expand Down Expand Up @@ -77,10 +79,8 @@ def __init__(self, reader):
self.packed = settingsRaw & 1 # 1
self.packingMode = SpritePackingMode((settingsRaw >> 1) & 1) # 1
self.packingRotation = SpritePackingRotation((settingsRaw >> 2) & 0xF) # 4


# meshType = (settingsRaw >> 6) & 1 #1
# reserved
self.meshType = SpriteMeshType((settingsRaw >> 6) & 1) # 1
# reserved


class SpriteVertex:
Expand Down
33 changes: 20 additions & 13 deletions UnityPy/classes/Texture2D.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,8 @@
class Texture2D(Texture):
@property
def image(self):
if self.image_data == b"":
self.image_data = get_resource_data(
self.m_StreamData.path,
self.assets_file,
self.m_StreamData.offset,
self.m_StreamData.size,
)
return Texture2DConverter.get_image_from_texture2d(self)

@image.setter
def image(self, img):
# img is PIL.Image
Expand All @@ -36,21 +29,32 @@ def __init__(self, reader):
self.m_Width = reader.read_int()
self.m_Height = reader.read_int()
self.m_CompleteImageSize = reader.read_int()
if version >= (2020,): # 2020.1 and up
self.mips_stripped = reader.read_int()
self.m_TextureFormat = TextureFormat(reader.read_int())
if version[:2] <= (5, 2): # 5.2 down
self.m_MipMap = reader.read_boolean()
else:
self.m_MipCount = reader.read_int()
self.m_IsReadable = reader.read_boolean() # 2.6.0 and up
self.m_ReadAllowed = reader.read_boolean() # 3.0.0 - 5.4
# bool m_StreamingMipmaps 2018.2 and up

if version >= (2, 6): # 2.6.0 and up
self.m_IsReadable = reader.read_boolean() # 2.6.0 and up
if version >= (2020,): # 2020.1 and up
self.is_pre_processed = reader.read_boolean()
if version >= (2019, 3): # 2019.3 and up
self.ignore_master_texture_limit = reader.read_boolean()
if (3,) <= version <= (5, 4): # 3.0.0 - 5.4
self.m_ReadAllowed = reader.read_boolean()
if version >= (2018, 2): # 2018.2 and up
self.m_streaming_mipmaps = reader.read_boolean()

reader.align_stream()
if version >= (2018, 2): # 2018.2 and up
self.m_StreamingMipmapsPriority = reader.read_int()
self.m_ImageCount = reader.read_int()
self.m_TextureDimension = reader.read_int()
self.m_TextureSettings = GLTextureSettings(reader)
if version >= (3, ): # 3.0 and up
if version >= (3,): # 3.0 and up
self.m_LightmapFormat = reader.read_int()
if version >= (3, 5): # 3.5.0 and up
self.m_ColorSpace = reader.read_int()
Expand Down Expand Up @@ -105,7 +109,10 @@ class StreamingInfo:
path: str = ""

def __init__(self, reader):
self.offset = reader.read_u_int()
if reader.version >= (2020,): # 2020.1 and up
self.offset = reader.read_u_long()
else:
self.offset = reader.read_u_int()
self.size = reader.read_u_int()
self.path = reader.read_aligned_string()

Expand Down
11 changes: 11 additions & 0 deletions UnityPy/classes/VideoClip.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from .NamedObject import NamedObject
from ..helpers.ResourceReader import get_resource_data
from .PPtr import PPtr


class VideoClip(NamedObject):
Expand All @@ -21,10 +22,20 @@ def __init__(self, reader):
self.audio_sample_rate = reader.read_u_int_array()
self.audio_language = reader.read_string_array()
# StreamedResource m_ExternalResources
if self.version >= (2020,): # 2020.1 and up
video_shader_size = reader.ReadInt32()
self.video_shaders = [PPtr(reader) for _ in range(video_shader_size)]

# StreamedResource
source = reader.read_aligned_string()
offset = reader.read_u_long()
size = reader.read_u_long()

self.has_split_alpha = reader.read_boolean()

if self.version >= (2020,): # 2020.1 and up
self.m_sRGB = reader.read_boolean()

if source:
self.VideoData = get_resource_data(source, self.assets_file, offset, size)
else:
Expand Down
6 changes: 6 additions & 0 deletions UnityPy/enums/SpriteMeshType.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
from enum import Enum


class SpriteMeshType(Enum):
kSpriteMeshTypeFullRect = 0
kSpriteMeshTypeTight = 1
2 changes: 1 addition & 1 deletion UnityPy/enums/TextureFormat.py
Original file line number Diff line number Diff line change
Expand Up @@ -64,4 +64,4 @@ class TextureFormat(IntEnum):
ASTC_HDR_6x6 = (68,)
ASTC_HDR_8x8 = (69,)
ASTC_HDR_10x10 = (70,)
ASTC_HDR_12x12 = 71
ASTC_HDR_12x12 = (71,)
1 change: 1 addition & 0 deletions UnityPy/enums/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,4 @@
from .ClassIDType import ClassIDType
from .FileType import FileType
from .TextureFormat import TextureFormat
from .SpriteMeshType import SpriteMeshType
1 change: 0 additions & 1 deletion UnityPy/environment.py
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,6 @@ def load_zip_file(self, value):
def objects(self):
def search(item):
ret = []
#print(type(item))
if not isinstance(item, Environment) and getattr(item, "objects", None):
# serialized file
return [val for val in item.objects.values()]
Expand Down
2 changes: 1 addition & 1 deletion UnityPy/export/Texture2DConverter.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ def get_image_from_texture2d(texture_2d, flip=True) -> Image:
:return: PIL.Image object
:rtype: Image
"""
image_data = copy(texture_2d.image_data)
image_data = copy(bytes(texture_2d.image_data))
if not image_data:
return Image.new("RGB", (0,0))
texture_format = texture_2d.m_TextureFormat if isinstance(texture_2d, TextureFormat) else TextureFormat(texture_2d.m_TextureFormat)
Expand Down

0 comments on commit 291f8e8

Please sign in to comment.