Пример #1
0
        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();
        }
Пример #2
0
        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);
        }
Пример #3
0
        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);
            }
        }