summaryrefslogtreecommitdiffstats
path: root/Scripts/Fold/Editor/FoldPipelineBuilder.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Scripts/Fold/Editor/FoldPipelineBuilder.cs')
-rwxr-xr-xScripts/Fold/Editor/FoldPipelineBuilder.cs295
1 files changed, 63 insertions, 232 deletions
diff --git a/Scripts/Fold/Editor/FoldPipelineBuilder.cs b/Scripts/Fold/Editor/FoldPipelineBuilder.cs
index b610aca..ad74b1b 100755
--- a/Scripts/Fold/Editor/FoldPipelineBuilder.cs
+++ b/Scripts/Fold/Editor/FoldPipelineBuilder.cs
@@ -9,35 +9,47 @@ public class FoldSlot
public float float0, float1, float2, float3;
public Vector4 vec0, vec1, vec2, vec3;
- public void ApplyToMaterial(Material mat, int slotIndex)
+ static string Prefix(int i) => $"_Vertex_Deformation_Slot_{i}_";
+
+ void ApplyToTarget(string pfx, Action<string, float> sf, Action<string, int> si, Action<string, Vector4> sv)
{
- var prefix = $"_Vertex_Deformation_Slot_{slotIndex}_";
- mat.SetFloat(prefix + "Enabled", 1f);
- mat.SetInteger(prefix + "Opcode", opcode);
- mat.SetFloat(prefix + "Float_0", float0);
- mat.SetFloat(prefix + "Float_1", float1);
- mat.SetFloat(prefix + "Float_2", float2);
- mat.SetFloat(prefix + "Float_3", float3);
- mat.SetVector(prefix + "Vector_0", vec0);
- mat.SetVector(prefix + "Vector_1", vec1);
- mat.SetVector(prefix + "Vector_2", vec2);
- mat.SetVector(prefix + "Vector_3", vec3);
+ sf(pfx + "Enabled", 1f);
+ si(pfx + "Opcode", opcode);
+ sf(pfx + "Float_0", float0);
+ sf(pfx + "Float_1", float1);
+ sf(pfx + "Float_2", float2);
+ sf(pfx + "Float_3", float3);
+ sv(pfx + "Vector_0", vec0);
+ sv(pfx + "Vector_1", vec1);
+ sv(pfx + "Vector_2", vec2);
+ sv(pfx + "Vector_3", vec3);
}
- public static void ClearSlot(Material mat, int slotIndex)
+ static void ClearTarget(string pfx, Action<string, float> sf, Action<string, int> si, Action<string, Vector4> sv)
{
- var prefix = $"_Vertex_Deformation_Slot_{slotIndex}_";
- mat.SetFloat(prefix + "Enabled", 0f);
- mat.SetInteger(prefix + "Opcode", 0);
- mat.SetFloat(prefix + "Float_0", 0f);
- mat.SetFloat(prefix + "Float_1", 0f);
- mat.SetFloat(prefix + "Float_2", 0f);
- mat.SetFloat(prefix + "Float_3", 0f);
- mat.SetVector(prefix + "Vector_0", Vector4.zero);
- mat.SetVector(prefix + "Vector_1", Vector4.zero);
- mat.SetVector(prefix + "Vector_2", Vector4.zero);
- mat.SetVector(prefix + "Vector_3", Vector4.zero);
+ sf(pfx + "Enabled", 0f);
+ si(pfx + "Opcode", 0);
+ sf(pfx + "Float_0", 0f);
+ sf(pfx + "Float_1", 0f);
+ sf(pfx + "Float_2", 0f);
+ sf(pfx + "Float_3", 0f);
+ sv(pfx + "Vector_0", Vector4.zero);
+ sv(pfx + "Vector_1", Vector4.zero);
+ sv(pfx + "Vector_2", Vector4.zero);
+ sv(pfx + "Vector_3", Vector4.zero);
}
+
+ public void ApplyToMaterial(Material mat, int i) =>
+ ApplyToTarget(Prefix(i), mat.SetFloat, mat.SetInteger, (k, v) => mat.SetVector(k, v));
+
+ public void ApplyToPropertyBlock(MaterialPropertyBlock mpb, int i) =>
+ ApplyToTarget(Prefix(i), mpb.SetFloat, mpb.SetInteger, (k, v) => mpb.SetVector(k, v));
+
+ public static void ClearSlot(Material mat, int i) =>
+ ClearTarget(Prefix(i), mat.SetFloat, mat.SetInteger, (k, v) => mat.SetVector(k, v));
+
+ public static void ClearInPropertyBlock(MaterialPropertyBlock mpb, int i) =>
+ ClearTarget(Prefix(i), mpb.SetFloat, mpb.SetInteger, (k, v) => mpb.SetVector(k, v));
}
public class FoldPipelineBuilder
@@ -45,217 +57,47 @@ public class FoldPipelineBuilder
readonly List<FoldSlot> slots = new();
Material targetMaterial;
- public static class Opcodes
- {
- public const int None = 0;
- public const int TubeToPlane = 1;
- public const int PlaneToTube = 2;
- public const int PointAlign = 3;
- public const int AxisAlign = 4;
- public const int NormConversion = 5;
- public const int Seal = 6;
- public const int SineWaves = 7;
- public const int FBM = 8;
- public const int PlaneToHemiOctahedron = 9;
- public const int HemiOctahedronToPlane = 10;
- public const int Scale = 11;
- public const int Translate = 12;
- public const int PlaneToOctahedron = 13;
- public const int OctahedronToPlane = 14;
- public const int Rotate = 15;
- }
-
FoldPipelineBuilder() { }
public static FoldPipelineBuilder Create() => new();
- public FoldPipelineBuilder For(Material material)
- {
- targetMaterial = material;
- return this;
- }
+ public FoldPipelineBuilder For(Material material) { targetMaterial = material; return this; }
- public FoldPipelineBuilder TubeToPlane(Vector3 p, Vector3 r, Vector3 s, float t)
- {
- slots.Add(new FoldSlot
- {
- opcode = Opcodes.TubeToPlane,
- vec0 = p,
- vec1 = r,
- vec2 = s,
- float0 = t
- });
- return this;
- }
+ FoldPipelineBuilder AddSlot(FoldSlot slot) { slots.Add(slot); return this; }
- public FoldPipelineBuilder PlaneToTube(Vector3 p, Vector3 r, Vector3 s, float t)
- {
- slots.Add(new FoldSlot
- {
- opcode = Opcodes.PlaneToTube,
- vec0 = p,
- vec1 = r,
- vec2 = s,
- float0 = t
- });
- return this;
- }
+ FoldPipelineBuilder Prs(int opcode, Vector3 p, Vector3 r, Vector3 s, float t) =>
+ AddSlot(new FoldSlot { opcode = opcode, vec0 = p, vec1 = r, vec2 = s, float0 = t });
- public FoldPipelineBuilder PlaneToHemiOctahedron(Vector3 p, Vector3 r, Vector3 s, float t)
- {
- slots.Add(new FoldSlot
- {
- opcode = Opcodes.PlaneToHemiOctahedron,
- vec0 = p,
- vec1 = r,
- vec2 = s,
- float0 = t
- });
- return this;
- }
+ FoldPipelineBuilder Vec1t(int opcode, Vector3 v, float t) =>
+ AddSlot(new FoldSlot { opcode = opcode, vec0 = v, float0 = t });
- public FoldPipelineBuilder Scale(Vector3 k, float t)
- {
- slots.Add(new FoldSlot
- {
- opcode = Opcodes.Scale,
- vec0 = k,
- float0 = t
- });
- return this;
- }
+ public FoldPipelineBuilder TubeToPlane(Vector3 p, Vector3 r, Vector3 s, float t) => Prs(TubeToPlaneOp.Opcode, p, r, s, t);
+ public FoldPipelineBuilder PlaneToTube(Vector3 p, Vector3 r, Vector3 s, float t) => Prs(PlaneToTubeOp.Opcode, p, r, s, t);
+ public FoldPipelineBuilder PlaneToHemiOctahedron(Vector3 p, Vector3 r, Vector3 s, float t) => Prs(PlaneToHemiOctahedronOp.Opcode, p, r, s, t);
+ public FoldPipelineBuilder HemiOctahedronToPlane(Vector3 p, Vector3 r, Vector3 s, float t) => Prs(HemiOctahedronToPlaneOp.Opcode, p, r, s, t);
+ public FoldPipelineBuilder PlaneToOctahedron(Vector3 p, Vector3 r, Vector3 s, float t) => Prs(PlaneToOctahedronOp.Opcode, p, r, s, t);
+ public FoldPipelineBuilder OctahedronToPlane(Vector3 p, Vector3 r, Vector3 s, float t) => Prs(OctahedronToPlaneOp.Opcode, p, r, s, t);
+ public FoldPipelineBuilder PointAlign(Vector3 po, Vector3 pp, Vector3 r, float t) => Prs(PointAlignOp.Opcode, po, pp, r, t);
+ public FoldPipelineBuilder AxisAlign(Vector3 po, Vector3 pp, Vector3 r, float t) => Prs(AxisAlignOp.Opcode, po, pp, r, t);
+ public FoldPipelineBuilder Scale(Vector3 k, float t) => Vec1t(ScaleOp.Opcode, k, t);
+ public FoldPipelineBuilder Translate(Vector3 offset, float t) => Vec1t(TranslateOp.Opcode, offset, t);
- public FoldPipelineBuilder Translate(Vector3 offset, float t)
- {
- slots.Add(new FoldSlot
- {
- opcode = Opcodes.Translate,
- vec0 = offset,
- float0 = t
- });
- return this;
- }
+ public FoldPipelineBuilder Rotate(Vector3 center, Vector3 axis, float angle, float t) =>
+ AddSlot(new FoldSlot { opcode = RotateOp.Opcode, vec0 = center, vec1 = axis, float0 = angle, float1 = t });
- public FoldPipelineBuilder PlaneToOctahedron(Vector3 p, Vector3 r, Vector3 s, float t)
- {
- slots.Add(new FoldSlot
- {
- opcode = Opcodes.PlaneToOctahedron,
- vec0 = p,
- vec1 = r,
- vec2 = s,
- float0 = t
- });
- return this;
- }
+ public FoldPipelineBuilder NormConversion(float inputK, float outputK, float t) =>
+ AddSlot(new FoldSlot { opcode = NormConversionOp.Opcode, float0 = inputK, float1 = outputK, float2 = t });
- public FoldPipelineBuilder OctahedronToPlane(Vector3 p, Vector3 r, Vector3 s, float t)
- {
- slots.Add(new FoldSlot
- {
- opcode = Opcodes.OctahedronToPlane,
- vec0 = p,
- vec1 = r,
- vec2 = s,
- float0 = t
- });
- return this;
- }
+ public FoldPipelineBuilder Seal(float A, float k, float st, float t) =>
+ AddSlot(new FoldSlot { opcode = SealOp.Opcode, float0 = A, float1 = k, float2 = st, float3 = t });
- public FoldPipelineBuilder Rotate(Vector3 center, Vector3 axis, float angle, float t)
- {
- slots.Add(new FoldSlot
- {
- opcode = Opcodes.Rotate,
- vec0 = center,
- vec1 = axis,
- float0 = angle,
- float1 = t
- });
- return this;
- }
-
- public FoldPipelineBuilder HemiOctahedronToPlane(Vector3 p, Vector3 r, Vector3 s, float t)
- {
- slots.Add(new FoldSlot
- {
- opcode = Opcodes.HemiOctahedronToPlane,
- vec0 = p,
- vec1 = r,
- vec2 = s,
- float0 = t
- });
- return this;
- }
-
- public FoldPipelineBuilder PointAlign(Vector3 po, Vector3 pp, Vector3 r, float t)
- {
- slots.Add(new FoldSlot
- {
- opcode = Opcodes.PointAlign,
- vec0 = po,
- vec1 = pp,
- vec2 = r,
- float0 = t
- });
- return this;
- }
-
- public FoldPipelineBuilder AxisAlign(Vector3 po, Vector3 pp, Vector3 r, float t)
- {
- slots.Add(new FoldSlot
- {
- opcode = Opcodes.AxisAlign,
- vec0 = po,
- vec1 = pp,
- vec2 = r,
- float0 = t
- });
- return this;
- }
-
- public FoldPipelineBuilder NormConversion(float inputK, float outputK, float t)
- {
- slots.Add(new FoldSlot
- {
- opcode = Opcodes.NormConversion,
- float0 = inputK,
- float1 = outputK,
- float2 = t
- });
- return this;
- }
-
- public FoldPipelineBuilder Seal(float A, float k, float st, float t)
- {
- slots.Add(new FoldSlot
- {
- opcode = Opcodes.Seal,
- float0 = A,
- float1 = k,
- float2 = st,
- float3 = t
- });
- return this;
- }
-
- public FoldPipelineBuilder SineWaves()
- {
- slots.Add(new FoldSlot { opcode = Opcodes.SineWaves });
- return this;
- }
-
- public FoldPipelineBuilder FBM()
- {
- slots.Add(new FoldSlot { opcode = Opcodes.FBM });
- return this;
- }
+ public FoldPipelineBuilder SineWaves() => AddSlot(new FoldSlot { opcode = SineWavesOp.Opcode });
+ public FoldPipelineBuilder FBM() => AddSlot(new FoldSlot { opcode = FBMOp.Opcode });
public FoldPipelineBuilder Custom(int opcode,
float f0 = 0, float f1 = 0, float f2 = 0, float f3 = 0,
- Vector4? v0 = null, Vector4? v1 = null, Vector4? v2 = null, Vector4? v3 = null)
- {
- slots.Add(new FoldSlot
+ Vector4? v0 = null, Vector4? v1 = null, Vector4? v2 = null, Vector4? v3 = null) =>
+ AddSlot(new FoldSlot
{
opcode = opcode,
float0 = f0, float1 = f1, float2 = f2, float3 = f3,
@@ -264,8 +106,6 @@ public class FoldPipelineBuilder
vec2 = v2 ?? Vector4.zero,
vec3 = v3 ?? Vector4.zero
});
- return this;
- }
public void Apply()
{
@@ -276,31 +116,22 @@ public class FoldPipelineBuilder
}
if (slots.Count > 16)
- {
Debug.LogWarning($"Too many operations ({slots.Count}). Only the first 16 will be applied.");
- }
Undo.RecordObject(targetMaterial, "Apply Vertex Deformation");
targetMaterial.SetFloat("_Vertex_Deformation_Enabled", 1f);
- // Clear all slots first to ensure clean state
for (int i = 0; i < 16; i++)
FoldSlot.ClearSlot(targetMaterial, i);
- // Apply active slots
for (int i = 0; i < slots.Count && i < 16; i++)
slots[i].ApplyToMaterial(targetMaterial, i);
EditorUtility.SetDirty(targetMaterial);
}
- public void Clear()
- {
- slots.Clear();
- }
-
+ public void Clear() => slots.Clear();
public int Count => slots.Count;
-
public FoldSlot GetSlot(int index) => index < slots.Count ? slots[index] : null;
}