diff --git a/VFEZ/.gitignore b/VFEZ/.gitignore
new file mode 100644
index 00000000..768e8a52
--- /dev/null
+++ b/VFEZ/.gitignore
@@ -0,0 +1,2 @@
+*.import
+*.uid
\ No newline at end of file
diff --git a/VFEZ/Images/croco_sprite.png b/VFEZ/Images/croco_sprite.png
new file mode 100644
index 00000000..7c31e7bd
--- /dev/null
+++ b/VFEZ/Images/croco_sprite.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:856a67a693dbd4c8267c2b6413d94caa3fe308ed083b9af74feb05e869c37806
+size 3532
diff --git a/VFEZ/Images/vfez_examples.png b/VFEZ/Images/vfez_examples.png
new file mode 100644
index 00000000..2d9be90b
--- /dev/null
+++ b/VFEZ/Images/vfez_examples.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e1777376e8770dc8c47f52f598dcf57abf3b6cb26d758dc84431634a408808bf
+size 383236
diff --git a/VFEZ/Images/vfez_sample_effects.png b/VFEZ/Images/vfez_sample_effects.png
new file mode 100644
index 00000000..5f9e1542
--- /dev/null
+++ b/VFEZ/Images/vfez_sample_effects.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c49572e06b02bd2bef5175c9cd3e2c1803eed3e2e6978741fcc7f6e28b0f81c0
+size 134317
diff --git a/VFEZ/LICENSE b/VFEZ/LICENSE
new file mode 100644
index 00000000..5d327565
--- /dev/null
+++ b/VFEZ/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2025 Alexander Nikopoulos
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/VFEZ/README.md b/VFEZ/README.md
new file mode 100644
index 00000000..8136bf11
--- /dev/null
+++ b/VFEZ/README.md
@@ -0,0 +1,29 @@
+# VFEZ-godot
+
+
+`VFEZ-godot` is a godot library for easy VFX generation. \
+`VFEZ-godot` provides flexible `2D` and `3D` materials that can create complex effects without writing code. \
+`VFEZ-godot` was tested in `Godot 4.3` and in `Godot 4.4`.
+
+## Quickstart
+To get started with `VFEZ-godot` simply clone the repo inside your project and then create a new `Material`.
+* To create a 3D VFX, create a `VFEZMaterial3D` in a `MeshInstance3D` node.
+* To create a 2D VFX, create a `VFEZMaterial2D` in a `Sprite2D` or `TextureRect` node.
+* `VFEZMaterials` can also be used inside particle systems.
+* `VFEZ-godot` contains a big library of shader effects that can be stacked easily together.
+* The order of the listed effects corresponds to their execution order inside the shader for more transparent effect stacking.
+
+
+
+## Technical details
+* A `VFEZMaterial` dynamically recompiles the `Shaders/vfez_template_3d.gdshaderinc` or the `Shaders/vfez_template_2d.gdshaderinc` every time an effect is enabled or disabled. That way the resulting material does not include excess code logic and is performant.
+* Every `VFEZMaterial` generates a unique shader file that contains the definitions (`#define`) of the enabled effects.
+* If you dont want to use the `VFEZMaterial3D` and `VFEZMaterial2D` in your project you can still use the library to stack effects in your custom shaders. You can see the `Shaders/vfez_2d_example.gdshader` and `Shaders/vfez_3d_example.gdshader` as guidelines on how to stack effects manually.
+
+## TODO
+* Add more VFEZ effects
+* Add more usage tutorials
+
+## Community Notes
+* Contributions are welcome.
+* If you encounter any bug let me know so I can fix it.
diff --git a/VFEZ/Shaders/Effects/vfez_alpha_clip.gdshaderinc b/VFEZ/Shaders/Effects/vfez_alpha_clip.gdshaderinc
new file mode 100644
index 00000000..f68ea059
--- /dev/null
+++ b/VFEZ/Shaders/Effects/vfez_alpha_clip.gdshaderinc
@@ -0,0 +1,25 @@
+group_uniforms alpha_clip;
+uniform float alpha_clip_left: hint_range(0.0, 1.0) = 0;
+uniform float alpha_clip_right: hint_range(0.0, 1.0) = 0;
+uniform float alpha_clip_up: hint_range(0.0, 1.0) = 0;
+uniform float alpha_clip_down: hint_range(0.0, 1.0) = 0;
+group_uniforms;
+
+float alpha_clip(float alpha, vec2 uv, vec2 main_texture_scale)
+{
+ vec2 norm_uv = uv / main_texture_scale;
+
+ if (1. - alpha_clip_up - norm_uv.y < 0.)
+ return 0.;
+
+ if (norm_uv.y - alpha_clip_down < 0.)
+ return 0.;
+
+ if (1. - alpha_clip_right - norm_uv.x < 0.)
+ return 0.;
+
+ if (norm_uv.x - alpha_clip_left < 0.)
+ return 0.;
+
+ return alpha;
+}
\ No newline at end of file
diff --git a/VFEZ/Shaders/Effects/vfez_alpha_cutoff.gdshaderinc b/VFEZ/Shaders/Effects/vfez_alpha_cutoff.gdshaderinc
new file mode 100644
index 00000000..17caaec8
--- /dev/null
+++ b/VFEZ/Shaders/Effects/vfez_alpha_cutoff.gdshaderinc
@@ -0,0 +1,15 @@
+group_uniforms alpha_cutoff;
+uniform float alpha_cuttof_value: hint_range(0.001, 1.) = 0.5;
+group_uniforms;
+
+float alpha_cutoff(float alpha)
+{
+ if (((1. - alpha_cuttof_value) - (1. - alpha) - 0.01) < 0.)
+ {
+ return 0.;
+ }
+ else
+ {
+ return alpha;
+ }
+}
\ No newline at end of file
diff --git a/VFEZ/Shaders/Effects/vfez_alpha_disolve.gdshaderinc b/VFEZ/Shaders/Effects/vfez_alpha_disolve.gdshaderinc
new file mode 100644
index 00000000..91afb200
--- /dev/null
+++ b/VFEZ/Shaders/Effects/vfez_alpha_disolve.gdshaderinc
@@ -0,0 +1,67 @@
+#ifndef VFEZ_UTILS
+ #include "vfez_utils.gdshaderinc"
+ #define VFEZ_UTILS
+#endif
+
+group_uniforms alpha_disolve;
+uniform sampler2D alpha_disolve_texture: source_color;
+uniform vec2 alpha_disolve_texture_scale = vec2(1.);
+uniform vec2 alpha_disolve_texture_offset = vec2(0.);
+uniform float alpha_disolve_amount: hint_range(-0.1, 1) = -0.1;
+uniform float alpha_disolve_transition: hint_range(0.01, 0.75)= 0.075;
+uniform float alpha_disolve_power: hint_range(0.001, 10) = 1;
+uniform vec2 alpha_disolve_scroll_speed;
+group_uniforms;
+
+// disolve burn
+group_uniforms alpha_disolve.disolve_burn;
+uniform bool use_alpha_disolve_burn = false;
+uniform sampler2D alpha_disolve_burn_texture: source_color;
+uniform vec3 alpha_disolve_burn_color: source_color = vec3(1., 1., 0.);
+uniform float alpha_disolve_burn_width: hint_range(0.0, 0.2) = 0.01;
+uniform float alpha_disolve_burn_glow: hint_range(1, 250) = 5;
+group_uniforms;
+
+vec4 alpha_disolve(
+ vec4 color,
+ float pre_disolve_alpha,
+ float base_a,
+ vec2 uv,
+ bool fract_uv)
+{
+ vec2 disolve_uv = transform_uv(uv, alpha_disolve_texture_scale, alpha_disolve_texture_offset, fract_uv);
+
+ float disolve_amount = clamp(alpha_disolve_amount + (1. - base_a), 0., 1.);
+ float disolve_transition = max(0.01, alpha_disolve_transition * ease_out_quint(disolve_amount));
+ disolve_uv += mod(TIME * alpha_disolve_scroll_speed, 1.0);
+ disolve_amount = clamp(pow(disolve_amount, alpha_disolve_power), 0., 1.);
+ float disolve_sample = texture(alpha_disolve_texture, disolve_uv).r;
+ float disolve = clamp(
+ smoothstep(
+ 0.0,
+ disolve_transition,
+ remap_float(1.0 - disolve_amount, 0.0, 1.0, -1.0, 1.0) + disolve_sample
+ ), 0., 1.);
+
+ color.a *= disolve;
+
+ if (use_alpha_disolve_burn)
+ {
+ float disolve_burn = clamp(
+ smoothstep(
+ 0.,
+ disolve_transition + alpha_disolve_burn_width,
+ remap_float(1.0 - disolve_amount, 0.0, 1.0, -1.0, 1.0) + disolve_sample
+ ), 0., 1.
+ );
+
+ disolve_burn = disolve - disolve_burn;
+ vec3 disolve_burn_color = alpha_disolve_burn_color.rgb * alpha_disolve_burn_glow;
+
+ color.rgb += disolve_burn *
+ texture(alpha_disolve_burn_texture, disolve_uv).rgb
+ * disolve_burn_color.rgb
+ * pre_disolve_alpha;
+ }
+ return color;
+}
\ No newline at end of file
diff --git a/VFEZ/Shaders/Effects/vfez_alpha_flicker.gdshaderinc b/VFEZ/Shaders/Effects/vfez_alpha_flicker.gdshaderinc
new file mode 100644
index 00000000..ccaca55c
--- /dev/null
+++ b/VFEZ/Shaders/Effects/vfez_alpha_flicker.gdshaderinc
@@ -0,0 +1,13 @@
+group_uniforms alpha_flicker;
+uniform float alpha_flicker_percent: hint_range(0., 1.) = 0.05;
+uniform float alpha_flicker_frequency: hint_range(0., 5.) = 0.2;
+uniform float alpha_flicker_value: hint_range(0.0, 1.0) = 0.;
+group_uniforms;
+
+float alpha_flicker(float alpha)
+{
+ alpha *= clamp(
+ alpha * step(fract(0.05 + TIME * alpha_flicker_frequency),
+ 1. - alpha_flicker_percent) + alpha_flicker_value, 0., 1.);
+ return alpha;
+}
\ No newline at end of file
diff --git a/VFEZ/Shaders/Effects/vfez_alpha_mask.gdshaderinc b/VFEZ/Shaders/Effects/vfez_alpha_mask.gdshaderinc
new file mode 100644
index 00000000..890914c5
--- /dev/null
+++ b/VFEZ/Shaders/Effects/vfez_alpha_mask.gdshaderinc
@@ -0,0 +1,23 @@
+#ifndef VFEZ_UTILS
+ #include "vfez_utils.gdshaderinc"
+ #define VFEZ_UTILS
+#endif
+
+group_uniforms alpha_mask;
+uniform sampler2D alpha_mask_texture: source_color;
+uniform vec2 alpha_mask_scale = vec2(1.);
+uniform vec2 alpha_mask_offset = vec2(0.);
+uniform float alpha_mask_power: hint_range(0.001, 10.) = 1;
+group_uniforms;
+
+float alpha_mask(
+ float alpha,
+ vec2 uv,
+ bool fract_uv)
+{
+ vec2 alpha_mask_uv = transform_uv(uv, alpha_mask_scale, alpha_mask_offset, fract_uv);
+ vec4 alpha_mask_sample = texture(alpha_mask_texture, alpha_mask_uv);
+ float mask = pow(min(alpha_mask_sample.r, alpha_mask_sample.a), alpha_mask_power);
+ alpha *= mask;
+ return alpha;
+}
\ No newline at end of file
diff --git a/VFEZ/Shaders/Effects/vfez_alpha_radial_clip.gdshaderinc b/VFEZ/Shaders/Effects/vfez_alpha_radial_clip.gdshaderinc
new file mode 100644
index 00000000..a0193687
--- /dev/null
+++ b/VFEZ/Shaders/Effects/vfez_alpha_radial_clip.gdshaderinc
@@ -0,0 +1,28 @@
+group_uniforms alpha_radial_clip;
+uniform float alpha_radial_clip_start_angle: hint_range(0.0, 360., 1.);
+uniform float alpha_radial_clip_one: hint_range(0.0, 360., 1.);
+uniform float alpha_radial_clip_two: hint_range(0.0, 360., 1.);
+group_uniforms;
+
+float alpha_radial_clip(float alpha, vec2 uv, vec2 main_texture_scale)
+{
+ vec2 norm_uv = uv / main_texture_scale;
+ float start_angle = alpha_radial_clip_start_angle - alpha_radial_clip_one;
+ float end_angle = alpha_radial_clip_start_angle + alpha_radial_clip_two;
+ float offset_0 = clamp(0., 360., start_angle + 360.);
+ float offset_360 = clamp(0., 360., end_angle - 360.);
+ vec2 atan2Coord = vec2(mix(-1., 1., norm_uv.x), mix(-1., 1., norm_uv.y));
+ float a_tan_angle = atan(atan2Coord.y, atan2Coord.x) * 57.3;
+ if (a_tan_angle < 0.)
+ a_tan_angle = 360. + a_tan_angle;
+
+ if (a_tan_angle >= start_angle && a_tan_angle <= end_angle)
+ return 0.;
+
+ if (a_tan_angle <= offset_360)
+ return 0.;
+
+ if (a_tan_angle >= offset_0)
+ return 0.;
+ return alpha;
+}
diff --git a/VFEZ/Shaders/Effects/vfez_alpha_remap.gdshaderinc b/VFEZ/Shaders/Effects/vfez_alpha_remap.gdshaderinc
new file mode 100644
index 00000000..26132058
--- /dev/null
+++ b/VFEZ/Shaders/Effects/vfez_alpha_remap.gdshaderinc
@@ -0,0 +1,10 @@
+group_uniforms alpha_remap;
+uniform float alpha_remap_min: hint_range(0.0, 1.0) = 0;
+uniform float alpha_remap_max: hint_range(0.0, 1.0) = 0.075;
+group_uniforms;
+
+float alpha_remap(float alpha)
+{
+ alpha = smoothstep(alpha_remap_min, alpha_remap_max, alpha);
+ return alpha;
+}
\ No newline at end of file
diff --git a/VFEZ/Shaders/Effects/vfez_chromatic_aberration.gdshaderinc b/VFEZ/Shaders/Effects/vfez_chromatic_aberration.gdshaderinc
new file mode 100644
index 00000000..6a6e57b8
--- /dev/null
+++ b/VFEZ/Shaders/Effects/vfez_chromatic_aberration.gdshaderinc
@@ -0,0 +1,18 @@
+group_uniforms chromatic_aberration;
+uniform float chromatic_aberration_amount: hint_range(0.0, 1.0) = 1.;
+uniform float chromatic_aberration_alpha: hint_range(0.0, 1.0) = 0.4;
+group_uniforms;
+
+vec4 chromatic_aberration(vec4 color, vec2 uv, sampler2D main_texture)
+{
+ vec4 r = texture(main_texture,
+ uv + vec2(chromatic_aberration_amount / 10., 0.));
+
+ vec4 b = texture(main_texture,
+ uv + vec2(-chromatic_aberration_amount / 10., 0.));
+
+ color = vec4(r.r * r.a, color.g, b.b * b.a,
+ max(max(r.a, b.a) * chromatic_aberration_alpha, color.a));
+
+ return color;
+}
\ No newline at end of file
diff --git a/VFEZ/Shaders/Effects/vfez_color_change.gdshaderinc b/VFEZ/Shaders/Effects/vfez_color_change.gdshaderinc
new file mode 100644
index 00000000..10042566
--- /dev/null
+++ b/VFEZ/Shaders/Effects/vfez_color_change.gdshaderinc
@@ -0,0 +1,71 @@
+#ifndef VFEZ_UTILS
+ #include "vfez_utils.gdshaderinc"
+ #define VFEZ_UTILS
+#endif
+
+
+group_uniforms color_change.color1;
+uniform bool change_color_1;
+uniform vec3 color_1_to_change: source_color;
+uniform vec3 color_1_to_replace: source_color;
+uniform float color_1_change_tolerance: hint_range(0.0, 1.0) = 0.1;
+group_uniforms;
+
+group_uniforms color_change.color2;
+uniform bool change_color_2;
+uniform vec3 color_2_to_change: source_color;
+uniform vec3 color_2_to_replace: source_color;
+uniform float color_2_change_tolerance: hint_range(0.0, 1.0) = 0.1;
+group_uniforms;
+
+group_uniforms color_change.color3;
+uniform bool change_color_3;
+uniform vec3 color_3_to_change: source_color;
+uniform vec3 color_3_to_replace: source_color;
+uniform float color_3_change_tolerance: hint_range(0.0, 1.0) = 0.1;
+group_uniforms;
+
+vec3 change_single_color(
+ vec3 color,
+ vec3 color_to_change,
+ vec3 color_to_replace,
+ float color_change_tolerance)
+{
+ vec3 dif = abs(color - color_to_change.rgb);
+ color.rgb = mix(color, color_to_replace.rgb,
+ max(sign(color_change_tolerance * 3. - dif.x - dif.y - dif.z), 0.0));
+ return color;
+}
+
+vec3 color_change(vec3 color)
+{
+ color = clamp(color, 0., 1.);
+
+ if (change_color_1)
+ {
+ color = change_single_color(
+ color,
+ color_1_to_change,
+ color_1_to_replace,
+ color_1_change_tolerance);
+ }
+
+ if (change_color_2)
+ {
+ color = change_single_color(
+ color,
+ color_2_to_change,
+ color_2_to_replace,
+ color_2_change_tolerance);
+ }
+
+ if (change_color_3)
+ {
+ color = change_single_color(
+ color,
+ color_3_to_change,
+ color_3_to_replace,
+ color_3_change_tolerance);
+ }
+ return color;
+}
\ No newline at end of file
diff --git a/VFEZ/Shaders/Effects/vfez_color_face_tint.gdshaderinc b/VFEZ/Shaders/Effects/vfez_color_face_tint.gdshaderinc
new file mode 100644
index 00000000..15db730e
--- /dev/null
+++ b/VFEZ/Shaders/Effects/vfez_color_face_tint.gdshaderinc
@@ -0,0 +1,16 @@
+group_uniforms color_face_tint;
+uniform vec3 backface_tint_color: source_color = vec3(0.5);
+uniform vec3 frontface_tint_color: source_color = vec3(1.);
+group_uniforms;
+
+vec3 color_face_tint(
+ vec3 color,
+ vec3 world_normal,
+ vec3 view_direction)
+{
+ color.rgb = mix(
+ color.rgb * backface_tint_color,
+ color.rgb * frontface_tint_color,
+ step(0, dot(world_normal, view_direction)));
+ return color;
+}
\ No newline at end of file
diff --git a/VFEZ/Shaders/Effects/vfez_color_ghost.gdshaderinc b/VFEZ/Shaders/Effects/vfez_color_ghost.gdshaderinc
new file mode 100644
index 00000000..7c069b1e
--- /dev/null
+++ b/VFEZ/Shaders/Effects/vfez_color_ghost.gdshaderinc
@@ -0,0 +1,20 @@
+#ifndef VFEZ_UTILS
+ #include "vfez_utils.gdshaderinc"
+ #define VFEZ_UTILS
+#endif
+
+group_uniforms color_ghost;
+uniform float color_ghost_boost: hint_range(0.0, 5.) = 1.;
+uniform float color_ghost_transparency: hint_range(0.0, 1.0) = 0.;
+uniform float color_ghost_blend: hint_range(0.0, 1.0) = 1.;
+group_uniforms;
+
+vec4 color_ghost(vec4 color)
+{
+ float luminance = get_color_luminance(color);
+ vec4 ghost;
+ ghost.a = clamp(luminance - color_ghost_transparency, 0., 1.) * color.a;
+ ghost.rgb = color.rgb * (luminance + color_ghost_boost);
+ color = mix(color, ghost, color_ghost_blend);
+ return color;
+}
\ No newline at end of file
diff --git a/VFEZ/Shaders/Effects/vfez_color_glow.gdshaderinc b/VFEZ/Shaders/Effects/vfez_color_glow.gdshaderinc
new file mode 100644
index 00000000..edb1b986
--- /dev/null
+++ b/VFEZ/Shaders/Effects/vfez_color_glow.gdshaderinc
@@ -0,0 +1,23 @@
+group_uniforms color_glow;
+uniform vec4 glow_color: source_color = vec4(1.);
+uniform float glow_intensity = 0;
+uniform float glow_intensity_global = 1;
+uniform bool use_glow_texture = false;
+uniform sampler2D glow_texture: source_color;
+group_uniforms;
+
+vec3 color_glow(
+ vec4 color,
+ vec2 uv,
+ float glow_mult)
+{
+ float glow_mask = 1.;
+ if (use_glow_texture)
+ {
+ glow_mask = texture(glow_texture, uv).r;
+ }
+
+ color.rgb *= glow_intensity_global * glow_mask;
+ color.rgb += glow_color.rgb * glow_intensity * glow_mask * color.a * glow_mult;
+ return color.rgb;
+}
\ No newline at end of file
diff --git a/VFEZ/Shaders/Effects/vfez_color_gradient.gdshaderinc b/VFEZ/Shaders/Effects/vfez_color_gradient.gdshaderinc
new file mode 100644
index 00000000..cdc850df
--- /dev/null
+++ b/VFEZ/Shaders/Effects/vfez_color_gradient.gdshaderinc
@@ -0,0 +1,32 @@
+group_uniforms color_gradient;
+uniform float color_gradient_blend: hint_range(0., 1.) = 0.5;
+uniform float color_gradient_boost_x: hint_range(0., 1.) = 0.5;
+uniform float color_gradient_boost_y: hint_range(0., 1.) = 0.5;
+uniform vec4 color_gradient_top_right_color: source_color = vec4(1,0,0,1);
+uniform vec4 color_gradient_bottom_right_color: source_color = vec4(0,1,0,1);
+uniform vec4 color_gradient_top_left_color: source_color = vec4(0,0,1,1);
+uniform vec4 color_gradient_bottom_left_color: source_color = vec4(1,1,0,1);
+group_uniforms;
+
+vec4 color_gradient(vec4 color, vec2 uv, vec2 main_texture_scale)
+{
+ vec2 norm_uv = uv / main_texture_scale;
+ float grad_x_mix_factor = clamp(pow(norm_uv.x, color_gradient_boost_x), 0., 1.);
+ float grad_y_mix_factor = clamp(pow(norm_uv.y, color_gradient_boost_y), 0., 1.);
+ vec4 grad_result = mix(
+ mix(
+ color_gradient_bottom_left_color,
+ color_gradient_bottom_right_color,
+ grad_x_mix_factor),
+ mix(
+ color_gradient_top_left_color,
+ color_gradient_top_right_color,
+ grad_x_mix_factor),
+ grad_y_mix_factor
+ );
+
+ grad_result = mix(color, grad_result, color_gradient_blend);
+ color.rgb = grad_result.rgb * color.a;
+ color.a *= grad_result.a;
+ return color;
+}
\ No newline at end of file
diff --git a/VFEZ/Shaders/Effects/vfez_color_greyscale.gdshaderinc b/VFEZ/Shaders/Effects/vfez_color_greyscale.gdshaderinc
new file mode 100644
index 00000000..090f6e7c
--- /dev/null
+++ b/VFEZ/Shaders/Effects/vfez_color_greyscale.gdshaderinc
@@ -0,0 +1,18 @@
+#ifndef VFEZ_UTILS
+ #include "vfez_utils.gdshaderinc"
+ #define VFEZ_UTILS
+#endif
+
+group_uniforms color_greyscale;
+uniform float color_greyscale_luminosity: hint_range(-1., 1.) = 0;
+uniform float color_greyscale_blend: hint_range(0., 1.) = 1.;
+uniform vec3 color_greyscale_tint: source_color = vec3(1.);
+group_uniforms;
+
+vec3 color_greyscale(vec3 color)
+{
+ float luminance = get_color_luminance(vec4(color, 1.));
+ luminance = clamp(luminance + color_greyscale_luminosity, 0., 1.);
+ color = mix(color, vec3(luminance) * color_greyscale_tint, color_greyscale_blend);
+ return color;
+}
\ No newline at end of file
diff --git a/VFEZ/Shaders/Effects/vfez_color_hologram.gdshaderinc b/VFEZ/Shaders/Effects/vfez_color_hologram.gdshaderinc
new file mode 100644
index 00000000..96138550
--- /dev/null
+++ b/VFEZ/Shaders/Effects/vfez_color_hologram.gdshaderinc
@@ -0,0 +1,34 @@
+#ifndef VFEZ_UTILS
+ #include "vfez_utils.gdshaderinc"
+ #define VFEZ_UTILS
+#endif
+
+group_uniforms color_hologram;
+uniform vec3 color_hologram_stripes_color: source_color = vec3(0,1,1);
+uniform float color_hologram_stripes_amount: hint_range(0.0, 1.0) = 0.1;
+uniform float color_hologram_unchanged_amount: hint_range(0.0, 1.0) = 0.0;
+uniform float color_hologram_stripes_speed: hint_range(-20., 20.) = 4.5;
+uniform float color_hologram_min_alpha: hint_range(0.0, 1.0) = 0.1;
+uniform float color_hologram_max_alpha: hint_range(0.0, 1.0) = 0.75;
+uniform float color_hologram_blend: hint_range(0.0, 1.0) = 1.;
+group_uniforms;
+
+vec4 color_hologram(vec4 color, vec2 uv)
+{
+ float total_hologram = color_hologram_stripes_amount +
+ color_hologram_unchanged_amount;
+
+ float hologram_y_coord = mod(uv.y + mod(TIME, 1.) * color_hologram_stripes_speed, total_hologram) / total_hologram;
+ hologram_y_coord = abs(hologram_y_coord);
+ float alpha = remap_float(
+ clamp(hologram_y_coord - color_hologram_unchanged_amount / total_hologram, 0., 1.),
+ 0., 1., color_hologram_min_alpha, color_hologram_max_alpha);
+ float hologram_mask = max(sign(color_hologram_unchanged_amount / total_hologram - hologram_y_coord), 0.0);
+ vec4 hologram_result = color;
+ hologram_result.a *= mix(alpha, 1., hologram_mask);
+ hologram_result.rgb *= max(1., color_hologram_max_alpha * max (sign (hologram_y_coord - color_hologram_unchanged_amount / total_hologram), 0.0));
+ hologram_mask = 1. - step(0.01, hologram_mask);
+ hologram_result.rgb += hologram_mask * color_hologram_stripes_color.rgb * color.a;
+ color = mix(color, hologram_result, color_hologram_blend);
+ return color;
+}
\ No newline at end of file
diff --git a/VFEZ/Shaders/Effects/vfez_color_negative.gdshaderinc b/VFEZ/Shaders/Effects/vfez_color_negative.gdshaderinc
new file mode 100644
index 00000000..3c9729d6
--- /dev/null
+++ b/VFEZ/Shaders/Effects/vfez_color_negative.gdshaderinc
@@ -0,0 +1,9 @@
+group_uniforms color_negative;
+uniform float color_negative_blend: hint_range(0.0, 1.0) = 1.0;
+group_uniforms;
+
+vec3 color_negative(vec3 color)
+{
+ color = mix(color, 1. - color, color_negative_blend);
+ return color;
+}
diff --git a/VFEZ/Shaders/Effects/vfez_color_overlay_texture.gdshaderinc b/VFEZ/Shaders/Effects/vfez_color_overlay_texture.gdshaderinc
new file mode 100644
index 00000000..38a497e2
--- /dev/null
+++ b/VFEZ/Shaders/Effects/vfez_color_overlay_texture.gdshaderinc
@@ -0,0 +1,40 @@
+#ifndef VFEZ_UTILS
+ #include "vfez_utils.gdshaderinc"
+ #define VFEZ_UTILS
+#endif
+
+group_uniforms color_overlay_texture;
+uniform sampler2D color_overlay_tex: source_color;
+uniform vec2 color_overlay_tex_scale = vec2(1.);
+uniform vec2 color_overlay_tex_offset = vec2(0.);
+uniform vec4 color_overlay_color: source_color = vec4(1.);
+uniform float color_overlay_glow: hint_range(0.0, 25) = 1.;
+uniform float color_overlay_blend: hint_range(0.0, 1.0) = 1.;
+uniform float color_overlay_tex_scroll_x: hint_range(-5, 5) = 0.25;
+uniform float color_overlay_tex_scroll_y: hint_range(-5, 5) = 0.25;
+uniform bool color_overlay_mult;
+group_uniforms;
+
+vec4 color_overlay_texture(vec4 color, vec2 uv)
+{
+ vec2 overlay_uv = uv;
+ overlay_uv.x += TIME * color_overlay_tex_scroll_x;
+ overlay_uv.y += TIME * color_overlay_tex_scroll_y;
+ overlay_uv = fract(overlay_uv);
+ overlay_uv = transform_uv(overlay_uv, color_overlay_tex_scale, color_overlay_tex_offset, true);
+ vec4 final_overlay_color = texture(color_overlay_tex, overlay_uv);
+ final_overlay_color.rgb *= color_overlay_color.rgb * color_overlay_glow;
+
+ if (color_overlay_mult)
+ {
+ final_overlay_color.a *= color_overlay_color.a;
+ color = mix(color, color * final_overlay_color, color_overlay_blend);
+ }
+ else
+ {
+ final_overlay_color.rgb *= final_overlay_color.a * color_overlay_color.rgb * color_overlay_color.a * color_overlay_blend;
+ color.rgb += final_overlay_color.rgb;
+ }
+
+ return color;
+}
diff --git a/VFEZ/Shaders/Effects/vfez_color_posterize.gdshaderinc b/VFEZ/Shaders/Effects/vfez_color_posterize.gdshaderinc
new file mode 100644
index 00000000..02f37b11
--- /dev/null
+++ b/VFEZ/Shaders/Effects/vfez_color_posterize.gdshaderinc
@@ -0,0 +1,9 @@
+group_uniforms color_posterize;
+uniform float color_posterize_num_colors: hint_range(0.0, 30.) = 5.;
+group_uniforms;
+
+vec3 color_posterize(vec3 color)
+{
+ color = floor(color.rgb / (1.0 / color_posterize_num_colors)) * (1.0 / color_posterize_num_colors);
+ return color;
+}
\ No newline at end of file
diff --git a/VFEZ/Shaders/Effects/vfez_color_radial_gradient.gdshaderinc b/VFEZ/Shaders/Effects/vfez_color_radial_gradient.gdshaderinc
new file mode 100644
index 00000000..93411a3f
--- /dev/null
+++ b/VFEZ/Shaders/Effects/vfez_color_radial_gradient.gdshaderinc
@@ -0,0 +1,24 @@
+group_uniforms color_radial_gradient;
+uniform vec2 color_radial_gradient_center = vec2(0.5);
+uniform float color_radial_gradient_blend: hint_range(0., 1.) = 0.5;
+uniform float color_radial_gradient_boost: hint_range(0., 1.) = 0.5;
+uniform vec4 color_radial_gradient_color_one: source_color = vec4(1,0,0,1);
+uniform vec4 color_radial_gradient_color_two: source_color = vec4(0,1,0,1);
+group_uniforms;
+
+vec4 color_radial_gradient(vec4 color, vec2 uv, vec2 main_texture_scale, vec2 viewport_size)
+{
+ vec2 norm_uv = uv / main_texture_scale;
+ float radial_dist = 1. - length(norm_uv - color_radial_gradient_center);
+ radial_dist*= viewport_size.x / viewport_size.y;
+ radial_dist = clamp(color_radial_gradient_boost * radial_dist, 0., 1.);
+ vec4 grad_result = mix(
+ color_radial_gradient_color_one,
+ color_radial_gradient_color_two,
+ radial_dist);
+
+ grad_result = mix(color, grad_result, color_radial_gradient_blend);
+ color.rgb = grad_result.rgb * color.a;
+ color.a *= grad_result.a;
+ return color;
+}
\ No newline at end of file
diff --git a/VFEZ/Shaders/Effects/vfez_color_ramp.gdshaderinc b/VFEZ/Shaders/Effects/vfez_color_ramp.gdshaderinc
new file mode 100644
index 00000000..1dbb4e60
--- /dev/null
+++ b/VFEZ/Shaders/Effects/vfez_color_ramp.gdshaderinc
@@ -0,0 +1,21 @@
+#ifndef VFEZ_UTILS
+ #include "vfez_utils.gdshaderinc"
+ #define VFEZ_UTILS
+#endif
+
+group_uniforms color_ramp;
+uniform vec4 color_ramp_albedo: source_color = vec4(1.);
+uniform sampler2D color_ramp_texture: source_color, repeat_disable;
+uniform float color_ramp_luminosity: hint_range(-1., 1.) = 0.;
+uniform float color_ramp_blend: hint_range(0.0, 1.0) = 1.;
+group_uniforms;
+
+vec4 color_ramp(vec4 color)
+{
+ float luminance = get_color_luminance(color);
+ float color_ramp_luminance = clamp(luminance + color_ramp_luminosity, 0., 1.);
+ vec4 color_ramp_res = texture(color_ramp_texture, vec2(color_ramp_luminance)) * color_ramp_albedo;
+ color.rgb = mix(color.rgb, color_ramp_res.rgb, color_ramp_blend);
+ color.a = mix(color.a, clamp(color.a * color_ramp_res.a, 0., 1.), color_ramp_blend);
+ return color;
+}
\ No newline at end of file
diff --git a/VFEZ/Shaders/Effects/vfez_color_rim.gdshaderinc b/VFEZ/Shaders/Effects/vfez_color_rim.gdshaderinc
new file mode 100644
index 00000000..79936405
--- /dev/null
+++ b/VFEZ/Shaders/Effects/vfez_color_rim.gdshaderinc
@@ -0,0 +1,31 @@
+group_uniforms color_rim;
+uniform vec4 rim_color: source_color = vec4(1.);
+uniform float rim_bias: hint_range(0.0, 1.0) = 0.;
+uniform float rim_scale: hint_range(0.0, 25.0) = 1.;
+uniform float rim_power: hint_range(0.1, 20.0) = 5.;
+uniform float rim_intensity: hint_range(0.1, 50.0) = 1.;
+uniform float rim_add_amount: hint_range(0.1, 1.0) = 1.;
+uniform float rim_erodes_alpha: hint_range(0.1, 2.0) = 0.;
+group_uniforms;
+
+vec4 color_rim(
+ vec4 color,
+ vec3 normal,
+ vec3 view)
+{
+ float ndv = 1. - abs(dot(normal, view));
+ float rim_factor = clamp(
+ rim_bias + rim_scale * pow(ndv, rim_power), 0., 1.);
+ vec4 final_rim_color = rim_color * rim_factor;
+ final_rim_color.rgb *= rim_intensity;
+ color.rgb = mix(
+ color.rgb * (final_rim_color.rgb + vec3(1.)),
+ color.rgb + final_rim_color.rgb,
+ rim_add_amount);
+ color.a = clamp(
+ color.a * (1. - rim_factor * rim_erodes_alpha),
+ 0.,
+ 1.);
+
+ return color;
+}
\ No newline at end of file
diff --git a/VFEZ/Shaders/Effects/vfez_color_shadow.gdshaderinc b/VFEZ/Shaders/Effects/vfez_color_shadow.gdshaderinc
new file mode 100644
index 00000000..f7a451d5
--- /dev/null
+++ b/VFEZ/Shaders/Effects/vfez_color_shadow.gdshaderinc
@@ -0,0 +1,17 @@
+group_uniforms color_shadow;
+uniform float color_shadow_x: hint_range(-0.5, 0.5) = 0.1;
+uniform float color_shadow_y: hint_range(-0.5, 0.5) = 0.1;
+uniform float color_shadow_alpha: hint_range(0., 1.) = 0.5;
+uniform vec3 color_shadow_color: source_color = vec3(0.);
+group_uniforms;
+
+vec4 shadow(vec4 color, sampler2D tex, vec2 uv)
+{
+ vec2 shadowOffset = vec2(color_shadow_x, color_shadow_y);
+ float shadowA = texture(tex, uv + shadowOffset).a;
+ color.rgb *= 1. - (shadowA - color.a) * (1. - color.a);
+ color.rgb += color_shadow_color * shadowA * (1. - color.a);
+ color = clamp(color, 0., 1.);
+ color.a = max(shadowA * color_shadow_alpha, color.a);
+ return color;
+}
diff --git a/VFEZ/Shaders/Effects/vfez_color_shine.gdshaderinc b/VFEZ/Shaders/Effects/vfez_color_shine.gdshaderinc
new file mode 100644
index 00000000..76c8b994
--- /dev/null
+++ b/VFEZ/Shaders/Effects/vfez_color_shine.gdshaderinc
@@ -0,0 +1,48 @@
+#ifndef VFEZ_UTILS
+ #include "vfez_utils.gdshaderinc"
+ #define VFEZ_UTILS
+#endif
+
+group_uniforms color_shine;
+uniform vec4 color_shine_color: source_color = vec4(1.);
+uniform float color_shine_location: hint_range(0., 1.) = 0.5;
+uniform float color_shine_angle: hint_range(0.0, 6.2831) = 0.;
+uniform float color_shine_width: hint_range(0.0, 2.0) = 0.1;
+uniform float color_shine_glow: hint_range(0., 100., 1.) = 1.;
+uniform sampler2D color_shine_mask: source_color;
+uniform bool color_shine_mask_red_as_alpha;
+group_uniforms;
+
+vec4 color_shine(vec4 color, vec2 uv)
+{
+ if (color_shine_width == 0.)
+ return color;
+
+ vec2 shine_uv = uv;
+ shine_uv = rotate_uvs(shine_uv, color_shine_angle, vec2(1.), vec2(0.));
+
+ float shine_mask;
+
+ if (color_shine_mask_red_as_alpha)
+ {
+ shine_mask = texture(color_shine_mask, uv).r;
+ }
+ else
+ {
+ shine_mask = texture(color_shine_mask, uv).a;
+ }
+
+ float current_distance_proj = (shine_uv.x + shine_uv.y) / 2.;
+ float white_power = 1. -
+ abs(current_distance_proj - color_shine_location) / color_shine_width;
+
+
+ vec4 shine_color = color + color.a * white_power * color_shine_glow
+ * max(sign(current_distance_proj - (color_shine_location - color_shine_width)), 0.)
+ * max(sign(color_shine_location + color_shine_width - current_distance_proj), 0.)
+ * color_shine_color * shine_mask;
+
+ color.rgb = shine_color.rgb;
+
+ return color;
+}
\ No newline at end of file
diff --git a/VFEZ/Shaders/Effects/vfez_color_single.gdshaderinc b/VFEZ/Shaders/Effects/vfez_color_single.gdshaderinc
new file mode 100644
index 00000000..70728974
--- /dev/null
+++ b/VFEZ/Shaders/Effects/vfez_color_single.gdshaderinc
@@ -0,0 +1,10 @@
+group_uniforms color_single;
+uniform vec3 color_single_color: source_color = vec3(1.);
+uniform float color_single_blend: hint_range(0.0, 1.0) = 1.0;
+group_uniforms;
+
+vec3 color_single(vec3 color)
+{
+ color = mix(color, color_single_color, color_single_blend);
+ return color;
+}
\ No newline at end of file
diff --git a/VFEZ/Shaders/Effects/vfez_color_toning.gdshaderinc b/VFEZ/Shaders/Effects/vfez_color_toning.gdshaderinc
new file mode 100644
index 00000000..eb3a7a5c
--- /dev/null
+++ b/VFEZ/Shaders/Effects/vfez_color_toning.gdshaderinc
@@ -0,0 +1,36 @@
+#ifndef VFEZ_UTILS
+ #include "vfez_utils.gdshaderinc"
+ #define VFEZ_UTILS
+#endif
+
+group_uniforms color_toning;
+uniform vec3 color_grading_light_tone: source_color;
+uniform vec3 color_grading_mid_tone: source_color;
+uniform vec3 color_grading_dark_tone: source_color;
+uniform float color_grading_mid_point: hint_range(0.0, 1.0) = 0.5;
+group_uniforms;
+
+vec3 color_toning(vec4 color)
+{
+ float luminance = get_color_luminance(color);
+
+ vec3 color_grading_dark_middle_mix = mix(
+ color_grading_dark_tone,
+ color_grading_mid_tone,
+ luminance / color_grading_mid_point
+ );
+
+ vec3 color_grading_middle_light_mix = mix(
+ color_grading_mid_tone,
+ color_grading_light_tone,
+ (luminance - color_grading_mid_point) / (1.0 - color_grading_mid_point)
+ );
+
+ color.rgb *= mix(
+ color_grading_dark_middle_mix,
+ color_grading_middle_light_mix,
+ step(color_grading_mid_point, luminance)
+ );
+
+ return color.rgb;
+}
diff --git a/VFEZ/Shaders/Effects/vfez_glitch.gdshaderinc b/VFEZ/Shaders/Effects/vfez_glitch.gdshaderinc
new file mode 100644
index 00000000..03b96d0a
--- /dev/null
+++ b/VFEZ/Shaders/Effects/vfez_glitch.gdshaderinc
@@ -0,0 +1,20 @@
+#ifndef VFEZ_UTILS
+ #include "vfez_utils.gdshaderinc"
+ #define VFEZ_UTILS
+#endif
+
+group_uniforms glitch;
+uniform float glitch_amount: hint_range(0.0, 20.) = 3.;
+uniform float glitch_size: hint_range(0.25, 5.) = 1.;
+group_uniforms;
+
+vec3 glitch(vec3 color, vec2 uv, sampler2D main_texture)
+{
+ vec2 glitch_uv = uv - 0.5;
+ float line_noise =
+ pow(rand(floor(glitch_uv * vec2(24., 19.) * glitch_size) * 4.0, TIME), 3.0) * glitch_amount
+ * pow(rand(floor(glitch_uv * vec2(38., 14.) * glitch_size) * 4.0, TIME), 3.0);
+
+ color = texture(main_texture, uv + vec2(line_noise * 0.02 * rand(vec2(2.0, 1.), TIME), 0)).rgb;
+ return color;
+}
\ No newline at end of file
diff --git a/VFEZ/Shaders/Effects/vfez_hsv_shift.gdshaderinc b/VFEZ/Shaders/Effects/vfez_hsv_shift.gdshaderinc
new file mode 100644
index 00000000..0b6d5c25
--- /dev/null
+++ b/VFEZ/Shaders/Effects/vfez_hsv_shift.gdshaderinc
@@ -0,0 +1,23 @@
+group_uniforms color_hsv_shift;
+uniform float h_shift: hint_range(0.0, 360.0) = 180;
+uniform float s_shift: hint_range(0.0, 2.) = 1.;
+uniform float v_shift: hint_range(0.0, 2.) = 1.;
+group_uniforms;
+
+vec3 hsv_shift(vec3 color)
+{
+ vec3 result_hsv = vec3(color.rgb);
+ float cos_hsv = v_shift * s_shift * cos(h_shift * PI / 180.);
+ float sin_hsv = v_shift * s_shift * sin(h_shift * PI / 180.);
+ result_hsv.x = (.299 * v_shift + .701 * cos_hsv + .168 * sin_hsv) * color.x
+ + (.587 * v_shift - .587 * cos_hsv + .330 * sin_hsv) * color.y
+ + (.114 * v_shift - .114 * cos_hsv - .497 * sin_hsv) * color.z;
+ result_hsv.y = (.299 * v_shift - .299 * cos_hsv - .328 * sin_hsv) *color.x
+ + (.587 * v_shift + .413 * cos_hsv + .035 * sin_hsv) * color.y
+ + (.114 * v_shift - .114 * cos_hsv + .292 * sin_hsv) * color.z;
+ result_hsv.z = (.299 * v_shift - .3 * cos_hsv + 1.25 * sin_hsv) * color.x
+ + (.587 * v_shift - .588 * cos_hsv - 1.05 * sin_hsv) * color.y
+ + (.114 * v_shift + .886 * cos_hsv - .203 * sin_hsv) * color.z;
+ color.rgb = result_hsv;
+ return color.rgb;
+}
\ No newline at end of file
diff --git a/VFEZ/Shaders/Effects/vfez_motion_blur.gdshaderinc b/VFEZ/Shaders/Effects/vfez_motion_blur.gdshaderinc
new file mode 100644
index 00000000..3dd30f36
--- /dev/null
+++ b/VFEZ/Shaders/Effects/vfez_motion_blur.gdshaderinc
@@ -0,0 +1,35 @@
+#ifndef VFEZ_UTILS
+ #include "vfez_utils.gdshaderinc"
+ #define VFEZ_UTILS
+#endif
+
+group_uniforms motion_blur;
+uniform float motion_blur_angle: hint_range(-1., 1.) = 0.1;
+uniform float motion_blur_dist: hint_range(-3., 3.) = 1.25;
+group_uniforms;
+
+vec3 motion_blur(vec3 color, vec2 uv, sampler2D main_texture)
+{
+ float angle = motion_blur_angle * PI;
+ float dist = motion_blur_dist * 0.005;
+ color.rgb += texture(main_texture,
+ uv + rotate_vec2(vec2(-dist, -dist), angle)).rgb;
+ color.rgb += texture(main_texture,
+ uv + rotate_vec2(vec2(-dist, -dist) * 2., angle)).rgb;
+ color.rgb += texture(main_texture,
+ uv + rotate_vec2(vec2(-dist, -dist) * 3., angle)).rgb;
+ color.rgb += texture(main_texture,
+ uv + rotate_vec2(vec2(-dist, -dist) * 4., angle)).rgb;
+
+ color.rgb += texture(main_texture,
+ uv + rotate_vec2(vec2(dist, dist), angle)).rgb;
+ color.rgb += texture(main_texture,
+ uv + rotate_vec2(vec2(dist, dist) * 2., angle)).rgb;
+ color.rgb += texture(main_texture,
+ uv + rotate_vec2(vec2(dist, dist) * 3., angle)).rgb;
+ color.rgb += texture(main_texture,
+ uv + rotate_vec2(vec2(dist, dist) * 4., angle)).rgb;
+
+ color.rgb /= 9.;
+ return color;
+}
\ No newline at end of file
diff --git a/VFEZ/Shaders/Effects/vfez_outline.gdshaderinc b/VFEZ/Shaders/Effects/vfez_outline.gdshaderinc
new file mode 100644
index 00000000..a72b473f
--- /dev/null
+++ b/VFEZ/Shaders/Effects/vfez_outline.gdshaderinc
@@ -0,0 +1,101 @@
+#ifndef VFEZ_UTILS
+ #include "vfez_utils.gdshaderinc"
+ #define VFEZ_UTILS
+#endif
+
+group_uniforms outline;
+uniform vec3 outline_color: source_color;
+uniform float outline_alpha: hint_range(0.0, 1.0) = 1.0;
+uniform float outline_glow: hint_range(1., 100, 1.) = 1.0;
+uniform float outline_width;
+uniform bool only_render_outline;
+group_uniforms;
+
+group_uniforms outline.pixel_perfect;
+uniform bool use_pixel_perfect_outline;
+uniform int outline_pixel_width;
+group_uniforms;
+
+group_uniforms outline.texture;
+uniform bool use_outline_texture;
+uniform sampler2D outline_texture;
+uniform vec2 outline_texture_scale = vec2(1.);
+uniform vec2 outline_texture_offset = vec2(0.);
+uniform vec2 outline_texture_scroll_speed = vec2(0.);
+group_uniforms;
+
+group_uniforms outline.distortion;
+uniform bool use_outline_distortion;
+uniform sampler2D outline_distortion_texture;
+uniform vec2 outline_distortion_texture_scale = vec2(1.);
+uniform vec2 outline_distortion_texture_offset = vec2(0.);
+uniform vec2 outline_distortion_texture_scroll_speed = vec2(0.);
+uniform float outline_distortion_amount;
+group_uniforms;
+
+vec4 outline(vec4 color, vec2 texture_pixel_size, vec2 uv, sampler2D tex)
+{
+ float base_tex_a = texture(tex, uv).a;;
+
+ vec2 destUV;
+ if (use_pixel_perfect_outline)
+ {
+ destUV = texture_pixel_size * float(outline_pixel_width);
+ }
+ else
+ {
+ destUV = texture_pixel_size * float(outline_width) * 200.;
+ }
+
+ if (use_outline_distortion)
+ {
+ vec2 outlineDistUV = transform_uv(
+ uv,
+ outline_distortion_texture_scale,
+ outline_distortion_texture_offset,
+ true);
+
+ destUV = uv_distortion(destUV, outline_distortion_texture, outlineDistUV,
+ outline_distortion_amount, outline_distortion_texture_scroll_speed, true);;
+
+ }
+
+ float left = texture(tex, uv + vec2(destUV.x, 0.)).a;
+ float right = texture(tex, uv - vec2(destUV.x, 0.)).a;
+ float bottom = texture(tex, uv + vec2(0., destUV.y)).a;
+ float top = texture(tex, uv - vec2(0., destUV.y)).a;
+ float result = left + right + bottom + top;
+
+ result = step(0.05, clamp(result, 0., 1.));
+
+ vec4 final_outline_color = vec4(outline_color, 1.0);
+
+ if (use_outline_texture)
+ {
+ vec2 outlineTexUV = transform_uv(
+ uv,
+ outline_texture_scale,
+ outline_texture_offset,
+ true);
+
+ outlineTexUV += mod(TIME * outline_texture_scroll_speed,vec2(1.));
+ outlineTexUV = fract(outlineTexUV);
+ final_outline_color *= texture(outline_texture, outlineTexUV);
+ }
+
+ result *= (1. - color.a) * outline_alpha;
+ vec4 outline = final_outline_color;
+ outline.rgb *= outline_glow;
+ outline.a = result;
+
+ if (only_render_outline)
+ {
+ color = outline;
+ }
+ else
+ {
+ color = mix(color, outline, result);
+ }
+
+ return color;
+}
\ No newline at end of file
diff --git a/VFEZ/Shaders/Effects/vfez_outline_inner.gdshaderinc b/VFEZ/Shaders/Effects/vfez_outline_inner.gdshaderinc
new file mode 100644
index 00000000..133ab8fe
--- /dev/null
+++ b/VFEZ/Shaders/Effects/vfez_outline_inner.gdshaderinc
@@ -0,0 +1,40 @@
+group_uniforms outline_inner;
+uniform bool only_render_inner_outline;
+uniform vec3 outline_inner_color: source_color;
+uniform float outline_inner_thickness: hint_range(0., 5.) = 1.;
+uniform float outline_inner_alpha: hint_range(0., 1.) = 1.;
+uniform float ouline_inner_glow: hint_range(1., 10.) = 1.;
+group_uniforms;
+
+vec3 get_pixel(float offsetX, float offsetY, vec2 uv, sampler2D tex, vec2 texture_pixel_size)
+{
+ return texture(tex, (uv + vec2(offsetX * texture_pixel_size.x, offsetY * texture_pixel_size.y))).rgb;
+}
+
+
+vec4 outline_inner(vec4 color, vec2 texture_pixel_size, vec2 uv, sampler2D tex)
+{
+ vec3 innerT = abs(
+ get_pixel(0., outline_inner_thickness, uv, tex, texture_pixel_size) -
+ get_pixel(0., - outline_inner_thickness, uv, tex, texture_pixel_size)
+ );
+
+ innerT += abs(
+ get_pixel(outline_inner_thickness, 0., uv, tex, texture_pixel_size) -
+ get_pixel(-outline_inner_thickness, 0., uv, tex, texture_pixel_size)
+ );
+
+ if (only_render_inner_outline)
+ {
+ innerT *= color.a * outline_inner_alpha;
+ color.rgb = length(innerT) * outline_inner_color * ouline_inner_glow;
+ color.a = step(0.3, color.r + color.g + color.b);
+ }
+ else
+ {
+ innerT = innerT / 2.0 * color.a * outline_inner_alpha;
+ color.rgb += length(innerT) * outline_inner_color * ouline_inner_glow;
+ }
+
+ return color;
+}
diff --git a/VFEZ/Shaders/Effects/vfez_particle_anim.gdshaderinc b/VFEZ/Shaders/Effects/vfez_particle_anim.gdshaderinc
new file mode 100644
index 00000000..c06fad23
--- /dev/null
+++ b/VFEZ/Shaders/Effects/vfez_particle_anim.gdshaderinc
@@ -0,0 +1,21 @@
+group_uniforms particle.particle_anim;
+uniform int particles_anim_h_frames : hint_range(1, 128) = 1;
+uniform int particles_anim_v_frames : hint_range(1, 128) = 1;
+uniform bool particles_anim_loop;
+group_uniforms;
+
+vec2 particle_anim(float instance_custom_z, vec2 uv)
+{
+ float h_frames = float(particles_anim_h_frames);
+ float v_frames = float(particles_anim_v_frames);
+ float particle_total_frames = float(particles_anim_h_frames * particles_anim_v_frames);
+ float particle_frame = floor(instance_custom_z * float(particle_total_frames));
+ if (!particles_anim_loop) {
+ particle_frame = clamp(particle_frame, 0.0, particle_total_frames - 1.0);
+ } else {
+ particle_frame = mod(particle_frame, particle_total_frames);
+ }
+ uv /= vec2(h_frames, v_frames);
+ uv += vec2(mod(particle_frame, h_frames) / h_frames, floor((particle_frame + 0.5) / h_frames) / v_frames);
+ return uv;
+}
\ No newline at end of file
diff --git a/VFEZ/Shaders/Effects/vfez_utils.gdshaderinc b/VFEZ/Shaders/Effects/vfez_utils.gdshaderinc
new file mode 100644
index 00000000..a7e41724
--- /dev/null
+++ b/VFEZ/Shaders/Effects/vfez_utils.gdshaderinc
@@ -0,0 +1,96 @@
+// helper functions ------------------------------------------
+vec2 transform_uv(vec2 uv, vec2 scale, vec2 offset, bool fract_result)
+{
+ uv = uv * scale + offset;
+ if (fract_result)
+ uv = fract(uv);
+ return uv;
+}
+
+vec2 uv_distortion(
+ vec2 uv,
+ sampler2D distortion_texture,
+ vec2 distortion_uv,
+ float distortion_amount,
+ vec2 distortion_speed,
+ bool fract_result)
+{
+ distortion_uv += mod(TIME * distortion_speed, vec2(1.));
+ if (fract_result)
+ {
+ distortion_uv = fract(distortion_uv);
+ }
+
+ float distortAmount =
+ (texture(distortion_texture, distortion_uv).r - 0.5) * 0.2 * distortion_amount;
+ uv += vec2(1.) * distortAmount;
+ return uv;
+}
+
+vec2 uv_polar(vec2 uv, vec2 center)
+{
+ vec2 dir = uv - center;
+ float radius = length(dir) * 2.;
+ float angle = atan(dir.y, dir.x) / (2. * PI);
+ vec2 polarUV = vec2(angle, radius);
+ //baseUV = mod(vec2(radius, angle), 1.0);
+ return polarUV;
+}
+
+vec2 rotate_vec2(vec2 vector, float angle)
+{
+ float cosAngle = cos(angle);
+ float sinAngle = sin(angle);
+ vector = mat2(vec2(cosAngle, -sinAngle), vec2(sinAngle, cosAngle)) * vector;
+ return vector;
+}
+
+vec2 rotate_uvs(vec2 uv, float rotation, vec2 scale, vec2 offset)
+{
+ vec2 center = vec2(0.5 * scale.x + offset.x, 0.5 * scale.y + offset.y);
+ uv -= center;
+ uv = rotate_vec2(uv, rotation);
+ uv += center;
+ return uv;
+}
+
+vec4 sample_texture_with_scroll(sampler2D tex, vec2 uv, vec2 scroll_speed, float time)
+{
+ uv.x += mod(time * scroll_speed.x, 1);
+ uv.y += mod(time * scroll_speed.y, 1);
+ if (scroll_speed != vec2(0.))
+ uv = fract(uv);
+ return texture(tex, uv);
+}
+
+float rand(vec2 seed, float offset) {
+ return mod(fract(sin(dot(seed, vec2(12.9898, 78.233))) * 43758.5453) + offset, 1.0);
+}
+
+float rand_uncapped(vec2 seed, float offset) {
+ return fract(sin(dot(seed, vec2(12.9898, 78.233))) * 43758.5453) + offset;
+}
+
+float rand2(vec2 seed, float offset, float time) {
+ return mod(
+ fract(
+ sin(
+ dot(seed * floor(50. + mod(time, 1.0) * 12.), vec2(127.1, 311.7))
+ ) * 43758.5453123
+ ) + offset, 1.0);
+}
+
+float remap_float(float inValue, float inMin, float inMax, float outMin, float outMax){
+ return outMin + (inValue - inMin) * (outMax - outMin) / (inMax - inMin);
+}
+
+float ease_out_quint(float x) {
+ return 1. - pow(1. - x, 5.);
+}
+
+float get_color_luminance(vec4 color)
+{
+ float luminance = 0.3 * color.r + 0.59 * color.g + 0.11 * color.b;
+ luminance *= color.a;
+ return luminance;
+}
\ No newline at end of file
diff --git a/VFEZ/Shaders/Effects/vfez_uv_fisheye.gdshaderinc b/VFEZ/Shaders/Effects/vfez_uv_fisheye.gdshaderinc
new file mode 100644
index 00000000..32927ee6
--- /dev/null
+++ b/VFEZ/Shaders/Effects/vfez_uv_fisheye.gdshaderinc
@@ -0,0 +1,18 @@
+group_uniforms uv_fisheye;
+uniform float uv_fisheye_center_x: hint_range(0.0, 1.0) = 0.5;
+uniform float uv_fisheye_center_y: hint_range(0.0, 1.0) = 0.5;
+uniform float uv_fisheye_amount = 0.1;
+group_uniforms;
+
+vec2 uv_fisheye(vec2 uv, vec2 main_texture_scale)
+{
+ vec2 center = vec2(uv_fisheye_center_x * main_texture_scale.x,
+ uv_fisheye_center_y * main_texture_scale.y);
+
+ float bind = length(center);
+ vec2 dF = uv - center;
+ float dFlen = length(dF);
+ float fishInt = (PI / bind) * (uv_fisheye_amount + 0.001);
+ uv = center + (dF / max(0.0001, dFlen)) * tan(dFlen * fishInt) * bind / tan(bind * fishInt);
+ return uv;
+}
\ No newline at end of file
diff --git a/VFEZ/Shaders/Effects/vfez_uv_handrawn.gdshaderinc b/VFEZ/Shaders/Effects/vfez_uv_handrawn.gdshaderinc
new file mode 100644
index 00000000..a3f48231
--- /dev/null
+++ b/VFEZ/Shaders/Effects/vfez_uv_handrawn.gdshaderinc
@@ -0,0 +1,15 @@
+group_uniforms uv_handrawn;
+uniform float uv_handrawn_amount: hint_range(0.0, 40.0) = 10.;
+uniform float uv_handrawn_speed: hint_range(0.0, 30.0) = 5.;
+group_uniforms;
+
+vec2 uv_handrawn(vec2 uv)
+{
+ vec2 handrawnUV = uv;
+ float handrawn_speed =
+ floor(TIME * 20. * uv_handrawn_speed);
+ handrawnUV.x = sin((handrawnUV.x * uv_handrawn_amount + handrawn_speed / 2.) * 4.);
+ handrawnUV.y = sin((handrawnUV.y * uv_handrawn_amount + handrawn_speed / 2.) * 4.);
+ uv = mix(uv, uv + handrawnUV, 0.0005 * uv_handrawn_amount);
+ return uv;
+}
\ No newline at end of file
diff --git a/VFEZ/Shaders/Effects/vfez_uv_pinch.gdshaderinc b/VFEZ/Shaders/Effects/vfez_uv_pinch.gdshaderinc
new file mode 100644
index 00000000..ec82dd2c
--- /dev/null
+++ b/VFEZ/Shaders/Effects/vfez_uv_pinch.gdshaderinc
@@ -0,0 +1,16 @@
+group_uniforms uv_pinch;
+uniform float uv_pinch_center_x: hint_range(0.0, 1.0) = 0.5;
+uniform float uv_pinch_center_y: hint_range(0.0, 1.0) = 0.5;
+uniform float uv_pinch_amount;
+group_uniforms;
+
+vec2 uv_pinch(vec2 uv, vec2 main_texture_scale)
+{
+ vec2 center = vec2(uv_pinch_center_x * main_texture_scale.x,
+ uv_pinch_center_y * main_texture_scale.y);
+ vec2 dP = uv - center;
+ float pinchInt = (PI / length(center)) * (-uv_pinch_amount + 0.001);
+ uv = center + normalize(dP) * atan(-length(dP) * pinchInt * 10.0)
+ * 0.5 / atan(-pinchInt * 5.);
+ return uv;
+}
\ No newline at end of file
diff --git a/VFEZ/Shaders/Effects/vfez_uv_pixelate.gdshaderinc b/VFEZ/Shaders/Effects/vfez_uv_pixelate.gdshaderinc
new file mode 100644
index 00000000..91f9f865
--- /dev/null
+++ b/VFEZ/Shaders/Effects/vfez_uv_pixelate.gdshaderinc
@@ -0,0 +1,11 @@
+group_uniforms uv_pixelate;
+uniform int uv_pixelate_size: hint_range(4, 512) = 32;
+group_uniforms;
+
+vec2 uv_pixelate(vec2 uv, vec2 viewport_size)
+{
+ float aspect_ratio = viewport_size.x / viewport_size.y;
+ vec2 pixel_size = vec2(float(uv_pixelate_size), float(uv_pixelate_size) * aspect_ratio);
+ uv = floor(uv * pixel_size) / pixel_size;
+ return uv;
+}
\ No newline at end of file
diff --git a/VFEZ/Shaders/Effects/vfez_uv_round_wave.gdshaderinc b/VFEZ/Shaders/Effects/vfez_uv_round_wave.gdshaderinc
new file mode 100644
index 00000000..226c8c83
--- /dev/null
+++ b/VFEZ/Shaders/Effects/vfez_uv_round_wave.gdshaderinc
@@ -0,0 +1,18 @@
+group_uniforms uv_round_wave;
+uniform float uv_round_wave_strength: hint_range(0.0, 1.0) = 0.7;
+uniform float uv_round_wave_speed: hint_range(0.0, 5.0) = 2.;
+group_uniforms;
+
+vec2 uv_round_wave(
+ vec2 uv,
+ vec2 main_texture_size,
+ vec2 main_texture_scale)
+{
+ float round_wave_x = 0.5 * main_texture_scale.x - uv.x;
+ float round_wave_y = (0.5 * main_texture_scale.y - uv.y) *
+ main_texture_size.y / main_texture_size.x;
+ float ripple = -sqrt(round_wave_x * round_wave_x + round_wave_y * round_wave_y);
+ uv += mod(sin((ripple + TIME * (uv_round_wave_speed/10.0)) / 0.015)
+ * (uv_round_wave_strength /10.0), 1.0);
+ return uv;
+}
\ No newline at end of file
diff --git a/VFEZ/Shaders/Effects/vfez_uv_shake.gdshaderinc b/VFEZ/Shaders/Effects/vfez_uv_shake.gdshaderinc
new file mode 100644
index 00000000..7da33edc
--- /dev/null
+++ b/VFEZ/Shaders/Effects/vfez_uv_shake.gdshaderinc
@@ -0,0 +1,14 @@
+group_uniforms uv_shake;
+uniform float uv_shake_speed: hint_range(0.0, 50.0) = 20.;
+uniform float uv_shake_x: hint_range(-15., 15) = 5;
+uniform float uv_shake_y: hint_range(-15., 15) = 4;
+group_uniforms;
+
+vec2 uv_shake(
+ vec2 uv)
+{
+ float x_shake = sin(TIME * uv_shake_speed * 50.) * uv_shake_x;
+ float y_shake = cos(TIME * uv_shake_speed * 50.) * uv_shake_y;
+ uv += vec2(x_shake * 0.012, y_shake * 0.01);
+ return uv;
+}
\ No newline at end of file
diff --git a/VFEZ/Shaders/Effects/vfez_uv_twist.gdshaderinc b/VFEZ/Shaders/Effects/vfez_uv_twist.gdshaderinc
new file mode 100644
index 00000000..720ad137
--- /dev/null
+++ b/VFEZ/Shaders/Effects/vfez_uv_twist.gdshaderinc
@@ -0,0 +1,26 @@
+group_uniforms uv_twist;
+uniform float uv_twist_amount: hint_range(0.0, 3.1415) = 1.;
+uniform float uv_twist_pos_x: hint_range(0.0, 1.0) = 0.5;
+uniform float uv_twist_pos_y: hint_range(0.0, 1.0) = 0.5;
+uniform float uv_twist_radius: hint_range(0.0, 3.0) = 0.75;
+group_uniforms;
+
+vec2 uv_twist(
+ vec2 uv,
+ vec2 main_texture_scale)
+{
+ vec2 twistUV = uv - vec2(uv_twist_pos_x * main_texture_scale.x,
+ uv_twist_pos_y * main_texture_scale.y);
+ float twist_radius = uv_twist_radius *
+ (main_texture_scale.x + main_texture_scale.y) / 2.;
+ float percent = (twist_radius - length(twistUV)) / twist_radius;
+ float theta = percent * percent * (2.0 * sin(uv_twist_amount)) * 8.0;
+ float s = sin(theta);
+ float c = cos(theta);
+ float beta = max(sign(twist_radius - length(twistUV)), 0.);
+ twistUV = vec2(dot(twistUV, vec2(c, -s)), dot(twistUV, vec2(s, c))) * beta + twistUV * (1. - beta);
+ twistUV += vec2(uv_twist_pos_x * main_texture_scale.x,
+ uv_twist_pos_y * main_texture_scale.y);
+ uv = twistUV;
+ return uv;
+}
\ No newline at end of file
diff --git a/VFEZ/Shaders/Effects/vfez_uv_wave.gdshaderinc b/VFEZ/Shaders/Effects/vfez_uv_wave.gdshaderinc
new file mode 100644
index 00000000..12f042d0
--- /dev/null
+++ b/VFEZ/Shaders/Effects/vfez_uv_wave.gdshaderinc
@@ -0,0 +1,22 @@
+group_uniforms uv_wave;
+uniform float uv_wave_amount: hint_range(0.0, 25.0) = 7.;
+uniform float uv_wave_speed: hint_range(0.0, 25.0) = 10.;
+uniform float uv_wave_strength: hint_range(0.0, 25.0) = 7.5;
+uniform float uv_wave_x: hint_range(0.0, 1.0) = 0.;
+uniform float uv_wave_y: hint_range(0.0, 1.0) = 0.5;
+group_uniforms;
+
+vec2 uv_wave(
+ vec2 uv,
+ vec2 viewport_size,
+ vec2 main_texture_scale)
+{
+ vec2 waveUV = vec2(uv_wave_x * main_texture_scale.x,
+ uv_wave_y * main_texture_scale.y) - uv;
+ waveUV.x *= viewport_size.x / viewport_size.y;
+ float ang_wave =
+ (sqrt(dot(waveUV, waveUV)) * uv_wave_amount)
+ - mod(TIME * uv_wave_speed, 360.0);
+ uv = uv + normalize(waveUV) * sin(ang_wave) * (uv_wave_strength / 1000.);
+ return uv;
+}
\ No newline at end of file
diff --git a/VFEZ/Shaders/Effects/vfez_uv_wind.gdshaderinc b/VFEZ/Shaders/Effects/vfez_uv_wind.gdshaderinc
new file mode 100644
index 00000000..8b66bec2
--- /dev/null
+++ b/VFEZ/Shaders/Effects/vfez_uv_wind.gdshaderinc
@@ -0,0 +1,31 @@
+group_uniforms uv_wind;
+uniform float uv_wind_speed: hint_range(0., 50.) = 2.;
+uniform float uv_wind_amount: hint_range(0, 50) = 20;
+uniform float uv_wind_vertical_ratio: hint_range(0.0, 1.0) = 1.;
+uniform vec2 uv_radial_bend_center = vec2(0.5, 0.9);
+uniform bool uv_wind_animate_manual;
+uniform float uv_wind_manual_anim: hint_range(-1, 1) = 1;
+uniform float uv_wind_radial_bend: hint_range(0.0, 5.0) = 0.1;
+group_uniforms;
+
+vec2 uv_wind(vec2 uv)
+{
+ float wind_offset;
+ if (uv_wind_animate_manual)
+ {
+ wind_offset = uv_wind_manual_anim;
+ }
+ else
+ {
+ wind_offset = sin(TIME * uv_wind_speed * 10.);
+ }
+
+ uv.x = mix(uv.x, uv.x + uv_wind_amount * 0.01 * wind_offset,
+ abs(uv_wind_vertical_ratio - uv.y));
+
+ vec2 delta = uv - uv_radial_bend_center;
+ float delta2 = dot(delta, delta);
+ float delta_offset = delta2 * wind_offset;
+ uv = uv + vec2(delta.y, - delta.x) * delta_offset * uv_wind_radial_bend;
+ return uv;
+}
diff --git a/VFEZ/Shaders/Effects/vfez_uv_wrap.gdshaderinc b/VFEZ/Shaders/Effects/vfez_uv_wrap.gdshaderinc
new file mode 100644
index 00000000..30aaa5a9
--- /dev/null
+++ b/VFEZ/Shaders/Effects/vfez_uv_wrap.gdshaderinc
@@ -0,0 +1,15 @@
+group_uniforms uv_wrap;
+uniform float uv_wrap_strength: hint_range(0.0, 0.1) = 0.025;
+uniform float uv_wrap_speed: hint_range(0.0, 25.) = 8;
+uniform float uv_wrap_scale: hint_range(0.05, 3.) = 0.5;
+group_uniforms;
+
+vec2 uv_wrap(vec2 uv, vec2 main_texture_scale)
+{
+ vec2 norm_uv = uv / main_texture_scale;
+ float x_wrap = TIME * uv_wrap_speed + norm_uv.x * TAU / uv_wrap_scale;
+ float y_wrap = TIME * uv_wrap_speed + norm_uv.y * TAU / uv_wrap_scale;
+ vec2 wrap = vec2(sin(x_wrap), cos(y_wrap)) * uv_wrap_strength;
+ uv += wrap;
+ return uv;
+}
\ No newline at end of file
diff --git a/VFEZ/Shaders/Effects/vfez_uv_zoom.gdshaderinc b/VFEZ/Shaders/Effects/vfez_uv_zoom.gdshaderinc
new file mode 100644
index 00000000..b6c03045
--- /dev/null
+++ b/VFEZ/Shaders/Effects/vfez_uv_zoom.gdshaderinc
@@ -0,0 +1,13 @@
+group_uniforms uv_zoom;
+uniform vec2 uv_zoom_center = vec2(0.5);
+uniform float uv_zoom_amount: hint_range(0.1, 5.) = 0.5;
+group_uniforms;
+
+vec2 uv_zoom(vec2 uv, vec2 main_texture_scale)
+{
+ vec2 norm_center = uv_zoom_center / main_texture_scale;
+ uv -= norm_center;
+ uv = uv * uv_zoom_amount;
+ uv += norm_center;
+ return uv;
+}
\ No newline at end of file
diff --git a/VFEZ/Shaders/Effects/vfez_vertex_expand.gdshaderinc b/VFEZ/Shaders/Effects/vfez_vertex_expand.gdshaderinc
new file mode 100644
index 00000000..668dccbb
--- /dev/null
+++ b/VFEZ/Shaders/Effects/vfez_vertex_expand.gdshaderinc
@@ -0,0 +1,18 @@
+group_uniforms vertex_expand;
+uniform vec3 vertex_expand_center = vec3(0.);
+uniform bool vertex_expand_ignore_center_vertical = false;
+uniform float vertex_expand_amount: hint_range(0.0, 10.) = 0.5;
+group_uniforms;
+
+vec3 vertex_expand(
+ vec3 vertex)
+{
+ vec3 final_expand_center = vertex_expand_center;
+ if (vertex_expand_ignore_center_vertical)
+ {
+ final_expand_center.z = vertex.z;
+ }
+ vec3 expand_dir = normalize(vertex - final_expand_center);
+ vertex += expand_dir * vertex_expand_amount;
+ return vertex;
+}
\ No newline at end of file
diff --git a/VFEZ/Shaders/Effects/vfez_vertex_offset.gdshaderinc b/VFEZ/Shaders/Effects/vfez_vertex_offset.gdshaderinc
new file mode 100644
index 00000000..63c6f5ee
--- /dev/null
+++ b/VFEZ/Shaders/Effects/vfez_vertex_offset.gdshaderinc
@@ -0,0 +1,18 @@
+group_uniforms vertex_offset;
+uniform sampler2D vertex_offset_texture: source_color;
+uniform float vertex_offset_amount: hint_range(0.0, 2.) = 0.5;
+uniform float vertex_offset_power: hint_range(0.01, 10.) = 1.;
+uniform vec2 vertex_offset_speed;
+group_uniforms;
+
+vec3 vertex_offset(
+ vec3 vertex,
+ vec3 normal,
+ vec2 uv)
+{
+ vec2 offsetUV = uv;
+ offsetUV += mod(TIME * vertex_offset_speed, 1.0);
+ float offset = textureLod(vertex_offset_texture, offsetUV, 0.).r;
+ vertex = vertex + normal * vertex_offset_amount * pow(offset, vertex_offset_power);
+ return vertex;
+}
\ No newline at end of file
diff --git a/VFEZ/Shaders/vfez_2d_example.gdshader b/VFEZ/Shaders/vfez_2d_example.gdshader
new file mode 100644
index 00000000..6ff5c7e5
--- /dev/null
+++ b/VFEZ/Shaders/vfez_2d_example.gdshader
@@ -0,0 +1,64 @@
+// this code servers as an example VFEZ2D shader
+// that uses the VFEZ2D template. Files like this are
+// automatically generated using the VFEZMaterial but you
+// can also create them manually like the example below.
+
+shader_type canvas_item;
+
+#define BLEND_MIX
+//#define BLEND_ADD
+//#define BLEND_SUB
+//#define BLEND_MUL
+//#define BLEND_PREMUL_ALPHA
+
+// #define UNSHADED
+// #define LIGHT_ONLY
+
+#define UV_POLAR
+#define UV_DISTORTION
+#define UV_ROTATION
+#define UV_PIXELATE
+#define UV_TWIST
+#define UV_FISHEYE
+#define UV_PINCH
+#define UV_HANDRAWN
+#define UV_SHAKE
+#define UV_WAVE
+#define UV_ROUND_WAVE
+#define UV_WIND
+#define UV_WRAP
+#define UV_ZOOM
+
+#define COLOR_SINGLE
+#define COLOR_OVERLAY_TEXTURE
+#define OUTLINE
+#define OUTLINE_INNER
+
+#define ALPHA_DISOLVE
+#define CHROMATIC_ABERRATION
+#define MOTION_BLUR
+#define GLITCH
+#define COLOR_GRADIENT
+#define COLOR_RADIAL_GRADIENT
+#define COLOR_TONING
+#define COLOR_RAMP
+#define COLOR_CHANGE
+#define COLOR_GHOST
+#define COLOR_HOLOGRAM
+#define COLOR_POSTERIZE
+#define COLOR_NEGATIVE
+#define COLOR_GLOW
+#define COLOR_HSV_SHIFT
+#define COLOR_SHADOW
+#define COLOR_GREYSCALE
+
+#define ALPHA_MASK
+#define ALPHA_REMAP
+#define ALPHA_CUTOFF
+#define ALPHA_CLIP
+#define ALPHA_RADIAL_CLIP
+#define ALPHA_FLICKER
+
+#define PARTICLE_ANIM
+
+#include "vfez_2d_template.gdshaderinc"
\ No newline at end of file
diff --git a/VFEZ/Shaders/vfez_2d_template.gdshaderinc b/VFEZ/Shaders/vfez_2d_template.gdshaderinc
new file mode 100644
index 00000000..11dcae1a
--- /dev/null
+++ b/VFEZ/Shaders/vfez_2d_template.gdshaderinc
@@ -0,0 +1,753 @@
+// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+// THE CODE BELOW IS NOT INTENDED TO BE CHANGED MANUALLY.
+// MANUAL CHANGES MIGHT CAUSE THE VFEZ MATERIAL TO WORK INCORRECTLY.
+// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+// shader code starts here -----------------------------------------------
+
+#include "Effects/vfez_utils.gdshaderinc"
+
+#if defined(UNSHADED)
+ render_mode unshaded;
+#elif defined(LIGHT_ONLY)
+ render_mode light_only;
+#endif
+
+#if defined(BLEND_MIX)
+ render_mode blend_mix;
+#elif defined(BLEND_ADD)
+ render_mode blend_add;
+#elif defined(BLEND_SUB)
+ render_mode blend_sub;
+#elif defined(BLEND_MUL)
+ render_mode blend_mul;
+#elif defined(BLEND_PREMUL_ALPHA)
+ render_mode blend_premul_alpha;
+#endif
+
+group_uniforms base;
+uniform vec2 texture_scale = vec2(1.);
+uniform vec2 texture_offset = vec2(0.);
+uniform vec2 texture_scroll_speed = vec2(0.);
+uniform bool replicate_on_scale = true;
+uniform vec4 texture_color: source_color = vec4(1.);
+uniform float texture_alpha: hint_range(0.0, 1.0) = 1.;
+uniform bool texture_red_as_alpha = false;
+uniform bool premultiply_color = false;
+uniform bool premultiply_alpha = false;
+uniform float contrast: hint_range(0.0, 10) = 1.;
+uniform float brightness: hint_range(-1., 1.) = 0.;
+group_uniforms;
+
+group_uniforms rect_size;
+uniform float rect_size_ratio: hint_range(1.0, 5.0) = 1.0;
+group_uniforms;
+
+group_uniforms uv_polar;
+uniform bool use_uv_polar = false;
+#if defined(UV_POLAR)
+ uniform vec2 uv_polar_center = vec2(0.5);
+ uniform bool distortion_uses_uv_polar = false;
+#endif
+group_uniforms;
+
+group_uniforms uv_distortion;
+uniform bool use_uv_distortion;
+#if defined(UV_DISTORTION)
+ uniform sampler2D distortion_tex: source_color;
+ uniform vec2 distortion_tex_scale = vec2(1.);
+ uniform vec2 distortion_tex_offset = vec2(0.);
+ uniform float distortion_amount: hint_range(0.0, 10) = 0.0;
+ uniform vec2 distortion_speed = vec2(0.1);
+#endif
+group_uniforms;
+
+group_uniforms uv_rotation;
+uniform bool use_uv_rotation;
+#if defined(UV_ROTATION)
+ uniform float uv_rotation_offset: hint_range(0.0, 6.28318530718) = 0.;
+ uniform float uv_rotation_speed = 0.;
+#endif
+group_uniforms;
+
+group_uniforms uv_pixelate;
+uniform bool use_uv_pixelate = false;
+group_uniforms;
+#if defined(UV_PIXELATE)
+ #include "Effects/vfez_uv_pixelate.gdshaderinc"
+#endif
+
+group_uniforms uv_twist;
+uniform bool use_uv_twist = false;
+group_uniforms;
+#if defined(UV_TWIST)
+ #include "Effects/vfez_uv_twist.gdshaderinc"
+#endif
+
+group_uniforms uv_fisheye;
+uniform bool use_uv_fisheye;
+group_uniforms;
+#if defined(UV_FISHEYE)
+ #include "Effects/vfez_uv_fisheye.gdshaderinc"
+#endif
+
+group_uniforms uv_pinch;
+uniform bool use_uv_pinch;
+group_uniforms;
+#if defined(UV_PINCH)
+ #include "Effects/vfez_uv_pinch.gdshaderinc"
+#endif
+
+group_uniforms uv_handrawn;
+uniform bool use_uv_handrawn = false;
+group_uniforms;
+#if defined(UV_HANDRAWN)
+ #include "Effects/vfez_uv_handrawn.gdshaderinc"
+#endif
+
+group_uniforms uv_shake;
+uniform bool use_uv_shake = false;
+group_uniforms;
+#if defined(UV_SHAKE)
+ #include "Effects/vfez_uv_shake.gdshaderinc"
+#endif
+
+group_uniforms uv_wave;
+uniform bool use_uv_wave = false;
+group_uniforms;
+#if defined(UV_WAVE)
+ #include "Effects/vfez_uv_wave.gdshaderinc"
+#endif
+
+group_uniforms uv_round_wave;
+uniform bool use_uv_round_wave = false;
+group_uniforms;
+#if defined(UV_ROUND_WAVE)
+ #include "Effects/vfez_uv_round_wave.gdshaderinc"
+#endif
+
+group_uniforms uv_wind;
+uniform bool use_uv_wind = false;
+group_uniforms;
+#if defined(UV_WIND)
+ #include "Effects/vfez_uv_wind.gdshaderinc"
+#endif
+
+group_uniforms uv_wrap;
+uniform bool use_uv_wrap = false;
+group_uniforms;
+#if defined(UV_WRAP)
+ #include "Effects/vfez_uv_wrap.gdshaderinc"
+#endif
+
+group_uniforms uv_zoom;
+uniform bool use_uv_zoom = false;
+group_uniforms;
+#if defined(UV_ZOOM)
+ #include "Effects/vfez_uv_zoom.gdshaderinc"
+#endif
+
+group_uniforms color_single;
+uniform bool use_color_single;
+group_uniforms;
+#if defined(COLOR_SINGLE)
+ #include "Effects/vfez_color_single.gdshaderinc"
+#endif
+
+group_uniforms color_overlay_texture;
+uniform bool use_color_overlay_texture;
+group_uniforms;
+#if defined(COLOR_OVERLAY_TEXTURE)
+ #include "Effects/vfez_color_overlay_texture.gdshaderinc"
+#endif
+
+group_uniforms outline;
+uniform bool use_outline;
+group_uniforms;
+#if defined(OUTLINE)
+ #include "Effects/vfez_outline.gdshaderinc"
+#endif
+
+group_uniforms outline_inner;
+uniform bool use_outline_inner;
+group_uniforms;
+#if defined(OUTLINE_INNER)
+ #include "Effects/vfez_outline_inner.gdshaderinc"
+#endif
+
+group_uniforms alpha_disolve;
+uniform bool use_alpha_disolve = false;
+group_uniforms;
+#if defined(ALPHA_DISOLVE)
+ #include "Effects/vfez_alpha_disolve.gdshaderinc"
+#endif
+
+group_uniforms chromatic_aberration;
+uniform bool use_chromatic_aberration;
+group_uniforms;
+#if defined(CHROMATIC_ABERRATION)
+ #include "Effects/vfez_chromatic_aberration.gdshaderinc"
+#endif
+
+group_uniforms motion_blur;
+uniform bool use_motion_blur = false;
+group_uniforms;
+#if defined(MOTION_BLUR)
+ #include "Effects/vfez_motion_blur.gdshaderinc"
+#endif
+
+group_uniforms glitch;
+uniform bool use_glitch = false;
+group_uniforms;
+#if defined(GLITCH)
+ #include "Effects/vfez_glitch.gdshaderinc"
+#endif
+
+group_uniforms color_gradient;
+uniform bool use_color_gradient = false;
+group_uniforms;
+#if defined(COLOR_GRADIENT)
+ #include "Effects/vfez_color_gradient.gdshaderinc"
+#endif
+
+group_uniforms color_radial_gradient;
+uniform bool use_color_radial_gradient = false;
+group_uniforms;
+#if defined(COLOR_RADIAL_GRADIENT)
+ #include "Effects/vfez_color_radial_gradient.gdshaderinc"
+#endif
+
+group_uniforms color_toning;
+uniform bool use_color_toning = false;
+group_uniforms;
+#if defined(COLOR_TONING)
+ #include "Effects/vfez_color_toning.gdshaderinc"
+#endif
+
+group_uniforms color_ramp;
+uniform bool use_color_ramp = false;
+group_uniforms;
+#if defined(COLOR_RAMP)
+ #include "Effects/vfez_color_ramp.gdshaderinc"
+#endif
+
+group_uniforms color_change;
+uniform bool use_color_change = false;
+group_uniforms;
+#if defined(COLOR_CHANGE)
+ #include "Effects/vfez_color_change.gdshaderinc"
+#endif
+
+group_uniforms color_ghost;
+uniform bool use_color_ghost = false;
+group_uniforms;
+#if defined(COLOR_GHOST)
+ #include "Effects/vfez_color_ghost.gdshaderinc"
+#endif
+
+group_uniforms color_hologram;
+uniform bool use_color_hologram = false;
+group_uniforms;
+#if defined(COLOR_HOLOGRAM)
+ #include "Effects/vfez_color_hologram.gdshaderinc"
+#endif
+
+group_uniforms color_posterize;
+uniform bool use_color_posterize = false;
+group_uniforms;
+#if defined(COLOR_POSTERIZE)
+ #include "Effects/vfez_color_posterize.gdshaderinc"
+#endif
+
+group_uniforms color_negative;
+uniform bool use_color_negative;
+group_uniforms;
+#if defined(COLOR_NEGATIVE)
+ #include "Effects/vfez_color_negative.gdshaderinc"
+#endif
+
+group_uniforms color_glow;
+uniform bool use_color_glow = false;
+group_uniforms;
+#if defined(COLOR_GLOW)
+ #include "Effects/vfez_color_glow.gdshaderinc"
+#endif
+
+group_uniforms color_hsv_shift;
+uniform bool use_color_hsv_shift = false;
+group_uniforms;
+#if defined(COLOR_HSV_SHIFT)
+ #include "Effects/vfez_hsv_shift.gdshaderinc"
+#endif
+
+group_uniforms color_shadow;
+uniform bool use_color_shadow = false;
+group_uniforms;
+#if defined(COLOR_SHADOW)
+ #include "Effects/vfez_color_shadow.gdshaderinc"
+#endif
+
+group_uniforms color_greyscale;
+uniform bool use_color_greyscale= false;
+group_uniforms;
+#if defined(COLOR_GREYSCALE)
+ #include "Effects/vfez_color_greyscale.gdshaderinc"
+#endif
+
+group_uniforms color_shine;
+uniform bool use_color_shine= false;
+group_uniforms;
+#if defined(COLOR_SHINE)
+ #include "Effects/vfez_color_shine.gdshaderinc"
+#endif
+
+
+group_uniforms alpha_mask;
+uniform bool use_alpha_mask = false;
+group_uniforms;
+#if defined(ALPHA_MASK)
+ #include "Effects/vfez_alpha_mask.gdshaderinc"
+#endif
+
+group_uniforms alpha_remap;
+uniform bool use_alpha_remap = false;
+group_uniforms alpha_remap;
+#if defined(ALPHA_REMAP)
+ #include "Effects/vfez_alpha_remap.gdshaderinc"
+#endif
+
+group_uniforms alpha_cutoff;
+uniform bool use_alpha_cutoff = false;
+group_uniforms;
+#if defined(ALPHA_CUTOFF)
+ #include "Effects/vfez_alpha_cutoff.gdshaderinc"
+#endif
+
+group_uniforms alpha_clip;
+uniform bool use_alpha_clip = false;
+group_uniforms;
+#if defined(ALPHA_CLIP)
+ #include "Effects/vfez_alpha_clip.gdshaderinc"
+#endif
+
+group_uniforms alpha_radial_clip;
+uniform bool use_alpha_radial_clip = false;
+group_uniforms;
+#if defined(ALPHA_RADIAL_CLIP)
+ #include "Effects/vfez_alpha_radial_clip.gdshaderinc"
+#endif
+
+group_uniforms alpha_flicker;
+uniform bool use_alpha_flicker = false;
+group_uniforms;
+#if defined(ALPHA_FLICKER)
+ #include "Effects/vfez_alpha_flicker.gdshaderinc"
+#endif
+
+group_uniforms particle.particle_anim;
+uniform bool use_particle_anim = false;
+group_uniforms;
+
+#if defined(PARTICLE_ANIM)
+ #include "Effects/vfez_particle_anim.gdshaderinc"
+#endif
+
+void vertex() {
+ #if defined(PARTICLE_ANIM)
+ if (use_particle_anim)
+ {
+ UV = particle_anim(INSTANCE_CUSTOM.z, UV);
+ }
+ #endif
+
+ VERTEX += VERTEX * (rect_size_ratio - 1.0);
+}
+
+void fragment() {
+
+ vec2 startUV = UV * rect_size_ratio + vec2(-rect_size_ratio * 0.5 + 0.5);
+ vec2 baseUV = startUV;
+
+ #if defined(UV_POLAR)
+ if (use_uv_polar)
+ {
+ baseUV = uv_polar(baseUV, uv_polar_center);
+ }
+ #endif
+
+ baseUV = transform_uv(
+ baseUV,
+ texture_scale,
+ texture_offset,
+ replicate_on_scale);
+
+ #if defined(UV_DISTORTION)
+ if (use_uv_distortion && distortion_amount > 0.)
+ {
+ vec2 distortionUV = startUV;
+ distortionUV = transform_uv(
+ distortionUV,
+ distortion_tex_scale,
+ distortion_tex_offset,
+ true);
+
+ #if defined(UV_POLAR)
+ if (use_uv_polar && distortion_uses_uv_polar)
+ {
+ distortionUV = uv_polar(distortionUV, uv_polar_center);
+ }
+ #endif
+
+ baseUV = uv_distortion(baseUV, distortion_tex, distortionUV, distortion_amount, distortion_speed, true);
+ }
+ #endif
+
+ #if defined(UV_ROTATION)
+ if (use_uv_rotation)
+ {
+ baseUV = rotate_uvs(
+ baseUV,
+ uv_rotation_offset + mod(uv_rotation_speed * TIME, TAU),
+ texture_scale,
+ texture_offset);
+ }
+ #endif
+
+ #if defined(UV_PIXELATE)
+ if (use_uv_pixelate)
+ {
+ vec2 texture_size = 1. / TEXTURE_PIXEL_SIZE;
+ baseUV = uv_pixelate(baseUV, texture_size);
+ }
+ #endif
+
+ #if defined(UV_TWIST)
+ if (use_uv_twist)
+ {
+ baseUV = uv_twist(baseUV, texture_scale);
+ }
+ #endif
+
+ #if defined (UV_FISHEYE)
+ if (use_uv_fisheye)
+ {
+ baseUV = uv_fisheye(baseUV, texture_scale);
+ }
+ #endif
+
+ #if defined(UV_PINCH)
+ if (use_uv_pinch)
+ {
+ baseUV = uv_pinch(baseUV, texture_scale);
+ }
+ #endif
+
+ #if defined(UV_HANDRAWN)
+ if (use_uv_handrawn)
+ {
+ baseUV = uv_handrawn(baseUV);
+ }
+ #endif
+
+ #if defined(UV_SHAKE)
+ if (use_uv_shake)
+ {
+ baseUV = uv_shake(baseUV);
+ }
+ #endif
+
+ #if defined(UV_WAVE)
+ if (use_uv_wave)
+ {
+ vec2 texture_size = 1. / TEXTURE_PIXEL_SIZE;
+ baseUV = uv_wave(baseUV, texture_size, texture_scale);
+ }
+ #endif
+
+ #if defined(UV_ROUND_WAVE)
+ if (use_uv_round_wave)
+ {
+ vec2 main_tex_size = vec2(textureSize(TEXTURE, 0));
+ baseUV = uv_round_wave(baseUV, main_tex_size, texture_scale);
+ }
+ #endif
+
+
+ #if defined(UV_WIND)
+ if (use_uv_wind)
+ {
+ baseUV = uv_wind(baseUV);
+ }
+ #endif
+
+ #if defined(UV_WRAP)
+ if (use_uv_wrap)
+ {
+ baseUV = uv_wrap(baseUV, texture_scale);
+ }
+ #endif
+
+ #if defined(UV_ZOOM)
+ if (use_uv_zoom)
+ {
+ baseUV = uv_zoom(baseUV, texture_scale);
+ }
+ #endif
+
+ vec4 color = sample_texture_with_scroll(
+ TEXTURE,
+ baseUV,
+ texture_scroll_speed,
+ TIME);
+
+ if (texture_red_as_alpha)
+ {
+ color = vec4(texture_color.rgb * color.rgb, color.r);
+ }
+ else
+ {
+ color *= texture_color;
+ }
+
+ bool apply_contrast = contrast != 1. || brightness != 0.;
+
+ if (apply_contrast)
+ {
+ if (texture_red_as_alpha)
+ {
+ color.a = clamp(
+ (color.a - 0.5) * contrast + 0.5 + brightness,
+ 0.,
+ 1.);
+ }
+ else
+ {
+ color.rgb = vec3(
+ max(0, (color.r - 0.5) * contrast + 0.5 + brightness),
+ max(0, (color.g - 0.5) * contrast + 0.5 + brightness),
+ max(0, (color.b - 0.5) * contrast + 0.5 + brightness)
+ );
+ }
+ }
+
+ // ----------------------------------------------
+
+ // apply premultiply color
+ if (premultiply_color)
+ {
+ float luminance = get_color_luminance(color);
+ color.a = min(luminance, color.a);
+ }
+
+ /// apply premultiply alpha
+ if (premultiply_alpha)
+ {
+ color.rgb *= color.a;
+ }
+
+ #if defined(COLOR_SINGLE)
+ if (use_color_single)
+ {
+ color.rgb = color_single(color.rgb);
+ }
+ #endif
+
+ #if defined(COLOR_OVERLAY_TEXTURE)
+ if (use_color_overlay_texture)
+ {
+ color = color_overlay_texture(color, baseUV);
+ }
+ #endif
+
+ #if defined(OUTLINE)
+ if (use_outline)
+ {
+ color = outline(color, TEXTURE_PIXEL_SIZE, baseUV, TEXTURE);
+ }
+ #endif
+
+ #if defined(OUTLINE_INNER)
+ if (use_outline_inner)
+ {
+ color = outline_inner(color, TEXTURE_PIXEL_SIZE, baseUV, TEXTURE);
+ }
+ #endif
+
+ #if defined(ALPHA_DISOLVE)
+ if (use_alpha_disolve)
+ {
+ color = alpha_disolve(color, color.a, COLOR.a, baseUV, false);
+ }
+ #endif
+
+ #if defined(CHROMATIC_ABERRATION)
+ if (use_chromatic_aberration)
+ {
+ color = chromatic_aberration(color, baseUV, TEXTURE);
+ }
+ #endif
+
+ #if defined(MOTION_BLUR)
+ if (use_motion_blur)
+ {
+ color.rgb = motion_blur(color.rgb, baseUV, TEXTURE);
+ }
+ #endif
+
+ #if defined(GLITCH)
+ if (use_glitch)
+ {
+ color.rgb = glitch(color.rgb, baseUV, TEXTURE);
+ }
+ #endif
+
+ #if defined(COLOR_GRADIENT)
+ if (use_color_gradient)
+ {
+ color.rgba = color_gradient(color, baseUV, texture_scale);
+ }
+ #endif
+
+ #if defined(COLOR_RADIAL_GRADIENT)
+
+ if (use_color_radial_gradient)
+ {
+ vec2 main_tex_size = vec2(textureSize(TEXTURE, 0));
+ color.rgba = color_radial_gradient(color, baseUV, texture_scale, main_tex_size);
+ }
+ #endif
+
+ // apply color grading if defined
+ #if defined(COLOR_TONING)
+ if (use_color_toning)
+ {
+ color.rgb = color_toning(color);
+ }
+ #endif
+
+ // apply color ramp if defined
+ #if defined(COLOR_RAMP)
+ if (use_color_ramp)
+ {
+ color = color_ramp(color);
+ }
+ #endif
+
+ #if defined(COLOR_CHANGE)
+ if (use_color_change)
+ {
+ color.rgb = color_change(color.rgb);
+ }
+ #endif
+
+ #if defined(COLOR_GHOST)
+ if (use_color_ghost)
+ {
+ color = color_ghost(color);
+ }
+ #endif
+
+ #if defined(COLOR_HOLOGRAM)
+ if (use_color_hologram)
+ {
+ color = color_hologram(color, baseUV);
+ }
+ #endif
+
+ #if defined(COLOR_POSTERIZE)
+ if (use_color_posterize)
+ {
+ color.rgb = color_posterize(color.rgb);
+ }
+ #endif
+
+ #if defined(COLOR_NEGATIVE)
+ if (use_color_negative)
+ {
+ color.rgb = color_negative(color.rgb);
+ }
+ #endif
+
+ #if defined(COLOR_GLOW)
+ if (use_color_glow)
+ {
+ color.rgb = color_glow(color, baseUV, 1.);
+ }
+ #endif
+
+ #if defined(COLOR_HSV_SHIFT)
+ if (use_color_hsv_shift)
+ {
+ color.rgb = hsv_shift(color.rgb);
+ }
+ #endif
+
+ #if defined(COLOR_SHADOW)
+ if (use_color_shadow)
+ {
+ color = shadow(color, TEXTURE, baseUV);
+ }
+ #endif
+
+ #if defined(COLOR_GREYSCALE)
+ if (use_color_greyscale)
+ {
+ color.rgb = color_greyscale(color.rgb);
+ }
+ #endif
+
+ #if defined(COLOR_SHINE)
+ if (use_color_shine)
+ {
+ color = color_shine(color, baseUV);
+ }
+ #endif
+
+ #if defined(ALPHA_MASK)
+ if (use_alpha_mask)
+ {
+ color.a = alpha_mask(color.a, baseUV, true);
+ }
+ #endif
+
+ #if defined(ALPHA_REMAP)
+ if (use_alpha_remap)
+ {
+ color.a = alpha_remap(color.a);
+ }
+ #endif
+
+ #if defined(ALPHA_CUTOFF)
+ if (use_alpha_cutoff)
+ {
+ color.a = alpha_cutoff(color.a);
+ }
+ #endif
+
+ #if defined(ALPHA_CLIP)
+ if (use_alpha_clip)
+ {
+ color.a = alpha_clip(color.a, baseUV, texture_scale);
+ }
+ #endif
+
+ #if defined(ALPHA_RADIAL_CLIP)
+ if (use_alpha_radial_clip)
+ {
+ color.a = alpha_radial_clip(color.a, baseUV, texture_scale);
+ }
+ #endif
+
+ #if defined(ALPHA_FLICKER)
+ if (use_alpha_flicker)
+ {
+ color.a = alpha_flicker(color.a);
+ }
+ #endif
+
+ color.a *= texture_alpha;
+
+ // if the following line throws an error thats a godot bug, ignore it.
+ // Shader works as intented
+ COLOR = color;
+}
\ No newline at end of file
diff --git a/VFEZ/Shaders/vfez_3d_example.gdshader b/VFEZ/Shaders/vfez_3d_example.gdshader
new file mode 100644
index 00000000..65499542
--- /dev/null
+++ b/VFEZ/Shaders/vfez_3d_example.gdshader
@@ -0,0 +1,72 @@
+// this code servers as an example VFEZ3D shader
+// that uses the VFEZ3D template. Files like this are
+// automatically generated using the VFEZMaterial but you
+// can also create them manually like the example below.
+
+shader_type spatial;
+
+#define BLEND_MIX
+//#define BLEND_ADD
+//#define BLEND_SUB
+//#define BLEND_MUL
+//#define BLEND_PREMUL_ALPHA
+
+#define DEPTH_DRAW_OPAQUE
+//#define DEPTH_DRAW_ALWAYS
+//#define DEPTH_DRAW_NEVER
+
+#define CULL_BACK
+//#define CULL_FRONT
+//#define CULL_DISABLED
+
+#define DIFFUSE_LAMBERT
+//#define DIFFUSE_LABERT_WRAP
+//#define DIFFUSE_BURLEY
+//#define DIFFUSE_TOON
+
+#define SPECULAR_SCHLICK_GGX
+//#define SPECULAR_TOON
+//#define SPECULAR_DISABLED
+
+//#define UNSHADED
+
+//#define BILLBOARD_ENABLED
+//#define BILLBOARD_Y
+//#define BILLBOARD_PARTICLE
+//#define BILLBOARD_KEEP_SCALE
+
+//#define NO_DEPTH_TEST
+
+//#define PARTICLE_TRAILS
+//#define PARTICLE_ANIM
+
+// enable more shapes to blend more textures
+#define SHAPE2
+#define SHAPE3
+
+#define UV_PIXELATE
+#define UV_TWIST
+#define UV_HANDRAWN
+#define UV_SHAKE
+#define UV_WAVE
+#define UV_ROUND_WAVE
+#define UV_GLOBAL_DISTORTION
+
+#define ALPHA_DISOLVE
+
+#define COLOR_FACE_TINT
+#define COLOR_TONING
+#define COLOR_RAMP
+#define COLOR_POSTERIZE
+#define COLOR_RIM
+#define COLOR_GLOW
+#define COLOR_HSV_SHIFT
+
+#define ALPHA_MASK
+#define ALPHA_REMAP
+#define ALPHA_CUTOFF
+
+#define VERTEX_OFFSET
+#define VERTEX_EXPAND
+
+#include "vfez_3d_template.gdshaderinc"
diff --git a/VFEZ/Shaders/vfez_3d_template.gdshaderinc b/VFEZ/Shaders/vfez_3d_template.gdshaderinc
new file mode 100644
index 00000000..891b9a63
--- /dev/null
+++ b/VFEZ/Shaders/vfez_3d_template.gdshaderinc
@@ -0,0 +1,913 @@
+// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+// THE CODE BELOW IS NOT INTENDED TO BE CHANGED MANUALLY.
+// MANUAL CHANGES MIGHT CAUSE THE VFEZ MATERIAL TO WORK INCORRECTLY.
+// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+// shader code starts here -----------------------------------------------
+
+#ifndef VFEZ_UTILS
+ #include "Effects/vfez_utils.gdshaderinc"
+ #define VFEZ_UTILS
+#endif
+
+#if defined(UNSHADED)
+ render_mode unshaded;
+#endif
+
+#if defined(BLEND_MIX)
+ render_mode blend_mix;
+#elif defined(BLEND_ADD)
+ render_mode blend_add;
+#elif defined(BLEND_SUB)
+ render_mode blend_sub;
+#elif defined(BLEND_MUL)
+ render_mode blend_mul;
+#elif defined(BLEND_PREMUL_ALPHA)
+ render_mode blend_premul_alpha;
+#endif
+
+#if defined(DEPTH_DRAW_OPAQUE)
+ render_mode depth_draw_opaque;
+#elif defined(DEPTH_DRAW_ALWAYS)
+ render_mode depth_draw_always;
+#elif defined(DEPTH_DRAW_NEVER)
+ render_mode depth_draw_never;
+#endif
+
+#if defined(CULL_BACK)
+ render_mode cull_back;
+#elif defined(CULL_FRONT)
+ render_mode cull_front;
+#elif defined (CULL_DISABLED)
+ render_mode cull_disabled;
+#endif
+
+#if defined(DIFFUSE_LAMBERT)
+ render_mode diffuse_lambert;
+#elif defined(DIFFUSE_LAMBERT_WRAP)
+ render_mode diffuse_lambert_wrap;
+#elif defined(DIFFUSE_BURLEY)
+ render_mode diffuse_burley;
+#elif defined(DIFFUSE_TOON)
+ render_mode diffuse_toon;
+#endif
+
+#if defined(SPECULAR_SCHLICK_GGX)
+ render_mode specular_schlick_ggx;
+#elif defined(SPECULAR_TOON)
+ render_mode specular_toon;
+#elif defined(SPECULAR_DISABLED)
+ render_mode specular_disabled;
+#endif
+
+#if defined(NO_DEPTH_TEST)
+ render_mode depth_test_disabled;
+#endif
+
+#if defined(PARTICLE_TRAILS)
+ render_mode particle_trails;
+#endif
+
+group_uniforms general;
+uniform vec3 global_color: source_color = vec3(1.);
+uniform float global_alpha: hint_range(0.0, 1.0) = 1.;
+uniform bool additive_config = false;
+uniform bool premultiply_color = false;
+uniform bool premultiply_alpha = false;
+group_uniforms;
+
+group_uniforms shape1.shape_texture;
+uniform sampler2D shape1_main_texture: source_color, filter_nearest;
+uniform vec2 shape1_main_texture_scale = vec2(1.);
+uniform vec2 shape1_main_texture_offset = vec2(0.);
+uniform vec4 shape1_color: source_color = vec4(1.);
+uniform bool shape1_red_as_alpha = false;
+uniform vec2 shape1_scroll_speed = vec2(0.);
+uniform float shape1_rotation_offset: hint_range(0.0, 6.28318530718) = 0.;
+uniform float shape1_rotation_speed = 0.;
+group_uniforms;
+
+group_uniforms shape1.contrast_brightness;
+uniform float shape1_contrast: hint_range(0.0, 10) = 1.;
+uniform float shape1_brightness: hint_range(-1., 1.) = 0.;
+group_uniforms;
+
+group_uniforms shape1.distortion;
+uniform sampler2D shape1_distortion_texture: source_color;
+uniform vec2 shape1_distortion_texture_scale = vec2(1.);
+uniform vec2 shape1_distortion_texture_offset = vec2(0.);
+uniform float shape1_distortion_amount: hint_range(0.0, 10) = 0.0;
+uniform vec2 shape1_distortion_speed = vec2(0.1);
+group_uniforms;
+
+group_uniforms shape1.polar_uv;
+uniform bool shape1_use_polar_uv = false;
+uniform vec2 shape1_polar_uv_center = vec2(0.5);
+uniform bool shape1_distortion_polar_uvs = false;
+group_uniforms;
+
+group_uniforms shape1.screenspace_uv;
+uniform bool shape1_use_screenspace_uv;
+group_uniforms;
+
+group_uniforms shape2;
+uniform bool use_shape2 = false;
+group_uniforms;
+
+#if defined(SHAPE2)
+ group_uniforms shape2.shape_texture;
+ uniform sampler2D shape2_main_texture: source_color, filter_nearest;
+ uniform vec2 shape2_main_texture_scale = vec2(1.);
+ uniform vec2 shape2_main_texture_offset = vec2(0.);
+ uniform vec4 shape2_color: source_color = vec4(1.);
+ uniform bool shape2_red_as_alpha = false;
+ uniform vec2 shape2_scroll_speed = vec2(0.);
+ uniform float shape2_rotation_offset: hint_range(0.0, 6.28318530718) = 0.;
+ uniform float shape2_rotation_speed = 0.;
+ group_uniforms;
+
+ group_uniforms shape2.contrast_brightness;
+ uniform float shape2_contrast: hint_range(0.0, 10) = 1.;
+ uniform float shape2_brightness: hint_range(-1., 1.) = 0.;
+ group_uniforms;
+
+ group_uniforms shape2.distortion;
+ uniform sampler2D shape2_distortion_texture: source_color;
+ uniform vec2 shape2_distortion_texture_scale = vec2(1.);
+ uniform vec2 shape2_distortion_texture_offset = vec2(0.);
+ uniform float shape2_distortion_amount: hint_range(0.0, 10) = 0.0;
+ uniform vec2 shape2_distortion_speed = vec2(0.1);
+ group_uniforms;
+
+ group_uniforms shape2.polar_uv;
+ uniform bool shape2_use_polar_uv = false;
+ uniform vec2 shape2_polar_uv_center = vec2(0.5);
+ uniform bool shape2_distortion_polar_uvs = false;
+ group_uniforms;
+
+ group_uniforms shape2.screenspace_uv;
+ uniform bool shape2_use_screenspace_uv;
+ group_uniforms;
+#endif
+
+group_uniforms shape3;
+uniform bool use_shape3 = false;
+group_uniforms;
+
+#if defined(SHAPE3)
+ group_uniforms shape3.shape_texture;
+ uniform sampler2D shape3_main_texture: source_color, filter_nearest;
+ uniform vec2 shape3_main_texture_scale = vec2(1.);
+ uniform vec2 shape3_main_texture_offset = vec2(0.);
+ uniform vec4 shape3_color: source_color = vec4(1.);
+ uniform bool shape3_red_as_alpha = false;
+ uniform vec2 shape3_scroll_speed = vec2(0.);
+ uniform float shape3_rotation_offset: hint_range(0.0, 6.28318530718) = 0.;
+ uniform float shape3_rotation_speed = 0.;
+ group_uniforms;
+
+ group_uniforms shape3.contrast_brightness;
+ uniform float shape3_contrast: hint_range(0.0, 10) = 1.;
+ uniform float shape3_brightness: hint_range(-1., 1.) = 0.;
+ group_uniforms;
+
+ group_uniforms shape3.distortion;
+ uniform sampler2D shape3_distortion_texture: source_color;
+ uniform vec2 shape3_distortion_texture_scale = vec2(1.);
+ uniform vec2 shape3_distortion_texture_offset = vec2(0.);
+ uniform float shape3_distortion_amount: hint_range(0.0, 10) = 0.0;
+ uniform vec2 shape3_distortion_speed = vec2(0.1);
+ group_uniforms;
+
+ group_uniforms shape3.polar_uv;
+ uniform bool shape3_use_polar_uv = false;
+ uniform vec2 shape3_polar_uv_center = vec2(0.5);
+ uniform bool shape3_distortion_polar_uvs = false;
+ group_uniforms;
+
+ group_uniforms shape3.screenspace_uv;
+ uniform bool shape3_use_screenspace_uv;
+ group_uniforms;
+#endif
+
+group_uniforms combine_shapes;
+#if defined(SHAPE2) || defined(SHAPE3)
+ uniform bool combine_additive = false;
+ uniform float shape1_color_weight: hint_range(0.0, 5.) = 1;
+ uniform float shape1_alpha_weight: hint_range(0.0, 5.) = 1;
+#endif
+#if defined(SHAPE2)
+ uniform float shape2_color_weight: hint_range(0.0, 5.) = 1;
+ uniform float shape2_alpha_weight: hint_range(0.0, 5.) = 1;
+#endif
+#if defined(SHAPE3)
+ uniform float shape3_color_weight: hint_range(0.0, 5.) = 1;
+ uniform float shape3_alpha_weight: hint_range(0.0, 5.) = 1;
+#endif
+group_uniforms;
+
+group_uniforms uv_pixelate;
+uniform bool use_uv_pixelate = false;
+group_uniforms;
+#if defined(UV_PIXELATE)
+ #include "Effects/vfez_uv_pixelate.gdshaderinc"
+#endif
+
+group_uniforms uv_twist;
+uniform bool use_uv_twist = false;
+group_uniforms;
+#if defined(UV_TWIST)
+ #include "Effects/vfez_uv_twist.gdshaderinc"
+#endif
+
+group_uniforms uv_handrawn;
+uniform bool use_uv_handrawn = false;
+group_uniforms;
+#if defined(UV_HANDRAWN)
+ #include "Effects/vfez_uv_handrawn.gdshaderinc"
+#endif
+
+group_uniforms uv_shake;
+uniform bool use_uv_shake = false;
+group_uniforms;
+#if defined(UV_SHAKE)
+ #include "Effects/vfez_uv_shake.gdshaderinc"
+#endif
+
+group_uniforms uv_wave;
+uniform bool use_uv_wave = false;
+group_uniforms;
+#if defined(UV_WAVE)
+ #include "Effects/vfez_uv_wave.gdshaderinc"
+#endif
+
+group_uniforms uv_round_wave;
+uniform bool use_uv_round_wave = false;
+group_uniforms;
+#if defined(UV_ROUND_WAVE)
+ #include "Effects/vfez_uv_round_wave.gdshaderinc"
+#endif
+
+group_uniforms uv_global_distortion;
+uniform bool use_uv_global_distortion = false;
+#if defined(UV_GLOBAL_DISTORTION)
+ uniform vec2 uv_global_distortion_texture_scale = vec2(1.);
+ uniform vec2 uv_global_distortion_texture_offset = vec2(0.);
+ uniform sampler2D uv_global_distortion_texture: source_color;
+ uniform vec2 uv_global_distortion_speed;
+ uniform float uv_global_distortion_amount: hint_range(0.0, 10.0) = 0.5;
+#endif
+group_uniforms;
+
+group_uniforms alpha_disolve;
+uniform bool use_alpha_disolve = false;
+group_uniforms;
+#if defined(ALPHA_DISOLVE)
+ #include "Effects/vfez_alpha_disolve.gdshaderinc"
+#endif
+
+group_uniforms color_face_tint;
+ uniform bool use_color_face_tint = false;
+group_uniforms;
+#if defined(COLOR_FACE_TINT)
+ #include "Effects/vfez_color_face_tint.gdshaderinc"
+#endif
+
+group_uniforms color_toning;
+uniform bool use_color_toning = false;
+group_uniforms;
+#if defined(COLOR_TONING)
+ #include "Effects/vfez_color_toning.gdshaderinc"
+#endif
+
+group_uniforms color_ramp;
+uniform bool use_color_ramp = false;
+group_uniforms;
+#if defined(COLOR_RAMP)
+ #include "Effects/vfez_color_ramp.gdshaderinc"
+#endif
+
+group_uniforms color_posterize;
+uniform bool use_color_posterize = false;
+group_uniforms;
+#if defined(COLOR_POSTERIZE)
+ #include "Effects/vfez_color_posterize.gdshaderinc"
+#endif
+
+group_uniforms color_rim;
+uniform bool use_color_rim = false;
+group_uniforms;
+#if defined(COLOR_RIM)
+ #include "Effects/vfez_color_rim.gdshaderinc"
+#endif
+
+group_uniforms color_glow;
+uniform bool use_color_glow = false;
+group_uniforms;
+#if defined(COLOR_GLOW)
+ #include "Effects/vfez_color_glow.gdshaderinc"
+#endif
+
+group_uniforms color_hsv_shift;
+uniform bool use_color_hsv_shift = false;
+group_uniforms;
+#if defined(COLOR_HSV_SHIFT)
+ #include "Effects/vfez_hsv_shift.gdshaderinc"
+#endif
+
+group_uniforms alpha_mask;
+uniform bool use_alpha_mask = false;
+group_uniforms;
+#if defined(ALPHA_MASK)
+ #include "Effects/vfez_alpha_mask.gdshaderinc"
+#endif
+
+group_uniforms alpha_remap;
+uniform bool use_alpha_remap = false;
+group_uniforms;
+#if defined(ALPHA_REMAP)
+ #include "Effects/vfez_alpha_remap.gdshaderinc"
+#endif
+
+group_uniforms alpha_cutoff;
+uniform bool use_alpha_cutoff = false;
+group_uniforms;
+#if defined(ALPHA_CUTOFF)
+ #include "Effects/vfez_alpha_cutoff.gdshaderinc"
+#endif
+
+
+group_uniforms vertex_offset;
+uniform bool use_vertex_offset = false;
+group_uniforms;
+#if defined(VERTEX_OFFSET)
+ #include "Effects/vfez_vertex_offset.gdshaderinc"
+#endif
+
+
+group_uniforms vertex_expand;
+uniform bool use_vertex_expand;
+group_uniforms;
+#if defined(VERTEX_EXPAND)
+ #include "Effects/vfez_vertex_expand.gdshaderinc"
+#endif
+
+
+group_uniforms particle;
+uniform bool use_particle_trails = false;
+uniform bool use_particle_anim = false;
+group_uniforms;
+
+#if defined(PARTICLE_ANIM)
+ #include "Effects/vfez_particle_anim.gdshaderinc"
+#endif
+
+
+varying vec3 view_direction;
+varying vec3 world_normal;
+varying vec2 screenspace_uv;
+
+// calculate single shape function ------------------------------
+
+vec4 calculate_shape(
+ vec2 baseUV,
+ sampler2D shape_main_texture,
+ vec2 shape_main_texture_scale,
+ vec2 shape_main_texture_offset,
+ sampler2D shape_distortion_texture,
+ vec2 shape_distortion_texture_scale,
+ vec2 shape_distortion_texture_offset,
+ float shape_distortion_amount,
+ vec2 shape_distortion_speed,
+ float shape_rotation_speed,
+ float shape_rotation_offset,
+ vec2 shape_scroll_speed,
+ bool shape_red_as_alpha,
+ vec4 shape_color,
+ float shape_contrast,
+ float shape_brightness,
+ bool shape_use_polar_uv,
+ vec2 shape_polar_uv_center,
+ bool shape_distortion_polar_uvs
+ )
+{
+ vec2 shapeUV = baseUV;
+
+ if (shape_use_polar_uv)
+ {
+ shapeUV = uv_polar(shapeUV, shape_polar_uv_center);
+ }
+
+ shapeUV = transform_uv(
+ shapeUV,
+ shape_main_texture_scale,
+ shape_main_texture_offset,
+ false);
+
+
+ if (shape_distortion_amount > 0.)
+ {
+ vec2 distort_uvs = baseUV;
+
+ //distort_uvs
+ vec2 distortionUV = baseUV;
+ distortionUV = transform_uv(
+ distortionUV,
+ shape_distortion_texture_scale,
+ shape_distortion_texture_offset,
+ false);
+
+ if (shape_use_polar_uv && shape_distortion_polar_uvs)
+ {
+ distortionUV = uv_polar(distortionUV, shape_polar_uv_center);
+ }
+
+ shapeUV = uv_distortion(shapeUV, shape_distortion_texture, distortionUV,
+ shape_distortion_amount, shape_distortion_speed, false);
+ }
+
+ shapeUV = rotate_uvs(
+ shapeUV,
+ shape_rotation_offset + mod(shape_rotation_speed * TIME, TAU),
+ shape_main_texture_scale,
+ shape_main_texture_offset);
+
+
+ vec4 shape = sample_texture_with_scroll(
+ shape_main_texture,
+ shapeUV,
+ shape_scroll_speed,
+ TIME);
+
+ if (shape_red_as_alpha)
+ {
+ shape = vec4(shape_color.rgb, shape.r);
+ }
+ else
+ {
+ shape *= shape_color;
+ }
+
+ bool apply_contrast = shape_contrast != 1. || shape_brightness != 0.;
+
+ if (apply_contrast)
+ {
+ if (shape_red_as_alpha)
+ {
+ shape.a = clamp(
+ (shape.a - 0.5) * shape_contrast + 0.5 + shape_brightness,
+ 0.,
+ 1.);
+ }
+ else
+ {
+ shape.rgb = vec3(
+ max(0, (shape.r - 0.5) * shape_contrast + 0.5 + shape_brightness),
+ max(0, (shape.g - 0.5) * shape_contrast + 0.5 + shape_brightness),
+ max(0, (shape.b - 0.5) * shape_contrast + 0.5 + shape_brightness)
+ );
+ }
+ }
+
+ return shape;
+}
+
+bool is_using_screen_space_uv()
+{
+ bool using_shape2_screenspace_uv = false;
+ bool using_shape3_screenspace_uv = false;
+ #if defined(SHAPE2)
+ using_shape2_screenspace_uv = shape2_use_screenspace_uv;
+ #endif
+
+ #if defined(SHAPE3)
+ using_shape3_screenspace_uv = shape3_use_screenspace_uv;
+ #endif
+
+ return shape1_use_screenspace_uv || using_shape2_screenspace_uv || using_shape3_screenspace_uv;
+}
+
+// ---------------------------------------------------
+
+void vertex() {
+
+ #if defined(BILLBOARD_ENABLED)
+ MODELVIEW_MATRIX = VIEW_MATRIX * mat4(
+ MAIN_CAM_INV_VIEW_MATRIX[0],
+ MAIN_CAM_INV_VIEW_MATRIX[1],
+ MAIN_CAM_INV_VIEW_MATRIX[2],
+ MODEL_MATRIX[3]);
+ #elif defined(BILLBOARD_Y)
+ MODELVIEW_MATRIX = VIEW_MATRIX * mat4(
+ vec4(normalize(cross(vec3(0.0, 1.0, 0.0), MAIN_CAM_INV_VIEW_MATRIX[2].xyz)), 0.0),
+ vec4(0.0, 1.0, 0.0, 0.0),
+ vec4(normalize(cross(MAIN_CAM_INV_VIEW_MATRIX[0].xyz, vec3(0.0, 1.0, 0.0))), 0.0),
+ MODEL_MATRIX[3]);
+ #elif defined(BILLBOARD_PARTICLE)
+ mat4 mat_world = mat4(
+ normalize(INV_VIEW_MATRIX[0]),
+ normalize(INV_VIEW_MATRIX[1]),
+ normalize(INV_VIEW_MATRIX[2]),
+ MODEL_MATRIX[3]);
+ mat_world = mat_world * mat4(
+ vec4(cos(INSTANCE_CUSTOM.x), -sin(INSTANCE_CUSTOM.x), 0.0, 0.0),
+ vec4(sin(INSTANCE_CUSTOM.x), cos(INSTANCE_CUSTOM.x), 0.0, 0.0),
+ vec4(0.0, 0.0, 1.0, 0.0),
+ vec4(0.0, 0.0, 0.0, 1.0));
+ MODELVIEW_MATRIX = VIEW_MATRIX * mat_world;
+ #endif
+
+ #if (defined(BILLBOARD_ENABLED) || defined(BILLBOARD_Y) || defined(BILLBOARD_PARTICLE)) && defined(BILLBOARD_KEEP_SCALE)
+ MODELVIEW_MATRIX = MODELVIEW_MATRIX * mat4(
+ vec4(length(MODEL_MATRIX[0].xyz), 0.0, 0.0, 0.0),
+ vec4(0.0, length(MODEL_MATRIX[1].xyz), 0.0, 0.0),
+ vec4(0.0, 0.0, length(MODEL_MATRIX[2].xyz), 0.0),
+ vec4(0.0, 0.0, 0.0, 1.0));
+ MODELVIEW_NORMAL_MATRIX = mat3(MODELVIEW_MATRIX);
+ #endif
+
+ view_direction = normalize((
+ INV_VIEW_MATRIX[3] - MODEL_MATRIX * vec4(VERTEX, 1.0)).rgb);
+
+ world_normal = normalize((MODEL_MATRIX * vec4(NORMAL, 1.0)).rgb);
+
+ #if defined(VERTEX_OFFSET)
+ if (use_vertex_offset)
+ {
+ VERTEX = vertex_offset(VERTEX, NORMAL, UV);
+ }
+ #endif
+
+ #if defined(VERTEX_EXPAND)
+ if (use_vertex_expand)
+ {
+ VERTEX = vertex_expand(VERTEX);
+ }
+ #endif
+
+ #if defined(PARTICLE_ANIM)
+ if (use_particle_anim)
+ {
+ UV = particle_anim(INSTANCE_CUSTOM.z, UV);
+ }
+ #endif
+
+ bool using_screen_space_uv = is_using_screen_space_uv();
+
+ // only calculate screenspace uv if used at least by 1 shape
+ if (using_screen_space_uv)
+ {
+ vec4 position_v = MODELVIEW_MATRIX * vec4(VERTEX, 1.0);
+ vec4 position_cs = PROJECTION_MATRIX * vec4(position_v.xyz, 1.0);
+ vec2 ndc = position_cs.xy / position_cs.w;
+ screenspace_uv = ndc.xy * 0.5 + 0.5;
+ }
+}
+
+void fragment() {
+
+ // clamp UVS near edges (0., 1., 2., 3., 4., 5.) to reduce folding artifacts
+ vec2 uv_floor_top_included = max(vec2(0.), ceil(UV) - vec2(1.));
+ vec2 clampedUV = clamp(UV, vec2(0.001) + uv_floor_top_included, vec2(0.999) + uv_floor_top_included);
+ vec2 baseUV = clampedUV;
+
+ #if defined(UV_PIXELATE)
+ if (use_uv_pixelate)
+ {
+ baseUV = uv_pixelate(baseUV, VIEWPORT_SIZE);
+ }
+ #endif
+
+ #if defined(UV_TWIST)
+ if (use_uv_twist)
+ {
+ baseUV = uv_twist(baseUV, shape1_main_texture_scale);
+ }
+ #endif
+
+ #if defined(UV_HANDRAWN)
+ if (use_uv_handrawn)
+ {
+ baseUV = uv_handrawn(baseUV);
+ }
+ #endif
+
+ #if defined(UV_SHAKE)
+ if (use_uv_shake)
+ {
+ baseUV = uv_shake(baseUV);
+ }
+ #endif
+
+ #if defined(UV_WAVE)
+ if (use_uv_wave)
+ {
+ baseUV = uv_wave(baseUV, VIEWPORT_SIZE, shape1_main_texture_scale);
+ }
+ #endif
+
+ #if defined(UV_ROUND_WAVE)
+ if (use_uv_round_wave)
+ {
+ vec2 main_tex_size = vec2(textureSize(shape1_main_texture, 0));
+ baseUV = uv_round_wave(baseUV, main_tex_size, shape1_main_texture_scale);
+ }
+ #endif
+
+ #if defined(UV_GLOBAL_DISTORTION)
+ if (use_uv_global_distortion)
+ {
+ vec2 global_distortion_uv =
+ transform_uv(baseUV,
+ uv_global_distortion_texture_scale,
+ uv_global_distortion_texture_offset,
+ false);
+ baseUV = uv_distortion(baseUV, uv_global_distortion_texture, global_distortion_uv,
+ uv_global_distortion_amount, uv_global_distortion_speed, false);
+ }
+ #endif
+
+ vec2 shape1UV;
+
+ if (shape1_use_screenspace_uv)
+ {
+ shape1UV = screenspace_uv;
+ }
+ else
+ {
+ shape1UV = baseUV;
+ }
+
+ // calculate shape 1
+ vec4 shape1 = calculate_shape(
+ shape1UV,
+ shape1_main_texture,
+ shape1_main_texture_scale,
+ shape1_main_texture_offset,
+ shape1_distortion_texture,
+ shape1_distortion_texture_scale,
+ shape1_distortion_texture_offset,
+ shape1_distortion_amount,
+ shape1_distortion_speed,
+ shape1_rotation_speed,
+ shape1_rotation_offset,
+ shape1_scroll_speed,
+ shape1_red_as_alpha,
+ shape1_color,
+ shape1_contrast,
+ shape1_brightness,
+ shape1_use_polar_uv,
+ shape1_polar_uv_center,
+ shape1_distortion_polar_uvs
+ );
+
+ // calculate shape2 if defined
+ #if defined(SHAPE2)
+
+ vec2 shape2UV;
+
+ if (shape2_use_screenspace_uv)
+ {
+ shape2UV = screenspace_uv;
+ }
+ else
+ {
+ shape2UV = baseUV;
+ }
+
+ vec4 shape2 = calculate_shape(
+ shape2UV,
+ shape2_main_texture,
+ shape2_main_texture_scale,
+ shape2_main_texture_offset,
+ shape2_distortion_texture,
+ shape2_distortion_texture_scale,
+ shape2_distortion_texture_offset,
+ shape2_distortion_amount,
+ shape2_distortion_speed,
+ shape2_rotation_speed,
+ shape2_rotation_offset,
+ shape2_scroll_speed,
+ shape2_red_as_alpha,
+ shape2_color,
+ shape2_contrast,
+ shape2_brightness,
+ shape2_use_polar_uv,
+ shape2_polar_uv_center,
+ shape2_distortion_polar_uvs
+ );
+ #endif
+
+ // calculate shape3 if defined
+ #if defined(SHAPE3)
+
+ vec2 shape3UV;
+
+ if (shape3_use_screenspace_uv)
+ {
+ shape3UV = screenspace_uv;
+ }
+ else
+ {
+ shape3UV = baseUV;
+ }
+
+ vec4 shape3 = calculate_shape(
+ shape3UV,
+ shape3_main_texture,
+ shape3_main_texture_scale,
+ shape3_main_texture_offset,
+ shape3_distortion_texture,
+ shape3_distortion_texture_scale,
+ shape3_distortion_texture_offset,
+ shape3_distortion_amount,
+ shape3_distortion_speed,
+ shape3_rotation_speed,
+ shape3_rotation_offset,
+ shape3_scroll_speed,
+ shape3_red_as_alpha,
+ shape3_color,
+ shape3_contrast,
+ shape3_brightness,
+ shape3_use_polar_uv,
+ shape3_polar_uv_center,
+ shape3_distortion_polar_uvs
+ );
+ #endif
+
+ // ---combine shapes if more than one defined.---
+ vec4 color = shape1;
+
+ #if defined(SHAPE2) || defined(SHAPE3)
+ if (combine_additive)
+ {
+ color.rgb = shape1.rgb * shape1_color_weight * shape1.a;
+ color.a = shape1.a * shape1_alpha_weight;
+ }
+ else
+ {
+ if (shape1_color_weight > 0.)
+ color.rgb = shape1.rgb * shape1_color_weight;
+ else
+ color.rgb = vec3(1.);
+
+ if (shape1_alpha_weight > 0.)
+ color.a = shape1.a * shape1_alpha_weight;
+ else
+ color.a = 1.;
+ }
+ #endif
+
+ #if defined(SHAPE2)
+ if (combine_additive)
+ {
+ color.rgb += shape2.rgb * shape2_color_weight * shape2.a;
+ color.a = max(color.a, shape2.a * shape2_alpha_weight);
+ }
+ else
+ {
+ if (shape2_color_weight > 0.)
+ color.rgb *= shape2.rgb * shape2_color_weight;
+
+ if (shape2_alpha_weight > 0.)
+ color.a *= shape2.a * shape2_alpha_weight;
+ }
+ #endif
+
+ #if defined(SHAPE3)
+ if (combine_additive)
+ {
+ color.rgb += shape3.rgb * shape3_color_weight * shape3.a;
+ color.a = max(color.a, shape3.a * shape3_alpha_weight);
+ }
+ else
+ {
+ if (shape3_color_weight > 0.)
+ color.rgb *= shape3.rgb * shape3_color_weight;
+
+ if (shape3_alpha_weight > 0.)
+ color.a *= shape3.a * shape3_alpha_weight;
+ }
+ #endif
+
+ color.a = clamp(color.a, 0., 1.);
+
+ // ----------------------------------------------
+ // apply premultiply color
+ if (premultiply_color)
+ {
+ float luminance = get_color_luminance(color);
+ color.a = min(luminance, color.a);
+ }
+
+ color.rgb *= global_color * COLOR.rgb;
+
+ /// apply premultiply alpha
+ if (premultiply_alpha)
+ {
+ color.rgb *= color.a;
+ }
+
+ #if defined(ALPHA_DISOLVE)
+ if (use_alpha_disolve)
+ {
+ float luminance = get_color_luminance(color);
+ float pre_disolve_alpha = color.a;
+ if (additive_config && !premultiply_color)
+ {
+ pre_disolve_alpha *= luminance;
+ }
+
+ color = alpha_disolve(color, pre_disolve_alpha, COLOR.a, baseUV, false);
+ }
+ #endif
+
+ #if defined(COLOR_FACE_TINT)
+ if (use_color_face_tint)
+ {
+ color.rgb = color_face_tint(color.rgb, world_normal, view_direction);
+ }
+ #endif
+
+ // apply color grading if defined
+ #if defined(COLOR_TONING)
+ if (use_color_toning)
+ {
+ color.rgb = color_toning(color);
+ }
+ #endif
+
+ // apply color ramp if defined
+ #if defined(COLOR_RAMP)
+ if (use_color_ramp)
+ {
+ color = color_ramp(color);
+ }
+ #endif
+
+ #if defined(COLOR_POSTERIZE)
+ if (use_color_posterize)
+ {
+ color.rgb = color_posterize(color.rgb);
+ }
+ #endif
+
+ #if defined(COLOR_RIM)
+ if (use_color_rim)
+ {
+ color = color_rim(color, NORMAL, VIEW);
+ }
+ #endif
+
+ #if defined(COLOR_GLOW)
+ if (use_color_glow)
+ {
+ float glow_mult = 1.;
+ if (additive_config)
+ {
+ float luminance = get_color_luminance(color);
+ glow_mult = luminance;
+ }
+
+ color.rgb = color_glow(color, baseUV, glow_mult);
+ }
+ #endif
+
+ #if defined(COLOR_HSV_SHIFT)
+ if (use_color_hsv_shift)
+ {
+ color.rgb = hsv_shift(color.rgb);
+ }
+ #endif
+
+ #if defined(ALPHA_MASK)
+ if (use_alpha_mask)
+ {
+ color.a = alpha_mask(color.a, clampedUV, false);
+ }
+ #endif
+
+ #if defined(ALPHA_REMAP)
+ if (use_alpha_remap)
+ {
+ color.a = alpha_remap(color.a);
+ }
+ #endif
+
+ #if defined(ALPHA_CUTOFF)
+ if (use_alpha_cutoff)
+ {
+ color.a = alpha_cutoff(color.a);
+ }
+ #endif
+
+ color.a = color.a * global_alpha * COLOR.a;
+
+ if (additive_config)
+ {{
+ color.rgb *= color.a;
+ }}
+
+ ALBEDO = color.rgb;
+ ALPHA = color.a;
+}
\ No newline at end of file
diff --git a/VFEZ/vfez_examples_2d.tscn b/VFEZ/vfez_examples_2d.tscn
new file mode 100644
index 00000000..7fb593ac
--- /dev/null
+++ b/VFEZ/vfez_examples_2d.tscn
@@ -0,0 +1,1481 @@
+[gd_scene load_steps=47 format=3 uid="uid://if0eawpl7ptu"]
+
+[ext_resource type="Texture2D" uid="uid://binx081o2x6to" path="res://addons/VFEZ-godot/Images/croco_sprite.png" id="1_7yy4n"]
+[ext_resource type="Script" path="res://addons/VFEZ-godot/vfez_material_2d.gd" id="1_arucr"]
+
+[sub_resource type="Shader" id="Shader_wv3kq"]
+resource_name = "VFEZ2DPreview"
+code = "
+// This shader was dynamically generated by the VFEZ material.
+// **********************************
+// Every change to the VFEZ material Render Options or
+// Include Options generates a new shader. After every change
+// you can click on the new exported shader in the editor to view
+// the latest changes. Only the definitions (#define) actually change.
+// **********************************
+shader_type canvas_item;
+#define BLEND_MIX
+#define OUTLINE
+#define COLOR_SHADOW
+#include \"res://addons/VFEZ-godot/Shaders/vfez_2d_template.gdshaderinc\"
+"
+
+[sub_resource type="FastNoiseLite" id="FastNoiseLite_rsx1l"]
+
+[sub_resource type="NoiseTexture2D" id="NoiseTexture2D_jrx7g"]
+seamless = true
+noise = SubResource("FastNoiseLite_rsx1l")
+
+[sub_resource type="ShaderMaterial" id="ShaderMaterial_bsn0d"]
+shader = SubResource("Shader_wv3kq")
+shader_parameter/texture_scale = Vector2(1, 1)
+shader_parameter/texture_offset = Vector2(0, 0)
+shader_parameter/texture_scroll_speed = Vector2(0, 0)
+shader_parameter/replicate_on_scale = true
+shader_parameter/texture_color = Color(1, 1, 1, 1)
+shader_parameter/texture_alpha = 1.0
+shader_parameter/texture_red_as_alpha = false
+shader_parameter/premultiply_color = false
+shader_parameter/premultiply_alpha = false
+shader_parameter/contrast = 1.0
+shader_parameter/brightness = 0.0
+shader_parameter/rect_size_ratio = 1.0
+shader_parameter/use_uv_polar = false
+shader_parameter/use_uv_distortion = false
+shader_parameter/use_uv_rotation = false
+shader_parameter/use_uv_pixelate = false
+shader_parameter/use_uv_twist = false
+shader_parameter/use_uv_fisheye = false
+shader_parameter/use_uv_pinch = false
+shader_parameter/use_uv_handrawn = false
+shader_parameter/use_uv_shake = false
+shader_parameter/use_uv_wave = false
+shader_parameter/use_uv_round_wave = false
+shader_parameter/use_uv_wind = false
+shader_parameter/use_uv_wrap = false
+shader_parameter/use_uv_zoom = false
+shader_parameter/use_color_single = false
+shader_parameter/use_color_overlay_texture = false
+shader_parameter/use_outline = true
+shader_parameter/outline_color = Color(0, 0, 0, 1)
+shader_parameter/outline_alpha = 1.0
+shader_parameter/outline_glow = 1.0
+shader_parameter/outline_width = 0.0
+shader_parameter/only_render_outline = false
+shader_parameter/use_pixel_perfect_outline = true
+shader_parameter/outline_pixel_width = 8
+shader_parameter/use_outline_texture = false
+shader_parameter/outline_texture_scale = Vector2(1, 1)
+shader_parameter/outline_texture_offset = Vector2(0, 0)
+shader_parameter/outline_texture_scroll_speed = Vector2(0, 0)
+shader_parameter/use_outline_distortion = true
+shader_parameter/outline_distortion_texture_scale = Vector2(1, 1)
+shader_parameter/outline_distortion_texture_offset = Vector2(0, 0)
+shader_parameter/outline_distortion_texture_scroll_speed = Vector2(0.1, 0.1)
+shader_parameter/outline_distortion_amount = 0.1
+shader_parameter/outline_distortion_texture = SubResource("NoiseTexture2D_jrx7g")
+shader_parameter/use_outline_inner = false
+shader_parameter/use_alpha_disolve = false
+shader_parameter/use_chromatic_aberration = false
+shader_parameter/use_motion_blur = false
+shader_parameter/use_glitch = false
+shader_parameter/use_color_gradient = false
+shader_parameter/use_color_radial_gradient = false
+shader_parameter/use_color_toning = false
+shader_parameter/use_color_ramp = false
+shader_parameter/use_color_change = false
+shader_parameter/use_color_ghost = false
+shader_parameter/use_color_hologram = false
+shader_parameter/use_color_posterize = false
+shader_parameter/use_color_negative = false
+shader_parameter/use_color_glow = false
+shader_parameter/use_color_hsv_shift = false
+shader_parameter/use_color_shadow = true
+shader_parameter/color_shadow_x = 0.1
+shader_parameter/color_shadow_y = 0.1
+shader_parameter/color_shadow_alpha = 1.0
+shader_parameter/color_shadow_color = Color(0, 0, 0, 1)
+shader_parameter/use_color_greyscale = false
+shader_parameter/use_color_shine = false
+shader_parameter/use_alpha_mask = false
+shader_parameter/use_alpha_remap = false
+shader_parameter/use_alpha_cutoff = false
+shader_parameter/use_alpha_clip = false
+shader_parameter/use_alpha_radial_clip = false
+shader_parameter/use_alpha_flicker = false
+shader_parameter/use_particle_anim = false
+script = ExtResource("1_arucr")
+BlendMode = 0
+LightMode = 0
+
+[sub_resource type="Environment" id="Environment_arucr"]
+glow_enabled = true
+glow_bloom = 0.12
+glow_blend_mode = 1
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_x0bi3"]
+bg_color = Color(0.085, 0.30175, 0.85, 1)
+
+[sub_resource type="Shader" id="Shader_kep2j"]
+resource_name = "VFEZ2DPreview"
+code = "
+// This shader was dynamically generated by the VFEZ material.
+// **********************************
+// Every change to the VFEZ material Render Options or
+// Include Options generates a new shader. After every change
+// you can click on the new exported shader in the editor to view
+// the latest changes. Only the definitions (#define) actually change.
+// **********************************
+shader_type canvas_item;
+#define BLEND_MIX
+#define OUTLINE
+#define COLOR_SHADOW
+#include \"res://addons/VFEZ-godot/Shaders/vfez_2d_template.gdshaderinc\"
+"
+
+[sub_resource type="FastNoiseLite" id="FastNoiseLite_mc2wo"]
+
+[sub_resource type="NoiseTexture2D" id="NoiseTexture2D_u0a12"]
+seamless = true
+noise = SubResource("FastNoiseLite_mc2wo")
+
+[sub_resource type="ShaderMaterial" id="ShaderMaterial_wc5bf"]
+shader = SubResource("Shader_kep2j")
+shader_parameter/texture_scale = Vector2(1, 1)
+shader_parameter/texture_offset = Vector2(0, 0)
+shader_parameter/texture_scroll_speed = Vector2(0, 0)
+shader_parameter/replicate_on_scale = true
+shader_parameter/texture_color = Color(1, 1, 1, 1)
+shader_parameter/texture_alpha = 1.0
+shader_parameter/texture_red_as_alpha = false
+shader_parameter/premultiply_color = false
+shader_parameter/premultiply_alpha = false
+shader_parameter/contrast = 1.0
+shader_parameter/brightness = 0.0
+shader_parameter/rect_size_ratio = 1.0
+shader_parameter/use_uv_polar = false
+shader_parameter/use_uv_distortion = false
+shader_parameter/use_uv_rotation = false
+shader_parameter/use_uv_pixelate = false
+shader_parameter/use_uv_twist = false
+shader_parameter/use_uv_fisheye = false
+shader_parameter/use_uv_pinch = false
+shader_parameter/use_uv_handrawn = false
+shader_parameter/use_uv_shake = false
+shader_parameter/use_uv_wave = false
+shader_parameter/use_uv_round_wave = false
+shader_parameter/use_uv_wind = false
+shader_parameter/use_uv_wrap = false
+shader_parameter/use_uv_zoom = false
+shader_parameter/use_color_single = false
+shader_parameter/use_color_overlay_texture = false
+shader_parameter/use_outline = true
+shader_parameter/outline_color = Color(0, 0, 0, 1)
+shader_parameter/outline_alpha = 1.0
+shader_parameter/outline_glow = 1.0
+shader_parameter/outline_width = 0.0
+shader_parameter/only_render_outline = false
+shader_parameter/use_pixel_perfect_outline = true
+shader_parameter/outline_pixel_width = 8
+shader_parameter/use_outline_texture = false
+shader_parameter/outline_texture_scale = Vector2(1, 1)
+shader_parameter/outline_texture_offset = Vector2(0, 0)
+shader_parameter/outline_texture_scroll_speed = Vector2(0, 0)
+shader_parameter/use_outline_distortion = true
+shader_parameter/outline_distortion_texture_scale = Vector2(1, 1)
+shader_parameter/outline_distortion_texture_offset = Vector2(0, 0)
+shader_parameter/outline_distortion_texture_scroll_speed = Vector2(0.1, 0.1)
+shader_parameter/outline_distortion_amount = 0.1
+shader_parameter/outline_distortion_texture = SubResource("NoiseTexture2D_u0a12")
+shader_parameter/use_outline_inner = false
+shader_parameter/use_alpha_disolve = false
+shader_parameter/use_chromatic_aberration = false
+shader_parameter/use_motion_blur = false
+shader_parameter/use_glitch = false
+shader_parameter/use_color_gradient = false
+shader_parameter/use_color_radial_gradient = false
+shader_parameter/use_color_toning = false
+shader_parameter/use_color_ramp = false
+shader_parameter/use_color_change = false
+shader_parameter/use_color_ghost = false
+shader_parameter/use_color_hologram = false
+shader_parameter/use_color_posterize = false
+shader_parameter/use_color_negative = false
+shader_parameter/use_color_glow = false
+shader_parameter/use_color_hsv_shift = false
+shader_parameter/use_color_shadow = true
+shader_parameter/color_shadow_x = 0.1
+shader_parameter/color_shadow_y = 0.1
+shader_parameter/color_shadow_alpha = 1.0
+shader_parameter/color_shadow_color = Color(0, 0, 0, 1)
+shader_parameter/use_color_greyscale = false
+shader_parameter/use_color_shine = false
+shader_parameter/use_alpha_mask = false
+shader_parameter/use_alpha_remap = false
+shader_parameter/use_alpha_cutoff = false
+shader_parameter/use_alpha_clip = false
+shader_parameter/use_alpha_radial_clip = false
+shader_parameter/use_alpha_flicker = false
+shader_parameter/use_particle_anim = false
+script = ExtResource("1_arucr")
+BlendMode = 0
+LightMode = 0
+
+[sub_resource type="Shader" id="Shader_7xb8f"]
+resource_name = "VFEZ2DPreview"
+code = "
+// This shader was dynamically generated by the VFEZ material.
+// **********************************
+// Every change to the VFEZ material Render Options or
+// Include Options generates a new shader. After every change
+// you can click on the new exported shader in the editor to view
+// the latest changes. Only the definitions (#define) actually change.
+// **********************************
+shader_type canvas_item;
+#define BLEND_MIX
+#define UV_FISHEYE
+#include \"res://addons/VFEZ-godot/Shaders/vfez_2d_template.gdshaderinc\"
+"
+
+[sub_resource type="ShaderMaterial" id="ShaderMaterial_0ewij"]
+shader = SubResource("Shader_7xb8f")
+shader_parameter/texture_scale = Vector2(1, 1)
+shader_parameter/texture_offset = Vector2(0.22, 0.175)
+shader_parameter/texture_scroll_speed = Vector2(0, 0)
+shader_parameter/replicate_on_scale = false
+shader_parameter/texture_color = Color(1, 1, 1, 1)
+shader_parameter/texture_alpha = 1.0
+shader_parameter/texture_red_as_alpha = false
+shader_parameter/premultiply_color = false
+shader_parameter/premultiply_alpha = false
+shader_parameter/contrast = 1.0
+shader_parameter/brightness = 0.0
+shader_parameter/rect_size_ratio = 1.432
+shader_parameter/use_uv_polar = false
+shader_parameter/use_uv_distortion = false
+shader_parameter/use_uv_rotation = false
+shader_parameter/use_uv_pixelate = false
+shader_parameter/use_uv_twist = false
+shader_parameter/use_uv_fisheye = true
+shader_parameter/uv_fisheye_center_x = 0.5
+shader_parameter/uv_fisheye_center_y = 0.5
+shader_parameter/uv_fisheye_amount = 0.335
+shader_parameter/use_uv_pinch = false
+shader_parameter/use_uv_handrawn = false
+shader_parameter/use_uv_shake = false
+shader_parameter/use_uv_wave = false
+shader_parameter/use_uv_round_wave = false
+shader_parameter/use_uv_wind = false
+shader_parameter/use_uv_wrap = false
+shader_parameter/use_uv_zoom = false
+shader_parameter/use_color_single = false
+shader_parameter/use_color_overlay_texture = false
+shader_parameter/use_outline = false
+shader_parameter/use_outline_inner = false
+shader_parameter/use_alpha_disolve = false
+shader_parameter/use_chromatic_aberration = false
+shader_parameter/use_motion_blur = false
+shader_parameter/use_glitch = false
+shader_parameter/use_color_gradient = false
+shader_parameter/use_color_radial_gradient = false
+shader_parameter/use_color_toning = false
+shader_parameter/use_color_ramp = false
+shader_parameter/use_color_change = false
+shader_parameter/use_color_ghost = false
+shader_parameter/use_color_hologram = false
+shader_parameter/use_color_posterize = false
+shader_parameter/use_color_negative = false
+shader_parameter/use_color_glow = false
+shader_parameter/use_color_hsv_shift = false
+shader_parameter/use_color_shadow = false
+shader_parameter/use_color_greyscale = false
+shader_parameter/use_color_shine = false
+shader_parameter/use_alpha_mask = false
+shader_parameter/use_alpha_remap = false
+shader_parameter/use_alpha_cutoff = false
+shader_parameter/use_alpha_clip = false
+shader_parameter/use_alpha_radial_clip = false
+shader_parameter/use_alpha_flicker = false
+shader_parameter/use_particle_anim = false
+script = ExtResource("1_arucr")
+BlendMode = 0
+LightMode = 0
+metadata/_custom_type_script = "uid://dlipme63w16j5"
+
+[sub_resource type="Shader" id="Shader_m67vi"]
+resource_name = "VFEZ2DPreview"
+code = "
+// This shader was dynamically generated by the VFEZ material.
+// **********************************
+// Every change to the VFEZ material Render Options or
+// Include Options generates a new shader. After every change
+// you can click on the new exported shader in the editor to view
+// the latest changes. Only the definitions (#define) actually change.
+// **********************************
+shader_type canvas_item;
+#define BLEND_MIX
+#define COLOR_OVERLAY_TEXTURE
+#include \"res://addons/VFEZ-godot/Shaders/vfez_2d_template.gdshaderinc\"
+"
+
+[sub_resource type="FastNoiseLite" id="FastNoiseLite_fwmf6"]
+
+[sub_resource type="NoiseTexture2D" id="NoiseTexture2D_jpm1p"]
+seamless = true
+noise = SubResource("FastNoiseLite_fwmf6")
+
+[sub_resource type="ShaderMaterial" id="ShaderMaterial_2gk0o"]
+shader = SubResource("Shader_m67vi")
+shader_parameter/texture_scale = Vector2(1, 1)
+shader_parameter/texture_offset = Vector2(0, 0)
+shader_parameter/texture_scroll_speed = Vector2(0, 0)
+shader_parameter/replicate_on_scale = true
+shader_parameter/texture_color = Color(1, 1, 1, 1)
+shader_parameter/texture_alpha = 1.0
+shader_parameter/texture_red_as_alpha = false
+shader_parameter/premultiply_color = false
+shader_parameter/premultiply_alpha = false
+shader_parameter/contrast = 1.0
+shader_parameter/brightness = 0.0
+shader_parameter/rect_size_ratio = 1.0
+shader_parameter/use_uv_polar = false
+shader_parameter/use_uv_distortion = false
+shader_parameter/use_uv_rotation = false
+shader_parameter/use_uv_pixelate = false
+shader_parameter/use_uv_twist = false
+shader_parameter/use_uv_fisheye = false
+shader_parameter/use_uv_pinch = false
+shader_parameter/use_uv_handrawn = false
+shader_parameter/use_uv_shake = false
+shader_parameter/use_uv_wave = false
+shader_parameter/use_uv_round_wave = false
+shader_parameter/use_uv_wind = false
+shader_parameter/use_uv_wrap = false
+shader_parameter/use_uv_zoom = false
+shader_parameter/use_color_single = false
+shader_parameter/use_color_overlay_texture = true
+shader_parameter/color_overlay_tex_scale = Vector2(1, 1)
+shader_parameter/color_overlay_tex_offset = Vector2(0, 0)
+shader_parameter/color_overlay_color = Color(1, 1, 0, 1)
+shader_parameter/color_overlay_glow = 1.0
+shader_parameter/color_overlay_blend = 1.0
+shader_parameter/color_overlay_tex_scroll_x = 0.25
+shader_parameter/color_overlay_tex_scroll_y = 0.25
+shader_parameter/color_overlay_mult = false
+shader_parameter/color_overlay_tex = SubResource("NoiseTexture2D_jpm1p")
+shader_parameter/use_outline = false
+shader_parameter/use_outline_inner = false
+shader_parameter/use_alpha_disolve = false
+shader_parameter/use_chromatic_aberration = false
+shader_parameter/use_motion_blur = false
+shader_parameter/use_glitch = false
+shader_parameter/use_color_gradient = false
+shader_parameter/use_color_radial_gradient = false
+shader_parameter/use_color_toning = false
+shader_parameter/use_color_ramp = false
+shader_parameter/use_color_change = false
+shader_parameter/use_color_ghost = false
+shader_parameter/use_color_hologram = false
+shader_parameter/use_color_posterize = false
+shader_parameter/use_color_negative = false
+shader_parameter/use_color_glow = false
+shader_parameter/use_color_hsv_shift = false
+shader_parameter/use_color_shadow = false
+shader_parameter/use_color_greyscale = false
+shader_parameter/use_color_shine = false
+shader_parameter/use_alpha_mask = false
+shader_parameter/use_alpha_remap = false
+shader_parameter/use_alpha_cutoff = false
+shader_parameter/use_alpha_clip = false
+shader_parameter/use_alpha_radial_clip = false
+shader_parameter/use_alpha_flicker = false
+shader_parameter/use_particle_anim = false
+script = ExtResource("1_arucr")
+BlendMode = 0
+LightMode = 0
+
+[sub_resource type="Shader" id="Shader_8jh0o"]
+resource_name = "VFEZ2DPreview"
+code = "
+// This shader was dynamically generated by the VFEZ material.
+// **********************************
+// Every change to the VFEZ material Render Options or
+// Include Options generates a new shader. After every change
+// you can click on the new exported shader in the editor to view
+// the latest changes. Only the definitions (#define) actually change.
+// **********************************
+shader_type canvas_item;
+#define BLEND_MIX
+#define UV_DISTORTION
+#include \"res://addons/VFEZ-godot/Shaders/vfez_2d_template.gdshaderinc\"
+"
+
+[sub_resource type="FastNoiseLite" id="FastNoiseLite_vunhv"]
+
+[sub_resource type="NoiseTexture2D" id="NoiseTexture2D_040a5"]
+noise = SubResource("FastNoiseLite_vunhv")
+
+[sub_resource type="ShaderMaterial" id="ShaderMaterial_s4rvr"]
+shader = SubResource("Shader_8jh0o")
+shader_parameter/texture_scale = Vector2(1, 1)
+shader_parameter/texture_offset = Vector2(0, 0)
+shader_parameter/texture_scroll_speed = Vector2(0, 0)
+shader_parameter/replicate_on_scale = true
+shader_parameter/texture_color = Color(1, 1, 1, 1)
+shader_parameter/texture_alpha = 1.0
+shader_parameter/texture_red_as_alpha = false
+shader_parameter/premultiply_color = false
+shader_parameter/premultiply_alpha = false
+shader_parameter/contrast = 1.0
+shader_parameter/brightness = 0.0
+shader_parameter/rect_size_ratio = 1.0
+shader_parameter/use_uv_polar = false
+shader_parameter/use_uv_distortion = true
+shader_parameter/distortion_tex_scale = Vector2(1, 1)
+shader_parameter/distortion_tex_offset = Vector2(0, 0)
+shader_parameter/distortion_amount = 0.345
+shader_parameter/distortion_speed = Vector2(0.1, 0.1)
+shader_parameter/distortion_tex = SubResource("NoiseTexture2D_040a5")
+shader_parameter/use_uv_rotation = false
+shader_parameter/use_uv_pixelate = false
+shader_parameter/use_uv_twist = false
+shader_parameter/use_uv_fisheye = false
+shader_parameter/use_uv_pinch = false
+shader_parameter/use_uv_handrawn = false
+shader_parameter/use_uv_shake = false
+shader_parameter/use_uv_wave = false
+shader_parameter/use_uv_round_wave = false
+shader_parameter/use_uv_wind = false
+shader_parameter/use_uv_wrap = false
+shader_parameter/use_uv_zoom = false
+shader_parameter/use_color_single = false
+shader_parameter/use_color_overlay_texture = false
+shader_parameter/use_outline = false
+shader_parameter/use_outline_inner = false
+shader_parameter/use_alpha_disolve = false
+shader_parameter/use_chromatic_aberration = false
+shader_parameter/use_motion_blur = false
+shader_parameter/use_glitch = false
+shader_parameter/use_color_gradient = false
+shader_parameter/use_color_radial_gradient = false
+shader_parameter/use_color_toning = false
+shader_parameter/use_color_ramp = false
+shader_parameter/use_color_change = false
+shader_parameter/use_color_ghost = false
+shader_parameter/use_color_hologram = false
+shader_parameter/use_color_posterize = false
+shader_parameter/use_color_negative = false
+shader_parameter/use_color_glow = false
+shader_parameter/use_color_hsv_shift = false
+shader_parameter/use_color_shadow = false
+shader_parameter/use_color_greyscale = false
+shader_parameter/use_color_shine = false
+shader_parameter/use_alpha_mask = false
+shader_parameter/use_alpha_remap = false
+shader_parameter/use_alpha_cutoff = false
+shader_parameter/use_alpha_clip = false
+shader_parameter/use_alpha_radial_clip = false
+shader_parameter/use_alpha_flicker = false
+shader_parameter/use_particle_anim = false
+script = ExtResource("1_arucr")
+BlendMode = 0
+LightMode = 0
+
+[sub_resource type="Shader" id="Shader_gfgdd"]
+resource_name = "VFEZ2DPreview"
+code = "
+// This shader was dynamically generated by the VFEZ material.
+// **********************************
+// Every change to the VFEZ material Render Options or
+// Include Options generates a new shader. After every change
+// you can click on the new exported shader in the editor to view
+// the latest changes. Only the definitions (#define) actually change.
+// **********************************
+shader_type canvas_item;
+#define BLEND_MIX
+#define COLOR_NEGATIVE
+#include \"res://addons/VFEZ-godot/Shaders/vfez_2d_template.gdshaderinc\"
+"
+
+[sub_resource type="ShaderMaterial" id="ShaderMaterial_7h522"]
+shader = SubResource("Shader_gfgdd")
+shader_parameter/texture_scale = Vector2(1, 1)
+shader_parameter/texture_offset = Vector2(0, 0)
+shader_parameter/texture_scroll_speed = Vector2(0, 0)
+shader_parameter/replicate_on_scale = true
+shader_parameter/texture_color = Color(1, 1, 1, 1)
+shader_parameter/texture_alpha = 1.0
+shader_parameter/texture_red_as_alpha = false
+shader_parameter/premultiply_color = false
+shader_parameter/premultiply_alpha = false
+shader_parameter/contrast = 1.0
+shader_parameter/brightness = 0.0
+shader_parameter/rect_size_ratio = 1.0
+shader_parameter/use_uv_polar = false
+shader_parameter/use_uv_distortion = false
+shader_parameter/use_uv_rotation = false
+shader_parameter/use_uv_pixelate = false
+shader_parameter/use_uv_twist = false
+shader_parameter/use_uv_fisheye = false
+shader_parameter/use_uv_pinch = false
+shader_parameter/use_uv_handrawn = false
+shader_parameter/use_uv_shake = false
+shader_parameter/use_uv_wave = false
+shader_parameter/use_uv_round_wave = false
+shader_parameter/use_uv_wind = false
+shader_parameter/use_uv_wrap = false
+shader_parameter/use_uv_zoom = false
+shader_parameter/use_color_single = false
+shader_parameter/use_color_overlay_texture = false
+shader_parameter/use_outline = false
+shader_parameter/use_outline_inner = false
+shader_parameter/use_alpha_disolve = false
+shader_parameter/use_chromatic_aberration = false
+shader_parameter/use_motion_blur = false
+shader_parameter/use_glitch = false
+shader_parameter/use_color_gradient = false
+shader_parameter/use_color_radial_gradient = false
+shader_parameter/use_color_toning = false
+shader_parameter/use_color_ramp = false
+shader_parameter/use_color_change = false
+shader_parameter/use_color_ghost = false
+shader_parameter/use_color_hologram = false
+shader_parameter/use_color_posterize = false
+shader_parameter/use_color_negative = true
+shader_parameter/color_negative_blend = 1.0
+shader_parameter/use_color_glow = false
+shader_parameter/use_color_hsv_shift = false
+shader_parameter/use_color_shadow = false
+shader_parameter/use_color_greyscale = false
+shader_parameter/use_color_shine = false
+shader_parameter/use_alpha_mask = false
+shader_parameter/use_alpha_remap = false
+shader_parameter/use_alpha_cutoff = false
+shader_parameter/use_alpha_clip = false
+shader_parameter/use_alpha_radial_clip = false
+shader_parameter/use_alpha_flicker = false
+shader_parameter/use_particle_anim = false
+script = ExtResource("1_arucr")
+BlendMode = 0
+LightMode = 0
+
+[sub_resource type="Shader" id="Shader_yedcx"]
+resource_name = "VFEZ2DPreview"
+code = "
+// This shader was dynamically generated by the VFEZ material.
+// **********************************
+// Every change to the VFEZ material Render Options or
+// Include Options generates a new shader. After every change
+// you can click on the new exported shader in the editor to view
+// the latest changes. Only the definitions (#define) actually change.
+// **********************************
+shader_type canvas_item;
+#define BLEND_MIX
+#define COLOR_HOLOGRAM
+#include \"res://addons/VFEZ-godot/Shaders/vfez_2d_template.gdshaderinc\"
+"
+
+[sub_resource type="ShaderMaterial" id="ShaderMaterial_d5a0e"]
+shader = SubResource("Shader_yedcx")
+shader_parameter/texture_scale = Vector2(1, 1)
+shader_parameter/texture_offset = Vector2(0, 0)
+shader_parameter/texture_scroll_speed = Vector2(0, 0)
+shader_parameter/replicate_on_scale = true
+shader_parameter/texture_color = Color(1, 1, 1, 1)
+shader_parameter/texture_alpha = 1.0
+shader_parameter/texture_red_as_alpha = false
+shader_parameter/premultiply_color = false
+shader_parameter/premultiply_alpha = false
+shader_parameter/contrast = 1.0
+shader_parameter/brightness = 0.0
+shader_parameter/rect_size_ratio = 1.0
+shader_parameter/use_uv_polar = false
+shader_parameter/use_uv_distortion = false
+shader_parameter/use_uv_rotation = false
+shader_parameter/use_uv_pixelate = false
+shader_parameter/use_uv_twist = false
+shader_parameter/use_uv_fisheye = false
+shader_parameter/use_uv_pinch = false
+shader_parameter/use_uv_handrawn = false
+shader_parameter/use_uv_shake = false
+shader_parameter/use_uv_wave = false
+shader_parameter/use_uv_round_wave = false
+shader_parameter/use_uv_wind = false
+shader_parameter/use_uv_wrap = false
+shader_parameter/use_uv_zoom = false
+shader_parameter/use_color_single = false
+shader_parameter/use_color_overlay_texture = false
+shader_parameter/use_outline = false
+shader_parameter/use_outline_inner = false
+shader_parameter/use_alpha_disolve = false
+shader_parameter/use_chromatic_aberration = false
+shader_parameter/use_motion_blur = false
+shader_parameter/use_glitch = false
+shader_parameter/use_color_gradient = false
+shader_parameter/use_color_radial_gradient = false
+shader_parameter/use_color_toning = false
+shader_parameter/use_color_ramp = false
+shader_parameter/use_color_change = false
+shader_parameter/use_color_ghost = false
+shader_parameter/use_color_hologram = true
+shader_parameter/color_hologram_stripes_color = Color(0, 1, 1, 1)
+shader_parameter/color_hologram_stripes_amount = 0.411
+shader_parameter/color_hologram_unchanged_amount = 0.24
+shader_parameter/color_hologram_stripes_speed = 4.74
+shader_parameter/color_hologram_min_alpha = 0.1
+shader_parameter/color_hologram_max_alpha = 1.0
+shader_parameter/color_hologram_blend = 0.725
+shader_parameter/use_color_posterize = false
+shader_parameter/use_color_negative = false
+shader_parameter/use_color_glow = false
+shader_parameter/use_color_hsv_shift = false
+shader_parameter/use_color_shadow = false
+shader_parameter/use_color_greyscale = false
+shader_parameter/use_color_shine = false
+shader_parameter/use_alpha_mask = false
+shader_parameter/use_alpha_remap = false
+shader_parameter/use_alpha_cutoff = false
+shader_parameter/use_alpha_clip = false
+shader_parameter/use_alpha_radial_clip = false
+shader_parameter/use_alpha_flicker = false
+shader_parameter/use_particle_anim = false
+script = ExtResource("1_arucr")
+BlendMode = 0
+LightMode = 0
+
+[sub_resource type="Shader" id="Shader_vk4qm"]
+resource_name = "VFEZ2DPreview"
+code = "
+// This shader was dynamically generated by the VFEZ material.
+// **********************************
+// Every change to the VFEZ material Render Options or
+// Include Options generates a new shader. After every change
+// you can click on the new exported shader in the editor to view
+// the latest changes. Only the definitions (#define) actually change.
+// **********************************
+shader_type canvas_item;
+#define BLEND_MIX
+#define COLOR_HSV_SHIFT
+#include \"res://addons/VFEZ-godot/Shaders/vfez_2d_template.gdshaderinc\"
+"
+
+[sub_resource type="ShaderMaterial" id="ShaderMaterial_svkmx"]
+shader = SubResource("Shader_vk4qm")
+shader_parameter/texture_scale = Vector2(1, 1)
+shader_parameter/texture_offset = Vector2(0, 0)
+shader_parameter/texture_scroll_speed = Vector2(0, 0)
+shader_parameter/replicate_on_scale = true
+shader_parameter/texture_color = Color(1, 1, 1, 1)
+shader_parameter/texture_alpha = 1.0
+shader_parameter/texture_red_as_alpha = false
+shader_parameter/premultiply_color = false
+shader_parameter/premultiply_alpha = false
+shader_parameter/contrast = 1.0
+shader_parameter/brightness = 0.0
+shader_parameter/rect_size_ratio = 1.0
+shader_parameter/use_uv_polar = false
+shader_parameter/use_uv_distortion = false
+shader_parameter/use_uv_rotation = false
+shader_parameter/use_uv_pixelate = false
+shader_parameter/use_uv_twist = false
+shader_parameter/use_uv_fisheye = false
+shader_parameter/use_uv_pinch = false
+shader_parameter/use_uv_handrawn = false
+shader_parameter/use_uv_shake = false
+shader_parameter/use_uv_wave = false
+shader_parameter/use_uv_round_wave = false
+shader_parameter/use_uv_wind = false
+shader_parameter/use_uv_wrap = false
+shader_parameter/use_uv_zoom = false
+shader_parameter/use_color_single = false
+shader_parameter/use_color_overlay_texture = false
+shader_parameter/use_outline = false
+shader_parameter/use_outline_inner = false
+shader_parameter/use_alpha_disolve = false
+shader_parameter/use_chromatic_aberration = false
+shader_parameter/use_motion_blur = false
+shader_parameter/use_glitch = false
+shader_parameter/use_color_gradient = false
+shader_parameter/use_color_radial_gradient = false
+shader_parameter/use_color_toning = false
+shader_parameter/use_color_ramp = false
+shader_parameter/use_color_change = false
+shader_parameter/use_color_ghost = false
+shader_parameter/use_color_hologram = false
+shader_parameter/use_color_posterize = false
+shader_parameter/use_color_negative = false
+shader_parameter/use_color_glow = false
+shader_parameter/use_color_hsv_shift = true
+shader_parameter/h_shift = 180.0
+shader_parameter/s_shift = 1.0
+shader_parameter/v_shift = 1.0
+shader_parameter/use_color_shadow = false
+shader_parameter/use_color_greyscale = false
+shader_parameter/use_color_shine = false
+shader_parameter/use_alpha_mask = false
+shader_parameter/use_alpha_remap = false
+shader_parameter/use_alpha_cutoff = false
+shader_parameter/use_alpha_clip = false
+shader_parameter/use_alpha_radial_clip = false
+shader_parameter/use_alpha_flicker = false
+shader_parameter/use_particle_anim = false
+script = ExtResource("1_arucr")
+BlendMode = 0
+LightMode = 0
+
+[sub_resource type="Shader" id="Shader_x77co"]
+resource_name = "VFEZ2DPreview"
+code = "
+// This shader was dynamically generated by the VFEZ material.
+// **********************************
+// Every change to the VFEZ material Render Options or
+// Include Options generates a new shader. After every change
+// you can click on the new exported shader in the editor to view
+// the latest changes. Only the definitions (#define) actually change.
+// **********************************
+shader_type canvas_item;
+#define BLEND_MIX
+#define UV_TWIST
+#include \"res://addons/VFEZ-godot/Shaders/vfez_2d_template.gdshaderinc\"
+"
+
+[sub_resource type="ShaderMaterial" id="ShaderMaterial_dj2rv"]
+shader = SubResource("Shader_x77co")
+shader_parameter/texture_scale = Vector2(1, 1)
+shader_parameter/texture_offset = Vector2(0, 0)
+shader_parameter/texture_scroll_speed = Vector2(0, 0)
+shader_parameter/replicate_on_scale = true
+shader_parameter/texture_color = Color(1, 1, 1, 1)
+shader_parameter/texture_alpha = 1.0
+shader_parameter/texture_red_as_alpha = false
+shader_parameter/premultiply_color = false
+shader_parameter/premultiply_alpha = false
+shader_parameter/contrast = 1.0
+shader_parameter/brightness = 0.0
+shader_parameter/rect_size_ratio = 1.0
+shader_parameter/use_uv_polar = false
+shader_parameter/use_uv_distortion = false
+shader_parameter/use_uv_rotation = false
+shader_parameter/use_uv_pixelate = false
+shader_parameter/use_uv_twist = true
+shader_parameter/uv_twist_amount = 0.172
+shader_parameter/uv_twist_pos_x = 0.5
+shader_parameter/uv_twist_pos_y = 0.5
+shader_parameter/uv_twist_radius = 0.75
+shader_parameter/use_uv_fisheye = false
+shader_parameter/use_uv_pinch = false
+shader_parameter/use_uv_handrawn = false
+shader_parameter/use_uv_shake = false
+shader_parameter/use_uv_wave = false
+shader_parameter/use_uv_round_wave = false
+shader_parameter/use_uv_wind = false
+shader_parameter/use_uv_wrap = false
+shader_parameter/use_uv_zoom = false
+shader_parameter/use_color_single = false
+shader_parameter/use_color_overlay_texture = false
+shader_parameter/use_outline = false
+shader_parameter/use_outline_inner = false
+shader_parameter/use_alpha_disolve = false
+shader_parameter/use_chromatic_aberration = false
+shader_parameter/use_motion_blur = false
+shader_parameter/use_glitch = false
+shader_parameter/use_color_gradient = false
+shader_parameter/use_color_radial_gradient = false
+shader_parameter/use_color_toning = false
+shader_parameter/use_color_ramp = false
+shader_parameter/use_color_change = false
+shader_parameter/use_color_ghost = false
+shader_parameter/use_color_hologram = false
+shader_parameter/use_color_posterize = false
+shader_parameter/use_color_negative = false
+shader_parameter/use_color_glow = false
+shader_parameter/use_color_hsv_shift = false
+shader_parameter/use_color_shadow = false
+shader_parameter/use_color_greyscale = false
+shader_parameter/use_color_shine = false
+shader_parameter/use_alpha_mask = false
+shader_parameter/use_alpha_remap = false
+shader_parameter/use_alpha_cutoff = false
+shader_parameter/use_alpha_clip = false
+shader_parameter/use_alpha_radial_clip = false
+shader_parameter/use_alpha_flicker = false
+shader_parameter/use_particle_anim = false
+script = ExtResource("1_arucr")
+BlendMode = 0
+LightMode = 0
+
+[sub_resource type="Shader" id="Shader_hwu02"]
+resource_name = "VFEZ2DPreview"
+code = "
+// This shader was dynamically generated by the VFEZ material.
+// **********************************
+// Every change to the VFEZ material Render Options or
+// Include Options generates a new shader. After every change
+// you can click on the new exported shader in the editor to view
+// the latest changes. Only the definitions (#define) actually change.
+// **********************************
+shader_type canvas_item;
+#define BLEND_MIX
+#define COLOR_SHINE
+#include \"res://addons/VFEZ-godot/Shaders/vfez_2d_template.gdshaderinc\"
+"
+
+[sub_resource type="ShaderMaterial" id="ShaderMaterial_o4bx6"]
+shader = SubResource("Shader_hwu02")
+shader_parameter/texture_scale = Vector2(1, 1)
+shader_parameter/texture_offset = Vector2(0, 0)
+shader_parameter/texture_scroll_speed = Vector2(0, 0)
+shader_parameter/replicate_on_scale = true
+shader_parameter/texture_color = Color(1, 1, 1, 1)
+shader_parameter/texture_alpha = 1.0
+shader_parameter/texture_red_as_alpha = false
+shader_parameter/premultiply_color = false
+shader_parameter/premultiply_alpha = false
+shader_parameter/contrast = 1.0
+shader_parameter/brightness = 0.0
+shader_parameter/rect_size_ratio = 1.0
+shader_parameter/use_uv_polar = false
+shader_parameter/use_uv_distortion = false
+shader_parameter/use_uv_rotation = false
+shader_parameter/use_uv_pixelate = false
+shader_parameter/use_uv_twist = false
+shader_parameter/use_uv_fisheye = false
+shader_parameter/use_uv_pinch = false
+shader_parameter/use_uv_handrawn = false
+shader_parameter/use_uv_shake = false
+shader_parameter/use_uv_wave = false
+shader_parameter/use_uv_round_wave = false
+shader_parameter/use_uv_wind = false
+shader_parameter/use_uv_wrap = false
+shader_parameter/use_uv_zoom = false
+shader_parameter/use_color_single = false
+shader_parameter/use_color_overlay_texture = false
+shader_parameter/use_outline = false
+shader_parameter/use_outline_inner = false
+shader_parameter/use_alpha_disolve = false
+shader_parameter/use_chromatic_aberration = false
+shader_parameter/use_motion_blur = false
+shader_parameter/use_glitch = false
+shader_parameter/use_color_gradient = false
+shader_parameter/use_color_radial_gradient = false
+shader_parameter/use_color_toning = false
+shader_parameter/use_color_ramp = false
+shader_parameter/use_color_change = false
+shader_parameter/use_color_ghost = false
+shader_parameter/use_color_hologram = false
+shader_parameter/use_color_posterize = false
+shader_parameter/use_color_negative = false
+shader_parameter/use_color_glow = false
+shader_parameter/use_color_hsv_shift = false
+shader_parameter/use_color_shadow = false
+shader_parameter/use_color_greyscale = false
+shader_parameter/use_color_shine = true
+shader_parameter/color_shine_color = Color(1, 0.933333, 0, 1)
+shader_parameter/color_shine_location = 0.5
+shader_parameter/color_shine_angle = 0.0
+shader_parameter/color_shine_width = 0.1
+shader_parameter/color_shine_glow = 1.0
+shader_parameter/color_shine_mask_red_as_alpha = false
+shader_parameter/use_alpha_mask = false
+shader_parameter/use_alpha_remap = false
+shader_parameter/use_alpha_cutoff = false
+shader_parameter/use_alpha_clip = false
+shader_parameter/use_alpha_radial_clip = false
+shader_parameter/use_alpha_flicker = false
+shader_parameter/use_particle_anim = false
+script = ExtResource("1_arucr")
+BlendMode = 0
+LightMode = 0
+
+[sub_resource type="Shader" id="Shader_ubs67"]
+resource_name = "VFEZ2DPreview"
+code = "
+// This shader was dynamically generated by the VFEZ material.
+// **********************************
+// Every change to the VFEZ material Render Options or
+// Include Options generates a new shader. After every change
+// you can click on the new exported shader in the editor to view
+// the latest changes. Only the definitions (#define) actually change.
+// **********************************
+shader_type canvas_item;
+#define BLEND_MIX
+#define UV_PINCH
+#include \"res://addons/VFEZ-godot/Shaders/vfez_2d_template.gdshaderinc\"
+"
+
+[sub_resource type="ShaderMaterial" id="ShaderMaterial_v5mhn"]
+shader = SubResource("Shader_ubs67")
+shader_parameter/texture_scale = Vector2(1, 1)
+shader_parameter/texture_offset = Vector2(0, 0)
+shader_parameter/texture_scroll_speed = Vector2(0, 0)
+shader_parameter/replicate_on_scale = true
+shader_parameter/texture_color = Color(1, 1, 1, 1)
+shader_parameter/texture_alpha = 1.0
+shader_parameter/texture_red_as_alpha = false
+shader_parameter/premultiply_color = false
+shader_parameter/premultiply_alpha = false
+shader_parameter/contrast = 1.0
+shader_parameter/brightness = 0.0
+shader_parameter/rect_size_ratio = 1.0
+shader_parameter/use_uv_polar = false
+shader_parameter/use_uv_distortion = false
+shader_parameter/use_uv_rotation = false
+shader_parameter/use_uv_pixelate = false
+shader_parameter/use_uv_twist = false
+shader_parameter/use_uv_fisheye = false
+shader_parameter/use_uv_pinch = true
+shader_parameter/uv_pinch_center_x = 0.5
+shader_parameter/uv_pinch_center_y = 0.5
+shader_parameter/uv_pinch_amount = 0.105
+shader_parameter/use_uv_handrawn = false
+shader_parameter/use_uv_shake = false
+shader_parameter/use_uv_wave = false
+shader_parameter/use_uv_round_wave = false
+shader_parameter/use_uv_wind = false
+shader_parameter/use_uv_wrap = false
+shader_parameter/use_uv_zoom = false
+shader_parameter/use_color_single = false
+shader_parameter/use_color_overlay_texture = false
+shader_parameter/use_outline = false
+shader_parameter/use_outline_inner = false
+shader_parameter/use_alpha_disolve = false
+shader_parameter/use_chromatic_aberration = false
+shader_parameter/use_motion_blur = false
+shader_parameter/use_glitch = false
+shader_parameter/use_color_gradient = false
+shader_parameter/use_color_radial_gradient = false
+shader_parameter/use_color_toning = false
+shader_parameter/use_color_ramp = false
+shader_parameter/use_color_change = false
+shader_parameter/use_color_ghost = false
+shader_parameter/use_color_hologram = false
+shader_parameter/use_color_posterize = false
+shader_parameter/use_color_negative = false
+shader_parameter/use_color_glow = false
+shader_parameter/use_color_hsv_shift = false
+shader_parameter/use_color_shadow = false
+shader_parameter/use_color_greyscale = false
+shader_parameter/use_color_shine = false
+shader_parameter/use_alpha_mask = false
+shader_parameter/use_alpha_remap = false
+shader_parameter/use_alpha_cutoff = false
+shader_parameter/use_alpha_clip = false
+shader_parameter/use_alpha_radial_clip = false
+shader_parameter/use_alpha_flicker = false
+shader_parameter/use_particle_anim = false
+script = ExtResource("1_arucr")
+BlendMode = 0
+LightMode = 0
+
+[sub_resource type="Shader" id="Shader_c5u6x"]
+resource_name = "VFEZ2DPreview"
+code = "
+// This shader was dynamically generated by the VFEZ material.
+// **********************************
+// Every change to the VFEZ material Render Options or
+// Include Options generates a new shader. After every change
+// you can click on the new exported shader in the editor to view
+// the latest changes. Only the definitions (#define) actually change.
+// **********************************
+shader_type canvas_item;
+#define BLEND_MIX
+#define CHROMATIC_ABERRATION
+#include \"res://addons/VFEZ-godot/Shaders/vfez_2d_template.gdshaderinc\"
+"
+
+[sub_resource type="ShaderMaterial" id="ShaderMaterial_06gj7"]
+shader = SubResource("Shader_c5u6x")
+shader_parameter/texture_scale = Vector2(1, 1)
+shader_parameter/texture_offset = Vector2(0, 0)
+shader_parameter/texture_scroll_speed = Vector2(0, 0)
+shader_parameter/replicate_on_scale = true
+shader_parameter/texture_color = Color(1, 1, 1, 1)
+shader_parameter/texture_alpha = 1.0
+shader_parameter/texture_red_as_alpha = false
+shader_parameter/premultiply_color = false
+shader_parameter/premultiply_alpha = false
+shader_parameter/contrast = 1.0
+shader_parameter/brightness = 0.0
+shader_parameter/rect_size_ratio = 1.0
+shader_parameter/use_uv_polar = false
+shader_parameter/use_uv_distortion = false
+shader_parameter/use_uv_rotation = false
+shader_parameter/use_uv_pixelate = false
+shader_parameter/use_uv_twist = false
+shader_parameter/use_uv_fisheye = false
+shader_parameter/use_uv_pinch = false
+shader_parameter/use_uv_handrawn = false
+shader_parameter/use_uv_shake = false
+shader_parameter/use_uv_wave = false
+shader_parameter/use_uv_round_wave = false
+shader_parameter/use_uv_wind = false
+shader_parameter/use_uv_wrap = false
+shader_parameter/use_uv_zoom = false
+shader_parameter/use_color_single = false
+shader_parameter/use_color_overlay_texture = false
+shader_parameter/use_outline = false
+shader_parameter/use_outline_inner = false
+shader_parameter/use_alpha_disolve = false
+shader_parameter/use_chromatic_aberration = true
+shader_parameter/chromatic_aberration_amount = 1.0
+shader_parameter/chromatic_aberration_alpha = 0.4
+shader_parameter/use_motion_blur = false
+shader_parameter/use_glitch = false
+shader_parameter/use_color_gradient = false
+shader_parameter/use_color_radial_gradient = false
+shader_parameter/use_color_toning = false
+shader_parameter/use_color_ramp = false
+shader_parameter/use_color_change = false
+shader_parameter/use_color_ghost = false
+shader_parameter/use_color_hologram = false
+shader_parameter/use_color_posterize = false
+shader_parameter/use_color_negative = false
+shader_parameter/use_color_glow = false
+shader_parameter/use_color_hsv_shift = false
+shader_parameter/use_color_shadow = false
+shader_parameter/use_color_greyscale = false
+shader_parameter/use_color_shine = false
+shader_parameter/use_alpha_mask = false
+shader_parameter/use_alpha_remap = false
+shader_parameter/use_alpha_cutoff = false
+shader_parameter/use_alpha_clip = false
+shader_parameter/use_alpha_radial_clip = false
+shader_parameter/use_alpha_flicker = false
+shader_parameter/use_particle_anim = false
+script = ExtResource("1_arucr")
+BlendMode = 0
+LightMode = 0
+
+[sub_resource type="Shader" id="Shader_hnqd7"]
+resource_name = "VFEZ2DPreview"
+code = "
+// This shader was dynamically generated by the VFEZ material.
+// **********************************
+// Every change to the VFEZ material Render Options or
+// Include Options generates a new shader. After every change
+// you can click on the new exported shader in the editor to view
+// the latest changes. Only the definitions (#define) actually change.
+// **********************************
+shader_type canvas_item;
+#define BLEND_MIX
+#define COLOR_GRADIENT
+#include \"res://addons/VFEZ-godot/Shaders/vfez_2d_template.gdshaderinc\"
+"
+
+[sub_resource type="ShaderMaterial" id="ShaderMaterial_g84t5"]
+shader = SubResource("Shader_hnqd7")
+shader_parameter/texture_scale = Vector2(1, 1)
+shader_parameter/texture_offset = Vector2(0, 0)
+shader_parameter/texture_scroll_speed = Vector2(0, 0)
+shader_parameter/replicate_on_scale = true
+shader_parameter/texture_color = Color(1, 1, 1, 1)
+shader_parameter/texture_alpha = 1.0
+shader_parameter/texture_red_as_alpha = false
+shader_parameter/premultiply_color = false
+shader_parameter/premultiply_alpha = false
+shader_parameter/contrast = 1.0
+shader_parameter/brightness = 0.0
+shader_parameter/rect_size_ratio = 1.0
+shader_parameter/use_uv_polar = false
+shader_parameter/use_uv_distortion = false
+shader_parameter/use_uv_rotation = false
+shader_parameter/use_uv_pixelate = false
+shader_parameter/use_uv_twist = false
+shader_parameter/use_uv_fisheye = false
+shader_parameter/use_uv_pinch = false
+shader_parameter/use_uv_handrawn = false
+shader_parameter/use_uv_shake = false
+shader_parameter/use_uv_wave = false
+shader_parameter/use_uv_round_wave = false
+shader_parameter/use_uv_wind = false
+shader_parameter/use_uv_wrap = false
+shader_parameter/use_uv_zoom = false
+shader_parameter/use_color_single = false
+shader_parameter/use_color_overlay_texture = false
+shader_parameter/use_outline = false
+shader_parameter/use_outline_inner = false
+shader_parameter/use_alpha_disolve = false
+shader_parameter/use_chromatic_aberration = false
+shader_parameter/use_motion_blur = false
+shader_parameter/use_glitch = false
+shader_parameter/use_color_gradient = true
+shader_parameter/color_gradient_blend = 0.5
+shader_parameter/color_gradient_boost_x = 0.5
+shader_parameter/color_gradient_boost_y = 0.5
+shader_parameter/color_gradient_top_right_color = Color(1, 0, 0, 1)
+shader_parameter/color_gradient_bottom_right_color = Color(0, 1, 0, 1)
+shader_parameter/color_gradient_top_left_color = Color(0, 0, 1, 1)
+shader_parameter/color_gradient_bottom_left_color = Color(1, 1, 0, 1)
+shader_parameter/use_color_radial_gradient = false
+shader_parameter/use_color_toning = false
+shader_parameter/use_color_ramp = false
+shader_parameter/use_color_change = false
+shader_parameter/use_color_ghost = false
+shader_parameter/use_color_hologram = false
+shader_parameter/use_color_posterize = false
+shader_parameter/use_color_negative = false
+shader_parameter/use_color_glow = false
+shader_parameter/use_color_hsv_shift = false
+shader_parameter/use_color_shadow = false
+shader_parameter/use_color_greyscale = false
+shader_parameter/use_color_shine = false
+shader_parameter/use_alpha_mask = false
+shader_parameter/use_alpha_remap = false
+shader_parameter/use_alpha_cutoff = false
+shader_parameter/use_alpha_clip = false
+shader_parameter/use_alpha_radial_clip = false
+shader_parameter/use_alpha_flicker = false
+shader_parameter/use_particle_anim = false
+script = ExtResource("1_arucr")
+BlendMode = 0
+LightMode = 0
+
+[sub_resource type="Shader" id="Shader_o3xdy"]
+resource_name = "VFEZ2DPreview"
+code = "
+// This shader was dynamically generated by the VFEZ material.
+// **********************************
+// Every change to the VFEZ material Render Options or
+// Include Options generates a new shader. After every change
+// you can click on the new exported shader in the editor to view
+// the latest changes. Only the definitions (#define) actually change.
+// **********************************
+shader_type canvas_item;
+#define BLEND_MIX
+#define COLOR_RAMP
+#include \"res://addons/VFEZ-godot/Shaders/vfez_2d_template.gdshaderinc\"
+"
+
+[sub_resource type="Gradient" id="Gradient_r8mve"]
+colors = PackedColorArray(1, 0, 0, 1, 0, 0, 0, 1)
+
+[sub_resource type="GradientTexture1D" id="GradientTexture1D_ayeke"]
+gradient = SubResource("Gradient_r8mve")
+
+[sub_resource type="ShaderMaterial" id="ShaderMaterial_xyb0m"]
+shader = SubResource("Shader_o3xdy")
+shader_parameter/texture_scale = Vector2(1, 1)
+shader_parameter/texture_offset = Vector2(0, 0)
+shader_parameter/texture_scroll_speed = Vector2(0, 0)
+shader_parameter/replicate_on_scale = true
+shader_parameter/texture_color = Color(1, 1, 1, 1)
+shader_parameter/texture_alpha = 1.0
+shader_parameter/texture_red_as_alpha = false
+shader_parameter/premultiply_color = false
+shader_parameter/premultiply_alpha = false
+shader_parameter/contrast = 1.0
+shader_parameter/brightness = 0.0
+shader_parameter/rect_size_ratio = 1.0
+shader_parameter/use_uv_polar = false
+shader_parameter/use_uv_distortion = false
+shader_parameter/use_uv_rotation = false
+shader_parameter/use_uv_pixelate = false
+shader_parameter/use_uv_twist = false
+shader_parameter/use_uv_fisheye = false
+shader_parameter/use_uv_pinch = false
+shader_parameter/use_uv_handrawn = false
+shader_parameter/use_uv_shake = false
+shader_parameter/use_uv_wave = false
+shader_parameter/use_uv_round_wave = false
+shader_parameter/use_uv_wind = false
+shader_parameter/use_uv_wrap = false
+shader_parameter/use_uv_zoom = false
+shader_parameter/use_color_single = false
+shader_parameter/use_color_overlay_texture = false
+shader_parameter/use_outline = false
+shader_parameter/use_outline_inner = false
+shader_parameter/use_alpha_disolve = false
+shader_parameter/use_chromatic_aberration = false
+shader_parameter/use_motion_blur = false
+shader_parameter/use_glitch = false
+shader_parameter/use_color_gradient = false
+shader_parameter/use_color_radial_gradient = false
+shader_parameter/use_color_toning = false
+shader_parameter/use_color_ramp = true
+shader_parameter/color_ramp_albedo = Color(1, 1, 1, 1)
+shader_parameter/color_ramp_luminosity = 0.0
+shader_parameter/color_ramp_blend = 1.0
+shader_parameter/color_ramp_texture = SubResource("GradientTexture1D_ayeke")
+shader_parameter/use_color_change = false
+shader_parameter/use_color_ghost = false
+shader_parameter/use_color_hologram = false
+shader_parameter/use_color_posterize = false
+shader_parameter/use_color_negative = false
+shader_parameter/use_color_glow = false
+shader_parameter/use_color_hsv_shift = false
+shader_parameter/use_color_shadow = false
+shader_parameter/use_color_greyscale = false
+shader_parameter/use_color_shine = false
+shader_parameter/use_alpha_mask = false
+shader_parameter/use_alpha_remap = false
+shader_parameter/use_alpha_cutoff = false
+shader_parameter/use_alpha_clip = false
+shader_parameter/use_alpha_radial_clip = false
+shader_parameter/use_alpha_flicker = false
+shader_parameter/use_particle_anim = false
+script = ExtResource("1_arucr")
+BlendMode = 0
+LightMode = 0
+
+[sub_resource type="Shader" id="Shader_ewejt"]
+resource_name = "VFEZ2DPreview"
+code = "
+// This shader was dynamically generated by the VFEZ material.
+// **********************************
+// Every change to the VFEZ material Render Options or
+// Include Options generates a new shader. After every change
+// you can click on the new exported shader in the editor to view
+// the latest changes. Only the definitions (#define) actually change.
+// **********************************
+shader_type canvas_item;
+#define BLEND_MIX
+#define MOTION_BLUR
+#include \"res://addons/VFEZ-godot/Shaders/vfez_2d_template.gdshaderinc\"
+"
+
+[sub_resource type="ShaderMaterial" id="ShaderMaterial_411on"]
+shader = SubResource("Shader_ewejt")
+shader_parameter/texture_scale = Vector2(1, 1)
+shader_parameter/texture_offset = Vector2(0, 0)
+shader_parameter/texture_scroll_speed = Vector2(0, 0)
+shader_parameter/replicate_on_scale = true
+shader_parameter/texture_color = Color(1, 1, 1, 1)
+shader_parameter/texture_alpha = 1.0
+shader_parameter/texture_red_as_alpha = false
+shader_parameter/premultiply_color = false
+shader_parameter/premultiply_alpha = false
+shader_parameter/contrast = 1.0
+shader_parameter/brightness = 0.0
+shader_parameter/rect_size_ratio = 1.0
+shader_parameter/use_uv_polar = false
+shader_parameter/use_uv_distortion = false
+shader_parameter/use_uv_rotation = false
+shader_parameter/use_uv_pixelate = false
+shader_parameter/use_uv_twist = false
+shader_parameter/use_uv_fisheye = false
+shader_parameter/use_uv_pinch = false
+shader_parameter/use_uv_handrawn = false
+shader_parameter/use_uv_shake = false
+shader_parameter/use_uv_wave = false
+shader_parameter/use_uv_round_wave = false
+shader_parameter/use_uv_wind = false
+shader_parameter/use_uv_wrap = false
+shader_parameter/use_uv_zoom = false
+shader_parameter/use_color_single = false
+shader_parameter/use_color_overlay_texture = false
+shader_parameter/use_outline = false
+shader_parameter/use_outline_inner = false
+shader_parameter/use_alpha_disolve = false
+shader_parameter/use_chromatic_aberration = false
+shader_parameter/use_motion_blur = true
+shader_parameter/motion_blur_angle = 0.328
+shader_parameter/motion_blur_dist = 2.436
+shader_parameter/use_glitch = false
+shader_parameter/use_color_gradient = false
+shader_parameter/use_color_radial_gradient = false
+shader_parameter/use_color_toning = false
+shader_parameter/use_color_ramp = false
+shader_parameter/use_color_change = false
+shader_parameter/use_color_ghost = false
+shader_parameter/use_color_hologram = false
+shader_parameter/use_color_posterize = false
+shader_parameter/use_color_negative = false
+shader_parameter/use_color_glow = false
+shader_parameter/use_color_hsv_shift = false
+shader_parameter/use_color_shadow = false
+shader_parameter/use_color_greyscale = false
+shader_parameter/use_color_shine = false
+shader_parameter/use_alpha_mask = false
+shader_parameter/use_alpha_remap = false
+shader_parameter/use_alpha_cutoff = false
+shader_parameter/use_alpha_clip = false
+shader_parameter/use_alpha_radial_clip = false
+shader_parameter/use_alpha_flicker = false
+shader_parameter/use_particle_anim = false
+script = ExtResource("1_arucr")
+BlendMode = 0
+LightMode = 0
+
+[sub_resource type="Shader" id="Shader_4curf"]
+resource_name = "VFEZ2DPreview"
+code = "
+// This shader was dynamically generated by the VFEZ material.
+// **********************************
+// Every change to the VFEZ material Render Options or
+// Include Options generates a new shader. After every change
+// you can click on the new exported shader in the editor to view
+// the latest changes. Only the definitions (#define) actually change.
+// **********************************
+shader_type canvas_item;
+#define BLEND_MIX
+#define ALPHA_RADIAL_CLIP
+#include \"res://addons/VFEZ-godot/Shaders/vfez_2d_template.gdshaderinc\"
+"
+
+[sub_resource type="ShaderMaterial" id="ShaderMaterial_ja4cr"]
+shader = SubResource("Shader_4curf")
+shader_parameter/texture_scale = Vector2(1, 1)
+shader_parameter/texture_offset = Vector2(0, 0)
+shader_parameter/texture_scroll_speed = Vector2(0, 0)
+shader_parameter/replicate_on_scale = true
+shader_parameter/texture_color = Color(1, 1, 1, 1)
+shader_parameter/texture_alpha = 1.0
+shader_parameter/texture_red_as_alpha = false
+shader_parameter/premultiply_color = false
+shader_parameter/premultiply_alpha = false
+shader_parameter/contrast = 1.0
+shader_parameter/brightness = 0.0
+shader_parameter/rect_size_ratio = 1.0
+shader_parameter/use_uv_polar = false
+shader_parameter/use_uv_distortion = false
+shader_parameter/use_uv_rotation = false
+shader_parameter/use_uv_pixelate = false
+shader_parameter/use_uv_twist = false
+shader_parameter/use_uv_fisheye = false
+shader_parameter/use_uv_pinch = false
+shader_parameter/use_uv_handrawn = false
+shader_parameter/use_uv_shake = false
+shader_parameter/use_uv_wave = false
+shader_parameter/use_uv_round_wave = false
+shader_parameter/use_uv_wind = false
+shader_parameter/use_uv_wrap = false
+shader_parameter/use_uv_zoom = false
+shader_parameter/use_color_single = false
+shader_parameter/use_color_overlay_texture = false
+shader_parameter/use_outline = false
+shader_parameter/use_outline_inner = false
+shader_parameter/use_alpha_disolve = false
+shader_parameter/use_chromatic_aberration = false
+shader_parameter/use_motion_blur = false
+shader_parameter/use_glitch = false
+shader_parameter/use_color_gradient = false
+shader_parameter/use_color_radial_gradient = false
+shader_parameter/use_color_toning = false
+shader_parameter/use_color_ramp = false
+shader_parameter/use_color_change = false
+shader_parameter/use_color_ghost = false
+shader_parameter/use_color_hologram = false
+shader_parameter/use_color_posterize = false
+shader_parameter/use_color_negative = false
+shader_parameter/use_color_glow = false
+shader_parameter/use_color_hsv_shift = false
+shader_parameter/use_color_shadow = false
+shader_parameter/use_color_greyscale = false
+shader_parameter/use_color_shine = false
+shader_parameter/use_alpha_mask = false
+shader_parameter/use_alpha_remap = false
+shader_parameter/use_alpha_cutoff = false
+shader_parameter/use_alpha_clip = false
+shader_parameter/use_alpha_radial_clip = true
+shader_parameter/alpha_radial_clip_start_angle = 70.0
+shader_parameter/alpha_radial_clip_one = 70.0
+shader_parameter/alpha_radial_clip_two = 150.0
+shader_parameter/use_alpha_flicker = false
+shader_parameter/use_particle_anim = false
+script = ExtResource("1_arucr")
+BlendMode = 0
+LightMode = 0
+
+[node name="VfezExamples2d" type="Node2D"]
+
+[node name="examples" type="Node2D" parent="."]
+
+[node name="croco_example" type="Sprite2D" parent="examples"]
+material = SubResource("ShaderMaterial_bsn0d")
+position = Vector2(571, 293)
+texture = ExtResource("1_7yy4n")
+
+[node name="WorldEnvironment" type="WorldEnvironment" parent="."]
+environment = SubResource("Environment_arucr")
+
+[node name="CanvasLayer" type="CanvasLayer" parent="."]
+
+[node name="Control" type="PanelContainer" parent="CanvasLayer"]
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+theme_override_styles/panel = SubResource("StyleBoxFlat_x0bi3")
+
+[node name="CenterContainer" type="CenterContainer" parent="CanvasLayer/Control"]
+layout_mode = 2
+
+[node name="GridContainer" type="GridContainer" parent="CanvasLayer/Control/CenterContainer"]
+layout_mode = 2
+columns = 5
+
+[node name="TextureRect" type="TextureRect" parent="CanvasLayer/Control/CenterContainer/GridContainer"]
+material = SubResource("ShaderMaterial_wc5bf")
+layout_mode = 2
+texture = ExtResource("1_7yy4n")
+
+[node name="TextureRect2" type="TextureRect" parent="CanvasLayer/Control/CenterContainer/GridContainer"]
+material = SubResource("ShaderMaterial_0ewij")
+layout_mode = 2
+texture = ExtResource("1_7yy4n")
+
+[node name="TextureRect3" type="TextureRect" parent="CanvasLayer/Control/CenterContainer/GridContainer"]
+material = SubResource("ShaderMaterial_2gk0o")
+layout_mode = 2
+texture = ExtResource("1_7yy4n")
+
+[node name="TextureRect4" type="TextureRect" parent="CanvasLayer/Control/CenterContainer/GridContainer"]
+material = SubResource("ShaderMaterial_s4rvr")
+layout_mode = 2
+texture = ExtResource("1_7yy4n")
+
+[node name="TextureRect5" type="TextureRect" parent="CanvasLayer/Control/CenterContainer/GridContainer"]
+material = SubResource("ShaderMaterial_7h522")
+layout_mode = 2
+texture = ExtResource("1_7yy4n")
+
+[node name="TextureRect6" type="TextureRect" parent="CanvasLayer/Control/CenterContainer/GridContainer"]
+material = SubResource("ShaderMaterial_d5a0e")
+layout_mode = 2
+texture = ExtResource("1_7yy4n")
+
+[node name="TextureRect7" type="TextureRect" parent="CanvasLayer/Control/CenterContainer/GridContainer"]
+material = SubResource("ShaderMaterial_svkmx")
+layout_mode = 2
+texture = ExtResource("1_7yy4n")
+
+[node name="TextureRect8" type="TextureRect" parent="CanvasLayer/Control/CenterContainer/GridContainer"]
+material = SubResource("ShaderMaterial_dj2rv")
+layout_mode = 2
+texture = ExtResource("1_7yy4n")
+
+[node name="TextureRect9" type="TextureRect" parent="CanvasLayer/Control/CenterContainer/GridContainer"]
+material = SubResource("ShaderMaterial_o4bx6")
+layout_mode = 2
+texture = ExtResource("1_7yy4n")
+
+[node name="TextureRect10" type="TextureRect" parent="CanvasLayer/Control/CenterContainer/GridContainer"]
+material = SubResource("ShaderMaterial_v5mhn")
+layout_mode = 2
+texture = ExtResource("1_7yy4n")
+
+[node name="TextureRect11" type="TextureRect" parent="CanvasLayer/Control/CenterContainer/GridContainer"]
+material = SubResource("ShaderMaterial_06gj7")
+layout_mode = 2
+texture = ExtResource("1_7yy4n")
+
+[node name="TextureRect12" type="TextureRect" parent="CanvasLayer/Control/CenterContainer/GridContainer"]
+material = SubResource("ShaderMaterial_g84t5")
+layout_mode = 2
+texture = ExtResource("1_7yy4n")
+
+[node name="TextureRect13" type="TextureRect" parent="CanvasLayer/Control/CenterContainer/GridContainer"]
+material = SubResource("ShaderMaterial_xyb0m")
+layout_mode = 2
+texture = ExtResource("1_7yy4n")
+
+[node name="TextureRect14" type="TextureRect" parent="CanvasLayer/Control/CenterContainer/GridContainer"]
+material = SubResource("ShaderMaterial_411on")
+layout_mode = 2
+texture = ExtResource("1_7yy4n")
+
+[node name="TextureRect15" type="TextureRect" parent="CanvasLayer/Control/CenterContainer/GridContainer"]
+material = SubResource("ShaderMaterial_ja4cr")
+layout_mode = 2
+texture = ExtResource("1_7yy4n")
diff --git a/VFEZ/vfez_examples_3d.tscn b/VFEZ/vfez_examples_3d.tscn
new file mode 100644
index 00000000..ec030c19
--- /dev/null
+++ b/VFEZ/vfez_examples_3d.tscn
@@ -0,0 +1,838 @@
+[gd_scene load_steps=52 format=3 uid="uid://cf0wi8xo4rxpa"]
+
+[ext_resource type="Script" path="res://addons/VFEZ-godot/vfez_material_3d.gd" id="1_o2hx6"]
+
+[sub_resource type="Shader" id="Shader_5l0pc"]
+resource_name = "VFEZ3DPreview"
+code = "
+// This shader was dynamically generated by the VFEZ material.
+// **********************************
+// Every change to the VFEZ material Render Options or
+// Include Options generates a new shader. After every change
+// you can click on the new exported shader in the editor to view
+// the latest changes. Only the definitions (#define) actually change.
+// **********************************
+shader_type spatial;
+#define BLEND_MIX
+#define DEPTH_DRAW_OPAQUE
+#define CULL_BACK
+#define DIFFUSE_LAMBERT
+#define SPECULAR_SCHLICK_GGX
+#define UNSHADED
+#define COLOR_RAMP
+#define COLOR_GLOW
+#include \"res://addons/VFEZ-godot/Shaders/vfez_3d_template.gdshaderinc\"
+"
+
+[sub_resource type="Gradient" id="Gradient_dk0f8"]
+colors = PackedColorArray(0, 0.184314, 1, 1, 0.376471, 0.411765, 1, 1)
+
+[sub_resource type="GradientTexture1D" id="GradientTexture1D_flr16"]
+gradient = SubResource("Gradient_dk0f8")
+
+[sub_resource type="Gradient" id="Gradient_arsos"]
+offsets = PackedFloat32Array(0, 0.516, 1)
+colors = PackedColorArray(1, 1, 1, 1, 0.819608, 0.819608, 0.819608, 1, 0, 0, 0, 1)
+
+[sub_resource type="GradientTexture2D" id="GradientTexture2D_fwp2g"]
+gradient = SubResource("Gradient_arsos")
+width = 256
+height = 256
+fill = 1
+fill_from = Vector2(0.5, 0.5)
+fill_to = Vector2(0.175214, 0.153846)
+
+[sub_resource type="ShaderMaterial" id="ShaderMaterial_ncvk1"]
+render_priority = 0
+shader = SubResource("Shader_5l0pc")
+shader_parameter/global_color = Color(1, 1, 1, 1)
+shader_parameter/global_alpha = 0.3
+shader_parameter/additive_config = false
+shader_parameter/premultiply_color = true
+shader_parameter/premultiply_alpha = false
+shader_parameter/shape1_main_texture_scale = Vector2(1, 1)
+shader_parameter/shape1_main_texture_offset = Vector2(0, 0)
+shader_parameter/shape1_color = Color(1, 1, 1, 1)
+shader_parameter/shape1_red_as_alpha = false
+shader_parameter/shape1_scroll_speed = Vector2(0, 0)
+shader_parameter/shape1_rotation_offset = 0.0
+shader_parameter/shape1_rotation_speed = 0.0
+shader_parameter/shape1_main_texture = SubResource("GradientTexture2D_fwp2g")
+shader_parameter/shape1_contrast = 1.0
+shader_parameter/shape1_brightness = 0.0
+shader_parameter/shape1_distortion_texture_scale = Vector2(1, 1)
+shader_parameter/shape1_distortion_texture_offset = Vector2(0, 0)
+shader_parameter/shape1_distortion_amount = 0.0
+shader_parameter/shape1_distortion_speed = Vector2(0.1, 0.1)
+shader_parameter/shape1_use_polar_uv = false
+shader_parameter/shape1_polar_uv_center = Vector2(0.5, 0.5)
+shader_parameter/shape1_distortion_polar_uvs = false
+shader_parameter/shape1_use_screenspace_uv = false
+shader_parameter/use_shape2 = false
+shader_parameter/use_shape3 = false
+shader_parameter/use_uv_pixelate = false
+shader_parameter/use_uv_twist = false
+shader_parameter/use_uv_handrawn = false
+shader_parameter/use_uv_shake = false
+shader_parameter/use_uv_wave = false
+shader_parameter/use_uv_round_wave = false
+shader_parameter/use_uv_global_distortion = false
+shader_parameter/use_alpha_disolve = false
+shader_parameter/use_color_face_tint = false
+shader_parameter/use_color_toning = false
+shader_parameter/use_color_ramp = true
+shader_parameter/color_ramp_albedo = Color(1, 1, 1, 1)
+shader_parameter/color_ramp_luminosity = 0.0
+shader_parameter/color_ramp_blend = 1.0
+shader_parameter/color_ramp_texture = SubResource("GradientTexture1D_flr16")
+shader_parameter/use_color_posterize = false
+shader_parameter/use_color_rim = false
+shader_parameter/use_color_glow = true
+shader_parameter/glow_color = Color(0, 0.215686, 1, 1)
+shader_parameter/glow_intensity = 3.0
+shader_parameter/glow_intensity_global = 1.0
+shader_parameter/use_glow_texture = false
+shader_parameter/use_color_hsv_shift = false
+shader_parameter/use_alpha_mask = false
+shader_parameter/use_alpha_remap = false
+shader_parameter/use_alpha_cutoff = false
+shader_parameter/use_vertex_offset = false
+shader_parameter/use_vertex_expand = false
+shader_parameter/use_particle_trails = false
+shader_parameter/use_particle_anim = false
+script = ExtResource("1_o2hx6")
+BlendMode = 0
+DepthDrawMode = 0
+CullMode = 0
+DiffuseMode = 0
+SpecularMode = 0
+ShadingMode = 0
+BillboardMode = 0
+BillboardKeepScale = false
+NoDepthTest = false
+
+[sub_resource type="QuadMesh" id="QuadMesh_eyir6"]
+
+[sub_resource type="Shader" id="Shader_m3jsb"]
+resource_name = "VFEZ3DPreview"
+code = "
+// This shader was dynamically generated by the VFEZ material.
+// **********************************
+// Every change to the VFEZ material Render Options or
+// Include Options generates a new shader. After every change
+// you can click on the new exported shader in the editor to view
+// the latest changes. Only the definitions (#define) actually change.
+// **********************************
+shader_type spatial;
+#define BLEND_MIX
+#define DEPTH_DRAW_OPAQUE
+#define CULL_BACK
+#define DIFFUSE_LAMBERT
+#define SPECULAR_SCHLICK_GGX
+#define UNSHADED
+#define SHAPE2
+#define COLOR_RAMP
+#define COLOR_GLOW
+#include \"res://addons/VFEZ-godot/Shaders/vfez_3d_template.gdshaderinc\"
+"
+
+[sub_resource type="FastNoiseLite" id="FastNoiseLite_q2wou"]
+
+[sub_resource type="NoiseTexture2D" id="NoiseTexture2D_57tcq"]
+seamless = true
+noise = SubResource("FastNoiseLite_q2wou")
+
+[sub_resource type="Gradient" id="Gradient_o3o64"]
+offsets = PackedFloat32Array(0.289, 0.504, 0.585, 0.762)
+colors = PackedColorArray(0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1)
+
+[sub_resource type="GradientTexture2D" id="GradientTexture2D_mdo8x"]
+gradient = SubResource("Gradient_o3o64")
+width = 256
+height = 256
+fill_from = Vector2(0.0042735, 1)
+fill_to = Vector2(0, 0)
+
+[sub_resource type="ShaderMaterial" id="ShaderMaterial_0wske"]
+render_priority = 0
+shader = SubResource("Shader_m3jsb")
+shader_parameter/global_color = Color(1, 1, 1, 1)
+shader_parameter/global_alpha = 1.0
+shader_parameter/additive_config = false
+shader_parameter/premultiply_color = true
+shader_parameter/premultiply_alpha = false
+shader_parameter/shape1_main_texture_scale = Vector2(1, 4)
+shader_parameter/shape1_main_texture_offset = Vector2(0, 0)
+shader_parameter/shape1_color = Color(1, 1, 1, 1)
+shader_parameter/shape1_red_as_alpha = false
+shader_parameter/shape1_scroll_speed = Vector2(0, -0.5)
+shader_parameter/shape1_rotation_offset = 0.0
+shader_parameter/shape1_rotation_speed = 0.0
+shader_parameter/shape1_main_texture = SubResource("GradientTexture2D_mdo8x")
+shader_parameter/shape1_contrast = 1.0
+shader_parameter/shape1_brightness = 0.0
+shader_parameter/shape1_distortion_texture_scale = Vector2(1, 1)
+shader_parameter/shape1_distortion_texture_offset = Vector2(0, 0)
+shader_parameter/shape1_distortion_amount = 1.5
+shader_parameter/shape1_distortion_speed = Vector2(0.1, 0.1)
+shader_parameter/shape1_distortion_texture = SubResource("NoiseTexture2D_57tcq")
+shader_parameter/shape1_use_polar_uv = true
+shader_parameter/shape1_polar_uv_center = Vector2(0.5, 0.5)
+shader_parameter/shape1_distortion_polar_uvs = false
+shader_parameter/shape1_use_screenspace_uv = false
+shader_parameter/use_shape2 = true
+shader_parameter/shape2_main_texture_scale = Vector2(1, 1)
+shader_parameter/shape2_main_texture_offset = Vector2(0, 0)
+shader_parameter/shape2_color = Color(1, 1, 1, 1)
+shader_parameter/shape2_red_as_alpha = false
+shader_parameter/shape2_scroll_speed = Vector2(0, 0)
+shader_parameter/shape2_rotation_offset = 0.0
+shader_parameter/shape2_rotation_speed = 0.0
+shader_parameter/shape2_main_texture = SubResource("GradientTexture2D_fwp2g")
+shader_parameter/shape2_contrast = 1.0
+shader_parameter/shape2_brightness = 0.0
+shader_parameter/shape2_distortion_texture_scale = Vector2(1, 1)
+shader_parameter/shape2_distortion_texture_offset = Vector2(0, 0)
+shader_parameter/shape2_distortion_amount = 0.0
+shader_parameter/shape2_distortion_speed = Vector2(0.1, 0.1)
+shader_parameter/shape2_use_polar_uv = false
+shader_parameter/shape2_polar_uv_center = Vector2(0.5, 0.5)
+shader_parameter/shape2_distortion_polar_uvs = false
+shader_parameter/shape2_use_screenspace_uv = false
+shader_parameter/use_shape3 = false
+shader_parameter/combine_additive = false
+shader_parameter/shape1_color_weight = 1.0
+shader_parameter/shape1_alpha_weight = 1.0
+shader_parameter/shape2_color_weight = 2.0
+shader_parameter/shape2_alpha_weight = 1.0
+shader_parameter/use_uv_pixelate = false
+shader_parameter/use_uv_twist = false
+shader_parameter/use_uv_handrawn = false
+shader_parameter/use_uv_shake = false
+shader_parameter/use_uv_wave = false
+shader_parameter/use_uv_round_wave = false
+shader_parameter/use_uv_global_distortion = false
+shader_parameter/use_alpha_disolve = false
+shader_parameter/use_color_face_tint = false
+shader_parameter/use_color_toning = false
+shader_parameter/use_color_ramp = true
+shader_parameter/color_ramp_albedo = Color(1, 1, 1, 1)
+shader_parameter/color_ramp_luminosity = 0.0
+shader_parameter/color_ramp_blend = 1.0
+shader_parameter/color_ramp_texture = SubResource("GradientTexture1D_flr16")
+shader_parameter/use_color_posterize = false
+shader_parameter/use_color_rim = false
+shader_parameter/use_color_glow = true
+shader_parameter/glow_color = Color(0, 0.509804, 1, 1)
+shader_parameter/glow_intensity = 3.0
+shader_parameter/glow_intensity_global = 1.0
+shader_parameter/use_glow_texture = false
+shader_parameter/use_color_hsv_shift = false
+shader_parameter/use_alpha_mask = false
+shader_parameter/use_alpha_remap = false
+shader_parameter/use_alpha_cutoff = false
+shader_parameter/use_vertex_offset = false
+shader_parameter/use_vertex_expand = false
+shader_parameter/use_particle_trails = false
+shader_parameter/use_particle_anim = false
+script = ExtResource("1_o2hx6")
+BlendMode = 0
+DepthDrawMode = 0
+CullMode = 0
+DiffuseMode = 0
+SpecularMode = 0
+ShadingMode = 0
+BillboardMode = 0
+BillboardKeepScale = false
+NoDepthTest = false
+
+[sub_resource type="Shader" id="Shader_35bul"]
+resource_name = "VFEZ3DPreview"
+code = "
+// This shader was dynamically generated by the VFEZ material.
+// **********************************
+// Every change to the VFEZ material Render Options or
+// Include Options generates a new shader. After every change
+// you can click on the new exported shader in the editor to view
+// the latest changes. Only the definitions (#define) actually change.
+// **********************************
+shader_type spatial;
+#define BLEND_MIX
+#define DEPTH_DRAW_OPAQUE
+#define CULL_BACK
+#define DIFFUSE_LAMBERT
+#define SPECULAR_SCHLICK_GGX
+#define UNSHADED
+#define BILLBOARD_PARTICLE
+#define BILLBOARD_KEEP_SCALE
+#define COLOR_GLOW
+#include \"res://addons/VFEZ-godot/Shaders/vfez_3d_template.gdshaderinc\"
+"
+
+[sub_resource type="Gradient" id="Gradient_fubi6"]
+offsets = PackedFloat32Array(0.586466, 1)
+colors = PackedColorArray(1, 1, 1, 1, 0, 0, 0, 1)
+
+[sub_resource type="GradientTexture2D" id="GradientTexture2D_bx8q0"]
+gradient = SubResource("Gradient_fubi6")
+fill = 1
+fill_from = Vector2(0.487179, 0.465812)
+fill_to = Vector2(0.149573, 0.132479)
+
+[sub_resource type="ShaderMaterial" id="ShaderMaterial_wlr8l"]
+render_priority = 0
+shader = SubResource("Shader_35bul")
+shader_parameter/global_color = Color(1, 1, 1, 1)
+shader_parameter/global_alpha = 1.0
+shader_parameter/additive_config = false
+shader_parameter/premultiply_color = true
+shader_parameter/premultiply_alpha = false
+shader_parameter/shape1_main_texture_scale = Vector2(1, 1)
+shader_parameter/shape1_main_texture_offset = Vector2(0, 0)
+shader_parameter/shape1_color = Color(0, 0.368627, 1, 1)
+shader_parameter/shape1_red_as_alpha = false
+shader_parameter/shape1_scroll_speed = Vector2(0, 0)
+shader_parameter/shape1_rotation_offset = 0.0
+shader_parameter/shape1_rotation_speed = 0.0
+shader_parameter/shape1_main_texture = SubResource("GradientTexture2D_bx8q0")
+shader_parameter/shape1_contrast = 1.0
+shader_parameter/shape1_brightness = 0.0
+shader_parameter/shape1_distortion_texture_scale = Vector2(1, 1)
+shader_parameter/shape1_distortion_texture_offset = Vector2(0, 0)
+shader_parameter/shape1_distortion_amount = 0.0
+shader_parameter/shape1_distortion_speed = Vector2(0.1, 0.1)
+shader_parameter/shape1_use_polar_uv = false
+shader_parameter/shape1_polar_uv_center = Vector2(0.5, 0.5)
+shader_parameter/shape1_distortion_polar_uvs = false
+shader_parameter/shape1_use_screenspace_uv = false
+shader_parameter/use_shape2 = false
+shader_parameter/use_shape3 = false
+shader_parameter/use_uv_pixelate = false
+shader_parameter/use_uv_twist = false
+shader_parameter/use_uv_handrawn = false
+shader_parameter/use_uv_shake = false
+shader_parameter/use_uv_wave = false
+shader_parameter/use_uv_round_wave = false
+shader_parameter/use_uv_global_distortion = false
+shader_parameter/use_alpha_disolve = false
+shader_parameter/use_color_face_tint = false
+shader_parameter/use_color_toning = false
+shader_parameter/use_color_ramp = false
+shader_parameter/use_color_posterize = false
+shader_parameter/use_color_rim = false
+shader_parameter/use_color_glow = true
+shader_parameter/glow_color = Color(0, 0.368627, 1, 1)
+shader_parameter/glow_intensity = 50.0
+shader_parameter/glow_intensity_global = 40.0
+shader_parameter/use_glow_texture = false
+shader_parameter/use_color_hsv_shift = false
+shader_parameter/use_alpha_mask = false
+shader_parameter/use_alpha_remap = false
+shader_parameter/use_alpha_cutoff = false
+shader_parameter/use_vertex_offset = false
+shader_parameter/use_vertex_expand = false
+shader_parameter/use_particle_trails = false
+shader_parameter/use_particle_anim = false
+script = ExtResource("1_o2hx6")
+BlendMode = 0
+DepthDrawMode = 0
+CullMode = 0
+DiffuseMode = 0
+SpecularMode = 0
+ShadingMode = 0
+BillboardMode = 3
+BillboardKeepScale = true
+NoDepthTest = false
+
+[sub_resource type="Curve" id="Curve_vq4uv"]
+_data = [Vector2(0, 1), 0.0, 0.0, 0, 0, Vector2(1, 0), 0.0, 0.0, 0, 0]
+point_count = 2
+
+[sub_resource type="CurveTexture" id="CurveTexture_u4lhj"]
+curve = SubResource("Curve_vq4uv")
+
+[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_3e8fx"]
+emission_shape = 6
+emission_ring_axis = Vector3(0, 1, 0)
+emission_ring_height = 0.0
+emission_ring_radius = 0.3
+emission_ring_inner_radius = 0.0
+direction = Vector3(0, 1, 0)
+spread = 0.0
+initial_velocity_min = 0.1
+initial_velocity_max = 0.4
+gravity = Vector3(0, 0, 0)
+damping_min = 0.2
+damping_max = 0.2
+alpha_curve = SubResource("CurveTexture_u4lhj")
+
+[sub_resource type="QuadMesh" id="QuadMesh_t6fyf"]
+size = Vector2(0.1, 0.1)
+
+[sub_resource type="Shader" id="Shader_y88k5"]
+resource_name = "VFEZ3DPreview"
+code = "
+// This shader was dynamically generated by the VFEZ material.
+// **********************************
+// Every change to the VFEZ material Render Options or
+// Include Options generates a new shader. After every change
+// you can click on the new exported shader in the editor to view
+// the latest changes. Only the definitions (#define) actually change.
+// **********************************
+shader_type spatial;
+#define BLEND_MIX
+#define DEPTH_DRAW_OPAQUE
+#define CULL_BACK
+#define DIFFUSE_LAMBERT
+#define SPECULAR_SCHLICK_GGX
+#define UNSHADED
+#define ALPHA_DISOLVE
+#define COLOR_RIM
+#include \"res://addons/VFEZ-godot/Shaders/vfez_3d_template.gdshaderinc\"
+"
+
+[sub_resource type="FastNoiseLite" id="FastNoiseLite_ro2bx"]
+
+[sub_resource type="NoiseTexture2D" id="NoiseTexture2D_wdl7p"]
+seamless = true
+noise = SubResource("FastNoiseLite_ro2bx")
+
+[sub_resource type="FastNoiseLite" id="FastNoiseLite_8dd0h"]
+
+[sub_resource type="NoiseTexture2D" id="NoiseTexture2D_280j0"]
+seamless = true
+noise = SubResource("FastNoiseLite_8dd0h")
+
+[sub_resource type="ShaderMaterial" id="ShaderMaterial_d2148"]
+render_priority = 0
+shader = SubResource("Shader_y88k5")
+shader_parameter/global_color = Color(1, 1, 1, 1)
+shader_parameter/global_alpha = 1.0
+shader_parameter/additive_config = false
+shader_parameter/premultiply_color = false
+shader_parameter/premultiply_alpha = false
+shader_parameter/shape1_main_texture_scale = Vector2(1, 1)
+shader_parameter/shape1_main_texture_offset = Vector2(0, 0)
+shader_parameter/shape1_color = Color(0.858824, 0.345098, 0, 1)
+shader_parameter/shape1_red_as_alpha = false
+shader_parameter/shape1_scroll_speed = Vector2(0, 0)
+shader_parameter/shape1_rotation_offset = 0.0
+shader_parameter/shape1_rotation_speed = 0.0
+shader_parameter/shape1_contrast = 1.0
+shader_parameter/shape1_brightness = 0.0
+shader_parameter/shape1_distortion_texture_scale = Vector2(1, 1)
+shader_parameter/shape1_distortion_texture_offset = Vector2(0, 0)
+shader_parameter/shape1_distortion_amount = 0.0
+shader_parameter/shape1_distortion_speed = Vector2(0.1, 0.1)
+shader_parameter/shape1_use_polar_uv = false
+shader_parameter/shape1_polar_uv_center = Vector2(0.5, 0.5)
+shader_parameter/shape1_distortion_polar_uvs = false
+shader_parameter/shape1_use_screenspace_uv = false
+shader_parameter/use_shape2 = false
+shader_parameter/use_shape3 = false
+shader_parameter/use_uv_pixelate = false
+shader_parameter/use_uv_twist = false
+shader_parameter/use_uv_handrawn = false
+shader_parameter/use_uv_shake = false
+shader_parameter/use_uv_wave = false
+shader_parameter/use_uv_round_wave = false
+shader_parameter/use_uv_global_distortion = false
+shader_parameter/use_alpha_disolve = true
+shader_parameter/alpha_disolve_texture_scale = Vector2(1, 1)
+shader_parameter/alpha_disolve_texture_offset = Vector2(0, 0)
+shader_parameter/alpha_disolve_amount = 0.054
+shader_parameter/alpha_disolve_transition = 0.075
+shader_parameter/alpha_disolve_power = 0.5
+shader_parameter/alpha_disolve_scroll_speed = Vector2(0.2, 0.2)
+shader_parameter/alpha_disolve_texture = SubResource("NoiseTexture2D_280j0")
+shader_parameter/use_alpha_disolve_burn = true
+shader_parameter/alpha_disolve_burn_color = Color(1, 1, 0, 1)
+shader_parameter/alpha_disolve_burn_width = 0.031
+shader_parameter/alpha_disolve_burn_glow = 17.373
+shader_parameter/alpha_disolve_burn_texture = SubResource("NoiseTexture2D_wdl7p")
+shader_parameter/use_color_face_tint = false
+shader_parameter/use_color_toning = false
+shader_parameter/use_color_ramp = false
+shader_parameter/use_color_posterize = false
+shader_parameter/use_color_rim = true
+shader_parameter/rim_color = Color(0.972667, 1, 0.59, 1)
+shader_parameter/rim_bias = 0.0
+shader_parameter/rim_scale = 1.0
+shader_parameter/rim_power = 1.187
+shader_parameter/rim_intensity = 1.0
+shader_parameter/rim_add_amount = 1.0
+shader_parameter/rim_erodes_alpha = 0.0
+shader_parameter/use_color_glow = false
+shader_parameter/use_color_hsv_shift = false
+shader_parameter/use_alpha_mask = false
+shader_parameter/use_alpha_remap = false
+shader_parameter/use_alpha_cutoff = false
+shader_parameter/use_vertex_offset = false
+shader_parameter/use_vertex_expand = false
+shader_parameter/use_particle_trails = false
+shader_parameter/use_particle_anim = false
+script = ExtResource("1_o2hx6")
+BlendMode = 0
+DepthDrawMode = 0
+CullMode = 0
+DiffuseMode = 0
+SpecularMode = 0
+ShadingMode = 0
+BillboardMode = 0
+BillboardKeepScale = false
+NoDepthTest = false
+
+[sub_resource type="SphereMesh" id="SphereMesh_x6q4p"]
+radius = 0.45
+height = 0.9
+
+[sub_resource type="Shader" id="Shader_puju3"]
+resource_name = "VFEZ3DPreview"
+code = "
+// This shader was dynamically generated by the VFEZ material.
+// **********************************
+// Every change to the VFEZ material Render Options or
+// Include Options generates a new shader. After every change
+// you can click on the new exported shader in the editor to view
+// the latest changes. Only the definitions (#define) actually change.
+// **********************************
+shader_type spatial;
+#define BLEND_MIX
+#define DEPTH_DRAW_OPAQUE
+#define CULL_BACK
+#define DIFFUSE_LAMBERT
+#define SPECULAR_SCHLICK_GGX
+#define UNSHADED
+#define COLOR_TONING
+#define COLOR_RIM
+#define VERTEX_OFFSET
+#include \"res://addons/VFEZ-godot/Shaders/vfez_3d_template.gdshaderinc\"
+"
+
+[sub_resource type="FastNoiseLite" id="FastNoiseLite_goiqf"]
+
+[sub_resource type="NoiseTexture2D" id="NoiseTexture2D_l4boc"]
+seamless = true
+noise = SubResource("FastNoiseLite_goiqf")
+
+[sub_resource type="FastNoiseLite" id="FastNoiseLite_fm7x5"]
+noise_type = 3
+
+[sub_resource type="NoiseTexture2D" id="NoiseTexture2D_gjelf"]
+seamless = true
+noise = SubResource("FastNoiseLite_fm7x5")
+
+[sub_resource type="FastNoiseLite" id="FastNoiseLite_7epju"]
+
+[sub_resource type="NoiseTexture2D" id="NoiseTexture2D_21bhv"]
+seamless = true
+noise = SubResource("FastNoiseLite_7epju")
+
+[sub_resource type="ShaderMaterial" id="ShaderMaterial_b7o1b"]
+render_priority = 10
+shader = SubResource("Shader_puju3")
+shader_parameter/global_color = Color(1, 1, 1, 1)
+shader_parameter/global_alpha = 1.0
+shader_parameter/additive_config = false
+shader_parameter/premultiply_color = false
+shader_parameter/premultiply_alpha = false
+shader_parameter/shape1_main_texture_scale = Vector2(1, 1)
+shader_parameter/shape1_main_texture_offset = Vector2(0, 0)
+shader_parameter/shape1_color = Color(1, 1, 1, 1)
+shader_parameter/shape1_red_as_alpha = true
+shader_parameter/shape1_scroll_speed = Vector2(0.1, 0.1)
+shader_parameter/shape1_rotation_offset = 0.0
+shader_parameter/shape1_rotation_speed = 0.0
+shader_parameter/shape1_main_texture = SubResource("NoiseTexture2D_gjelf")
+shader_parameter/shape1_contrast = 2.18
+shader_parameter/shape1_brightness = -0.05
+shader_parameter/shape1_distortion_texture_scale = Vector2(1, 1)
+shader_parameter/shape1_distortion_texture_offset = Vector2(0, 0)
+shader_parameter/shape1_distortion_amount = 2.0
+shader_parameter/shape1_distortion_speed = Vector2(0.2, 0.2)
+shader_parameter/shape1_distortion_texture = SubResource("NoiseTexture2D_l4boc")
+shader_parameter/shape1_use_polar_uv = false
+shader_parameter/shape1_polar_uv_center = Vector2(0.5, 0.5)
+shader_parameter/shape1_distortion_polar_uvs = false
+shader_parameter/shape1_use_screenspace_uv = false
+shader_parameter/use_shape2 = false
+shader_parameter/use_shape3 = false
+shader_parameter/use_uv_pixelate = false
+shader_parameter/use_uv_twist = false
+shader_parameter/use_uv_handrawn = false
+shader_parameter/use_uv_shake = false
+shader_parameter/use_uv_wave = false
+shader_parameter/use_uv_round_wave = false
+shader_parameter/use_uv_global_distortion = false
+shader_parameter/use_alpha_disolve = false
+shader_parameter/use_color_face_tint = false
+shader_parameter/use_color_toning = true
+shader_parameter/color_grading_light_tone = Color(0.9, 1, 0, 1)
+shader_parameter/color_grading_mid_tone = Color(1, 0.55, 0, 1)
+shader_parameter/color_grading_dark_tone = Color(0.513726, 0, 0, 1)
+shader_parameter/color_grading_mid_point = 0.5
+shader_parameter/use_color_ramp = false
+shader_parameter/use_color_posterize = false
+shader_parameter/use_color_rim = true
+shader_parameter/rim_color = Color(0.972667, 1, 0.59, 1)
+shader_parameter/rim_bias = 0.0
+shader_parameter/rim_scale = 1.0
+shader_parameter/rim_power = 1.902
+shader_parameter/rim_intensity = 1.2
+shader_parameter/rim_add_amount = 1.0
+shader_parameter/rim_erodes_alpha = 0.0
+shader_parameter/use_color_glow = false
+shader_parameter/use_color_hsv_shift = false
+shader_parameter/use_alpha_mask = false
+shader_parameter/use_alpha_remap = false
+shader_parameter/use_alpha_cutoff = false
+shader_parameter/use_vertex_offset = true
+shader_parameter/vertex_offset_amount = 0.1
+shader_parameter/vertex_offset_power = 1.0
+shader_parameter/vertex_offset_speed = Vector2(0.1, 0.1)
+shader_parameter/vertex_offset_texture = SubResource("NoiseTexture2D_21bhv")
+shader_parameter/use_vertex_expand = false
+shader_parameter/use_particle_trails = false
+shader_parameter/use_particle_anim = false
+script = ExtResource("1_o2hx6")
+BlendMode = 0
+DepthDrawMode = 0
+CullMode = 0
+DiffuseMode = 0
+SpecularMode = 0
+ShadingMode = 0
+BillboardMode = 0
+BillboardKeepScale = false
+NoDepthTest = false
+
+[sub_resource type="SphereMesh" id="SphereMesh_4wcxn"]
+
+[sub_resource type="Animation" id="Animation_bymho"]
+resource_name = "Idle"
+length = 4.0
+loop_mode = 1
+tracks/0/type = "value"
+tracks/0/imported = false
+tracks/0/enabled = true
+tracks/0/path = NodePath("SphereIn:material_override:shader_parameter/alpha_disolve_amount")
+tracks/0/interp = 2
+tracks/0/loop_wrap = true
+tracks/0/keys = {
+"times": PackedFloat32Array(0, 2, 3.9),
+"transitions": PackedFloat32Array(1, 1, 1),
+"update": 0,
+"values": [0.5, 0.8, 0.5]
+}
+
+[sub_resource type="Animation" id="Animation_c2ts8"]
+length = 0.001
+tracks/0/type = "value"
+tracks/0/imported = false
+tracks/0/enabled = true
+tracks/0/path = NodePath("SphereIn:material_override:shader_parameter/alpha_disolve_amount")
+tracks/0/interp = 1
+tracks/0/loop_wrap = true
+tracks/0/keys = {
+"times": PackedFloat32Array(0),
+"transitions": PackedFloat32Array(1),
+"update": 0,
+"values": [0.054]
+}
+
+[sub_resource type="AnimationLibrary" id="AnimationLibrary_heu7k"]
+_data = {
+"Idle": SubResource("Animation_bymho"),
+"RESET": SubResource("Animation_c2ts8")
+}
+
+[sub_resource type="Shader" id="Shader_mcoye"]
+resource_name = "VFEZ3DPreview"
+code = "
+// This shader was dynamically generated by the VFEZ material.
+// **********************************
+// Every change to the VFEZ material Render Options or
+// Include Options generates a new shader. After every change
+// you can click on the new exported shader in the editor to view
+// the latest changes. Only the definitions (#define) actually change.
+// **********************************
+shader_type spatial;
+#define BLEND_MIX
+#define DEPTH_DRAW_OPAQUE
+#define CULL_DISABLED
+#define DIFFUSE_LAMBERT
+#define SPECULAR_SCHLICK_GGX
+#define UNSHADED
+#define UV_PIXELATE
+#define UV_TWIST
+#define COLOR_RAMP
+#define ALPHA_MASK
+#define VERTEX_EXPAND
+#include \"res://addons/VFEZ-godot/Shaders/vfez_3d_template.gdshaderinc\"
+"
+
+[sub_resource type="Gradient" id="Gradient_63ihy"]
+offsets = PackedFloat32Array(0.428058, 1)
+colors = PackedColorArray(1, 1, 1, 1, 0, 0, 0, 1)
+
+[sub_resource type="GradientTexture2D" id="GradientTexture2D_r8kvc"]
+gradient = SubResource("Gradient_63ihy")
+fill = 1
+fill_from = Vector2(0.5, 0.5)
+fill_to = Vector2(0.209402, 0.282051)
+
+[sub_resource type="Gradient" id="Gradient_ofkbo"]
+colors = PackedColorArray(1, 0, 0, 1, 1, 0.945098, 0, 1)
+
+[sub_resource type="GradientTexture1D" id="GradientTexture1D_uakp7"]
+gradient = SubResource("Gradient_ofkbo")
+
+[sub_resource type="FastNoiseLite" id="FastNoiseLite_0oxa2"]
+
+[sub_resource type="NoiseTexture2D" id="NoiseTexture2D_gpq7r"]
+seamless = true
+noise = SubResource("FastNoiseLite_0oxa2")
+
+[sub_resource type="ShaderMaterial" id="ShaderMaterial_1m7hj"]
+render_priority = 0
+shader = SubResource("Shader_mcoye")
+shader_parameter/global_color = Color(1, 1, 1, 1)
+shader_parameter/global_alpha = 1.0
+shader_parameter/additive_config = false
+shader_parameter/premultiply_color = true
+shader_parameter/premultiply_alpha = false
+shader_parameter/shape1_main_texture_scale = Vector2(1, 1)
+shader_parameter/shape1_main_texture_offset = Vector2(0, 0)
+shader_parameter/shape1_color = Color(1, 1, 1, 1)
+shader_parameter/shape1_red_as_alpha = false
+shader_parameter/shape1_scroll_speed = Vector2(0.48, 0)
+shader_parameter/shape1_rotation_offset = 0.0
+shader_parameter/shape1_rotation_speed = 0.0
+shader_parameter/shape1_main_texture = SubResource("NoiseTexture2D_gpq7r")
+shader_parameter/shape1_contrast = 1.902
+shader_parameter/shape1_brightness = 0.0
+shader_parameter/shape1_distortion_texture_scale = Vector2(1, 1)
+shader_parameter/shape1_distortion_texture_offset = Vector2(0, 0)
+shader_parameter/shape1_distortion_amount = 0.0
+shader_parameter/shape1_distortion_speed = Vector2(0, 0)
+shader_parameter/shape1_use_polar_uv = false
+shader_parameter/shape1_polar_uv_center = Vector2(0.5, 0.5)
+shader_parameter/shape1_distortion_polar_uvs = false
+shader_parameter/shape1_use_screenspace_uv = false
+shader_parameter/use_shape2 = false
+shader_parameter/use_shape3 = false
+shader_parameter/use_uv_pixelate = true
+shader_parameter/uv_pixelate_size = 128
+shader_parameter/use_uv_twist = true
+shader_parameter/uv_twist_amount = 1.0
+shader_parameter/uv_twist_pos_x = 0.5
+shader_parameter/uv_twist_pos_y = 0.5
+shader_parameter/uv_twist_radius = 0.318
+shader_parameter/use_uv_handrawn = false
+shader_parameter/use_uv_shake = false
+shader_parameter/use_uv_wave = false
+shader_parameter/use_uv_round_wave = false
+shader_parameter/use_uv_global_distortion = false
+shader_parameter/use_alpha_disolve = false
+shader_parameter/use_color_face_tint = false
+shader_parameter/use_color_toning = false
+shader_parameter/use_color_ramp = true
+shader_parameter/color_ramp_albedo = Color(1, 1, 1, 1)
+shader_parameter/color_ramp_luminosity = 0.0
+shader_parameter/color_ramp_blend = 1.0
+shader_parameter/color_ramp_texture = SubResource("GradientTexture1D_uakp7")
+shader_parameter/use_color_posterize = false
+shader_parameter/use_color_rim = false
+shader_parameter/use_color_glow = false
+shader_parameter/use_color_hsv_shift = false
+shader_parameter/use_alpha_mask = true
+shader_parameter/alpha_mask_scale = Vector2(1, 1)
+shader_parameter/alpha_mask_offset = Vector2(0, 0)
+shader_parameter/alpha_mask_power = 1.0
+shader_parameter/alpha_mask_texture = SubResource("GradientTexture2D_r8kvc")
+shader_parameter/use_alpha_remap = false
+shader_parameter/use_alpha_cutoff = false
+shader_parameter/use_vertex_offset = false
+shader_parameter/use_vertex_expand = true
+shader_parameter/vertex_expand_center = Vector3(0, 0, -0.48)
+shader_parameter/vertex_expand_ignore_center_vertical = false
+shader_parameter/vertex_expand_amount = 1.651
+shader_parameter/use_particle_trails = false
+shader_parameter/use_particle_anim = false
+script = ExtResource("1_o2hx6")
+BlendMode = 0
+DepthDrawMode = 0
+CullMode = 2
+DiffuseMode = 0
+SpecularMode = 0
+ShadingMode = 0
+BillboardMode = 0
+BillboardKeepScale = false
+NoDepthTest = false
+
+[sub_resource type="QuadMesh" id="QuadMesh_6w7pd"]
+subdivide_width = 10
+subdivide_depth = 10
+
+[sub_resource type="Environment" id="Environment_jicdf"]
+background_mode = 1
+background_color = Color(0.0862745, 0.301961, 0.85098, 1)
+glow_enabled = true
+glow_blend_mode = 1
+
+[node name="VfezExamples" type="Node3D"]
+
+[node name="BuffAura" type="Node3D" parent="."]
+transform = Transform3D(2.515, 0, 0, 0, 2.515, 0, 0, 0, 2.515, 0, 0, 0)
+
+[node name="Base" type="MeshInstance3D" parent="BuffAura"]
+transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 0, 0)
+material_override = SubResource("ShaderMaterial_ncvk1")
+mesh = SubResource("QuadMesh_eyir6")
+skeleton = NodePath("../..")
+
+[node name="Rings" type="MeshInstance3D" parent="BuffAura"]
+transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 0, 0)
+material_override = SubResource("ShaderMaterial_0wske")
+mesh = SubResource("QuadMesh_eyir6")
+skeleton = NodePath("../..")
+
+[node name="GPUParticles3D" type="GPUParticles3D" parent="BuffAura"]
+transform = Transform3D(0.999929, 0, 0.0119552, 0, 1, 0, -0.0119552, 0, 0.999929, 0.00681505, 0, 0.0035185)
+material_override = SubResource("ShaderMaterial_wlr8l")
+amount = 60
+lifetime = 2.0
+randomness = 1.0
+process_material = SubResource("ParticleProcessMaterial_3e8fx")
+draw_pass_1 = SubResource("QuadMesh_t6fyf")
+
+[node name="BurningSphere" type="Node3D" parent="."]
+transform = Transform3D(1.34, 0, 0, 0, 1.34, 0, 0, 0, 1.34, 0, 0, 2.90786)
+
+[node name="SphereIn" type="MeshInstance3D" parent="BurningSphere"]
+material_override = SubResource("ShaderMaterial_d2148")
+mesh = SubResource("SphereMesh_x6q4p")
+
+[node name="SphereOut" type="MeshInstance3D" parent="BurningSphere"]
+material_override = SubResource("ShaderMaterial_b7o1b")
+mesh = SubResource("SphereMesh_4wcxn")
+skeleton = NodePath("../..")
+
+[node name="AnimationPlayer" type="AnimationPlayer" parent="BurningSphere"]
+libraries = {
+"": SubResource("AnimationLibrary_heu7k")
+}
+autoplay = "Idle"
+
+[node name="PixelTwist" type="Node3D" parent="."]
+
+[node name="Twist" type="MeshInstance3D" parent="PixelTwist"]
+transform = Transform3D(0.0119552, 0, -0.999929, 0, 1, 0, 0.999929, 0, 0.0119552, 1.48031, 0, -2.86724)
+material_override = SubResource("ShaderMaterial_1m7hj")
+mesh = SubResource("QuadMesh_6w7pd")
+
+[node name="WorldEnvironment" type="WorldEnvironment" parent="."]
+environment = SubResource("Environment_jicdf")
+
+[node name="Camera3D" type="Camera3D" parent="."]
+transform = Transform3D(-4.37114e-08, 0.559193, -0.829038, 0, 0.829038, 0.559193, 1, 2.44431e-08, -3.62384e-08, -5.571, 3.38, 0)
+fov = 45.1
diff --git a/VFEZ/vfez_material_2d.gd b/VFEZ/vfez_material_2d.gd
new file mode 100644
index 00000000..28826bf9
--- /dev/null
+++ b/VFEZ/vfez_material_2d.gd
@@ -0,0 +1,123 @@
+@tool
+extends ShaderMaterial
+class_name VFEZMaterial2D
+
+enum BlendModeEnum
+{
+ Mix = 0,
+ Add = 1,
+ Subtract = 2,
+ Multiply = 3,
+ Premultiplied_Alpha= 4
+}
+
+enum LightModeEnum
+{
+ Normal = 0,
+ Unshaded = 1,
+ LightOnly = 2
+}
+
+@export_group("Render Options")
+@export var BlendMode: BlendModeEnum:
+ get:
+ return _blendMode
+ set(value):
+ _blendMode = value
+ _update_shader_code()
+
+@export var LightMode: LightModeEnum:
+ get:
+ return _lightMode
+ set(value):
+ _lightMode = value
+ _update_shader_code()
+
+var _blendMode: BlendModeEnum = BlendModeEnum.Mix
+var _lightMode: LightModeEnum = LightModeEnum.Normal
+
+# handle property gets.
+# if is shader property set it in shader
+# and if it starts with use_ update shader code to include new definitions
+# if is render property set new value and update shader code
+func _set(property, value):
+ if property.begins_with("shader_parameter/"):
+ set_shader_parameter(property.replace("shader_parameter/", ""), value)
+ if property.begins_with("shader_parameter/use_"):
+ _update_shader_code()
+
+func generate_render_options_definition_string() -> String:
+ var definition_string: String = ""
+
+ match _blendMode:
+ BlendModeEnum.Mix:
+ definition_string += "#define BLEND_MIX\n"
+ BlendModeEnum.Add:
+ definition_string += "#define BLEND_ADD\n"
+ BlendModeEnum.Subtract:
+ definition_string += "#define BLEND_SUB\n"
+ BlendModeEnum.Multiply:
+ definition_string += "#define BLEND_MUL\n"
+ BlendModeEnum.Premultiplied_Alpha:
+ definition_string += "#define BLEND_PREMUL_ALPHA\n"
+
+ match _lightMode:
+ LightModeEnum.Unshaded:
+ definition_string += "#define UNSHADED\n"
+ LightModeEnum.LightOnly:
+ definition_string += "#define LIGHT_ONLY\n"
+
+ return definition_string
+
+# update shader code to include new option definitions
+func _update_shader_code():
+ if not Engine.is_editor_hint():
+ return
+
+ var template_header = """
+// This shader was dynamically generated by the VFEZ material.
+// **********************************
+// Every change to the VFEZ material Render Options or
+// Include Options generates a new shader. After every change
+// you can click on the new exported shader in the editor to view
+// the latest changes. Only the definitions (#define) actually change.
+// **********************************
+"""
+ # find current directory name and create absolute include path for template shader
+ var base_dir_name = get_script().get_path().get_base_dir()
+ var shader_include_str: String = "#include \"" + base_dir_name + "/Shaders/vfez_2d_template.gdshaderinc\"\n"
+ var template_code: String = "shader_type canvas_item;\n"
+
+ # we duplicate the shader, else the code bugs
+ # if the generated shader is open in the editor
+ shader = shader.duplicate()
+ # initialize the shader code with the included shader template.
+ # This is necessary to be able to read the shader uniforms later.
+ shader.code = template_code + shader_include_str
+
+ template_code += generate_render_options_definition_string()
+
+ # set all shader definition options based on the relevant use_X uniform values
+ for uniform in shader.get_shader_uniform_list():
+ var uniform_name: String = uniform["name"]
+
+ # if start with use_ there is a relevant define options
+ if uniform_name.begins_with("use_"):
+ var shader_parameter = get_shader_parameter(uniform_name)
+ # if use_ shader parameter is true (1) then set the define option
+ # to enable the effect
+ if shader_parameter != null && int(shader_parameter) == 1:
+ # extract define option from shader_parameter name
+ # for example use_uv_wave becomes -> UV_WAVE
+ var define_option = uniform_name.replace("use_", "").to_upper()
+ template_code += "#define %s\n" % define_option
+
+ # update final code to include description template, the define options
+ # and the shader include string at the end
+ shader.code = template_header + template_code + shader_include_str
+
+func _init() -> void:
+ if Engine.is_editor_hint():
+ shader = Shader.new()
+ shader.resource_name = "VFEZ2DPreview"
+ _update_shader_code()
diff --git a/VFEZ/vfez_material_3d.gd b/VFEZ/vfez_material_3d.gd
new file mode 100644
index 00000000..b15a12f9
--- /dev/null
+++ b/VFEZ/vfez_material_3d.gd
@@ -0,0 +1,262 @@
+@tool
+extends ShaderMaterial
+class_name VFEZMaterial3D
+
+enum BlendModeEnum
+{
+ Mix = 0,
+ Add = 1,
+ Subtract = 2,
+ Multiply = 3,
+ Premultiplied_Alpha= 4
+}
+
+enum DepthDrawModeEnum
+{
+ Opaque = 0,
+ Always = 1,
+ Never = 2
+}
+
+enum CullModeEnum
+{
+ Back = 0,
+ Front = 1,
+ Disabled = 2
+}
+
+enum DiffuseModeEnum
+{
+ Lambert = 0,
+ Lambert_Wrap = 1,
+ Burley = 2,
+ Toon = 3,
+}
+
+enum SpecularModeEnum
+{
+ Schlick_Ggx = 0,
+ Toon = 1,
+ Disabled = 2
+}
+
+enum ShadingModeEnum
+{
+ Unshaded = 0,
+ Shaded = 1
+}
+
+enum BillboardModeEnum
+{
+ Disabled = 0,
+ Enabled = 1,
+ Y = 2,
+ Particle = 3,
+}
+
+
+@export_group("Render Options")
+@export var BlendMode: BlendModeEnum:
+ get:
+ return _blendMode
+ set(value):
+ _blendMode = value
+ _update_shader_code()
+
+@export var DepthDrawMode: DepthDrawModeEnum:
+ get:
+ return _depthDrawMode
+ set(value):
+ _depthDrawMode = value
+ _update_shader_code()
+
+@export var CullMode: CullModeEnum:
+ get:
+ return _cullMode
+ set(value):
+ _cullMode = value
+ _update_shader_code()
+
+@export var DiffuseMode: DiffuseModeEnum:
+ get:
+ return _diffuseMode
+ set(value):
+ _diffuseMode = value
+ _update_shader_code()
+
+@export var SpecularMode: SpecularModeEnum:
+ get:
+ return _specularMode
+ set(value):
+ _specularMode = value
+ _update_shader_code()
+
+@export var ShadingMode: ShadingModeEnum:
+ get:
+ return _shadingMode
+ set(value):
+ _shadingMode = value
+ _update_shader_code()
+
+@export var BillboardMode: BillboardModeEnum:
+ get:
+ return _billboardMode
+ set(value):
+ _billboardMode = value
+ _update_shader_code()
+
+@export var BillboardKeepScale: bool:
+ get:
+ return _billboardKeepScale
+ set(value):
+ _billboardKeepScale = value
+ _update_shader_code()
+
+@export var NoDepthTest: bool:
+ get:
+ return _noDepthTest
+ set(value):
+ _noDepthTest = value
+ _update_shader_code()
+
+var _blendMode: BlendModeEnum = BlendModeEnum.Mix
+var _depthDrawMode: DepthDrawModeEnum = DepthDrawModeEnum.Opaque
+var _cullMode: CullModeEnum = CullModeEnum.Back
+var _diffuseMode: DiffuseModeEnum = DiffuseModeEnum.Lambert
+var _specularMode: SpecularModeEnum = SpecularModeEnum.Schlick_Ggx
+var _shadingMode: ShadingModeEnum = ShadingModeEnum.Unshaded
+var _billboardMode: BillboardModeEnum = BillboardModeEnum.Disabled
+var _billboardKeepScale: bool
+var _noDepthTest: bool
+
+# handle property gets.
+# if is shader property set it in shader
+# and if it starts with use_ update shader code to include new definitions
+# if is render property set new value and update shader code
+func _set(property, value):
+ if property.begins_with("shader_parameter/"):
+ set_shader_parameter(property.replace("shader_parameter/", ""), value)
+ if property.begins_with("shader_parameter/use_"):
+ _update_shader_code()
+
+func generate_render_options_definition_string() -> String:
+ var definition_string: String = ""
+
+ match _blendMode:
+ BlendModeEnum.Mix:
+ definition_string += "#define BLEND_MIX\n"
+ BlendModeEnum.Add:
+ definition_string += "#define BLEND_ADD\n"
+ BlendModeEnum.Subtract:
+ definition_string += "#define BLEND_SUB\n"
+ BlendModeEnum.Multiply:
+ definition_string += "#define BLEND_MUL\n"
+ BlendModeEnum.Premultiplied_Alpha:
+ definition_string += "#define BLEND_PREMUL_ALPHA\n"
+
+ match _depthDrawMode:
+ DepthDrawModeEnum.Opaque:
+ definition_string += "#define DEPTH_DRAW_OPAQUE\n"
+ DepthDrawModeEnum.Always:
+ definition_string += "#define DEPTH_DRAW_ALWAYS\n"
+ DepthDrawModeEnum.Never:
+ definition_string += "#define DEPTH_DRAW_NEVER\n"
+
+ match _cullMode:
+ CullModeEnum.Back:
+ definition_string += "#define CULL_BACK\n"
+ CullModeEnum.Front:
+ definition_string += "#define CULL_FRONT\n"
+ CullModeEnum.Disabled:
+ definition_string += "#define CULL_DISABLED\n"
+
+ match _diffuseMode:
+ DiffuseModeEnum.Lambert:
+ definition_string += "#define DIFFUSE_LAMBERT\n"
+ DiffuseModeEnum.Lambert_Wrap:
+ definition_string += "#define DIFFUSE_LABERT_WRAP\n"
+ DiffuseModeEnum.Burley:
+ definition_string += "#define DIFFUSE_BURLEY\n"
+ DiffuseModeEnum.Toon:
+ definition_string += "#define DIFFUSE_TOON\n"
+
+ match _specularMode:
+ SpecularModeEnum.Schlick_Ggx:
+ definition_string += "#define SPECULAR_SCHLICK_GGX\n"
+ SpecularModeEnum.Toon:
+ definition_string += "#define SPECULAR_TOON\n"
+ SpecularModeEnum.Disabled:
+ definition_string += "#define SPECULAR_DISABLED\n"
+
+ match _shadingMode:
+ ShadingModeEnum.Unshaded:
+ definition_string += "#define UNSHADED\n"
+
+ match _billboardMode:
+ BillboardModeEnum.Enabled:
+ definition_string += "#define BILLBOARD_ENABLED\n"
+ BillboardModeEnum.Y:
+ definition_string += "#define BILLBOARD_Y\n"
+ BillboardModeEnum.Particle:
+ definition_string += "#define BILLBOARD_PARTICLE\n"
+
+ if _noDepthTest:
+ definition_string += "#define NO_DEPTH_TEST\n"
+
+ if _billboardKeepScale:
+ definition_string += "#define BILLBOARD_KEEP_SCALE\n"
+
+ return definition_string
+
+# update shader code to include new option definitions
+func _update_shader_code():
+ if not Engine.is_editor_hint():
+ return
+
+ var template_header = """
+// This shader was dynamically generated by the VFEZ material.
+// **********************************
+// Every change to the VFEZ material Render Options or
+// Include Options generates a new shader. After every change
+// you can click on the new exported shader in the editor to view
+// the latest changes. Only the definitions (#define) actually change.
+// **********************************
+"""
+ # find current directory name and create absolute include path for template shader
+ var base_dir_name = get_script().get_path().get_base_dir()
+ var shader_include_str: String = "#include \"" + base_dir_name + "/Shaders/vfez_3d_template.gdshaderinc\"\n"
+ var template_code: String = "shader_type spatial;\n"
+
+ # we duplicate the shader, else the code bugs
+ # if the generated shader is open in the editor
+ shader = shader.duplicate()
+ # initialize the shader code with the included shader template.
+ # This is necessary to be able to read the shader uniforms later.
+ shader.code = template_code + shader_include_str
+
+ template_code += generate_render_options_definition_string()
+
+ # set all shader definition options based on the relevant use_X uniform values
+ for uniform in shader.get_shader_uniform_list():
+ var uniform_name: String = uniform["name"]
+
+ # if start with use_ there is a relevant define options
+ if uniform_name.begins_with("use_"):
+ var shader_parameter = get_shader_parameter(uniform_name)
+ # if use_ shader parameter is true (1) then set the define option
+ # to enable the effect
+ if shader_parameter != null && int(shader_parameter) == 1:
+ # extract define option from shader_parameter name
+ # for example use_uv_wave becomes -> UV_WAVE
+ var define_option = uniform_name.replace("use_", "").to_upper()
+ template_code += "#define %s\n" % define_option
+
+ # update final code to include description template, the define options
+ # and the shader include string at the end
+ shader.code = template_header + template_code + shader_include_str
+
+func _init() -> void:
+ if Engine.is_editor_hint():
+ shader = Shader.new()
+ shader.resource_name = "VFEZ3DPreview"
+ _update_shader_code()