Shield wave
This commit is contained in:
parent
a1e0c3f8a7
commit
0eecd651e4
14 changed files with 341 additions and 13 deletions
13
shaders/materials/shield_material.tres
Normal file
13
shaders/materials/shield_material.tres
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
[gd_resource type="ShaderMaterial" load_steps=2 format=3 uid="uid://cw0827vwv7pc1"]
|
||||
|
||||
[ext_resource type="Shader" path="res://shaders/shield.gdshader" id="1_qsjai"]
|
||||
|
||||
[resource]
|
||||
resource_local_to_scene = true
|
||||
resource_name = "Shield Material"
|
||||
shader = ExtResource("1_qsjai")
|
||||
shader_parameter/wave_centers = PackedVector2Array()
|
||||
shader_parameter/wave_distances = PackedFloat32Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
|
||||
shader_parameter/color = Color(1, 0, 0, 1)
|
||||
shader_parameter/max_distance = 20.0
|
||||
shader_parameter/bublic_size = 20.0
|
||||
50
shaders/shield.gdshader
Normal file
50
shaders/shield.gdshader
Normal file
|
|
@ -0,0 +1,50 @@
|
|||
shader_type canvas_item;
|
||||
|
||||
uniform vec2[10] wave_centers;
|
||||
uniform float[10] wave_distances;
|
||||
|
||||
uniform vec3 color : source_color;
|
||||
uniform float max_distance;
|
||||
uniform float bublic_size = 2.0;
|
||||
|
||||
varying vec2[10] local_position;
|
||||
|
||||
float smooth_bublic(vec2 center,vec2 pixel_pos,float distance_from_center,float size)
|
||||
{
|
||||
return 1.0-distance(distance_from_center,distance(center,pixel_pos))/size;
|
||||
}
|
||||
|
||||
float solid_bublic(vec2 center,vec2 pixel_pos,float distance_from_center,float size,float border)
|
||||
{
|
||||
|
||||
return step(border,smooth_bublic(center,pixel_pos,distance_from_center,size));;
|
||||
}
|
||||
|
||||
void vertex()
|
||||
{
|
||||
for (int i = 0; i < wave_centers.length(); i++)
|
||||
{
|
||||
local_position[i] = (inverse(MODEL_MATRIX) * vec4(wave_centers[i],0.0,1.0)).xy;
|
||||
}
|
||||
}
|
||||
|
||||
void fragment() {
|
||||
for (int i = 0; i < wave_centers.length(); i++)
|
||||
{
|
||||
float wave_distance = wave_distances[i];
|
||||
float normalized_distance = wave_distance/max_distance;
|
||||
|
||||
if (normalized_distance >= 1.0 || normalized_distance < 0.0)
|
||||
{
|
||||
break;
|
||||
}
|
||||
float bublic = solid_bublic(local_position[i],(UV-0.5)/TEXTURE_PIXEL_SIZE,wave_distance,bublic_size,0.75);
|
||||
|
||||
if (bublic == 0.0){
|
||||
break;
|
||||
}
|
||||
|
||||
COLOR.rgb = mix(COLOR.rgb,vec3(bublic*color),1.0-normalized_distance);
|
||||
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue