highp vec2 hash22(highp vec2 p)
{
    p = vec2 (
        dot(p, vec2(127.1, 11.7)),
        dot(p, vec2(269.5, 83.3))
    );
    return -1.0 + 2.0 * fract(sin(p) * 43758.5453123);
}

highp float wnoise(highp vec2 p, highp float time)
{
    highp vec2 pi = floor(p);
    highp vec2 pf = p - pi;
    float minDistance = 5.0;
    
    //九宫格中取最小距离
    for(int i = -1; i <= 1; i++)
    {
    	for(int j = -1; j <=1; j++)
        {
            highp vec2 offset = vec2(i, j);
            highp vec2 rand = hash22(pi + offset);
           	highp vec2 move = 0.5 + 0.99 * sin(rand * time);
            move = pi + offset + move - p;
            highp float distance = dot(move, move) * 1.0;
            if(distance < minDistance)
            {
                minDistance = distance;
            }
        }
    }
    return minDistance;
}

float rayPos(in vec3 pos, float yPos)
{
vec3 np = normalize(pos);
float sun = abs(1.0-length(np.yz));
vec3 Pos = vec3(smoothstep((8.5-yPos) + abs(np.y)*2.4,0.0,abs(np.z)*1.7));
vec3 flatRange = vec3(max(0.0,sun));
return pow(max(dot(Pos, flatRange), 0.0),5.0);
}

bool getNetherMask(vec4 ambient){
if(ambient.r > ambient.b && ambient.r < .5 && ambient.b < .05){
return true;
} else {
return false;}
}


vec3 raySun(in vec3 pos, vec3 x)
{
float specularFlat = rayPos(pos,2.4);
x *= vec3(0.64,0.66,0.71)*specularFlat;
return x;
}

bool uw(vec4 abt){
if(abt.b > abt.r*2.5 &&  abt.b*3.0 > abt.g){
return true; } else { return false; } }

float ac(float x) {
float A = 1.25;
float B = 0.15;
float C = 0.15;
float D = 0.45;
float E = 0.05;
float F = 0.35;
return ((x * (A * x + C * B) + D * E) / (x * (A * x + B) + D * F)) - E / F;
}

vec3 Hyra(vec3 clr) {
float W = 1.3 / 1.0;
float Luma = dot(clr, vec3(0.0, 0.3, 0.3));
vec3 Chroma = clr - Luma;
clr = (Chroma * 1.70) + Luma;
clr = vec3(ac(clr.r), ac(clr.g), ac(clr.b)) / ac(W);
return clr;
}

vec3 FOGw(vec3 x)
{
	float avg = (x.r + x.g + x.b);
	x = (((x - avg )*0.87)+avg);//make a greyscale
	x = pow(x,vec3(0.3/0.4));//make to foged

	x.r = (x.r * 1.1)+(x.r+x.g)*(-0.1);
	x.g = (x.g * 1.1)+(x.r+x.b)*(-0.1);
	x.b = (x.b * 1.1)+(x.r+x.g)*(-0.1);
	return x;
}
