CubismMaskRenderer.cs 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  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 Live2D.Cubism.Core;
  8. using UnityEngine;
  9. using UnityEngine.Rendering;
  10. namespace Live2D.Cubism.Rendering.Masking
  11. {
  12. /// <summary>
  13. /// Renders out a single Cubism mask.
  14. /// </summary>
  15. /// <remarks>
  16. /// Note that - depending on the model - multiple <see cref="CubismMaskRenderer"/> might be assigned to a single <see cref="CubismDrawable"/>.
  17. /// </remarks>
  18. internal sealed class CubismMaskRenderer
  19. {
  20. /// <summary>
  21. /// Mask properties.
  22. /// </summary>
  23. private MaterialPropertyBlock MaskProperties { get; set; }
  24. /// <summary>
  25. /// Main renderer.
  26. /// </summary>
  27. private CubismRenderer MainRenderer { get; set; }
  28. /// <summary>
  29. /// Mask material.
  30. /// </summary>
  31. private Material MaskMaterial { get; set; }
  32. /// <summary>
  33. /// Mask culling material.
  34. /// </summary>
  35. private Material MaskCullingMaterial { get; set; }
  36. /// <summary>
  37. /// Culling setting.
  38. /// </summary>
  39. private bool IsCulling { get; set; }
  40. /// <summary>
  41. /// Bounds of <see cref="CubismRenderer.Mesh"/>.
  42. /// </summary>
  43. internal Bounds MeshBounds
  44. {
  45. get { return MainRenderer.Mesh.bounds; }
  46. }
  47. #region Ctors
  48. /// <summary>
  49. /// Initializes fields.
  50. /// </summary>
  51. public CubismMaskRenderer()
  52. {
  53. MaskProperties = new MaterialPropertyBlock();
  54. MaskMaterial = CubismBuiltinMaterials.Mask;
  55. MaskCullingMaterial = CubismBuiltinMaterials.MaskCulling;
  56. }
  57. #endregion
  58. #region Interface For CubismMaskMaskedJunction
  59. /// <summary>
  60. /// Sets the <see cref="CubismRenderer"/> to reference.
  61. /// </summary>
  62. /// <param name="value">Value to set.</param>
  63. /// <returns>Instance.</returns>
  64. internal CubismMaskRenderer SetMainRenderer(CubismRenderer value)
  65. {
  66. MainRenderer = value;
  67. IsCulling = !(MainRenderer.gameObject.GetComponent<CubismDrawable>().IsDoubleSided);
  68. return this;
  69. }
  70. /// <summary>
  71. /// Sets <see cref="CubismMaskTile"/>.
  72. /// </summary>
  73. /// <param name="value">Value to set.</param>
  74. /// <returns>Instance.</returns>
  75. internal CubismMaskRenderer SetMaskTile(CubismMaskTile value)
  76. {
  77. MaskProperties.SetVector(CubismShaderVariables.MaskTile, value);
  78. return this;
  79. }
  80. /// <summary>
  81. /// Sets <see cref="CubismMaskTransform"/>.
  82. /// </summary>
  83. /// <param name="value">Value to set.</param>
  84. /// <returns>Instance.</returns>
  85. internal CubismMaskRenderer SetMaskTransform(CubismMaskTransform value)
  86. {
  87. MaskProperties.SetVector(CubismShaderVariables.MaskTransform, value);
  88. return this;
  89. }
  90. /// <summary>
  91. /// Enqueues
  92. /// </summary>
  93. /// <param name="buffer">Buffer to enqueue in.</param>
  94. internal void AddToCommandBuffer(CommandBuffer buffer)
  95. {
  96. // Lazily fetch drawable texture and mesh.
  97. var mainTexture = MainRenderer.MainTexture;
  98. var mesh = MainRenderer.Mesh;
  99. MaskProperties.SetTexture(CubismShaderVariables.MainTexture, mainTexture);
  100. // Add command.
  101. buffer.DrawMesh(mesh, Matrix4x4.identity,
  102. IsCulling
  103. ? MaskCullingMaterial
  104. : MaskMaterial,
  105. 0, 0, MaskProperties);
  106. }
  107. #endregion
  108. }
  109. }