summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xScripts/Fold/Editor/FoldEditorWindow.cs23
-rwxr-xr-xScripts/Fold/Editor/FoldPipelineBuilder.cs12
-rwxr-xr-xvertex.cginc20
-rwxr-xr-xvertex_deformation.slang13
4 files changed, 67 insertions, 1 deletions
diff --git a/Scripts/Fold/Editor/FoldEditorWindow.cs b/Scripts/Fold/Editor/FoldEditorWindow.cs
index b174b54..e2a94e1 100755
--- a/Scripts/Fold/Editor/FoldEditorWindow.cs
+++ b/Scripts/Fold/Editor/FoldEditorWindow.cs
@@ -210,6 +210,7 @@ public class FoldEditorWindow : EditorWindow
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("Translate"), false, () => AddOperation(new TranslateOp()));
menu.AddItem(new GUIContent("Norm Conversion"), false, () => AddOperation(new NormConversionOp()));
menu.AddItem(new GUIContent("Seal"), false, () => AddOperation(new SealOp()));
menu.AddSeparator("");
@@ -272,6 +273,7 @@ public class FoldEditorWindow : EditorWindow
FoldPipelineBuilder.Opcodes.PlaneToHemiOctahedron => new PlaneToHemiOctahedronOp(slot),
FoldPipelineBuilder.Opcodes.HemiOctahedronToPlane => new HemiOctahedronToPlaneOp(slot),
FoldPipelineBuilder.Opcodes.Scale => new ScaleOp(slot),
+ FoldPipelineBuilder.Opcodes.Translate => new TranslateOp(slot),
FoldPipelineBuilder.Opcodes.PointAlign => new PointAlignOp(slot),
FoldPipelineBuilder.Opcodes.AxisAlign => new AxisAlignOp(slot),
FoldPipelineBuilder.Opcodes.NormConversion => new NormConversionOp(slot),
@@ -395,6 +397,27 @@ public class ScaleOp : DeformOperation
}
[System.Serializable]
+public class TranslateOp : DeformOperation
+{
+ public Vector3 offset = Vector3.zero;
+ public float t = 1f;
+
+ public TranslateOp() { }
+ public TranslateOp(FoldSlot slot) { offset = slot.vec0; t = slot.float0; }
+
+ public override string GetDisplayName() => "Translate";
+
+ public override void DrawParameters()
+ {
+ offset = EditorGUILayout.Vector3Field("Offset", offset);
+ t = EditorGUILayout.Slider("Interpolation (t)", t, 0f, 1f);
+ }
+
+ public override void ApplyTo(FoldPipelineBuilder builder) =>
+ builder.Translate(offset, t);
+}
+
+[System.Serializable]
public class HemiOctahedronToPlaneOp : DeformOperation
{
public Vector3 p = Vector3.zero;
diff --git a/Scripts/Fold/Editor/FoldPipelineBuilder.cs b/Scripts/Fold/Editor/FoldPipelineBuilder.cs
index 85a7a4f..2dc2291 100755
--- a/Scripts/Fold/Editor/FoldPipelineBuilder.cs
+++ b/Scripts/Fold/Editor/FoldPipelineBuilder.cs
@@ -59,6 +59,7 @@ public class FoldPipelineBuilder
public const int PlaneToHemiOctahedron = 9;
public const int HemiOctahedronToPlane = 10;
public const int Scale = 11;
+ public const int Translate = 12;
}
FoldPipelineBuilder() { }
@@ -121,6 +122,17 @@ public class FoldPipelineBuilder
return this;
}
+ public FoldPipelineBuilder Translate(Vector3 offset, float t)
+ {
+ slots.Add(new FoldSlot
+ {
+ opcode = Opcodes.Translate,
+ vec0 = offset,
+ float0 = t
+ });
+ return this;
+ }
+
public FoldPipelineBuilder HemiOctahedronToPlane(Vector3 p, Vector3 r, Vector3 s, float t)
{
slots.Add(new FoldSlot
diff --git a/vertex.cginc b/vertex.cginc
index 2e0c1dd..7c448ab 100755
--- a/vertex.cginc
+++ b/vertex.cginc
@@ -16,6 +16,7 @@
#define OPCODE_PLANE_TO_HEMI_OCTAHEDRON 9
#define OPCODE_HEMI_OCTAHEDRON_TO_PLANE 10
#define OPCODE_SCALE 11
+#define OPCODE_TRANSLATE 12
#if defined(_VERTEX_DEFORMATION)
@@ -196,6 +197,19 @@ void apply_scale_normal(inout float3 objPos, inout float3 objNorm,
scale_normal(objPos, objNorm, objTan, k, t);
}
+void apply_translate(inout float3 objPos, float4 v0, float f0) {
+ float3 offset = v0.xyz;
+ float t = f0;
+ objPos = translate(objPos, offset, t);
+}
+
+void apply_translate_normal(inout float3 objPos, inout float3 objNorm,
+ inout float3 objTan, float4 v0, float f0) {
+ float3 offset = v0.xyz;
+ float t = f0;
+ translate_normal(objPos, objNorm, objTan, offset, t);
+}
+
void deform(inout float3 objPos) {
const float t = getTime();
@@ -437,6 +451,9 @@ void deform(inout float3 objPos) {
case OPCODE_SCALE:
apply_scale(objPos, v0, f0);
break;
+ case OPCODE_TRANSLATE:
+ apply_translate(objPos, v0, f0);
+ break;
}
}
}
@@ -685,6 +702,9 @@ void deform_normal(inout float3 objPos, inout float3 objNorm, inout float3 objTa
case OPCODE_SCALE:
apply_scale_normal(objPos, objNorm, objTan, v0, f0);
break;
+ case OPCODE_TRANSLATE:
+ apply_translate_normal(objPos, objNorm, objTan, v0, f0);
+ break;
}
}
}
diff --git a/vertex_deformation.slang b/vertex_deformation.slang
index 0c25d76..0883c84 100755
--- a/vertex_deformation.slang
+++ b/vertex_deformation.slang
@@ -518,7 +518,7 @@ public float3 plane_to_hemi_octahedron(float3 xyz,
// Normalize to unit sphere (differentiable safe normalize)
float3 oct_pos = float3(x_rot, y, z_rot);
float len = dot(oct_pos, oct_pos);
- oct_pos = oct_pos / sqrt(len);
+ oct_pos = (oct_pos / sqrt(len)) * (1.0f + xyz.y);
// Rotate back by -45° around y to undo input rotation
float x_unrot = (oct_pos.x - oct_pos.z) * RCP_SQRT_2;
@@ -601,5 +601,16 @@ public void scale_normal(inout float3 xyz, inout float3 normal,
R3R3_NORMALS(xyz, normal, tangent, scale, k, t);
}
+[Differentiable]
+public float3 translate(float3 xyz,
+ no_diff float3 offset, no_diff float t) {
+ return xyz + offset * t;
+}
+
+public void translate_normal(inout float3 xyz, inout float3 normal,
+ inout float3 tangent, float3 offset, float t) {
+ R3R3_NORMALS(xyz, normal, tangent, translate, offset, t);
+}
+
#endif // __CUSTOM31_INC