shader_type spatial; render_mode depth_prepass_alpha; uniform sampler2D albedo_texture; uniform sampler2D normal_map; uniform float transition_point = 0.1; uniform float transition_length = 0.1; uniform float target_length = 6.0; uniform float target_height = 3.0; float map_normalized(float value, float from_min, float to_max) { return clamp((value - from_min) / (to_max-from_min), 0.0, 1.0); } void vertex() { if (UV2.y < 1.0) { float cycle = 1.0-fract(TIME/15.0+UV2.y*1.01); float p1 = transition_point; float p2 = transition_point + transition_length; float p3 = 1.0-transition_point - transition_length; float p4 = 1.0-transition_point; float d1 = p3-p2; float d2 = 1.0 - transition_point * 2.0 - transition_length; float dt = transition_length * 0.5; float steepness = (target_height/target_length)/(d2); //vec3 sloped_movement = vec3(0.0, -cos(steepness*PI), sin(steepness*PI)) * (target_height / steepness); vec3 sloped_movement = vec3(0.0, target_height/d2, target_length); VERTEX -= vec3(0, 0, .8); //VERTEX -= vec3(0.0, 0.0, 7.0) * (1.0-UV2.y); //VERTEX += sloped_movement * ((1.0-cos(map_normalized(cycle, 0.2, 0.3)*PI/2.0))/PI*.2+ clamp(cycle-0.3, 0.0, 0.4)+ sin(map_normalized(cycle, 0.7, 0.8)*PI/2.0)/PI*.2); VERTEX += sloped_movement * ((1.0-cos(map_normalized(cycle, p1, p2)*PI/2.0))*dt + clamp(cycle-p2, 0.0, d1) + sin(map_normalized(cycle, p3, p4)*PI/2.0)*dt); VERTEX += vec3(0.0, 0.0, target_length / d2) * (clamp(cycle, 0.0, p2) + cos(map_normalized(cycle, p1, p2)*PI/2.0)*dt + (1.0-cos(map_normalized(cycle, p3, p4)*PI/2.0))*dt + clamp(cycle-p4, 0.0, p1)); } } void fragment() { METALLIC = 0.9; ALBEDO = texture(albedo_texture, UV).xyz * 1.5; ROUGHNESS = texture(albedo_texture, UV).x*.7; NORMAL_MAP = texture(normal_map, UV).xyz; ALPHA = texture(albedo_texture, UV).w; } //void light() { // // Called for every pixel for every light affecting the material. // // Uncomment to replace the default light processing function with this one. //}