using System.Collections.Generic; using UnityEditor; using UnityEngine; using UnityEngine.Rendering; namespace Module.ProjectValidator.Editor { internal sealed class AssetValidatorMaterialShader : IAssetValidator { public void Validate(Material obj, List results) { if (obj.shader == null) results.Add(ValidatorResult.Create(EValidatorSeverity.Error, "Shader is Null")); else if (!IsCompatible(obj.shader)) results.Add(ValidatorResult.Create(EValidatorSeverity.Warning, $"Shader '{obj.shader.name}' is not compatible with render pipeline")); else if (!obj.shader.isSupported) results.Add(ValidatorResult.Create(EValidatorSeverity.Warning, $"Shader '{obj.shader.name}' is not supported")); else if (ShaderUtil.ShaderHasError(obj.shader)) results.Add(ValidatorResult.Create(EValidatorSeverity.Error, $"Shader '{obj.shader.name}' has compile errors")); } private static bool IsCompatible(Shader shader) { var pipeline = GraphicsSettings.currentRenderPipeline; if (pipeline == null) return true; var tagSearch = new ShaderTagId("RenderPipeline"); var tagPipeline = new ShaderTagId(pipeline.renderPipelineShaderTag); for (var i = 0; i < shader.passCount; i++) { var tagPass = shader.FindPassTagValue(i, tagSearch); if (tagPass == tagPipeline) return true; } return false; } } }