AssetStudio/AssetStudio/Classes/Avatar.cs

313 lines
9.1 KiB
C#
Raw Normal View History

2019-01-03 00:55:43 +00:00
using System.Collections.Generic;
2018-12-09 03:56:24 +00:00
using System.Linq;
2018-04-06 15:57:36 +00:00
namespace AssetStudio
{
2018-09-09 06:26:34 +00:00
public class Node
2018-04-06 15:57:36 +00:00
{
2018-11-14 13:16:17 +00:00
public int m_ParentId;
public int m_AxesId;
2018-04-06 15:57:36 +00:00
2018-11-07 21:00:53 +00:00
public Node(ObjectReader reader)
2018-04-06 15:57:36 +00:00
{
2018-09-09 06:26:34 +00:00
m_ParentId = reader.ReadInt32();
m_AxesId = reader.ReadInt32();
}
}
2018-04-06 15:57:36 +00:00
2018-09-09 06:26:34 +00:00
public class Limit
{
2018-11-14 13:16:17 +00:00
public object m_Min;
public object m_Max;
2018-09-09 06:26:34 +00:00
2018-11-07 21:00:53 +00:00
public Limit(ObjectReader reader)
2018-09-09 06:26:34 +00:00
{
2018-11-07 21:00:53 +00:00
var version = reader.version;
2018-09-09 06:26:34 +00:00
if (version[0] > 5 || (version[0] == 5 && version[1] >= 4))//5.4 and up
2018-04-06 15:57:36 +00:00
{
2018-09-09 06:26:34 +00:00
m_Min = reader.ReadVector3();
m_Max = reader.ReadVector3();
2018-04-06 15:57:36 +00:00
}
2018-09-09 06:26:34 +00:00
else
2018-04-06 15:57:36 +00:00
{
2018-09-09 06:26:34 +00:00
m_Min = reader.ReadVector4();
m_Max = reader.ReadVector4();
2018-04-06 15:57:36 +00:00
}
2018-09-09 06:26:34 +00:00
}
}
public class Axes
{
2018-11-14 13:16:17 +00:00
public Vector4 m_PreQ;
public Vector4 m_PostQ;
public object m_Sgn;
public Limit m_Limit;
public float m_Length;
public uint m_Type;
2018-09-09 06:26:34 +00:00
2018-11-07 21:00:53 +00:00
public Axes(ObjectReader reader)
2018-09-09 06:26:34 +00:00
{
2018-11-07 21:00:53 +00:00
var version = reader.version;
2018-09-09 06:26:34 +00:00
m_PreQ = reader.ReadVector4();
m_PostQ = reader.ReadVector4();
if (version[0] > 5 || (version[0] == 5 && version[1] >= 4)) //5.4 and up
2018-04-06 15:57:36 +00:00
{
2018-09-09 06:26:34 +00:00
m_Sgn = reader.ReadVector3();
2018-04-06 15:57:36 +00:00
}
2018-09-09 06:26:34 +00:00
else
2018-04-06 15:57:36 +00:00
{
2018-09-09 06:26:34 +00:00
m_Sgn = reader.ReadVector4();
2018-04-06 15:57:36 +00:00
}
2018-11-07 21:00:53 +00:00
m_Limit = new Limit(reader);
2018-09-09 06:26:34 +00:00
m_Length = reader.ReadSingle();
m_Type = reader.ReadUInt32();
}
}
public class Skeleton
{
2018-12-09 03:56:24 +00:00
public Node[] m_Node;
2018-12-02 18:42:07 +00:00
public uint[] m_ID;
2018-12-09 03:56:24 +00:00
public Axes[] m_AxesArray;
2018-09-09 06:26:34 +00:00
2018-11-07 21:00:53 +00:00
public Skeleton(ObjectReader reader)
2018-09-09 06:26:34 +00:00
{
int numNodes = reader.ReadInt32();
2018-12-09 03:56:24 +00:00
m_Node = new Node[numNodes];
2018-04-06 15:57:36 +00:00
for (int i = 0; i < numNodes; i++)
{
2018-12-09 03:56:24 +00:00
m_Node[i] = new Node(reader);
2018-04-06 15:57:36 +00:00
}
2018-09-09 06:26:34 +00:00
2018-12-02 18:42:07 +00:00
m_ID = reader.ReadUInt32Array();
2018-09-09 06:26:34 +00:00
int numAxes = reader.ReadInt32();
2018-12-09 03:56:24 +00:00
m_AxesArray = new Axes[numAxes];
2018-04-06 15:57:36 +00:00
for (int i = 0; i < numAxes; i++)
{
2018-12-09 03:56:24 +00:00
m_AxesArray[i] = new Axes(reader);
2018-04-06 15:57:36 +00:00
}
2018-09-09 06:26:34 +00:00
}
}
public class SkeletonPose
{
2018-12-09 03:56:24 +00:00
public xform[] m_X;
2018-09-09 06:26:34 +00:00
2018-11-07 21:00:53 +00:00
public SkeletonPose(ObjectReader reader)
2018-09-09 06:26:34 +00:00
{
int numXforms = reader.ReadInt32();
2018-12-09 03:56:24 +00:00
m_X = new xform[numXforms];
2018-04-06 15:57:36 +00:00
for (int i = 0; i < numXforms; i++)
{
2018-12-09 03:56:24 +00:00
m_X[i] = new xform(reader);
2018-04-06 15:57:36 +00:00
}
2018-09-09 06:26:34 +00:00
}
}
public class Hand
{
2018-12-02 18:42:07 +00:00
public int[] m_HandBoneIndex;
2018-09-09 06:26:34 +00:00
2018-11-07 21:00:53 +00:00
public Hand(ObjectReader reader)
2018-09-09 06:26:34 +00:00
{
2018-12-02 18:42:07 +00:00
m_HandBoneIndex = reader.ReadInt32Array();
2018-09-09 06:26:34 +00:00
}
}
public class Handle
{
2018-11-14 13:16:17 +00:00
public xform m_X;
public uint m_ParentHumanIndex;
public uint m_ID;
2018-09-09 06:26:34 +00:00
2018-11-07 21:00:53 +00:00
public Handle(ObjectReader reader)
2018-09-09 06:26:34 +00:00
{
2018-11-07 21:00:53 +00:00
m_X = new xform(reader);
2018-09-09 06:26:34 +00:00
m_ParentHumanIndex = reader.ReadUInt32();
m_ID = reader.ReadUInt32();
}
}
public class Collider
{
2018-11-14 13:16:17 +00:00
public xform m_X;
public uint m_Type;
public uint m_XMotionType;
public uint m_YMotionType;
public uint m_ZMotionType;
public float m_MinLimitX;
public float m_MaxLimitX;
public float m_MaxLimitY;
public float m_MaxLimitZ;
2018-09-09 06:26:34 +00:00
2018-11-07 21:00:53 +00:00
public Collider(ObjectReader reader)
2018-09-09 06:26:34 +00:00
{
2018-11-07 21:00:53 +00:00
m_X = new xform(reader);
2018-09-09 06:26:34 +00:00
m_Type = reader.ReadUInt32();
m_XMotionType = reader.ReadUInt32();
m_YMotionType = reader.ReadUInt32();
m_ZMotionType = reader.ReadUInt32();
m_MinLimitX = reader.ReadSingle();
m_MaxLimitX = reader.ReadSingle();
m_MaxLimitY = reader.ReadSingle();
m_MaxLimitZ = reader.ReadSingle();
}
}
public class Human
{
2018-11-14 13:16:17 +00:00
public xform m_RootX;
public Skeleton m_Skeleton;
public SkeletonPose m_SkeletonPose;
public Hand m_LeftHand;
public Hand m_RightHand;
2018-12-09 03:56:24 +00:00
public Handle[] m_Handles;
public Collider[] m_ColliderArray;
2018-12-02 18:42:07 +00:00
public int[] m_HumanBoneIndex;
public float[] m_HumanBoneMass;
public int[] m_ColliderIndex;
2018-11-14 13:16:17 +00:00
public float m_Scale;
public float m_ArmTwist;
public float m_ForeArmTwist;
public float m_UpperLegTwist;
public float m_LegTwist;
public float m_ArmStretch;
public float m_LegStretch;
public float m_FeetSpacing;
public bool m_HasLeftHand;
public bool m_HasRightHand;
public bool m_HasTDoF;
2018-09-09 06:26:34 +00:00
2018-11-07 21:00:53 +00:00
public Human(ObjectReader reader)
2018-09-09 06:26:34 +00:00
{
2018-11-07 21:00:53 +00:00
var version = reader.version;
m_RootX = new xform(reader);
m_Skeleton = new Skeleton(reader);
m_SkeletonPose = new SkeletonPose(reader);
2018-09-09 06:26:34 +00:00
m_LeftHand = new Hand(reader);
m_RightHand = new Hand(reader);
2018-07-12 16:54:38 +00:00
if (version[0] < 2018 || (version[0] == 2018 && version[1] < 2)) //2018.2 down
2018-04-06 15:57:36 +00:00
{
2018-07-12 16:54:38 +00:00
int numHandles = reader.ReadInt32();
2018-12-09 03:56:24 +00:00
m_Handles = new Handle[numHandles];
2018-07-12 16:54:38 +00:00
for (int i = 0; i < numHandles; i++)
{
2018-12-09 03:56:24 +00:00
m_Handles[i] = new Handle(reader);
2018-07-12 16:54:38 +00:00
}
2018-09-09 06:26:34 +00:00
2018-07-12 16:54:38 +00:00
int numColliders = reader.ReadInt32();
2018-12-09 03:56:24 +00:00
m_ColliderArray = new Collider[numColliders];
2018-07-12 16:54:38 +00:00
for (int i = 0; i < numColliders; i++)
{
2018-12-09 03:56:24 +00:00
m_ColliderArray[i] = new Collider(reader);
2018-07-12 16:54:38 +00:00
}
2018-04-06 15:57:36 +00:00
}
2018-09-09 06:26:34 +00:00
2018-12-02 18:42:07 +00:00
m_HumanBoneIndex = reader.ReadInt32Array();
2018-09-09 06:26:34 +00:00
2018-12-02 18:42:07 +00:00
m_HumanBoneMass = reader.ReadSingleArray();
2018-09-09 06:26:34 +00:00
2018-07-12 16:54:38 +00:00
if (version[0] < 2018 || (version[0] == 2018 && version[1] < 2)) //2018.2 down
2018-04-06 15:57:36 +00:00
{
2018-12-02 18:42:07 +00:00
m_ColliderIndex = reader.ReadInt32Array();
2018-04-06 15:57:36 +00:00
}
2018-09-09 06:26:34 +00:00
m_Scale = reader.ReadSingle();
m_ArmTwist = reader.ReadSingle();
m_ForeArmTwist = reader.ReadSingle();
m_UpperLegTwist = reader.ReadSingle();
m_LegTwist = reader.ReadSingle();
m_ArmStretch = reader.ReadSingle();
m_LegStretch = reader.ReadSingle();
m_FeetSpacing = reader.ReadSingle();
m_HasLeftHand = reader.ReadBoolean();
m_HasRightHand = reader.ReadBoolean();
2018-12-09 03:56:24 +00:00
if (version[0] > 5 || (version[0] == 5 && version[1] >= 2)) //5.2 and up
{
m_HasTDoF = reader.ReadBoolean();
}
2018-12-02 18:42:07 +00:00
reader.AlignStream();
2018-09-09 06:26:34 +00:00
}
}
public class AvatarConstant
{
2018-11-14 13:16:17 +00:00
public Skeleton m_AvatarSkeleton;
public SkeletonPose m_AvatarSkeletonPose;
public SkeletonPose m_DefaultPose;
2018-12-02 18:42:07 +00:00
public uint[] m_SkeletonNameIDArray;
2018-11-14 13:16:17 +00:00
public Human m_Human;
2018-12-02 18:42:07 +00:00
public int[] m_HumanSkeletonIndexArray;
public int[] m_HumanSkeletonReverseIndexArray;
2018-11-14 13:16:17 +00:00
public int m_RootMotionBoneIndex;
public xform m_RootMotionBoneX;
public Skeleton m_RootMotionSkeleton;
public SkeletonPose m_RootMotionSkeletonPose;
2018-12-02 18:42:07 +00:00
public int[] m_RootMotionSkeletonIndexArray;
2018-09-09 06:26:34 +00:00
2018-11-07 21:00:53 +00:00
public AvatarConstant(ObjectReader reader)
2018-09-09 06:26:34 +00:00
{
2018-11-07 21:00:53 +00:00
var version = reader.version;
m_AvatarSkeleton = new Skeleton(reader);
m_AvatarSkeletonPose = new SkeletonPose(reader);
2018-09-09 06:26:34 +00:00
if (version[0] > 4 || (version[0] == 4 && version[1] >= 3)) //4.3 and up
{
2018-11-07 21:00:53 +00:00
m_DefaultPose = new SkeletonPose(reader);
2018-12-02 18:42:07 +00:00
m_SkeletonNameIDArray = reader.ReadUInt32Array();
2018-09-09 06:26:34 +00:00
}
2018-11-07 21:00:53 +00:00
m_Human = new Human(reader);
2018-09-09 06:26:34 +00:00
2018-12-02 18:42:07 +00:00
m_HumanSkeletonIndexArray = reader.ReadInt32Array();
2018-09-09 06:26:34 +00:00
2018-05-04 17:32:55 +00:00
if (version[0] > 4 || (version[0] == 4 && version[1] >= 3)) //4.3 and up
2018-04-06 15:57:36 +00:00
{
2018-12-02 18:42:07 +00:00
m_HumanSkeletonReverseIndexArray = reader.ReadInt32Array();
2018-04-06 15:57:36 +00:00
}
2018-09-09 06:26:34 +00:00
m_RootMotionBoneIndex = reader.ReadInt32();
2018-11-07 21:00:53 +00:00
m_RootMotionBoneX = new xform(reader);
2018-09-09 06:26:34 +00:00
2018-05-04 17:32:55 +00:00
if (version[0] > 4 || (version[0] == 4 && version[1] >= 3)) //4.3 and up
2018-04-06 15:57:36 +00:00
{
2018-11-07 21:00:53 +00:00
m_RootMotionSkeleton = new Skeleton(reader);
m_RootMotionSkeletonPose = new SkeletonPose(reader);
2018-09-09 06:26:34 +00:00
2018-12-02 18:42:07 +00:00
m_RootMotionSkeletonIndexArray = reader.ReadInt32Array();
2018-04-06 15:57:36 +00:00
}
2018-09-09 06:26:34 +00:00
}
}
2018-09-26 17:15:37 +00:00
public sealed class Avatar : NamedObject
2018-09-09 06:26:34 +00:00
{
2018-11-14 13:16:17 +00:00
public uint m_AvatarSize;
public AvatarConstant m_Avatar;
2018-12-09 03:56:24 +00:00
public KeyValuePair<uint, string>[] m_TOS;
2018-09-09 06:26:34 +00:00
2018-11-07 21:00:53 +00:00
public Avatar(ObjectReader reader) : base(reader)
2018-09-09 06:26:34 +00:00
{
m_AvatarSize = reader.ReadUInt32();
2018-11-07 21:00:53 +00:00
m_Avatar = new AvatarConstant(reader);
2018-09-09 06:26:34 +00:00
2018-04-06 15:57:36 +00:00
int numTOS = reader.ReadInt32();
2018-12-09 03:56:24 +00:00
m_TOS = new KeyValuePair<uint, string>[numTOS];
2018-04-06 15:57:36 +00:00
for (int i = 0; i < numTOS; i++)
{
2018-12-09 03:56:24 +00:00
m_TOS[i] = new KeyValuePair<uint, string>(reader.ReadUInt32(), reader.ReadAlignedString());
2018-04-06 15:57:36 +00:00
}
2019-04-18 02:46:06 +00:00
//HumanDescription m_HumanDescription 2019 and up
2018-04-06 15:57:36 +00:00
}
2018-09-09 09:32:12 +00:00
public string FindBonePath(uint hash)
{
2018-12-09 03:56:24 +00:00
return m_TOS.FirstOrDefault(pair => pair.Key == hash).Value;
2018-09-09 09:32:12 +00:00
}
2018-04-06 15:57:36 +00:00
}
}