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