123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 |
- /**
- * 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 Live2D.Cubism.Core;
- using UnityEngine;
- using UnityEngine.Rendering;
- namespace Live2D.Cubism.Rendering.Masking
- {
- /// <summary>
- /// Renders out a single Cubism mask.
- /// </summary>
- /// <remarks>
- /// Note that - depending on the model - multiple <see cref="CubismMaskRenderer"/> might be assigned to a single <see cref="CubismDrawable"/>.
- /// </remarks>
- internal sealed class CubismMaskRenderer
- {
- /// <summary>
- /// Mask properties.
- /// </summary>
- private MaterialPropertyBlock MaskProperties { get; set; }
- /// <summary>
- /// Main renderer.
- /// </summary>
- private CubismRenderer MainRenderer { get; set; }
- /// <summary>
- /// Mask material.
- /// </summary>
- private Material MaskMaterial { get; set; }
- /// <summary>
- /// Mask culling material.
- /// </summary>
- private Material MaskCullingMaterial { get; set; }
- /// <summary>
- /// Culling setting.
- /// </summary>
- private bool IsCulling { get; set; }
- /// <summary>
- /// Bounds of <see cref="CubismRenderer.Mesh"/>.
- /// </summary>
- internal Bounds MeshBounds
- {
- get { return MainRenderer.Mesh.bounds; }
- }
- #region Ctors
- /// <summary>
- /// Initializes fields.
- /// </summary>
- public CubismMaskRenderer()
- {
- MaskProperties = new MaterialPropertyBlock();
- MaskMaterial = CubismBuiltinMaterials.Mask;
- MaskCullingMaterial = CubismBuiltinMaterials.MaskCulling;
- }
- #endregion
- #region Interface For CubismMaskMaskedJunction
- /// <summary>
- /// Sets the <see cref="CubismRenderer"/> to reference.
- /// </summary>
- /// <param name="value">Value to set.</param>
- /// <returns>Instance.</returns>
- internal CubismMaskRenderer SetMainRenderer(CubismRenderer value)
- {
- MainRenderer = value;
- IsCulling = !(MainRenderer.gameObject.GetComponent<CubismDrawable>().IsDoubleSided);
- return this;
- }
- /// <summary>
- /// Sets <see cref="CubismMaskTile"/>.
- /// </summary>
- /// <param name="value">Value to set.</param>
- /// <returns>Instance.</returns>
- internal CubismMaskRenderer SetMaskTile(CubismMaskTile value)
- {
- MaskProperties.SetVector(CubismShaderVariables.MaskTile, value);
- return this;
- }
- /// <summary>
- /// Sets <see cref="CubismMaskTransform"/>.
- /// </summary>
- /// <param name="value">Value to set.</param>
- /// <returns>Instance.</returns>
- internal CubismMaskRenderer SetMaskTransform(CubismMaskTransform value)
- {
- MaskProperties.SetVector(CubismShaderVariables.MaskTransform, value);
- return this;
- }
- /// <summary>
- /// Enqueues
- /// </summary>
- /// <param name="buffer">Buffer to enqueue in.</param>
- internal void AddToCommandBuffer(CommandBuffer buffer)
- {
- // Lazily fetch drawable texture and mesh.
- var mainTexture = MainRenderer.MainTexture;
- var mesh = MainRenderer.Mesh;
- MaskProperties.SetTexture(CubismShaderVariables.MainTexture, mainTexture);
- // Add command.
- buffer.DrawMesh(mesh, Matrix4x4.identity,
- IsCulling
- ? MaskCullingMaterial
- : MaskMaterial,
- 0, 0, MaskProperties);
- }
- #endregion
- }
- }
|