private void ClearPreviousMaterials() { foreach (var m in s_PrevMaskMaterials) { StencilMaterial.Remove(m); } s_PrevMaskMaterials.Clear(); foreach (var m in s_PrevModifiedMaterials) { ModifiedMaterial.Remove(m); } s_PrevModifiedMaterials.Clear(); }
private Material GetModifiedMaterial(Material baseMaterial, Texture2D texture) { if (0 < m_StencilValue) { baseMaterial = StencilMaterial.Add(baseMaterial, (1 << m_StencilValue) - 1, StencilOp.Keep, CompareFunction.Equal, ColorWriteMask.All, (1 << m_StencilValue) - 1, 0); _maskMaterials.Add(baseMaterial); } if (texture == null && m_AnimatableProperties.Length == 0) { return(baseMaterial); } var id = m_AnimatableProperties.Length == 0 ? 0 : GetInstanceID(); baseMaterial = ModifiedMaterial.Add(baseMaterial, texture, id); _modifiedMaterials.Add(baseMaterial); return(baseMaterial); }
protected override void UpdateMaterial() { // Clear mask materials. s_PrevMaskMaterials.AddRange(_maskMaterials); _maskMaterials.Clear(); // Clear modified materials. s_PrevModifiedMaterials.AddRange(_modifiedMaterials); _modifiedMaterials.Clear(); // Recalculate stencil value. if (m_ShouldRecalculateStencil) { var rootCanvas = MaskUtilities.FindRootSortOverrideCanvas(transform); m_StencilValue = maskable ? MaskUtilities.GetStencilDepth(transform, rootCanvas) : 0; m_ShouldRecalculateStencil = false; } // No mesh to render. var count = activeMeshIndices.CountFast(); if (count == 0 || !isActiveAndEnabled || particles.Count == 0) { canvasRenderer.Clear(); foreach (var m in s_PrevMaskMaterials) { StencilMaterial.Remove(m); } foreach (var m in s_PrevModifiedMaterials) { ModifiedMaterial.Remove(m); } return; } // var materialCount = Mathf.Max(8, count); canvasRenderer.materialCount = materialCount; var j = 0; for (var i = 0; i < particles.Count; i++) { if (materialCount <= j) { break; } var ps = particles[i]; if (!ps) { continue; } var r = ps.GetComponent <ParticleSystemRenderer>(); r.GetSharedMaterials(s_TempMaterials); // Main var index = i * 2; if (activeMeshIndices.Count <= index) { break; } if (activeMeshIndices[index] && 0 < s_TempMaterials.Count) { var mat = GetModifiedMaterial(s_TempMaterials[0], ps.GetTextureForSprite()); canvasRenderer.SetMaterial(mat, j); UpdateMaterialProperties(r, j); j++; } // Trails index++; if (activeMeshIndices.Count <= index || materialCount <= j) { break; } if (activeMeshIndices[index] && 1 < s_TempMaterials.Count) { var mat = GetModifiedMaterial(s_TempMaterials[1], null); canvasRenderer.SetMaterial(mat, j++); } } foreach (var m in s_PrevMaskMaterials) { StencilMaterial.Remove(m); } foreach (var m in s_PrevModifiedMaterials) { ModifiedMaterial.Remove(m); } }