From 2f52d06c01682fe421af9ffd227aad0080c1f138 Mon Sep 17 00:00:00 2001 From: yum Date: Thu, 8 Jan 2026 18:39:56 -0800 Subject: Fold: fuck --- Scripts/Fold/Editor/FoldGraph.cs | 107 ++++++++++++++++++++++++++++++++++----- 1 file changed, 93 insertions(+), 14 deletions(-) (limited to 'Scripts/Fold/Editor/FoldGraph.cs') diff --git a/Scripts/Fold/Editor/FoldGraph.cs b/Scripts/Fold/Editor/FoldGraph.cs index 5782dc7..c0719d9 100644 --- a/Scripts/Fold/Editor/FoldGraph.cs +++ b/Scripts/Fold/Editor/FoldGraph.cs @@ -8,6 +8,59 @@ 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 { @@ -19,8 +72,10 @@ public abstract class FoldNodeData [Serializable] public abstract class FoldOperationData : FoldNodeData { - public abstract IEnumerable<(string name, Type type)> GetInputPorts(); - public abstract FoldNodeSerialized Serialize(FoldGraphView graphView); + 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"; } @@ -31,33 +86,57 @@ public abstract class FoldOperationData : FoldNodeData [Serializable] public class AxisAlignNodeData : FoldOperationData { - public override string Title => "Axis Align"; - public override IEnumerable<(string, Type)> GetInputPorts() { yield return ("po", typeof(Vector4)); yield return ("pp", typeof(Vector4)); yield return ("r", typeof(Vector4)); yield return ("t", typeof(float)); } - public override FoldNodeSerialized Serialize(FoldGraphView gv) => new() { opcode = 4, float0 = gv.GetInputValue(guid, "t", 0f), vec0 = gv.GetInputValue(guid, "po", Vector4.zero), vec1 = gv.GetInputValue(guid, "pp", Vector4.zero), vec2 = gv.GetInputValue(guid, "r", Vector4.zero) }; + 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 { - public override string Title => "Plane to Tube"; - public override IEnumerable<(string, Type)> GetInputPorts() { yield return ("p", typeof(Vector4)); yield return ("r", typeof(Vector4)); yield return ("s", typeof(Vector4)); yield return ("t", typeof(float)); } - public override FoldNodeSerialized Serialize(FoldGraphView gv) => new() { opcode = 2, float0 = gv.GetInputValue(guid, "t", 0f), vec0 = gv.GetInputValue(guid, "p", Vector4.zero), vec1 = gv.GetInputValue(guid, "r", Vector4.zero), vec2 = gv.GetInputValue(guid, "s", Vector4.zero) }; + 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 { - public override string Title => "Point Align"; - public override IEnumerable<(string, Type)> GetInputPorts() { yield return ("po", typeof(Vector4)); yield return ("pp", typeof(Vector4)); yield return ("r", typeof(Vector4)); yield return ("t", typeof(float)); } - public override FoldNodeSerialized Serialize(FoldGraphView gv) => new() { opcode = 3, float0 = gv.GetInputValue(guid, "t", 0f), vec0 = gv.GetInputValue(guid, "po", Vector4.zero), vec1 = gv.GetInputValue(guid, "pp", Vector4.zero), vec2 = gv.GetInputValue(guid, "r", Vector4.zero) }; + 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 { - public override string Title => "Tube to Plane"; - public override IEnumerable<(string, Type)> GetInputPorts() { yield return ("p", typeof(Vector4)); yield return ("r", typeof(Vector4)); yield return ("s", typeof(Vector4)); yield return ("t", typeof(float)); } - public override FoldNodeSerialized Serialize(FoldGraphView gv) => new() { opcode = 1, float0 = gv.GetInputValue(guid, "t", 0f), vec0 = gv.GetInputValue(guid, "p", Vector4.zero), vec1 = gv.GetInputValue(guid, "r", Vector4.zero), vec2 = gv.GetInputValue(guid, "s", Vector4.zero) }; + 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 -- cgit v1.2.3