#define CUBEMAP_RES 1024
#define CUBEMAP_WIDTH 6144

int getFaceIndex(ivec2 fragpos) {
    return fragpos.x / CUBEMAP_RES;
}

vec3 convert_cube_uv_to_xyz(int index, vec2 uv) {
    // convert range 0 to 1 to -1 to 1
    vec2 c = 2.0 * uv - 1.0;
    switch (index) {
        case 0: return vec3(1.0, c.y, -c.x);
        case 1: return vec3(-1.0, c.y, c.x);
        case 2: return vec3(c.x, 1.0, -c.y);
        case 3: return vec3(c.x, -1.0, c.y);
        case 4: return vec3(c.x, c.y, 1.0);
        case 5: return vec3(-c.x, c.y, -1.0);
    }
}

vec2 convert_xyz_to_cube_uv(in vec3 v, out int index) {
	vec3 vAbs = abs(v);
	float ma;
	vec2 uv;
	if(vAbs.z >= vAbs.x && vAbs.z >= vAbs.y) {
		index = v.z < 0.0 ? 5 : 4;
		ma = 0.5 / vAbs.z;
		uv = vec2(v.z < 0.0 ? -v.x : v.x, -v.y);
	} else if(vAbs.y >= vAbs.x) {
		index = v.y < 0.0 ? 2 : 3;
		ma = 0.5 / vAbs.y;
		uv = vec2(v.x, v.y < 0.0 ? -v.z : v.z);
	} else {
		index = v.x < 0.0 ? 1 : 0;
		ma = 0.5 / vAbs.x;
		uv = vec2(v.x < 0.0 ? v.z : -v.z, -v.y);
	}
	return uv * ma + 0.5;
}

// vec2 convert_xyz_to_cube_uv(vec3 dir, out int index) {

//     float u = 0.0;
//     float v = 0.0;
//     float x = dir.x, y = dir.y, z = dir.z;

//     float absX = abs(x);
//     float absY = abs(y);
//     float absZ = abs(z);
  
//     bool isXPositive = x > 0.0;
//     bool isYPositive = y > 0.0;
//     bool isZPositive = z > 0.0;
  
//     float maxAxis, uc, vc;
  
//     // POSITIVE X
//     if (isXPositive && absX >= absY && absX >= absZ) {
//         // u (0 to 1) goes from +z to -z
//         // v (0 to 1) goes from -y to +y
//         maxAxis = absX;
//         uc = -z;
//         vc = y;
//         index = 0;
//     }
//     // NEGATIVE X
//     if (!isXPositive && absX >= absY && absX >= absZ) {
//         // u (0 to 1) goes from -z to +z
//         // v (0 to 1) goes from -y to +y
//         maxAxis = absX;
//         uc = z;
//         vc = y;
//         index = 1;
//     }
//     // POSITIVE Y
//     if (isYPositive && absY >= absX && absY >= absZ) {
//         // u (0 to 1) goes from -x to +x
//         // v (0 to 1) goes from +z to -z
//         maxAxis = absY;
//         uc = x;
//         vc = -z;
//         index = 2;
//     }
//     // NEGATIVE Y
//     if (!isYPositive && absY >= absX && absY >= absZ) {
//         // u (0 to 1) goes from -x to +x
//         // v (0 to 1) goes from -z to +z
//         maxAxis = absY;
//         uc = x;
//         vc = z;
//         index = 3;
//     }
//     // POSITIVE Z
//     if (isZPositive && absZ >= absX && absZ >= absY) {
//         // u (0 to 1) goes from -x to +x
//         // v (0 to 1) goes from -y to +y
//         maxAxis = absZ;
//         uc = x;
//         vc = y;
//         index = 4;
//     }
//     // NEGATIVE Z
//     if (!isZPositive && absZ >= absX && absZ >= absY) {
//         // u (0 to 1) goes from +x to -x
//         // v (0 to 1) goes from -y to +y
//         maxAxis = absZ;
//         uc = -x;
//         vc = y;
//         index = 5;
//     }

//     // Convert range from -1 to 1 to 0 to 1
//     u = 0.5 * (uc / maxAxis + 1.0);
//     v = 0.5 * (vc / maxAxis + 1.0);

//     return vec2(u, v);
// }