| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200 | /** * 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.Rendering;namespace Live2D.Cubism.Rendering.Masking{    /// <summary>    /// Many-to-many <see cref="CubismRenderer"/>-<see cref="CubismMaskRenderer"/> map.    /// </summary>    internal sealed class CubismMaskMaskedJunction    {        /// <summary>        /// Shared buffer for <see cref="CubismMaskProperties"/>s.        /// </summary>        private static CubismMaskProperties SharedMaskProperties { get; set; }        /// <summary>        /// Masks.        /// </summary>        private CubismMaskRenderer[] Masks { get; set; }        /// <summary>        /// Masked drawables.        /// </summary>        private CubismRenderer[] Maskeds { get; set; }        /// <summary>        /// Mask texture to be referenced by <see cref="Maskeds"/>.        /// </summary>        private CubismMaskTexture MaskTexture { get; set; }        /// <summary>        /// Mask tile to write to and read from.        /// </summary>        private CubismMaskTile MaskTile { get; set; }        /// <summary>        /// Mask transform        /// </summary>        private CubismMaskTransform MaskTransform { get; set; }        #region Ctors        /// <summary>        /// Makes sure statics are initialized.        /// </summary>        public CubismMaskMaskedJunction()        {            if (SharedMaskProperties != null)            {                return;            }            SharedMaskProperties = new CubismMaskProperties();        }        #endregion        #region Interface For CubismMaskController        /// <summary>        /// Sets the masks.        /// </summary>        /// <param name="value">Value to set.</param>        /// <returns>Instance.</returns>        public CubismMaskMaskedJunction SetMasks(CubismMaskRenderer[] value)        {            Masks = value;            return this;        }        /// <summary>        /// Sets the masked drawables.        /// </summary>        /// <param name="value">Value to set.</param>        /// <returns>Instance.</returns>        public CubismMaskMaskedJunction SetMaskeds(CubismRenderer[] value)        {            Maskeds = value;            return this;        }        /// <summary>        /// Sets the mask texture to read from.        /// </summary>        /// <param name="value">Value to set.</param>        /// <returns>Instance.</returns>        public CubismMaskMaskedJunction SetMaskTexture(CubismMaskTexture value)        {            MaskTexture = value;            return this;        }        /// <summary>        /// Sets the mask tile to write to and read from.        /// </summary>        /// <param name="value">Value to set.</param>        /// <returns>Instance.</returns>        public CubismMaskMaskedJunction SetMaskTile(CubismMaskTile value)        {            MaskTile = value;            return this;        }        /// <summary>        /// Appends junction draw commands to a buffer.        /// </summary>        /// <param name="buffer">Buffer to append commands to.</param>        public void AddToCommandBuffer(CommandBuffer buffer)        {            // Make sure mask transform is initialized.            RecalculateMaskTransform();            // Initialize and enqueue masks.            for (var i = 0; i < Masks.Length; ++i)            {                Masks[i]                    .SetMaskTile(MaskTile)                    .SetMaskTransform(MaskTransform)                    .AddToCommandBuffer(buffer);            }        }        /// <summary>        /// Updates the junction and all related data.        /// </summary>        internal void Update()        {            // Update mask transform.            RecalculateMaskTransform();            // Apply transform to masks.            for (var i = 0; i < Masks.Length; ++i)            {                Masks[i].SetMaskTransform(MaskTransform);            }            // Apply transform and other properties to maskeds.            var maskProperties = SharedMaskProperties;            maskProperties.Texture = MaskTexture;            maskProperties.Tile = MaskTile;            maskProperties.Transform = MaskTransform;            for (var i = 0; i < Maskeds.Length; ++i)            {                Maskeds[i].OnMaskPropertiesDidChange(maskProperties);            }        }        #endregion        /// <summary>        /// Updates <see cref="MaskTransform"/> and <see cref="Maskeds"/>.        /// </summary>        private void RecalculateMaskTransform()        {            // Compute bounds and scale.            var bounds = Masks.GetBounds();            var scale = (bounds.size.x > bounds.size.y)                ? bounds.size.x                : bounds.size.y;            // Compute mask transform.            MaskTransform = new CubismMaskTransform            {                Offset = bounds.center,                Scale = 1f / scale            };        }    }}
 |