123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335 |
- /**
- * 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.Unmanaged;
- using Live2D.Cubism.Framework;
- using UnityEngine;
- namespace Live2D.Cubism.Core
- {
- /// <summary>
- /// Single <see cref="CubismModel"/> drawable.
- /// </summary>
- [CubismDontMoveOnReimport]
- public sealed class CubismDrawable : MonoBehaviour
- {
- #region Factory Methods
- /// <summary>
- /// Creates drawables for a <see cref="CubismModel"/>.
- /// </summary>
- /// <param name="unmanagedModel">Handle to unmanaged model.</param>
- /// <returns>Drawables root.</returns>
- internal static GameObject CreateDrawables(CubismUnmanagedModel unmanagedModel)
- {
- var root = new GameObject("Drawables");
- // Create drawables.
- var unmanagedDrawables = unmanagedModel.Drawables;
- var buffer = new CubismDrawable[unmanagedDrawables.Count];
- for (var i = 0; i < buffer.Length; ++i)
- {
- var proxy = new GameObject();
- buffer[i] = proxy.AddComponent<CubismDrawable>();
- buffer[i].transform.SetParent(root.transform);
- buffer[i].Reset(unmanagedModel, i);
- }
- return root;
- }
- #endregion
- /// <summary>
- /// Unmanaged drawables from unmanaged model.
- /// </summary>
- private CubismUnmanagedDrawables UnmanagedDrawables { get; set; }
- /// <summary>
- /// <see cref="UnmanagedIndex"/> backing field.
- /// </summary>
- [SerializeField, HideInInspector]
- private int _unmanagedIndex = -1;
- /// <summary>
- /// Position in unmanaged arrays.
- /// </summary>
- internal int UnmanagedIndex
- {
- get { return _unmanagedIndex; }
- private set { _unmanagedIndex = value; }
- }
- /// <summary>
- /// Copy of Id.
- /// </summary>
- public string Id
- {
- get
- {
- // Pull data.
- return UnmanagedDrawables.Ids[UnmanagedIndex];
- }
- }
- /// <summary>
- /// Texture UnmanagedIndex.
- /// </summary>
- public int TextureIndex
- {
- get
- {
- // Pull data.
- return UnmanagedDrawables.TextureIndices[UnmanagedIndex];
- }
- }
- /// <summary>
- /// Copy of the masks.
- /// </summary>
- public CubismDrawable[] Masks
- {
- get
- {
- var drawables = this
- .FindCubismModel(true)
- .Drawables;
- // Get addresses.
- var counts = UnmanagedDrawables.MaskCounts;
- var indices = UnmanagedDrawables.Masks;
- // Pull data.
- var buffer = new CubismDrawable[counts[UnmanagedIndex]];
- for (var i = 0; i < buffer.Length; ++i)
- {
- for (var j = 0; j < drawables.Length; ++j)
- {
- if (drawables[j].UnmanagedIndex != indices[UnmanagedIndex][i])
- {
- continue;
- }
- buffer[i] = drawables[j];
- break;
- }
- }
- return buffer;
- }
- }
- /// <summary>
- /// Copy of vertex positions.
- /// </summary>
- public Vector3[] VertexPositions
- {
- get
- {
- // Get addresses.
- var counts = UnmanagedDrawables.VertexCounts;
- var positions = UnmanagedDrawables.VertexPositions;
- // Pull data.
- var buffer = new Vector3[counts[UnmanagedIndex]];
- for (var i = 0; i < buffer.Length; ++i)
- {
- buffer[i] = new Vector3(
- positions[UnmanagedIndex][(i * 2) + 0],
- positions[UnmanagedIndex][(i * 2) + 1]
- );
- }
- return buffer;
- }
- }
- /// <summary>
- /// Copy of vertex texture coordinates.
- /// </summary>
- public Vector2[] VertexUvs
- {
- get
- {
- // Get addresses.
- var counts = UnmanagedDrawables.VertexCounts;
- var uvs = UnmanagedDrawables.VertexUvs;
- // Pull data.
- var buffer = new Vector2[counts[UnmanagedIndex]];
- for (var i = 0; i < buffer.Length; ++i)
- {
- buffer[i] = new Vector2(
- uvs[UnmanagedIndex][(i * 2) + 0],
- uvs[UnmanagedIndex][(i * 2) + 1]
- );
- }
- return buffer;
- }
- }
- /// <summary>
- /// Copy of triangle indices.
- /// </summary>
- public int[] Indices
- {
- get
- {
- // Get addresses.
- var counts = UnmanagedDrawables.IndexCounts;
- var indices = UnmanagedDrawables.Indices;
- // Pull data.
- var buffer = new int[counts[UnmanagedIndex]];
- for (var i = 0; i < buffer.Length; ++i)
- {
- buffer[i] = indices[UnmanagedIndex][i];
- }
- return buffer;
- }
- }
- /// <summary>
- /// True if double-sided.
- /// </summary>
- public bool IsDoubleSided
- {
- get
- {
- // Get address.
- var flags = UnmanagedDrawables.ConstantFlags;
- // Pull data.
- return flags[UnmanagedIndex].HasIsDoubleSidedFlag();
- }
- }
- /// <summary>
- /// True if masking is requested.
- /// </summary>
- public bool IsMasked
- {
- get
- {
- // Get address.
- var counts = UnmanagedDrawables.MaskCounts;
- // Pull data.
- return counts[UnmanagedIndex] > 0;
- }
- }
- /// <summary>
- /// True if inverted mask.
- /// </summary>
- public bool IsInverted
- {
- get
- {
- // Get address.
- var flags = UnmanagedDrawables.ConstantFlags;
- // Pull data.
- return flags[UnmanagedIndex].HasIsInvertedMaskFlag();
- }
- }
- /// <summary>
- /// True if additive blending is requested.
- /// </summary>
- public bool BlendAdditive
- {
- get
- {
- // Get address.
- var flags = UnmanagedDrawables.ConstantFlags;
- // Pull data.
- return flags[UnmanagedIndex].HasBlendAdditiveFlag();
- }
- }
- /// <summary>
- /// True if multiply blending is setd.
- /// </summary>
- public bool MultiplyBlend
- {
- get
- {
- // Get address.
- var flags = UnmanagedDrawables.ConstantFlags;
- // Pull data.
- return flags[UnmanagedIndex].HasBlendMultiplicativeFlag();
- }
- }
- /// <summary>
- /// Revives instance.
- /// </summary>
- /// <param name="unmanagedModel">Handle to unmanaged model.</param>
- internal void Revive(CubismUnmanagedModel unmanagedModel)
- {
- UnmanagedDrawables = unmanagedModel.Drawables;
- }
- /// <summary>
- /// Restores instance to initial state.
- /// </summary>
- /// <param name="unmanagedModel">Handle to unmanaged model.</param>
- /// <param name="unmanagedIndex">Position in unmanaged arrays.</param>
- private void Reset(CubismUnmanagedModel unmanagedModel, int unmanagedIndex)
- {
- Revive(unmanagedModel);
- UnmanagedIndex = unmanagedIndex;
- name = Id;
- }
- }
- }
|