2018.2 support

This commit is contained in:
Perfare 2018-07-13 00:54:38 +08:00
parent 18275557df
commit 54c2bdc728
4 changed files with 87 additions and 76 deletions

View File

@ -125,23 +125,27 @@ namespace AssetStudio
{ {
reader.Position += 4; reader.Position += 4;
} }
//--- vector m_Handles
int numHandles = reader.ReadInt32(); if (version[0] < 2018 || (version[0] == 2018 && version[1] < 2)) //2018.2 down
for (int i = 0; i < numHandles; i++)
{ {
if (version[0] > 5 || (version[0] == 5 && version[1] >= 4))//5.4 and up //--- vector m_Handles
reader.Position += 48; int numHandles = reader.ReadInt32();
else for (int i = 0; i < numHandles; i++)
reader.Position += 56; {
} if (version[0] > 5 || (version[0] == 5 && version[1] >= 4)) //5.4 and up
//--- vector m_ColliderArray reader.Position += 48;
int numColliders = reader.ReadInt32(); else
for (int i = 0; i < numColliders; i++) reader.Position += 56;
{ }
if (version[0] > 5 || (version[0] == 5 && version[1] >= 4))//5.4 and up //--- vector m_ColliderArray
reader.Position += 72; int numColliders = reader.ReadInt32();
else for (int i = 0; i < numColliders; i++)
reader.Position += 80; {
if (version[0] > 5 || (version[0] == 5 && version[1] >= 4)) //5.4 and up
reader.Position += 72;
else
reader.Position += 80;
}
} }
//--- staticvector m_HumanBoneIndex //--- staticvector m_HumanBoneIndex
numIndexes = reader.ReadInt32(); numIndexes = reader.ReadInt32();
@ -155,11 +159,14 @@ namespace AssetStudio
{ {
reader.Position += 4; reader.Position += 4;
} }
//--- staticvector m_ColliderIndex if (version[0] < 2018 || (version[0] == 2018 && version[1] < 2)) //2018.2 down
int numColliderIndexes = reader.ReadInt32();
for (int i = 0; i < numColliderIndexes; i++)
{ {
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_Scale = reader.ReadSingle();
var m_ArmTwist = reader.ReadSingle(); var m_ArmTwist = reader.ReadSingle();

View File

@ -643,24 +643,34 @@ namespace AssetStudio
else else
{ {
#region read vertex stream #region read vertex stream
m_Skin = new List<BoneInfluence>[reader.ReadInt32()];
//m_Skin = new Dictionary<int, float>[a_Stream.ReadInt32()]; if (version[0] < 2018 || (version[0] == 2018 && version[1] < 2)) //2018.2 down
for (int s = 0; s < m_Skin.Length; s++)
{ {
m_Skin[s] = new List<BoneInfluence>(); m_Skin = new List<BoneInfluence>[reader.ReadInt32()];
for (int i = 0; i < 4; i++) { m_Skin[s].Add(new BoneInfluence() { weight = reader.ReadSingle() }); } //m_Skin = new Dictionary<int, float>[a_Stream.ReadInt32()];
for (int i = 0; i < 4; i++) { m_Skin[s][i].boneIndex = reader.ReadInt32(); } for (int s = 0; s < m_Skin.Length; s++)
{
m_Skin[s] = new List<BoneInfluence>();
for (int i = 0; i < 4; i++)
{
m_Skin[s].Add(new BoneInfluence() {weight = reader.ReadSingle()});
}
/*m_Skin[s] = new Dictionary<int, float>(); for (int i = 0; i < 4; i++)
float[] weights = new float[4] { a_Stream.ReadSingle(), a_Stream.ReadSingle(), a_Stream.ReadSingle(), a_Stream.ReadSingle() }; {
for (int i = 0; i < 4; i++) m_Skin[s][i].boneIndex = reader.ReadInt32();
{ }
int boneIndex = a_Stream.ReadInt32();
m_Skin[s][boneIndex] = weights[i]; /*m_Skin[s] = new Dictionary<int, float>();
}*/ 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)) if (version[0] == 3 || (version[0] == 4 && version[1] <= 2))
{ {
m_BindPose = new float[reader.ReadInt32()][,]; m_BindPose = new float[reader.ReadInt32()][,];
@ -737,59 +747,45 @@ namespace AssetStudio
} }
} }
#endregion #endregion
if (version[0] >= 5) //ComputeCompressedStreams
//actual Vertex Buffer
byte[] m_DataSize = new byte[reader.ReadInt32()];
reader.Read(m_DataSize, 0, m_DataSize.Length);
if (version[0] >= 5) //create streams
{ {
m_Streams = new StreamInfo[streamCount]; var streamList = new List<StreamInfo>(streamCount);
for (int s = 0; s < streamCount; s++) 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; 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]; 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) if (m_Channel.dimension > 0)
{ {
chnMask |= 1u << chn; 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; channelMask = new BitArray(new[] { (int)chnMask }),
//sometimes there are 8 bytes between streams offset = (int)offset,
//this is NOT an alignment, even if sometimes it may seem so stride = stride,
dividerOp = 0,
if (streamCount == 2) frequency = 0
{ };
m_Streams[s].offset = m_DataSize.Length - m_Streams[s].stride * m_VertexCount; streamList.Add(streamInfo);
} offset += (uint)m_VertexCount * stride + (((uint)m_VertexCount & 1) != 0 ? (uint)8 : 0);
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 });
} }
m_Streams = streamList.ToArray();
} }
//actual Vertex Buffer
byte[] m_DataSize = new byte[reader.ReadInt32()];
reader.Read(m_DataSize, 0, m_DataSize.Length);
#endregion #endregion
#region compute FvF #region compute FvF

View File

@ -116,10 +116,13 @@ namespace AssetStudio
// Matrix4x4f data // Matrix4x4f data
size = reader.ReadInt32(); size = reader.ReadInt32();
reader.Position += size * 64; reader.Position += size * 64;
// vector m_SourceSkin if (version[0] == 2018 && version[1] < 2) //2018.2 down
// BoneWeights4 data {
size = reader.ReadInt32(); // vector m_SourceSkin
reader.Position += size * 32; // BoneWeights4 data
size = reader.ReadInt32();
reader.Position += size * 32;
}
} }
} }
else else

View File

@ -68,8 +68,13 @@ 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
reader.AlignStream(4); 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(); var m_StreamingMipmapsPriority = reader.ReadInt32();
} }