diff --git a/AssetStudio/Classes/AnimationClip.cs b/AssetStudio/Classes/AnimationClip.cs index 6bdc653..6a4f99a 100644 --- a/AssetStudio/Classes/AnimationClip.cs +++ b/AssetStudio/Classes/AnimationClip.cs @@ -358,16 +358,16 @@ namespace AssetStudio public class xform { - public object t; + public Vector3 t; public Quaternion q; - public object s; + public Vector3 s; public xform(ObjectReader reader) { var version = reader.version; - t = version[0] > 5 || (version[0] == 5 && version[1] >= 4) ? (object)reader.ReadVector3() : (object)reader.ReadVector4();//5.4 and up + t = version[0] > 5 || (version[0] == 5 && version[1] >= 4) ? reader.ReadVector3() : (Vector3)reader.ReadVector4();//5.4 and up q = reader.ReadQuaternion(); - s = version[0] > 5 || (version[0] == 5 && version[1] >= 4) ? (object)reader.ReadVector3() : (object)reader.ReadVector4();//5.4 and up + s = version[0] > 5 || (version[0] == 5 && version[1] >= 4) ? reader.ReadVector3() : (Vector3)reader.ReadVector4();//5.4 and up } } @@ -399,7 +399,7 @@ namespace AssetStudio public xform m_X; public float m_WeightT; public float m_WeightR; - public object m_HintT; + public Vector3 m_HintT; public float m_HintWeightT; public HumanGoal(ObjectReader reader) @@ -410,7 +410,7 @@ namespace AssetStudio m_WeightR = reader.ReadSingle(); if (version[0] >= 5)//5.0 and up { - m_HintT = version[0] > 5 || (version[0] == 5 && version[1] >= 4) ? (object)reader.ReadVector3() : (object)reader.ReadVector4();//5.4 and up + m_HintT = version[0] > 5 || (version[0] == 5 && version[1] >= 4) ? reader.ReadVector3() : (Vector3)reader.ReadVector4();//5.4 and up m_HintWeightT = reader.ReadSingle(); } } @@ -419,19 +419,19 @@ namespace AssetStudio public class HumanPose { public xform m_RootX; - public object m_LookAtPosition; + public Vector3 m_LookAtPosition; public Vector4 m_LookAtWeight; public List m_GoalArray; public HandPose m_LeftHandPose; public HandPose m_RightHandPose; public float[] m_DoFArray; - public object[] m_TDoFArray; + public Vector3[] m_TDoFArray; public HumanPose(ObjectReader reader) { var version = reader.version; m_RootX = new xform(reader); - m_LookAtPosition = version[0] > 5 || (version[0] == 5 && version[1] >= 4) ? (object)reader.ReadVector3() : (object)reader.ReadVector4();//5.4 and up + m_LookAtPosition = version[0] > 5 || (version[0] == 5 && version[1] >= 4) ? reader.ReadVector3() : (Vector3)reader.ReadVector4();//5.4 and up m_LookAtWeight = reader.ReadVector4(); int numGoals = reader.ReadInt32(); @@ -450,10 +450,10 @@ namespace AssetStudio if (version[0] > 5 || (version[0] == 5 && version[1] >= 2))//5.2 and up { int numTDof = reader.ReadInt32(); - m_TDoFArray = new object[numTDof]; + m_TDoFArray = new Vector3[numTDof]; for (int i = 0; i < numTDof; i++) { - m_TDoFArray[i] = version[0] > 5 || (version[0] == 5 && version[1] >= 4) ? (object)reader.ReadVector3() : (object)reader.ReadVector4();//5.4 and up + m_TDoFArray[i] = version[0] > 5 || (version[0] == 5 && version[1] >= 4) ? reader.ReadVector3() : (Vector3)reader.ReadVector4();//5.4 and up } } } @@ -665,7 +665,7 @@ namespace AssetStudio public xform m_RightFootStartX; public xform m_MotionStartX; public xform m_MotionStopX; - public object m_AverageSpeed; + public Vector3 m_AverageSpeed; public Clip m_Clip; public float m_StartTime; public float m_StopTime; @@ -704,7 +704,7 @@ namespace AssetStudio m_MotionStartX = new xform(reader); m_MotionStopX = new xform(reader); } - m_AverageSpeed = version[0] > 5 || (version[0] == 5 && version[1] >= 4) ? (object)reader.ReadVector3() : (object)reader.ReadVector4();//5.4 and up + m_AverageSpeed = version[0] > 5 || (version[0] == 5 && version[1] >= 4) ? reader.ReadVector3() : (Vector3)reader.ReadVector4();//5.4 and up m_Clip = new Clip(reader); m_StartTime = reader.ReadSingle(); m_StopTime = reader.ReadSingle(); diff --git a/AssetStudio/Classes/AnimatorController.cs b/AssetStudio/Classes/AnimatorController.cs index 958978b..43898fd 100644 --- a/AssetStudio/Classes/AnimatorController.cs +++ b/AssetStudio/Classes/AnimatorController.cs @@ -448,9 +448,9 @@ namespace AssetStudio public bool[] m_BoolValues; public int[] m_IntValues; public float[] m_FloatValues; - public object[] m_PositionValues; + public Vector3[] m_PositionValues; public Vector4[] m_QuaternionValues; - public object[] m_ScaleValues; + public Vector3[] m_ScaleValues; public ValueArray(ObjectReader reader) { @@ -471,19 +471,19 @@ namespace AssetStudio } int numPosValues = reader.ReadInt32(); - m_PositionValues = new object[numPosValues]; + m_PositionValues = new Vector3[numPosValues]; for (int i = 0; i < numPosValues; i++) { - m_PositionValues[i] = version[0] > 5 || (version[0] == 5 && version[1] >= 4) ? (object)reader.ReadVector3() : (object)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()); int numScaleValues = reader.ReadInt32(); - m_ScaleValues = new object[numScaleValues]; + m_ScaleValues = new Vector3[numScaleValues]; for (int i = 0; i < numScaleValues; i++) { - m_ScaleValues[i] = version[0] > 5 || (version[0] == 5 && version[1] >= 4) ? (object)reader.ReadVector3() : (object)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 adn up } if (version[0] > 5 || (version[0] == 5 && version[1] >= 5)) //5.5 and up diff --git a/AssetStudio/Utility/IImported.cs b/AssetStudio/Utility/IImported.cs index 80bd2f0..620618f 100644 --- a/AssetStudio/Utility/IImported.cs +++ b/AssetStudio/Utility/IImported.cs @@ -38,12 +38,13 @@ namespace AssetStudio public void AddChild(ImportedFrame obj) { children.Add(obj); + obj.Parent?.Remove(obj); obj.Parent = this; } - public void ClearChild() + public void Remove(ImportedFrame frame) { - children.Clear(); + children.Remove(frame); } public IEnumerator GetEnumerator() diff --git a/AssetStudioTools/ModelConverter.cs b/AssetStudioTools/ModelConverter.cs index 89af1a8..819729f 100644 --- a/AssetStudioTools/ModelConverter.cs +++ b/AssetStudioTools/ModelConverter.cs @@ -81,8 +81,7 @@ namespace AssetStudio var m_Transform = m_GameObject.m_Transform; if (!hasTransformHierarchy) { - var rootFrame = ConvertFrame(m_Transform); - FrameList.Add(rootFrame); + ConvertFrames(m_Transform, null); DeoptimizeTransformHierarchy(); } else @@ -202,16 +201,18 @@ namespace AssetStudio var frame = new ImportedFrame(); frame.Name = name; frame.InitChildren(0); - var m_LocalPosition = new[] { t.X, t.Y, t.Z }; - var m_LocalRotation = new[] { q.X, q.Y, q.Z, q.W }; - var m_LocalScale = new[] { s.X, s.Y, s.Z }; - var m_EulerRotation = QuatToEuler(new[] { m_LocalRotation[0], -m_LocalRotation[1], -m_LocalRotation[2], m_LocalRotation[3] }); - frame.LocalRotation = new[] { m_EulerRotation[0], m_EulerRotation[1], m_EulerRotation[2] }; - frame.LocalScale = new[] { m_LocalScale[0], m_LocalScale[1], m_LocalScale[2] }; - frame.LocalPosition = new[] { -m_LocalPosition[0], m_LocalPosition[1], m_LocalPosition[2] }; + SetFrame(frame, t, q, s); return frame; } + private void SetFrame(ImportedFrame frame, Vector3 t, Quaternion q, Vector3 s) + { + var m_EulerRotation = QuatToEuler(new[] { q.X, -q.Y, -q.Z, q.W }); + frame.LocalRotation = new[] { m_EulerRotation[0], m_EulerRotation[1], m_EulerRotation[2] }; + frame.LocalScale = new[] { s.X, s.Y, s.Z }; + frame.LocalPosition = new[] { -t.X, t.Y, t.Z }; + } + private void ConvertFrames(Transform trans, ImportedFrame parent) { var frame = ConvertFrame(trans); @@ -1019,7 +1020,6 @@ namespace AssetStudio // 2. Restore the original transform hierarchy // Prerequisite: skeletonPaths follow pre-order traversal var rootFrame = FrameList[0]; - rootFrame.ClearChild(); for (var i = 1; i < skeletonPaths.Count; i++) // start from 1, skip the root transform because it will always be there. { var path = skeletonPaths[i]; @@ -1040,18 +1040,18 @@ namespace AssetStudio var skeletonPose = avatar.m_Avatar.m_DefaultPose; var xform = skeletonPose.m_X[i]; - if (!(xform.t is Vector3 t)) + + var frame = ImportedHelpers.FindChildOrRoot(transformName, rootFrame); + if (frame != null) { - var v4 = (Vector4)xform.t; - t = (Vector3)v4; + SetFrame(frame, xform.t, xform.q, xform.s); + parentFrame.AddChild(frame); } - if (!(xform.s is Vector3 s)) + else { - var v4 = (Vector4)xform.s; - s = (Vector3)v4; + frame = ConvertFrame(xform.t, xform.q, xform.s, transformName); + parentFrame.AddChild(frame); } - var frame = ConvertFrame(t, xform.q, s, transformName); - parentFrame.AddChild(frame); } }