// Copyright (c) 2023 Lachlan McDonald
// This work is licensed under the MIT License (MIT)
// https://github.com/lachlanmcdonald/magicavoxel-shaders
//
// xs case [Color]
//
// xs_begin
// author : '@lmcdx.bsky.social'
// arg : { name = 'Color'  var = 'm_color'  range = '0 255'  value = '1'  step = '1'  precision = '0' }
// xs_end

bool no_axis_mode = all(equal(ivec3(i_axis), ivec3(0)));
bvec3 axis_mode = no_axis_mode ? bvec3(true) : equal(ivec3(i_axis), ivec3(1));

bool isSelectedPal(float p) {
	for (int i = 0; i < i_num_color_sels; i += 1) {
		if (p == color_sel(float(i))) {
			return true;
		}
	}
	return false;
}

float map(vec3 v) {
	float index = voxel(v);

	if (index == 0.0) {
		vec2 x_range = v.xx;
		vec2 y_range = v.yy;
		vec2 z_range = v.zz;

		if (axis_mode.x) {
			x_range.x = v.x - 1.0;
			x_range.y = v.x + 1.0;
		}
		if (axis_mode.y) {
			y_range.x = v.y - 1.0;
			y_range.y = v.y + 1.0;
		}
		if (axis_mode.z) {
			z_range.x = v.z - 1.0;
			z_range.y = v.z + 1.0;
		}

		for (float x = x_range.x; x <= x_range.y; x += 1.0) {
			for (float y = y_range.x; y <= y_range.y; y += 1.0) {
				for (float z = z_range.x; z <= z_range.y; z += 1.0) {
 					float j = voxel(vec3(x, y, z));

					if (isSelectedPal(j)) {
						return m_color;
					}
				}
			}
		}
	}

	return index;
}