// AUTOGENERATED COPYRIGHT HEADER START // Copyright (C) 2021 Radegast Stravinsky // Copyright (C) 2023 Michael Fabian 'Xaymar' Dirks // AUTOGENERATED COPYRIGHT HEADER END // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // 1. Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright notice, // this list of conditions and the following disclaimer in the documentation // and/or other materials provided with the distribution. // 3. Neither the name of the copyright holder nor the names of its contributors // may be used to endorse or promote products derived from this software // without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. #include "../base.effect" //----------------------------------------------------------------------------- // Uniforms //----------------------------------------------------------------------------- // Provided by StreamFX uniform float4 Time< bool automatic = true; >; uniform float4 ViewSize< bool automatic = true; >; uniform texture2d InputA< bool automatic = true; >; uniform float2 coordinates< string name = "Coordinates (X, Y)"; string description = "Determines the center of the effect."; string field_type = "slider"; float2 step = {0.01, 0.01}; float2 minimum = {0.0, 0.0}; float2 maximum = {1.0, 1.0}; > = {0.5, 0.5}; uniform float angle< string name = "Angle"; string description = "The angle in degrees to twist the image."; string field_type = "slider"; float minimum = -1800.0; float maximum = 1800.0; > = 270.0; uniform int mode< string name = "Zigzag Type"; string description = "The zigzag distortion type to use."; string field_type = "enum"; // Enumeration int enum = 2; int enum_0 = 0; string enum_0_name = "Around Center"; int enum_1 = 1; string enum_1_name = "Out From Center"; > = 0; uniform float amplitude< string name = "Amplitude"; string description = "Adjusts the amplitude of the wave."; string field_type = "slider"; float minimum = -5.0; float maximum = 5.0; > = 0.25; uniform float period< string name = "Period"; string description = "The frequency at which the wave oscillation occurs."; string field_type = "slider"; float minimum = 0.0; float maximum = 10.0; > = 0.5; uniform float phase< string name = "Phase"; string description = "Adjusts the phase of the wave."; string field_type = "slider"; float minimum = -1.0; float maximum = 1.0; > = 0.0; uniform float radius< string name = "Radius"; string description = "The radius of the effect."; string field_type = "slider"; float step = 0.01; float minimum = 0.0; float maximum = 1.0; > = 0.5; uniform float tension< string name = "Tension"; string description = "Controls how rapidly the distortion reaches the maximum value."; string field_type = "slider"; float step = 0.01; float minimum = 0.0; float maximum = 10.0; > = 1.0; uniform float aspect_ratio< string name = "Aspect Ratio"; string description = "Adjusts the aspect ratio for the associated distortion."; string field_type = "slider"; float step = 0.01; float minimum = -1; float maximum = 1; > = 0.0; uniform int animate< string name = "Animate By"; string description = "Animates the wave distortion by one of the parameters."; string field_type = "enum"; // Enumeration int enum = 3; int enum_0 = 0; string enum_0_name = "None"; int enum_1 = 1; string enum_1_name = "Amplitude"; int enum_2 = 2; string enum_2_name = "Phase"; > = 0; uniform bool inverse_angle< string name = "Use Inverse Angle"; string description = "Inverts the angle, making the edges more distorted than the center."; > = false; //----------------------------------------------------------------------------- // Structs //----------------------------------------------------------------------------- struct VertexData { float4 pos : POSITION; float2 uv : TEXCOORD0; }; //----------------------------------------------------------------------------- // Samplers //----------------------------------------------------------------------------- sampler_state texture_sampler { Filter = Linear; AddressU = Mirror; AddressV = Mirror; }; //----------------------------------------------------------------------------- // Functions //----------------------------------------------------------------------------- float2x2 swirlTransform(float theta) { const float c = cos(theta); const float s = sin(theta); const float m1 = c; const float m2 = -s; const float m3 = s; const float m4 = c; return float2x2( m1, m2, m3, m4 ); } float2x2 zigzagTransform(float dist) { const float c = cos(dist); return float2x2( c, 0, 0, c ); } float4 PSZigZag(VertexData vtx) : TARGET { const float ar_raw = 1.0 * ViewSize.y / ViewSize.x; float ar = lerp(ar_raw, 1, aspect_ratio); float2 center = coordinates/2.0; float2 tc = vtx.uv - center; center.x /= ar; tc.x /= ar; const float dist = distance(tc, center); const float tension_radius = lerp(radius-dist, radius, tension); const float percent = max(radius-dist, 0) / tension_radius; const float percentSquared = percent * percent; const float theta = percentSquared * (animate == 1 ? amplitude * sin(Time.x) : amplitude) * sin(percentSquared / period * radians(angle) + (phase + (animate == 2 ? Time.x : 0))); if(!mode) { tc = mul(swirlTransform(theta), tc-center); } else { tc = mul(zigzagTransform(theta), tc-center); } tc += (2.0 * center); tc.x *= ar; return InputA.Sample(texture_sampler, tc); } technique ZigZag { pass { vertex_shader = DefaultVertexShader(vtx); pixel_shader = PSZigZag(vtx); } }