|  |  |  | shader_type spatial; | 
					
						
							|  |  |  | uniform bool is_link = false; | 
					
						
							|  |  |  | uniform bool is_focus_from = false; | 
					
						
							|  |  |  | uniform bool is_focus_to = false; | 
					
						
							|  |  |  | uniform vec3 focus_min_from = vec3(0,0,0); | 
					
						
							|  |  |  | uniform vec3 focus_max_from = vec3(0,0,0); | 
					
						
							|  |  |  | uniform vec3 focus_min_to = vec3(0,0,0); | 
					
						
							|  |  |  | uniform vec3 focus_max_to = vec3(0,0,0); | 
					
						
							|  |  |  | uniform float focus_rate = 1.0; | 
					
						
							|  |  |  | uniform bool is_target = false; | 
					
						
							|  |  |  | uniform vec3 target_position = vec3(0, 1.28, 1); | 
					
						
							|  |  |  | varying vec3 world_position; | 
					
						
							|  |  |  | uniform bool show_air_wall = true; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | uniform vec2 pixel_size = vec2(0.02, 0.02); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void vertex() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	world_position = (MODEL_MATRIX * vec4(VERTEX, 1.0)).xyz; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bool is_in_focus(vec3 f_min,vec3 f_max){ | 
					
						
							|  |  |  |     //if(world_position.x<f_min.x||world_position.x>f_max.x){return false;} | 
					
						
							|  |  |  |     if(world_position.z>f_max.z){return false;} | 
					
						
							|  |  |  |     if(world_position.y>f_max.y && world_position.z>f_min.z){return false;} | 
					
						
							|  |  |  |     return true; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void fragment() { | 
					
						
							|  |  |  |     if(!is_link){ | 
					
						
							|  |  |  |         if(is_focus_from || is_focus_to){ | 
					
						
							|  |  |  |             bool is_in_focus_from = is_in_focus(focus_min_from,focus_max_from); | 
					
						
							|  |  |  |             bool is_in_focus_to = is_in_focus(focus_min_to,focus_max_to); | 
					
						
							|  |  |  |             if(is_in_focus_from&&is_in_focus_to){ | 
					
						
							|  |  |  |                 //ALPHA = 1.0; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             else if(is_focus_to&&is_in_focus_to){ | 
					
						
							|  |  |  |                 //ALPHA = focus_rate; | 
					
						
							|  |  |  |                 //ALPHA = 1.0; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             else if(is_focus_from&&is_in_focus_from){ | 
					
						
							|  |  |  |                 //ALPHA = 1.0 - focus_rate; | 
					
						
							|  |  |  |                 discard; | 
					
						
							|  |  |  |             }else{ | 
					
						
							|  |  |  |                 discard; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     vec3 c = COLOR.rgb; | 
					
						
							|  |  |  |     if(c.r+c.g+c.b<0.1){ | 
					
						
							|  |  |  |         ALBEDO = vec3(0.1); | 
					
						
							|  |  |  |     }else if(c.r+c.g+c.b>2.9){ | 
					
						
							|  |  |  |         if(show_air_wall){ | 
					
						
							|  |  |  |             ALBEDO = vec3(0.9); | 
					
						
							|  |  |  |         }else{ | 
					
						
							|  |  |  |             discard; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     }else{ | 
					
						
							|  |  |  |         float brightness = 1.0; | 
					
						
							|  |  |  |         if(is_target){ | 
					
						
							|  |  |  |             float offset_y = abs(floor((world_position.y-target_position.y) / 0.02) * 0.02); | 
					
						
							|  |  |  |             offset_y = max(0.0,offset_y-0.64); | 
					
						
							|  |  |  |             float rate = clamp(1.0-offset_y/4.48,0.0,1.0); | 
					
						
							|  |  |  |             brightness = rate; | 
					
						
							|  |  |  |         }else{ | 
					
						
							|  |  |  |             brightness = 1.0; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         vec3 world_normal = (INV_VIEW_MATRIX * vec4(NORMAL, 0.0)).xyz; | 
					
						
							|  |  |  |         bool is_light = c.r+c.g+c.b>2.8; | 
					
						
							|  |  |  |         if(!is_light && world_normal.y<0.1){ | 
					
						
							|  |  |  |             brightness = brightness*0.6; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         c.rgb = mix(vec3(0.0), c.rgb, brightness); | 
					
						
							|  |  |  |    	ALBEDO = c.rgb; | 
					
						
							|  |  |  |         if(is_light){ | 
					
						
							|  |  |  |             EMISSION = c.rgb * 2.0; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     | 
					
						
							|  |  |  | } |