mirror of
https://github.com/aelurum/AssetStudio.git
synced 2025-05-25 05:40:21 -04:00
2019.1 support
This commit is contained in:
parent
87e1739208
commit
8946a4fba5
@ -65,6 +65,7 @@
|
|||||||
<Compile Include="Math\Vector2.cs" />
|
<Compile Include="Math\Vector2.cs" />
|
||||||
<Compile Include="Math\Vector3.cs" />
|
<Compile Include="Math\Vector3.cs" />
|
||||||
<Compile Include="Math\Vector4.cs" />
|
<Compile Include="Math\Vector4.cs" />
|
||||||
|
<Compile Include="UType.cs" />
|
||||||
<Compile Include="ResourceReader.cs" />
|
<Compile Include="ResourceReader.cs" />
|
||||||
<Compile Include="IImported.cs" />
|
<Compile Include="IImported.cs" />
|
||||||
<Compile Include="SerializedFile.cs" />
|
<Compile Include="SerializedFile.cs" />
|
||||||
|
@ -300,6 +300,8 @@ namespace AssetStudio
|
|||||||
{
|
{
|
||||||
m_TOS[i] = new KeyValuePair<uint, string>(reader.ReadUInt32(), reader.ReadAlignedString());
|
m_TOS[i] = new KeyValuePair<uint, string>(reader.ReadUInt32(), reader.ReadAlignedString());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//HumanDescription m_HumanDescription 2019 and up
|
||||||
}
|
}
|
||||||
|
|
||||||
public string FindBonePath(uint hash)
|
public string FindBonePath(uint hash)
|
||||||
|
@ -1,10 +1,23 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections;
|
using System.Collections;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
|
||||||
namespace AssetStudio
|
namespace AssetStudio
|
||||||
{
|
{
|
||||||
|
public class MinMaxAABB
|
||||||
|
{
|
||||||
|
public Vector3 m_Min;
|
||||||
|
public Vector3 m_Max;
|
||||||
|
|
||||||
|
public MinMaxAABB(BinaryReader reader)
|
||||||
|
{
|
||||||
|
m_Min = reader.ReadVector3();
|
||||||
|
m_Max = reader.ReadVector3();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public class CompressedMesh
|
public class CompressedMesh
|
||||||
{
|
{
|
||||||
public PackedFloatVector m_Vertices;
|
public PackedFloatVector m_Vertices;
|
||||||
@ -490,8 +503,20 @@ namespace AssetStudio
|
|||||||
var m_RootBoneNameHash = reader.ReadUInt32();
|
var m_RootBoneNameHash = reader.ReadUInt32();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (version[0] > 2 || (version[0] == 2 && version[1] >= 6)) //2.6.0 and later
|
if (version[0] > 2 || (version[0] == 2 && version[1] >= 6)) //2.6.0 and up
|
||||||
{
|
{
|
||||||
|
if (version[0] >= 2019) //2019 and up
|
||||||
|
{
|
||||||
|
var m_BonesAABBSize = reader.ReadInt32();
|
||||||
|
var m_BonesAABB = new MinMaxAABB[m_BonesAABBSize];
|
||||||
|
for (int i = 0; i < m_BonesAABBSize; i++)
|
||||||
|
{
|
||||||
|
m_BonesAABB[i] = new MinMaxAABB(reader);
|
||||||
|
}
|
||||||
|
|
||||||
|
var m_VariableBoneCountWeights = reader.ReadUInt32Array();
|
||||||
|
}
|
||||||
|
|
||||||
var m_MeshCompression = reader.ReadByte();
|
var m_MeshCompression = reader.ReadByte();
|
||||||
if (version[0] >= 4)
|
if (version[0] >= 4)
|
||||||
{
|
{
|
||||||
@ -719,7 +744,7 @@ namespace AssetStudio
|
|||||||
|
|
||||||
int[] componentsIntArray = null;
|
int[] componentsIntArray = null;
|
||||||
float[] componentsFloatArray = null;
|
float[] componentsFloatArray = null;
|
||||||
if (m_Channel.format == 11)
|
if (m_Channel.format == 10 || m_Channel.format == 11)
|
||||||
componentsIntArray = MeshHelper.BytesToIntArray(componentBytes);
|
componentsIntArray = MeshHelper.BytesToIntArray(componentBytes);
|
||||||
else
|
else
|
||||||
componentsFloatArray = MeshHelper.BytesToFloatArray(componentBytes, componentByteSize);
|
componentsFloatArray = MeshHelper.BytesToFloatArray(componentBytes, componentByteSize);
|
||||||
@ -1075,6 +1100,10 @@ namespace AssetStudio
|
|||||||
return 1u;
|
return 1u;
|
||||||
case 3: //kChannelFormatByte
|
case 3: //kChannelFormatByte
|
||||||
return 1u;
|
return 1u;
|
||||||
|
case 4: //kChannelFormatUInt32
|
||||||
|
return 4u;
|
||||||
|
case 10: //kChannelFormatInt32
|
||||||
|
return 4u;
|
||||||
case 11: //kChannelFormatInt32
|
case 11: //kChannelFormatInt32
|
||||||
return 4u;
|
return 4u;
|
||||||
default:
|
default:
|
||||||
|
@ -473,11 +473,22 @@ namespace AssetStudio
|
|||||||
m_BlobIndex = reader.ReadUInt32();
|
m_BlobIndex = reader.ReadUInt32();
|
||||||
m_Channels = new ParserBindChannels(reader);
|
m_Channels = new ParserBindChannels(reader);
|
||||||
|
|
||||||
m_KeywordIndices = reader.ReadUInt16Array();
|
if (version[0] >= 2019) //2019 and up
|
||||||
if (version[0] >= 2017) //2017 and up
|
|
||||||
{
|
{
|
||||||
|
var m_GlobalKeywordIndices = reader.ReadUInt16Array();
|
||||||
|
reader.AlignStream();
|
||||||
|
var m_LocalKeywordIndices = reader.ReadUInt16Array();
|
||||||
reader.AlignStream();
|
reader.AlignStream();
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_KeywordIndices = reader.ReadUInt16Array();
|
||||||
|
if (version[0] >= 2017) //2017 and up
|
||||||
|
{
|
||||||
|
reader.AlignStream();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
m_ShaderHardwareTier = reader.ReadSByte();
|
m_ShaderHardwareTier = reader.ReadSByte();
|
||||||
m_GpuProgramType = (ShaderGpuProgramType)reader.ReadSByte();
|
m_GpuProgramType = (ShaderGpuProgramType)reader.ReadSByte();
|
||||||
reader.AlignStream();
|
reader.AlignStream();
|
||||||
|
@ -1,9 +1,22 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
|
using System.IO;
|
||||||
|
|
||||||
namespace AssetStudio
|
namespace AssetStudio
|
||||||
{
|
{
|
||||||
|
public class SecondarySpriteTexture
|
||||||
|
{
|
||||||
|
public PPtr<Texture2D> texture;
|
||||||
|
public string name;
|
||||||
|
|
||||||
|
public SecondarySpriteTexture(ObjectReader reader)
|
||||||
|
{
|
||||||
|
texture = new PPtr<Texture2D>(reader);
|
||||||
|
name = reader.ReadStringToNull();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public enum SpritePackingRotation
|
public enum SpritePackingRotation
|
||||||
{
|
{
|
||||||
kSPRNone = 0,
|
kSPRNone = 0,
|
||||||
@ -27,7 +40,7 @@ namespace AssetStudio
|
|||||||
public SpritePackingMode packingMode;
|
public SpritePackingMode packingMode;
|
||||||
public SpritePackingRotation packingRotation;
|
public SpritePackingRotation packingRotation;
|
||||||
|
|
||||||
public SpriteSettings(ObjectReader reader)
|
public SpriteSettings(BinaryReader reader)
|
||||||
{
|
{
|
||||||
settingsRaw = reader.ReadUInt32();
|
settingsRaw = reader.ReadUInt32();
|
||||||
|
|
||||||
@ -61,6 +74,7 @@ namespace AssetStudio
|
|||||||
{
|
{
|
||||||
public PPtr<Texture2D> texture;
|
public PPtr<Texture2D> texture;
|
||||||
public PPtr<Texture2D> alphaTexture;
|
public PPtr<Texture2D> alphaTexture;
|
||||||
|
public SecondarySpriteTexture[] secondaryTextures;
|
||||||
public SubMesh[] m_SubMeshes;
|
public SubMesh[] m_SubMeshes;
|
||||||
public byte[] m_IndexBuffer;
|
public byte[] m_IndexBuffer;
|
||||||
public VertexData m_VertexData;
|
public VertexData m_VertexData;
|
||||||
@ -85,6 +99,16 @@ namespace AssetStudio
|
|||||||
alphaTexture = new PPtr<Texture2D>(reader);
|
alphaTexture = new PPtr<Texture2D>(reader);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (version[0] >= 2019) //2019 and up
|
||||||
|
{
|
||||||
|
var secondaryTexturesSize = reader.ReadInt32();
|
||||||
|
secondaryTextures = new SecondarySpriteTexture[secondaryTexturesSize];
|
||||||
|
for (int i = 0; i < secondaryTexturesSize; i++)
|
||||||
|
{
|
||||||
|
secondaryTextures[i] = new SecondarySpriteTexture(reader);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (version[0] > 5 || (version[0] == 5 && version[1] >= 6)) //5.6 and up
|
if (version[0] > 5 || (version[0] == 5 && version[1] >= 6)) //5.6 and up
|
||||||
{
|
{
|
||||||
var m_SubMeshesSize = reader.ReadInt32();
|
var m_SubMeshesSize = reader.ReadInt32();
|
||||||
|
@ -4,7 +4,7 @@ namespace AssetStudio
|
|||||||
{
|
{
|
||||||
public static class CommonString
|
public static class CommonString
|
||||||
{
|
{
|
||||||
public static readonly Dictionary<int, string> StringBuffer = new Dictionary<int, string>
|
public static readonly Dictionary<uint, string> StringBuffer = new Dictionary<uint, string>
|
||||||
{
|
{
|
||||||
{0, "AABB"},
|
{0, "AABB"},
|
||||||
{5, "AnimationClip"},
|
{5, "AnimationClip"},
|
||||||
@ -110,7 +110,9 @@ namespace AssetStudio
|
|||||||
{1057, "int2_storage"},
|
{1057, "int2_storage"},
|
||||||
{1070, "int3_storage"},
|
{1070, "int3_storage"},
|
||||||
{1083, "BoundsInt"},
|
{1083, "BoundsInt"},
|
||||||
{1093, "m_CorrespondingSourceObject"}
|
{1093, "m_CorrespondingSourceObject"},
|
||||||
|
{1121, "m_PrefabInstance"},
|
||||||
|
{1138, "m_PrefabAsset"}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -227,11 +227,11 @@ namespace AssetStudio
|
|||||||
return type;
|
return type;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ReadTypeTree(List<TypeTreeNode> typeTree, int depth = 0)
|
private void ReadTypeTree(List<TypeTreeNode> typeTree, int level = 0)
|
||||||
{
|
{
|
||||||
var typeTreeNode = new TypeTreeNode();
|
var typeTreeNode = new TypeTreeNode();
|
||||||
typeTree.Add(typeTreeNode);
|
typeTree.Add(typeTreeNode);
|
||||||
typeTreeNode.m_Level = depth;
|
typeTreeNode.m_Level = level;
|
||||||
typeTreeNode.m_Type = reader.ReadStringToNull();
|
typeTreeNode.m_Type = reader.ReadStringToNull();
|
||||||
typeTreeNode.m_Name = reader.ReadStringToNull();
|
typeTreeNode.m_Name = reader.ReadStringToNull();
|
||||||
typeTreeNode.m_ByteSize = reader.ReadInt32();
|
typeTreeNode.m_ByteSize = reader.ReadInt32();
|
||||||
@ -253,7 +253,7 @@ namespace AssetStudio
|
|||||||
int childrenCount = reader.ReadInt32();
|
int childrenCount = reader.ReadInt32();
|
||||||
for (int i = 0; i < childrenCount; i++)
|
for (int i = 0; i < childrenCount; i++)
|
||||||
{
|
{
|
||||||
ReadTypeTree(typeTree, depth + 1);
|
ReadTypeTree(typeTree, level + 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -262,10 +262,15 @@ namespace AssetStudio
|
|||||||
int numberOfNodes = reader.ReadInt32();
|
int numberOfNodes = reader.ReadInt32();
|
||||||
int stringBufferSize = reader.ReadInt32();
|
int stringBufferSize = reader.ReadInt32();
|
||||||
|
|
||||||
reader.Position += numberOfNodes * 24;
|
var nodeSize = 24;
|
||||||
|
if (header.m_Version > 17)
|
||||||
|
{
|
||||||
|
nodeSize = 32;
|
||||||
|
}
|
||||||
|
reader.Position += numberOfNodes * nodeSize;
|
||||||
using (var stringBufferReader = new BinaryReader(new MemoryStream(reader.ReadBytes(stringBufferSize))))
|
using (var stringBufferReader = new BinaryReader(new MemoryStream(reader.ReadBytes(stringBufferSize))))
|
||||||
{
|
{
|
||||||
reader.Position -= numberOfNodes * 24 + stringBufferSize;
|
reader.Position -= numberOfNodes * nodeSize + stringBufferSize;
|
||||||
for (int i = 0; i < numberOfNodes; i++)
|
for (int i = 0; i < numberOfNodes; i++)
|
||||||
{
|
{
|
||||||
var typeTreeNode = new TypeTreeNode();
|
var typeTreeNode = new TypeTreeNode();
|
||||||
@ -273,37 +278,38 @@ namespace AssetStudio
|
|||||||
typeTreeNode.m_Version = reader.ReadUInt16();
|
typeTreeNode.m_Version = reader.ReadUInt16();
|
||||||
typeTreeNode.m_Level = reader.ReadByte();
|
typeTreeNode.m_Level = reader.ReadByte();
|
||||||
typeTreeNode.m_IsArray = reader.ReadBoolean() ? 1 : 0;
|
typeTreeNode.m_IsArray = reader.ReadBoolean() ? 1 : 0;
|
||||||
|
typeTreeNode.m_TypeStrOffset = reader.ReadUInt32();
|
||||||
var m_TypeStrOffset = reader.ReadUInt16();
|
typeTreeNode.m_NameStrOffset = reader.ReadUInt32();
|
||||||
var temp = reader.ReadUInt16();
|
|
||||||
if (temp == 0)
|
|
||||||
{
|
|
||||||
stringBufferReader.BaseStream.Position = m_TypeStrOffset;
|
|
||||||
typeTreeNode.m_Type = stringBufferReader.ReadStringToNull();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
typeTreeNode.m_Type = CommonString.StringBuffer.ContainsKey(m_TypeStrOffset) ? CommonString.StringBuffer[m_TypeStrOffset] : m_TypeStrOffset.ToString();
|
|
||||||
}
|
|
||||||
|
|
||||||
var m_NameStrOffset = reader.ReadUInt16();
|
|
||||||
temp = reader.ReadUInt16();
|
|
||||||
if (temp == 0)
|
|
||||||
{
|
|
||||||
stringBufferReader.BaseStream.Position = m_NameStrOffset;
|
|
||||||
typeTreeNode.m_Name = stringBufferReader.ReadStringToNull();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
typeTreeNode.m_Name = CommonString.StringBuffer.ContainsKey(m_NameStrOffset) ? CommonString.StringBuffer[m_NameStrOffset] : m_NameStrOffset.ToString();
|
|
||||||
}
|
|
||||||
|
|
||||||
typeTreeNode.m_ByteSize = reader.ReadInt32();
|
typeTreeNode.m_ByteSize = reader.ReadInt32();
|
||||||
typeTreeNode.m_Index = reader.ReadInt32();
|
typeTreeNode.m_Index = reader.ReadInt32();
|
||||||
typeTreeNode.m_MetaFlag = reader.ReadInt32();
|
typeTreeNode.m_MetaFlag = reader.ReadInt32();
|
||||||
|
|
||||||
|
if (header.m_Version > 17)
|
||||||
|
{
|
||||||
|
reader.Position += 8;
|
||||||
|
}
|
||||||
|
|
||||||
|
typeTreeNode.m_Type = ReadString(stringBufferReader, typeTreeNode.m_TypeStrOffset);
|
||||||
|
typeTreeNode.m_Name = ReadString(stringBufferReader, typeTreeNode.m_NameStrOffset);
|
||||||
}
|
}
|
||||||
reader.Position += stringBufferSize;
|
reader.Position += stringBufferSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
string ReadString(BinaryReader stringBufferReader, uint value)
|
||||||
|
{
|
||||||
|
var isOffset = (value & 0x80000000) == 0;
|
||||||
|
if (isOffset)
|
||||||
|
{
|
||||||
|
stringBufferReader.BaseStream.Position = value;
|
||||||
|
return stringBufferReader.ReadStringToNull();
|
||||||
|
}
|
||||||
|
var offset = value & 0x7FFFFFFF;
|
||||||
|
if (CommonString.StringBuffer.TryGetValue(offset, out var str))
|
||||||
|
{
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
return offset.ToString();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -153,10 +153,10 @@ namespace AssetStudio
|
|||||||
reader.AlignStream();
|
reader.AlignStream();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Dictionary<string, object> ReadBoxingType(List<TypeTreeNode> members, BinaryReader reader)
|
public static UType ReadUType(List<TypeTreeNode> members, BinaryReader reader)
|
||||||
{
|
{
|
||||||
var obj = new Dictionary<string, object>();
|
var obj = new UType();
|
||||||
for (int i = 0; i < members.Count; i++)
|
for (int i = 1; i < members.Count; i++)
|
||||||
{
|
{
|
||||||
var member = members[i];
|
var member = members[i];
|
||||||
var varNameStr = member.m_Name;
|
var varNameStr = member.m_Name;
|
||||||
@ -218,23 +218,6 @@ namespace AssetStudio
|
|||||||
value = reader.ReadAlignedString();
|
value = reader.ReadAlignedString();
|
||||||
i += 3;
|
i += 3;
|
||||||
break;
|
break;
|
||||||
case "vector":
|
|
||||||
{
|
|
||||||
if ((members[i + 1].m_MetaFlag & 0x4000) != 0)
|
|
||||||
align = true;
|
|
||||||
var size = reader.ReadInt32();
|
|
||||||
var list = new List<object>(size);
|
|
||||||
var vector = GetMembers(members, level, i);
|
|
||||||
i += vector.Count - 1;
|
|
||||||
vector.RemoveRange(0, 3);
|
|
||||||
for (int j = 0; j < size; j++)
|
|
||||||
{
|
|
||||||
int tmp = 0;
|
|
||||||
list.Add(ReadValue(vector, reader, ref tmp));
|
|
||||||
}
|
|
||||||
value = list;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case "map":
|
case "map":
|
||||||
{
|
{
|
||||||
if ((members[i + 1].m_MetaFlag & 0x4000) != 0)
|
if ((members[i + 1].m_MetaFlag & 0x4000) != 0)
|
||||||
@ -265,22 +248,38 @@ namespace AssetStudio
|
|||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
if (i != members.Count && members[i + 1].m_Type == "Array")
|
if (i != members.Count && members[i + 1].m_Type == "Array") //Array
|
||||||
{
|
{
|
||||||
goto case "vector";
|
if ((members[i + 1].m_MetaFlag & 0x4000) != 0)
|
||||||
|
align = true;
|
||||||
|
var size = reader.ReadInt32();
|
||||||
|
var list = new List<object>(size);
|
||||||
|
var vector = GetMembers(members, level, i);
|
||||||
|
i += vector.Count - 1;
|
||||||
|
vector.RemoveRange(0, 3);
|
||||||
|
for (int j = 0; j < size; j++)
|
||||||
|
{
|
||||||
|
int tmp = 0;
|
||||||
|
list.Add(ReadValue(vector, reader, ref tmp));
|
||||||
|
}
|
||||||
|
value = list;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
var @class = GetMembers(members, level, i);
|
else //Class
|
||||||
@class.RemoveAt(0);
|
|
||||||
i += @class.Count;
|
|
||||||
var obj = new Dictionary<string, object>();
|
|
||||||
for (int j = 0; j < @class.Count; j++)
|
|
||||||
{
|
{
|
||||||
var classmember = @class[j];
|
var @class = GetMembers(members, level, i);
|
||||||
var name = classmember.m_Name;
|
@class.RemoveAt(0);
|
||||||
obj[name] = ReadValue(@class, reader, ref j);
|
i += @class.Count;
|
||||||
|
var obj = new UType();
|
||||||
|
for (int j = 0; j < @class.Count; j++)
|
||||||
|
{
|
||||||
|
var classmember = @class[j];
|
||||||
|
var name = classmember.m_Name;
|
||||||
|
obj[name] = ReadValue(@class, reader, ref j);
|
||||||
|
}
|
||||||
|
value = obj;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
value = obj;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (align)
|
if (align)
|
||||||
@ -305,7 +304,7 @@ namespace AssetStudio
|
|||||||
return member2;
|
return member2;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static byte[] WriteBoxingType(Dictionary<string, object> obj, List<TypeTreeNode> members)
|
public static byte[] WriteUType(UType obj, List<TypeTreeNode> members)
|
||||||
{
|
{
|
||||||
var stream = new MemoryStream();
|
var stream = new MemoryStream();
|
||||||
var write = new BinaryWriter(stream);
|
var write = new BinaryWriter(stream);
|
||||||
@ -370,23 +369,6 @@ namespace AssetStudio
|
|||||||
write.WriteAlignedString((string)value);
|
write.WriteAlignedString((string)value);
|
||||||
i += 3;
|
i += 3;
|
||||||
break;
|
break;
|
||||||
case "vector":
|
|
||||||
{
|
|
||||||
if ((members[i + 1].m_MetaFlag & 0x4000) != 0)
|
|
||||||
align = true;
|
|
||||||
var list = (List<object>)value;
|
|
||||||
var size = list.Count;
|
|
||||||
write.Write(size);
|
|
||||||
var vector = GetMembers(members, level, i);
|
|
||||||
i += vector.Count - 1;
|
|
||||||
vector.RemoveRange(0, 3);
|
|
||||||
for (int j = 0; j < size; j++)
|
|
||||||
{
|
|
||||||
int tmp = 0;
|
|
||||||
WriteValue(list[j], vector, write, ref tmp);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case "map":
|
case "map":
|
||||||
{
|
{
|
||||||
if ((members[i + 1].m_MetaFlag & 0x4000) != 0)
|
if ((members[i + 1].m_MetaFlag & 0x4000) != 0)
|
||||||
@ -420,21 +402,37 @@ namespace AssetStudio
|
|||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
if (i != members.Count && members[i + 1].m_Type == "Array")
|
if (i != members.Count && members[i + 1].m_Type == "Array") //Array
|
||||||
{
|
{
|
||||||
goto case "vector";
|
if ((members[i + 1].m_MetaFlag & 0x4000) != 0)
|
||||||
|
align = true;
|
||||||
|
var list = (List<object>)value;
|
||||||
|
var size = list.Count;
|
||||||
|
write.Write(size);
|
||||||
|
var vector = GetMembers(members, level, i);
|
||||||
|
i += vector.Count - 1;
|
||||||
|
vector.RemoveRange(0, 3);
|
||||||
|
for (int j = 0; j < size; j++)
|
||||||
|
{
|
||||||
|
int tmp = 0;
|
||||||
|
WriteValue(list[j], vector, write, ref tmp);
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
var @class = GetMembers(members, level, i);
|
else //Class
|
||||||
@class.RemoveAt(0);
|
|
||||||
i += @class.Count;
|
|
||||||
var obj = (Dictionary<string, object>)value;
|
|
||||||
for (int j = 0; j < @class.Count; j++)
|
|
||||||
{
|
{
|
||||||
var classmember = @class[j];
|
var @class = GetMembers(members, level, i);
|
||||||
var name = classmember.m_Name;
|
@class.RemoveAt(0);
|
||||||
WriteValue(obj[name], @class, write, ref j);
|
i += @class.Count;
|
||||||
|
var obj = (UType)value;
|
||||||
|
for (int j = 0; j < @class.Count; j++)
|
||||||
|
{
|
||||||
|
var classmember = @class[j];
|
||||||
|
var name = classmember.m_Name;
|
||||||
|
WriteValue(obj[name], @class, write, ref j);
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (align)
|
if (align)
|
||||||
|
@ -15,5 +15,7 @@ namespace AssetStudio
|
|||||||
public int m_Version;
|
public int m_Version;
|
||||||
public int m_MetaFlag;
|
public int m_MetaFlag;
|
||||||
public int m_Level;
|
public int m_Level;
|
||||||
|
public uint m_TypeStrOffset;
|
||||||
|
public uint m_NameStrOffset;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
155
AssetStudio/UType.cs
Normal file
155
AssetStudio/UType.cs
Normal file
@ -0,0 +1,155 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace AssetStudio
|
||||||
|
{
|
||||||
|
public class UType : IDictionary<string, object>
|
||||||
|
{
|
||||||
|
private List<string> keys;
|
||||||
|
private List<object> values;
|
||||||
|
|
||||||
|
public UType()
|
||||||
|
{
|
||||||
|
keys = new List<string>();
|
||||||
|
values = new List<object>();
|
||||||
|
}
|
||||||
|
|
||||||
|
private int GetValueIndex(string name)
|
||||||
|
{
|
||||||
|
for (int i = 0, n = keys.Count; i < n; i++)
|
||||||
|
{
|
||||||
|
if (string.Equals(keys[i], name, StringComparison.Ordinal))
|
||||||
|
{
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool TryGetValue<T>(string key, out T value)
|
||||||
|
{
|
||||||
|
var index = GetValueIndex(key);
|
||||||
|
if (index != -1)
|
||||||
|
{
|
||||||
|
value = (T)values[index];
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
value = default(T);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public object this[string key]
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
var index = GetValueIndex(key);
|
||||||
|
if (index != -1)
|
||||||
|
{
|
||||||
|
return values[index];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
var index = GetValueIndex(key);
|
||||||
|
if (index == -1)
|
||||||
|
{
|
||||||
|
keys.Add(key);
|
||||||
|
values.Add(value);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
values[index] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public ICollection<string> Keys => keys;
|
||||||
|
|
||||||
|
public ICollection<object> Values => values;
|
||||||
|
|
||||||
|
public int Count => keys.Count;
|
||||||
|
|
||||||
|
public bool IsReadOnly => false;
|
||||||
|
|
||||||
|
public void Add(string key, object value)
|
||||||
|
{
|
||||||
|
keys.Add(key);
|
||||||
|
values.Add(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Add(KeyValuePair<string, object> item)
|
||||||
|
{
|
||||||
|
keys.Add(item.Key);
|
||||||
|
values.Add(item.Value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Clear()
|
||||||
|
{
|
||||||
|
keys.Clear();
|
||||||
|
values.Clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Contains(KeyValuePair<string, object> item)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool ContainsKey(string key)
|
||||||
|
{
|
||||||
|
return GetValueIndex(key) != -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void CopyTo(KeyValuePair<string, object>[] array, int arrayIndex)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
public IEnumerator<KeyValuePair<string, object>> GetEnumerator()
|
||||||
|
{
|
||||||
|
for (int i = 0, n = keys.Count; i < n; i++)
|
||||||
|
{
|
||||||
|
yield return new KeyValuePair<string, object>(keys[i], values[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Remove(string key)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Remove(KeyValuePair<string, object> item)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool TryGetValue(string key, out object value)
|
||||||
|
{
|
||||||
|
var index = GetValueIndex(key);
|
||||||
|
if (index != -1)
|
||||||
|
{
|
||||||
|
value = values[index];
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
value = null;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
IEnumerator IEnumerable.GetEnumerator()
|
||||||
|
{
|
||||||
|
return GetEnumerator();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -30,7 +30,7 @@ namespace AssetStudio
|
|||||||
return ConvertMultiple(shader)[0];
|
return ConvertMultiple(shader)[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
return Encoding.UTF8.GetString(shader.m_Script);
|
return header + Encoding.UTF8.GetString(shader.m_Script);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static string[] ConvertMultiple(Shader shader)
|
public static string[] ConvertMultiple(Shader shader)
|
||||||
@ -51,7 +51,7 @@ namespace AssetStudio
|
|||||||
{
|
{
|
||||||
var program = new ShaderProgram(blobReader);
|
var program = new ShaderProgram(blobReader);
|
||||||
var m_Script = ConvertSerializedShader(shader.m_ParsedForm, shader.platforms[i]);
|
var m_Script = ConvertSerializedShader(shader.m_ParsedForm, shader.platforms[i]);
|
||||||
strs[i] = program.Export(m_Script);
|
strs[i] = header + program.Export(m_Script);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -544,6 +544,12 @@ namespace AssetStudio
|
|||||||
return "unknown";
|
return "unknown";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static string header = "//////////////////////////////////////////\n" +
|
||||||
|
"//\n" +
|
||||||
|
"// NOTE: This is *not* a valid shader file\n" +
|
||||||
|
"//\n" +
|
||||||
|
"///////////////////////////////////////////\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
public class ShaderProgram
|
public class ShaderProgram
|
||||||
@ -577,33 +583,44 @@ namespace AssetStudio
|
|||||||
|
|
||||||
public class ShaderSubProgram
|
public class ShaderSubProgram
|
||||||
{
|
{
|
||||||
private int magic;
|
private int m_Version;
|
||||||
public ShaderGpuProgramType m_ProgramType;
|
public ShaderGpuProgramType m_ProgramType;
|
||||||
public string[] m_Keywords;
|
public string[] m_Keywords;
|
||||||
|
public string[] m_LocalKeywords;
|
||||||
public byte[] m_ProgramCode;
|
public byte[] m_ProgramCode;
|
||||||
|
|
||||||
public ShaderSubProgram(BinaryReader reader)
|
public ShaderSubProgram(BinaryReader reader)
|
||||||
{
|
{
|
||||||
//LoadGpuProgramFromData
|
//LoadGpuProgramFromData
|
||||||
// 201509030 - Unity 5.3
|
//201509030 - Unity 5.3
|
||||||
// 201510240 - Unity 5.4
|
//201510240 - Unity 5.4
|
||||||
// 201608170 - Unity 5.5
|
//201608170 - Unity 5.5
|
||||||
// 201609010 - Unity 5.6, 2017.1 & 2017.2
|
//201609010 - Unity 5.6, 2017.1 & 2017.2
|
||||||
// 201708220 - Unity 2017.3, Unity 2017.4 & Unity 2018.1
|
//201708220 - Unity 2017.3, Unity 2017.4 & Unity 2018.1
|
||||||
// 201802150 - Unity 2018.2 & Unity 2018.3
|
//201802150 - Unity 2018.2 & Unity 2018.3
|
||||||
magic = reader.ReadInt32();
|
//201806140 - Unity 2019.1
|
||||||
|
m_Version = reader.ReadInt32();
|
||||||
m_ProgramType = (ShaderGpuProgramType)reader.ReadInt32();
|
m_ProgramType = (ShaderGpuProgramType)reader.ReadInt32();
|
||||||
reader.BaseStream.Position += 12;
|
reader.BaseStream.Position += 12;
|
||||||
if (magic >= 201608170) //5.5.0 and up
|
if (m_Version >= 201608170)
|
||||||
{
|
{
|
||||||
reader.BaseStream.Position += 4;
|
reader.BaseStream.Position += 4;
|
||||||
}
|
}
|
||||||
var keywordCount = reader.ReadInt32();
|
var m_KeywordsSize = reader.ReadInt32();
|
||||||
m_Keywords = new string[keywordCount];
|
m_Keywords = new string[m_KeywordsSize];
|
||||||
for (int i = 0; i < keywordCount; i++)
|
for (int i = 0; i < m_KeywordsSize; i++)
|
||||||
{
|
{
|
||||||
m_Keywords[i] = reader.ReadAlignedString();
|
m_Keywords[i] = reader.ReadAlignedString();
|
||||||
}
|
}
|
||||||
|
if (m_Version >= 201806140)
|
||||||
|
{
|
||||||
|
var m_LocalKeywordsSize = reader.ReadInt32();
|
||||||
|
m_LocalKeywords = new string[m_LocalKeywordsSize];
|
||||||
|
for (int i = 0; i < m_LocalKeywordsSize; i++)
|
||||||
|
{
|
||||||
|
m_LocalKeywords[i] = reader.ReadAlignedString();
|
||||||
|
}
|
||||||
|
}
|
||||||
m_ProgramCode = reader.ReadBytes(reader.ReadInt32());
|
m_ProgramCode = reader.ReadBytes(reader.ReadInt32());
|
||||||
reader.AlignStream();
|
reader.AlignStream();
|
||||||
|
|
||||||
@ -660,7 +677,7 @@ namespace AssetStudio
|
|||||||
case ShaderGpuProgramType.kShaderGpuProgramDX11DomainSM50:
|
case ShaderGpuProgramType.kShaderGpuProgramDX11DomainSM50:
|
||||||
{
|
{
|
||||||
int start = 6;
|
int start = 6;
|
||||||
if (magic == 201509030) // 5.3
|
if (m_Version == 201509030) // 5.3
|
||||||
{
|
{
|
||||||
start = 5;
|
start = 5;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user