diff options
Diffstat (limited to 'Scripts/Fold/Editor/FoldPipelineBuilder.cs')
| -rwxr-xr-x | Scripts/Fold/Editor/FoldPipelineBuilder.cs | 295 |
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; } |
