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