This commit is contained in:
Perfare 2018-11-22 13:38:07 +08:00
parent ab5f5fbd9d
commit 0a764c74d6
4 changed files with 40 additions and 39 deletions

View File

@ -358,16 +358,16 @@ namespace AssetStudio
public class xform public class xform
{ {
public object t; public Vector3 t;
public Quaternion q; public Quaternion q;
public object s; public Vector3 s;
public xform(ObjectReader reader) public xform(ObjectReader reader)
{ {
var version = reader.version; 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(); 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 xform m_X;
public float m_WeightT; public float m_WeightT;
public float m_WeightR; public float m_WeightR;
public object m_HintT; public Vector3 m_HintT;
public float m_HintWeightT; public float m_HintWeightT;
public HumanGoal(ObjectReader reader) public HumanGoal(ObjectReader reader)
@ -410,7 +410,7 @@ namespace AssetStudio
m_WeightR = reader.ReadSingle(); m_WeightR = reader.ReadSingle();
if (version[0] >= 5)//5.0 and up 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(); m_HintWeightT = reader.ReadSingle();
} }
} }
@ -419,19 +419,19 @@ namespace AssetStudio
public class HumanPose public class HumanPose
{ {
public xform m_RootX; public xform m_RootX;
public object m_LookAtPosition; public Vector3 m_LookAtPosition;
public Vector4 m_LookAtWeight; public Vector4 m_LookAtWeight;
public List<HumanGoal> m_GoalArray; public List<HumanGoal> m_GoalArray;
public HandPose m_LeftHandPose; public HandPose m_LeftHandPose;
public HandPose m_RightHandPose; public HandPose m_RightHandPose;
public float[] m_DoFArray; public float[] m_DoFArray;
public object[] m_TDoFArray; public Vector3[] m_TDoFArray;
public HumanPose(ObjectReader reader) public HumanPose(ObjectReader reader)
{ {
var version = reader.version; var version = reader.version;
m_RootX = new xform(reader); 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(); m_LookAtWeight = reader.ReadVector4();
int numGoals = reader.ReadInt32(); int numGoals = reader.ReadInt32();
@ -450,10 +450,10 @@ namespace AssetStudio
if (version[0] > 5 || (version[0] == 5 && version[1] >= 2))//5.2 and up if (version[0] > 5 || (version[0] == 5 && version[1] >= 2))//5.2 and up
{ {
int numTDof = reader.ReadInt32(); int numTDof = reader.ReadInt32();
m_TDoFArray = new object[numTDof]; m_TDoFArray = new Vector3[numTDof];
for (int i = 0; i < numTDof; i++) 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_RightFootStartX;
public xform m_MotionStartX; public xform m_MotionStartX;
public xform m_MotionStopX; public xform m_MotionStopX;
public object m_AverageSpeed; public Vector3 m_AverageSpeed;
public Clip m_Clip; public Clip m_Clip;
public float m_StartTime; public float m_StartTime;
public float m_StopTime; public float m_StopTime;
@ -704,7 +704,7 @@ namespace AssetStudio
m_MotionStartX = new xform(reader); m_MotionStartX = new xform(reader);
m_MotionStopX = 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_Clip = new Clip(reader);
m_StartTime = reader.ReadSingle(); m_StartTime = reader.ReadSingle();
m_StopTime = reader.ReadSingle(); m_StopTime = reader.ReadSingle();

View File

@ -448,9 +448,9 @@ namespace AssetStudio
public bool[] m_BoolValues; public bool[] m_BoolValues;
public int[] m_IntValues; public int[] m_IntValues;
public float[] m_FloatValues; public float[] m_FloatValues;
public object[] m_PositionValues; public Vector3[] m_PositionValues;
public Vector4[] m_QuaternionValues; public Vector4[] m_QuaternionValues;
public object[] m_ScaleValues; public Vector3[] m_ScaleValues;
public ValueArray(ObjectReader reader) public ValueArray(ObjectReader reader)
{ {
@ -471,19 +471,19 @@ namespace AssetStudio
} }
int numPosValues = reader.ReadInt32(); int numPosValues = reader.ReadInt32();
m_PositionValues = new object[numPosValues]; m_PositionValues = new Vector3[numPosValues];
for (int i = 0; i < numPosValues; i++) 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()); m_QuaternionValues = reader.ReadVector4Array(reader.ReadInt32());
int numScaleValues = reader.ReadInt32(); int numScaleValues = reader.ReadInt32();
m_ScaleValues = new object[numScaleValues]; m_ScaleValues = new Vector3[numScaleValues];
for (int i = 0; i < numScaleValues; i++) 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 if (version[0] > 5 || (version[0] == 5 && version[1] >= 5)) //5.5 and up

View File

@ -38,12 +38,13 @@ namespace AssetStudio
public void AddChild(ImportedFrame obj) public void AddChild(ImportedFrame obj)
{ {
children.Add(obj); children.Add(obj);
obj.Parent?.Remove(obj);
obj.Parent = this; obj.Parent = this;
} }
public void ClearChild() public void Remove(ImportedFrame frame)
{ {
children.Clear(); children.Remove(frame);
} }
public IEnumerator<ImportedFrame> GetEnumerator() public IEnumerator<ImportedFrame> GetEnumerator()

View File

@ -81,8 +81,7 @@ namespace AssetStudio
var m_Transform = m_GameObject.m_Transform; var m_Transform = m_GameObject.m_Transform;
if (!hasTransformHierarchy) if (!hasTransformHierarchy)
{ {
var rootFrame = ConvertFrame(m_Transform); ConvertFrames(m_Transform, null);
FrameList.Add(rootFrame);
DeoptimizeTransformHierarchy(); DeoptimizeTransformHierarchy();
} }
else else
@ -202,16 +201,18 @@ namespace AssetStudio
var frame = new ImportedFrame(); var frame = new ImportedFrame();
frame.Name = name; frame.Name = name;
frame.InitChildren(0); frame.InitChildren(0);
var m_LocalPosition = new[] { t.X, t.Y, t.Z }; SetFrame(frame, t, q, s);
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] };
return frame; 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) private void ConvertFrames(Transform trans, ImportedFrame parent)
{ {
var frame = ConvertFrame(trans); var frame = ConvertFrame(trans);
@ -1019,7 +1020,6 @@ namespace AssetStudio
// 2. Restore the original transform hierarchy // 2. Restore the original transform hierarchy
// Prerequisite: skeletonPaths follow pre-order traversal // Prerequisite: skeletonPaths follow pre-order traversal
var rootFrame = FrameList[0]; 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. 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]; var path = skeletonPaths[i];
@ -1040,18 +1040,18 @@ namespace AssetStudio
var skeletonPose = avatar.m_Avatar.m_DefaultPose; var skeletonPose = avatar.m_Avatar.m_DefaultPose;
var xform = skeletonPose.m_X[i]; 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; SetFrame(frame, xform.t, xform.q, xform.s);
t = (Vector3)v4; parentFrame.AddChild(frame);
} }
if (!(xform.s is Vector3 s)) else
{ {
var v4 = (Vector4)xform.s; frame = ConvertFrame(xform.t, xform.q, xform.s, transformName);
s = (Vector3)v4; parentFrame.AddChild(frame);
} }
var frame = ConvertFrame(t, xform.q, s, transformName);
parentFrame.AddChild(frame);
} }
} }