123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285 |
- /**
- * 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
- {
- /// <summary>
- /// Output data of physics.
- /// </summary>
- [Serializable]
- public struct CubismPhysicsOutput
- {
- /// <summary>
- /// Delegation of function of getting output value.
- /// </summary>
- /// <param name="translation">Translation.</param>
- /// <param name="parameter">Parameter.</param>
- /// <param name="particles">Particles.</param>
- /// <param name="particleIndex">Index of particle.</param>
- /// <param name="gravity">Gravity.</param>
- /// <returns>Output value.</returns>
- public delegate float ValueGetter(
- Vector2 translation,
- CubismParameter parameter,
- CubismPhysicsParticle[] particles,
- int particleIndex,
- Vector2 gravity
- );
- /// <summary>
- /// Delegation of function of getting output scale.
- /// </summary>
- /// <returns>Output scale.</returns>
- public delegate float ScaleGetter();
- /// <summary>
- /// Gets output for translation X-axis.
- /// </summary>
- /// <param name="translation">Translation.</param>
- /// <param name="parameter">Parameter.</param>
- /// <param name="particles">Particles.</param>
- /// <param name="particleIndex">Index of particle.</param>
- /// <param name="gravity">Gravity.</param>
- /// <returns>Output value.</returns>
- private float GetOutputTranslationX(
- Vector2 translation,
- CubismParameter parameter,
- CubismPhysicsParticle[] particles,
- int particleIndex,
- Vector2 gravity
- )
- {
- var outputValue = translation.x;
- if (IsInverted)
- {
- outputValue *= -1.0f;
- }
- return outputValue;
- }
- /// <summary>
- /// Gets output for translation Y-axis.
- /// </summary>
- /// <param name="translation">Translation.</param>
- /// <param name="parameter">Parameter.</param>
- /// <param name="particles">Particles.</param>
- /// <param name="particleIndex">Index of particle.</param>
- /// <param name="gravity">Gravity.</param>
- /// <returns>Output value.</returns>
- private float GetOutputTranslationY(
- Vector2 translation,
- CubismParameter parameter,
- CubismPhysicsParticle[] particles,
- int particleIndex,
- Vector2 gravity
- )
- {
- var outputValue = translation.y;
- if (IsInverted)
- {
- outputValue *= -1.0f;
- }
- return outputValue;
- }
- /// <summary>
- /// Gets output for angle.
- /// </summary>
- /// <param name="translation">Translation.</param>
- /// <param name="parameter">Parameter.</param>
- /// <param name="particles">Particles.</param>
- /// <param name="particleIndex">Index of particle.</param>
- /// <param name="gravity">Gravity.</param>
- /// <returns>Output value.</returns>
- 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;
- }
- /// <summary>
- /// Gets output scale for translation X-axis.
- /// </summary>
- /// <returns>Output scale.</returns>
- private float GetOutputScaleTranslationX()
- {
- return TranslationScale.x;
- }
- /// <summary>
- /// Gets output scale for translation Y-axis.
- /// </summary>
- /// <returns>Output scale.</returns>
- private float GetOutputScaleTranslationY()
- {
- return TranslationScale.y;
- }
- /// <summary>
- /// Gets output scale for angle.
- /// </summary>
- /// <returns>Output scale.</returns>
- 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;
- }
- }
- /// <summary>
- /// Parameter ID of destination.
- /// </summary>
- [SerializeField]
- public string DestinationId;
- /// <summary>
- /// Index of particle.
- /// </summary>
- [SerializeField]
- public int ParticleIndex;
- /// <summary>
- /// Scale of transition.
- /// </summary>
- [SerializeField]
- public Vector2 TranslationScale;
- /// <summary>
- /// Scale of angle.
- /// </summary>
- [SerializeField]
- public float AngleScale;
- /// <summary>
- /// Weight.
- /// </summary>
- [SerializeField]
- public float Weight;
- /// <summary>
- /// Component of source.
- /// </summary>
- [SerializeField]
- public CubismPhysicsSourceComponent SourceComponent;
- /// <summary>
- /// True if value is inverted; otherwise.
- /// </summary>
- [SerializeField]
- public bool IsInverted;
- /// <summary>
- /// The value that below minimum.
- /// </summary>
- [NonSerialized]
- public float ValueBelowMinimum;
- /// <summary>
- /// The value that exceeds maximum.
- /// </summary>
- [NonSerialized]
- public float ValueExceededMaximum;
- /// <summary>
- /// Destination data from parameter.
- /// </summary>
- [NonSerialized]
- public CubismParameter Destination;
- /// <summary>
- /// Function of getting output value.
- /// </summary>
- [NonSerialized]
- public ValueGetter GetValue;
- /// <summary>
- /// Function of getting output scale.
- /// </summary>
- [NonSerialized]
- public ScaleGetter GetScale;
- }
- }
|