/** * 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 { /// /// Renders out a single Cubism mask. /// /// /// Note that - depending on the model - multiple might be assigned to a single . /// internal sealed class CubismMaskRenderer { /// /// Mask properties. /// private MaterialPropertyBlock MaskProperties { get; set; } /// /// Main renderer. /// private CubismRenderer MainRenderer { get; set; } /// /// Mask material. /// private Material MaskMaterial { get; set; } /// /// Mask culling material. /// private Material MaskCullingMaterial { get; set; } /// /// Culling setting. /// private bool IsCulling { get; set; } /// /// Bounds of . /// internal Bounds MeshBounds { get { return MainRenderer.Mesh.bounds; } } #region Ctors /// /// Initializes fields. /// public CubismMaskRenderer() { MaskProperties = new MaterialPropertyBlock(); MaskMaterial = CubismBuiltinMaterials.Mask; MaskCullingMaterial = CubismBuiltinMaterials.MaskCulling; } #endregion #region Interface For CubismMaskMaskedJunction /// /// Sets the to reference. /// /// Value to set. /// Instance. internal CubismMaskRenderer SetMainRenderer(CubismRenderer value) { MainRenderer = value; IsCulling = !(MainRenderer.gameObject.GetComponent().IsDoubleSided); return this; } /// /// Sets . /// /// Value to set. /// Instance. internal CubismMaskRenderer SetMaskTile(CubismMaskTile value) { MaskProperties.SetVector(CubismShaderVariables.MaskTile, value); return this; } /// /// Sets . /// /// Value to set. /// Instance. internal CubismMaskRenderer SetMaskTransform(CubismMaskTransform value) { MaskProperties.SetVector(CubismShaderVariables.MaskTransform, value); return this; } /// /// Enqueues /// /// Buffer to enqueue in. 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 } }