private void SetMaterialProperties(bool forceCreateMaterial = false)
        {
            if (!enabled || сomponentExtension == null || !ShaderResources)
            {
                return;
            }
            if (!IsShaderFamilySupported(ShaderFamily))
            {
                return;
            }

            var maskEnabled = MaskMode != MaskMode.Disabled;
            var shaderName  = ShaderUtilities.BuildShaderName(ShaderFamily, RenderMode, maskEnabled, FramebufferEnabled, UnifiedGrabEnabled);

            if (!ShaderResources.ShaderExists(shaderName))
            {
                return;
            }

            var shareMaterial = ShareMaterial && сomponentExtension.AllowMaterialSharing();

            if (shareMaterial)
            {
                var shader = ShaderResources.GetShaderByName(shaderName);
                var sharedMaterialCreated = false;
                blendMaterial = SharedMaterials.GetSharedFor(shader, this, out sharedMaterialCreated);
                if (sharedMaterialCreated)
                {
                    сomponentExtension.OnEffectMaterialCreated(blendMaterial);
                }
            }
            else if (!blendMaterial || blendMaterial.shader.name != shaderName || forceCreateMaterial) // Re-use current blend material when possible.
            {
                var shader = ShaderResources.GetShaderByName(shaderName);
                blendMaterial = CreateBlendMaterial(shader);
                сomponentExtension.OnEffectMaterialCreated(blendMaterial);
            }

            ShaderUtilities.SelectBlendModeKeyword(blendMaterial, BlendMode);

            var propertyBlock = shareMaterial ? сomponentExtension.GetPropertyBlock() : null;

            if (RenderMode == RenderMode.TextureWithSelf)
            {
                SetOverlayMaterialProperties(blendMaterial, propertyBlock);
            }
            if (maskEnabled)
            {
                SetMaskMaterialProperties(blendMaterial, propertyBlock);
            }
            if (propertyBlock != null)
            {
                сomponentExtension.SetPropertyBlock(propertyBlock);
            }

            сomponentExtension.ApplyShaderProperties(blendMaterial);
            сomponentExtension.SetRenderMaterial(blendMaterial);

            isMaterialDirty = false;
        }
Beispiel #2
0
        private void SetMaterialProperties(bool forceCreateMaterial = false)
        {
            if (!isActiveAndEnabled || !componentExtension || !ShaderResources)
            {
                return;
            }
            if (!IsShaderFamilySupported(ShaderFamily))
            {
                return;
            }

            var maskEnabled = MaskMode != MaskMode.Disabled;
            var shaderName  = ShaderUtilities.BuildShaderName(ShaderFamily, RenderMode, maskEnabled, FramebufferEnabled, UnifiedGrabEnabled);

            if (!ShaderResources.ShaderExists(shaderName))
            {
                return;
            }

            var materials     = componentExtension.GetRenderMaterials();
            var shareMaterial = ShareMaterial && componentExtension.AllowMaterialSharing();

            if (materials == null || materials.Length == 0)
            {
                materials = new Material[] { null }
            }
            ;
            for (int i = 0; i < materials.Length; i++)
            {
                if (shareMaterial)
                {
                    var shader = ShaderResources.GetShaderByName(shaderName);
                    var sharedMaterialCreated = false;
                    materials[i] = MaterialCache.GetSharedFor(shader, this, out sharedMaterialCreated);
                    if (sharedMaterialCreated)
                    {
                        componentExtension.OnEffectMaterialCreated(materials[i]);
                    }
                }
                else if (forceCreateMaterial || !materials[i] || materials[i].shader.name != shaderName)
                {
                    var shader = ShaderResources.GetShaderByName(shaderName);
                    materials[i] = CreateTransientMaterial(shader);
                    componentExtension.OnEffectMaterialCreated(materials[i]);
                }

                ShaderUtilities.SelectBlendModeKeyword(materials[i], BlendMode);

                var propertyBlock = shareMaterial ? componentExtension.GetPropertyBlock(i) : null;
                if (RenderMode == RenderMode.TextureWithSelf)
                {
                    SetOverlayMaterialProperties(materials[i], propertyBlock);
                }
                if (maskEnabled)
                {
                    SetMaskMaterialProperties(materials[i], propertyBlock);
                }
                if (propertyBlock != null)
                {
                    componentExtension.SetPropertyBlock(propertyBlock, i);
                }
            }

            componentExtension.ApplyShaderProperties(materials);
            componentExtension.SetRenderMaterials(materials);

            isMaterialDirty = false;
        }