mirror of
https://gitlab.com/MaddoScientisto/cirnogodot.git
synced 2026-06-01 11:05:34 +00:00
913 lines
No EOL
22 KiB
Text
913 lines
No EOL
22 KiB
Text
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
// 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;
|
|
} |