1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
|
using System;
using System.Collections.Generic;
using UnityEngine;
[Serializable]
public class FoldEdge
{
public string outputNodeGuid, outputPortName, inputNodeGuid, inputPortName;
}
[Serializable]
public readonly struct FoldOperationDefinition
{
public readonly string title;
public readonly int opcode;
public readonly (string name, Type type)[] inputs;
public FoldOperationDefinition(string title, int opcode, params (string name, Type type)[] inputs)
{
this.title = title;
this.opcode = opcode;
this.inputs = inputs;
}
public FoldNodeSerialized Serialize(FoldGraphView graphView, string guid)
{
var serialized = new FoldNodeSerialized { opcode = opcode };
int floatIndex = 0, vectorIndex = 0;
foreach (var (name, type) in inputs)
{
if (type == typeof(float))
SetFloat(ref serialized, floatIndex++, graphView.GetInputValue(guid, name, 0f));
else if (type == typeof(Vector4))
SetVector(ref serialized, vectorIndex++, graphView.GetInputValue(guid, name, Vector4.zero));
}
return serialized;
}
static void SetFloat(ref FoldNodeSerialized node, int index, float value)
{
switch (index)
{
case 0: node.float0 = value; break;
case 1: node.float1 = value; break;
case 2: node.float2 = value; break;
case 3: node.float3 = value; break;
}
}
static void SetVector(ref FoldNodeSerialized node, int index, Vector4 value)
{
switch (index)
{
case 0: node.vec0 = value; break;
case 1: node.vec1 = value; break;
case 2: node.vec2 = value; break;
case 3: node.vec3 = value; break;
}
}
}
[Serializable]
public abstract class FoldNodeData
{
public string guid = Guid.NewGuid().ToString();
public Vector2 position;
public virtual string Title => GetType().Name;
}
[Serializable]
public abstract class FoldOperationData : FoldNodeData
{
protected abstract FoldOperationDefinition Definition { get; }
public override string Title => Definition.title;
public virtual IEnumerable<(string name, Type type)> GetInputPorts() => Definition.inputs;
public virtual FoldNodeSerialized Serialize(FoldGraphView graphView) => Definition.Serialize(graphView, guid);
}
[Serializable] public class FloatValueNodeData : FoldNodeData { public float value; public override string Title => "Float"; }
[Serializable] public class VectorValueNodeData : FoldNodeData { public Vector4 value; public override string Title => "Vector"; }
[Serializable] public class GameObjectNodeData : FoldNodeData { public GameObject output; public override string Title => "GameObject"; }
[Serializable] public class KeyframeNodeData : FoldNodeData { public override string Title => "Keyframe"; }
[Serializable]
public class AxisAlignNodeData : FoldOperationData
{
static readonly FoldOperationDefinition DefinitionInfo = new(
"Axis Align",
4,
("po", typeof(Vector4)),
("pp", typeof(Vector4)),
("r", typeof(Vector4)),
("t", typeof(float)));
protected override FoldOperationDefinition Definition => DefinitionInfo;
}
[Serializable]
public class PlaneToTubeNodeData : FoldOperationData
{
static readonly FoldOperationDefinition DefinitionInfo = new(
"Plane to Tube",
2,
("p", typeof(Vector4)),
("r", typeof(Vector4)),
("s", typeof(Vector4)),
("t", typeof(float)));
protected override FoldOperationDefinition Definition => DefinitionInfo;
}
[Serializable]
public class PointAlignNodeData : FoldOperationData
{
static readonly FoldOperationDefinition DefinitionInfo = new(
"Point Align",
3,
("po", typeof(Vector4)),
("pp", typeof(Vector4)),
("r", typeof(Vector4)),
("t", typeof(float)));
protected override FoldOperationDefinition Definition => DefinitionInfo;
}
[Serializable]
public class TubeToPlaneNodeData : FoldOperationData
{
static readonly FoldOperationDefinition DefinitionInfo = new(
"Tube to Plane",
1,
("p", typeof(Vector4)),
("r", typeof(Vector4)),
("s", typeof(Vector4)),
("t", typeof(float)));
protected override FoldOperationDefinition Definition => DefinitionInfo;
}
public class FoldGraph : ScriptableObject
{
[SerializeReference] public List<FoldNodeData> nodes = new();
public List<FoldEdge> edges = new();
}
|