#version 330 core
uniform float position_list[20];
uniform vec3 color_list[20];
uniform float trans_list[20];
uniform vec3 color_rate_bias;
uniform vec3 below_color;
uniform vec3 above_color;
uniform int point_length;

vec4 colormap(float x) {
    if ( x <= color_rate_bias.y&&color_rate_bias.z == 1.0 )
    {
        return vec4(below_color,1.0);
    }
    if( x >= color_rate_bias.x+color_rate_bias.y&&color_rate_bias.z == 1.0 )
    {
        return vec4(above_color,1.0);
    }
    x = (x-color_rate_bias.y)/color_rate_bias.x;
    if ( x <= position_list[0] )
    {
        if(position_list[0]!=0)
        {
            float para = (x-color_rate_bias.y)/position_list[0];  
            return vec4(color_list[0],1+para*(trans_list[0]-1));}  
        else{
            return vec4(color_list[0],trans_list[0]);
        }              
    }
    int idx_max=point_length-1;
    for (int count = 1;count < point_length;count++)
    {
        if(x<=position_list[count])
        {
            float para = (x-position_list[count-1])/(position_list[count]-position_list[count-1]);
            return vec4(color_list[count-1]+para*(color_list[count]-color_list[count-1]),trans_list[count-1]+para*(trans_list[count]-trans_list[count-1]));       
        }
    }     
    if (x > position_list[idx_max])      
    {
        if(position_list[idx_max]!=1)
        {
            float para = (x-position_list[idx_max])/(1-position_list[idx_max]);  
            return vec4(color_list[idx_max],trans_list[idx_max]+para*(1-trans_list[idx_max]));}
        else{
            return vec4(color_list[idx_max],trans_list[idx_max]);
        }
    }
}