80 lines
2.1 KiB
Plaintext
80 lines
2.1 KiB
Plaintext
|
shader_type spatial;
|
||
|
render_mode specular_schlick_ggx, async_visible;
|
||
|
|
||
|
uniform sampler2D MapAlbedoTexture : hint_black_albedo;
|
||
|
uniform int TextureSize: hint_range(0, 1024, 4);
|
||
|
varying vec2 map_coord;
|
||
|
varying vec3 obj_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;
|
||
|
}
|
||
|
|
||
|
vec2 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 & 1)) / 2;
|
||
|
return vec2(float(x), float(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);
|
||
|
|
||
|
vec2 offset_coords = axial_to_offset(axial_coords.xy);
|
||
|
//map_coord = mod(axial_to_offset(axial_coords.xy), vec2(float(TextureSize)));
|
||
|
map_coord = offset_coords;
|
||
|
map_coord.y = -map_coord.y;
|
||
|
|
||
|
|
||
|
float map_size = 4.0;
|
||
|
map_coord = mod(origin.xz, map_size) / (map_size);
|
||
|
//map_coord = mod((round(origin.xz * map_size)) / (map_size) , map_size);
|
||
|
|
||
|
// if (map_coord.x > map_size) {
|
||
|
// map_coord.x = map_coord.x - (map_size + 1.0);
|
||
|
// }
|
||
|
|
||
|
// map_coord.x = map_coord.x / map_size;
|
||
|
// map_coord.x = (mod (map_coord.x, map_size) / (map_size + 1.0));
|
||
|
// map_coord.y = (mod (map_coord.y, map_size) / (map_size + 1.0));
|
||
|
|
||
|
// ivec2 map_coord_i = ivec2(map_coord);
|
||
|
// map_coord_i.x = map_coord_i.x % TextureSize;
|
||
|
// map_coord_i.y = map_coord_i.y % TextureSize;
|
||
|
// map_coord = vec2(map_coord_i) / float(TextureSize);
|
||
|
obj_coord = origin;
|
||
|
}
|
||
|
|
||
|
void fragment() {
|
||
|
//ALBEDO = pow(texture(MapAlbedoTexture, map_coord).rgb, vec3(2.4));
|
||
|
ALBEDO = texture(MapAlbedoTexture, map_coord).rgb;
|
||
|
}
|
||
|
|
||
|
void light() {
|
||
|
// Output:0
|
||
|
|
||
|
}
|