123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490 |
- /**
- * 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.Framework.Physics;
- using System;
- using UnityEngine;
- namespace Live2D.Cubism.Framework.Json
- {
- [Serializable]
- public sealed class CubismPhysics3Json
- {
- /// <summary>
- /// Loads a physics3.json asset.
- /// </summary>
- /// <param name="physics3Json">physics3.json to deserialize.</param>
- /// <returns>Deserialized physics3.json on success; <see langword="null"/> otherwise.</returns>
- public static CubismPhysics3Json LoadFrom(string physics3Json)
- {
- return (string.IsNullOrEmpty(physics3Json))
- ? null
- : JsonUtility.FromJson<CubismPhysics3Json>(physics3Json);
- }
- /// <summary>
- /// Loads a physics3.json asset.
- /// </summary>
- /// <param name="physics3JsonAsset">motion3.json to deserialize.</param>
- /// <returns>Deserialized physics3.json on success; <see langword="null"/> otherwise.</returns>
- public static CubismPhysics3Json LoadFrom(TextAsset physics3JsonAsset)
- {
- return (physics3JsonAsset == null)
- ? null
- : LoadFrom(physics3JsonAsset.text);
- }
- public CubismPhysicsRig ToRig()
- {
- var instance = new CubismPhysicsRig();
- instance.Gravity.x = Meta.EffectiveForces.Gravity.X;
- instance.Gravity.y = Meta.EffectiveForces.Gravity.Y;
- instance.Wind.x = Meta.EffectiveForces.Wind.X;
- instance.Wind.y = Meta.EffectiveForces.Wind.Y;
- instance.SubRigs = new CubismPhysicsSubRig[Meta.PhysicsSettingCount];
- for (var i = 0; i < instance.SubRigs.Length; ++i)
- {
- instance.SubRigs[i] = new CubismPhysicsSubRig
- {
- Input = ReadInput(PhysicsSettings[i].Input),
- Output = ReadOutput(PhysicsSettings[i].Output),
- Particles = ReadParticles(PhysicsSettings[i].Vertices),
- Normalization = ReadNormalization(PhysicsSettings[i].Normalization)
- };
- }
- return instance;
- }
- private CubismPhysicsInput[] ReadInput(SerializableInput[] source)
- {
- var dataArray = new CubismPhysicsInput[source.Length];
- for (var i = 0; i < dataArray.Length; ++i)
- {
- dataArray[i] = new CubismPhysicsInput
- {
- SourceId = source[i].Source.Id,
- AngleScale = 0.0f,
- ScaleOfTranslation = Vector2.zero,
- Weight = source[i].Weight,
- SourceComponent = (CubismPhysicsSourceComponent) Enum.Parse(
- typeof(CubismPhysicsSourceComponent), source[i].Type
- ),
- IsInverted = source[i].Reflect
- };
- }
- return dataArray;
- }
- private CubismPhysicsOutput[] ReadOutput(SerializableOutput[] source)
- {
- var dataArray = new CubismPhysicsOutput[source.Length];
- for (var i = 0; i < dataArray.Length; ++i)
- {
- dataArray[i] = new CubismPhysicsOutput
- {
- DestinationId = source[i].Destination.Id,
- ParticleIndex = source[i].VertexIndex,
- TranslationScale = Vector2.zero,
- AngleScale = source[i].Scale,
- Weight = source[i].Weight,
- SourceComponent = (CubismPhysicsSourceComponent) Enum.Parse(
- typeof(CubismPhysicsSourceComponent), source[i].Type
- ),
- IsInverted = source[i].Reflect,
- ValueBelowMinimum = 0.0f,
- ValueExceededMaximum = 0.0f
- };
- }
- return dataArray;
- }
- private CubismPhysicsParticle[] ReadParticles(SerializableVertex[] source)
- {
- var dataArray = new CubismPhysicsParticle[source.Length];
- for (var i = 0; i < dataArray.Length; ++i)
- {
- dataArray[i] = new CubismPhysicsParticle
- {
- InitialPosition =
- {
- x = source[i].Position.X,
- y = source[i].Position.Y
- },
- Mobility = source[i].Mobility,
- Delay = source[i].Delay,
- Acceleration = source[i].Acceleration,
- Radius = source[i].Radius,
- Position = Vector2.zero,
- LastPosition = Vector2.zero,
- LastGravity = Vector2.down,
- Force = Vector2.zero,
- Velocity = Vector2.zero
- };
- }
- return dataArray;
- }
- private CubismPhysicsNormalization ReadNormalization(SerializableNormalization source)
- {
- return new CubismPhysicsNormalization
- {
- Position =
- {
- Maximum = source.Position.Maximum,
- Minimum = source.Position.Minimum,
- Default = source.Position.Default
- },
- Angle =
- {
- Maximum = source.Angle.Maximum,
- Minimum = source.Angle.Minimum,
- Default = source.Angle.Default
- }
- };
- }
- #region Json Data
- /// <summary>
- /// Json file format version.
- /// </summary>
- [SerializeField]
- public int Version;
- /// <summary>
- /// Additional data describing physics.
- /// </summary>
- [SerializeField]
- public SerializableMeta Meta;
- /// <summary>
- /// TODO Document.
- /// </summary>
- [SerializeField]
- public SerializablePhysicsSettings[] PhysicsSettings;
- #endregion
- #region Json Helpers
- /// <summary>
- /// 2-component vector.
- /// </summary>
- [Serializable]
- public struct SerializableVector2
- {
- [SerializeField]
- public float X;
- [SerializeField]
- public float Y;
- }
- /// <summary>
- /// TODO Document.
- /// </summary>
- [Serializable]
- public struct SerializableNormalizationValue
- {
- /// <summary>
- /// Minimum of normalization.
- /// </summary>
- [SerializeField]
- public float Minimum;
- /// <summary>
- /// Center of normalization range.
- /// </summary>
- [SerializeField]
- public float Default;
- /// <summary>
- /// Maximum of normalization.
- /// </summary>
- [SerializeField]
- public float Maximum;
- }
- /// <summary>
- /// Target parameter of model.
- /// </summary>
- [Serializable]
- public struct SerializableParameter
- {
- /// <summary>
- /// Target type.
- /// </summary>
- [SerializeField]
- public string Target;
- /// <summary>
- /// Parameter ID.
- /// </summary>
- [SerializeField]
- public string Id;
- }
- /// <summary>
- /// TODO Document.
- /// </summary>
- [Serializable]
- public struct SerializableInput
- {
- /// <summary>
- /// Target parameter.
- /// </summary>
- [SerializeField]
- public SerializableParameter Source;
- /// <summary>
- /// Influence ratio of each kind.
- /// </summary>
- [SerializeField]
- public float Weight;
- /// <summary>
- /// Type of source.
- /// </summary>
- [SerializeField]
- public string Type;
- /// <summary>
- /// TODO Document.
- /// </summary>
- [SerializeField]
- public bool Reflect;
- }
- /// <summary>
- /// TODO Document.
- /// </summary>
- [Serializable]
- public struct SerializableOutput
- {
- /// <summary>
- /// Target parameter.
- /// </summary>
- [SerializeField]
- public SerializableParameter Destination;
- /// <summary>
- /// Index of referenced vertex.
- /// </summary>
- [SerializeField]
- public int VertexIndex;
- /// <summary>
- /// Scale.
- /// </summary>
- [SerializeField]
- public float Scale;
- /// <summary>
- /// Influence ratio of each kind.
- /// </summary>
- [SerializeField]
- public float Weight;
- /// <summary>
- /// Type of destination.
- /// </summary>
- [SerializeField]
- public string Type;
- /// <summary>
- /// TODO Document.
- /// </summary>
- [SerializeField]
- public bool Reflect;
- }
- /// <summary>
- /// Single vertex.
- /// </summary>
- [Serializable]
- public struct SerializableVertex
- {
- /// <summary>
- /// Default position.
- /// </summary>
- [SerializeField]
- public SerializableVector2 Position;
- /// <summary>
- /// Mobility.
- /// </summary>
- [SerializeField]
- public float Mobility;
- /// <summary>
- /// Delay ratio.
- /// </summary>
- [SerializeField]
- public float Delay;
- /// <summary>
- /// Acceleration.
- /// </summary>
- [SerializeField]
- public float Acceleration;
- /// <summary>
- /// Length.
- /// </summary>
- [SerializeField]
- public float Radius;
- }
- /// <summary>
- /// TODO Document.
- /// </summary>
- [Serializable]
- public struct SerializableNormalization
- {
- /// <summary>
- /// Normalization value of position.
- /// </summary>
- [SerializeField]
- public SerializableNormalizationValue Position;
- /// <summary>
- /// Normalization value of angle.
- /// </summary>
- [SerializeField]
- public SerializableNormalizationValue Angle;
- }
- /// <summary>
- /// Setting of physics calculation.
- /// </summary>
- [Serializable]
- public struct SerializablePhysicsSettings
- {
- /// <summary>
- /// TODO Document.
- /// </summary>
- [SerializeField]
- public string Id;
- /// <summary>
- /// Input array.
- /// </summary>
- [SerializeField]
- public SerializableInput[] Input;
- /// <summary>
- /// Output array.
- /// </summary>
- [SerializeField]
- public SerializableOutput[] Output;
- /// <summary>
- /// Vertices.
- /// </summary>
- [SerializeField]
- public SerializableVertex[] Vertices;
- /// <summary>
- /// Normalization parameter of using input.
- /// </summary>
- [SerializeField]
- public SerializableNormalization Normalization;
- }
- /// <summary>
- /// Additional data describing physics.
- /// </summary>
- [Serializable]
- public struct SerializableMeta
- {
- /// <summary>
- /// Number of physics settings.
- /// </summary>
- [SerializeField]
- public int PhysicsSettingCount;
- /// <summary>
- /// Total number of input parameters.
- /// </summary>
- [SerializeField]
- public int TotalInputCount;
- /// <summary>
- /// Total number of output parameters.
- /// </summary>
- [SerializeField]
- public int TotalOutputCount;
- /// <summary>
- /// Total number of vertices.
- /// </summary>
- [SerializeField]
- public int TotalVertexCount;
- /// <summary>
- /// TODO Document.
- /// </summary>
- [SerializeField]
- public SerializableEffectiveForces EffectiveForces;
- }
- /// <summary>
- /// TODO Document.
- /// </summary>
- [Serializable]
- public struct SerializableEffectiveForces
- {
- /// <summary>
- /// Gravity.
- /// </summary>
- [SerializeField]
- public SerializableVector2 Gravity;
- /// <summary>
- /// Wind. (Not in use)
- /// </summary>
- [SerializeField]
- public SerializableVector2 Wind;
- }
- #endregion
- }
- }
|