Fixed #187
Fixed #188
This commit is contained in:
Perfare 2018-05-05 01:32:55 +08:00
parent 75985c8bf0
commit 9385b4da76
3 changed files with 138 additions and 105 deletions

View File

@ -53,6 +53,8 @@ namespace AssetStudio
else else
reader.Position += 48; reader.Position += 48;
} }
if (version[0] > 4 || (version[0] == 4 && version[1] >= 3))//4.3 and up
{
//- OffsetPtr m_DefaultPose //- OffsetPtr m_DefaultPose
//-- SkeletonPose data //-- SkeletonPose data
numXforms = reader.ReadInt32(); numXforms = reader.ReadInt32();
@ -69,6 +71,7 @@ namespace AssetStudio
{ {
reader.Position += 4; reader.Position += 4;
} }
}
//- OffsetPtr m_Human //- OffsetPtr m_Human
//-- Human data //-- Human data
//--- xform m_RootX //--- xform m_RootX
@ -176,18 +179,23 @@ namespace AssetStudio
{ {
reader.Position += 4; reader.Position += 4;
} }
if (version[0] > 4 || (version[0] == 4 && version[1] >= 3)) //4.3 and up
{
//- vector m_HumanSkeletonReverseIndexArray //- vector m_HumanSkeletonReverseIndexArray
int numReverseIndexes = reader.ReadInt32(); int numReverseIndexes = reader.ReadInt32();
for (int i = 0; i < numReverseIndexes; i++) for (int i = 0; i < numReverseIndexes; i++)
{ {
reader.Position += 4; reader.Position += 4;
} }
}
var m_RootMotionBoneIndex = reader.ReadInt32(); var m_RootMotionBoneIndex = reader.ReadInt32();
//- xform m_RootMotionBoneX //- xform m_RootMotionBoneX
if (version[0] > 5 || (version[0] == 5 && version[1] >= 4))//5.4 and up if (version[0] > 5 || (version[0] == 5 && version[1] >= 4))//5.4 and up
reader.Position += 40; reader.Position += 40;
else else
reader.Position += 48; reader.Position += 48;
if (version[0] > 4 || (version[0] == 4 && version[1] >= 3)) //4.3 and up
{
//- OffsetPtr m_RootMotionSkeleton //- OffsetPtr m_RootMotionSkeleton
//-- Skeleton data //-- Skeleton data
//--- vector m_Node //--- vector m_Node
@ -227,6 +235,7 @@ namespace AssetStudio
{ {
reader.Position += 4; reader.Position += 4;
} }
}
//map m_TOS //map m_TOS
int numTOS = reader.ReadInt32(); int numTOS = reader.ReadInt32();
m_TOS = new List<KeyValuePair<uint, string>>(numTOS); m_TOS = new List<KeyValuePair<uint, string>>(numTOS);

View File

@ -511,7 +511,7 @@ namespace AssetStudio
#region BlendShapeData and BindPose for 4.3.0 and later #region BlendShapeData and BindPose for 4.3.0 and later
else if (version[0] >= 5 || (version[0] == 4 && version[1] >= 3)) else if (version[0] >= 5 || (version[0] == 4 && version[1] >= 3))
{ {
m_Shapes = new BlendShapeData(reader);//TODO 4.3 down m_Shapes = new BlendShapeData(reader);
m_BindPose = new float[reader.ReadInt32()][,]; m_BindPose = new float[reader.ReadInt32()][,];
for (int i = 0; i < m_BindPose.Length; i++) for (int i = 0; i < m_BindPose.Length; i++)

View File

@ -77,13 +77,29 @@ namespace AssetStudio
{ {
assetsfileList.TryGetTransform(m_GameObject.m_Transform, out var m_Transform); assetsfileList.TryGetTransform(m_GameObject.m_Transform, out var m_Transform);
var rootTransform = m_Transform; var rootTransform = m_Transform;
while (assetsfileList.TryGetTransform(rootTransform.m_Father, out var m_Father))//Get Root Transform var frameList = new List<ImportedFrame>();
while (assetsfileList.TryGetTransform(rootTransform.m_Father, out var m_Father))
{ {
frameList.Add(ConvertFrames(m_Father));
rootTransform = m_Father; rootTransform = m_Father;
} }
if (frameList.Count > 0)
{
FrameList.Add(frameList[frameList.Count - 1]);
for (var i = frameList.Count - 2; i >= 0; i--)
{
var frame = frameList[i];
var parent = frameList[i + 1];
parent.AddChild(frame);
}
ConvertFrames(m_Transform, frameList[0]);
}
else
{
ConvertFrames(m_Transform, null);
}
CreateBonePathHash(rootTransform); CreateBonePathHash(rootTransform);
ConvertFrames(rootTransform, null);
ConvertMeshRenderer(m_Transform); ConvertMeshRenderer(m_Transform);
} }
@ -170,7 +186,7 @@ namespace AssetStudio
} }
} }
private void ConvertFrames(Transform trans, ImportedFrame parent) private ImportedFrame ConvertFrames(Transform trans)
{ {
var frame = new ImportedFrame(); var frame = new ImportedFrame();
assetsfileList.TryGetGameObject(trans.m_GameObject, out var m_GameObject); assetsfileList.TryGetGameObject(trans.m_GameObject, out var m_GameObject);
@ -182,9 +198,14 @@ namespace AssetStudio
var m_LocalScale = new Vector3(trans.m_LocalScale[0], trans.m_LocalScale[1], trans.m_LocalScale[2]); var m_LocalScale = new Vector3(trans.m_LocalScale[0], trans.m_LocalScale[1], trans.m_LocalScale[2]);
var m_LocalPosition = new Vector3(trans.m_LocalPosition[0], trans.m_LocalPosition[1], trans.m_LocalPosition[2]); var m_LocalPosition = new Vector3(trans.m_LocalPosition[0], trans.m_LocalPosition[1], trans.m_LocalPosition[2]);
frame.Matrix = Matrix.Scaling(m_LocalScale) * Matrix.RotationQuaternion(mirroredRotation) * Matrix.Translation(-m_LocalPosition.X, m_LocalPosition.Y, m_LocalPosition.Z); frame.Matrix = Matrix.Scaling(m_LocalScale) * Matrix.RotationQuaternion(mirroredRotation) * Matrix.Translation(-m_LocalPosition.X, m_LocalPosition.Y, m_LocalPosition.Z);
return frame;
}
private void ConvertFrames(Transform trans, ImportedFrame parent)
{
var frame = ConvertFrames(trans);
if (parent == null) if (parent == null)
{ {
FrameList = new List<ImportedFrame>();
FrameList.Add(frame); FrameList.Add(frame);
} }
else else
@ -356,6 +377,8 @@ namespace AssetStudio
} }
//Morphs //Morphs
if (mesh.m_Shapes != null)
{
foreach (var channel in mesh.m_Shapes.channels) foreach (var channel in mesh.m_Shapes.channels)
{ {
morphChannelInfo.Add(channel.nameHash, channel.name); morphChannelInfo.Add(channel.nameHash, channel.name);
@ -411,6 +434,7 @@ namespace AssetStudio
} }
} }
} }
}
MeshList.Add(iMesh); MeshList.Add(iMesh);
} }