diff options
Diffstat (limited to 'Scripts/Fold/Editor/FoldEditorWindow.cs')
| -rwxr-xr-x | Scripts/Fold/Editor/FoldEditorWindow.cs | 180 |
1 files changed, 91 insertions, 89 deletions
diff --git a/Scripts/Fold/Editor/FoldEditorWindow.cs b/Scripts/Fold/Editor/FoldEditorWindow.cs index ab02781..b174b54 100755 --- a/Scripts/Fold/Editor/FoldEditorWindow.cs +++ b/Scripts/Fold/Editor/FoldEditorWindow.cs @@ -18,11 +18,6 @@ public class FoldEditorWindow : EditorWindow window.minSize = new Vector2(400, 300); } - void OnEnable() - { - // Operations list is restored via SerializeReference - } - void OnGUI() { EditorGUILayout.Space(5); @@ -86,9 +81,6 @@ public class FoldEditorWindow : EditorWindow liveUpdate = GUILayout.Toggle(liveUpdate, "Live", EditorStyles.toolbarButton, GUILayout.Width(40)); - if (GUILayout.Button("Load Presets", EditorStyles.toolbarDropDown, GUILayout.Width(100))) - ShowPresetsMenu(); - EditorGUILayout.EndHorizontal(); } @@ -217,6 +209,7 @@ public class FoldEditorWindow : EditorWindow menu.AddItem(new GUIContent("Point Align"), false, () => AddOperation(new PointAlignOp())); menu.AddItem(new GUIContent("Axis Align"), false, () => AddOperation(new AxisAlignOp())); menu.AddSeparator(""); + menu.AddItem(new GUIContent("Scale"), false, () => AddOperation(new ScaleOp())); menu.AddItem(new GUIContent("Norm Conversion"), false, () => AddOperation(new NormConversionOp())); menu.AddItem(new GUIContent("Seal"), false, () => AddOperation(new SealOp())); menu.AddSeparator(""); @@ -226,23 +219,6 @@ public class FoldEditorWindow : EditorWindow menu.ShowAsContext(); } - void ShowPresetsMenu() - { - var menu = new GenericMenu(); - - menu.AddItem(new GUIContent("Tube to Plane"), false, () => LoadPreset_TubeToPlane()); - menu.AddItem(new GUIContent("Plane to Tube"), false, () => LoadPreset_PlaneToTube()); - menu.AddItem(new GUIContent("Plane to Hemi-Octahedron"), false, () => LoadPreset_PlaneToHemiOct()); - menu.AddSeparator(""); - menu.AddItem(new GUIContent("Norm: L1→L2 (Diamond→Sphere)"), false, () => LoadPreset_NormL1L2()); - menu.AddItem(new GUIContent("Norm: L2→L1 (Sphere→Diamond)"), false, () => LoadPreset_NormL2L1()); - menu.AddItem(new GUIContent("Norm: L2→L∞ (Sphere→Cube)"), false, () => LoadPreset_NormL2Linf()); - menu.AddSeparator(""); - menu.AddItem(new GUIContent("Complex/Tube→Plane + Norm Conv"), false, () => LoadPreset_TubePlaneNorm()); - - menu.ShowAsContext(); - } - void AddOperation(DeformOperation op) { if (operations.Count >= 16) @@ -251,68 +227,6 @@ public class FoldEditorWindow : EditorWindow expandedOps.Add(operations.Count - 1); } - void LoadPreset_TubeToPlane() - { - operations.Clear(); - expandedOps.Clear(); - AddOperation(new TubeToPlaneOp()); - } - - void LoadPreset_PlaneToTube() - { - operations.Clear(); - expandedOps.Clear(); - AddOperation(new PlaneToTubeOp()); - } - - void LoadPreset_PlaneToHemiOct() - { - operations.Clear(); - expandedOps.Clear(); - AddOperation(new PlaneToHemiOctahedronOp()); - } - - void LoadPreset_NormL1L2() - { - operations.Clear(); - expandedOps.Clear(); - var op = new NormConversionOp(); - op.inputK = 1f; - op.outputK = 2f; - AddOperation(op); - } - - void LoadPreset_NormL2L1() - { - operations.Clear(); - expandedOps.Clear(); - var op = new NormConversionOp(); - op.inputK = 2f; - op.outputK = 1f; - AddOperation(op); - } - - void LoadPreset_NormL2Linf() - { - operations.Clear(); - expandedOps.Clear(); - var op = new NormConversionOp(); - op.inputK = 2f; - op.outputK = float.PositiveInfinity; - AddOperation(op); - } - - void LoadPreset_TubePlaneNorm() - { - operations.Clear(); - expandedOps.Clear(); - AddOperation(new TubeToPlaneOp()); - var norm = new NormConversionOp(); - norm.inputK = 2f; - norm.outputK = 1f; - AddOperation(norm); - } - void ApplyToMaterial() { var builder = FoldPipelineBuilder.Create().For(targetMaterial); @@ -325,10 +239,53 @@ public class FoldEditorWindow : EditorWindow void LoadFromMaterial() { - // Could potentially read back from material properties here - // For now, just clear the list operations.Clear(); expandedOps.Clear(); + + for (int i = 0; i < 16; i++) + { + var prefix = $"_Vertex_Deformation_Slot_{i}_"; + if (targetMaterial.GetFloat(prefix + "Enabled") < 0.5f) + break; + + int opcode = targetMaterial.GetInteger(prefix + "Opcode"); + if (opcode == FoldPipelineBuilder.Opcodes.None) + break; + + var slot = new FoldSlot + { + opcode = opcode, + float0 = targetMaterial.GetFloat(prefix + "Float_0"), + float1 = targetMaterial.GetFloat(prefix + "Float_1"), + float2 = targetMaterial.GetFloat(prefix + "Float_2"), + float3 = targetMaterial.GetFloat(prefix + "Float_3"), + vec0 = targetMaterial.GetVector(prefix + "Vector_0"), + vec1 = targetMaterial.GetVector(prefix + "Vector_1"), + vec2 = targetMaterial.GetVector(prefix + "Vector_2"), + vec3 = targetMaterial.GetVector(prefix + "Vector_3"), + }; + + DeformOperation op = opcode switch + { + FoldPipelineBuilder.Opcodes.TubeToPlane => new TubeToPlaneOp(slot), + FoldPipelineBuilder.Opcodes.PlaneToTube => new PlaneToTubeOp(slot), + FoldPipelineBuilder.Opcodes.PlaneToHemiOctahedron => new PlaneToHemiOctahedronOp(slot), + FoldPipelineBuilder.Opcodes.HemiOctahedronToPlane => new HemiOctahedronToPlaneOp(slot), + FoldPipelineBuilder.Opcodes.Scale => new ScaleOp(slot), + FoldPipelineBuilder.Opcodes.PointAlign => new PointAlignOp(slot), + FoldPipelineBuilder.Opcodes.AxisAlign => new AxisAlignOp(slot), + FoldPipelineBuilder.Opcodes.NormConversion => new NormConversionOp(slot), + FoldPipelineBuilder.Opcodes.Seal => new SealOp(slot), + FoldPipelineBuilder.Opcodes.SineWaves => new SineWavesOp(), + FoldPipelineBuilder.Opcodes.FBM => new FBMOp(), + _ => null + }; + + if (op == null) + break; + + operations.Add(op); + } } } @@ -349,6 +306,9 @@ public class TubeToPlaneOp : DeformOperation public Vector3 s = Vector3.forward; public float t = 1f; + public TubeToPlaneOp() { } + public TubeToPlaneOp(FoldSlot slot) { p = slot.vec0; r = slot.vec1; s = slot.vec2; t = slot.float0; } + public override string GetDisplayName() => "Tube to Plane"; public override void DrawParameters() @@ -371,6 +331,9 @@ public class PlaneToTubeOp : DeformOperation public Vector3 s = Vector3.forward; public float t = 1f; + public PlaneToTubeOp() { } + public PlaneToTubeOp(FoldSlot slot) { p = slot.vec0; r = slot.vec1; s = slot.vec2; t = slot.float0; } + public override string GetDisplayName() => "Plane to Tube"; public override void DrawParameters() @@ -393,6 +356,9 @@ public class PlaneToHemiOctahedronOp : DeformOperation public Vector3 s = Vector3.forward; public float t = 1f; + public PlaneToHemiOctahedronOp() { } + public PlaneToHemiOctahedronOp(FoldSlot slot) { p = slot.vec0; r = slot.vec1; s = slot.vec2; t = slot.float0; } + public override string GetDisplayName() => "Plane to Hemi-Octahedron"; public override void DrawParameters() @@ -408,6 +374,27 @@ public class PlaneToHemiOctahedronOp : DeformOperation } [System.Serializable] +public class ScaleOp : DeformOperation +{ + public Vector3 k = Vector3.one; + public float t = 1f; + + public ScaleOp() { } + public ScaleOp(FoldSlot slot) { k = slot.vec0; t = slot.float0; } + + public override string GetDisplayName() => "Scale"; + + public override void DrawParameters() + { + k = EditorGUILayout.Vector3Field("Scale", k); + t = EditorGUILayout.Slider("Interpolation (t)", t, 0f, 1f); + } + + public override void ApplyTo(FoldPipelineBuilder builder) => + builder.Scale(k, t); +} + +[System.Serializable] public class HemiOctahedronToPlaneOp : DeformOperation { public Vector3 p = Vector3.zero; @@ -415,6 +402,9 @@ public class HemiOctahedronToPlaneOp : DeformOperation public Vector3 s = Vector3.forward; public float t = 1f; + public HemiOctahedronToPlaneOp() { } + public HemiOctahedronToPlaneOp(FoldSlot slot) { p = slot.vec0; r = slot.vec1; s = slot.vec2; t = slot.float0; } + public override string GetDisplayName() => "Hemi-Octahedron to Plane"; public override void DrawParameters() @@ -437,6 +427,9 @@ public class PointAlignOp : DeformOperation public Vector3 r = Vector3.right; public float t = 1f; + public PointAlignOp() { } + public PointAlignOp(FoldSlot slot) { po = slot.vec0; pp = slot.vec1; r = slot.vec2; t = slot.float0; } + public override string GetDisplayName() => "Point Align"; public override void DrawParameters() @@ -459,6 +452,9 @@ public class AxisAlignOp : DeformOperation public Vector3 r = Vector3.right; public float t = 1f; + public AxisAlignOp() { } + public AxisAlignOp(FoldSlot slot) { po = slot.vec0; pp = slot.vec1; r = slot.vec2; t = slot.float0; } + public override string GetDisplayName() => "Axis Align"; public override void DrawParameters() @@ -480,6 +476,9 @@ public class NormConversionOp : DeformOperation public float outputK = 1f; public float t = 1f; + public NormConversionOp() { } + public NormConversionOp(FoldSlot slot) { inputK = slot.float0; outputK = slot.float1; t = slot.float2; } + public override string GetDisplayName() => $"Norm Conversion (L{FormatNorm(inputK)}→L{FormatNorm(outputK)})"; string FormatNorm(float k) @@ -521,6 +520,9 @@ public class SealOp : DeformOperation public float st = 0.8f; public float t = 1f; + public SealOp() { } + public SealOp(FoldSlot slot) { A = slot.float0; k = slot.float1; st = slot.float2; t = slot.float3; } + public override string GetDisplayName() => "Seal"; public override void DrawParameters() |
