CubismMaskMaskedJunction.cs 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. /**
  2. * Copyright(c) Live2D Inc. All rights reserved.
  3. *
  4. * Use of this source code is governed by the Live2D Open Software license
  5. * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html.
  6. */
  7. using UnityEngine.Rendering;
  8. namespace Live2D.Cubism.Rendering.Masking
  9. {
  10. /// <summary>
  11. /// Many-to-many <see cref="CubismRenderer"/>-<see cref="CubismMaskRenderer"/> map.
  12. /// </summary>
  13. internal sealed class CubismMaskMaskedJunction
  14. {
  15. /// <summary>
  16. /// Shared buffer for <see cref="CubismMaskProperties"/>s.
  17. /// </summary>
  18. private static CubismMaskProperties SharedMaskProperties { get; set; }
  19. /// <summary>
  20. /// Masks.
  21. /// </summary>
  22. private CubismMaskRenderer[] Masks { get; set; }
  23. /// <summary>
  24. /// Masked drawables.
  25. /// </summary>
  26. private CubismRenderer[] Maskeds { get; set; }
  27. /// <summary>
  28. /// Mask texture to be referenced by <see cref="Maskeds"/>.
  29. /// </summary>
  30. private CubismMaskTexture MaskTexture { get; set; }
  31. /// <summary>
  32. /// Mask tile to write to and read from.
  33. /// </summary>
  34. private CubismMaskTile MaskTile { get; set; }
  35. /// <summary>
  36. /// Mask transform
  37. /// </summary>
  38. private CubismMaskTransform MaskTransform { get; set; }
  39. #region Ctors
  40. /// <summary>
  41. /// Makes sure statics are initialized.
  42. /// </summary>
  43. public CubismMaskMaskedJunction()
  44. {
  45. if (SharedMaskProperties != null)
  46. {
  47. return;
  48. }
  49. SharedMaskProperties = new CubismMaskProperties();
  50. }
  51. #endregion
  52. #region Interface For CubismMaskController
  53. /// <summary>
  54. /// Sets the masks.
  55. /// </summary>
  56. /// <param name="value">Value to set.</param>
  57. /// <returns>Instance.</returns>
  58. public CubismMaskMaskedJunction SetMasks(CubismMaskRenderer[] value)
  59. {
  60. Masks = value;
  61. return this;
  62. }
  63. /// <summary>
  64. /// Sets the masked drawables.
  65. /// </summary>
  66. /// <param name="value">Value to set.</param>
  67. /// <returns>Instance.</returns>
  68. public CubismMaskMaskedJunction SetMaskeds(CubismRenderer[] value)
  69. {
  70. Maskeds = value;
  71. return this;
  72. }
  73. /// <summary>
  74. /// Sets the mask texture to read from.
  75. /// </summary>
  76. /// <param name="value">Value to set.</param>
  77. /// <returns>Instance.</returns>
  78. public CubismMaskMaskedJunction SetMaskTexture(CubismMaskTexture value)
  79. {
  80. MaskTexture = value;
  81. return this;
  82. }
  83. /// <summary>
  84. /// Sets the mask tile to write to and read from.
  85. /// </summary>
  86. /// <param name="value">Value to set.</param>
  87. /// <returns>Instance.</returns>
  88. public CubismMaskMaskedJunction SetMaskTile(CubismMaskTile value)
  89. {
  90. MaskTile = value;
  91. return this;
  92. }
  93. /// <summary>
  94. /// Appends junction draw commands to a buffer.
  95. /// </summary>
  96. /// <param name="buffer">Buffer to append commands to.</param>
  97. public void AddToCommandBuffer(CommandBuffer buffer)
  98. {
  99. // Make sure mask transform is initialized.
  100. RecalculateMaskTransform();
  101. // Initialize and enqueue masks.
  102. for (var i = 0; i < Masks.Length; ++i)
  103. {
  104. Masks[i]
  105. .SetMaskTile(MaskTile)
  106. .SetMaskTransform(MaskTransform)
  107. .AddToCommandBuffer(buffer);
  108. }
  109. }
  110. /// <summary>
  111. /// Updates the junction and all related data.
  112. /// </summary>
  113. internal void Update()
  114. {
  115. // Update mask transform.
  116. RecalculateMaskTransform();
  117. // Apply transform to masks.
  118. for (var i = 0; i < Masks.Length; ++i)
  119. {
  120. Masks[i].SetMaskTransform(MaskTransform);
  121. }
  122. // Apply transform and other properties to maskeds.
  123. var maskProperties = SharedMaskProperties;
  124. maskProperties.Texture = MaskTexture;
  125. maskProperties.Tile = MaskTile;
  126. maskProperties.Transform = MaskTransform;
  127. for (var i = 0; i < Maskeds.Length; ++i)
  128. {
  129. Maskeds[i].OnMaskPropertiesDidChange(maskProperties);
  130. }
  131. }
  132. #endregion
  133. /// <summary>
  134. /// Updates <see cref="MaskTransform"/> and <see cref="Maskeds"/>.
  135. /// </summary>
  136. private void RecalculateMaskTransform()
  137. {
  138. // Compute bounds and scale.
  139. var bounds = Masks.GetBounds();
  140. var scale = (bounds.size.x > bounds.size.y)
  141. ? bounds.size.x
  142. : bounds.size.y;
  143. // Compute mask transform.
  144. MaskTransform = new CubismMaskTransform
  145. {
  146. Offset = bounds.center,
  147. Scale = 1f / scale
  148. };
  149. }
  150. }
  151. }