123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 |
- /**
- * 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 UnityEngine;
- namespace Live2D.Cubism.Rendering.Masking
- {
- /// <summary>
- /// Holds info used for masking.
- /// </summary>
- public struct CubismMaskTransform
- {
- #region Conversion
- /// <summary>
- /// <see cref="UniqueId"/> backing field.
- /// </summary>
- private static int _uniqueId;
- /// <summary>
- /// HACK Prevents dynamic batching of <see cref="CubismRenderer"/>s that are masked.
- /// </summary>
- /// <remarks>
- /// As Unity transforms vertex positions into world space on dynamic batching, and masking relies on vertex positions to be in local space,
- /// masking isn't compatible with dynamic batching.
- ///
- /// Unity exposes a shader tag for disabling dynamic batching ("DynamicBatching"), but this would make it necessary for creating separate shaders...
- /// </remarks>
- private static int UniqueId
- {
- get
- {
- // We just have to make sure consecutive drawables with the same mask aren't batched; having more than 1024 cases in a row seems pretty rare, so...
- if (_uniqueId > 1024)
- {
- _uniqueId = 0;
- }
- return (++_uniqueId);
- }
- }
- /// <summary>
- /// Converts a <see cref="CubismMaskTile"/> to a <see cref="Vector4"/>.
- /// </summary>
- /// <param name="value">Value to convert.</param>
- public static implicit operator Vector4(CubismMaskTransform value)
- {
- return new Vector4
- {
- x = value.Offset.x,
- y = value.Offset.y,
- z = value.Scale,
- w = UniqueId
- };
- }
- #endregion
- /// <summary>
- /// Offset in model space.
- /// </summary>
- public Vector2 Offset;
- /// <summary>
- /// Scale in model space.
- /// </summary>
- public float Scale;
- }
- }
|