OffsetOnTransform.cs 1.42 KB
using System;
using UnityEngine;


namespace VRM
{
    [Serializable]
    public struct OffsetOnTransform
    {
        public Transform Transform;
        public Matrix4x4 OffsetRotation;

        public Matrix4x4 WorldMatrix
        {
            get
            {
                if (Transform == null) return Matrix4x4.identity;
                return Transform.localToWorldMatrix * OffsetRotation;
            }
        }

        public Vector3 WorldForward
        {
            get
            {
                var m = WorldMatrix;
                return m.GetColumn(2); // zaxis
            }
        }

        Matrix4x4 m_initialLocalMatrix;
        public void Setup()
        {
            if (Transform == null) return;
            m_initialLocalMatrix = Transform.parent.worldToLocalMatrix * Transform.localToWorldMatrix;
        }

        public Matrix4x4 InitialWorldMatrix
        {
            get
            {
                return Transform.parent.localToWorldMatrix * m_initialLocalMatrix;
            }
        }

        public static OffsetOnTransform Create(Transform transform)
        {
            var coordinate = new OffsetOnTransform
            {
                Transform = transform
            };

            if (transform != null)
            {
                coordinate.OffsetRotation = transform.worldToLocalMatrix.RotationToWorldAxis();
            }

            return coordinate;
        }
    }
}