// Copyright (c) 2023 Lachlan McDonald // This work is licensed under the MIT License (MIT) // https://github.com/lachlanmcdonald/magicavoxel-shaders // // xs brush/grid [Color A] [Color B] [Thickness] [Size X] [Size Y] [Size Z] // // xs_begin // author : '@lmcdx.bsky.social' // arg : { name = 'Color A' var = 'm_color_a' range = '0 255' value = '1' step = '1' precision = '0' } // arg : { name = 'Color B' var = 'm_color_b' range = '0 255' value = '2' step = '1' precision = '0' } // arg : { name = 'Thickness' var = 'm_thickness' range = '1 256' value = '1' step = '1' precision = '0' } // arg : { name = 'Size X' var = 'm_size_x' range = '1 256' value = '4' step = '1' precision = '0' } // arg : { name = 'Size Y' var = 'm_size_y' range = '1 256' value = '4' step = '1' precision = '0' } // arg : { name = 'Size Z' var = 'm_size_z' range = '1 256' value = '4' step = '1' precision = '0' } // xs_end float thickness = m_thickness - 1.0; vec3 dim = vec3(m_size_x, m_size_y, m_size_z) + 1.0; 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)); float map(vec3 v) { if (axis_mode.x) { if (dim.x > thickness) { float m = floor(mod(v.x, dim.x)); if (m <= thickness) { return m_color_a; } } } if (axis_mode.y) { if (dim.y > thickness) { float m = floor(mod(v.y, dim.y)); if (m <= thickness) { return m_color_a; } } } if (axis_mode.z) { if (dim.z > thickness) { float m = floor(mod(v.z, dim.z)); if (m <= thickness) { return m_color_a; } } } return m_color_b; }