From 9385b4da76eda64e4d476299a36fee8e4e35d757 Mon Sep 17 00:00:00 2001 From: Perfare Date: Sat, 5 May 2018 01:32:55 +0800 Subject: [PATCH] Fixed #186 Fixed #187 Fixed #188 --- AssetStudio/Classes/Avatar.cs | 119 ++++++++++--------- AssetStudio/Classes/Mesh.cs | 2 +- AssetStudio/StudioClasses/ModelConverter.cs | 122 ++++++++++++-------- 3 files changed, 138 insertions(+), 105 deletions(-) diff --git a/AssetStudio/Classes/Avatar.cs b/AssetStudio/Classes/Avatar.cs index cff9081..410b53e 100644 --- a/AssetStudio/Classes/Avatar.cs +++ b/AssetStudio/Classes/Avatar.cs @@ -53,21 +53,24 @@ namespace AssetStudio else reader.Position += 48; } - //- OffsetPtr m_DefaultPose - //-- SkeletonPose data - numXforms = reader.ReadInt32(); - for (int i = 0; i < numXforms; i++) + if (version[0] > 4 || (version[0] == 4 && version[1] >= 3))//4.3 and up { - if (version[0] > 5 || (version[0] == 5 && version[1] >= 4))//5.4 and up - reader.Position += 40; - else - reader.Position += 48; - } - //- vector m_SkeletonNameIDArray - numIDs = reader.ReadInt32(); - for (int i = 0; i < numIDs; i++) - { - reader.Position += 4; + //- OffsetPtr m_DefaultPose + //-- SkeletonPose data + numXforms = reader.ReadInt32(); + for (int i = 0; i < numXforms; i++) + { + if (version[0] > 5 || (version[0] == 5 && version[1] >= 4))//5.4 and up + reader.Position += 40; + else + reader.Position += 48; + } + //- vector m_SkeletonNameIDArray + numIDs = reader.ReadInt32(); + for (int i = 0; i < numIDs; i++) + { + reader.Position += 4; + } } //- OffsetPtr m_Human //-- Human data @@ -176,11 +179,14 @@ namespace AssetStudio { reader.Position += 4; } - //- vector m_HumanSkeletonReverseIndexArray - int numReverseIndexes = reader.ReadInt32(); - for (int i = 0; i < numReverseIndexes; i++) + if (version[0] > 4 || (version[0] == 4 && version[1] >= 3)) //4.3 and up { - reader.Position += 4; + //- vector m_HumanSkeletonReverseIndexArray + int numReverseIndexes = reader.ReadInt32(); + for (int i = 0; i < numReverseIndexes; i++) + { + reader.Position += 4; + } } var m_RootMotionBoneIndex = reader.ReadInt32(); //- xform m_RootMotionBoneX @@ -188,44 +194,47 @@ namespace AssetStudio reader.Position += 40; else reader.Position += 48; - //- OffsetPtr m_RootMotionSkeleton - //-- Skeleton data - //--- vector m_Node - numNodes = reader.ReadInt32(); - for (int i = 0; i < numNodes; i++) + if (version[0] > 4 || (version[0] == 4 && version[1] >= 3)) //4.3 and up { - reader.Position += 8; - } - //--- vector m_ID - numIDs = reader.ReadInt32(); - for (int i = 0; i < numIDs; i++) - { - reader.Position += 4; - } - //--- vector m_AxesArray - numAxes = reader.ReadInt32(); - for (int i = 0; i < numAxes; i++) - { - if (version[0] > 5 || (version[0] == 5 && version[1] >= 4))//5.4 and up - reader.Position += 76; - else - reader.Position += 88; - } - //- OffsetPtr m_RootMotionSkeletonPose - //-- SkeletonPose data - numXforms = reader.ReadInt32(); - for (int i = 0; i < numXforms; i++) - { - if (version[0] > 5 || (version[0] == 5 && version[1] >= 4))//5.4 and up - reader.Position += 40; - else - reader.Position += 48; - } - //- vector m_RootMotionSkeletonIndexArray - int numMotionIndexes = reader.ReadInt32(); - for (int i = 0; i < numMotionIndexes; i++) - { - reader.Position += 4; + //- OffsetPtr m_RootMotionSkeleton + //-- Skeleton data + //--- vector m_Node + numNodes = reader.ReadInt32(); + for (int i = 0; i < numNodes; i++) + { + reader.Position += 8; + } + //--- vector m_ID + numIDs = reader.ReadInt32(); + for (int i = 0; i < numIDs; i++) + { + reader.Position += 4; + } + //--- vector m_AxesArray + numAxes = reader.ReadInt32(); + for (int i = 0; i < numAxes; i++) + { + if (version[0] > 5 || (version[0] == 5 && version[1] >= 4))//5.4 and up + reader.Position += 76; + else + reader.Position += 88; + } + //- OffsetPtr m_RootMotionSkeletonPose + //-- SkeletonPose data + numXforms = reader.ReadInt32(); + for (int i = 0; i < numXforms; i++) + { + if (version[0] > 5 || (version[0] == 5 && version[1] >= 4))//5.4 and up + reader.Position += 40; + else + reader.Position += 48; + } + //- vector m_RootMotionSkeletonIndexArray + int numMotionIndexes = reader.ReadInt32(); + for (int i = 0; i < numMotionIndexes; i++) + { + reader.Position += 4; + } } //map m_TOS int numTOS = reader.ReadInt32(); diff --git a/AssetStudio/Classes/Mesh.cs b/AssetStudio/Classes/Mesh.cs index 81b4c0c..515624e 100644 --- a/AssetStudio/Classes/Mesh.cs +++ b/AssetStudio/Classes/Mesh.cs @@ -511,7 +511,7 @@ namespace AssetStudio #region BlendShapeData and BindPose for 4.3.0 and later 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()][,]; for (int i = 0; i < m_BindPose.Length; i++) diff --git a/AssetStudio/StudioClasses/ModelConverter.cs b/AssetStudio/StudioClasses/ModelConverter.cs index bc74883..a0941e9 100644 --- a/AssetStudio/StudioClasses/ModelConverter.cs +++ b/AssetStudio/StudioClasses/ModelConverter.cs @@ -77,13 +77,29 @@ namespace AssetStudio { assetsfileList.TryGetTransform(m_GameObject.m_Transform, out var m_Transform); var rootTransform = m_Transform; - while (assetsfileList.TryGetTransform(rootTransform.m_Father, out var m_Father))//Get Root Transform + var frameList = new List(); + while (assetsfileList.TryGetTransform(rootTransform.m_Father, out var m_Father)) { + frameList.Add(ConvertFrames(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); - ConvertFrames(rootTransform, null); 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(); 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_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); + return frame; + } + + private void ConvertFrames(Transform trans, ImportedFrame parent) + { + var frame = ConvertFrames(trans); if (parent == null) { - FrameList = new List(); FrameList.Add(frame); } else @@ -356,57 +377,60 @@ namespace AssetStudio } //Morphs - foreach (var channel in mesh.m_Shapes.channels) + if (mesh.m_Shapes != null) { - morphChannelInfo.Add(channel.nameHash, channel.name); - } - if (mesh.m_Shapes.shapes.Count > 0) - { - ImportedMorph morph = null; - string lastGroup = ""; - for (int i = 0; i < mesh.m_Shapes.channels.Count; i++) + foreach (var channel in mesh.m_Shapes.channels) { - string group = BlendShapeNameGroup(mesh, i); - if (group != lastGroup) + morphChannelInfo.Add(channel.nameHash, channel.name); + } + if (mesh.m_Shapes.shapes.Count > 0) + { + ImportedMorph morph = null; + string lastGroup = ""; + for (int i = 0; i < mesh.m_Shapes.channels.Count; i++) { - morph = new ImportedMorph(); - MorphList.Add(morph); - morph.Name = iMesh.Name; - morph.ClipName = group; - morph.Channels = new List>(mesh.m_Shapes.channels.Count); - morph.KeyframeList = new List(mesh.m_Shapes.shapes.Count); - lastGroup = group; - } - - morph.Channels.Add(new Tuple(i < sMesh.m_BlendShapeWeights.Count ? 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++) - { - ImportedMorphKeyframe keyframe = new ImportedMorphKeyframe(); - keyframe.Name = BlendShapeNameExtension(mesh, i) + "_" + frameIdx; - int shapeIdx = mesh.m_Shapes.channels[i].frameIndex + frameIdx; - keyframe.VertexList = new List((int)mesh.m_Shapes.shapes[shapeIdx].vertexCount); - keyframe.MorphedVertexIndices = new List((int)mesh.m_Shapes.shapes[shapeIdx].vertexCount); - keyframe.Weight = shapeIdx < mesh.m_Shapes.fullWeights.Count ? mesh.m_Shapes.fullWeights[shapeIdx] : 100f; - int lastVertIndex = (int)(mesh.m_Shapes.shapes[shapeIdx].firstVertex + mesh.m_Shapes.shapes[shapeIdx].vertexCount); - for (int j = (int)mesh.m_Shapes.shapes[shapeIdx].firstVertex; j < lastVertIndex; j++) + string group = BlendShapeNameGroup(mesh, i); + if (group != lastGroup) { - var morphVert = mesh.m_Shapes.vertices[j]; - ImportedVertex vert = GetSourceVertex(iMesh.SubmeshList, (int)morphVert.index); - ImportedVertex destVert = new ImportedVertex(); - Vector3 morphPos = morphVert.vertex; - morphPos.X *= -1; - destVert.Position = vert.Position + morphPos; - Vector3 morphNormal = morphVert.normal; - morphNormal.X *= -1; - destVert.Normal = morphNormal; - Vector4 morphTangent = new Vector4(morphVert.tangent, 0); - morphTangent.X *= -1; - destVert.Tangent = morphTangent; - keyframe.VertexList.Add(destVert); - keyframe.MorphedVertexIndices.Add((ushort)morphVert.index); + morph = new ImportedMorph(); + MorphList.Add(morph); + morph.Name = iMesh.Name; + morph.ClipName = group; + morph.Channels = new List>(mesh.m_Shapes.channels.Count); + morph.KeyframeList = new List(mesh.m_Shapes.shapes.Count); + lastGroup = group; } - morph.KeyframeList.Add(keyframe); + morph.Channels.Add(new Tuple(i < sMesh.m_BlendShapeWeights.Count ? 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++) + { + ImportedMorphKeyframe keyframe = new ImportedMorphKeyframe(); + keyframe.Name = BlendShapeNameExtension(mesh, i) + "_" + frameIdx; + int shapeIdx = mesh.m_Shapes.channels[i].frameIndex + frameIdx; + keyframe.VertexList = new List((int)mesh.m_Shapes.shapes[shapeIdx].vertexCount); + keyframe.MorphedVertexIndices = new List((int)mesh.m_Shapes.shapes[shapeIdx].vertexCount); + keyframe.Weight = shapeIdx < mesh.m_Shapes.fullWeights.Count ? mesh.m_Shapes.fullWeights[shapeIdx] : 100f; + int lastVertIndex = (int)(mesh.m_Shapes.shapes[shapeIdx].firstVertex + mesh.m_Shapes.shapes[shapeIdx].vertexCount); + for (int j = (int)mesh.m_Shapes.shapes[shapeIdx].firstVertex; j < lastVertIndex; j++) + { + var morphVert = mesh.m_Shapes.vertices[j]; + ImportedVertex vert = GetSourceVertex(iMesh.SubmeshList, (int)morphVert.index); + ImportedVertex destVert = new ImportedVertex(); + Vector3 morphPos = morphVert.vertex; + morphPos.X *= -1; + destVert.Position = vert.Position + morphPos; + Vector3 morphNormal = morphVert.normal; + morphNormal.X *= -1; + destVert.Normal = morphNormal; + Vector4 morphTangent = new Vector4(morphVert.tangent, 0); + morphTangent.X *= -1; + destVert.Tangent = morphTangent; + keyframe.VertexList.Add(destVert); + keyframe.MorphedVertexIndices.Add((ushort)morphVert.index); + } + + morph.KeyframeList.Add(keyframe); + } } } }