diff options
| -rwxr-xr-x | Scripts/Fold/Editor/FoldEditorWindow.cs | 23 | ||||
| -rwxr-xr-x | Scripts/Fold/Editor/FoldPipelineBuilder.cs | 12 | ||||
| -rwxr-xr-x | vertex.cginc | 20 | ||||
| -rwxr-xr-x | vertex_deformation.slang | 13 |
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 |
