shader_type spatial; render_mode depth_draw_always; 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 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.xf_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; 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; if(world_normal.y<0.1){ brightness = brightness*0.6; } c.rgb = mix(vec3(0.0), c.rgb, brightness); ALBEDO = c.rgb; }