Improved file reading

This commit is contained in:
Perfare 2018-12-03 02:42:07 +08:00
parent 067517740f
commit 98c9eea58a
28 changed files with 517 additions and 616 deletions

View File

@ -13,7 +13,7 @@ namespace AssetStudio
private List<string> importFiles = new List<string>(); private List<string> importFiles = new List<string>();
private HashSet<string> importFilesHash = new HashSet<string>(); private HashSet<string> importFilesHash = new HashSet<string>();
private HashSet<string> assetsfileListHash = new HashSet<string>(); private HashSet<string> assetsFileListHash = new HashSet<string>();
public void LoadFiles(string[] files) public void LoadFiles(string[] files)
{ {
@ -49,7 +49,7 @@ namespace AssetStudio
importFiles.Clear(); importFiles.Clear();
importFilesHash.Clear(); importFilesHash.Clear();
assetsfileListHash.Clear(); assetsFileListHash.Clear();
ReadAssets(); ReadAssets();
ProcessGameObject(); ProcessGameObject();
@ -74,14 +74,14 @@ namespace AssetStudio
private void LoadAssetsFile(string fullName, EndianBinaryReader reader) private void LoadAssetsFile(string fullName, EndianBinaryReader reader)
{ {
var fileName = Path.GetFileName(fullName); var fileName = Path.GetFileName(fullName);
if (!assetsfileListHash.Contains(fileName.ToUpper())) if (!assetsFileListHash.Contains(fileName.ToUpper()))
{ {
Logger.Info($"Loading {fileName}"); Logger.Info($"Loading {fileName}");
var assetsFile = new SerializedFile(this, fullName, reader); try
if (assetsFile.valid)
{ {
var assetsFile = new SerializedFile(this, fullName, reader);
assetsFileList.Add(assetsFile); assetsFileList.Add(assetsFile);
assetsfileListHash.Add(assetsFile.upperFileName); assetsFileListHash.Add(assetsFile.upperFileName);
foreach (var sharedFile in assetsFile.m_Externals) foreach (var sharedFile in assetsFile.m_Externals)
{ {
@ -107,9 +107,10 @@ namespace AssetStudio
} }
} }
} }
else catch
{ {
reader.Dispose(); reader.Dispose();
//Logger.Error($"Unable to load assets file {fileName}");
} }
} }
else else
@ -120,24 +121,28 @@ namespace AssetStudio
private void LoadAssetsFromMemory(string fullName, EndianBinaryReader reader, string originalPath, string unityVersion = null) private void LoadAssetsFromMemory(string fullName, EndianBinaryReader reader, string originalPath, string unityVersion = null)
{ {
var fileName = Path.GetFileName(fullName); var upperFileName = Path.GetFileName(fullName).ToUpper();
if (!assetsfileListHash.Contains(fileName.ToUpper())) if (!assetsFileListHash.Contains(upperFileName))
{ {
var assetsFile = new SerializedFile(this, fullName, reader); try
if (assetsFile.valid)
{ {
var assetsFile = new SerializedFile(this, fullName, reader);
assetsFile.originalPath = originalPath; assetsFile.originalPath = originalPath;
if (assetsFile.header.m_Version < 7) if (assetsFile.header.m_Version < 7)
{ {
assetsFile.SetVersion(unityVersion); assetsFile.SetVersion(unityVersion);
} }
assetsFileList.Add(assetsFile); assetsFileList.Add(assetsFile);
assetsfileListHash.Add(assetsFile.upperFileName); assetsFileListHash.Add(assetsFile.upperFileName);
}
catch
{
//Logger.Error($"Unable to load assets file {fileName} from {Path.GetFileName(originalPath)}");
}
finally
{
resourceFileReaders.Add(upperFileName, reader);
} }
resourceFileReaders.Add(assetsFile.upperFileName, assetsFile.reader);
} }
} }
@ -145,12 +150,27 @@ namespace AssetStudio
{ {
var fileName = Path.GetFileName(fullName); var fileName = Path.GetFileName(fullName);
Logger.Info("Loading " + fileName); Logger.Info("Loading " + fileName);
var bundleFile = new BundleFile(reader, fullName); try
reader.Dispose();
foreach (var file in bundleFile.fileList)
{ {
var dummyPath = Path.GetDirectoryName(fullName) + "\\" + file.fileName; var bundleFile = new BundleFile(reader, fullName);
LoadAssetsFromMemory(dummyPath, new EndianBinaryReader(file.stream), parentPath ?? fullName, bundleFile.versionEngine); foreach (var file in bundleFile.fileList)
{
var dummyPath = Path.GetDirectoryName(fullName) + "\\" + file.fileName;
LoadAssetsFromMemory(dummyPath, new EndianBinaryReader(file.stream), parentPath ?? fullName, bundleFile.versionEngine);
}
}
catch
{
/*var str = $"Unable to load bundle file {fileName}";
if (parentPath != null)
{
str += $" from {Path.GetFileName(parentPath)}";
}
Logger.Error(str);*/
}
finally
{
reader.Dispose();
} }
} }
@ -158,24 +178,34 @@ namespace AssetStudio
{ {
var fileName = Path.GetFileName(fullName); var fileName = Path.GetFileName(fullName);
Logger.Info("Loading " + fileName); Logger.Info("Loading " + fileName);
var webFile = new WebFile(reader); try
reader.Dispose();
foreach (var file in webFile.fileList)
{ {
var dummyPath = Path.GetDirectoryName(fullName) + "\\" + file.fileName; var webFile = new WebFile(reader);
switch (CheckFileType(file.stream, out reader)) foreach (var file in webFile.fileList)
{ {
case FileType.AssetsFile: var dummyPath = Path.GetDirectoryName(fullName) + "\\" + file.fileName;
LoadAssetsFromMemory(dummyPath, reader, fullName); switch (CheckFileType(file.stream, out reader))
break; {
case FileType.BundleFile: case FileType.AssetsFile:
LoadBundleFile(dummyPath, reader, fullName); LoadAssetsFromMemory(dummyPath, reader, fullName);
break; break;
case FileType.WebFile: case FileType.BundleFile:
LoadWebFile(dummyPath, reader); LoadBundleFile(dummyPath, reader, fullName);
break; break;
case FileType.WebFile:
LoadWebFile(dummyPath, reader);
break;
}
} }
} }
catch
{
//Logger.Error($"Unable to load web file {fileName}");
}
finally
{
reader.Dispose();
}
} }
public void Clear() public void Clear()

View File

@ -85,10 +85,10 @@ namespace AssetStudio
int numData = reader.ReadInt32(); int numData = reader.ReadInt32();
m_Data = reader.ReadBytes(numData); m_Data = reader.ReadBytes(numData);
reader.AlignStream(4); reader.AlignStream();
m_BitSize = reader.ReadByte(); m_BitSize = reader.ReadByte();
reader.AlignStream(4); reader.AlignStream();
} }
public float[] UnpackFloats(int itemCountInChunk, int chunkStride, int start = 0, int numChunks = -1) public float[] UnpackFloats(int itemCountInChunk, int chunkStride, int start = 0, int numChunks = -1)
@ -142,10 +142,10 @@ namespace AssetStudio
int numData = reader.ReadInt32(); int numData = reader.ReadInt32();
m_Data = reader.ReadBytes(numData); m_Data = reader.ReadBytes(numData);
reader.AlignStream(4); reader.AlignStream();
m_BitSize = reader.ReadByte(); m_BitSize = reader.ReadByte();
reader.AlignStream(4); reader.AlignStream();
} }
public int[] UnpackInts() public int[] UnpackInts()
@ -187,7 +187,7 @@ namespace AssetStudio
int numData = reader.ReadInt32(); int numData = reader.ReadInt32();
m_Data = reader.ReadBytes(numData); m_Data = reader.ReadBytes(numData);
reader.AlignStream(4); reader.AlignStream();
} }
public Quaternion[] UnpackQuats() public Quaternion[] UnpackQuats()
@ -383,10 +383,7 @@ namespace AssetStudio
public HandPose(ObjectReader reader) public HandPose(ObjectReader reader)
{ {
m_GrabX = new xform(reader); m_GrabX = new xform(reader);
m_DoFArray = reader.ReadSingleArray();
int numDoFs = reader.ReadInt32();
m_DoFArray = reader.ReadSingleArray(numDoFs);
m_Override = reader.ReadSingle(); m_Override = reader.ReadSingle();
m_CloseOpen = reader.ReadSingle(); m_CloseOpen = reader.ReadSingle();
m_InOut = reader.ReadSingle(); m_InOut = reader.ReadSingle();
@ -444,8 +441,7 @@ namespace AssetStudio
m_LeftHandPose = new HandPose(reader); m_LeftHandPose = new HandPose(reader);
m_RightHandPose = new HandPose(reader); m_RightHandPose = new HandPose(reader);
int numDoFs = reader.ReadInt32(); m_DoFArray = reader.ReadSingleArray();
m_DoFArray = reader.ReadSingleArray(numDoFs);
if (version[0] > 5 || (version[0] == 5 && version[1] >= 2))//5.2 and up if (version[0] > 5 || (version[0] == 5 && version[1] >= 2))//5.2 and up
{ {
@ -466,8 +462,7 @@ namespace AssetStudio
public StreamedClip(ObjectReader reader) public StreamedClip(ObjectReader reader)
{ {
int numData = reader.ReadInt32(); data = reader.ReadUInt32Array();
data = reader.ReadUInt32Array(numData);
curveCount = reader.ReadUInt32(); curveCount = reader.ReadUInt32();
} }
@ -572,9 +567,7 @@ namespace AssetStudio
m_CurveCount = reader.ReadUInt32(); m_CurveCount = reader.ReadUInt32();
m_SampleRate = reader.ReadSingle(); m_SampleRate = reader.ReadSingle();
m_BeginTime = reader.ReadSingle(); m_BeginTime = reader.ReadSingle();
m_SampleArray = reader.ReadSingleArray();
int numSamples = reader.ReadInt32();
m_SampleArray = reader.ReadSingleArray(numSamples);
} }
} }
@ -584,8 +577,7 @@ namespace AssetStudio
public ConstantClip(ObjectReader reader) public ConstantClip(ObjectReader reader)
{ {
int numData = reader.ReadInt32(); data = reader.ReadSingleArray();
data = reader.ReadSingleArray(numData);
} }
} }
@ -713,16 +705,10 @@ namespace AssetStudio
m_CycleOffset = reader.ReadSingle(); m_CycleOffset = reader.ReadSingle();
m_AverageAngularSpeed = reader.ReadSingle(); m_AverageAngularSpeed = reader.ReadSingle();
int numIndices = reader.ReadInt32(); m_IndexArray = reader.ReadInt32Array();
m_IndexArray = reader.ReadInt32Array(numIndices);
if (version[0] < 4 || (version[0] == 4 && version[1] < 3)) //4.3 down if (version[0] < 4 || (version[0] == 4 && version[1] < 3)) //4.3 down
{ {
int numAdditionalCurveIndexs = reader.ReadInt32(); var m_AdditionalCurveIndexArray = reader.ReadInt32Array();
var m_AdditionalCurveIndexArray = new List<int>(numAdditionalCurveIndexs);
for (int i = 0; i < numAdditionalCurveIndexs; i++)
{
m_AdditionalCurveIndexArray.Add(reader.ReadInt32());
}
} }
int numDeltas = reader.ReadInt32(); int numDeltas = reader.ReadInt32();
m_ValueArrayDelta = new List<ValueDelta>(numDeltas); m_ValueArrayDelta = new List<ValueDelta>(numDeltas);
@ -732,7 +718,7 @@ namespace AssetStudio
} }
if (version[0] > 5 || (version[0] == 5 && version[1] >= 3))//5.3 and up if (version[0] > 5 || (version[0] == 5 && version[1] >= 3))//5.3 and up
{ {
m_ValueArrayReferencePose = reader.ReadSingleArray(reader.ReadInt32()); m_ValueArrayReferencePose = reader.ReadSingleArray();
} }
m_Mirror = reader.ReadBoolean(); m_Mirror = reader.ReadBoolean();
@ -749,7 +735,7 @@ namespace AssetStudio
m_KeepOriginalPositionY = reader.ReadBoolean(); m_KeepOriginalPositionY = reader.ReadBoolean();
m_KeepOriginalPositionXZ = reader.ReadBoolean(); m_KeepOriginalPositionXZ = reader.ReadBoolean();
m_HeightFromFeet = reader.ReadBoolean(); m_HeightFromFeet = reader.ReadBoolean();
reader.AlignStream(4); reader.AlignStream();
} }
} }
@ -778,7 +764,7 @@ namespace AssetStudio
} }
customType = reader.ReadByte(); customType = reader.ReadByte();
isPPtrCurve = reader.ReadByte(); isPPtrCurve = reader.ReadByte();
reader.AlignStream(4); reader.AlignStream();
} }
} }
@ -890,7 +876,7 @@ namespace AssetStudio
{ {
m_UseHighQualityCurve = reader.ReadBoolean(); m_UseHighQualityCurve = reader.ReadBoolean();
} }
reader.AlignStream(4); reader.AlignStream();
int numRCurves = reader.ReadInt32(); int numRCurves = reader.ReadInt32();
m_RotationCurves = new List<QuaternionCurve>(numRCurves); m_RotationCurves = new List<QuaternionCurve>(numRCurves);
for (int i = 0; i < numRCurves; i++) for (int i = 0; i < numRCurves; i++)
@ -965,7 +951,7 @@ namespace AssetStudio
m_Events = new List<AnimationEvent>(numEvents); m_Events = new List<AnimationEvent>(numEvents);
for (int i = 0; i < numEvents; i++) for (int i = 0; i < numEvents; i++)
{ {
m_Events.Add(new AnimationEvent(stream, file.Version[0] - '0')); m_Events.Add(new AnimationEvent(reader));
}*/ }*/
} }
} }

View File

@ -25,13 +25,13 @@ namespace AssetStudio
var m_ApplyRootMotion = reader.ReadBoolean(); var m_ApplyRootMotion = reader.ReadBoolean();
if (version[0] == 4 && version[1] >= 5) //4.5 and up - 5.0 down if (version[0] == 4 && version[1] >= 5) //4.5 and up - 5.0 down
{ {
reader.AlignStream(4); reader.AlignStream();
} }
if (version[0] >= 5) //5.0 and up if (version[0] >= 5) //5.0 and up
{ {
var m_LinearVelocityBlending = reader.ReadBoolean(); var m_LinearVelocityBlending = reader.ReadBoolean();
reader.AlignStream(4); reader.AlignStream();
} }
if (version[0] < 4 || (version[0] == 4 && version[1] < 5)) //4.5 down if (version[0] < 4 || (version[0] == 4 && version[1] < 5)) //4.5 down
@ -50,13 +50,13 @@ namespace AssetStudio
} }
if (version[0] >= 5 && version[0] < 2018) //5.0 and up - 2018 down if (version[0] >= 5 && version[0] < 2018) //5.0 and up - 2018 down
{ {
reader.AlignStream(4); reader.AlignStream();
} }
if (version[0] >= 2018) //2018 and up if (version[0] >= 2018) //2018 and up
{ {
var m_KeepAnimatorControllerStateOnDisable = reader.ReadBoolean(); var m_KeepAnimatorControllerStateOnDisable = reader.ReadBoolean();
reader.AlignStream(4); reader.AlignStream();
} }
} }
} }

View File

@ -73,7 +73,7 @@ namespace AssetStudio
m_DefaultWeight = reader.ReadSingle(); m_DefaultWeight = reader.ReadSingle();
m_IKPass = reader.ReadBoolean(); m_IKPass = reader.ReadBoolean();
m_SyncedLayerAffectsTiming = reader.ReadBoolean(); m_SyncedLayerAffectsTiming = reader.ReadBoolean();
reader.AlignStream(4); reader.AlignStream();
} }
} }
@ -135,7 +135,7 @@ namespace AssetStudio
m_ExitTime = reader.ReadSingle(); m_ExitTime = reader.ReadSingle();
m_HasExitTime = reader.ReadBoolean(); m_HasExitTime = reader.ReadBoolean();
m_HasFixedDuration = reader.ReadBoolean(); m_HasFixedDuration = reader.ReadBoolean();
reader.AlignStream(4); reader.AlignStream();
m_InterruptionSource = reader.ReadInt32(); m_InterruptionSource = reader.ReadInt32();
m_OrderedInterruption = reader.ReadBoolean(); m_OrderedInterruption = reader.ReadBoolean();
} }
@ -145,7 +145,7 @@ namespace AssetStudio
} }
m_CanTransitionToSelf = reader.ReadBoolean(); m_CanTransitionToSelf = reader.ReadBoolean();
reader.AlignStream(4); reader.AlignStream();
} }
} }
@ -156,7 +156,7 @@ namespace AssetStudio
public LeafInfoConstant(ObjectReader reader) public LeafInfoConstant(ObjectReader reader)
{ {
m_IDArray = reader.ReadUInt32Array(reader.ReadInt32()); m_IDArray = reader.ReadUInt32Array();
m_IndexOffset = reader.ReadUInt32(); m_IndexOffset = reader.ReadUInt32();
} }
} }
@ -167,7 +167,7 @@ namespace AssetStudio
public MotionNeighborList(ObjectReader reader) public MotionNeighborList(ObjectReader reader)
{ {
m_NeighborArray = reader.ReadUInt32Array(reader.ReadInt32()); m_NeighborArray = reader.ReadUInt32Array();
} }
} }
@ -181,10 +181,10 @@ namespace AssetStudio
public Blend2dDataConstant(ObjectReader reader) public Blend2dDataConstant(ObjectReader reader)
{ {
m_ChildPositionArray = reader.ReadVector2Array(reader.ReadInt32()); m_ChildPositionArray = reader.ReadVector2Array();
m_ChildMagnitudeArray = reader.ReadSingleArray(reader.ReadInt32()); m_ChildMagnitudeArray = reader.ReadSingleArray();
m_ChildPairVectorArray = reader.ReadVector2Array(reader.ReadInt32()); m_ChildPairVectorArray = reader.ReadVector2Array();
m_ChildPairAvgMagInvArray = reader.ReadSingleArray(reader.ReadInt32()); m_ChildPairAvgMagInvArray = reader.ReadSingleArray();
int numNeighbours = reader.ReadInt32(); int numNeighbours = reader.ReadInt32();
m_ChildNeighborListArray = new MotionNeighborList[numNeighbours]; m_ChildNeighborListArray = new MotionNeighborList[numNeighbours];
@ -201,7 +201,7 @@ namespace AssetStudio
public Blend1dDataConstant(ObjectReader reader) public Blend1dDataConstant(ObjectReader reader)
{ {
m_ChildThresholdArray = reader.ReadSingleArray(reader.ReadInt32()); m_ChildThresholdArray = reader.ReadSingleArray();
} }
} }
@ -212,9 +212,9 @@ namespace AssetStudio
public BlendDirectDataConstant(ObjectReader reader) public BlendDirectDataConstant(ObjectReader reader)
{ {
m_ChildBlendEventIDArray = reader.ReadUInt32Array(reader.ReadInt32()); m_ChildBlendEventIDArray = reader.ReadUInt32Array();
m_NormalizedBlendValues = reader.ReadBoolean(); m_NormalizedBlendValues = reader.ReadBoolean();
reader.AlignStream(4); reader.AlignStream();
} }
} }
@ -239,7 +239,7 @@ namespace AssetStudio
m_BlendType = reader.ReadUInt32(); m_BlendType = reader.ReadUInt32();
m_BlendEventID = reader.ReadUInt32(); m_BlendEventID = reader.ReadUInt32();
m_BlendEventYID = reader.ReadUInt32(); m_BlendEventYID = reader.ReadUInt32();
m_ChildIndices = reader.ReadUInt32Array(reader.ReadInt32()); m_ChildIndices = reader.ReadUInt32Array();
m_Blend1dData = new Blend1dDataConstant(reader); m_Blend1dData = new Blend1dDataConstant(reader);
m_Blend2dData = new Blend2dDataConstant(reader); m_Blend2dData = new Blend2dDataConstant(reader);
if (version[0] >= 5) //5.0 and up if (version[0] >= 5) //5.0 and up
@ -256,7 +256,7 @@ namespace AssetStudio
m_Duration = reader.ReadSingle(); m_Duration = reader.ReadSingle();
m_CycleOffset = reader.ReadSingle(); m_CycleOffset = reader.ReadSingle();
m_Mirror = reader.ReadBoolean(); m_Mirror = reader.ReadBoolean();
reader.AlignStream(4); reader.AlignStream();
} }
} }
@ -306,12 +306,7 @@ namespace AssetStudio
m_TransitionConstantArray[i] = new TransitionConstant(reader); m_TransitionConstantArray[i] = new TransitionConstant(reader);
} }
int numBlendIndices = reader.ReadInt32(); m_BlendTreeConstantIndexArray = reader.ReadInt32Array();
m_BlendTreeConstantIndexArray = new int[numBlendIndices];
for (int i = 0; i < numBlendIndices; i++)
{
m_BlendTreeConstantIndexArray[i] = reader.ReadInt32();
}
if (version[0] < 5) //5.0 down if (version[0] < 5) //5.0 down
{ {
@ -360,7 +355,7 @@ namespace AssetStudio
m_Loop = reader.ReadBoolean(); m_Loop = reader.ReadBoolean();
m_Mirror = reader.ReadBoolean(); m_Mirror = reader.ReadBoolean();
reader.AlignStream(4); reader.AlignStream();
} }
} }
@ -399,7 +394,7 @@ namespace AssetStudio
m_FullPathID = reader.ReadUInt32(); m_FullPathID = reader.ReadUInt32();
m_isEntry = reader.ReadBoolean(); m_isEntry = reader.ReadBoolean();
reader.AlignStream(4); reader.AlignStream();
} }
} }
@ -457,17 +452,12 @@ namespace AssetStudio
var version = reader.version; var version = reader.version;
if (version[0] < 5 || (version[0] == 5 && version[1] < 5)) //5.5 down if (version[0] < 5 || (version[0] == 5 && version[1] < 5)) //5.5 down
{ {
int numBools = reader.ReadInt32(); m_BoolValues = reader.ReadBooleanArray();
m_BoolValues = new bool[numBools];
for (int i = 0; i < numBools; i++)
{
m_BoolValues[i] = reader.ReadBoolean();
}
reader.AlignStream(4); reader.AlignStream();
m_IntValues = reader.ReadInt32Array(reader.ReadInt32()); m_IntValues = reader.ReadInt32Array();
m_FloatValues = reader.ReadSingleArray(reader.ReadInt32()); m_FloatValues = reader.ReadSingleArray();
} }
int numPosValues = reader.ReadInt32(); int numPosValues = reader.ReadInt32();
@ -477,28 +467,23 @@ namespace AssetStudio
m_PositionValues[i] = version[0] > 5 || (version[0] == 5 && version[1] >= 4) ? reader.ReadVector3() : (Vector3)reader.ReadVector4(); //5.4 and up m_PositionValues[i] = version[0] > 5 || (version[0] == 5 && version[1] >= 4) ? reader.ReadVector3() : (Vector3)reader.ReadVector4(); //5.4 and up
} }
m_QuaternionValues = reader.ReadVector4Array(reader.ReadInt32()); m_QuaternionValues = reader.ReadVector4Array();
int numScaleValues = reader.ReadInt32(); int numScaleValues = reader.ReadInt32();
m_ScaleValues = new Vector3[numScaleValues]; m_ScaleValues = new Vector3[numScaleValues];
for (int i = 0; i < numScaleValues; i++) for (int i = 0; i < numScaleValues; i++)
{ {
m_ScaleValues[i] = version[0] > 5 || (version[0] == 5 && version[1] >= 4) ? reader.ReadVector3() : (Vector3)reader.ReadVector4(); //5.4 adn up m_ScaleValues[i] = version[0] > 5 || (version[0] == 5 && version[1] >= 4) ? reader.ReadVector3() : (Vector3)reader.ReadVector4(); //5.4 and up
} }
if (version[0] > 5 || (version[0] == 5 && version[1] >= 5)) //5.5 and up if (version[0] > 5 || (version[0] == 5 && version[1] >= 5)) //5.5 and up
{ {
m_FloatValues = reader.ReadSingleArray(reader.ReadInt32()); m_FloatValues = reader.ReadSingleArray();
m_IntValues = reader.ReadInt32Array(reader.ReadInt32()); m_IntValues = reader.ReadInt32Array();
int numBools = reader.ReadInt32(); m_BoolValues = reader.ReadBooleanArray();
m_BoolValues = new bool[numBools];
for (int i = 0; i < numBools; i++)
{
m_BoolValues[i] = reader.ReadBoolean();
}
reader.AlignStream(4); reader.AlignStream();
} }
} }
} }

View File

@ -39,7 +39,7 @@ namespace AssetStudio
m_Type = (AudioType)reader.ReadInt32(); m_Type = (AudioType)reader.ReadInt32();
m_3D = reader.ReadBoolean(); m_3D = reader.ReadBoolean();
m_UseHardware = reader.ReadBoolean(); m_UseHardware = reader.ReadBoolean();
reader.AlignStream(4); reader.AlignStream();
if (version[0] >= 4 || (version[0] == 3 && version[1] >= 2)) //3.2.0 to 5 if (version[0] >= 4 || (version[0] == 3 && version[1] >= 2)) //3.2.0 to 5
{ {
@ -65,13 +65,12 @@ namespace AssetStudio
m_BitsPerSample = reader.ReadInt32(); m_BitsPerSample = reader.ReadInt32();
m_Length = reader.ReadSingle(); m_Length = reader.ReadSingle();
m_IsTrackerFormat = reader.ReadBoolean(); m_IsTrackerFormat = reader.ReadBoolean();
reader.AlignStream(4); reader.AlignStream();
m_SubsoundIndex = reader.ReadInt32(); m_SubsoundIndex = reader.ReadInt32();
m_PreloadAudioData = reader.ReadBoolean(); m_PreloadAudioData = reader.ReadBoolean();
m_LoadInBackground = reader.ReadBoolean(); m_LoadInBackground = reader.ReadBoolean();
m_Legacy3D = reader.ReadBoolean(); m_Legacy3D = reader.ReadBoolean();
reader.AlignStream(4); reader.AlignStream();
m_3D = m_Legacy3D;
m_Source = reader.ReadAlignedString(); m_Source = reader.ReadAlignedString();
m_Offset = reader.ReadInt64(); m_Offset = reader.ReadInt64();

View File

@ -67,7 +67,7 @@ namespace AssetStudio
public class Skeleton public class Skeleton
{ {
public List<Node> m_Node; public List<Node> m_Node;
public List<uint> m_ID; public uint[] m_ID;
public List<Axes> m_AxesArray; public List<Axes> m_AxesArray;
@ -80,12 +80,7 @@ namespace AssetStudio
m_Node.Add(new Node(reader)); m_Node.Add(new Node(reader));
} }
int numIDs = reader.ReadInt32(); m_ID = reader.ReadUInt32Array();
m_ID = new List<uint>(numIDs);
for (int i = 0; i < numIDs; i++)
{
m_ID.Add(reader.ReadUInt32());
}
int numAxes = reader.ReadInt32(); int numAxes = reader.ReadInt32();
m_AxesArray = new List<Axes>(numAxes); m_AxesArray = new List<Axes>(numAxes);
@ -118,16 +113,11 @@ namespace AssetStudio
public class Hand public class Hand
{ {
public List<int> m_HandBoneIndex; public int[] m_HandBoneIndex;
public Hand(ObjectReader reader) public Hand(ObjectReader reader)
{ {
int numIndexes = reader.ReadInt32(); m_HandBoneIndex = reader.ReadInt32Array();
m_HandBoneIndex = new List<int>(numIndexes);
for (int i = 0; i < numIndexes; i++)
{
m_HandBoneIndex.Add(reader.ReadInt32());
}
} }
} }
@ -180,9 +170,9 @@ namespace AssetStudio
public Hand m_RightHand; public Hand m_RightHand;
public List<Handle> m_Handles; public List<Handle> m_Handles;
public List<Collider> m_ColliderArray; public List<Collider> m_ColliderArray;
public List<int> m_HumanBoneIndex; public int[] m_HumanBoneIndex;
public List<float> m_HumanBoneMass; public float[] m_HumanBoneMass;
public List<int> m_ColliderIndex; public int[] m_ColliderIndex;
public float m_Scale; public float m_Scale;
public float m_ArmTwist; public float m_ArmTwist;
public float m_ForeArmTwist; public float m_ForeArmTwist;
@ -221,28 +211,13 @@ namespace AssetStudio
} }
} }
int numIndexes = reader.ReadInt32(); m_HumanBoneIndex = reader.ReadInt32Array();
m_HumanBoneIndex = new List<int>(numIndexes);
for (int i = 0; i < numIndexes; i++)
{
m_HumanBoneIndex.Add(reader.ReadInt32());
}
int numMasses = reader.ReadInt32(); m_HumanBoneMass = reader.ReadSingleArray();
m_HumanBoneMass = new List<float>(numMasses);
for (int i = 0; i < numMasses; i++)
{
m_HumanBoneMass.Add(reader.ReadSingle());
}
if (version[0] < 2018 || (version[0] == 2018 && version[1] < 2)) //2018.2 down if (version[0] < 2018 || (version[0] == 2018 && version[1] < 2)) //2018.2 down
{ {
int numColliderIndexes = reader.ReadInt32(); m_ColliderIndex = reader.ReadInt32Array();
m_ColliderIndex = new List<int>(numColliderIndexes);
for (int i = 0; i < numColliderIndexes; i++)
{
m_ColliderIndex.Add(reader.ReadInt32());
}
} }
m_Scale = reader.ReadSingle(); m_Scale = reader.ReadSingle();
@ -256,7 +231,7 @@ namespace AssetStudio
m_HasLeftHand = reader.ReadBoolean(); m_HasLeftHand = reader.ReadBoolean();
m_HasRightHand = reader.ReadBoolean(); m_HasRightHand = reader.ReadBoolean();
m_HasTDoF = reader.ReadBoolean(); m_HasTDoF = reader.ReadBoolean();
reader.AlignStream(4); reader.AlignStream();
} }
} }
@ -265,15 +240,15 @@ namespace AssetStudio
public Skeleton m_AvatarSkeleton; public Skeleton m_AvatarSkeleton;
public SkeletonPose m_AvatarSkeletonPose; public SkeletonPose m_AvatarSkeletonPose;
public SkeletonPose m_DefaultPose; public SkeletonPose m_DefaultPose;
public List<uint> m_SkeletonNameIDArray; public uint[] m_SkeletonNameIDArray;
public Human m_Human; public Human m_Human;
public List<int> m_HumanSkeletonIndexArray; public int[] m_HumanSkeletonIndexArray;
public List<int> m_HumanSkeletonReverseIndexArray; public int[] m_HumanSkeletonReverseIndexArray;
public int m_RootMotionBoneIndex; public int m_RootMotionBoneIndex;
public xform m_RootMotionBoneX; public xform m_RootMotionBoneX;
public Skeleton m_RootMotionSkeleton; public Skeleton m_RootMotionSkeleton;
public SkeletonPose m_RootMotionSkeletonPose; public SkeletonPose m_RootMotionSkeletonPose;
public List<int> m_RootMotionSkeletonIndexArray; public int[] m_RootMotionSkeletonIndexArray;
public AvatarConstant(ObjectReader reader) public AvatarConstant(ObjectReader reader)
{ {
@ -284,31 +259,17 @@ namespace AssetStudio
if (version[0] > 4 || (version[0] == 4 && version[1] >= 3)) //4.3 and up if (version[0] > 4 || (version[0] == 4 && version[1] >= 3)) //4.3 and up
{ {
m_DefaultPose = new SkeletonPose(reader); m_DefaultPose = new SkeletonPose(reader);
int numIDs = reader.ReadInt32();
m_SkeletonNameIDArray = new List<uint>(numIDs); m_SkeletonNameIDArray = reader.ReadUInt32Array();
for (int i = 0; i < numIDs; i++)
{
m_SkeletonNameIDArray.Add(reader.ReadUInt32());
}
} }
m_Human = new Human(reader); m_Human = new Human(reader);
int numIndexes = reader.ReadInt32(); m_HumanSkeletonIndexArray = reader.ReadInt32Array();
m_HumanSkeletonIndexArray = new List<int>(numIndexes);
for (int i = 0; i < numIndexes; i++)
{
m_HumanSkeletonIndexArray.Add(reader.ReadInt32());
}
if (version[0] > 4 || (version[0] == 4 && version[1] >= 3)) //4.3 and up if (version[0] > 4 || (version[0] == 4 && version[1] >= 3)) //4.3 and up
{ {
int numReverseIndexes = reader.ReadInt32(); m_HumanSkeletonReverseIndexArray = reader.ReadInt32Array();
m_HumanSkeletonReverseIndexArray = new List<int>(numReverseIndexes);
for (int i = 0; i < numReverseIndexes; i++)
{
m_HumanSkeletonReverseIndexArray.Add(reader.ReadInt32());
}
} }
m_RootMotionBoneIndex = reader.ReadInt32(); m_RootMotionBoneIndex = reader.ReadInt32();
@ -319,12 +280,7 @@ namespace AssetStudio
m_RootMotionSkeleton = new Skeleton(reader); m_RootMotionSkeleton = new Skeleton(reader);
m_RootMotionSkeletonPose = new SkeletonPose(reader); m_RootMotionSkeletonPose = new SkeletonPose(reader);
int numMotionIndexes = reader.ReadInt32(); m_RootMotionSkeletonIndexArray = reader.ReadInt32Array();
m_RootMotionSkeletonIndexArray = new List<int>(numMotionIndexes);
for (int i = 0; i < numMotionIndexes; i++)
{
m_RootMotionSkeletonIndexArray.Add(reader.ReadInt32());
}
} }
} }
} }

View File

@ -12,7 +12,7 @@ namespace AssetStudio
protected Behaviour(ObjectReader reader) : base(reader) protected Behaviour(ObjectReader reader) : base(reader)
{ {
m_Enabled = reader.ReadByte(); m_Enabled = reader.ReadByte();
reader.AlignStream(4); reader.AlignStream();
} }
} }
} }

View File

@ -11,11 +11,7 @@ namespace AssetStudio
public BuildSettings(ObjectReader reader) : base(reader) public BuildSettings(ObjectReader reader) : base(reader)
{ {
int levelsNum = reader.ReadInt32(); var levels = reader.ReadStringArray();
for (int i = 0; i < levelsNum; i++)
{
var level = reader.ReadAlignedString();
}
var hasRenderTexture = reader.ReadBoolean(); var hasRenderTexture = reader.ReadBoolean();
var hasPROVersion = reader.ReadBoolean(); var hasPROVersion = reader.ReadBoolean();

View File

@ -89,7 +89,7 @@ namespace AssetStudio
if (version[0] >= 4) if (version[0] >= 4)
{ {
var flipped = reader.ReadBoolean(); var flipped = reader.ReadBoolean();
reader.AlignStream(4); reader.AlignStream();
} }
} }
@ -106,7 +106,7 @@ namespace AssetStudio
if (version[0] <= 3) if (version[0] <= 3)
{ {
var m_GridFont = reader.ReadBoolean(); var m_GridFont = reader.ReadBoolean();
reader.AlignStream(4); reader.AlignStream();
} }
else { float m_PixelScale = reader.ReadSingle(); } else { float m_PixelScale = reader.ReadSingle(); }

View File

@ -1,117 +1,101 @@
using System; using System.Collections.Generic;
using System.Collections.Generic; using SharpDX;
using System.Linq;
using System.Text;
namespace AssetStudio namespace AssetStudio
{ {
public class TexEnv public class UnityTexEnv
{ {
public string name;
public PPtr<Texture> m_Texture; public PPtr<Texture> m_Texture;
public float[] m_Scale; public Vector2 m_Scale;
public float[] m_Offset; public Vector2 m_Offset;
public UnityTexEnv(ObjectReader reader)
{
m_Texture = new PPtr<Texture>(reader);
m_Scale = reader.ReadVector2();
m_Offset = reader.ReadVector2();
}
} }
public class strFloatPair public class UnityPropertySheet
{ {
public string first; public List<KeyValuePair<string, UnityTexEnv>> m_TexEnvs;
public float second; public List<KeyValuePair<string, float>> m_Floats;
} public List<KeyValuePair<string, Color4>> m_Colors;
public class strColorPair public UnityPropertySheet(ObjectReader reader)
{ {
public string first; int m_TexEnvsSize = reader.ReadInt32();
public float[] second; m_TexEnvs = new List<KeyValuePair<string, UnityTexEnv>>(m_TexEnvsSize);
for (int i = 0; i < m_TexEnvsSize; i++)
{
m_TexEnvs.Add(new KeyValuePair<string, UnityTexEnv>(reader.ReadAlignedString(), new UnityTexEnv(reader)));
}
int m_FloatsSize = reader.ReadInt32();
m_Floats = new List<KeyValuePair<string, float>>(m_FloatsSize);
for (int i = 0; i < m_FloatsSize; i++)
{
m_Floats.Add(new KeyValuePair<string, float>(reader.ReadAlignedString(), reader.ReadSingle()));
}
int m_ColorsSize = reader.ReadInt32();
m_Colors = new List<KeyValuePair<string, Color4>>(m_ColorsSize);
for (int i = 0; i < m_ColorsSize; i++)
{
m_Colors.Add(new KeyValuePair<string, Color4>(reader.ReadAlignedString(), reader.ReadColor4()));
}
}
} }
public sealed class Material : NamedObject public sealed class Material : NamedObject
{ {
public PPtr<Shader> m_Shader; public PPtr<Shader> m_Shader;
public string[] m_ShaderKeywords; public UnityPropertySheet m_SavedProperties;
public int m_CustomRenderQueue;
public TexEnv[] m_TexEnvs;
public strFloatPair[] m_Floats;
public strColorPair[] m_Colors;
public Material(ObjectReader reader) : base(reader) public Material(ObjectReader reader) : base(reader)
{ {
m_Shader = new PPtr<Shader>(reader); m_Shader = new PPtr<Shader>(reader);
if (version[0] == 4 && (version[1] >= 2 || (version[1] == 1 && !buildType.IsAlpha))) if (version[0] == 4 && version[1] >= 1) //4.x
{ {
m_ShaderKeywords = new string[reader.ReadInt32()]; var m_ShaderKeywords = reader.ReadStringArray();
for (int i = 0; i < m_ShaderKeywords.Length; i++)
{
m_ShaderKeywords[i] = reader.ReadAlignedString();
}
} }
else if (version[0] >= 5)//5.0 and up
if (version[0] >= 5) //5.0 and up
{ {
m_ShaderKeywords = new[] { reader.ReadAlignedString() }; var m_ShaderKeywords = reader.ReadAlignedString();
uint m_LightmapFlags = reader.ReadUInt32(); var m_LightmapFlags = reader.ReadUInt32();
if (version[0] == 5 && version[1] >= 6 || version[0] > 5)//5.6.0 and up }
if (version[0] > 5 || (version[0] == 5 && version[1] >= 6)) //5.6 and up
{
var m_EnableInstancingVariants = reader.ReadBoolean();
//var m_DoubleSidedGI = a_Stream.ReadBoolean(); //2017 and up
reader.AlignStream();
}
if (version[0] > 4 || (version[0] == 4 && version[1] >= 3)) //4.3 and up
{
var m_CustomRenderQueue = reader.ReadInt32();
}
if (version[0] > 5 || (version[0] == 5 && version[1] >= 1)) //5.1 and up
{
var stringTagMapSize = reader.ReadInt32();
for (int i = 0; i < stringTagMapSize; i++)
{ {
var m_EnableInstancingVariants = reader.ReadBoolean(); var first = reader.ReadAlignedString();
//var m_DoubleSidedGI = a_Stream.ReadBoolean();//2017.x var second = reader.ReadAlignedString();
reader.AlignStream(4);
} }
} }
if (version[0] > 4 || version[0] == 4 && version[1] >= 3) { m_CustomRenderQueue = reader.ReadInt32(); } if (version[0] > 5 || (version[0] == 5 && version[1] >= 6)) //5.6 and up
if (version[0] == 5 && version[1] >= 1 || version[0] > 5)//5.1 and up
{ {
string[][] stringTagMap = new string[reader.ReadInt32()][]; var disabledShaderPasses = reader.ReadStringArray();
for (int i = 0; i < stringTagMap.Length; i++)
{
stringTagMap[i] = new[] { reader.ReadAlignedString(), reader.ReadAlignedString() };
}
}
//disabledShaderPasses
if ((version[0] == 5 && version[1] >= 6) || version[0] > 5)//5.6.0 and up
{
var size = reader.ReadInt32();
for (int i = 0; i < size; i++)
{
reader.ReadAlignedString();
}
}
//m_SavedProperties
m_TexEnvs = new TexEnv[reader.ReadInt32()];
for (int i = 0; i < m_TexEnvs.Length; i++)
{
TexEnv m_TexEnv = new TexEnv()
{
name = reader.ReadAlignedString(),
m_Texture = new PPtr<Texture>(reader),
m_Scale = new[] { reader.ReadSingle(), reader.ReadSingle() },
m_Offset = new[] { reader.ReadSingle(), reader.ReadSingle() }
};
m_TexEnvs[i] = m_TexEnv;
} }
m_Floats = new strFloatPair[reader.ReadInt32()]; m_SavedProperties = new UnityPropertySheet(reader);
for (int i = 0; i < m_Floats.Length; i++)
{
strFloatPair m_Float = new strFloatPair()
{
first = reader.ReadAlignedString(),
second = reader.ReadSingle()
};
m_Floats[i] = m_Float;
}
m_Colors = new strColorPair[reader.ReadInt32()];
for (int i = 0; i < m_Colors.Length; i++)
{
strColorPair m_Color = new strColorPair()
{
first = reader.ReadAlignedString(),
second = new[] { reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle() }
};
m_Colors[i] = m_Color;
}
} }
} }
} }

View File

@ -10,7 +10,6 @@ namespace AssetStudio
{ {
public List<SubMesh> m_SubMeshes = new List<SubMesh>(); public List<SubMesh> m_SubMeshes = new List<SubMesh>();
public List<uint> m_Indices = new List<uint>(); //use a list because I don't always know the facecount for triangle strips public List<uint> m_Indices = new List<uint>(); //use a list because I don't always know the facecount for triangle strips
public List<int> m_materialIDs = new List<int>();
private uint[] m_IndexBuffer; private uint[] m_IndexBuffer;
private ChannelInfo[] m_Channels; private ChannelInfo[] m_Channels;
private StreamInfo[] m_Streams; private StreamInfo[] m_Streams;
@ -93,7 +92,7 @@ namespace AssetStudio
vertexCount = reader.ReadUInt32(); vertexCount = reader.ReadUInt32();
hasNormals = reader.ReadBoolean(); hasNormals = reader.ReadBoolean();
hasTangents = reader.ReadBoolean(); hasTangents = reader.ReadBoolean();
reader.AlignStream(4); reader.AlignStream();
} }
} }
@ -259,7 +258,7 @@ namespace AssetStudio
{ {
m_IndexBuffer = new uint[m_IndexBuffer_size / 2]; m_IndexBuffer = new uint[m_IndexBuffer_size / 2];
for (int i = 0; i < m_IndexBuffer_size / 2; i++) { m_IndexBuffer[i] = reader.ReadUInt16(); } for (int i = 0; i < m_IndexBuffer_size / 2; i++) { m_IndexBuffer[i] = reader.ReadUInt16(); }
reader.AlignStream(4); reader.AlignStream();
} }
else else
{ {
@ -356,7 +355,7 @@ namespace AssetStudio
var m_UsedForStaticMeshColliderOnly = reader.ReadBoolean(); var m_UsedForStaticMeshColliderOnly = reader.ReadBoolean();
} }
} }
reader.AlignStream(4); reader.AlignStream();
//This is a bug fixed in 2017.3.1p1 and later versions //This is a bug fixed in 2017.3.1p1 and later versions
if ((version[0] > 2017 || (version[0] == 2017 && version[1] >= 4)) || //2017.4 if ((version[0] > 2017 || (version[0] == 2017 && version[1] >= 4)) || //2017.4
((version[0] == 2017 && version[1] == 3 && version[2] == 1) && buildType.IsPatch) || //fixed after 2017.3.1px ((version[0] == 2017 && version[1] == 3 && version[2] == 1) && buildType.IsPatch) || //fixed after 2017.3.1px
@ -370,13 +369,13 @@ namespace AssetStudio
{ {
m_IndexBuffer = new uint[m_IndexBuffer_size / 2]; m_IndexBuffer = new uint[m_IndexBuffer_size / 2];
for (int i = 0; i < m_IndexBuffer_size / 2; i++) { m_IndexBuffer[i] = reader.ReadUInt16(); } for (int i = 0; i < m_IndexBuffer_size / 2; i++) { m_IndexBuffer[i] = reader.ReadUInt16(); }
reader.AlignStream(4); reader.AlignStream();
} }
else else
{ {
m_IndexBuffer = new uint[m_IndexBuffer_size / 4]; m_IndexBuffer = new uint[m_IndexBuffer_size / 4];
for (int i = 0; i < m_IndexBuffer_size / 4; i++) { m_IndexBuffer[i] = reader.ReadUInt32(); } for (int i = 0; i < m_IndexBuffer_size / 4; i++) { m_IndexBuffer[i] = reader.ReadUInt32(); }
reader.AlignStream(4);//untested reader.AlignStream();//untested
} }
} }
#endregion #endregion
@ -568,7 +567,7 @@ namespace AssetStudio
//actual Vertex Buffer //actual Vertex Buffer
var m_DataSize = reader.ReadBytes(reader.ReadInt32()); var m_DataSize = reader.ReadBytes(reader.ReadInt32());
reader.AlignStream(4); reader.AlignStream();
#endregion #endregion
#region compute FvF #region compute FvF
@ -1099,7 +1098,6 @@ namespace AssetStudio
m_Indices.Add(m_IndexBuffer[firstIndex + i * 3]); m_Indices.Add(m_IndexBuffer[firstIndex + i * 3]);
m_Indices.Add(m_IndexBuffer[firstIndex + i * 3 + 1]); m_Indices.Add(m_IndexBuffer[firstIndex + i * 3 + 1]);
m_Indices.Add(m_IndexBuffer[firstIndex + i * 3 + 2]); m_Indices.Add(m_IndexBuffer[firstIndex + i * 3 + 2]);
m_materialIDs.Add(s);
} }
} }
else else
@ -1124,7 +1122,6 @@ namespace AssetStudio
m_Indices.Add(fc); m_Indices.Add(fc);
m_Indices.Add(fb); m_Indices.Add(fb);
} }
m_materialIDs.Add(s);
j++; j++;
} }
} }

View File

@ -7,7 +7,6 @@ namespace AssetStudio
{ {
public sealed class MeshFilter : Component public sealed class MeshFilter : Component
{ {
public long preloadIndex;
public PPtr<Mesh> m_Mesh; public PPtr<Mesh> m_Mesh;
public MeshFilter(ObjectReader reader) : base(reader) public MeshFilter(ObjectReader reader) : base(reader)

View File

@ -13,7 +13,7 @@ namespace AssetStudio
public MovieTexture(ObjectReader reader) : base(reader) public MovieTexture(ObjectReader reader) : base(reader)
{ {
var m_Loop = reader.ReadBoolean(); var m_Loop = reader.ReadBoolean();
reader.AlignStream(4); reader.AlignStream();
m_AudioClip = new PPtr<AudioClip>(reader); m_AudioClip = new PPtr<AudioClip>(reader);
m_MovieData = reader.ReadBytes(reader.ReadInt32()); m_MovieData = reader.ReadBytes(reader.ReadInt32());
} }

View File

@ -20,7 +20,7 @@ namespace AssetStudio
var AndroidProfiler = reader.ReadBoolean(); var AndroidProfiler = reader.ReadBoolean();
//bool AndroidFilterTouchesWhenObscured 2017.2 and up //bool AndroidFilterTouchesWhenObscured 2017.2 and up
//bool AndroidEnableSustainedPerformanceMode 2018 and up //bool AndroidEnableSustainedPerformanceMode 2018 and up
reader.AlignStream(4); reader.AlignStream();
int defaultScreenOrientation = reader.ReadInt32(); int defaultScreenOrientation = reader.ReadInt32();
int targetDevice = reader.ReadInt32(); int targetDevice = reader.ReadInt32();
if (version[0] < 5 || (version[0] == 5 && version[1] < 3)) //5.3 down if (version[0] < 5 || (version[0] == 5 && version[1] < 3)) //5.3 down
@ -38,7 +38,7 @@ namespace AssetStudio
else else
{ {
var useOnDemandResources = reader.ReadBoolean(); var useOnDemandResources = reader.ReadBoolean();
reader.AlignStream(4); reader.AlignStream();
} }
if (version[0] > 3 || (version[0] == 3 && version[1] >= 5)) //3.5 and up if (version[0] > 3 || (version[0] == 3 && version[1] >= 5)) //3.5 and up
{ {

View File

@ -9,6 +9,12 @@ namespace AssetStudio
{ {
public ushort firstSubMesh; public ushort firstSubMesh;
public ushort subMeshCount; public ushort subMeshCount;
public StaticBatchInfo(ObjectReader reader)
{
firstSubMesh = reader.ReadUInt16();
subMeshCount = reader.ReadUInt16();
}
} }
public abstract class Renderer : Component public abstract class Renderer : Component
@ -19,97 +25,114 @@ namespace AssetStudio
protected Renderer(ObjectReader reader) : base(reader) protected Renderer(ObjectReader reader) : base(reader)
{ {
if (version[0] < 5) if (version[0] < 5) //5.0 down
{ {
var m_Enabled = reader.ReadBoolean(); var m_Enabled = reader.ReadBoolean();
var m_CastShadows = reader.ReadByte(); var m_CastShadows = reader.ReadBoolean();
var m_ReceiveShadows = reader.ReadBoolean(); var m_ReceiveShadows = reader.ReadBoolean();
var m_LightmapIndex = reader.ReadByte(); var m_LightmapIndex = reader.ReadByte();
} }
else else //5.0 and up
{ {
var m_Enabled = reader.ReadBoolean(); if (version[0] > 5 || (version[0] == 5 && version[1] >= 4)) //5.4 and up
reader.AlignStream(4); {
var m_CastShadows = reader.ReadByte(); var m_Enabled = reader.ReadBoolean();
var m_ReceiveShadows = reader.ReadBoolean(); var m_CastShadows = reader.ReadByte();
reader.AlignStream(4); var m_ReceiveShadows = reader.ReadByte();
if (version[0] >= 2018)//2018 and up if (version[0] > 2017 || (version[0] == 2017 && version[0] >= 2)) //2017.2 and up
{
var m_DynamicOccludee = reader.ReadByte();
}
var m_MotionVectors = reader.ReadByte();
var m_LightProbeUsage = reader.ReadByte();
var m_ReflectionProbeUsage = reader.ReadByte();
reader.AlignStream();
}
else
{
var m_Enabled = reader.ReadBoolean();
reader.AlignStream();
var m_CastShadows = reader.ReadByte();
var m_ReceiveShadows = reader.ReadBoolean();
reader.AlignStream();
}
if (version[0] >= 2018) //2018 and up
{ {
var m_RenderingLayerMask = reader.ReadUInt32(); var m_RenderingLayerMask = reader.ReadUInt32();
} }
var m_LightmapIndex = reader.ReadUInt16(); var m_LightmapIndex = reader.ReadUInt16();
var m_LightmapIndexDynamic = reader.ReadUInt16(); var m_LightmapIndexDynamic = reader.ReadUInt16();
} }
if (version[0] >= 3) if (version[0] >= 3) //3.0 and up
{ {
reader.Position += 16;//Vector4f m_LightmapTilingOffset var m_LightmapTilingOffset = reader.ReadVector4();
} }
if (version[0] >= 5) if (version[0] >= 5) //5.0 and up
{ {
reader.Position += 16;//Vector4f m_LightmapTilingOffsetDynamic var m_LightmapTilingOffsetDynamic = reader.ReadVector4();
} }
m_Materials = new PPtr<Material>[reader.ReadInt32()]; var m_MaterialsSize = reader.ReadInt32();
for (int m = 0; m < m_Materials.Length; m++) m_Materials = new PPtr<Material>[m_MaterialsSize];
for (int i = 0; i < m_MaterialsSize; i++)
{ {
m_Materials[m] = new PPtr<Material>(reader); m_Materials[i] = new PPtr<Material>(reader);
} }
if (version[0] < 3) if (version[0] < 3) //3.0 down
{ {
reader.Position += 16;//m_LightmapTilingOffset vector4d var m_LightmapTilingOffset = reader.ReadVector4();
} }
else else //3.0 and up
{ {
if ((version[0] == 5 && version[1] >= 5) || version[0] > 5)//5.5.0 and up if (version[0] > 5 || (version[0] == 5 && version[1] >= 5)) //5.5 and up
{ {
m_StaticBatchInfo = new StaticBatchInfo m_StaticBatchInfo = new StaticBatchInfo(reader);
{
firstSubMesh = reader.ReadUInt16(),
subMeshCount = reader.ReadUInt16()
};
} }
else else
{ {
int numSubsetIndices = reader.ReadInt32(); m_SubsetIndices = reader.ReadUInt32Array();
m_SubsetIndices = reader.ReadUInt32Array(numSubsetIndices);
} }
var m_StaticBatchRoot = new PPtr<Transform>(reader); var m_StaticBatchRoot = new PPtr<Transform>(reader);
}
if ((version[0] == 5 && version[1] >= 4) || version[0] > 5)//5.4.0 and up if (version[0] > 5 || (version[0] == 5 && version[1] >= 4)) //5.4 and up
{
var m_ProbeAnchor = new PPtr<Transform>(reader);
var m_LightProbeVolumeOverride = new PPtr<GameObject>(reader);
}
else if (version[0] > 3 || (version[0] == 3 && version[1] >= 5)) //3.5 - 5.3
{
var m_UseLightProbes = reader.ReadBoolean();
reader.AlignStream();
if (version[0] >= 5)//5.0 and up
{ {
var m_ProbeAnchor = new PPtr<Transform>(reader); var m_ReflectionProbeUsage = reader.ReadInt32();
var m_LightProbeVolumeOverride = new PPtr<GameObject>(reader);
}
else if (version[0] >= 4 || (version[0] == 3 && version[1] >= 5))//3.5 - 5.3
{
var m_UseLightProbes = reader.ReadBoolean();
reader.AlignStream(4);
if (version[0] == 5)//5.0 and up
{
int m_ReflectionProbeUsage = reader.ReadInt32();
}
var m_LightProbeAnchor = new PPtr<Transform>(reader);
} }
if (version[0] >= 5 || (version[0] == 4 && version[1] >= 3))//4.3 and up var m_LightProbeAnchor = new PPtr<Transform>(reader); //5.0 and up m_ProbeAnchor
{ }
if (version[0] == 4 && version[1] == 3)//4.3
{
int m_SortingLayer = reader.ReadInt16();
}
else
{
int m_SortingLayerID = reader.ReadInt32();
//SInt16 m_SortingOrder 5.6 and up
}
int m_SortingOrder = reader.ReadInt16(); if (version[0] > 4 || (version[0] == 4 && version[1] >= 3)) //4.3 and up
reader.AlignStream(4); {
if (version[0] == 4 && version[1] == 3) //4.3
{
var m_SortingLayer = reader.ReadInt16();
} }
else
{
var m_SortingLayerID = reader.ReadUInt32();
}
//SInt16 m_SortingLayer 5.6 and up
var m_SortingOrder = reader.ReadInt16();
reader.AlignStream();
} }
} }
} }

View File

@ -81,34 +81,20 @@ namespace AssetStudio
{ {
public string m_Name; public string m_Name;
public string m_Description; public string m_Description;
public List<string> m_Attributes; public string[] m_Attributes;
public SerializedPropertyType m_Type; public SerializedPropertyType m_Type;
public uint m_Flags; public uint m_Flags;
public List<float> m_DefValue; public float[] m_DefValue;
public SerializedTextureProperty m_DefTexture; public SerializedTextureProperty m_DefTexture;
public SerializedProperty(BinaryReader reader) public SerializedProperty(BinaryReader reader)
{ {
m_Name = reader.ReadAlignedString(); m_Name = reader.ReadAlignedString();
m_Description = reader.ReadAlignedString(); m_Description = reader.ReadAlignedString();
m_Attributes = reader.ReadStringArray();
int numAttributes = reader.ReadInt32();
m_Attributes = new List<string>(numAttributes);
for (int i = 0; i < numAttributes; i++)
{
m_Attributes.Add(reader.ReadAlignedString());
}
m_Type = (SerializedPropertyType)reader.ReadInt32(); m_Type = (SerializedPropertyType)reader.ReadInt32();
m_Flags = reader.ReadUInt32(); m_Flags = reader.ReadUInt32();
m_DefValue = reader.ReadSingleArray(4);
int numValues = 4;
m_DefValue = new List<float>(numValues);
for (int i = 0; i < numValues; i++)
{
m_DefValue.Add(reader.ReadSingle());
}
m_DefTexture = new SerializedTextureProperty(reader); m_DefTexture = new SerializedTextureProperty(reader);
} }
} }
@ -255,7 +241,7 @@ namespace AssetStudio
rtBlend6 = new SerializedShaderRTBlendState(reader); rtBlend6 = new SerializedShaderRTBlendState(reader);
rtBlend7 = new SerializedShaderRTBlendState(reader); rtBlend7 = new SerializedShaderRTBlendState(reader);
rtSeparateBlend = reader.ReadBoolean(); rtSeparateBlend = reader.ReadBoolean();
reader.AlignStream(4); reader.AlignStream();
if (version[0] > 2017 || (version[0] == 2017 && version[1] >= 2)) //2017.2 and up if (version[0] > 2017 || (version[0] == 2017 && version[1] >= 2)) //2017.2 and up
{ {
zClip = new SerializedShaderFloatValue(reader); zClip = new SerializedShaderFloatValue(reader);
@ -281,7 +267,7 @@ namespace AssetStudio
m_Tags = new SerializedTagMap(reader); m_Tags = new SerializedTagMap(reader);
m_LOD = reader.ReadInt32(); m_LOD = reader.ReadInt32();
lighting = reader.ReadBoolean(); lighting = reader.ReadBoolean();
reader.AlignStream(4); reader.AlignStream();
} }
} }
@ -310,7 +296,7 @@ namespace AssetStudio
{ {
m_Channels.Add(new ShaderBindChannel(reader)); m_Channels.Add(new ShaderBindChannel(reader));
} }
reader.AlignStream(4); reader.AlignStream();
m_SourceMap = reader.ReadUInt32(); m_SourceMap = reader.ReadUInt32();
} }
@ -331,7 +317,7 @@ namespace AssetStudio
m_ArraySize = reader.ReadInt32(); m_ArraySize = reader.ReadInt32();
m_Type = reader.ReadSByte(); m_Type = reader.ReadSByte();
m_Dim = reader.ReadSByte(); m_Dim = reader.ReadSByte();
reader.AlignStream(4); reader.AlignStream();
} }
} }
@ -350,7 +336,7 @@ namespace AssetStudio
m_ArraySize = reader.ReadInt32(); m_ArraySize = reader.ReadInt32();
m_Type = reader.ReadSByte(); m_Type = reader.ReadSByte();
m_RowCount = reader.ReadSByte(); m_RowCount = reader.ReadSByte();
reader.AlignStream(4); reader.AlignStream();
} }
} }
@ -373,7 +359,7 @@ namespace AssetStudio
var m_MultiSampled = reader.ReadBoolean(); var m_MultiSampled = reader.ReadBoolean();
} }
m_Dim = reader.ReadSByte(); m_Dim = reader.ReadSByte();
reader.AlignStream(4); reader.AlignStream();
} }
} }
@ -478,7 +464,7 @@ namespace AssetStudio
{ {
public uint m_BlobIndex; public uint m_BlobIndex;
public ParserBindChannels m_Channels; public ParserBindChannels m_Channels;
public List<ushort> m_KeywordIndices; public ushort[] m_KeywordIndices;
public sbyte m_ShaderHardwareTier; public sbyte m_ShaderHardwareTier;
public ShaderGpuProgramType m_GpuProgramType; public ShaderGpuProgramType m_GpuProgramType;
public List<VectorParameter> m_VectorParams; public List<VectorParameter> m_VectorParams;
@ -497,19 +483,14 @@ namespace AssetStudio
m_BlobIndex = reader.ReadUInt32(); m_BlobIndex = reader.ReadUInt32();
m_Channels = new ParserBindChannels(reader); m_Channels = new ParserBindChannels(reader);
int numIndices = reader.ReadInt32(); m_KeywordIndices = reader.ReadUInt16Array();
m_KeywordIndices = new List<ushort>(numIndices);
for (int i = 0; i < numIndices; i++)
{
m_KeywordIndices.Add(reader.ReadUInt16());
}
if (version[0] >= 2017) //2017 and up if (version[0] >= 2017) //2017 and up
{ {
reader.AlignStream(4); reader.AlignStream();
} }
m_ShaderHardwareTier = reader.ReadSByte(); m_ShaderHardwareTier = reader.ReadSByte();
m_GpuProgramType = (ShaderGpuProgramType)reader.ReadSByte(); m_GpuProgramType = (ShaderGpuProgramType)reader.ReadSByte();
reader.AlignStream(4); reader.AlignStream();
int numVectorParams = reader.ReadInt32(); int numVectorParams = reader.ReadInt32();
m_VectorParams = new List<VectorParameter>(numVectorParams); m_VectorParams = new List<VectorParameter>(numVectorParams);
@ -639,7 +620,7 @@ namespace AssetStudio
{ {
var m_HasProceduralInstancingVariant = reader.ReadBoolean(); var m_HasProceduralInstancingVariant = reader.ReadBoolean();
} }
reader.AlignStream(4); reader.AlignStream();
m_UseName = reader.ReadAlignedString(); m_UseName = reader.ReadAlignedString();
m_Name = reader.ReadAlignedString(); m_Name = reader.ReadAlignedString();
m_TextureName = reader.ReadAlignedString(); m_TextureName = reader.ReadAlignedString();
@ -727,7 +708,7 @@ namespace AssetStudio
} }
m_DisableNoSubshadersMessage = reader.ReadBoolean(); m_DisableNoSubshadersMessage = reader.ReadBoolean();
reader.AlignStream(4); reader.AlignStream();
} }
} }
@ -739,10 +720,10 @@ namespace AssetStudio
public byte[] m_SubProgramBlob; public byte[] m_SubProgramBlob;
//5.5 and up //5.5 and up
public SerializedShader m_ParsedForm; public SerializedShader m_ParsedForm;
public List<uint> platforms; public uint[] platforms;
public List<uint> offsets; public uint[] offsets;
public List<uint> compressedLengths; public uint[] compressedLengths;
public List<uint> decompressedLengths; public uint[] decompressedLengths;
public byte[] compressedBlob; public byte[] compressedBlob;
public Shader(ObjectReader reader) : base(reader) public Shader(ObjectReader reader) : base(reader)
@ -750,40 +731,16 @@ namespace AssetStudio
if (version[0] == 5 && version[1] >= 5 || version[0] > 5) //5.5 and up if (version[0] == 5 && version[1] >= 5 || version[0] > 5) //5.5 and up
{ {
m_ParsedForm = new SerializedShader(reader); m_ParsedForm = new SerializedShader(reader);
int numPlatforms = reader.ReadInt32(); platforms = reader.ReadUInt32Array();
platforms = new List<uint>(numPlatforms); offsets = reader.ReadUInt32Array();
for (int i = 0; i < numPlatforms; i++) compressedLengths = reader.ReadUInt32Array();
{ decompressedLengths = reader.ReadUInt32Array();
platforms.Add(reader.ReadUInt32());
}
int numOffsets = reader.ReadInt32();
offsets = new List<uint>(numOffsets);
for (int i = 0; i < numOffsets; i++)
{
offsets.Add(reader.ReadUInt32());
}
int numCompressedLengths = reader.ReadInt32();
compressedLengths = new List<uint>(numCompressedLengths);
for (int i = 0; i < numCompressedLengths; i++)
{
compressedLengths.Add(reader.ReadUInt32());
}
int numDecompressedLengths = reader.ReadInt32();
decompressedLengths = new List<uint>(numDecompressedLengths);
for (int i = 0; i < numDecompressedLengths; i++)
{
decompressedLengths.Add(reader.ReadUInt32());
}
compressedBlob = reader.ReadBytes(reader.ReadInt32()); compressedBlob = reader.ReadBytes(reader.ReadInt32());
} }
else else
{ {
m_Script = reader.ReadBytes(reader.ReadInt32()); m_Script = reader.ReadBytes(reader.ReadInt32());
reader.AlignStream(4); reader.AlignStream();
var m_PathName = reader.ReadAlignedString(); var m_PathName = reader.ReadAlignedString();
if (version[0] == 5 && version[1] >= 3) //5.3 - 5.4 if (version[0] == 5 && version[1] >= 3) //5.3 - 5.4
{ {

View File

@ -9,16 +9,16 @@ namespace AssetStudio
{ {
public PPtr<Mesh> m_Mesh; public PPtr<Mesh> m_Mesh;
public PPtr<Transform>[] m_Bones; public PPtr<Transform>[] m_Bones;
public List<float> m_BlendShapeWeights; public float[] m_BlendShapeWeights;
public SkinnedMeshRenderer(ObjectReader reader) : base(reader) public SkinnedMeshRenderer(ObjectReader reader) : base(reader)
{ {
int m_Quality = reader.ReadInt32(); int m_Quality = reader.ReadInt32();
var m_UpdateWhenOffscreen = reader.ReadBoolean(); var m_UpdateWhenOffscreen = reader.ReadBoolean();
var m_SkinNormals = reader.ReadBoolean(); //3.1.0 and below var m_SkinNormals = reader.ReadBoolean(); //3.1.0 and below
reader.AlignStream(4); reader.AlignStream();
if (version[0] == 2 && version[1] < 6)//2.6 down if (version[0] == 2 && version[1] < 6) //2.6 down
{ {
var m_DisableAnimationWhenOffscreen = new PPtr<Animation>(reader); var m_DisableAnimationWhenOffscreen = new PPtr<Animation>(reader);
} }
@ -31,22 +31,9 @@ namespace AssetStudio
m_Bones[b] = new PPtr<Transform>(reader); m_Bones[b] = new PPtr<Transform>(reader);
} }
if (version[0] < 3) if (version[0] > 4 || (version[0] == 4 && version[1] >= 3)) //4.3 and up
{ {
int m_BindPose = reader.ReadInt32(); m_BlendShapeWeights = reader.ReadSingleArray();
reader.Position += m_BindPose * 16 * 4;//Matrix4x4f
}
else
{
if (version[0] > 4 || (version[0] == 4 && version[1] >= 3))//4.3 and up
{
int numBSWeights = reader.ReadInt32();
m_BlendShapeWeights = new List<float>(numBSWeights);
for (int i = 0; i < numBSWeights; i++)
{
m_BlendShapeWeights.Add(reader.ReadSingle());
}
}
} }
} }
} }

View File

@ -164,7 +164,7 @@ namespace AssetStudio
} }
m_DataSize = reader.ReadBytes(reader.ReadInt32()); m_DataSize = reader.ReadBytes(reader.ReadInt32());
reader.AlignStream(4); reader.AlignStream();
} }
} }
@ -244,7 +244,7 @@ namespace AssetStudio
} }
m_IndexBuffer = reader.ReadBytes(reader.ReadInt32()); m_IndexBuffer = reader.ReadBytes(reader.ReadInt32());
reader.AlignStream(4); reader.AlignStream();
m_VertexData = new VertexData(reader); m_VertexData = new VertexData(reader);
} }
@ -257,13 +257,13 @@ namespace AssetStudio
vertices[i] = new SpriteVertex(reader); vertices[i] = new SpriteVertex(reader);
} }
indices = reader.ReadUInt16Array(reader.ReadInt32()); indices = reader.ReadUInt16Array();
reader.AlignStream(4); reader.AlignStream();
} }
if (version[0] >= 2018) //2018 and up if (version[0] >= 2018) //2018 and up
{ {
m_Bindpose = reader.ReadMatrixArray(reader.ReadInt32()); m_Bindpose = reader.ReadMatrixArray();
if (version[0] == 2018 && version[1] < 2) //2018.2 down if (version[0] == 2018 && version[1] < 2) //2018.2 down
{ {
@ -331,7 +331,7 @@ namespace AssetStudio
if (version[0] > 5 || (version[0] == 5 && version[1] >= 3)) //5.3 and up if (version[0] > 5 || (version[0] == 5 && version[1] >= 3)) //5.3 and up
{ {
m_IsPolygon = reader.ReadBoolean(); m_IsPolygon = reader.ReadBoolean();
reader.AlignStream(4); reader.AlignStream();
} }
if (version[0] >= 2017) //2017 and up if (version[0] >= 2017) //2017 and up
@ -340,12 +340,7 @@ namespace AssetStudio
var second = reader.ReadInt64(); var second = reader.ReadInt64();
m_RenderDataKey = new KeyValuePair<Guid, long>(first, second); m_RenderDataKey = new KeyValuePair<Guid, long>(first, second);
var m_AtlasTagsSize = reader.ReadInt32(); m_AtlasTags = reader.ReadStringArray();
m_AtlasTags = new string[m_AtlasTagsSize];
for (int i = 0; i < m_AtlasTagsSize; i++)
{
m_AtlasTags[i] = reader.ReadAlignedString();
}
m_SpriteAtlas = new PPtr<SpriteAtlas>(reader); m_SpriteAtlas = new PPtr<SpriteAtlas>(reader);
} }
@ -358,7 +353,7 @@ namespace AssetStudio
m_PhysicsShape = new Vector2[m_PhysicsShapeSize][]; m_PhysicsShape = new Vector2[m_PhysicsShapeSize][];
for (int i = 0; i < m_PhysicsShapeSize; i++) for (int i = 0; i < m_PhysicsShapeSize; i++)
{ {
m_PhysicsShape[i] = reader.ReadVector2Array(reader.ReadInt32()); m_PhysicsShape[i] = reader.ReadVector2Array();
} }
} }

View File

@ -44,11 +44,7 @@ namespace AssetStudio
new PPtr<Sprite>(reader); new PPtr<Sprite>(reader);
} }
var m_PackedSpriteNamesToIndexSize = reader.ReadInt32(); var m_PackedSpriteNamesToIndex = reader.ReadStringArray();
for (int i = 0; i < m_PackedSpriteNamesToIndexSize; i++)
{
reader.ReadAlignedString();
}
var m_RenderDataMapSize = reader.ReadInt32(); var m_RenderDataMapSize = reader.ReadInt32();
m_RenderDataMap = new Dictionary<KeyValuePair<Guid, long>, SpriteAtlasData>(m_RenderDataMapSize); m_RenderDataMap = new Dictionary<KeyValuePair<Guid, long>, SpriteAtlasData>(m_RenderDataMapSize);

View File

@ -13,7 +13,7 @@ namespace AssetStudio
{ {
var m_ForcedFallbackFormat = reader.ReadInt32(); var m_ForcedFallbackFormat = reader.ReadInt32();
var m_DownscaleFallback = reader.ReadBoolean(); var m_DownscaleFallback = reader.ReadBoolean();
reader.AlignStream(4); reader.AlignStream();
} }
} }
} }

View File

@ -53,7 +53,7 @@ namespace AssetStudio
m_IsReadable = reader.ReadBoolean(); //2.6.0 and up m_IsReadable = reader.ReadBoolean(); //2.6.0 and up
m_ReadAllowed = reader.ReadBoolean(); //3.0.0 - 5.4 m_ReadAllowed = reader.ReadBoolean(); //3.0.0 - 5.4
//m_StreamingMipmaps 2018.2 and up //m_StreamingMipmaps 2018.2 and up
reader.AlignStream(4); reader.AlignStream();
if (version[0] > 2018 || (version[0] == 2018 && version[1] >= 2)) //2018.2 and up if (version[0] > 2018 || (version[0] == 2018 && version[1] >= 2)) //2018.2 and up
{ {
var m_StreamingMipmapsPriority = reader.ReadInt32(); var m_StreamingMipmapsPriority = reader.ReadInt32();

View File

@ -20,7 +20,7 @@ namespace AssetStudio
var m_ProxyHeight = reader.ReadUInt32(); var m_ProxyHeight = reader.ReadUInt32();
var Width = reader.ReadUInt32(); var Width = reader.ReadUInt32();
var Height = reader.ReadUInt32(); var Height = reader.ReadUInt32();
if (version[0] >= 2017)//2017.x and up if (version[0] >= 2017) //2017.x and up
{ {
var m_PixelAspecRatioNum = reader.ReadUInt32(); var m_PixelAspecRatioNum = reader.ReadUInt32();
var m_PixelAspecRatioDen = reader.ReadUInt32(); var m_PixelAspecRatioDen = reader.ReadUInt32();
@ -28,19 +28,10 @@ namespace AssetStudio
var m_FrameRate = reader.ReadDouble(); var m_FrameRate = reader.ReadDouble();
var m_FrameCount = reader.ReadUInt64(); var m_FrameCount = reader.ReadUInt64();
var m_Format = reader.ReadInt32(); var m_Format = reader.ReadInt32();
//m_AudioChannelCount var m_AudioChannelCount = reader.ReadUInt16Array();
var size = reader.ReadInt32(); reader.AlignStream();
reader.Position += size * 2; var m_AudioSampleRate = reader.ReadUInt32Array();
reader.AlignStream(4); var m_AudioLanguage = reader.ReadStringArray();
//m_AudioSampleRate
size = reader.ReadInt32();
reader.Position += size * 4;
//m_AudioLanguage
size = reader.ReadInt32();
for (int i = 0; i < size; i++)
{
reader.ReadAlignedString();
}
//StreamedResource m_ExternalResources //StreamedResource m_ExternalResources
m_Source = reader.ReadAlignedString(); m_Source = reader.ReadAlignedString();
var m_Offset = reader.ReadUInt64(); var m_Offset = reader.ReadUInt64();

View File

@ -8,6 +8,11 @@ namespace AssetStudio
{ {
public static class BinaryReaderExtensions public static class BinaryReaderExtensions
{ {
public static void AlignStream(this BinaryReader reader)
{
reader.AlignStream(4);
}
public static void AlignStream(this BinaryReader reader, int alignment) public static void AlignStream(this BinaryReader reader, int alignment)
{ {
var pos = reader.BaseStream.Position; var pos = reader.BaseStream.Position;
@ -65,6 +70,11 @@ namespace AssetStudio
return new System.Drawing.RectangleF(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle()); return new System.Drawing.RectangleF(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle());
} }
public static Color4 ReadColor4(this BinaryReader reader)
{
return new Color4(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle());
}
public static Matrix ReadMatrix(this BinaryReader reader) public static Matrix ReadMatrix(this BinaryReader reader)
{ {
var m = new Matrix(); var m = new Matrix();
@ -81,21 +91,41 @@ namespace AssetStudio
private static T[] ReadArray<T>(Func<T> del, int length) private static T[] ReadArray<T>(Func<T> del, int length)
{ {
var array = new T[length]; var array = new T[length];
for (int i = 0; i < array.Length; i++) for (int i = 0; i < length; i++)
{ {
array[i] = del(); array[i] = del();
} }
return array; return array;
} }
public static bool[] ReadBooleanArray(this BinaryReader reader)
{
return ReadArray(reader.ReadBoolean, reader.ReadInt32());
}
public static ushort[] ReadUInt16Array(this BinaryReader reader)
{
return ReadArray(reader.ReadUInt16, reader.ReadInt32());
}
public static int[] ReadInt32Array(this BinaryReader reader)
{
return ReadArray(reader.ReadInt32, reader.ReadInt32());
}
public static int[] ReadInt32Array(this BinaryReader reader, int length) public static int[] ReadInt32Array(this BinaryReader reader, int length)
{ {
return ReadArray(reader.ReadInt32, length); return ReadArray(reader.ReadInt32, length);
} }
public static uint[] ReadUInt32Array(this BinaryReader reader, int length) public static uint[] ReadUInt32Array(this BinaryReader reader)
{ {
return ReadArray(reader.ReadUInt32, length); return ReadArray(reader.ReadUInt32, reader.ReadInt32());
}
public static float[] ReadSingleArray(this BinaryReader reader)
{
return ReadArray(reader.ReadSingle, reader.ReadInt32());
} }
public static float[] ReadSingleArray(this BinaryReader reader, int length) public static float[] ReadSingleArray(this BinaryReader reader, int length)
@ -103,24 +133,24 @@ namespace AssetStudio
return ReadArray(reader.ReadSingle, length); return ReadArray(reader.ReadSingle, length);
} }
public static Vector2[] ReadVector2Array(this BinaryReader reader, int length) public static string[] ReadStringArray(this BinaryReader reader)
{ {
return ReadArray(reader.ReadVector2, length); return ReadArray(reader.ReadAlignedString, reader.ReadInt32());
} }
public static Vector4[] ReadVector4Array(this BinaryReader reader, int length) public static Vector2[] ReadVector2Array(this BinaryReader reader)
{ {
return ReadArray(reader.ReadVector4, length); return ReadArray(reader.ReadVector2, reader.ReadInt32());
} }
public static ushort[] ReadUInt16Array(this BinaryReader reader, int length) public static Vector4[] ReadVector4Array(this BinaryReader reader)
{ {
return ReadArray(reader.ReadUInt16, length); return ReadArray(reader.ReadVector4, reader.ReadInt32());
} }
public static Matrix[] ReadMatrixArray(this BinaryReader reader, int length) public static Matrix[] ReadMatrixArray(this BinaryReader reader)
{ {
return ReadArray(reader.ReadMatrix, length); return ReadArray(reader.ReadMatrix, reader.ReadInt32());
} }
} }
} }

View File

@ -16,7 +16,6 @@ namespace AssetStudio
public string upperFileName; public string upperFileName;
public int[] version = { 0, 0, 0, 0 }; public int[] version = { 0, 0, 0, 0 };
public BuildType buildType; public BuildType buildType;
public bool valid;
public Dictionary<long, Object> Objects; public Dictionary<long, Object> Objects;
public SerializedFileHeader header; public SerializedFileHeader header;
@ -36,151 +35,143 @@ namespace AssetStudio
this.fullName = fullName; this.fullName = fullName;
fileName = Path.GetFileName(fullName); fileName = Path.GetFileName(fullName);
upperFileName = fileName.ToUpper(); upperFileName = fileName.ToUpper();
try
{
//ReadHeader
header = new SerializedFileHeader();
header.m_MetadataSize = reader.ReadUInt32();
header.m_FileSize = reader.ReadUInt32();
header.m_Version = reader.ReadUInt32();
header.m_DataOffset = reader.ReadUInt32();
if (header.m_Version >= 9) //ReadHeader
header = new SerializedFileHeader();
header.m_MetadataSize = reader.ReadUInt32();
header.m_FileSize = reader.ReadUInt32();
header.m_Version = reader.ReadUInt32();
header.m_DataOffset = reader.ReadUInt32();
if (header.m_Version >= 9)
{
header.m_Endianess = reader.ReadByte();
header.m_Reserved = reader.ReadBytes(3);
m_FileEndianess = (EndianType)header.m_Endianess;
}
else
{
reader.Position = header.m_FileSize - header.m_MetadataSize;
m_FileEndianess = (EndianType)reader.ReadByte();
}
//ReadMetadata
if (m_FileEndianess == EndianType.LittleEndian)
{
reader.endian = EndianType.LittleEndian;
}
if (header.m_Version >= 7)
{
unityVersion = reader.ReadStringToNull();
SetVersion(unityVersion);
}
if (header.m_Version >= 8)
{
m_TargetPlatform = (BuildTarget)reader.ReadInt32();
if (!Enum.IsDefined(typeof(BuildTarget), m_TargetPlatform))
{ {
header.m_Endianess = reader.ReadByte(); m_TargetPlatform = BuildTarget.UnknownPlatform;
header.m_Reserved = reader.ReadBytes(3); }
m_FileEndianess = (EndianType)header.m_Endianess; }
if (header.m_Version >= 13)
{
m_EnableTypeTree = reader.ReadBoolean();
}
//ReadTypes
int typeCount = reader.ReadInt32();
m_Types = new List<SerializedType>(typeCount);
for (int i = 0; i < typeCount; i++)
{
m_Types.Add(ReadSerializedType());
}
if (header.m_Version >= 7 && header.m_Version < 14)
{
var bigIDEnabled = reader.ReadInt32();
}
//ReadObjects
int objectCount = reader.ReadInt32();
m_Objects = new List<ObjectInfo>(objectCount);
for (int i = 0; i < objectCount; i++)
{
var objectInfo = new ObjectInfo();
if (header.m_Version < 14)
{
objectInfo.m_PathID = reader.ReadInt32();
} }
else else
{ {
reader.Position = header.m_FileSize - header.m_MetadataSize; reader.AlignStream();
m_FileEndianess = (EndianType)reader.ReadByte(); objectInfo.m_PathID = reader.ReadInt64();
} }
objectInfo.byteStart = reader.ReadUInt32();
objectInfo.byteStart += header.m_DataOffset;
objectInfo.byteSize = reader.ReadUInt32();
objectInfo.typeID = reader.ReadInt32();
if (header.m_Version < 16)
{
objectInfo.classID = reader.ReadUInt16();
objectInfo.serializedType = m_Types.Find(x => x.classID == objectInfo.typeID);
var isDestroyed = reader.ReadUInt16();
}
else
{
var type = m_Types[objectInfo.typeID];
objectInfo.serializedType = type;
objectInfo.classID = type.classID;
}
if (header.m_Version == 15 || header.m_Version == 16)
{
var stripped = reader.ReadByte();
}
m_Objects.Add(objectInfo);
}
//ReadMetadata if (header.m_Version >= 11)
if (m_FileEndianess == EndianType.LittleEndian) {
int scriptCount = reader.ReadInt32();
m_ScriptTypes = new List<LocalSerializedObjectIdentifier>(scriptCount);
for (int i = 0; i < scriptCount; i++)
{ {
reader.endian = EndianType.LittleEndian; var m_ScriptType = new LocalSerializedObjectIdentifier();
} m_ScriptType.localSerializedFileIndex = reader.ReadInt32();
if (header.m_Version >= 7)
{
unityVersion = reader.ReadStringToNull();
SetVersion(unityVersion);
}
if (header.m_Version >= 8)
{
m_TargetPlatform = (BuildTarget)reader.ReadInt32();
if (!Enum.IsDefined(typeof(BuildTarget), m_TargetPlatform))
{
m_TargetPlatform = BuildTarget.UnknownPlatform;
}
}
if (header.m_Version >= 13)
{
m_EnableTypeTree = reader.ReadBoolean();
}
//ReadTypes
int typeCount = reader.ReadInt32();
m_Types = new List<SerializedType>(typeCount);
for (int i = 0; i < typeCount; i++)
{
m_Types.Add(ReadSerializedType());
}
if (header.m_Version >= 7 && header.m_Version < 14)
{
var bigIDEnabled = reader.ReadInt32();
}
//ReadObjects
int objectCount = reader.ReadInt32();
m_Objects = new List<ObjectInfo>(objectCount);
for (int i = 0; i < objectCount; i++)
{
var objectInfo = new ObjectInfo();
if (header.m_Version < 14) if (header.m_Version < 14)
{ {
objectInfo.m_PathID = reader.ReadInt32(); m_ScriptType.localIdentifierInFile = reader.ReadInt32();
} }
else else
{ {
reader.AlignStream(4); reader.AlignStream();
objectInfo.m_PathID = reader.ReadInt64(); m_ScriptType.localIdentifierInFile = reader.ReadInt64();
} }
objectInfo.byteStart = reader.ReadUInt32(); m_ScriptTypes.Add(m_ScriptType);
objectInfo.byteStart += header.m_DataOffset;
objectInfo.byteSize = reader.ReadUInt32();
objectInfo.typeID = reader.ReadInt32();
if (header.m_Version < 16)
{
objectInfo.classID = reader.ReadUInt16();
objectInfo.serializedType = m_Types.Find(x => x.classID == objectInfo.typeID);
var isDestroyed = reader.ReadUInt16();
}
else
{
var type = m_Types[objectInfo.typeID];
objectInfo.serializedType = type;
objectInfo.classID = type.classID;
}
if (header.m_Version == 15 || header.m_Version == 16)
{
var stripped = reader.ReadByte();
}
m_Objects.Add(objectInfo);
} }
}
if (header.m_Version >= 11) int externalsCount = reader.ReadInt32();
m_Externals = new List<FileIdentifier>(externalsCount);
for (int i = 0; i < externalsCount; i++)
{
var m_External = new FileIdentifier();
if (header.m_Version >= 6)
{ {
int scriptCount = reader.ReadInt32(); var tempEmpty = reader.ReadStringToNull();
m_ScriptTypes = new List<LocalSerializedObjectIdentifier>(scriptCount);
for (int i = 0; i < scriptCount; i++)
{
var m_ScriptType = new LocalSerializedObjectIdentifier();
m_ScriptType.localSerializedFileIndex = reader.ReadInt32();
if (header.m_Version < 14)
{
m_ScriptType.localIdentifierInFile = reader.ReadInt32();
}
else
{
reader.AlignStream(4);
m_ScriptType.localIdentifierInFile = reader.ReadInt64();
}
m_ScriptTypes.Add(m_ScriptType);
}
} }
int externalsCount = reader.ReadInt32();
m_Externals = new List<FileIdentifier>(externalsCount);
for (int i = 0; i < externalsCount; i++)
{
var m_External = new FileIdentifier();
if (header.m_Version >= 6)
{
var tempEmpty = reader.ReadStringToNull();
}
if (header.m_Version >= 5)
{
m_External.guid = new Guid(reader.ReadBytes(16));
m_External.type = reader.ReadInt32();
}
m_External.pathName = reader.ReadStringToNull();
m_External.fileName = Path.GetFileName(m_External.pathName);
m_Externals.Add(m_External);
}
if (header.m_Version >= 5) if (header.m_Version >= 5)
{ {
//var userInformation = reader.ReadStringToNull(); m_External.guid = new Guid(reader.ReadBytes(16));
m_External.type = reader.ReadInt32();
} }
m_External.pathName = reader.ReadStringToNull();
valid = true; m_External.fileName = Path.GetFileName(m_External.pathName);
m_Externals.Add(m_External);
} }
catch
if (header.m_Version >= 5)
{ {
// ignored //var userInformation = reader.ReadStringToNull();
} }
} }

View File

@ -150,7 +150,7 @@ namespace AssetStudio
if (append) if (append)
sb.AppendFormat("{0}{1} {2} = {3}\r\n", (new string('\t', level)), varTypeStr, varNameStr, value); sb.AppendFormat("{0}{1} {2} = {3}\r\n", (new string('\t', level)), varTypeStr, varNameStr, value);
if (align) if (align)
reader.AlignStream(4); reader.AlignStream();
} }
public static Dictionary<string, object> ReadBoxingType(List<TypeTreeNode> members, BinaryReader reader) public static Dictionary<string, object> ReadBoxingType(List<TypeTreeNode> members, BinaryReader reader)
@ -284,7 +284,7 @@ namespace AssetStudio
} }
} }
if (align) if (align)
reader.AlignStream(4); reader.AlignStream();
return value; return value;
} }

View File

@ -482,7 +482,7 @@ namespace AssetStudio
lastGroup = group; lastGroup = group;
} }
morph.Channels.Add(new Tuple<float, int, int>(i < sMesh.m_BlendShapeWeights.Count ? sMesh.m_BlendShapeWeights[i] : 0f, morph.KeyframeList.Count, mesh.m_Shapes.channels[i].frameCount)); morph.Channels.Add(new Tuple<float, int, int>(i < sMesh.m_BlendShapeWeights.Length ? sMesh.m_BlendShapeWeights[i] : 0f, morph.KeyframeList.Count, mesh.m_Shapes.channels[i].frameCount));
for (int frameIdx = 0; frameIdx < mesh.m_Shapes.channels[i].frameCount; frameIdx++) for (int frameIdx = 0; frameIdx < mesh.m_Shapes.channels[i].frameCount; frameIdx++)
{ {
ImportedMorphKeyframe keyframe = new ImportedMorphKeyframe(); ImportedMorphKeyframe keyframe = new ImportedMorphKeyframe();
@ -596,22 +596,21 @@ namespace AssetStudio
} }
iMat = new ImportedMaterial(); iMat = new ImportedMaterial();
iMat.Name = mat.m_Name; iMat.Name = mat.m_Name;
foreach (var col in mat.m_Colors) foreach (var col in mat.m_SavedProperties.m_Colors)
{ {
var color = new Color4(col.second[0], col.second[1], col.second[2], col.second[3]); switch (col.Key)
switch (col.first)
{ {
case "_Color": case "_Color":
iMat.Diffuse = color; iMat.Diffuse = col.Value;
break; break;
case "_SColor": case "_SColor":
iMat.Ambient = color; iMat.Ambient = col.Value;
break; break;
case "_EmissionColor": case "_EmissionColor":
iMat.Emissive = color; iMat.Emissive = col.Value;
break; break;
case "_SpecColor": case "_SpecColor":
iMat.Specular = color; iMat.Specular = col.Value;
break; break;
case "_RimColor": case "_RimColor":
case "_OutlineColor": case "_OutlineColor":
@ -620,12 +619,12 @@ namespace AssetStudio
} }
} }
foreach (var flt in mat.m_Floats) foreach (var flt in mat.m_SavedProperties.m_Floats)
{ {
switch (flt.first) switch (flt.Key)
{ {
case "_Shininess": case "_Shininess":
iMat.Power = flt.second; iMat.Power = flt.Value;
break; break;
case "_RimPower": case "_RimPower":
case "_Outline": case "_Outline":
@ -637,10 +636,10 @@ namespace AssetStudio
iMat.Textures = new string[5]; iMat.Textures = new string[5];
iMat.TexOffsets = new Vector2[5]; iMat.TexOffsets = new Vector2[5];
iMat.TexScales = new Vector2[5]; iMat.TexScales = new Vector2[5];
foreach (var texEnv in mat.m_TexEnvs) foreach (var texEnv in mat.m_SavedProperties.m_TexEnvs)
{ {
Texture2D m_Texture2D = null; Texture2D m_Texture2D = null;
if (texEnv.m_Texture.TryGet<Texture2D>(out var m_Texture)) //TODO other Texture if (texEnv.Value.m_Texture.TryGet<Texture2D>(out var m_Texture)) //TODO other Texture
{ {
m_Texture2D = m_Texture; m_Texture2D = m_Texture;
} }
@ -650,13 +649,13 @@ namespace AssetStudio
continue; continue;
} }
int dest = -1; int dest = -1;
if (texEnv.name == "_MainTex") if (texEnv.Key == "_MainTex")
dest = 0; dest = 0;
else if (texEnv.name == "_BumpMap") else if (texEnv.Key == "_BumpMap")
dest = 4; dest = 4;
else if (texEnv.name.Contains("Spec")) else if (texEnv.Key.Contains("Spec"))
dest = 2; dest = 2;
else if (texEnv.name.Contains("Norm")) else if (texEnv.Key.Contains("Norm"))
dest = 3; dest = 3;
if (dest < 0 || iMat.Textures[dest] != null) if (dest < 0 || iMat.Textures[dest] != null)
{ {
@ -685,8 +684,8 @@ namespace AssetStudio
iMat.Textures[dest] = m_Texture2D.m_Name + ".png"; iMat.Textures[dest] = m_Texture2D.m_Name + ".png";
textureNameDictionary.Add(m_Texture, iMat.Textures[dest]); textureNameDictionary.Add(m_Texture, iMat.Textures[dest]);
} }
iMat.TexOffsets[dest] = new Vector2(texEnv.m_Offset[0], texEnv.m_Offset[1]); iMat.TexOffsets[dest] = texEnv.Value.m_Offset;
iMat.TexScales[dest] = new Vector2(texEnv.m_Scale[0], texEnv.m_Scale[1]); iMat.TexScales[dest] = texEnv.Value.m_Scale;
ConvertTexture2D(m_Texture2D, iMat.Textures[dest]); ConvertTexture2D(m_Texture2D, iMat.Textures[dest]);
} }

View File

@ -94,7 +94,7 @@ namespace AssetStudio
value = reader.ReadChar(); value = reader.ReadChar();
break; break;
} }
reader.AlignStream(4); reader.AlignStream();
sb.AppendLine($"{new string('\t', indent)}{typeDef.Name} {name} = {value}"); sb.AppendLine($"{new string('\t', indent)}{typeDef.Name} {name} = {value}");
return; return;
} }

View File

@ -107,7 +107,7 @@ namespace AssetStudio
m_Keywords[i] = reader.ReadAlignedString(); m_Keywords[i] = reader.ReadAlignedString();
} }
m_ProgramCode = reader.ReadBytes(reader.ReadInt32()); m_ProgramCode = reader.ReadBytes(reader.ReadInt32());
reader.AlignStream(4); reader.AlignStream();
//TODO //TODO
} }