/** * 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 { /// /// Output data of physics. /// [Serializable] public struct CubismPhysicsOutput { /// /// Delegation of function of getting output value. /// /// Translation. /// Parameter. /// Particles. /// Index of particle. /// Gravity. /// Output value. public delegate float ValueGetter( Vector2 translation, CubismParameter parameter, CubismPhysicsParticle[] particles, int particleIndex, Vector2 gravity ); /// /// Delegation of function of getting output scale. /// /// Output scale. public delegate float ScaleGetter(); /// /// Gets output for translation X-axis. /// /// Translation. /// Parameter. /// Particles. /// Index of particle. /// Gravity. /// Output value. private float GetOutputTranslationX( Vector2 translation, CubismParameter parameter, CubismPhysicsParticle[] particles, int particleIndex, Vector2 gravity ) { var outputValue = translation.x; if (IsInverted) { outputValue *= -1.0f; } return outputValue; } /// /// Gets output for translation Y-axis. /// /// Translation. /// Parameter. /// Particles. /// Index of particle. /// Gravity. /// Output value. private float GetOutputTranslationY( Vector2 translation, CubismParameter parameter, CubismPhysicsParticle[] particles, int particleIndex, Vector2 gravity ) { var outputValue = translation.y; if (IsInverted) { outputValue *= -1.0f; } return outputValue; } /// /// Gets output for angle. /// /// Translation. /// Parameter. /// Particles. /// Index of particle. /// Gravity. /// Output value. private float GetOutputAngle( Vector2 translation, CubismParameter parameter, CubismPhysicsParticle[] particles, int particleIndex, Vector2 gravity ) { var parentGravity = Vector2.zero; if (CubismPhysics.UseAngleCorrection) { if (particleIndex < 2) { parentGravity = gravity; parentGravity.y *= -1.0f; } else { parentGravity = particles[particleIndex - 1].Position - particles[particleIndex - 2].Position; } } else { parentGravity = gravity; parentGravity.y *= -1.0f; } var outputValue = CubismPhysicsMath.DirectionToRadian(parentGravity, translation); if (IsInverted) { outputValue *= -1.0f; } return outputValue; } /// /// Gets output scale for translation X-axis. /// /// Output scale. private float GetOutputScaleTranslationX() { return TranslationScale.x; } /// /// Gets output scale for translation Y-axis. /// /// Output scale. private float GetOutputScaleTranslationY() { return TranslationScale.y; } /// /// Gets output scale for angle. /// /// Output scale. private float GetOutputScaleAngle() { return AngleScale; } public void InitializeGetter() { switch (SourceComponent) { case CubismPhysicsSourceComponent.X: { GetScale = GetOutputScaleTranslationX; GetValue = GetOutputTranslationX; } break; case CubismPhysicsSourceComponent.Y: { GetScale = GetOutputScaleTranslationY; GetValue = GetOutputTranslationY; } break; case CubismPhysicsSourceComponent.Angle: { GetScale = GetOutputScaleAngle; GetValue = GetOutputAngle; } break; } } /// /// Parameter ID of destination. /// [SerializeField] public string DestinationId; /// /// Index of particle. /// [SerializeField] public int ParticleIndex; /// /// Scale of transition. /// [SerializeField] public Vector2 TranslationScale; /// /// 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; /// /// The value that below minimum. /// [NonSerialized] public float ValueBelowMinimum; /// /// The value that exceeds maximum. /// [NonSerialized] public float ValueExceededMaximum; /// /// Destination data from parameter. /// [NonSerialized] public CubismParameter Destination; /// /// Function of getting output value. /// [NonSerialized] public ValueGetter GetValue; /// /// Function of getting output scale. /// [NonSerialized] public ScaleGetter GetScale; } }