CubismParameter.cs 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328
  1. /**
  2. * Copyright(c) Live2D Inc. All rights reserved.
  3. *
  4. * Use of this source code is governed by the Live2D Open Software license
  5. * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html.
  6. */
  7. using Live2D.Cubism.Core.Unmanaged;
  8. using Live2D.Cubism.Framework;
  9. using Live2D.Cubism.Framework.Utils;
  10. using System;
  11. using UnityEngine;
  12. namespace Live2D.Cubism.Core
  13. {
  14. /// <summary>
  15. /// Single <see cref="CubismModel"/> parameter.
  16. /// </summary>
  17. [CubismDontMoveOnReimport]
  18. public sealed class CubismParameter : MonoBehaviour
  19. {
  20. #region Factory Methods
  21. /// <summary>
  22. /// Creates drawables for a <see cref="CubismModel"/>.
  23. /// </summary>
  24. /// <param name="unmanagedModel">Handle to unmanaged model.</param>
  25. /// <returns>Drawables root.</returns>
  26. internal static GameObject CreateParameters(CubismUnmanagedModel unmanagedModel)
  27. {
  28. var root = new GameObject("Parameters");
  29. // Create parameters.
  30. var unmanagedParameters = unmanagedModel.Parameters;
  31. var buffer = new CubismParameter[unmanagedParameters.Count];
  32. for (var i = 0; i < buffer.Length; ++i)
  33. {
  34. var proxy = new GameObject();
  35. buffer[i] = proxy.AddComponent<CubismParameter>();
  36. buffer[i].transform.SetParent(root.transform);
  37. buffer[i].Reset(unmanagedModel, i);
  38. }
  39. return root;
  40. }
  41. #endregion
  42. /// <summary>
  43. /// Unmanaged parameters from unmanaged model.
  44. /// </summary>
  45. private CubismUnmanagedParameters UnmanagedParameters { get; set; }
  46. /// <summary>
  47. /// <see cref="UnmanagedIndex"/> backing field.
  48. /// </summary>
  49. [SerializeField, HideInInspector]
  50. private int _unmanagedIndex = -1;
  51. /// <summary>
  52. /// Position in unmanaged arrays.
  53. /// </summary>
  54. internal int UnmanagedIndex
  55. {
  56. get { return _unmanagedIndex; }
  57. private set { _unmanagedIndex = value; }
  58. }
  59. /// <summary>
  60. /// Copy of Id.
  61. /// </summary>
  62. public string Id
  63. {
  64. get
  65. {
  66. // Pull data.
  67. return UnmanagedParameters.Ids[UnmanagedIndex];
  68. }
  69. }
  70. /// <summary>
  71. /// Get Parameter Type.
  72. /// </summary>
  73. public int Type
  74. {
  75. get
  76. {
  77. // Pull data.
  78. return UnmanagedParameters.Types[UnmanagedIndex];
  79. }
  80. }
  81. /// <summary>
  82. /// Minimum value.
  83. /// </summary>
  84. public float MinimumValue
  85. {
  86. get
  87. {
  88. // Pull data.
  89. return UnmanagedParameters.MinimumValues[UnmanagedIndex];
  90. }
  91. }
  92. /// <summary>
  93. /// Maximum value.
  94. /// </summary>
  95. public float MaximumValue
  96. {
  97. get
  98. {
  99. // Pull data.
  100. return UnmanagedParameters.MaximumValues[UnmanagedIndex];
  101. }
  102. }
  103. /// <summary>
  104. /// Default value.
  105. /// </summary>
  106. public float DefaultValue
  107. {
  108. get
  109. {
  110. // Pull data.
  111. return UnmanagedParameters.DefaultValues[UnmanagedIndex];
  112. }
  113. }
  114. /// <summary>
  115. /// Current value.
  116. /// </summary>
  117. [SerializeField, HideInInspector]
  118. public float Value;
  119. /// <summary>
  120. /// CubismModel cache.
  121. /// </summary>
  122. private CubismModel _model;
  123. /// <summary>
  124. /// Whether to be overridden
  125. /// </summary>
  126. [SerializeField]
  127. private bool _isOverriddenUserParameterRepeat = false;
  128. /// <summary>
  129. /// Override flag for settings
  130. /// </summary>
  131. [SerializeField]
  132. private bool _isParameterRepeated = false;
  133. /// <summary>
  134. /// Checks whether parameter repetition is performed for the entire model.
  135. /// </summary>
  136. /// <returns>True if parameter repetition is performed for the entire model; otherwise returns false.</returns>
  137. public bool GetOverrideFlagForModelParameterRepeat()
  138. {
  139. if (_model == null)
  140. {
  141. _model = transform.FindCubismModel(true);
  142. if (_model == null)
  143. {
  144. return false;
  145. }
  146. }
  147. return _model.GetOverrideFlagForModelParameterRepeat();
  148. }
  149. /// <summary>
  150. /// Returns the flag indicating whether to override the parameter repeat.
  151. /// </summary>
  152. /// <returns>True if the parameter repeat is overridden, false otherwise.</returns>
  153. public bool GetOverrideFlagForParameterRepeat()
  154. {
  155. return _isOverriddenUserParameterRepeat;
  156. }
  157. /// <summary>
  158. /// Sets the flag indicating whether to override the parameter repeat.
  159. /// </summary>
  160. /// <param name="value">True if it is to be overridden; otherwise, false.</param>
  161. public void SetOverrideFlagForParameterRepeat(bool value)
  162. {
  163. _isOverriddenUserParameterRepeat = value;
  164. }
  165. /// <summary>
  166. /// Returns the repeat flag.
  167. /// </summary>
  168. /// <returns>True if repeating, false otherwise.</returns>
  169. public bool GetRepeatFlagForParameterRepeat()
  170. {
  171. return _isParameterRepeated;
  172. }
  173. /// <summary>
  174. /// Sets the repeat flag.
  175. /// </summary>
  176. /// <param name="value">True to enable repeating, false otherwise.</param>
  177. public void SetRepeatFlagForParameterRepeat(bool value)
  178. {
  179. _isParameterRepeated = value;
  180. }
  181. /// <summary>
  182. /// Gets whether the parameter has the repeat setting.
  183. /// </summary>
  184. /// <returns>True if it is set, otherwise returns false.</returns>
  185. public bool IsRepeat()
  186. {
  187. bool isRepeat;
  188. // パラメータリピート処理を行うか判定
  189. if (GetOverrideFlagForModelParameterRepeat() || _isOverriddenUserParameterRepeat)
  190. {
  191. // SDK側で設定されたリピート情報を使用する
  192. isRepeat = _isParameterRepeated;
  193. }
  194. else
  195. {
  196. // Editorで設定されたリピート情報を使用する
  197. isRepeat = GetParameterRepeats();
  198. }
  199. return isRepeat;
  200. }
  201. /// <summary>
  202. /// Returns the calculated result ensuring the value falls within the parameter's range.
  203. /// </summary>
  204. /// <param name="value">Parameter value</param>
  205. /// <returns>A value that falls within the parameter’s range. If the parameter does not exist, returns it as is.</returns>
  206. public float GetParameterRepeatValue(float value)
  207. {
  208. var maxValue = MaximumValue;
  209. var minValue = MinimumValue;
  210. var valueSize = maxValue - minValue;
  211. if (maxValue < value)
  212. {
  213. var overValue = CubismMath.ModF(value - maxValue, valueSize);
  214. if (!float.IsNaN(overValue))
  215. {
  216. value = minValue + overValue;
  217. }
  218. else
  219. {
  220. value = maxValue;
  221. }
  222. }
  223. if (value < minValue)
  224. {
  225. var overValue = CubismMath.ModF(minValue - value, valueSize);
  226. if (!float.IsNaN(overValue))
  227. {
  228. value = maxValue - overValue;
  229. }
  230. else
  231. {
  232. value = minValue;
  233. }
  234. }
  235. return value;
  236. }
  237. /// <summary>
  238. /// Returns the result of clamping the value to ensure it falls within the parameter's range.
  239. /// </summary>
  240. /// <param name="value">Parameter value</param>
  241. /// <returns>The clamped value. If the parameter does not exist, returns it as is.</returns>
  242. public float GetParameterClampValue(float value)
  243. {
  244. var maxValue = MaximumValue;
  245. var minValue = MinimumValue;
  246. return CubismMath.ClampF(value, minValue, maxValue);
  247. }
  248. /// <summary>
  249. /// Returns the repeat of the parameter.
  250. /// </summary>
  251. /// <returns>The raw data parameter repeat from the Cubism Core.</returns>
  252. public bool GetParameterRepeats()
  253. {
  254. return Convert.ToBoolean(UnmanagedParameters.Repeats[UnmanagedIndex]);
  255. }
  256. /// <summary>
  257. /// Revives the instance.
  258. /// </summary>
  259. /// <param name="unmanagedModel">Handle to unmanaged model.</param>
  260. internal void Revive(CubismUnmanagedModel unmanagedModel)
  261. {
  262. UnmanagedParameters = unmanagedModel.Parameters;
  263. }
  264. /// <summary>
  265. /// Restores instance to initial state.
  266. /// </summary>
  267. /// <param name="unmanagedModel">Handle to unmanaged model.</param>
  268. /// <param name="unmanagedIndex">Position in unmanaged arrays.</param>
  269. private void Reset(CubismUnmanagedModel unmanagedModel, int unmanagedIndex)
  270. {
  271. Revive(unmanagedModel);
  272. UnmanagedIndex = unmanagedIndex;
  273. name = Id;
  274. Value = DefaultValue;
  275. }
  276. }
  277. }