2019.1 support

This commit is contained in:
Perfare 2019-04-18 10:46:06 +08:00
parent 87e1739208
commit 8946a4fba5
11 changed files with 360 additions and 113 deletions

View File

@ -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" />

View File

@ -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)

View File

@ -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:

View File

@ -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();

View File

@ -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();

View File

@ -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"}
}; };
} }
} }

View File

@ -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();
}
} }
} }
} }

View File

@ -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)

View File

@ -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
View 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();
}
}
}

View File

@ -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;
} }