Skip to content

Commit 6daa1f7

Browse files
fix: export Shader (#280)
* fix: export Shader * remove redundant hasattr * correctly handle int or List[int] --------- Co-authored-by: Rudolf Kolbe <[email protected]>
1 parent e63618e commit 6daa1f7

File tree

2 files changed

+22
-11
lines changed

2 files changed

+22
-11
lines changed

UnityPy/export/ShaderConverter.py

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import re
44
from itertools import groupby
5-
from typing import TYPE_CHECKING, List, Optional, Tuple
5+
from typing import TYPE_CHECKING, List, Optional, Tuple, TypeVar, Union
66

77
from ..enums import (
88
PassType,
@@ -35,6 +35,8 @@
3535
///////////////////////////////////////////
3636
"""[1:]
3737

38+
T = TypeVar("T")
39+
3840

3941
def export_shader(m_Shader: Shader) -> str:
4042
if m_Shader.m_SubProgramBlob: # 5.3 - 5.4
@@ -58,21 +60,27 @@ def ConvertSerializedShader(m_Shader: Shader) -> str:
5860

5961
platformNumber = len(m_Shader.platforms)
6062
compressed_blob = bytes(m_Shader.compressedBlob)
63+
64+
def get_entry(array: Union[List[T], List[List[T]]], index: int) -> T:
65+
item = array[index]
66+
if isinstance(item, List):
67+
return item[0]
68+
return item
69+
6170
for i in range(platformNumber):
6271
if i >= len(m_Shader.compressedLengths) or i >= len(
6372
m_Shader.decompressedLengths
6473
):
6574
# m_Shader.platforms shouldn't be longer than m_shader.[de]compressedLengths, but it is
6675
break
67-
compressedSize = m_Shader.compressedLengths[i]
68-
decompressedSize = m_Shader.decompressedLengths[i]
6976

70-
compressedBytes = compressed_blob[
71-
int(m_Shader.offsets[i][0]) : int(m_Shader.offsets[i][0])
72-
+ compressedSize[0]
73-
]
77+
compressedSize = get_entry(m_Shader.compressedLengths, i)
78+
decompressedSize = get_entry(m_Shader.decompressedLengths, i)
79+
offset = get_entry(m_Shader.offsets, i)
80+
81+
compressedBytes = compressed_blob[offset : offset + compressedSize]
7482
decompressedBytes = CompressionHelper.decompress_lz4(
75-
compressedBytes, decompressedSize[0]
83+
compressedBytes, decompressedSize
7684
)
7785

7886
shaderPrograms.append(
@@ -654,7 +662,10 @@ def Export(self) -> str:
654662

655663
sb.append("}\n")
656664

657-
if hasattr(self, "m_LocalKeywords") and len(self.m_LocalKeywords) > 0:
665+
if (
666+
getattr(self, "m_LocalKeywords") is not None
667+
and len(self.m_LocalKeywords) > 0
668+
):
658669
sb.append("Local Keywords { ")
659670
for keyword in self.m_LocalKeywords:
660671
sb.append('"{0}" '.format(keyword))

UnityPy/tools/extractor.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ def exportMesh(obj: Mesh, fp: str, extension=".obj") -> List[int]:
179179
return [(obj.assets_file, obj.path_id)]
180180

181181

182-
def exporShader(obj: Shader, fp: str, extension=".txt") -> List[int]:
182+
def exportShader(obj: Shader, fp: str, extension=".txt") -> List[int]:
183183
if not extension:
184184
extension = ".txt"
185185
with open(f"{fp}{extension}", "wt", encoding="utf8", newline="") as f:
@@ -295,7 +295,7 @@ def exportGameObject(obj: GameObject, fp: str, extension: str = "") -> List[int]
295295
ClassIDType.Font: exportFont,
296296
ClassIDType.Mesh: exportMesh,
297297
ClassIDType.MonoBehaviour: exportMonoBehaviour,
298-
ClassIDType.Shader: exporShader,
298+
ClassIDType.Shader: exportShader,
299299
ClassIDType.TextAsset: exportTextAsset,
300300
ClassIDType.Texture2D: exportTexture2D,
301301
}

0 commit comments

Comments
 (0)