A game about forced loneliness, made by TACStudios
at master 118 lines 4.2 kB view raw
1using System; 2using System.Collections.Generic; 3using System.IO; 4using UnityEngine; 5using UnityEngine.Rendering; 6 7namespace UnityEditor.Rendering 8{ 9 // Utility class that serializes volume component data to/from EditorGUIUtility.systemCopyBuffer. 10 internal static class VolumeComponentCopyPaste 11 { 12 static string GetTypeName(VolumeComponent component) => component.GetType().AssemblyQualifiedName; 13 14 static void WriteCopyBuffer(StringWriter writer, VolumeComponent targetComponent) 15 { 16 string typeName = GetTypeName(targetComponent); 17 string typeData = JsonUtility.ToJson(targetComponent); 18 writer.WriteLine($"{typeName}|{typeData}"); 19 } 20 21 static bool TryReadCopyBuffer(StringReader reader, out string[] typeAndValue) 22 { 23 string line = reader.ReadLine(); 24 typeAndValue = line?.Split('|'); 25 return typeAndValue != null; 26 } 27 28 public static bool CanPaste(List<VolumeComponent> targetComponents) 29 { 30 if (targetComponents == null) 31 return false; 32 33 // Allow paste if a single matching component is found 34 foreach (var component in targetComponents) 35 if (CanPaste(component)) 36 return true; 37 38 return false; 39 } 40 41 public static bool CanPaste(VolumeComponent targetComponent) 42 { 43 if (targetComponent == null) 44 return false; 45 if (string.IsNullOrEmpty(EditorGUIUtility.systemCopyBuffer)) 46 return false; 47 48 using var reader = new StringReader(EditorGUIUtility.systemCopyBuffer); 49 string targetTypeName = GetTypeName(targetComponent); 50 while (TryReadCopyBuffer(reader, out var typeAndValue)) 51 { 52 if (targetTypeName == typeAndValue[0]) 53 return true; 54 } 55 return false; 56 } 57 58 public static void CopySettings(VolumeComponent targetComponent) 59 { 60 using var writer = new StringWriter(); 61 WriteCopyBuffer(writer, targetComponent); 62 EditorGUIUtility.systemCopyBuffer = writer.ToString(); 63 } 64 65 public static void PasteSettings(VolumeComponent targetComponent) 66 { 67 if (targetComponent == null) 68 return; 69 70 Undo.RecordObject(targetComponent, "Paste Settings"); 71 72 using var reader = new StringReader(EditorGUIUtility.systemCopyBuffer); 73 if (TryReadCopyBuffer(reader, out var typeAndValue)) 74 JsonUtility.FromJsonOverwrite(typeAndValue[1], targetComponent); 75 } 76 77 public static void CopySettings(List<VolumeComponent> targetComponents) 78 { 79 using var writer = new StringWriter(); 80 var targetComponentsInOrder = new List<VolumeComponent>(targetComponents); 81 targetComponentsInOrder.Sort( 82 (l, r) => string.CompareOrdinal(GetTypeName(l), GetTypeName(r))); 83 foreach (var targetComponent in targetComponentsInOrder) 84 { 85 WriteCopyBuffer(writer, targetComponent); 86 } 87 EditorGUIUtility.systemCopyBuffer = writer.ToString(); 88 } 89 90 public static void PasteSettings(List<VolumeComponent> targetComponents) 91 { 92 if (targetComponents == null || targetComponents.Count == 0) 93 return; 94 95 Undo.RecordObjects(targetComponents.ToArray(), "Paste Settings"); 96 97 using var reader = new StringReader(EditorGUIUtility.systemCopyBuffer); 98 99 while (TryReadCopyBuffer(reader, out var typeAndValue)) 100 { 101 VolumeComponent targetComponent = null; 102 foreach (var x in targetComponents) 103 { 104 if (GetTypeName(x) == typeAndValue[0]) 105 { 106 targetComponent = x; 107 break; 108 } 109 } 110 111 if (targetComponent != null) 112 { 113 JsonUtility.FromJsonOverwrite(typeAndValue[1], targetComponent); 114 } 115 } 116 } 117 } 118}