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