/**
* 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 System;
using UnityEngine;
namespace Live2D.Cubism.Framework.Json
{
///
/// Handles pose from pose3.json.
///
[Serializable]
public sealed class CubismPose3Json
{
///
/// Loads a pose3.json.
///
/// pose3.json to deserialize.
/// Deserialized pose3.json on success; otherwise.
public static CubismPose3Json LoadFrom(string pose3Json)
{
if (string.IsNullOrEmpty(pose3Json))
{
return null;
}
var ret = new CubismPose3Json();
var value = CubismJsonParser.ParseFromString(pose3Json);
ret.Type = (value.Get("Type") == null) ? null : value.Get("Type").toString();
ret.FadeInTime = (value.Get("FadeInTime") == null) ? 0.5f : value.Get("FadeInTime").ToFloat();
var groups = (value.Get("Groups") == null) ? null : value.Get("Groups").GetVector(null);
if(groups != null)
{
ret.Groups = new SerializablePoseGroup[groups.Count][];
for (var i = 0; i < groups.Count; ++i)
{
var count = groups[i].GetVector(null).Count;
ret.Groups[i] = new SerializablePoseGroup[count];
for (var j = 0; j < count; ++j)
{
ret.Groups[i][j].Id = groups[i].GetVector(null)[j].Get("Id").toString();
var link = groups[i].GetVector(null)[j].Get("Link").GetVector(null);
if(link.Count == 0)
{
continue;
}
ret.Groups[i][j].Link = new string[link.Count];
for (var linkCount = 0; linkCount < link.Count; ++ linkCount)
{
ret.Groups[i][j].Link[linkCount] = link[linkCount].toString();
}
}
}
}
return ret;
}
///
/// Loads a pose3.json asset.
///
/// pose3.json asset to deserialize.
/// Deserialized pose3.json asset on success; otherwise.
public static CubismPose3Json LoadFrom(TextAsset pose3JsonAsset)
{
return (pose3JsonAsset == null)
? null
: LoadFrom(pose3JsonAsset.text);
}
#region Json Data
///
/// The type of cubism pose.
///
[SerializeField]
public string Type;
///
/// [Optional] Time of the Fade-in for easing in seconds..
///
[SerializeField]
public float FadeInTime;
///
/// Array of Groups.
///
[SerializeField]
public SerializablePoseGroup[][] Groups;
#endregion
#region Json Helpers
[Serializable]
public struct SerializablePoseGroup
{
///
/// The part id of group.
///
[SerializeField]
public string Id;
///
/// The link part ids.
///
[SerializeField]
public string[] Link;
}
#endregion
}
}