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; }
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; }