11shader_type canvas_item ;
22
3+ // Crack generation
4+ uniform float crack_depth : hint_range (0.0 , 10.0 ) = 2.236 ;
5+ uniform float crack_scale : hint_range (1.0 , 10.0 ) = 4.0 ;
6+ uniform float crack_zebra_scale : hint_range (0.0 , 10.0 ) = 2.67 ;
7+ uniform float crack_zebra_amp : hint_range (0.0 , 10.0 ) = 1.3 ;
8+ uniform float crack_profile : hint_range (0.0 , 10.0 ) = 1.0 ;
9+ uniform float crack_slope : hint_range (0.0 , 50.0 ) = 45.8 ;
10+ uniform float crack_width : hint_range (0.0 , 1.0 ) = 0.001 ;
311uniform float hp_ratio = 1.0 ;
412uniform bool is_hit_flash_active = false ;
513
6- void vertex () {
7- // Called for every vertex the material is visible on.
14+ const vec4 background_color = vec4 (0.0 , 0.0 , 0.0 , 0.0 );
15+ const vec4 crack_color = vec4 (0.0 , 0.0 , 0.0 , 1.0 );
16+
17+ // Glass effect
18+ uniform vec2 refraction_offset = vec2 (25.0 ,25.0 );
19+ uniform vec2 reflection_offset = vec2 (1.0 ,1.0 );
20+ uniform vec4 reflection_color : source_color = vec4 (0.588 ,0.588 ,0.588 ,0.5 );
21+
22+ uniform sampler2D SCREEN_TEXTURE : hint_screen_texture , filter_linear_mipmap ;
23+
24+
25+
26+ vec2 hash (vec2 p ) {
27+ p = vec2 (dot (p , vec2 (127.1 , 311.7 )), dot (p , vec2 (269.5 , 183.3 )));
28+ return fract (sin (p ) * 43758.5453123 );
29+ }
30+
31+ float noise (vec2 p ) {
32+ vec2 i = floor (p );
33+ vec2 f = fract (p );
34+ f = f * f * (3.0 - 2.0 * f );
35+ return mix (mix (dot (hash (i + vec2 (0.0 , 0.0 )), f - vec2 (0.0 , 0.0 )),
36+ dot (hash (i + vec2 (1.0 , 0.0 )), f - vec2 (1.0 , 0.0 )), f .x ),
37+ mix (dot (hash (i + vec2 (0.0 , 1.0 )), f - vec2 (0.0 , 1.0 )),
38+ dot (hash (i + vec2 (1.0 , 1.0 )), f - vec2 (1.0 , 1.0 )), f .x ), f .y );
39+ }
40+
41+ vec3 voronoi (vec2 u ) {
42+ vec2 p = floor (u );
43+ vec2 f = fract (u );
44+ float res = 8.0 ;
45+ vec2 b = vec2 (0.0 );
46+ for (int j = - 1 ; j <= 1 ; j ++ ) {
47+ for (int i = - 1 ; i <= 1 ; i ++ ) {
48+ vec2 g = vec2 (float (i ), float (j ));
49+ vec2 o = hash (p + g );
50+ vec2 r = g - f + o ;
51+ float d = dot (r , r );
52+ if (d < res ) {
53+ res = d ;
54+ b = r ;
55+ }
56+ }
57+ }
58+ return vec3 (sqrt (res ), b );
59+ }
60+
61+ vec3 voronoiB (vec2 u ) {
62+ vec2 p = floor (u );
63+ vec2 f = fract (u );
64+ float res = 8.0 ;
65+ vec2 C = vec2 (0.0 );
66+ vec2 P = vec2 (0.0 );
67+ for (int j = - 1 ; j <= 1 ; j ++ ) {
68+ for (int i = - 1 ; i <= 1 ; i ++ ) {
69+ vec2 g = vec2 (float (i ), float (j ));
70+ vec2 o = hash (p + g );
71+ vec2 r = g - f + o ;
72+ float d = dot (r , r );
73+ if (d < res ) {
74+ res = d ;
75+ C = g ;
76+ P = r ;
77+ }
78+ }
79+ }
80+ res = 8.0 ;
81+ for (int j = - 2 ; j <= 2 ; j ++ ) {
82+ for (int i = - 2 ; i <= 2 ; i ++ ) {
83+ vec2 g = C + vec2 (float (i ), float (j ));
84+ vec2 o = hash (p + g );
85+ vec2 r = g - f + o ;
86+ if (dot (P - r , P - r ) > 1e-5 ) {
87+ res = min (res , 0.5 * dot ((P + r ), normalize (r - P )));
88+ }
89+ }
90+ }
91+ return vec3 (res , P + f );
92+ }
93+
94+ float fbm (vec2 n ) {
95+ float total = 0.0 , amp = 1.0 ;
96+ for (int i = 0 ; i < 7 ; i ++ ) {
97+ total += noise (n ) * amp ;
98+ n += n ;
99+ amp *= 0.5 ;
100+ }
101+ return total ;
102+ }
103+
104+ vec4 generate_cracks (vec2 uv ) {
105+ vec2 U = uv * crack_scale ;
106+ vec2 I = floor (U / 2.0 );
107+ bool vert = mod (I .x + I .y , 2.0 ) == 0.0 ;
108+ vec3 H0 ;
109+ vec4 color = background_color ;
110+ for (float i = 0.0 ; i < crack_depth ; i ++ ) {
111+ vec2 V = U ;
112+ vec2 D = vec2 (crack_zebra_amp * fbm (U / crack_zebra_scale ) * crack_zebra_scale );
113+ vec3 H = voronoiB (V + D );
114+ float d = H .x ;
115+ d = min (1.0 , crack_slope * pow (max (0.0 , d - crack_width ), crack_profile ));
116+ color += vec4 (1.0 - d ) / exp2 (i );
117+ U *= 1.5 ;
118+ }
119+ color *= crack_color ;
120+
121+ return color ;
8122}
9123
124+
10125void fragment () {
11- // Called for every pixel the material is visible on.
12126 vec4 tex_color = texture (TEXTURE , UV );
13127
14128 if (is_hit_flash_active ) {
15129 tex_color = vec4 (1 ,1 ,1 , tex_color .a );
16- } else {
130+ COLOR = tex_color ;
131+ } else if (hp_ratio < 1.0 ) {
17132 float dist = distance (UV , vec2 (0.5 ));
18133
19134 if (tex_color .a > 0.0 ) {
@@ -22,12 +137,23 @@ void fragment() {
22137 } else {
23138 tex_color .a = 0.3 ;
24139 }
140+ COLOR = tex_color ;
141+ }
142+ }
143+ else {
144+ vec4 cracks = generate_cracks (UV );
145+ vec4 orig_color = COLOR ;
146+ vec4 adjacent_color = generate_cracks (UV + TEXTURE_PIXEL_SIZE * reflection_offset );
147+ //if (adjacent_color.a >= 1.0) {
148+ //COLOR = tex_color + reflection_color;
149+ //} else {
150+ //COLOR = tex_color + texture(SCREEN_TEXTURE, SCREEN_UV + COLOR.a*(SCREEN_PIXEL_SIZE * refraction_offset));
151+ //}
152+ if (cracks .a > 0.0 && tex_color .a > 0.0 ) {
153+ COLOR = vec4 (0 ,0 ,0 ,1 );
154+ //COLOR = texture(SCREEN_TEXTURE, SCREEN_UV + COLOR.a*(SCREEN_PIXEL_SIZE * refraction_offset));
155+ } else {
156+ COLOR = tex_color ;
25157 }
26158 }
27- COLOR = tex_color ;
28159}
29-
30- //void light() {
31- // // Called for every pixel for every light affecting the CanvasItem.
32- // // Uncomment to replace the default light processing function with this one.
33- //}
0 commit comments