shader_type spatial;

// Uniforms that can be controlled from GDScript
uniform float model_height : hint_range(0.1, 100.0) = 10.0;
uniform float transition_width : hint_range(0.01, 0.5) = 0.1;
uniform vec4 base_color : source_color = vec4(1.0, 1.0, 1.0, 1.0);
uniform float effect_strength : hint_range(0.0, 1.0) = 1.0;
uniform sampler2D main_texture : source_color;
uniform float metallic : hint_range(0.0, 1.0) = 0.0;
uniform float roughness : hint_range(0.0, 1.0) = 0.5;

varying vec3 world_position;

void vertex() {
    world_position = VERTEX;
}

void fragment() {
    // Get the base texture color
    vec4 tex_color = texture(main_texture, UV);
    
    // Calculate normalized Y position (0.0 at bottom, 1.0 at top)
    // This uses the local vertex position - adjust based on your model's bounds
    float normalized_y = (world_position.y + model_height * 0.5) / model_height;
    
    // Define fade boundaries - top 80% invisible, bottom 20% visible
    float fade_start = 0.2; // Start fading at 20% from bottom
    float fade_end = fade_start - transition_width;
    
    // Calculate position-based alpha
    float position_alpha = smoothstep(fade_end, fade_start, normalized_y);
    
    // Blend between full visibility and position-based alpha based on effect strength
    float final_alpha = mix(1.0, position_alpha, effect_strength);
    
    // Set material properties
    ALBEDO = base_color.rgb * tex_color.rgb;
    ALPHA = base_color.a * tex_color.a * final_alpha;
    METALLIC = metallic;
    ROUGHNESS = roughness;
}