136 lines
2.9 KiB
Plaintext
136 lines
2.9 KiB
Plaintext
![]() |
[gd_resource type="Shader" format=2]
|
||
|
|
||
|
[resource]
|
||
|
code = "shader_type spatial;
|
||
|
render_mode specular_schlick_ggx, async_visible;
|
||
|
|
||
|
varying vec2 map_coord;
|
||
|
varying vec2 world_coord;
|
||
|
varying vec2 offset_coord;
|
||
|
varying vec3 vertex_coord;
|
||
|
|
||
|
const mat2 _HexAffineInverse = mat2(vec2(1.333333, -0.6666667), vec2(0, -1.154701));
|
||
|
|
||
|
vec3 axial_to_cube(vec2 axial) {
|
||
|
return vec3(axial.x, axial.y, -axial.x - axial.y);
|
||
|
}
|
||
|
|
||
|
ivec3 round_cube_coords(vec3 cube) {
|
||
|
ivec3 rounded = ivec3(round(cube));
|
||
|
|
||
|
vec3 diffs = abs(vec3(rounded) - cube);
|
||
|
|
||
|
if (diffs.x > diffs.y && diffs.x > diffs.z) {
|
||
|
rounded.x = -rounded.y - rounded.z;
|
||
|
} else if (diffs.y > diffs.z) {
|
||
|
rounded.y = -rounded.x - rounded.z;
|
||
|
} else {
|
||
|
rounded.z = -rounded.x - rounded.y;
|
||
|
}
|
||
|
|
||
|
return rounded;
|
||
|
}
|
||
|
|
||
|
ivec2 axial_to_offset(vec2 axial) {
|
||
|
ivec3 cubeCoords = round_cube_coords(axial_to_cube(axial));
|
||
|
int x = cubeCoords.x;
|
||
|
int y = cubeCoords.y;
|
||
|
int off_y = y + (x - (x % 2)) / 2;
|
||
|
return ivec2(x, off_y);
|
||
|
}
|
||
|
|
||
|
void vertex() {
|
||
|
// Input:2
|
||
|
mat4 model_matrix = WORLD_MATRIX;
|
||
|
|
||
|
vec3 origin = vec4(WORLD_MATRIX * vec4(0, 0, 0, 1)).xyz;
|
||
|
|
||
|
vec3 axial_coords = vec3(_HexAffineInverse * origin.xz, 0);
|
||
|
|
||
|
// Output:0
|
||
|
offset_coord = vec2(axial_to_offset(axial_coords.xy));
|
||
|
vertex_coord = vec4(WORLD_MATRIX * vec4(VERTEX, 1.0)).xyz;
|
||
|
world_coord = vec4(WORLD_MATRIX * vec4(VERTEX, 1.0)).xz;
|
||
|
}
|
||
|
|
||
|
vec3 vertex_world_to_color(vec3 vertex_world) {
|
||
|
ivec3 vertex_world_rounded = ivec3(floor(vertex_world));
|
||
|
|
||
|
vec3 result_color = vec3(0);
|
||
|
|
||
|
if (vertex_world_rounded.x % 2 == 0) {
|
||
|
result_color.r = 1.0;
|
||
|
}
|
||
|
|
||
|
if (vertex_world_rounded.z % 2 == 0) {
|
||
|
result_color.b = 1.0;
|
||
|
}
|
||
|
|
||
|
return result_color;
|
||
|
}
|
||
|
|
||
|
vec3 vertex_world_to_hex_center(vec3 vertex_world) {
|
||
|
vec3 axial_coords_f = vec3(_HexAffineInverse * vertex_world.xz, 0);
|
||
|
|
||
|
// Output:0
|
||
|
ivec2 offset_coord_f = axial_to_offset(axial_coords_f.xy);
|
||
|
|
||
|
vec3 result_color = vec3(0);
|
||
|
|
||
|
if (offset_coord_f.x % 2 == 0) {
|
||
|
result_color.r = 1.0;
|
||
|
}
|
||
|
|
||
|
if (offset_coord_f.y % 2 == 0) {
|
||
|
result_color.b = 1.0;
|
||
|
}
|
||
|
|
||
|
return result_color;
|
||
|
}
|
||
|
|
||
|
ivec2 cube_to_axial(ivec3 hex_i) {
|
||
|
return ivec2(hex_i.x, hex_i.y);
|
||
|
}
|
||
|
|
||
|
ivec2 axial_round(vec2 hex) {
|
||
|
return cube_to_axial(round_cube_coords(axial_to_cube(hex)));
|
||
|
}
|
||
|
|
||
|
ivec2 axial_to_evenq(ivec2 axial) {
|
||
|
int col = axial.x;
|
||
|
int row = axial.y + (axial.x + (axial.x & 1 )) / 2;
|
||
|
return ivec2 (col, row);
|
||
|
}
|
||
|
|
||
|
vec3 vertex_world_to_hex_center_amid (vec3 vertex_world) {
|
||
|
const mat2 HexAffineInverseAmid = mat2(vec2(2./ 3., -1. / 3.), vec2(0, sqrt(3) / 3.)) * 2.;
|
||
|
|
||
|
vec2 qr = HexAffineInverseAmid * vertex_world.xz;
|
||
|
|
||
|
ivec2 axial_coords_f = axial_round(qr);
|
||
|
ivec2 offset_coord_f = axial_to_evenq(axial_coords_f);
|
||
|
|
||
|
vec3 result_color = vec3(0);
|
||
|
|
||
|
if (offset_coord_f.x % 2 == 0) {
|
||
|
result_color.r = 1.0;
|
||
|
}
|
||
|
|
||
|
if (offset_coord_f.y % 2 == 0) {
|
||
|
result_color.b = 1.0;
|
||
|
}
|
||
|
|
||
|
return result_color;
|
||
|
}
|
||
|
|
||
|
void fragment() {
|
||
|
ALBEDO = vertex_world_to_hex_center(vertex_coord);
|
||
|
ALBEDO = vertex_world_to_hex_center_amid(vertex_coord);
|
||
|
}
|
||
|
|
||
|
void light() {
|
||
|
// Output:0
|
||
|
|
||
|
}
|
||
|
"
|