From fcc76b257ef5cfb4514669df3b0144f8e8dd76ef Mon Sep 17 00:00:00 2001 From: yum Date: Fri, 2 Jan 2026 16:21:34 -0800 Subject: Fold: implement dynamic branching in shader Switch from static branching approach using per-op data and fixed execution order to dynamic branching approach using dynamic data. This confers the main benefit of letting us dynamically reorder ops and duplicate them. It also lets us eliminate some of the plumbing tedium whenever we want to add new ops. --- vertex.cginc | 890 +++++++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 615 insertions(+), 275 deletions(-) (limited to 'vertex.cginc') diff --git a/vertex.cginc b/vertex.cginc index acc6d60..ac2c6aa 100644 --- a/vertex.cginc +++ b/vertex.cginc @@ -4,296 +4,636 @@ #include "globals.cginc" #include "vertex_deformation.hlsl" -#define FOO(x) (x) - -#if defined(_VERTEX_DEFORMATION_TUBE_TO_PLANE_0) -#define VERTEX_DEFORM_TUBE_TO_PLANE_0_PREAMBLE \ - float3 p = _Vertex_Deformation_Tube_To_Plane_0_p; \ - float3 r = _Vertex_Deformation_Tube_To_Plane_0_r; \ - float3 s = _Vertex_Deformation_Tube_To_Plane_0_s; \ - float t = _Vertex_Deformation_Tube_To_Plane_0_t -#define VERTEX_DEFORM_TUBE_TO_PLANE_0_POS \ - objPos = tube_to_plane(objPos, p, r, s, t) -#define VERTEX_DEFORM_TUBE_TO_PLANE_0_NORM \ - tube_to_plane_normal(objPos, objNorm, objTan, p, r, s, t) -#else -#define VERTEX_DEFORM_TUBE_TO_PLANE_0_PREAMBLE -#define VERTEX_DEFORM_TUBE_TO_PLANE_0_POS -#define VERTEX_DEFORM_TUBE_TO_PLANE_0_NORM -#endif // VERTEX_DEFORMATION_TUBE_TO_PLANE_0 - -#if defined(_VERTEX_DEFORMATION_AXIS_ALIGN) -#define VERTEX_DEFORM_AXIS_ALIGN_PREAMBLE \ - float3 po = _Vertex_Deformation_Axis_Align_po; \ - float3 pp = _Vertex_Deformation_Axis_Align_pp; \ - float3 r = _Vertex_Deformation_Axis_Align_r; \ - float t = _Vertex_Deformation_Axis_Align_t -#define VERTEX_DEFORM_AXIS_ALIGN_POS \ - objPos = axis_align(objPos, po, pp, r, t) -#define VERTEX_DEFORM_AXIS_ALIGN_NORM \ - axis_align_normal(objPos, objNorm, objTan, po, pp, r, t) -#else -#define VERTEX_DEFORM_AXIS_ALIGN_PREAMBLE -#define VERTEX_DEFORM_AXIS_ALIGN_POS -#define VERTEX_DEFORM_AXIS_ALIGN_NORM -#endif // VERTEX_DEFORMATION_AXIS_ALIGN - -#if defined(_VERTEX_DEFORMATION_TUBE_TO_PLANE_1) -#define VERTEX_DEFORM_TUBE_TO_PLANE_1_PREAMBLE \ - float3 p = _Vertex_Deformation_Tube_To_Plane_1_p; \ - float3 r = _Vertex_Deformation_Tube_To_Plane_1_r; \ - float3 s = _Vertex_Deformation_Tube_To_Plane_1_s; \ - float t = _Vertex_Deformation_Tube_To_Plane_1_t -#define VERTEX_DEFORM_TUBE_TO_PLANE_1_POS \ - objPos = tube_to_plane(objPos, p, r, s, t) -#define VERTEX_DEFORM_TUBE_TO_PLANE_1_NORM \ - tube_to_plane_normal(objPos, objNorm, objTan, p, r, s, t) -#else -#define VERTEX_DEFORM_TUBE_TO_PLANE_1_PREAMBLE -#define VERTEX_DEFORM_TUBE_TO_PLANE_1_POS -#define VERTEX_DEFORM_TUBE_TO_PLANE_1_NORM -#endif // VERTEX_DEFORMATION_TUBE_TO_PLANE_1 - -#if defined(_VERTEX_DEFORMATION_PLANE_TO_TUBE_0) -#define VERTEX_DEFORM_PLANE_TO_TUBE_0_PREAMBLE \ - float3 p = _Vertex_Deformation_Plane_To_Tube_0_p; \ - float3 r = _Vertex_Deformation_Plane_To_Tube_0_r; \ - float3 s = _Vertex_Deformation_Plane_To_Tube_0_s; \ - float t = _Vertex_Deformation_Plane_To_Tube_0_t -#define VERTEX_DEFORM_PLANE_TO_TUBE_0_POS \ - objPos = plane_to_tube(objPos, p, r, s, t) -#define VERTEX_DEFORM_PLANE_TO_TUBE_0_NORM \ - plane_to_tube_normal(objPos, objNorm, objTan, p, r, s, t) -#else -#define VERTEX_DEFORM_PLANE_TO_TUBE_0_PREAMBLE -#define VERTEX_DEFORM_PLANE_TO_TUBE_0_POS -#define VERTEX_DEFORM_PLANE_TO_TUBE_0_NORM -#endif // VERTEX_DEFORMATION_PLANE_TO_TUBE_0 - -#if defined(_VERTEX_DEFORMATION_POINT_ALIGN_0) -#define VERTEX_DEFORM_POINT_ALIGN_0_PREAMBLE \ - float3 po = _Vertex_Deformation_Point_Align_0_po; \ - float3 pp = _Vertex_Deformation_Point_Align_0_pp; \ - float3 r = _Vertex_Deformation_Point_Align_0_r; \ - float t = _Vertex_Deformation_Point_Align_0_t -#define VERTEX_DEFORM_POINT_ALIGN_0_POS \ - objPos = point_align_0(objPos, po, pp, r, t) -#define VERTEX_DEFORM_POINT_ALIGN_0_NORM \ - point_align_normal(objPos, objNorm, objTan, po, pp, r, t) -#else -#define VERTEX_DEFORM_POINT_ALIGN_0_PREAMBLE -#define VERTEX_DEFORM_POINT_ALIGN_0_POS -#define VERTEX_DEFORM_POINT_ALIGN_0_NORM -#endif // VERTEX_DEFORMATION_POINT_ALIGN_0 - -#if defined(_VERTEX_DEFORMATION_POINT_ALIGN_1) -#define VERTEX_DEFORM_POINT_ALIGN_1_PREAMBLE \ - float3 po = _Vertex_Deformation_Point_Align_1_po; \ - float3 pp = _Vertex_Deformation_Point_Align_1_pp; \ - float3 r = _Vertex_Deformation_Point_Align_1_r; \ - float t = _Vertex_Deformation_Point_Align_1_t -#define VERTEX_DEFORM_POINT_ALIGN_1_POS \ - objPos = point_align(objPos, po, pp, r, t) -#define VERTEX_DEFORM_POINT_ALIGN_1_NORM \ - point_align_normal(objPos, objNorm, objTan, po, pp, r, t) -#else -#define VERTEX_DEFORM_POINT_ALIGN_1_PREAMBLE -#define VERTEX_DEFORM_POINT_ALIGN_1_POS -#define VERTEX_DEFORM_POINT_ALIGN_1_NORM -#endif // VERTEX_DEFORMATION_POINT_ALIGN_1 - -#if defined(_VERTEX_DEFORMATION_PLANE_TO_TUBE_1) -#define VERTEX_DEFORM_PLANE_TO_TUBE_1_PREAMBLE \ - float3 p = _Vertex_Deformation_Plane_To_Tube_1_p; \ - float3 r = _Vertex_Deformation_Plane_To_Tube_1_r; \ - float3 s = _Vertex_Deformation_Plane_To_Tube_1_s; \ - float t = _Vertex_Deformation_Plane_To_Tube_1_t -#define VERTEX_DEFORM_PLANE_TO_TUBE_1_POS \ - objPos = plane_to_tube(objPos, p, r, s, t) -#define VERTEX_DEFORM_PLANE_TO_TUBE_1_NORM \ - plane_to_tube_normal(objPos, objNorm, objTan, p, r, s, t) -#else -#define VERTEX_DEFORM_PLANE_TO_TUBE_1_PREAMBLE -#define VERTEX_DEFORM_PLANE_TO_TUBE_1_POS -#define VERTEX_DEFORM_PLANE_TO_TUBE_1_NORM -#endif // VERTEX_DEFORMATION_PLANE_TO_TUBE_1 - -#if defined(_VERTEX_DEFORMATION_NORM_CONVERSION) -#define VERTEX_DEFORM_NORM_CONVERSION_PREAMBLE \ - float t = _Vertex_Deformation_Norm_Conversion_t; \ - float input_k = _Vertex_Deformation_Norm_Conversion_Input_k; \ - float output_k = _Vertex_Deformation_Norm_Conversion_Output_k -#define VERTEX_DEFORM_NORM_CONVERSION_POS \ - objPos = norm_conversion(objPos, input_k, output_k, t) -#define VERTEX_DEFORM_NORM_CONVERSION_NORM \ - norm_conversion_normal(objPos, objNorm, objTan, input_k, output_k, t) -#else -#define VERTEX_DEFORM_NORM_CONVERSION_PREAMBLE -#define VERTEX_DEFORM_NORM_CONVERSION_POS -#define VERTEX_DEFORM_NORM_CONVERSION_NORM -#endif // _VERTEX_DEFORMATION_NORM_CONVERSION - -#if defined(_VERTEX_DEFORMATION_SEAL) -#define VERTEX_DEFORM_SEAL_PREAMBLE \ - float A = _Vertex_Deformation_Seal_A; \ - float k = _Vertex_Deformation_Seal_k; \ - float st = t * _Vertex_Deformation_Seal_t -#define VERTEX_DEFORM_SEAL_POS \ - objPos = seal(objPos, A, k, st) -#define VERTEX_DEFORM_SEAL_NORM \ - seal_normal(objPos, objNorm, objTan, A, k, st) -#else -#define VERTEX_DEFORM_SEAL_PREAMBLE -#define VERTEX_DEFORM_SEAL_POS -#define VERTEX_DEFORM_SEAL_NORM -#endif // _VERTEX_DEFORMATION_SEAL - -#if defined(_VERTEX_DEFORMATION_SINE_WAVES) -#define VERTEX_DEFORM_SINE_WAVES_PREAMBLE \ - float st = t * 10; \ - float3 amplitude = _Vertex_Deformation_Sine_Waves_Amplitude; \ - float3 direction = _Vertex_Deformation_Sine_Waves_Direction; \ - float3 k = _Vertex_Deformation_Sine_Waves_k; \ - float3 omega = _Vertex_Deformation_Sine_Waves_omega -#define VERTEX_DEFORM_SINE_WAVES_POS \ - objPos = sine_wave(objPos, amplitude, direction, k, omega, st) -#define VERTEX_DEFORM_SINE_WAVES_NORM \ - sine_wave_normal(objPos, objNorm, objTan, amplitude, direction, k, omega, st) -#else -#define VERTEX_DEFORM_SINE_WAVES_PREAMBLE -#define VERTEX_DEFORM_SINE_WAVES_POS -#define VERTEX_DEFORM_SINE_WAVES_NORM -#endif // _VERTEX_DEFORMATION_SINE_WAVES - -#if defined(_VERTEX_DEFORMATION_FBM) -#define VERTEX_DEFORM_FBM_PREAMBLE \ - float st = t; \ - float3 amplitude = _Vertex_Deformation_FBM_Amplitude; \ - float gain = _Vertex_Deformation_FBM_Gain; \ - float lacunarity = _Vertex_Deformation_FBM_Lacunarity; \ - float3 period = _Vertex_Deformation_FBM_Period; \ - float octaves = _Vertex_Deformation_FBM_Octaves; \ - float3 velocity = _Vertex_Deformation_FBM_Velocity -#define VERTEX_DEFORM_FBM_POS \ - objPos = fbm(objPos, st, amplitude, gain, lacunarity, period, octaves, velocity) -#define VERTEX_DEFORM_FBM_NORM \ - fbm_normal(objPos, objNorm, objTan, st, amplitude, gain, lacunarity, period, octaves, velocity) -#else -#define VERTEX_DEFORM_FBM_PREAMBLE -#define VERTEX_DEFORM_FBM_POS -#define VERTEX_DEFORM_FBM_NORM -#endif // _VERTEX_DEFORMATION_FBM +#define OPCODE_NONE 0 +#define OPCODE_TUBE_TO_PLANE 1 +#define OPCODE_PLANE_TO_TUBE 2 +#define OPCODE_POINT_ALIGN 3 +#define OPCODE_AXIS_ALIGN 4 +#define OPCODE_NORM_CONVERSION 5 +#define OPCODE_SEAL 6 +#define OPCODE_SINE_WAVES 7 +#define OPCODE_FBM 8 + +#if defined(_VERTEX_DEFORMATION) + +void apply_tube_to_plane(inout float3 objPos, float4 v0, float4 v1, float4 v2, float f0) { + float3 p = v0.xyz; + float3 r = v1.xyz; + float3 s = v2.xyz; + float t = f0; + objPos = tube_to_plane(objPos, p, r, s, t); +} + +void apply_tube_to_plane_normal(inout float3 objPos, inout float3 objNorm, inout float3 objTan, float4 v0, float4 v1, float4 v2, float f0) { + float3 p = v0.xyz; + float3 r = v1.xyz; + float3 s = v2.xyz; + float t = f0; + tube_to_plane_normal(objPos, objNorm, objTan, p, r, s, t); +} + +void apply_plane_to_tube(inout float3 objPos, float4 v0, float4 v1, float4 v2, float f0) { + float3 p = v0.xyz; + float3 r = v1.xyz; + float3 s = v2.xyz; + float t = f0; + objPos = plane_to_tube(objPos, p, r, s, t); +} + +void apply_plane_to_tube_normal(inout float3 objPos, inout float3 objNorm, inout float3 objTan, float4 v0, float4 v1, float4 v2, float f0) { + float3 p = v0.xyz; + float3 r = v1.xyz; + float3 s = v2.xyz; + float t = f0; + plane_to_tube_normal(objPos, objNorm, objTan, p, r, s, t); +} + +void apply_point_align(inout float3 objPos, float4 v0, float4 v1, float4 v2, float f0) { + float3 po = v0.xyz; + float3 pp = v1.xyz; + float3 r = v2.xyz; + float t = f0; + objPos = point_align(objPos, po, pp, r, t); +} + +void apply_point_align_normal(inout float3 objPos, inout float3 objNorm, inout float3 objTan, float4 v0, float4 v1, float4 v2, float f0) { + float3 po = v0.xyz; + float3 pp = v1.xyz; + float3 r = v2.xyz; + float t = f0; + point_align_normal(objPos, objNorm, objTan, po, pp, r, t); +} + +void apply_axis_align(inout float3 objPos, float4 v0, float4 v1, float4 v2, float f0) { + float3 po = v0.xyz; + float3 pp = v1.xyz; + float3 r = v2.xyz; + float t = f0; + objPos = axis_align(objPos, po, pp, r, t); +} + +void apply_axis_align_normal(inout float3 objPos, inout float3 objNorm, inout float3 objTan, float4 v0, float4 v1, float4 v2, float f0) { + float3 po = v0.xyz; + float3 pp = v1.xyz; + float3 r = v2.xyz; + float t = f0; + axis_align_normal(objPos, objNorm, objTan, po, pp, r, t); +} + +void apply_norm_conversion(inout float3 objPos, float f0, float f1, float f2) { + float input_k = f0; + float output_k = f1; + float t = f2; + objPos = norm_conversion(objPos, input_k, output_k, t); +} + +void apply_norm_conversion_normal(inout float3 objPos, inout float3 objNorm, inout float3 objTan, float f0, float f1, float f2) { + float input_k = f0; + float output_k = f1; + float t = f2; + norm_conversion_normal(objPos, objNorm, objTan, input_k, output_k, t); +} + +void apply_seal(inout float3 objPos, float f0, float f1, float f2, float t) { + float A = f0; + float k = f1; + float st = t * f2; + objPos = seal(objPos, A, k, st); +} + +void apply_seal_normal(inout float3 objPos, inout float3 objNorm, inout float3 objTan, float f0, float f1, float f2, float t) { + float A = f0; + float k = f1; + float st = t * f2; + seal_normal(objPos, objNorm, objTan, A, k, st); +} + +void apply_sine_waves(inout float3 objPos, float4 v0, float4 v1, float4 v2, float4 v3, float t) { + float st = t * 10; + float3 amplitude = v0.xyz; + float3 direction = v1.xyz; + float3 k = v2.xyz; + float3 omega = v3.xyz; + objPos = sine_wave(objPos, amplitude, direction, k, omega, st); +} + +void apply_sine_waves_normal(inout float3 objPos, inout float3 objNorm, inout float3 objTan, float4 v0, float4 v1, float4 v2, float4 v3, float t) { + float st = t * 10; + float3 amplitude = v0.xyz; + float3 direction = v1.xyz; + float3 k = v2.xyz; + float3 omega = v3.xyz; + sine_wave_normal(objPos, objNorm, objTan, amplitude, direction, k, omega, st); +} + +void apply_fbm(inout float3 objPos, float4 v0, float4 v1, float4 v2, float f0, float f1, float f2, float t) { + float st = t; + float3 amplitude = v0.xyz; + float3 velocity = v1.xyz; + float3 period = v2.xyz; + float gain = f0; + float lacunarity = f1; + float octaves = f2; + objPos = fbm(objPos, st, amplitude, gain, lacunarity, period, octaves, velocity); +} + +void apply_fbm_normal(inout float3 objPos, inout float3 objNorm, inout float3 objTan, float4 v0, float4 v1, float4 v2, float f0, float f1, float f2, float t) { + float st = t; + float3 amplitude = v0.xyz; + float3 velocity = v1.xyz; + float3 period = v2.xyz; + float gain = f0; + float lacunarity = f1; + float octaves = f2; + fbm_normal(objPos, objNorm, objTan, st, amplitude, gain, lacunarity, period, octaves, velocity); +} void deform(inout float3 objPos) { const float t = getTime(); - // Tube to plane. - { - { - VERTEX_DEFORM_TUBE_TO_PLANE_0_PREAMBLE; - VERTEX_DEFORM_TUBE_TO_PLANE_0_POS; - } - { - VERTEX_DEFORM_AXIS_ALIGN_PREAMBLE; - VERTEX_DEFORM_AXIS_ALIGN_POS; - } - { - VERTEX_DEFORM_TUBE_TO_PLANE_1_PREAMBLE; - VERTEX_DEFORM_TUBE_TO_PLANE_1_POS; - } - } - // Here we're a plane. - { - VERTEX_DEFORM_FBM_PREAMBLE; - VERTEX_DEFORM_FBM_POS; - } - // Plane to tube. - { - { - VERTEX_DEFORM_POINT_ALIGN_0_PREAMBLE; - VERTEX_DEFORM_POINT_ALIGN_0_POS; - } - { - VERTEX_DEFORM_PLANE_TO_TUBE_0_PREAMBLE; - VERTEX_DEFORM_PLANE_TO_TUBE_0_POS; - } - { - VERTEX_DEFORM_POINT_ALIGN_1_PREAMBLE; - VERTEX_DEFORM_POINT_ALIGN_1_POS; + + [loop] + for (int i = 0; i < 16; i++) { + float enabled; + int opcode; + float f0, f1, f2, f3; + float4 v0, v1, v2, v3; + + [forcecase] + switch (i) { + case 0: + enabled = _Vertex_Deformation_Slot_0_Enabled; + opcode = _Vertex_Deformation_Slot_0_Opcode; + f0 = _Vertex_Deformation_Slot_0_Float_0; + f1 = _Vertex_Deformation_Slot_0_Float_1; + f2 = _Vertex_Deformation_Slot_0_Float_2; + f3 = _Vertex_Deformation_Slot_0_Float_3; + v0 = _Vertex_Deformation_Slot_0_Vector_0; + v1 = _Vertex_Deformation_Slot_0_Vector_1; + v2 = _Vertex_Deformation_Slot_0_Vector_2; + v3 = _Vertex_Deformation_Slot_0_Vector_3; + break; + case 1: + enabled = _Vertex_Deformation_Slot_1_Enabled; + opcode = _Vertex_Deformation_Slot_1_Opcode; + f0 = _Vertex_Deformation_Slot_1_Float_0; + f1 = _Vertex_Deformation_Slot_1_Float_1; + f2 = _Vertex_Deformation_Slot_1_Float_2; + f3 = _Vertex_Deformation_Slot_1_Float_3; + v0 = _Vertex_Deformation_Slot_1_Vector_0; + v1 = _Vertex_Deformation_Slot_1_Vector_1; + v2 = _Vertex_Deformation_Slot_1_Vector_2; + v3 = _Vertex_Deformation_Slot_1_Vector_3; + break; + case 2: + enabled = _Vertex_Deformation_Slot_2_Enabled; + opcode = _Vertex_Deformation_Slot_2_Opcode; + f0 = _Vertex_Deformation_Slot_2_Float_0; + f1 = _Vertex_Deformation_Slot_2_Float_1; + f2 = _Vertex_Deformation_Slot_2_Float_2; + f3 = _Vertex_Deformation_Slot_2_Float_3; + v0 = _Vertex_Deformation_Slot_2_Vector_0; + v1 = _Vertex_Deformation_Slot_2_Vector_1; + v2 = _Vertex_Deformation_Slot_2_Vector_2; + v3 = _Vertex_Deformation_Slot_2_Vector_3; + break; + case 3: + enabled = _Vertex_Deformation_Slot_3_Enabled; + opcode = _Vertex_Deformation_Slot_3_Opcode; + f0 = _Vertex_Deformation_Slot_3_Float_0; + f1 = _Vertex_Deformation_Slot_3_Float_1; + f2 = _Vertex_Deformation_Slot_3_Float_2; + f3 = _Vertex_Deformation_Slot_3_Float_3; + v0 = _Vertex_Deformation_Slot_3_Vector_0; + v1 = _Vertex_Deformation_Slot_3_Vector_1; + v2 = _Vertex_Deformation_Slot_3_Vector_2; + v3 = _Vertex_Deformation_Slot_3_Vector_3; + break; + case 4: + enabled = _Vertex_Deformation_Slot_4_Enabled; + opcode = _Vertex_Deformation_Slot_4_Opcode; + f0 = _Vertex_Deformation_Slot_4_Float_0; + f1 = _Vertex_Deformation_Slot_4_Float_1; + f2 = _Vertex_Deformation_Slot_4_Float_2; + f3 = _Vertex_Deformation_Slot_4_Float_3; + v0 = _Vertex_Deformation_Slot_4_Vector_0; + v1 = _Vertex_Deformation_Slot_4_Vector_1; + v2 = _Vertex_Deformation_Slot_4_Vector_2; + v3 = _Vertex_Deformation_Slot_4_Vector_3; + break; + case 5: + enabled = _Vertex_Deformation_Slot_5_Enabled; + opcode = _Vertex_Deformation_Slot_5_Opcode; + f0 = _Vertex_Deformation_Slot_5_Float_0; + f1 = _Vertex_Deformation_Slot_5_Float_1; + f2 = _Vertex_Deformation_Slot_5_Float_2; + f3 = _Vertex_Deformation_Slot_5_Float_3; + v0 = _Vertex_Deformation_Slot_5_Vector_0; + v1 = _Vertex_Deformation_Slot_5_Vector_1; + v2 = _Vertex_Deformation_Slot_5_Vector_2; + v3 = _Vertex_Deformation_Slot_5_Vector_3; + break; + case 6: + enabled = _Vertex_Deformation_Slot_6_Enabled; + opcode = _Vertex_Deformation_Slot_6_Opcode; + f0 = _Vertex_Deformation_Slot_6_Float_0; + f1 = _Vertex_Deformation_Slot_6_Float_1; + f2 = _Vertex_Deformation_Slot_6_Float_2; + f3 = _Vertex_Deformation_Slot_6_Float_3; + v0 = _Vertex_Deformation_Slot_6_Vector_0; + v1 = _Vertex_Deformation_Slot_6_Vector_1; + v2 = _Vertex_Deformation_Slot_6_Vector_2; + v3 = _Vertex_Deformation_Slot_6_Vector_3; + break; + case 7: + enabled = _Vertex_Deformation_Slot_7_Enabled; + opcode = _Vertex_Deformation_Slot_7_Opcode; + f0 = _Vertex_Deformation_Slot_7_Float_0; + f1 = _Vertex_Deformation_Slot_7_Float_1; + f2 = _Vertex_Deformation_Slot_7_Float_2; + f3 = _Vertex_Deformation_Slot_7_Float_3; + v0 = _Vertex_Deformation_Slot_7_Vector_0; + v1 = _Vertex_Deformation_Slot_7_Vector_1; + v2 = _Vertex_Deformation_Slot_7_Vector_2; + v3 = _Vertex_Deformation_Slot_7_Vector_3; + break; + case 8: + enabled = _Vertex_Deformation_Slot_8_Enabled; + opcode = _Vertex_Deformation_Slot_8_Opcode; + f0 = _Vertex_Deformation_Slot_8_Float_0; + f1 = _Vertex_Deformation_Slot_8_Float_1; + f2 = _Vertex_Deformation_Slot_8_Float_2; + f3 = _Vertex_Deformation_Slot_8_Float_3; + v0 = _Vertex_Deformation_Slot_8_Vector_0; + v1 = _Vertex_Deformation_Slot_8_Vector_1; + v2 = _Vertex_Deformation_Slot_8_Vector_2; + v3 = _Vertex_Deformation_Slot_8_Vector_3; + break; + case 9: + enabled = _Vertex_Deformation_Slot_9_Enabled; + opcode = _Vertex_Deformation_Slot_9_Opcode; + f0 = _Vertex_Deformation_Slot_9_Float_0; + f1 = _Vertex_Deformation_Slot_9_Float_1; + f2 = _Vertex_Deformation_Slot_9_Float_2; + f3 = _Vertex_Deformation_Slot_9_Float_3; + v0 = _Vertex_Deformation_Slot_9_Vector_0; + v1 = _Vertex_Deformation_Slot_9_Vector_1; + v2 = _Vertex_Deformation_Slot_9_Vector_2; + v3 = _Vertex_Deformation_Slot_9_Vector_3; + break; + case 10: + enabled = _Vertex_Deformation_Slot_10_Enabled; + opcode = _Vertex_Deformation_Slot_10_Opcode; + f0 = _Vertex_Deformation_Slot_10_Float_0; + f1 = _Vertex_Deformation_Slot_10_Float_1; + f2 = _Vertex_Deformation_Slot_10_Float_2; + f3 = _Vertex_Deformation_Slot_10_Float_3; + v0 = _Vertex_Deformation_Slot_10_Vector_0; + v1 = _Vertex_Deformation_Slot_10_Vector_1; + v2 = _Vertex_Deformation_Slot_10_Vector_2; + v3 = _Vertex_Deformation_Slot_10_Vector_3; + break; + case 11: + enabled = _Vertex_Deformation_Slot_11_Enabled; + opcode = _Vertex_Deformation_Slot_11_Opcode; + f0 = _Vertex_Deformation_Slot_11_Float_0; + f1 = _Vertex_Deformation_Slot_11_Float_1; + f2 = _Vertex_Deformation_Slot_11_Float_2; + f3 = _Vertex_Deformation_Slot_11_Float_3; + v0 = _Vertex_Deformation_Slot_11_Vector_0; + v1 = _Vertex_Deformation_Slot_11_Vector_1; + v2 = _Vertex_Deformation_Slot_11_Vector_2; + v3 = _Vertex_Deformation_Slot_11_Vector_3; + break; + case 12: + enabled = _Vertex_Deformation_Slot_12_Enabled; + opcode = _Vertex_Deformation_Slot_12_Opcode; + f0 = _Vertex_Deformation_Slot_12_Float_0; + f1 = _Vertex_Deformation_Slot_12_Float_1; + f2 = _Vertex_Deformation_Slot_12_Float_2; + f3 = _Vertex_Deformation_Slot_12_Float_3; + v0 = _Vertex_Deformation_Slot_12_Vector_0; + v1 = _Vertex_Deformation_Slot_12_Vector_1; + v2 = _Vertex_Deformation_Slot_12_Vector_2; + v3 = _Vertex_Deformation_Slot_12_Vector_3; + break; + case 13: + enabled = _Vertex_Deformation_Slot_13_Enabled; + opcode = _Vertex_Deformation_Slot_13_Opcode; + f0 = _Vertex_Deformation_Slot_13_Float_0; + f1 = _Vertex_Deformation_Slot_13_Float_1; + f2 = _Vertex_Deformation_Slot_13_Float_2; + f3 = _Vertex_Deformation_Slot_13_Float_3; + v0 = _Vertex_Deformation_Slot_13_Vector_0; + v1 = _Vertex_Deformation_Slot_13_Vector_1; + v2 = _Vertex_Deformation_Slot_13_Vector_2; + v3 = _Vertex_Deformation_Slot_13_Vector_3; + break; + case 14: + enabled = _Vertex_Deformation_Slot_14_Enabled; + opcode = _Vertex_Deformation_Slot_14_Opcode; + f0 = _Vertex_Deformation_Slot_14_Float_0; + f1 = _Vertex_Deformation_Slot_14_Float_1; + f2 = _Vertex_Deformation_Slot_14_Float_2; + f3 = _Vertex_Deformation_Slot_14_Float_3; + v0 = _Vertex_Deformation_Slot_14_Vector_0; + v1 = _Vertex_Deformation_Slot_14_Vector_1; + v2 = _Vertex_Deformation_Slot_14_Vector_2; + v3 = _Vertex_Deformation_Slot_14_Vector_3; + break; + case 15: + enabled = _Vertex_Deformation_Slot_15_Enabled; + opcode = _Vertex_Deformation_Slot_15_Opcode; + f0 = _Vertex_Deformation_Slot_15_Float_0; + f1 = _Vertex_Deformation_Slot_15_Float_1; + f2 = _Vertex_Deformation_Slot_15_Float_2; + f3 = _Vertex_Deformation_Slot_15_Float_3; + v0 = _Vertex_Deformation_Slot_15_Vector_0; + v1 = _Vertex_Deformation_Slot_15_Vector_1; + v2 = _Vertex_Deformation_Slot_15_Vector_2; + v3 = _Vertex_Deformation_Slot_15_Vector_3; + break; } - { - VERTEX_DEFORM_PLANE_TO_TUBE_1_PREAMBLE; - VERTEX_DEFORM_PLANE_TO_TUBE_1_POS; + + if (enabled > 0.5) { + switch (opcode) { + case OPCODE_TUBE_TO_PLANE: + apply_tube_to_plane(objPos, v0, v1, v2, f0); + break; + case OPCODE_PLANE_TO_TUBE: + apply_plane_to_tube(objPos, v0, v1, v2, f0); + break; + case OPCODE_POINT_ALIGN: + apply_point_align(objPos, v0, v1, v2, f0); + break; + case OPCODE_AXIS_ALIGN: + apply_axis_align(objPos, v0, v1, v2, f0); + break; + case OPCODE_NORM_CONVERSION: + apply_norm_conversion(objPos, f0, f1, f2); + break; + case OPCODE_SEAL: + apply_seal(objPos, f0, f1, f2, t); + break; + case OPCODE_SINE_WAVES: + apply_sine_waves(objPos, v0, v1, v2, v3, t); + break; + case OPCODE_FBM: + apply_fbm(objPos, v0, v1, v2, f0, f1, f2, t); + break; + } } } - { - VERTEX_DEFORM_NORM_CONVERSION_PREAMBLE; - VERTEX_DEFORM_NORM_CONVERSION_POS; - } - { - VERTEX_DEFORM_SEAL_PREAMBLE; - VERTEX_DEFORM_SEAL_POS; - } - { - VERTEX_DEFORM_SINE_WAVES_PREAMBLE; - VERTEX_DEFORM_SINE_WAVES_POS; - } } void deform_normal(inout float3 objPos, inout float3 objNorm, inout float3 objTan) { const float t = getTime(); - // Tube to plane. - { - { - VERTEX_DEFORM_TUBE_TO_PLANE_0_PREAMBLE; - VERTEX_DEFORM_TUBE_TO_PLANE_0_NORM; - } - { - VERTEX_DEFORM_AXIS_ALIGN_PREAMBLE; - VERTEX_DEFORM_AXIS_ALIGN_NORM; - } - { - VERTEX_DEFORM_TUBE_TO_PLANE_1_PREAMBLE; - VERTEX_DEFORM_TUBE_TO_PLANE_1_NORM; - } - } - // Here we're a plane. - { - VERTEX_DEFORM_FBM_PREAMBLE; - VERTEX_DEFORM_FBM_NORM; - } - // Plane to tube. - { - { - VERTEX_DEFORM_POINT_ALIGN_0_PREAMBLE; - VERTEX_DEFORM_POINT_ALIGN_0_NORM; - } - { - VERTEX_DEFORM_PLANE_TO_TUBE_0_PREAMBLE; - VERTEX_DEFORM_PLANE_TO_TUBE_0_NORM; - } - { - VERTEX_DEFORM_POINT_ALIGN_1_PREAMBLE; - VERTEX_DEFORM_POINT_ALIGN_1_NORM; + + [loop] + for (int i = 0; i < 16; i++) { + float enabled; + int opcode; + float f0, f1, f2, f3; + float4 v0, v1, v2, v3; + + [forcecase] + switch (i) { + case 0: + enabled = _Vertex_Deformation_Slot_0_Enabled; + opcode = _Vertex_Deformation_Slot_0_Opcode; + f0 = _Vertex_Deformation_Slot_0_Float_0; + f1 = _Vertex_Deformation_Slot_0_Float_1; + f2 = _Vertex_Deformation_Slot_0_Float_2; + f3 = _Vertex_Deformation_Slot_0_Float_3; + v0 = _Vertex_Deformation_Slot_0_Vector_0; + v1 = _Vertex_Deformation_Slot_0_Vector_1; + v2 = _Vertex_Deformation_Slot_0_Vector_2; + v3 = _Vertex_Deformation_Slot_0_Vector_3; + break; + case 1: + enabled = _Vertex_Deformation_Slot_1_Enabled; + opcode = _Vertex_Deformation_Slot_1_Opcode; + f0 = _Vertex_Deformation_Slot_1_Float_0; + f1 = _Vertex_Deformation_Slot_1_Float_1; + f2 = _Vertex_Deformation_Slot_1_Float_2; + f3 = _Vertex_Deformation_Slot_1_Float_3; + v0 = _Vertex_Deformation_Slot_1_Vector_0; + v1 = _Vertex_Deformation_Slot_1_Vector_1; + v2 = _Vertex_Deformation_Slot_1_Vector_2; + v3 = _Vertex_Deformation_Slot_1_Vector_3; + break; + case 2: + enabled = _Vertex_Deformation_Slot_2_Enabled; + opcode = _Vertex_Deformation_Slot_2_Opcode; + f0 = _Vertex_Deformation_Slot_2_Float_0; + f1 = _Vertex_Deformation_Slot_2_Float_1; + f2 = _Vertex_Deformation_Slot_2_Float_2; + f3 = _Vertex_Deformation_Slot_2_Float_3; + v0 = _Vertex_Deformation_Slot_2_Vector_0; + v1 = _Vertex_Deformation_Slot_2_Vector_1; + v2 = _Vertex_Deformation_Slot_2_Vector_2; + v3 = _Vertex_Deformation_Slot_2_Vector_3; + break; + case 3: + enabled = _Vertex_Deformation_Slot_3_Enabled; + opcode = _Vertex_Deformation_Slot_3_Opcode; + f0 = _Vertex_Deformation_Slot_3_Float_0; + f1 = _Vertex_Deformation_Slot_3_Float_1; + f2 = _Vertex_Deformation_Slot_3_Float_2; + f3 = _Vertex_Deformation_Slot_3_Float_3; + v0 = _Vertex_Deformation_Slot_3_Vector_0; + v1 = _Vertex_Deformation_Slot_3_Vector_1; + v2 = _Vertex_Deformation_Slot_3_Vector_2; + v3 = _Vertex_Deformation_Slot_3_Vector_3; + break; + case 4: + enabled = _Vertex_Deformation_Slot_4_Enabled; + opcode = _Vertex_Deformation_Slot_4_Opcode; + f0 = _Vertex_Deformation_Slot_4_Float_0; + f1 = _Vertex_Deformation_Slot_4_Float_1; + f2 = _Vertex_Deformation_Slot_4_Float_2; + f3 = _Vertex_Deformation_Slot_4_Float_3; + v0 = _Vertex_Deformation_Slot_4_Vector_0; + v1 = _Vertex_Deformation_Slot_4_Vector_1; + v2 = _Vertex_Deformation_Slot_4_Vector_2; + v3 = _Vertex_Deformation_Slot_4_Vector_3; + break; + case 5: + enabled = _Vertex_Deformation_Slot_5_Enabled; + opcode = _Vertex_Deformation_Slot_5_Opcode; + f0 = _Vertex_Deformation_Slot_5_Float_0; + f1 = _Vertex_Deformation_Slot_5_Float_1; + f2 = _Vertex_Deformation_Slot_5_Float_2; + f3 = _Vertex_Deformation_Slot_5_Float_3; + v0 = _Vertex_Deformation_Slot_5_Vector_0; + v1 = _Vertex_Deformation_Slot_5_Vector_1; + v2 = _Vertex_Deformation_Slot_5_Vector_2; + v3 = _Vertex_Deformation_Slot_5_Vector_3; + break; + case 6: + enabled = _Vertex_Deformation_Slot_6_Enabled; + opcode = _Vertex_Deformation_Slot_6_Opcode; + f0 = _Vertex_Deformation_Slot_6_Float_0; + f1 = _Vertex_Deformation_Slot_6_Float_1; + f2 = _Vertex_Deformation_Slot_6_Float_2; + f3 = _Vertex_Deformation_Slot_6_Float_3; + v0 = _Vertex_Deformation_Slot_6_Vector_0; + v1 = _Vertex_Deformation_Slot_6_Vector_1; + v2 = _Vertex_Deformation_Slot_6_Vector_2; + v3 = _Vertex_Deformation_Slot_6_Vector_3; + break; + case 7: + enabled = _Vertex_Deformation_Slot_7_Enabled; + opcode = _Vertex_Deformation_Slot_7_Opcode; + f0 = _Vertex_Deformation_Slot_7_Float_0; + f1 = _Vertex_Deformation_Slot_7_Float_1; + f2 = _Vertex_Deformation_Slot_7_Float_2; + f3 = _Vertex_Deformation_Slot_7_Float_3; + v0 = _Vertex_Deformation_Slot_7_Vector_0; + v1 = _Vertex_Deformation_Slot_7_Vector_1; + v2 = _Vertex_Deformation_Slot_7_Vector_2; + v3 = _Vertex_Deformation_Slot_7_Vector_3; + break; + case 8: + enabled = _Vertex_Deformation_Slot_8_Enabled; + opcode = _Vertex_Deformation_Slot_8_Opcode; + f0 = _Vertex_Deformation_Slot_8_Float_0; + f1 = _Vertex_Deformation_Slot_8_Float_1; + f2 = _Vertex_Deformation_Slot_8_Float_2; + f3 = _Vertex_Deformation_Slot_8_Float_3; + v0 = _Vertex_Deformation_Slot_8_Vector_0; + v1 = _Vertex_Deformation_Slot_8_Vector_1; + v2 = _Vertex_Deformation_Slot_8_Vector_2; + v3 = _Vertex_Deformation_Slot_8_Vector_3; + break; + case 9: + enabled = _Vertex_Deformation_Slot_9_Enabled; + opcode = _Vertex_Deformation_Slot_9_Opcode; + f0 = _Vertex_Deformation_Slot_9_Float_0; + f1 = _Vertex_Deformation_Slot_9_Float_1; + f2 = _Vertex_Deformation_Slot_9_Float_2; + f3 = _Vertex_Deformation_Slot_9_Float_3; + v0 = _Vertex_Deformation_Slot_9_Vector_0; + v1 = _Vertex_Deformation_Slot_9_Vector_1; + v2 = _Vertex_Deformation_Slot_9_Vector_2; + v3 = _Vertex_Deformation_Slot_9_Vector_3; + break; + case 10: + enabled = _Vertex_Deformation_Slot_10_Enabled; + opcode = _Vertex_Deformation_Slot_10_Opcode; + f0 = _Vertex_Deformation_Slot_10_Float_0; + f1 = _Vertex_Deformation_Slot_10_Float_1; + f2 = _Vertex_Deformation_Slot_10_Float_2; + f3 = _Vertex_Deformation_Slot_10_Float_3; + v0 = _Vertex_Deformation_Slot_10_Vector_0; + v1 = _Vertex_Deformation_Slot_10_Vector_1; + v2 = _Vertex_Deformation_Slot_10_Vector_2; + v3 = _Vertex_Deformation_Slot_10_Vector_3; + break; + case 11: + enabled = _Vertex_Deformation_Slot_11_Enabled; + opcode = _Vertex_Deformation_Slot_11_Opcode; + f0 = _Vertex_Deformation_Slot_11_Float_0; + f1 = _Vertex_Deformation_Slot_11_Float_1; + f2 = _Vertex_Deformation_Slot_11_Float_2; + f3 = _Vertex_Deformation_Slot_11_Float_3; + v0 = _Vertex_Deformation_Slot_11_Vector_0; + v1 = _Vertex_Deformation_Slot_11_Vector_1; + v2 = _Vertex_Deformation_Slot_11_Vector_2; + v3 = _Vertex_Deformation_Slot_11_Vector_3; + break; + case 12: + enabled = _Vertex_Deformation_Slot_12_Enabled; + opcode = _Vertex_Deformation_Slot_12_Opcode; + f0 = _Vertex_Deformation_Slot_12_Float_0; + f1 = _Vertex_Deformation_Slot_12_Float_1; + f2 = _Vertex_Deformation_Slot_12_Float_2; + f3 = _Vertex_Deformation_Slot_12_Float_3; + v0 = _Vertex_Deformation_Slot_12_Vector_0; + v1 = _Vertex_Deformation_Slot_12_Vector_1; + v2 = _Vertex_Deformation_Slot_12_Vector_2; + v3 = _Vertex_Deformation_Slot_12_Vector_3; + break; + case 13: + enabled = _Vertex_Deformation_Slot_13_Enabled; + opcode = _Vertex_Deformation_Slot_13_Opcode; + f0 = _Vertex_Deformation_Slot_13_Float_0; + f1 = _Vertex_Deformation_Slot_13_Float_1; + f2 = _Vertex_Deformation_Slot_13_Float_2; + f3 = _Vertex_Deformation_Slot_13_Float_3; + v0 = _Vertex_Deformation_Slot_13_Vector_0; + v1 = _Vertex_Deformation_Slot_13_Vector_1; + v2 = _Vertex_Deformation_Slot_13_Vector_2; + v3 = _Vertex_Deformation_Slot_13_Vector_3; + break; + case 14: + enabled = _Vertex_Deformation_Slot_14_Enabled; + opcode = _Vertex_Deformation_Slot_14_Opcode; + f0 = _Vertex_Deformation_Slot_14_Float_0; + f1 = _Vertex_Deformation_Slot_14_Float_1; + f2 = _Vertex_Deformation_Slot_14_Float_2; + f3 = _Vertex_Deformation_Slot_14_Float_3; + v0 = _Vertex_Deformation_Slot_14_Vector_0; + v1 = _Vertex_Deformation_Slot_14_Vector_1; + v2 = _Vertex_Deformation_Slot_14_Vector_2; + v3 = _Vertex_Deformation_Slot_14_Vector_3; + break; + case 15: + enabled = _Vertex_Deformation_Slot_15_Enabled; + opcode = _Vertex_Deformation_Slot_15_Opcode; + f0 = _Vertex_Deformation_Slot_15_Float_0; + f1 = _Vertex_Deformation_Slot_15_Float_1; + f2 = _Vertex_Deformation_Slot_15_Float_2; + f3 = _Vertex_Deformation_Slot_15_Float_3; + v0 = _Vertex_Deformation_Slot_15_Vector_0; + v1 = _Vertex_Deformation_Slot_15_Vector_1; + v2 = _Vertex_Deformation_Slot_15_Vector_2; + v3 = _Vertex_Deformation_Slot_15_Vector_3; + break; } - { - VERTEX_DEFORM_PLANE_TO_TUBE_1_PREAMBLE; - VERTEX_DEFORM_PLANE_TO_TUBE_1_NORM; + + [branch] + if (enabled > 0.5) { + [forcecase] + switch (opcode) { + case OPCODE_TUBE_TO_PLANE: + apply_tube_to_plane_normal(objPos, objNorm, objTan, v0, v1, v2, f0); + break; + case OPCODE_PLANE_TO_TUBE: + apply_plane_to_tube_normal(objPos, objNorm, objTan, v0, v1, v2, f0); + break; + case OPCODE_POINT_ALIGN: + apply_point_align_normal(objPos, objNorm, objTan, v0, v1, v2, f0); + break; + case OPCODE_AXIS_ALIGN: + apply_axis_align_normal(objPos, objNorm, objTan, v0, v1, v2, f0); + break; + case OPCODE_NORM_CONVERSION: + apply_norm_conversion_normal(objPos, objNorm, objTan, f0, f1, f2); + break; + case OPCODE_SEAL: + apply_seal_normal(objPos, objNorm, objTan, f0, f1, f2, t); + break; + case OPCODE_SINE_WAVES: + apply_sine_waves_normal(objPos, objNorm, objTan, v0, v1, v2, v3, t); + break; + case OPCODE_FBM: + apply_fbm_normal(objPos, objNorm, objTan, v0, v1, v2, f0, f1, f2, t); + break; + } } } - { - VERTEX_DEFORM_NORM_CONVERSION_PREAMBLE; - VERTEX_DEFORM_NORM_CONVERSION_NORM; - } - { - VERTEX_DEFORM_SEAL_PREAMBLE; - VERTEX_DEFORM_SEAL_NORM; - } - { - VERTEX_DEFORM_SINE_WAVES_PREAMBLE; - VERTEX_DEFORM_SINE_WAVES_NORM; - } } +#else + +void deform(inout float3 objPos) { +} + +void deform_normal(inout float3 objPos, inout float3 objNorm, inout float3 objTan) { +} + +#endif // _VERTEX_DEFORMATION + void propagateObjPos(inout v2f i) { i.worldPos = mul(unity_ObjectToWorld, float4(i.objPos, 1)); i.pos = UnityObjectToClipPos(i.objPos); -- cgit v1.2.3