summaryrefslogtreecommitdiffstats
path: root/Scripts/Fold
diff options
context:
space:
mode:
Diffstat (limited to 'Scripts/Fold')
-rwxr-xr-xScripts/Fold/Editor/FoldEditorWindow.cs180
-rwxr-xr-xScripts/Fold/Editor/FoldPipelineBuilder.cs58
2 files changed, 103 insertions, 135 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()
diff --git a/Scripts/Fold/Editor/FoldPipelineBuilder.cs b/Scripts/Fold/Editor/FoldPipelineBuilder.cs
index 3731cf8..85a7a4f 100755
--- a/Scripts/Fold/Editor/FoldPipelineBuilder.cs
+++ b/Scripts/Fold/Editor/FoldPipelineBuilder.cs
@@ -58,6 +58,7 @@ public class FoldPipelineBuilder
public const int FBM = 8;
public const int PlaneToHemiOctahedron = 9;
public const int HemiOctahedronToPlane = 10;
+ public const int Scale = 11;
}
FoldPipelineBuilder() { }
@@ -109,6 +110,17 @@ public class FoldPipelineBuilder
return this;
}
+ public FoldPipelineBuilder Scale(Vector3 k, float t)
+ {
+ slots.Add(new FoldSlot
+ {
+ opcode = Opcodes.Scale,
+ vec0 = k,
+ float0 = t
+ });
+ return this;
+ }
+
public FoldPipelineBuilder HemiOctahedronToPlane(Vector3 p, Vector3 r, Vector3 s, float t)
{
slots.Add(new FoldSlot
@@ -236,49 +248,3 @@ public class FoldPipelineBuilder
public int Count => slots.Count;
}
-
-public static class FoldPresets
-{
- public static void TubeToPlaneFull(Material mat) =>
- FoldPipelineBuilder.Create()
- .For(mat)
- .TubeToPlane(Vector3.zero, Vector3.right, Vector3.forward, 1f)
- .Apply();
-
- public static void PlaneToTubeFull(Material mat) =>
- FoldPipelineBuilder.Create()
- .For(mat)
- .PlaneToTube(Vector3.zero, Vector3.right, Vector3.forward, 1f)
- .Apply();
-
- public static void PlaneToHemiOctahedronFull(Material mat) =>
- FoldPipelineBuilder.Create()
- .For(mat)
- .PlaneToHemiOctahedron(Vector3.zero, Vector3.right, Vector3.forward, 1f)
- .Apply();
-
- public static void TubeToPlaneThenNormConv(Material mat) =>
- FoldPipelineBuilder.Create()
- .For(mat)
- .TubeToPlane(Vector3.zero, Vector3.right, Vector3.forward, 1f)
- .NormConversion(2f, 1f, 1f)
- .Apply();
-
- public static void NormConvL1ToL2(Material mat) =>
- FoldPipelineBuilder.Create()
- .For(mat)
- .NormConversion(1f, 2f, 1f)
- .Apply();
-
- public static void NormConvL2ToL1(Material mat) =>
- FoldPipelineBuilder.Create()
- .For(mat)
- .NormConversion(2f, 1f, 1f)
- .Apply();
-
- public static void NormConvL2ToLinf(Material mat) =>
- FoldPipelineBuilder.Create()
- .For(mat)
- .NormConversion(2f, float.PositiveInfinity, 1f)
- .Apply();
-}