UniVRM/Assets/VRM10/vrmlib/Runtime/Vrm/SpringBoneManager.cs
2021-01-22 15:55:55 +09:00

90 lines
2.2 KiB
C#

using System.Collections.Generic;
using System.Linq;
using System.Numerics;
namespace VrmLib
{
public enum VrmSpringBoneColliderTypes
{
Sphere,
Capsule,
}
public struct VrmSpringBoneCollider
{
public readonly VrmSpringBoneColliderTypes ColliderType;
public readonly Vector3 Offset;
public readonly float Radius;
public readonly Vector3 CapsuleTail;
VrmSpringBoneCollider(VrmSpringBoneColliderTypes type, Vector3 offset, float radius, Vector3 tail)
{
ColliderType = type;
Offset = offset;
Radius = radius;
CapsuleTail = tail;
}
public static VrmSpringBoneCollider CreateSphere(Vector3 offset, float radius)
{
return new VrmSpringBoneCollider(VrmSpringBoneColliderTypes.Sphere, offset, radius, Vector3.Zero);
}
public static VrmSpringBoneCollider CreateCapsule(Vector3 offset, float radius, Vector3 tail)
{
return new VrmSpringBoneCollider(VrmSpringBoneColliderTypes.Capsule, offset, radius, tail);
}
}
public class SpringBoneColliderGroup
{
public readonly Node Node;
public readonly List<VrmSpringBoneCollider> Colliders;
public SpringBoneColliderGroup(Node node, IEnumerable<VrmSpringBoneCollider> colliders)
{
Node = node;
Colliders = colliders.ToList();
}
}
public class SpringJoint
{
public readonly Node Node;
public SpringJoint(Node node)
{
Node = node;
}
public float DragForce;
public Vector3 GravityDir;
public float GravityPower;
public float HitRadius;
public float Stiffness;
public bool Exclude;
}
public class SpringBone
{
public const string ExtensionName = "VRMC_springBone";
public readonly List<SpringJoint> Joints = new List<SpringJoint>();
public Node Origin;
public readonly List<SpringBoneColliderGroup> Colliders = new List<SpringBoneColliderGroup>();
public string Comment = "";
}
public class SpringBoneManager
{
public readonly List<SpringBone> Springs = new List<SpringBone>();
}
}