using System; using System.Buffers; using MemoryPack; using UnityEngine; namespace SerializeAnimation.Serializer { [MemoryPackable] public readonly partial struct HumanPoseSerializableByte { private const float ConvertRatio = 100f; public readonly Vector3 BodyPosition; public readonly Quaternion BodyRotation; // 95 public readonly sbyte[] Muscles; public HumanPoseSerializableByte(Vector3 bodyPosition, Quaternion bodyRotation, sbyte[] muscles) { BodyPosition = bodyPosition; BodyRotation = bodyRotation; Muscles = muscles; } public static HumanPoseSerializableByte Create(Vector3 bodyPosition, Quaternion bodyRotation, float[] muscles) { var m = new sbyte[muscles.Length]; for (var i = 0; i < muscles.Length; i++) { m[i] = (sbyte)(muscles[i] * ConvertRatio); } return new HumanPoseSerializableByte(bodyPosition, bodyRotation, m); } public byte[] Serialize() { return MemoryPackSerializer.Serialize(this); } public static HumanPoseSerializableByte Deserialize(in ReadOnlySpan buffer) { return MemoryPackSerializer.Deserialize(buffer); } public static HumanPoseSerializableByte Deserialize(in ReadOnlySequence buffer) { return MemoryPackSerializer.Deserialize(buffer); } [MemoryPackIgnore] public HumanPose HumanPose { get { var muscles = new float[Muscles.Length]; for (var i = 0; i < Muscles.Length; i++) { muscles[i] = Muscles[i] / ConvertRatio; } return new HumanPose { bodyPosition = BodyPosition, bodyRotation = BodyRotation, muscles = muscles, }; } } } public static class ExtensionHumanPoseByte { public static HumanPoseSerializableByte ToSerializableByte(this HumanPose humanPose) { return HumanPoseSerializableByte.Create(humanPose.bodyPosition, humanPose.bodyRotation, humanPose.muscles); } } }