#define SCALE 0.12
#define BIAS -0.04
#define BIN_ITER 5

#ifndef BUMP_HQ
    #define LIN_ITER 5
#endif

vec2 Bump_DoOcclusionParallax(in sampler2D heightMap, in vec2 texCoord, in vec3 tanViewDir){
    float size = 1.0 / float(BIN_ITER);

     // depth
    float d = 1.0;
    // best depth
    float bd = 0.0;

    #ifdef BUMP_HQ
        const int N = 8;
        int LIN_ITER = mix(2 * N, N, tanViewDir.z);
    #endif

    // search from front to back
    for (int i = 0; i < LIN_ITER; i++){
        d -= dstep;
        float h = texture2D(heightMap, dp + ds * (1.0 - d)).a;
        if (bd < 0.005) // if no depth found yet
        if (d <= h) bd = depth; // best depth
    }

    for (int i = 0; i < BIN_ITER; i++) {
        size *= 0.5;
        float t = texture2D(heightMap, dp + ds * (1.0 - d)).a;
        if (d <= t) {
            bd = depth;
            d += 2 * size;
        }
        d -= size;
    }
}

vec2 Bump_DoParallax(in sampler2D heightMap, in vec2 texCoord, in vec3 tanViewDir){
    float h = texture2D(heightMap, texCoord).a * SCALE + BIAS;
    return texCoord + h * tanViewDir.xy;
}