diff --git a/AssetStudio/Classes/Avatar.cs b/AssetStudio/Classes/Avatar.cs index 410b53e..27c3749 100644 --- a/AssetStudio/Classes/Avatar.cs +++ b/AssetStudio/Classes/Avatar.cs @@ -125,23 +125,27 @@ namespace AssetStudio { reader.Position += 4; } - //--- vector m_Handles - int numHandles = reader.ReadInt32(); - for (int i = 0; i < numHandles; i++) + + if (version[0] < 2018 || (version[0] == 2018 && version[1] < 2)) //2018.2 down { - if (version[0] > 5 || (version[0] == 5 && version[1] >= 4))//5.4 and up - reader.Position += 48; - else - reader.Position += 56; - } - //--- vector m_ColliderArray - int numColliders = reader.ReadInt32(); - for (int i = 0; i < numColliders; i++) - { - if (version[0] > 5 || (version[0] == 5 && version[1] >= 4))//5.4 and up - reader.Position += 72; - else - reader.Position += 80; + //--- vector m_Handles + int numHandles = reader.ReadInt32(); + for (int i = 0; i < numHandles; i++) + { + if (version[0] > 5 || (version[0] == 5 && version[1] >= 4)) //5.4 and up + reader.Position += 48; + else + reader.Position += 56; + } + //--- vector m_ColliderArray + int numColliders = reader.ReadInt32(); + for (int i = 0; i < numColliders; i++) + { + if (version[0] > 5 || (version[0] == 5 && version[1] >= 4)) //5.4 and up + reader.Position += 72; + else + reader.Position += 80; + } } //--- staticvector m_HumanBoneIndex numIndexes = reader.ReadInt32(); @@ -155,11 +159,14 @@ namespace AssetStudio { reader.Position += 4; } - //--- staticvector m_ColliderIndex - int numColliderIndexes = reader.ReadInt32(); - for (int i = 0; i < numColliderIndexes; i++) + if (version[0] < 2018 || (version[0] == 2018 && version[1] < 2)) //2018.2 down { - reader.Position += 4; + //--- staticvector m_ColliderIndex + int numColliderIndexes = reader.ReadInt32(); + for (int i = 0; i < numColliderIndexes; i++) + { + reader.Position += 4; + } } var m_Scale = reader.ReadSingle(); var m_ArmTwist = reader.ReadSingle(); diff --git a/AssetStudio/Classes/Mesh.cs b/AssetStudio/Classes/Mesh.cs index 2557182..9dd9cd6 100644 --- a/AssetStudio/Classes/Mesh.cs +++ b/AssetStudio/Classes/Mesh.cs @@ -643,24 +643,34 @@ namespace AssetStudio else { #region read vertex stream - m_Skin = new List[reader.ReadInt32()]; - //m_Skin = new Dictionary[a_Stream.ReadInt32()]; - for (int s = 0; s < m_Skin.Length; s++) + + if (version[0] < 2018 || (version[0] == 2018 && version[1] < 2)) //2018.2 down { - m_Skin[s] = new List(); - for (int i = 0; i < 4; i++) { m_Skin[s].Add(new BoneInfluence() { weight = reader.ReadSingle() }); } - for (int i = 0; i < 4; i++) { m_Skin[s][i].boneIndex = reader.ReadInt32(); } + m_Skin = new List[reader.ReadInt32()]; + //m_Skin = new Dictionary[a_Stream.ReadInt32()]; + for (int s = 0; s < m_Skin.Length; s++) + { + m_Skin[s] = new List(); + for (int i = 0; i < 4; i++) + { + m_Skin[s].Add(new BoneInfluence() {weight = reader.ReadSingle()}); + } - /*m_Skin[s] = new Dictionary(); - float[] weights = new float[4] { a_Stream.ReadSingle(), a_Stream.ReadSingle(), a_Stream.ReadSingle(), a_Stream.ReadSingle() }; - for (int i = 0; i < 4; i++) - { - int boneIndex = a_Stream.ReadInt32(); - m_Skin[s][boneIndex] = weights[i]; - }*/ + for (int i = 0; i < 4; i++) + { + m_Skin[s][i].boneIndex = reader.ReadInt32(); + } + + /*m_Skin[s] = new Dictionary(); + float[] weights = new float[4] { a_Stream.ReadSingle(), a_Stream.ReadSingle(), a_Stream.ReadSingle(), a_Stream.ReadSingle() }; + for (int i = 0; i < 4; i++) + { + int boneIndex = a_Stream.ReadInt32(); + m_Skin[s][boneIndex] = weights[i]; + }*/ + } } - if (version[0] == 3 || (version[0] == 4 && version[1] <= 2)) { m_BindPose = new float[reader.ReadInt32()][,]; @@ -737,59 +747,45 @@ namespace AssetStudio } } #endregion - - //actual Vertex Buffer - byte[] m_DataSize = new byte[reader.ReadInt32()]; - reader.Read(m_DataSize, 0, m_DataSize.Length); - - if (version[0] >= 5) //create streams + if (version[0] >= 5) //ComputeCompressedStreams { - m_Streams = new StreamInfo[streamCount]; - for (int s = 0; s < streamCount; s++) + var streamList = new List(streamCount); + uint offset = 0; + for (int str = 0; str < streamCount; str++) { - m_Streams[s] = new StreamInfo(); - m_Streams[s].offset = 0; - m_Streams[s].stride = 0; - uint chnMask = 0; - for (var chn = 0; chn < m_Channels.Length; chn++) + byte stride = 0; + for (int chn = 0; chn < m_Channels.Length; chn++) { var m_Channel = m_Channels[chn]; - if (m_Channel.stream == s) + if (m_Channel.stream == str) { + stride += (byte)(m_Channel.dimension * (m_Channel.format == 0 ? 4 : 1)); if (m_Channel.dimension > 0) { chnMask |= 1u << chn; } - m_Streams[s].stride += m_Channel.dimension * (4 / (int)Math.Pow(2, m_Channel.format)); } } - if (s > 0) + var streamInfo = new StreamInfo { - m_Streams[s].offset = m_Streams[s - 1].offset + m_Streams[s - 1].stride * m_VertexCount; - //sometimes there are 8 bytes between streams - //this is NOT an alignment, even if sometimes it may seem so - - if (streamCount == 2) - { - m_Streams[s].offset = m_DataSize.Length - m_Streams[s].stride * m_VertexCount; - } - else - { - m_VertexCount = 0; - return; - } - - /*var absoluteOffset = a_Stream.Position + 4 + m_Streams[s].offset; - if ((absoluteOffset % m_Streams[s].stride) != 0) - { - m_Streams[s].offset += m_Streams[s].stride - (int)(absoluteOffset % m_Streams[s].stride); - }*/ - } - m_Streams[s].channelMask = new BitArray(new[] { (int)chnMask }); + channelMask = new BitArray(new[] { (int)chnMask }), + offset = (int)offset, + stride = stride, + dividerOp = 0, + frequency = 0 + }; + streamList.Add(streamInfo); + offset += (uint)m_VertexCount * stride + (((uint)m_VertexCount & 1) != 0 ? (uint)8 : 0); } + + m_Streams = streamList.ToArray(); } + + //actual Vertex Buffer + byte[] m_DataSize = new byte[reader.ReadInt32()]; + reader.Read(m_DataSize, 0, m_DataSize.Length); #endregion #region compute FvF diff --git a/AssetStudio/Classes/Sprite.cs b/AssetStudio/Classes/Sprite.cs index 6d49f08..19cd4de 100644 --- a/AssetStudio/Classes/Sprite.cs +++ b/AssetStudio/Classes/Sprite.cs @@ -116,10 +116,13 @@ namespace AssetStudio // Matrix4x4f data size = reader.ReadInt32(); reader.Position += size * 64; - // vector m_SourceSkin - // BoneWeights4 data - size = reader.ReadInt32(); - reader.Position += size * 32; + if (version[0] == 2018 && version[1] < 2) //2018.2 down + { + // vector m_SourceSkin + // BoneWeights4 data + size = reader.ReadInt32(); + reader.Position += size * 32; + } } } else diff --git a/AssetStudio/Classes/Texture2D.cs b/AssetStudio/Classes/Texture2D.cs index ddb88da..6aa7e24 100644 --- a/AssetStudio/Classes/Texture2D.cs +++ b/AssetStudio/Classes/Texture2D.cs @@ -68,8 +68,13 @@ namespace AssetStudio m_IsReadable = reader.ReadBoolean(); //2.6.0 and up m_ReadAllowed = reader.ReadBoolean(); //3.0.0 - 5.4 + //m_StreamingMipmaps 2018.2 and up reader.AlignStream(4); - if (preloadData.HasStructMember("m_StreamingMipmapsPriority")) + if (version[0] > 2018 || (version[0] == 2018 && version[1] >= 2)) //2018.2 and up + { + var m_StreamingMipmapsPriority = reader.ReadInt32(); + } + else if (preloadData.HasStructMember("m_StreamingMipmapsPriority")) //will fix in some patch version bundle { var m_StreamingMipmapsPriority = reader.ReadInt32(); }