From eb170d4f34d4eeb635fd4943045dc74d47d7712e Mon Sep 17 00:00:00 2001 From: Perfare Date: Sun, 9 Dec 2018 11:56:24 +0800 Subject: [PATCH] minor improvements --- AssetStudio/Classes/Animation.cs | 6 +- AssetStudio/Classes/AnimationClip.cs | 106 ++++++------- AssetStudio/Classes/AnimatorController.cs | 139 ++++++++++++----- .../Classes/AnimatorOverrideController.cs | 6 +- AssetStudio/Classes/AssetBundle.cs | 12 +- AssetStudio/Classes/Avatar.cs | 49 +++--- AssetStudio/Classes/GameObject.cs | 14 +- AssetStudio/Classes/Material.cs | 18 +-- AssetStudio/Classes/Mesh.cs | 65 +++----- AssetStudio/Classes/Shader.cs | 126 ++++++++-------- AssetStudio/Classes/Transform.cs | 21 +-- AssetStudio/IImported.cs | 12 +- AssetStudioFBX/AssetStudioFBXExporter.cpp | 10 +- AssetStudioGUI/AssetStudioGUIForm.cs | 54 +++---- AssetStudioGUI/Studio.cs | 2 +- AssetStudioUtility/ModelConverter.cs | 142 ++++-------------- 16 files changed, 366 insertions(+), 416 deletions(-) diff --git a/AssetStudio/Classes/Animation.cs b/AssetStudio/Classes/Animation.cs index 624fbe1..b03035b 100644 --- a/AssetStudio/Classes/Animation.cs +++ b/AssetStudio/Classes/Animation.cs @@ -7,16 +7,16 @@ namespace AssetStudio { public sealed class Animation : Behaviour { - public List> m_Animations; + public PPtr[] m_Animations; public Animation(ObjectReader reader) : base(reader) { var m_Animation = new PPtr(reader); int numAnimations = reader.ReadInt32(); - m_Animations = new List>(numAnimations); + m_Animations = new PPtr[numAnimations]; for (int i = 0; i < numAnimations; i++) { - m_Animations.Add(new PPtr(reader)); + m_Animations[i] = new PPtr(reader); } } } diff --git a/AssetStudio/Classes/AnimationClip.cs b/AssetStudio/Classes/AnimationClip.cs index 2739d0d..c7ea0ad 100644 --- a/AssetStudio/Classes/AnimationClip.cs +++ b/AssetStudio/Classes/AnimationClip.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.IO; +using System.Linq; using SharpDX; namespace AssetStudio @@ -22,7 +23,7 @@ namespace AssetStudio value = readerFunc(); inSlope = readerFunc(); outSlope = readerFunc(); - if (reader.version[0] >= 2018) + if (reader.version[0] >= 2018) //2018 and up { weightedMode = reader.ReadInt32(); inWeight = readerFunc(); @@ -33,7 +34,7 @@ namespace AssetStudio public class AnimationCurve { - public List> m_Curve; + public Keyframe[] m_Curve; public int m_PreInfinity; public int m_PostInfinity; public int m_RotationOrder; @@ -42,10 +43,10 @@ namespace AssetStudio { var version = reader.version; int numCurves = reader.ReadInt32(); - m_Curve = new List>(numCurves); + m_Curve = new Keyframe[numCurves]; for (int i = 0; i < numCurves; i++) { - m_Curve.Add(new Keyframe(reader, readerFunc)); + m_Curve[i] = new Keyframe(reader, readerFunc); } m_PreInfinity = reader.ReadInt32(); @@ -321,7 +322,7 @@ namespace AssetStudio public class PPtrCurve { - public List curve; + public PPtrKeyframe[] curve; public string attribute; public string path; public int classID; @@ -331,10 +332,10 @@ namespace AssetStudio public PPtrCurve(ObjectReader reader) { int numCurves = reader.ReadInt32(); - curve = new List(numCurves); + curve = new PPtrKeyframe[numCurves]; for (int i = 0; i < numCurves; i++) { - curve.Add(new PPtrKeyframe(reader)); + curve[i] = new PPtrKeyframe(reader); } attribute = reader.ReadAlignedString(); @@ -418,7 +419,7 @@ namespace AssetStudio public xform m_RootX; public Vector3 m_LookAtPosition; public Vector4 m_LookAtWeight; - public List m_GoalArray; + public HumanGoal[] m_GoalArray; public HandPose m_LeftHandPose; public HandPose m_RightHandPose; public float[] m_DoFArray; @@ -432,10 +433,10 @@ namespace AssetStudio m_LookAtWeight = reader.ReadVector4(); int numGoals = reader.ReadInt32(); - m_GoalArray = new List(numGoals); + m_GoalArray = new HumanGoal[numGoals]; for (int i = 0; i < numGoals; i++) { - m_GoalArray.Add(new HumanGoal(reader)); + m_GoalArray[i] = new HumanGoal(reader); } m_LeftHandPose = new HandPose(reader); @@ -504,17 +505,17 @@ namespace AssetStudio public class StreamedFrame { public float time; - public List keyList; + public StreamedCurveKey[] keyList; public StreamedFrame(BinaryReader reader) { time = reader.ReadSingle(); int numKeys = reader.ReadInt32(); - keyList = new List(numKeys); + keyList = new StreamedCurveKey[numKeys]; for (int i = 0; i < numKeys; i++) { - keyList.Add(new StreamedCurveKey(reader)); + keyList[i] = new StreamedCurveKey(reader); } } } @@ -540,7 +541,7 @@ namespace AssetStudio for (int i = frameIndex - 1; i >= 0; i--) { var preFrame = frameList[i]; - var preCurveKey = preFrame.keyList.Find(x => x.index == curveKey.index); + var preCurveKey = preFrame.keyList.FirstOrDefault(x => x.index == curveKey.index); if (preCurveKey != null) { curveKey.inSlope = preCurveKey.CalculateNextInSlope(frame.time - preFrame.time, curveKey); @@ -603,15 +604,15 @@ namespace AssetStudio public class ValueArrayConstant { - public List m_ValueArray; + public ValueConstant[] m_ValueArray; public ValueArrayConstant(ObjectReader reader) { int numVals = reader.ReadInt32(); - m_ValueArray = new List(numVals); + m_ValueArray = new ValueConstant[numVals]; for (int i = 0; i < numVals; i++) { - m_ValueArray.Add(new ValueConstant(reader)); + m_ValueArray[i] = new ValueConstant(reader); } } } @@ -669,7 +670,7 @@ namespace AssetStudio public float m_CycleOffset; public float m_AverageAngularSpeed; public int[] m_IndexArray; - public List m_ValueArrayDelta; + public ValueDelta[] m_ValueArrayDelta; public float[] m_ValueArrayReferencePose; public bool m_Mirror; public bool m_LoopTime; @@ -714,10 +715,10 @@ namespace AssetStudio var m_AdditionalCurveIndexArray = reader.ReadInt32Array(); } int numDeltas = reader.ReadInt32(); - m_ValueArrayDelta = new List(numDeltas); + m_ValueArrayDelta = new ValueDelta[numDeltas]; for (int i = 0; i < numDeltas; i++) { - m_ValueArrayDelta.Add(new ValueDelta(reader)); + m_ValueArrayDelta[i] = new ValueDelta(reader); } if (version[0] > 5 || (version[0] == 5 && version[1] >= 3))//5.3 and up { @@ -725,7 +726,10 @@ namespace AssetStudio } m_Mirror = reader.ReadBoolean(); - m_LoopTime = reader.ReadBoolean(); + if (version[0] > 4 || (version[0] == 4 && version[1] >= 3)) //4.3 and up + { + m_LoopTime = reader.ReadBoolean(); + } m_LoopBlend = reader.ReadBoolean(); m_LoopBlendOrientation = reader.ReadBoolean(); m_LoopBlendPositionY = reader.ReadBoolean(); @@ -773,23 +777,23 @@ namespace AssetStudio public class AnimationClipBindingConstant { - public List genericBindings; - public List> pptrCurveMapping; + public GenericBinding[] genericBindings; + public PPtr[] pptrCurveMapping; public AnimationClipBindingConstant(ObjectReader reader) { int numBindings = reader.ReadInt32(); - genericBindings = new List(numBindings); + genericBindings = new GenericBinding[numBindings]; for (int i = 0; i < numBindings; i++) { - genericBindings.Add(new GenericBinding(reader)); + genericBindings[i] = new GenericBinding(reader); } int numMappings = reader.ReadInt32(); - pptrCurveMapping = new List>(numMappings); + pptrCurveMapping = new PPtr[numMappings]; for (int i = 0; i < numMappings; i++) { - pptrCurveMapping.Add(new PPtr(reader)); + pptrCurveMapping[i] = new PPtr(reader); } } @@ -842,20 +846,20 @@ namespace AssetStudio public bool m_Legacy; public bool m_Compressed; public bool m_UseHighQualityCurve; - public List m_RotationCurves; - public List m_CompressedRotationCurves; - public List m_EulerCurves; - public List m_PositionCurves; - public List m_ScaleCurves; - public List m_FloatCurves; - public List m_PPtrCurves; + public QuaternionCurve[] m_RotationCurves; + public CompressedAnimationCurve[] m_CompressedRotationCurves; + public Vector3Curve[] m_EulerCurves; + public Vector3Curve[] m_PositionCurves; + public Vector3Curve[] m_ScaleCurves; + public FloatCurve[] m_FloatCurves; + public PPtrCurve[] m_PPtrCurves; public float m_SampleRate; public int m_WrapMode; public AABB m_Bounds; public uint m_MuscleClipSize; public ClipMuscleConstant m_MuscleClip; public AnimationClipBindingConstant m_ClipBindingConstant; - //public List m_Events; + //public AnimationEvent[] m_Events; public AnimationClip(ObjectReader reader) : base(reader) @@ -881,57 +885,57 @@ namespace AssetStudio } reader.AlignStream(); int numRCurves = reader.ReadInt32(); - m_RotationCurves = new List(numRCurves); + m_RotationCurves = new QuaternionCurve[numRCurves]; for (int i = 0; i < numRCurves; i++) { - m_RotationCurves.Add(new QuaternionCurve(reader)); + m_RotationCurves[i] = new QuaternionCurve(reader); } int numCRCurves = reader.ReadInt32(); - m_CompressedRotationCurves = new List(numCRCurves); + m_CompressedRotationCurves = new CompressedAnimationCurve[numCRCurves]; for (int i = 0; i < numCRCurves; i++) { - m_CompressedRotationCurves.Add(new CompressedAnimationCurve(reader)); + m_CompressedRotationCurves[i] = new CompressedAnimationCurve(reader); } if (version[0] > 5 || (version[0] == 5 && version[1] >= 3))//5.3 and up { int numEulerCurves = reader.ReadInt32(); - m_EulerCurves = new List(numEulerCurves); + m_EulerCurves = new Vector3Curve[numEulerCurves]; for (int i = 0; i < numEulerCurves; i++) { - m_EulerCurves.Add(new Vector3Curve(reader)); + m_EulerCurves[i] = new Vector3Curve(reader); } } int numPCurves = reader.ReadInt32(); - m_PositionCurves = new List(numPCurves); + m_PositionCurves = new Vector3Curve[numPCurves]; for (int i = 0; i < numPCurves; i++) { - m_PositionCurves.Add(new Vector3Curve(reader)); + m_PositionCurves[i] = new Vector3Curve(reader); } int numSCurves = reader.ReadInt32(); - m_ScaleCurves = new List(numSCurves); + m_ScaleCurves = new Vector3Curve[numSCurves]; for (int i = 0; i < numSCurves; i++) { - m_ScaleCurves.Add(new Vector3Curve(reader)); + m_ScaleCurves[i] = new Vector3Curve(reader); } int numFCurves = reader.ReadInt32(); - m_FloatCurves = new List(numFCurves); + m_FloatCurves = new FloatCurve[numFCurves]; for (int i = 0; i < numFCurves; i++) { - m_FloatCurves.Add(new FloatCurve(reader)); + m_FloatCurves[i] = new FloatCurve(reader); } if (version[0] > 4 || (version[0] == 4 && version[1] >= 3)) //4.3 and up { int numPtrCurves = reader.ReadInt32(); - m_PPtrCurves = new List(numPtrCurves); + m_PPtrCurves = new PPtrCurve[numPtrCurves]; for (int i = 0; i < numPtrCurves; i++) { - m_PPtrCurves.Add(new PPtrCurve(reader)); + m_PPtrCurves[i] = new PPtrCurve(reader); } } @@ -953,10 +957,10 @@ namespace AssetStudio //m_HasGenericRootTransform 2018.3 //m_HasMotionFloatCurves 2018.3 /*int numEvents = reader.ReadInt32(); - m_Events = new List(numEvents); + m_Events = new AnimationEvent[numEvents]; for (int i = 0; i < numEvents; i++) { - m_Events.Add(new AnimationEvent(reader)); + m_Events[i] = new AnimationEvent(reader); }*/ } } diff --git a/AssetStudio/Classes/AnimatorController.cs b/AssetStudio/Classes/AnimatorController.cs index 100c5fc..4876b85 100644 --- a/AssetStudio/Classes/AnimatorController.cs +++ b/AssetStudio/Classes/AnimatorController.cs @@ -14,9 +14,11 @@ namespace AssetStudio public HumanPoseMask(ObjectReader reader) { + var version = reader.version; + word0 = reader.ReadUInt32(); word1 = reader.ReadUInt32(); - if (reader.version[0] >= 5) //5.0 and up + if (version[0] > 5 || (version[0] == 5 && version[1] >= 2)) //5.2 and up { word2 = reader.ReadUInt32(); } @@ -64,15 +66,23 @@ namespace AssetStudio public LayerConstant(ObjectReader reader) { + var version = reader.version; + m_StateMachineIndex = reader.ReadUInt32(); m_StateMachineMotionSetIndex = reader.ReadUInt32(); m_BodyMask = new HumanPoseMask(reader); m_SkeletonMask = new SkeletonMask(reader); m_Binding = reader.ReadUInt32(); m_LayerBlendingMode = reader.ReadInt32(); - m_DefaultWeight = reader.ReadSingle(); + if (version[0] > 4 || (version[0] == 4 && version[1] >= 2)) //4.2 and up + { + m_DefaultWeight = reader.ReadSingle(); + } m_IKPass = reader.ReadBoolean(); - m_SyncedLayerAffectsTiming = reader.ReadBoolean(); + if (version[0] > 4 || (version[0] == 4 && version[1] >= 2)) //4.2 and up + { + m_SyncedLayerAffectsTiming = reader.ReadBoolean(); + } reader.AlignStream(); } } @@ -113,6 +123,7 @@ namespace AssetStudio public TransitionConstant(ObjectReader reader) { var version = reader.version; + int numConditions = reader.ReadInt32(); m_ConditionConstantArray = new ConditionConstant[numConditions]; for (int i = 0; i < numConditions; i++) @@ -144,7 +155,11 @@ namespace AssetStudio m_Atomic = reader.ReadBoolean(); } - m_CanTransitionToSelf = reader.ReadBoolean(); + if (version[0] > 4 || (version[0] == 4 && version[1] >= 5)) //4.5 and up + { + m_CanTransitionToSelf = reader.ReadBoolean(); + } + reader.AlignStream(); } } @@ -224,6 +239,7 @@ namespace AssetStudio public uint m_BlendEventID; public uint m_BlendEventYID; public uint[] m_ChildIndices; + public float[] m_ChildThresholdArray; public Blend1dDataConstant m_Blend1dData; public Blend2dDataConstant m_Blend2dData; public BlendDirectDataConstant m_BlendDirectData; @@ -236,42 +252,70 @@ namespace AssetStudio public BlendTreeNodeConstant(ObjectReader reader) { var version = reader.version; - m_BlendType = reader.ReadUInt32(); + + if (version[0] > 4 || (version[0] == 4 && version[1] >= 1)) //4.1 and up + { + m_BlendType = reader.ReadUInt32(); + } m_BlendEventID = reader.ReadUInt32(); - m_BlendEventYID = reader.ReadUInt32(); + if (version[0] > 4 || (version[0] == 4 && version[1] >= 1)) //4.1 and up + { + m_BlendEventYID = reader.ReadUInt32(); + } m_ChildIndices = reader.ReadUInt32Array(); - m_Blend1dData = new Blend1dDataConstant(reader); - m_Blend2dData = new Blend2dDataConstant(reader); + if (version[0] < 4 || (version[0] == 4 && version[1] < 1)) //4.1 down + { + m_ChildThresholdArray = reader.ReadSingleArray(); + } + + if (version[0] > 4 || (version[0] == 4 && version[1] >= 1)) //4.1 and up + { + m_Blend1dData = new Blend1dDataConstant(reader); + m_Blend2dData = new Blend2dDataConstant(reader); + } + if (version[0] >= 5) //5.0 and up { m_BlendDirectData = new BlendDirectDataConstant(reader); } m_ClipID = reader.ReadUInt32(); - if (version[0] < 5) //5.0 down + if (version[0] == 4 && version[1] >= 5) //4.5 - 5.0 { m_ClipIndex = reader.ReadUInt32(); } m_Duration = reader.ReadSingle(); - m_CycleOffset = reader.ReadSingle(); - m_Mirror = reader.ReadBoolean(); - reader.AlignStream(); + + if (version[0] > 4 || (version[0] == 4 && version[1] >= 1)) //4.1 and up + { + m_CycleOffset = reader.ReadSingle(); + m_Mirror = reader.ReadBoolean(); + reader.AlignStream(); + } } } public class BlendTreeConstant { public BlendTreeNodeConstant[] m_NodeArray; + public ValueArrayConstant m_BlendEventArrayConstant; public BlendTreeConstant(ObjectReader reader) { + var version = reader.version; + int numNodes = reader.ReadInt32(); m_NodeArray = new BlendTreeNodeConstant[numNodes]; for (int i = 0; i < numNodes; i++) { m_NodeArray[i] = new BlendTreeNodeConstant(reader); } + + if (version[0] < 4 || (version[0] == 4 && version[1] < 5)) //4.5 down + { + m_BlendEventArrayConstant = new ValueArrayConstant(reader); + } } } @@ -299,6 +343,7 @@ namespace AssetStudio public StateConstant(ObjectReader reader) { var version = reader.version; + int numTransistions = reader.ReadInt32(); m_TransitionConstantArray = new TransitionConstant[numTransistions]; for (int i = 0; i < numTransistions; i++) @@ -308,7 +353,7 @@ namespace AssetStudio m_BlendTreeConstantIndexArray = reader.ReadInt32Array(); - if (version[0] < 5) //5.0 down + if (version[0] < 5 || (version[0] == 5 && version[1] < 2)) //5.2 down { int numInfos = reader.ReadInt32(); m_LeafInfoArray = new LeafInfoConstant[numInfos]; @@ -326,14 +371,17 @@ namespace AssetStudio } m_NameID = reader.ReadUInt32(); - m_PathID = reader.ReadUInt32(); + if (version[0] > 4 || (version[0] == 4 && version[1] >= 3)) //4.3 and up + { + m_PathID = reader.ReadUInt32(); + } if (version[0] >= 5) //5.0 and up { m_FullPathID = reader.ReadUInt32(); } m_TagID = reader.ReadUInt32(); - if (version[0] >= 5) //5.0 and up + if (version[0] > 5 || (version[0] == 5 && version[1] >= 1)) //5.1 and up { m_SpeedParamID = reader.ReadUInt32(); m_MirrorParamID = reader.ReadUInt32(); @@ -346,7 +394,10 @@ namespace AssetStudio } m_Speed = reader.ReadSingle(); - m_CycleOffset = reader.ReadSingle(); + if (version[0] > 4 || (version[0] == 4 && version[1] >= 1)) //4.1 and up + { + m_CycleOffset = reader.ReadSingle(); + } m_IKOnFeet = reader.ReadBoolean(); if (version[0] >= 5) //5.0 and up { @@ -354,7 +405,11 @@ namespace AssetStudio } m_Loop = reader.ReadBoolean(); - m_Mirror = reader.ReadBoolean(); + if (version[0] > 4 || (version[0] == 4 && version[1] >= 1)) //4.1 and up + { + m_Mirror = reader.ReadBoolean(); + } + reader.AlignStream(); } } @@ -409,6 +464,7 @@ namespace AssetStudio public StateMachineConstant(ObjectReader reader) { var version = reader.version; + int numStates = reader.ReadInt32(); m_StateConstantArray = new StateConstant[numStates]; for (int i = 0; i < numStates; i++) @@ -443,6 +499,7 @@ namespace AssetStudio public bool[] m_BoolValues; public int[] m_IntValues; public float[] m_FloatValues; + public Vector4[] m_VectorValues; public Vector3[] m_PositionValues; public Vector4[] m_QuaternionValues; public Vector3[] m_ScaleValues; @@ -450,40 +507,44 @@ namespace AssetStudio public ValueArray(ObjectReader reader) { var version = reader.version; + if (version[0] < 5 || (version[0] == 5 && version[1] < 5)) //5.5 down { m_BoolValues = reader.ReadBooleanArray(); - reader.AlignStream(); - m_IntValues = reader.ReadInt32Array(); m_FloatValues = reader.ReadSingleArray(); } - int numPosValues = reader.ReadInt32(); - m_PositionValues = new Vector3[numPosValues]; - for (int i = 0; i < numPosValues; i++) + if (version[0] < 4 || (version[0] == 4 && version[1] < 3)) //4.3 down { - m_PositionValues[i] = version[0] > 5 || (version[0] == 5 && version[1] >= 4) ? reader.ReadVector3() : (Vector3)reader.ReadVector4(); //5.4 and up + m_VectorValues = reader.ReadVector4Array(); } - - m_QuaternionValues = reader.ReadVector4Array(); - - int numScaleValues = reader.ReadInt32(); - m_ScaleValues = new Vector3[numScaleValues]; - for (int i = 0; i < numScaleValues; i++) + else { - m_ScaleValues[i] = version[0] > 5 || (version[0] == 5 && version[1] >= 4) ? reader.ReadVector3() : (Vector3)reader.ReadVector4(); //5.4 and up - } + int numPosValues = reader.ReadInt32(); + m_PositionValues = new Vector3[numPosValues]; + for (int i = 0; i < numPosValues; i++) + { + m_PositionValues[i] = version[0] > 5 || (version[0] == 5 && version[1] >= 4) ? reader.ReadVector3() : (Vector3)reader.ReadVector4(); //5.4 and up + } - if (version[0] > 5 || (version[0] == 5 && version[1] >= 5)) //5.5 and up - { - m_FloatValues = reader.ReadSingleArray(); - m_IntValues = reader.ReadInt32Array(); + m_QuaternionValues = reader.ReadVector4Array(); - m_BoolValues = reader.ReadBooleanArray(); + int numScaleValues = reader.ReadInt32(); + m_ScaleValues = new Vector3[numScaleValues]; + for (int i = 0; i < numScaleValues; i++) + { + m_ScaleValues[i] = version[0] > 5 || (version[0] == 5 && version[1] >= 4) ? reader.ReadVector3() : (Vector3)reader.ReadVector4(); //5.4 and up + } - reader.AlignStream(); + if (version[0] > 5 || (version[0] == 5 && version[1] >= 5)) //5.5 and up + { + m_FloatValues = reader.ReadSingleArray(); + m_IntValues = reader.ReadInt32Array(); + m_BoolValues = reader.ReadBooleanArray(); + reader.AlignStream(); + } } } } @@ -526,10 +587,10 @@ namespace AssetStudio var m_Controller = new ControllerConstant(reader); int tosSize = reader.ReadInt32(); - var m_TOS = new List>(tosSize); + var m_TOS = new KeyValuePair[tosSize]; for (int i = 0; i < tosSize; i++) { - m_TOS.Add(new KeyValuePair(reader.ReadUInt32(), reader.ReadAlignedString())); + m_TOS[i] = new KeyValuePair(reader.ReadUInt32(), reader.ReadAlignedString()); } int numClips = reader.ReadInt32(); diff --git a/AssetStudio/Classes/AnimatorOverrideController.cs b/AssetStudio/Classes/AnimatorOverrideController.cs index c55e0a8..c89e7a2 100644 --- a/AssetStudio/Classes/AnimatorOverrideController.cs +++ b/AssetStudio/Classes/AnimatorOverrideController.cs @@ -20,17 +20,17 @@ namespace AssetStudio public sealed class AnimatorOverrideController : RuntimeAnimatorController { public PPtr m_Controller; - public List m_Clips; + public AnimationClipOverride[] m_Clips; public AnimatorOverrideController(ObjectReader reader) : base(reader) { m_Controller = new PPtr(reader); int numOverrides = reader.ReadInt32(); - m_Clips = new List(numOverrides); + m_Clips = new AnimationClipOverride[numOverrides]; for (int i = 0; i < numOverrides; i++) { - m_Clips.Add(new AnimationClipOverride(reader)); + m_Clips[i] = new AnimationClipOverride(reader); } } } diff --git a/AssetStudio/Classes/AssetBundle.cs b/AssetStudio/Classes/AssetBundle.cs index 116e765..3883fce 100644 --- a/AssetStudio/Classes/AssetBundle.cs +++ b/AssetStudio/Classes/AssetBundle.cs @@ -21,23 +21,23 @@ namespace AssetStudio public sealed class AssetBundle : NamedObject { - public List> m_PreloadTable; - public List> m_Container; + public PPtr[] m_PreloadTable; + public KeyValuePair[] m_Container; public AssetBundle(ObjectReader reader) : base(reader) { var m_PreloadTableSize = reader.ReadInt32(); - m_PreloadTable = new List>(m_PreloadTableSize); + m_PreloadTable = new PPtr[m_PreloadTableSize]; for (int i = 0; i < m_PreloadTableSize; i++) { - m_PreloadTable.Add(new PPtr(reader)); + m_PreloadTable[i] = new PPtr(reader); } var m_ContainerSize = reader.ReadInt32(); - m_Container = new List>(m_ContainerSize); + m_Container = new KeyValuePair[m_ContainerSize]; for (int i = 0; i < m_ContainerSize; i++) { - m_Container.Add(new KeyValuePair(reader.ReadAlignedString(), new AssetInfo(reader))); + m_Container[i] = new KeyValuePair(reader.ReadAlignedString(), new AssetInfo(reader)); } } } diff --git a/AssetStudio/Classes/Avatar.cs b/AssetStudio/Classes/Avatar.cs index c1a4d7c..f2ec658 100644 --- a/AssetStudio/Classes/Avatar.cs +++ b/AssetStudio/Classes/Avatar.cs @@ -1,5 +1,6 @@ using SharpDX; using System.Collections.Generic; +using System.Linq; namespace AssetStudio { @@ -66,47 +67,42 @@ namespace AssetStudio public class Skeleton { - public List m_Node; + public Node[] m_Node; public uint[] m_ID; - public List m_AxesArray; + public Axes[] m_AxesArray; public Skeleton(ObjectReader reader) { int numNodes = reader.ReadInt32(); - m_Node = new List(numNodes); + m_Node = new Node[numNodes]; for (int i = 0; i < numNodes; i++) { - m_Node.Add(new Node(reader)); + m_Node[i] = new Node(reader); } m_ID = reader.ReadUInt32Array(); int numAxes = reader.ReadInt32(); - m_AxesArray = new List(numAxes); + m_AxesArray = new Axes[numAxes]; for (int i = 0; i < numAxes; i++) { - m_AxesArray.Add(new Axes(reader)); + m_AxesArray[i] = new Axes(reader); } } } public class SkeletonPose { - public List m_X; - - public SkeletonPose() - { - m_X = new List(); - } + public xform[] m_X; public SkeletonPose(ObjectReader reader) { int numXforms = reader.ReadInt32(); - m_X = new List(numXforms); + m_X = new xform[numXforms]; for (int i = 0; i < numXforms; i++) { - m_X.Add(new xform(reader)); + m_X[i] = new xform(reader); } } } @@ -168,8 +164,8 @@ namespace AssetStudio public SkeletonPose m_SkeletonPose; public Hand m_LeftHand; public Hand m_RightHand; - public List m_Handles; - public List m_ColliderArray; + public Handle[] m_Handles; + public Collider[] m_ColliderArray; public int[] m_HumanBoneIndex; public float[] m_HumanBoneMass; public int[] m_ColliderIndex; @@ -197,17 +193,17 @@ namespace AssetStudio if (version[0] < 2018 || (version[0] == 2018 && version[1] < 2)) //2018.2 down { int numHandles = reader.ReadInt32(); - m_Handles = new List(numHandles); + m_Handles = new Handle[numHandles]; for (int i = 0; i < numHandles; i++) { - m_Handles.Add(new Handle(reader)); + m_Handles[i] = new Handle(reader); } int numColliders = reader.ReadInt32(); - m_ColliderArray = new List(numColliders); + m_ColliderArray = new Collider[numColliders]; for (int i = 0; i < numColliders; i++) { - m_ColliderArray.Add(new Collider(reader)); + m_ColliderArray[i] = new Collider(reader); } } @@ -230,7 +226,10 @@ namespace AssetStudio m_FeetSpacing = reader.ReadSingle(); m_HasLeftHand = reader.ReadBoolean(); m_HasRightHand = reader.ReadBoolean(); - m_HasTDoF = reader.ReadBoolean(); + if (version[0] > 5 || (version[0] == 5 && version[1] >= 2)) //5.2 and up + { + m_HasTDoF = reader.ReadBoolean(); + } reader.AlignStream(); } } @@ -289,7 +288,7 @@ namespace AssetStudio { public uint m_AvatarSize; public AvatarConstant m_Avatar; - public List> m_TOS; + public KeyValuePair[] m_TOS; public Avatar(ObjectReader reader) : base(reader) { @@ -297,10 +296,10 @@ namespace AssetStudio m_Avatar = new AvatarConstant(reader); int numTOS = reader.ReadInt32(); - m_TOS = new List>(numTOS); + m_TOS = new KeyValuePair[numTOS]; for (int i = 0; i < numTOS; i++) { - m_TOS.Add(new KeyValuePair(reader.ReadUInt32(), reader.ReadAlignedString())); + m_TOS[i] = new KeyValuePair(reader.ReadUInt32(), reader.ReadAlignedString()); } } @@ -318,7 +317,7 @@ namespace AssetStudio public string FindBonePath(uint hash) { - return m_TOS.Find(pair => pair.Key == hash).Value; + return m_TOS.FirstOrDefault(pair => pair.Key == hash).Value; } } } diff --git a/AssetStudio/Classes/GameObject.cs b/AssetStudio/Classes/GameObject.cs index 62fdc59..d129beb 100644 --- a/AssetStudio/Classes/GameObject.cs +++ b/AssetStudio/Classes/GameObject.cs @@ -7,7 +7,7 @@ namespace AssetStudio { public sealed class GameObject : EditorExtension { - public List> m_Components; + public PPtr[] m_Components; public string m_Name; public Transform m_Transform; @@ -20,18 +20,14 @@ namespace AssetStudio public GameObject(ObjectReader reader) : base(reader) { int m_Component_size = reader.ReadInt32(); - m_Components = new List>(m_Component_size); - for (int j = 0; j < m_Component_size; j++) + m_Components = new PPtr[m_Component_size]; + for (int i = 0; i < m_Component_size; i++) { - if ((version[0] == 5 && version[1] >= 5) || version[0] > 5) //5.5.0 and up - { - m_Components.Add(new PPtr(reader)); - } - else + if ((version[0] == 5 && version[1] < 5) || version[0] < 5) //5.5 down { int first = reader.ReadInt32(); - m_Components.Add(new PPtr(reader)); } + m_Components[i] = new PPtr(reader); } var m_Layer = reader.ReadInt32(); diff --git a/AssetStudio/Classes/Material.cs b/AssetStudio/Classes/Material.cs index 217acd5..a855b0a 100644 --- a/AssetStudio/Classes/Material.cs +++ b/AssetStudio/Classes/Material.cs @@ -19,31 +19,31 @@ namespace AssetStudio public class UnityPropertySheet { - public List> m_TexEnvs; - public List> m_Floats; - public List> m_Colors; + public KeyValuePair[] m_TexEnvs; + public KeyValuePair[] m_Floats; + public KeyValuePair[] m_Colors; public UnityPropertySheet(ObjectReader reader) { int m_TexEnvsSize = reader.ReadInt32(); - m_TexEnvs = new List>(m_TexEnvsSize); + m_TexEnvs = new KeyValuePair[m_TexEnvsSize]; for (int i = 0; i < m_TexEnvsSize; i++) { - m_TexEnvs.Add(new KeyValuePair(reader.ReadAlignedString(), new UnityTexEnv(reader))); + m_TexEnvs[i] = new KeyValuePair(reader.ReadAlignedString(), new UnityTexEnv(reader)); } int m_FloatsSize = reader.ReadInt32(); - m_Floats = new List>(m_FloatsSize); + m_Floats = new KeyValuePair[m_FloatsSize]; for (int i = 0; i < m_FloatsSize; i++) { - m_Floats.Add(new KeyValuePair(reader.ReadAlignedString(), reader.ReadSingle())); + m_Floats[i] = new KeyValuePair(reader.ReadAlignedString(), reader.ReadSingle()); } int m_ColorsSize = reader.ReadInt32(); - m_Colors = new List>(m_ColorsSize); + m_Colors = new KeyValuePair[m_ColorsSize]; for (int i = 0; i < m_ColorsSize; i++) { - m_Colors.Add(new KeyValuePair(reader.ReadAlignedString(), reader.ReadColor4())); + m_Colors[i] = new KeyValuePair(reader.ReadAlignedString(), reader.ReadColor4()); } } } diff --git a/AssetStudio/Classes/Mesh.cs b/AssetStudio/Classes/Mesh.cs index 606a8d0..3be8100 100644 --- a/AssetStudio/Classes/Mesh.cs +++ b/AssetStudio/Classes/Mesh.cs @@ -317,32 +317,32 @@ namespace AssetStudio public class BlendShapeData { - public List vertices; - public List shapes; - public List channels; + public BlendShapeVertex[] vertices; + public MeshBlendShape[] shapes; + public MeshBlendShapeChannel[] channels; public float[] fullWeights; public BlendShapeData(ObjectReader reader) { int numVerts = reader.ReadInt32(); - vertices = new List(numVerts); + vertices = new BlendShapeVertex[numVerts]; for (int i = 0; i < numVerts; i++) { - vertices.Add(new BlendShapeVertex(reader)); + vertices[i] = new BlendShapeVertex(reader); } int numShapes = reader.ReadInt32(); - shapes = new List(numShapes); + shapes = new MeshBlendShape[numShapes]; for (int i = 0; i < numShapes; i++) { - shapes.Add(new MeshBlendShape(reader)); + shapes[i] = new MeshBlendShape(reader); } int numChannels = reader.ReadInt32(); - channels = new List(numChannels); + channels = new MeshBlendShapeChannel[numChannels]; for (int i = 0; i < numChannels; i++) { - channels.Add(new MeshBlendShapeChannel(reader)); + channels[i] = new MeshBlendShapeChannel(reader); } fullWeights = reader.ReadSingleArray(); @@ -393,7 +393,7 @@ namespace AssetStudio public SubMesh[] m_SubMeshes; private uint[] m_IndexBuffer; public BlendShapeData m_Shapes; - public float[][,] m_BindPose; + public Matrix[] m_BindPose; public uint[] m_BoneNameHashes; public int m_VertexCount; public float[] m_Vertices; @@ -467,19 +467,8 @@ namespace AssetStudio else if (version[0] > 4 || (version[0] == 4 && version[1] >= 3)) //4.3.0 and later { m_Shapes = new BlendShapeData(reader); - - m_BindPose = new float[reader.ReadInt32()][,]; - for (int i = 0; i < m_BindPose.Length; i++) - { - m_BindPose[i] = new[,] { - { reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle() }, - { reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle() }, - { reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle() }, - { reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle() } }; - } - + m_BindPose = reader.ReadMatrixArray(); m_BoneNameHashes = reader.ReadUInt32Array(); - var m_RootBoneNameHash = reader.ReadUInt32(); } @@ -530,11 +519,7 @@ namespace AssetStudio if (version[0] < 3 || (version[0] == 3 && version[1] < 5)) //3.4.2 and earlier { m_VertexCount = reader.ReadInt32(); - m_Vertices = new float[m_VertexCount * 3]; - for (int v = 0; v < m_VertexCount * 3; v++) - { - m_Vertices[v] = reader.ReadSingle(); - } + m_Vertices = reader.ReadSingleArray(m_VertexCount * 3); //Vector3 m_Skin = new BoneWeights4[reader.ReadInt32()]; for (int s = 0; s < m_Skin.Length; s++) @@ -542,15 +527,7 @@ namespace AssetStudio m_Skin[s] = new BoneWeights4(reader); } - m_BindPose = new float[reader.ReadInt32()][,]; - for (int i = 0; i < m_BindPose.Length; i++) - { - m_BindPose[i] = new[,] { - { reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle() }, - { reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle() }, - { reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle() }, - { reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle() } }; - } + m_BindPose = reader.ReadMatrixArray(); m_UV0 = reader.ReadSingleArray(reader.ReadInt32() * 2); //Vector2 @@ -588,15 +565,7 @@ namespace AssetStudio if (version[0] == 3 || (version[0] == 4 && version[1] <= 2)) //4.2 and down { - m_BindPose = new float[reader.ReadInt32()][,]; - for (int i = 0; i < m_BindPose.Length; i++) - { - m_BindPose[i] = new[,] { - { reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle() }, - { reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle() }, - { reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle() }, - { reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle() } }; - } + m_BindPose = reader.ReadMatrixArray(); } m_VertexData = new VertexData(reader); @@ -858,11 +827,13 @@ namespace AssetStudio { if (m_CompressedMesh.m_BindPoses.m_NumItems > 0) { - m_BindPose = new float[m_CompressedMesh.m_BindPoses.m_NumItems / 16][,]; + m_BindPose = new Matrix[m_CompressedMesh.m_BindPoses.m_NumItems / 16]; var m_BindPoses_Unpacked = m_CompressedMesh.m_BindPoses.UnpackFloats(16, 4 * 16); + var buffer = new float[16]; for (int i = 0; i < m_BindPose.Length; i++) { - Array.Copy(m_BindPoses_Unpacked, i * 16, m_BindPose[i], 0, 16); + Array.Copy(m_BindPoses_Unpacked, i * 16, buffer, 0, 16); + m_BindPose[i] = new Matrix(buffer); } } } diff --git a/AssetStudio/Classes/Shader.cs b/AssetStudio/Classes/Shader.cs index 5cd3c6f..a07db99 100644 --- a/AssetStudio/Classes/Shader.cs +++ b/AssetStudio/Classes/Shader.cs @@ -6,8 +6,8 @@ namespace AssetStudio { public class StructParameter { - public List m_MatrixParams; - public List m_VectorParams; + public MatrixParameter[] m_MatrixParams; + public VectorParameter[] m_VectorParams; public StructParameter(BinaryReader reader) { @@ -17,17 +17,17 @@ namespace AssetStudio var m_StructSize = reader.ReadInt32(); int numVectorParams = reader.ReadInt32(); - m_VectorParams = new List(numVectorParams); + m_VectorParams = new VectorParameter[numVectorParams]; for (int i = 0; i < numVectorParams; i++) { - m_VectorParams.Add(new VectorParameter(reader)); + m_VectorParams[i] = new VectorParameter(reader); } int numMatrixParams = reader.ReadInt32(); - m_MatrixParams = new List(numMatrixParams); + m_MatrixParams = new MatrixParameter[numMatrixParams]; for (int i = 0; i < numMatrixParams; i++) { - m_MatrixParams.Add(new MatrixParameter(reader)); + m_MatrixParams[i] = new MatrixParameter(reader); } } } @@ -101,15 +101,15 @@ namespace AssetStudio public class SerializedProperties { - public List m_Props; + public SerializedProperty[] m_Props; public SerializedProperties(BinaryReader reader) { int numProps = reader.ReadInt32(); - m_Props = new List(numProps); + m_Props = new SerializedProperty[numProps]; for (int i = 0; i < numProps; i++) { - m_Props.Add(new SerializedProperty(reader)); + m_Props[i] = new SerializedProperty(reader); } } } @@ -285,16 +285,16 @@ namespace AssetStudio public class ParserBindChannels { - public List m_Channels; + public ShaderBindChannel[] m_Channels; public uint m_SourceMap; public ParserBindChannels(BinaryReader reader) { int numChannels = reader.ReadInt32(); - m_Channels = new List(numChannels); + m_Channels = new ShaderBindChannel[numChannels]; for (int i = 0; i < numChannels; i++) { - m_Channels.Add(new ShaderBindChannel(reader)); + m_Channels[i] = new ShaderBindChannel(reader); } reader.AlignStream(); @@ -378,9 +378,9 @@ namespace AssetStudio public class ConstantBuffer { public int m_NameIndex; - public List m_MatrixParams; - public List m_VectorParams; - public List m_StructParams; + public MatrixParameter[] m_MatrixParams; + public VectorParameter[] m_VectorParams; + public StructParameter[] m_StructParams; public int m_Size; public ConstantBuffer(ObjectReader reader) @@ -390,25 +390,25 @@ namespace AssetStudio m_NameIndex = reader.ReadInt32(); int numMatrixParams = reader.ReadInt32(); - m_MatrixParams = new List(numMatrixParams); + m_MatrixParams = new MatrixParameter[numMatrixParams]; for (int i = 0; i < numMatrixParams; i++) { - m_MatrixParams.Add(new MatrixParameter(reader)); + m_MatrixParams[i] = new MatrixParameter(reader); } int numVectorParams = reader.ReadInt32(); - m_VectorParams = new List(numVectorParams); + m_VectorParams = new VectorParameter[numVectorParams]; for (int i = 0; i < numVectorParams; i++) { - m_VectorParams.Add(new VectorParameter(reader)); + m_VectorParams[i] = new VectorParameter(reader); } if (version[0] > 2017 || (version[0] == 2017 && version[1] >= 3)) //2017.3 and up { int numStructParams = reader.ReadInt32(); - m_StructParams = new List(numStructParams); + m_StructParams = new StructParameter[numStructParams]; for (int i = 0; i < numStructParams; i++) { - m_StructParams.Add(new StructParameter(reader)); + m_StructParams[i] = new StructParameter(reader); } } m_Size = reader.ReadInt32(); @@ -467,14 +467,14 @@ namespace AssetStudio public ushort[] m_KeywordIndices; public sbyte m_ShaderHardwareTier; public ShaderGpuProgramType m_GpuProgramType; - public List m_VectorParams; - public List m_MatrixParams; - public List m_TextureParams; - public List m_BufferParams; - public List m_ConstantBuffers; - public List m_ConstantBufferBindings; - public List m_UAVParams; - public List m_Samplers; + public VectorParameter[] m_VectorParams; + public MatrixParameter[] m_MatrixParams; + public TextureParameter[] m_TextureParams; + public BufferBinding[] m_BufferParams; + public ConstantBuffer[] m_ConstantBuffers; + public BufferBinding[] m_ConstantBufferBindings; + public UAVParameter[] m_UAVParams; + public SamplerParameter[] m_Samplers; public SerializedSubProgram(ObjectReader reader) { @@ -493,61 +493,61 @@ namespace AssetStudio reader.AlignStream(); int numVectorParams = reader.ReadInt32(); - m_VectorParams = new List(numVectorParams); + m_VectorParams = new VectorParameter[numVectorParams]; for (int i = 0; i < numVectorParams; i++) { - m_VectorParams.Add(new VectorParameter(reader)); + m_VectorParams[i] = new VectorParameter(reader); } int numMatrixParams = reader.ReadInt32(); - m_MatrixParams = new List(numMatrixParams); + m_MatrixParams = new MatrixParameter[numMatrixParams]; for (int i = 0; i < numMatrixParams; i++) { - m_MatrixParams.Add(new MatrixParameter(reader)); + m_MatrixParams[i] = new MatrixParameter(reader); } int numTextureParams = reader.ReadInt32(); - m_TextureParams = new List(numTextureParams); + m_TextureParams = new TextureParameter[numTextureParams]; for (int i = 0; i < numTextureParams; i++) { - m_TextureParams.Add(new TextureParameter(reader)); + m_TextureParams[i] = new TextureParameter(reader); } int numBufferParams = reader.ReadInt32(); - m_BufferParams = new List(numBufferParams); + m_BufferParams = new BufferBinding[numBufferParams]; for (int i = 0; i < numBufferParams; i++) { - m_BufferParams.Add(new BufferBinding(reader)); + m_BufferParams[i] = new BufferBinding(reader); } int numConstantBuffers = reader.ReadInt32(); - m_ConstantBuffers = new List(numConstantBuffers); + m_ConstantBuffers = new ConstantBuffer[numConstantBuffers]; for (int i = 0; i < numConstantBuffers; i++) { - m_ConstantBuffers.Add(new ConstantBuffer(reader)); + m_ConstantBuffers[i] = new ConstantBuffer(reader); } int numConstantBufferBindings = reader.ReadInt32(); - m_ConstantBufferBindings = new List(numConstantBufferBindings); + m_ConstantBufferBindings = new BufferBinding[numConstantBufferBindings]; for (int i = 0; i < numConstantBufferBindings; i++) { - m_ConstantBufferBindings.Add(new BufferBinding(reader)); + m_ConstantBufferBindings[i] = new BufferBinding(reader); } int numUAVParams = reader.ReadInt32(); - m_UAVParams = new List(numUAVParams); + m_UAVParams = new UAVParameter[numUAVParams]; for (int i = 0; i < numUAVParams; i++) { - m_UAVParams.Add(new UAVParameter(reader)); + m_UAVParams[i] = new UAVParameter(reader); } if (version[0] >= 2017) //2017 and up { int numSamplers = reader.ReadInt32(); - m_Samplers = new List(numSamplers); + m_Samplers = new SamplerParameter[numSamplers]; for (int i = 0; i < numSamplers; i++) { - m_Samplers.Add(new SamplerParameter(reader)); + m_Samplers[i] = new SamplerParameter(reader); } } if (version[0] > 2017 || (version[0] == 2017 && version[1] >= 2)) //2017.2 and up @@ -559,15 +559,15 @@ namespace AssetStudio public class SerializedProgram { - public List m_SubPrograms; + public SerializedSubProgram[] m_SubPrograms; public SerializedProgram(ObjectReader reader) { int numSubPrograms = reader.ReadInt32(); - m_SubPrograms = new List(numSubPrograms); + m_SubPrograms = new SerializedSubProgram[numSubPrograms]; for (int i = 0; i < numSubPrograms; i++) { - m_SubPrograms.Add(new SerializedSubProgram(reader)); + m_SubPrograms[i] = new SerializedSubProgram(reader); } } } @@ -581,7 +581,7 @@ namespace AssetStudio public class SerializedPass { - public List> m_NameIndices; + public KeyValuePair[] m_NameIndices; public PassType m_Type; public SerializedShaderState m_State; public uint m_ProgramMask; @@ -601,10 +601,10 @@ namespace AssetStudio var version = reader.version; int numIndices = reader.ReadInt32(); - m_NameIndices = new List>(numIndices); + m_NameIndices = new KeyValuePair[numIndices]; for (int i = 0; i < numIndices; i++) { - m_NameIndices.Add(new KeyValuePair(reader.ReadAlignedString(), reader.ReadInt32())); + m_NameIndices[i] = new KeyValuePair(reader.ReadAlignedString(), reader.ReadInt32()); } m_Type = (PassType)reader.ReadInt32(); @@ -630,32 +630,32 @@ namespace AssetStudio public class SerializedTagMap { - public List> tags; + public KeyValuePair[] tags; public SerializedTagMap(BinaryReader reader) { int numTags = reader.ReadInt32(); - tags = new List>(numTags); + tags = new KeyValuePair[numTags]; for (int i = 0; i < numTags; i++) { - tags.Add(new KeyValuePair(reader.ReadAlignedString(), reader.ReadAlignedString())); + tags[i] = new KeyValuePair(reader.ReadAlignedString(), reader.ReadAlignedString()); } } } public class SerializedSubShader { - public List m_Passes; + public SerializedPass[] m_Passes; public SerializedTagMap m_Tags; public int m_LOD; public SerializedSubShader(ObjectReader reader) { int numPasses = reader.ReadInt32(); - m_Passes = new List(numPasses); + m_Passes = new SerializedPass[numPasses]; for (int i = 0; i < numPasses; i++) { - m_Passes.Add(new SerializedPass(reader)); + m_Passes[i] = new SerializedPass(reader); } m_Tags = new SerializedTagMap(reader); @@ -678,11 +678,11 @@ namespace AssetStudio public class SerializedShader { public SerializedProperties m_PropInfo; - public List m_SubShaders; + public SerializedSubShader[] m_SubShaders; public string m_Name; public string m_CustomEditorName; public string m_FallbackName; - public List m_Dependencies; + public SerializedShaderDependency[] m_Dependencies; public bool m_DisableNoSubshadersMessage; public SerializedShader(ObjectReader reader) @@ -690,10 +690,10 @@ namespace AssetStudio m_PropInfo = new SerializedProperties(reader); int numSubShaders = reader.ReadInt32(); - m_SubShaders = new List(numSubShaders); + m_SubShaders = new SerializedSubShader[numSubShaders]; for (int i = 0; i < numSubShaders; i++) { - m_SubShaders.Add(new SerializedSubShader(reader)); + m_SubShaders[i] = new SerializedSubShader(reader); } m_Name = reader.ReadAlignedString(); @@ -701,10 +701,10 @@ namespace AssetStudio m_FallbackName = reader.ReadAlignedString(); int numDependencies = reader.ReadInt32(); - m_Dependencies = new List(numDependencies); + m_Dependencies = new SerializedShaderDependency[numDependencies]; for (int i = 0; i < numDependencies; i++) { - m_Dependencies.Add(new SerializedShaderDependency(reader)); + m_Dependencies[i] = new SerializedShaderDependency(reader); } m_DisableNoSubshadersMessage = reader.ReadBoolean(); diff --git a/AssetStudio/Classes/Transform.cs b/AssetStudio/Classes/Transform.cs index 0f64f25..95050b5 100644 --- a/AssetStudio/Classes/Transform.cs +++ b/AssetStudio/Classes/Transform.cs @@ -8,22 +8,23 @@ namespace AssetStudio { public class Transform : Component { - public float[] m_LocalRotation; - public float[] m_LocalPosition; - public float[] m_LocalScale; - public List> m_Children; + public Quaternion m_LocalRotation; + public Vector3 m_LocalPosition; + public Vector3 m_LocalScale; + public PPtr[] m_Children; public PPtr m_Father; public Transform(ObjectReader reader) : base(reader) { - m_LocalRotation = new[] { reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle() }; - m_LocalPosition = new[] { reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle() }; - m_LocalScale = new[] { reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle() }; + m_LocalRotation = reader.ReadQuaternion(); + m_LocalPosition = reader.ReadVector3(); + m_LocalScale = reader.ReadVector3(); + int m_ChildrenCount = reader.ReadInt32(); - m_Children = new List>(m_ChildrenCount); - for (int j = 0; j < m_ChildrenCount; j++) + m_Children = new PPtr[m_ChildrenCount]; + for (int i = 0; i < m_ChildrenCount; i++) { - m_Children.Add(new PPtr(reader)); + m_Children[i] = new PPtr(reader); } m_Father = new PPtr(reader); } diff --git a/AssetStudio/IImported.cs b/AssetStudio/IImported.cs index 7cad52c..d124c1e 100644 --- a/AssetStudio/IImported.cs +++ b/AssetStudio/IImported.cs @@ -19,9 +19,9 @@ namespace AssetStudio public class ImportedFrame : IEnumerable { public string Name { get; set; } - public float[] LocalRotation { get; set; } - public float[] LocalPosition { get; set; } - public float[] LocalScale { get; set; } + public Vector3 LocalRotation { get; set; } + public Vector3 LocalPosition { get; set; } + public Vector3 LocalScale { get; set; } public ImportedFrame Parent { get; set; } private List children; @@ -30,9 +30,9 @@ namespace AssetStudio public int Count => children.Count; - public void InitChildren(int count) + public ImportedFrame(int childrenCount = 0) { - children = new List(count); + children = new List(childrenCount); } public void AddChild(ImportedFrame obj) @@ -95,7 +95,7 @@ namespace AssetStudio public class ImportedBone { public string Name { get; set; } - public float[,] Matrix { get; set; } + public Matrix Matrix { get; set; } } public class ImportedMaterial diff --git a/AssetStudioFBX/AssetStudioFBXExporter.cpp b/AssetStudioFBX/AssetStudioFBXExporter.cpp index cba3a12..bc0931d 100644 --- a/AssetStudioFBX/AssetStudioFBXExporter.cpp +++ b/AssetStudioFBX/AssetStudioFBXExporter.cpp @@ -288,9 +288,9 @@ namespace AssetStudio Marshal::FreeHGlobal((IntPtr)pName); } - pFrameNode->LclScaling.Set(FbxDouble3(frame->LocalScale[0], frame->LocalScale[1], frame->LocalScale[2])); - pFrameNode->LclRotation.Set(FbxDouble3(frame->LocalRotation[0], frame->LocalRotation[1], frame->LocalRotation[2])); - pFrameNode->LclTranslation.Set(FbxDouble3(frame->LocalPosition[0], frame->LocalPosition[1], frame->LocalPosition[2])); + pFrameNode->LclScaling.Set(FbxDouble3(frame->LocalScale.X, frame->LocalScale.Y, frame->LocalScale.Z)); + pFrameNode->LclRotation.Set(FbxDouble3(frame->LocalRotation.X, frame->LocalRotation.Y, frame->LocalRotation.Z)); + pFrameNode->LclTranslation.Set(FbxDouble3(frame->LocalPosition.X, frame->LocalPosition.Y, frame->LocalPosition.Z)); pParentNode->AddChild(pFrameNode); if (imported->MeshList != nullptr && ImportedHelpers::FindMesh(frame, imported->MeshList) != nullptr) @@ -545,11 +545,11 @@ namespace AssetStudio } array^ uv = vertex->UV; if (uv != nullptr) - lGeometryElementUV->GetDirectArray().Add(FbxVector2(uv[0], -uv[1])); + lGeometryElementUV->GetDirectArray().Add(FbxVector2(uv[0], uv[1])); if (normals) { Vector4 tangent = vertex->Tangent; - lGeometryElementTangent->GetDirectArray().Add(FbxVector4(tangent.X, tangent.Y, tangent.Z, -tangent.W)); + lGeometryElementTangent->GetDirectArray().Add(FbxVector4(tangent.X, tangent.Y, tangent.Z, tangent.W)); } if (hasBones && vertex->BoneIndices != nullptr) diff --git a/AssetStudioGUI/AssetStudioGUIForm.cs b/AssetStudioGUI/AssetStudioGUIForm.cs index b394255..0968bc7 100644 --- a/AssetStudioGUI/AssetStudioGUIForm.cs +++ b/AssetStudioGUI/AssetStudioGUIForm.cs @@ -277,7 +277,7 @@ namespace AssetStudioGUI if (e.Control) //Normal mode { normalMode = (normalMode + 1) % 2; - createVAO(); + CreateVAO(); glControl1.Invalidate(); } break; @@ -1060,7 +1060,7 @@ namespace AssetStudioGUI } #endregion glControl1.Visible = true; - createVAO(); + CreateVAO(); StatusStripUpdate("Using OpenGL Version: " + GL.GetString(StringName.Version) + "\n" + "'Mouse Left'=Rotate | 'Mouse Right'=Move | 'Mouse Wheel'=Zoom \n" + "'Ctrl W'=Wireframe | 'Ctrl S'=Shade | 'Ctrl N'=ReNormal "); @@ -1446,23 +1446,23 @@ namespace AssetStudioGUI Progress.Default = new GUIProgress(SetProgressBarValue); } - private void initOpenTK() + private void InitOpenTK() { - changeGLSize(glControl1.Size); + ChangeGLSize(glControl1.Size); GL.ClearColor(Color.CadetBlue); pgmID = GL.CreateProgram(); - loadShader("vs", ShaderType.VertexShader, pgmID, out int vsID); - loadShader("fs", ShaderType.FragmentShader, pgmID, out int fsID); + LoadShader("vs", ShaderType.VertexShader, pgmID, out int vsID); + LoadShader("fs", ShaderType.FragmentShader, pgmID, out int fsID); GL.LinkProgram(pgmID); pgmColorID = GL.CreateProgram(); - loadShader("vs", ShaderType.VertexShader, pgmColorID, out vsID); - loadShader("fsColor", ShaderType.FragmentShader, pgmColorID, out fsID); + LoadShader("vs", ShaderType.VertexShader, pgmColorID, out vsID); + LoadShader("fsColor", ShaderType.FragmentShader, pgmColorID, out fsID); GL.LinkProgram(pgmColorID); pgmBlackID = GL.CreateProgram(); - loadShader("vs", ShaderType.VertexShader, pgmBlackID, out vsID); - loadShader("fsBlack", ShaderType.FragmentShader, pgmBlackID, out fsID); + LoadShader("vs", ShaderType.VertexShader, pgmBlackID, out vsID); + LoadShader("fsBlack", ShaderType.FragmentShader, pgmBlackID, out fsID); GL.LinkProgram(pgmBlackID); attributeVertexPosition = GL.GetAttribLocation(pgmID, "vertexPosition"); @@ -1473,7 +1473,7 @@ namespace AssetStudioGUI uniformProjMatrix = GL.GetUniformLocation(pgmID, "projMatrix"); } - private void loadShader(string filename, ShaderType type, int program, out int address) + private static void LoadShader(string filename, ShaderType type, int program, out int address) { address = GL.CreateShader(type); var str = (string)Properties.Resources.ResourceManager.GetObject(filename); @@ -1483,7 +1483,7 @@ namespace AssetStudioGUI GL.DeleteShader(address); } - private void createVBO(out int vboAddress, Vector3[] data, int address) + private static void CreateVBO(out int vboAddress, Vector3[] data, int address) { GL.GenBuffers(1, out vboAddress); GL.BindBuffer(BufferTarget.ArrayBuffer, vboAddress); @@ -1495,7 +1495,7 @@ namespace AssetStudioGUI GL.EnableVertexAttribArray(address); } - private void createVBO(out int vboAddress, Vector4[] data, int address) + private static void CreateVBO(out int vboAddress, Vector4[] data, int address) { GL.GenBuffers(1, out vboAddress); GL.BindBuffer(BufferTarget.ArrayBuffer, vboAddress); @@ -1507,13 +1507,13 @@ namespace AssetStudioGUI GL.EnableVertexAttribArray(address); } - private void createVBO(out int vboAddress, Matrix4 data, int address) + private static void CreateVBO(out int vboAddress, Matrix4 data, int address) { GL.GenBuffers(1, out vboAddress); GL.UniformMatrix4(address, false, ref data); } - private void createEBO(out int address, int[] data) + private static void CreateEBO(out int address, int[] data) { GL.GenBuffers(1, out address); GL.BindBuffer(BufferTarget.ElementArrayBuffer, address); @@ -1523,31 +1523,31 @@ namespace AssetStudioGUI BufferUsageHint.StaticDraw); } - private void createVAO() + private void CreateVAO() { GL.DeleteVertexArray(vao); GL.GenVertexArrays(1, out vao); GL.BindVertexArray(vao); - createVBO(out var vboPositions, vertexData, attributeVertexPosition); + CreateVBO(out var vboPositions, vertexData, attributeVertexPosition); if (normalMode == 0) { - createVBO(out var vboNormals, normal2Data, attributeNormalDirection); + CreateVBO(out var vboNormals, normal2Data, attributeNormalDirection); } else { if (normalData != null) - createVBO(out var vboNormals, normalData, attributeNormalDirection); + CreateVBO(out var vboNormals, normalData, attributeNormalDirection); } - createVBO(out var vboColors, colorData, attributeVertexColor); - createVBO(out var vboModelMatrix, modelMatrixData, uniformModelMatrix); - createVBO(out var vboViewMatrix, viewMatrixData, uniformViewMatrix); - createVBO(out var vboProjMatrix, projMatrixData, uniformProjMatrix); - createEBO(out var eboElements, indiceData); + CreateVBO(out var vboColors, colorData, attributeVertexColor); + CreateVBO(out var vboModelMatrix, modelMatrixData, uniformModelMatrix); + CreateVBO(out var vboViewMatrix, viewMatrixData, uniformViewMatrix); + CreateVBO(out var vboProjMatrix, projMatrixData, uniformProjMatrix); + CreateEBO(out var eboElements, indiceData); GL.BindBuffer(BufferTarget.ArrayBuffer, 0); GL.BindVertexArray(0); } - private void changeGLSize(Size size) + private void ChangeGLSize(Size size) { GL.Viewport(0, 0, size.Width, size.Height); @@ -1567,14 +1567,14 @@ namespace AssetStudioGUI { if (glControlLoaded && glControl1.Visible) { - changeGLSize(glControl1.Size); + ChangeGLSize(glControl1.Size); glControl1.Invalidate(); } } private void glControl1_Load(object sender, EventArgs e) { - initOpenTK(); + InitOpenTK(); glControlLoaded = true; } diff --git a/AssetStudioGUI/Studio.cs b/AssetStudioGUI/Studio.cs index 49dfa7c..c2fc32a 100644 --- a/AssetStudioGUI/Studio.cs +++ b/AssetStudioGUI/Studio.cs @@ -201,7 +201,7 @@ namespace AssetStudioGUI { foreach (var item in tempExportableAssets) { - var originalPath = ab.m_Container.Find(y => y.Value.asset.m_PathID == item.Asset.m_PathID).Key; + var originalPath = ab.m_Container.FirstOrDefault(y => y.Value.asset.m_PathID == item.Asset.m_PathID).Key; if (!string.IsNullOrEmpty(originalPath)) { var extension = Path.GetExtension(originalPath); diff --git a/AssetStudioUtility/ModelConverter.cs b/AssetStudioUtility/ModelConverter.cs index 26aafd2..5dcc71d 100644 --- a/AssetStudioUtility/ModelConverter.cs +++ b/AssetStudioUtility/ModelConverter.cs @@ -81,7 +81,7 @@ namespace AssetStudio var m_Transform = m_GameObject.m_Transform; if (!hasTransformHierarchy) { - ConvertFrames(m_Transform, null); + ConvertTransforms(m_Transform, null); DeoptimizeTransformHierarchy(); } else @@ -90,7 +90,7 @@ namespace AssetStudio var tempTransform = m_Transform; while (tempTransform.m_Father.TryGet(out var m_Father)) { - frameList.Add(ConvertFrame(m_Father)); + frameList.Add(ConvertTransform(m_Father)); tempTransform = m_Father; } if (frameList.Count > 0) @@ -102,11 +102,11 @@ namespace AssetStudio var parent = frameList[i + 1]; parent.AddChild(frame); } - ConvertFrames(m_Transform, frameList[0]); + ConvertTransforms(m_Transform, frameList[0]); } else { - ConvertFrames(m_Transform, null); + ConvertTransforms(m_Transform, null); } CreateBonePathHash(m_Transform); @@ -183,39 +183,33 @@ namespace AssetStudio } } - private ImportedFrame ConvertFrame(Transform trans) + private static ImportedFrame ConvertTransform(Transform trans) { - var frame = new ImportedFrame(); + var frame = new ImportedFrame(trans.m_Children.Length); trans.m_GameObject.TryGet(out var m_GameObject); frame.Name = m_GameObject.m_Name; - frame.InitChildren(trans.m_Children.Count); - var m_EulerRotation = QuatToEuler(new[] { trans.m_LocalRotation[0], -trans.m_LocalRotation[1], -trans.m_LocalRotation[2], trans.m_LocalRotation[3] }); - frame.LocalRotation = new[] { m_EulerRotation[0], m_EulerRotation[1], m_EulerRotation[2] }; - frame.LocalScale = new[] { trans.m_LocalScale[0], trans.m_LocalScale[1], trans.m_LocalScale[2] }; - frame.LocalPosition = new[] { -trans.m_LocalPosition[0], trans.m_LocalPosition[1], trans.m_LocalPosition[2] }; + SetFrame(frame, trans.m_LocalPosition, trans.m_LocalRotation, trans.m_LocalScale); return frame; } - private ImportedFrame ConvertFrame(Vector3 t, Quaternion q, Vector3 s, string name) + private static ImportedFrame CreateFrame(string name, Vector3 t, Quaternion q, Vector3 s) { var frame = new ImportedFrame(); frame.Name = name; - frame.InitChildren(0); SetFrame(frame, t, q, s); return frame; } - private void SetFrame(ImportedFrame frame, Vector3 t, Quaternion q, Vector3 s) + private static 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 }; + frame.LocalPosition = new Vector3(-t.X, t.Y, t.Z); + frame.LocalRotation = Fbx.QuaternionToEuler(new Quaternion(q.X, -q.Y, -q.Z, q.W)); + frame.LocalScale = s; } - private void ConvertFrames(Transform trans, ImportedFrame parent) + private void ConvertTransforms(Transform trans, ImportedFrame parent) { - var frame = ConvertFrame(trans); + var frame = ConvertTransform(trans); if (parent == null) { RootFrame = frame; @@ -227,7 +221,7 @@ namespace AssetStudio foreach (var pptr in trans.m_Children) { if (pptr.TryGet(out var child)) - ConvertFrames(child, frame); + ConvertTransforms(child, frame); } } @@ -323,16 +317,16 @@ namespace AssetStudio //UV if (mesh.m_UV0 != null && mesh.m_UV0.Length == mesh.m_VertexCount * 2) { - iVertex.UV = new[] { mesh.m_UV0[j * 2], -mesh.m_UV0[j * 2 + 1] }; + iVertex.UV = new[] { mesh.m_UV0[j * 2], mesh.m_UV0[j * 2 + 1] }; } else if (mesh.m_UV1 != null && mesh.m_UV1.Length == mesh.m_VertexCount * 2) { - iVertex.UV = new[] { mesh.m_UV1[j * 2], -mesh.m_UV1[j * 2 + 1] }; + iVertex.UV = new[] { mesh.m_UV1[j * 2], mesh.m_UV1[j * 2 + 1] }; } //Tangent if (mesh.m_Tangents != null && mesh.m_Tangents.Length == mesh.m_VertexCount * 4) { - iVertex.Tangent = new Vector4(-mesh.m_Tangents[j * 4], mesh.m_Tangents[j * 4 + 1], mesh.m_Tangents[j * 4 + 2], mesh.m_Tangents[j * 4 + 3]); + iVertex.Tangent = new Vector4(-mesh.m_Tangents[j * 4], mesh.m_Tangents[j * 4 + 1], mesh.m_Tangents[j * 4 + 2], -mesh.m_Tangents[j * 4 + 3]); } //BoneInfluence if (mesh.m_Skin?.Length > 0) @@ -382,25 +376,8 @@ namespace AssetStudio //throw new Exception("A Bone could neither be found by hash in Avatar nor by index in SkinnedMeshRenderer."); continue; } - var om = new float[4, 4]; - var m = mesh.m_BindPose[i]; - om[0, 0] = m[0, 0]; - om[0, 1] = -m[1, 0]; - om[0, 2] = -m[2, 0]; - om[0, 3] = m[3, 0]; - om[1, 0] = -m[0, 1]; - om[1, 1] = m[1, 1]; - om[1, 2] = m[2, 1]; - om[1, 3] = m[3, 1]; - om[2, 0] = -m[0, 2]; - om[2, 1] = m[1, 2]; - om[2, 2] = m[2, 2]; - om[2, 3] = m[3, 2]; - om[3, 0] = -m[0, 3]; - om[3, 1] = m[1, 3]; - om[3, 2] = m[2, 3]; - om[3, 3] = m[3, 3]; - bone.Matrix = om; + var convert = Matrix.Scaling(new Vector3(-1, 1, 1)); + bone.Matrix = convert * Matrix.Transpose(mesh.m_BindPose[i]) * convert; iMesh.BoneList.Add(bone); } } @@ -434,25 +411,8 @@ namespace AssetStudio continue; } } - var om = new float[4, 4]; - var m = mesh.m_BindPose[i]; - om[0, 0] = m[0, 0]; - om[0, 1] = -m[1, 0]; - om[0, 2] = -m[2, 0]; - om[0, 3] = m[3, 0]; - om[1, 0] = -m[0, 1]; - om[1, 1] = m[1, 1]; - om[1, 2] = m[2, 1]; - om[1, 3] = m[3, 1]; - om[2, 0] = -m[0, 2]; - om[2, 1] = m[1, 2]; - om[2, 2] = m[2, 2]; - om[2, 3] = m[3, 2]; - om[3, 0] = -m[0, 3]; - om[3, 1] = m[1, 3]; - om[3, 2] = m[2, 3]; - om[3, 3] = m[3, 3]; - bone.Matrix = om; + var convert = Matrix.Scaling(new Vector3(-1, 1, 1)); + bone.Matrix = convert * Matrix.Transpose(mesh.m_BindPose[i]) * convert; iMesh.BoneList.Add(bone); } } @@ -464,11 +424,11 @@ namespace AssetStudio { morphChannelInfo[channel.nameHash] = channel.name; } - if (mesh.m_Shapes.shapes.Count > 0) + if (mesh.m_Shapes.shapes.Length > 0) { ImportedMorph morph = null; string lastGroup = ""; - for (int i = 0; i < mesh.m_Shapes.channels.Count; i++) + for (int i = 0; i < mesh.m_Shapes.channels.Length; i++) { string group = BlendShapeNameGroup(mesh, i); if (group != lastGroup) @@ -477,8 +437,8 @@ namespace AssetStudio 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); + morph.Channels = new List>(mesh.m_Shapes.channels.Length); + morph.KeyframeList = new List(mesh.m_Shapes.shapes.Length); lastGroup = group; } @@ -535,7 +495,7 @@ namespace AssetStudio MeshList.Add(iMesh); } - private Mesh GetMesh(Renderer meshR) + private static Mesh GetMesh(Renderer meshR) { if (meshR is SkinnedMeshRenderer sMesh) { @@ -573,7 +533,7 @@ namespace AssetStudio return path; } - private string GetTransformPath(Transform transform) + private static string GetTransformPath(Transform transform) { transform.m_GameObject.TryGet(out var m_GameObject); if (transform.m_Father.TryGet(out var father)) @@ -817,7 +777,7 @@ namespace AssetStudio { var frame = streamedFrames[frameIndex]; var streamedValues = frame.keyList.Select(x => x.value).ToArray(); - for (int curveIndex = 0; curveIndex < frame.keyList.Count;) + for (int curveIndex = 0; curveIndex < frame.keyList.Length;) { ReadCurveData(iAnim, m_ClipBindingConstant, frame.keyList[curveIndex].index, frame.time, streamedValues, 0, ref curveIndex); } @@ -1036,52 +996,10 @@ namespace AssetStudio } else { - frame = ConvertFrame(xform.t, xform.q, xform.s, transformName); + frame = CreateFrame(transformName, xform.t, xform.q, xform.s); parentFrame.AddChild(frame); } } } - - private static float[] QuatToEuler(float[] q) - { - double eax = 0; - double eay = 0; - double eaz = 0; - - float qx = q[0]; - float qy = q[1]; - float qz = q[2]; - float qw = q[3]; - - double[,] M = new double[4, 4]; - - double Nq = qx * qx + qy * qy + qz * qz + qw * qw; - double s = (Nq > 0.0) ? (2.0 / Nq) : 0.0; - double xs = qx * s, ys = qy * s, zs = qz * s; - double wx = qw * xs, wy = qw * ys, wz = qw * zs; - double xx = qx * xs, xy = qx * ys, xz = qx * zs; - double yy = qy * ys, yz = qy * zs, zz = qz * zs; - - M[0, 0] = 1.0 - (yy + zz); M[0, 1] = xy - wz; M[0, 2] = xz + wy; - M[1, 0] = xy + wz; M[1, 1] = 1.0 - (xx + zz); M[1, 2] = yz - wx; - M[2, 0] = xz - wy; M[2, 1] = yz + wx; M[2, 2] = 1.0 - (xx + yy); - M[3, 0] = M[3, 1] = M[3, 2] = M[0, 3] = M[1, 3] = M[2, 3] = 0.0; M[3, 3] = 1.0; - - double test = Math.Sqrt(M[0, 0] * M[0, 0] + M[1, 0] * M[1, 0]); - if (test > 16 * 1.19209290E-07F)//FLT_EPSILON - { - eax = Math.Atan2(M[2, 1], M[2, 2]); - eay = Math.Atan2(-M[2, 0], test); - eaz = Math.Atan2(M[1, 0], M[0, 0]); - } - else - { - eax = Math.Atan2(-M[1, 2], M[1, 1]); - eay = Math.Atan2(-M[2, 0], test); - eaz = 0; - } - - return new[] { (float)(eax * 180 / Math.PI), (float)(eay * 180 / Math.PI), (float)(eaz * 180 / Math.PI) }; - } } }