#ifndef __VERTEX_INC #define __VERTEX_INC #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 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; } { VERTEX_DEFORM_PLANE_TO_TUBE_1_PREAMBLE; VERTEX_DEFORM_PLANE_TO_TUBE_1_POS; } } { 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; } { VERTEX_DEFORM_PLANE_TO_TUBE_1_PREAMBLE; VERTEX_DEFORM_PLANE_TO_TUBE_1_NORM; } } { 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; } } void propagateObjPos(inout v2f i) { i.worldPos = mul(unity_ObjectToWorld, float4(i.objPos, 1)); i.pos = UnityObjectToClipPos(i.objPos); i.eyeVec.xyz = i.worldPos - _WorldSpaceCameraPos; } #endif // __VERTEX_INC