A game about forced loneliness, made by TACStudios
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}