const float PI = radians(180.0);
const float TAU = PI*2.0;
const float epsilon = 1e-5;

#define getAngle(x) (0.07 / (pow2(x) + 0.07))

vec3 calcNormal(vec3 pos) {
    return normalize(cross(dFdx(pos), dFdy(pos)));
}


float pow2(float x)
{
    return x * x;
}

vec2 pow2(vec2 x)
{
    return x * x;
}

vec3 pow2(vec3 x)
{
    return x * x;
}

vec4 pow2(vec4 x)
{
    return x * x;
}



float clamp01(float x) {
    return clamp(x,0.0,1.0);
}

vec2 clamp01(vec2 x) {
    return clamp(x,vec2(0.0),vec2(1.0));
}

vec3 clamp01(vec3 x) {
    return clamp(x,vec3(0.0),vec3(1.0));
}

vec4 clamp01(vec4 x) {
    return clamp(x,vec4(0.0),vec4(1.0));
}



vec3 normalZRecontrust(vec3 normalData)
{
    return vec3(normalData.xy, max(sqrt(1.0-dot(normalData.xy, normalData.xy)), 1e-6));
}

float max0(float x)
{
    return max(0.0, x);
}

vec2 max0(vec2 x)
{
    return max(vec2(0.0), x);
}

vec3 max0(vec3 x)
{
    return max(vec3(0.0), x);
}

vec4 max0(vec4 x)
{
    return max(vec4(0.0), x);
}


float rcp(float x)
{
    return 1.0 / x;
}

vec2 rcp(vec2 x)
{
    return vec2(1.0) / x;
}

vec3 rcp(vec3 x)
{
    return vec3(1.0) / x;
}

vec4 rcp(vec4 x)
{
    return vec4(1.0) / x;
}


float minChannel(vec3 x) {
    return min(min(x.x,x.y),x.z);
}

float minChannel(vec2 x) {
    return min(x.x,x.y);
}