/**
* 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
{
///
/// Many-to-many - map.
///
internal sealed class CubismMaskMaskedJunction
{
///
/// Shared buffer for s.
///
private static CubismMaskProperties SharedMaskProperties { get; set; }
///
/// Masks.
///
private CubismMaskRenderer[] Masks { get; set; }
///
/// Masked drawables.
///
private CubismRenderer[] Maskeds { get; set; }
///
/// Mask texture to be referenced by .
///
private CubismMaskTexture MaskTexture { get; set; }
///
/// Mask tile to write to and read from.
///
private CubismMaskTile MaskTile { get; set; }
///
/// Mask transform
///
private CubismMaskTransform MaskTransform { get; set; }
#region Ctors
///
/// Makes sure statics are initialized.
///
public CubismMaskMaskedJunction()
{
if (SharedMaskProperties != null)
{
return;
}
SharedMaskProperties = new CubismMaskProperties();
}
#endregion
#region Interface For CubismMaskController
///
/// Sets the masks.
///
/// Value to set.
/// Instance.
public CubismMaskMaskedJunction SetMasks(CubismMaskRenderer[] value)
{
Masks = value;
return this;
}
///
/// Sets the masked drawables.
///
/// Value to set.
/// Instance.
public CubismMaskMaskedJunction SetMaskeds(CubismRenderer[] value)
{
Maskeds = value;
return this;
}
///
/// Sets the mask texture to read from.
///
/// Value to set.
/// Instance.
public CubismMaskMaskedJunction SetMaskTexture(CubismMaskTexture value)
{
MaskTexture = value;
return this;
}
///
/// Sets the mask tile to write to and read from.
///
/// Value to set.
/// Instance.
public CubismMaskMaskedJunction SetMaskTile(CubismMaskTile value)
{
MaskTile = value;
return this;
}
///
/// Appends junction draw commands to a buffer.
///
/// Buffer to append commands to.
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);
}
}
///
/// Updates the junction and all related data.
///
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
///
/// Updates and .
///
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
};
}
}
}