| 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    }}
 |