/** * Copyright(c) Live2D Inc. All rights reserved. * * Use of this source code is governed by the Live2D Open Software license * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html. */ using Live2D.Cubism.Core; using System; using UnityEngine; namespace Live2D.Cubism.Framework.Physics { /// /// Input data of physics. /// [Serializable] public struct CubismPhysicsInput { /// /// Delegation of function of getting normalized parameter value. /// /// Result of translation. /// Result of rotation. /// Parameter. /// Normalized components. /// Weight. public delegate void NormalizedParameterValueGetter( ref Vector2 targetTranslation, ref float targetAngle, CubismParameter parameter, CubismPhysicsNormalization normalization, float weight ); /// /// Gets Normalized parameter value from input translation X-axis. /// /// Result of translation. /// Result of rotation. /// Parameter. /// Normalized components. /// Weight. private void GetInputTranslationXFromNormalizedParameterValue( ref Vector2 targetTranslation, ref float targetAngle, CubismParameter parameter, CubismPhysicsNormalization normalization, float weight ) { targetTranslation.x += CubismPhysicsMath.Normalize( parameter, normalization.Position.Minimum, normalization.Position.Maximum, normalization.Position.Default, IsInverted ) * weight; } /// /// Gets Normalized parameter value from input translation Y-axis. /// /// Result of translation. /// Result of rotation. /// Parameter. /// Normalized components. /// Weight. private void GetInputTranslationYFromNormalizedParameterValue( ref Vector2 targetTranslation, ref float targetAngle, CubismParameter parameter, CubismPhysicsNormalization normalization, float weight ) { targetTranslation.y += CubismPhysicsMath.Normalize( parameter, normalization.Position.Minimum, normalization.Position.Maximum, normalization.Position.Default, IsInverted ) * weight; } /// /// Gets Normalized parameter value from input rotation. /// /// Result of translation. /// Result of rotation. /// Parameter. /// Normalized components. /// Weight. private void GetInputAngleFromNormalizedParameterValue( ref Vector2 targetTranslation, ref float targetAngle, CubismParameter parameter, CubismPhysicsNormalization normalization, float weight ) { targetAngle += CubismPhysicsMath.Normalize( parameter, normalization.Angle.Minimum, normalization.Angle.Maximum, normalization.Angle.Default, IsInverted ) * weight; } public void InitializeGetter() { switch (SourceComponent) { case CubismPhysicsSourceComponent.X: { GetNormalizedParameterValue = GetInputTranslationXFromNormalizedParameterValue; } break; case CubismPhysicsSourceComponent.Y: { GetNormalizedParameterValue = GetInputTranslationYFromNormalizedParameterValue; } break; case CubismPhysicsSourceComponent.Angle: { GetNormalizedParameterValue = GetInputAngleFromNormalizedParameterValue; } break; } } /// /// Parameter ID of source. /// [SerializeField] public string SourceId; /// /// Scale of translation. /// [SerializeField] public Vector2 ScaleOfTranslation; /// /// Scale of angle. /// [SerializeField] public float AngleScale; /// /// Weight. /// [SerializeField] public float Weight; /// /// Component of source. /// [SerializeField] public CubismPhysicsSourceComponent SourceComponent; /// /// True if value is inverted; otherwise. /// [SerializeField] public bool IsInverted; /// /// Source data from parameter. /// [NonSerialized] public CubismParameter Source; /// /// Function of getting normalized parameter value. /// [NonSerialized] public NormalizedParameterValueGetter GetNormalizedParameterValue; } }