Ei kuvausta
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

ShaderGraphNodeValidationExtension.cs 1.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. namespace UnityEditor.ShaderGraph
  5. {
  6. internal interface INodeValidationExtension
  7. {
  8. internal enum Status { Warning, Error, None }
  9. string GetValidatorKey();
  10. Status GetValidationStatus(AbstractMaterialNode node, out string msg);
  11. }
  12. internal static class NodeValidation
  13. {
  14. private static List<INodeValidationExtension> s_validators;
  15. private static void Init()
  16. {
  17. s_validators = new();
  18. foreach (var type in TypeCache.GetTypesDerivedFrom(typeof(INodeValidationExtension)).Where(e => !e.IsGenericType))
  19. {
  20. var validator = (INodeValidationExtension)Activator.CreateInstance(type);
  21. s_validators.Add(validator);
  22. }
  23. }
  24. internal static void HandleValidationExtensions(AbstractMaterialNode node)
  25. {
  26. if (node.owner == null || node.owner.messageManager == null)
  27. return;
  28. if (s_validators == null)
  29. Init();
  30. foreach(var validator in s_validators)
  31. {
  32. var status = validator.GetValidationStatus(node, out var msg);
  33. if (node.owner.messageManager.AnyError(e => e == node.objectId))
  34. node.owner.messageManager.ClearNodesFromProvider(validator, Enumerable.Repeat(node, 1));
  35. if (status != INodeValidationExtension.Status.None)
  36. {
  37. var severity = status == INodeValidationExtension.Status.Warning ? Rendering.ShaderCompilerMessageSeverity.Warning : Rendering.ShaderCompilerMessageSeverity.Error;
  38. node.owner.messageManager.AddOrAppendError(validator, node.objectId, new ShaderMessage(msg, severity));
  39. }
  40. }
  41. }
  42. }
  43. }