shader_type spatial; render_mode blend_mix, world_vertex_coords, depth_draw_opaque, cull_front, diffuse_burley, specular_schlick_ggx, unshaded; #include "res://addons/rokojori_action_library/Runtime/Shading/Library/Math.gdshaderinc" #include "res://addons/rokojori_action_library/Runtime/Shading/Library/Transform.gdshaderinc" #include "res://addons/rokojori_action_library/Runtime/Shading/Library/Noise.gdshaderinc" uniform vec4 albedo : source_color; uniform float size:hint_range(0,10) = 2; uniform float sizeCloseScale : hint_range(0,10) = 1; uniform float sizeFarScale : hint_range(0,10) = 0.5; uniform float closeDistance = 20; uniform float farDistance = 40; uniform float opacityModulationStrength : hint_range(0,1) = 0.2; uniform float opacityModulationDuration : hint_range(0,10) = 1; uniform float scanLineAmount : hint_range(0,1) = 1; uniform float scanLineDivisions = 50; uniform float scanLineSpeed = 2; varying vec4 appliedColor; void vertex() { float cameraDistance = distance( VERTEX, CAMERA_POSITION_WORLD ); float outlineSize = size * mapClamped( cameraDistance, closeDistance, farDistance, sizeCloseScale, sizeFarScale ); VERTEX += NORMAL * outlineSize/500.0 * cameraDistance; float sinTime = sin( mod( TIME, opacityModulationDuration ) / opacityModulationDuration * PI * 2.0 ) / 2.0; float alpha = 1.0 - opacityModulationStrength * 0.5 + sinTime * opacityModulationStrength; appliedColor = albedo; appliedColor.a *= alpha; } void fragment() { vec2 sceenUV = SCREEN_UV; float scanline = mix( 1, mod( sceenUV.y * scanLineDivisions - TIME * scanLineSpeed, 1.0 ), scanLineAmount ); ALBEDO = appliedColor.rgb; ALPHA = appliedColor.a * scanline; }