Skip to content

Commit ab1e7c2

Browse files
committed
implement idea of drawing smaller geometries by moving vertices to the edge (AlpineMapsOrg#162)
1 parent 1e741f3 commit ab1e7c2

File tree

2 files changed

+33
-8
lines changed

2 files changed

+33
-8
lines changed

gl_engine/shaders/tile.glsl

+24-8
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,15 @@ highp float y_to_lat(highp float y) {
4040
}
4141

4242
highp vec3 camera_world_space_position(out vec2 uv, out float n_quads_per_direction, out float quad_width, out float quad_height, out float altitude_correction_factor) {
43-
highp int n_quads_per_direction_int = n_edge_vertices - 1;
43+
highp uvec3 instance_tile_id = unpack_tile_id(instance_tile_id_packed);
44+
45+
highp uvec3 dtm_tile_id = instance_tile_id;
46+
{
47+
uint dtm_zoom = texelFetch(instance_2_zoom_sampler, ivec2(uint(gl_InstanceID), 0), 0).x;
48+
decrease_zoom_level_until(dtm_tile_id, dtm_zoom);
49+
}
50+
51+
highp int n_quads_per_direction_int = (n_edge_vertices - 1) >> (instance_tile_id.z - dtm_tile_id.z);
4452
n_quads_per_direction = float(n_quads_per_direction_int);
4553
// highp vec4 bounds = texelFetch(instance_2_bounds_sampler, ivec2(uint(gl_InstanceID), 0), 0);
4654
quad_width = (instance_bounds.z - instance_bounds.x) / n_quads_per_direction;
@@ -67,6 +75,14 @@ highp vec3 camera_world_space_position(out vec2 uv, out float n_quads_per_direct
6775
col = curtain_vertex_id - 3 * n_edge_vertices + 3;
6876
}
6977
}
78+
if (row > n_quads_per_direction_int) {
79+
row = n_quads_per_direction_int;
80+
curtain_vertex_id = 1;
81+
}
82+
if (col > n_quads_per_direction_int) {
83+
col = n_quads_per_direction_int;
84+
curtain_vertex_id = 1;
85+
}
7086
// Note: for higher zoom levels it would be enough to calculate the altitude_correction_factor on cpu
7187
// for lower zoom levels we could bake it into the texture.
7288
// but there was no measurable difference despite a cos and a atan, so leaving as is for now.
@@ -77,13 +93,13 @@ highp vec3 camera_world_space_position(out vec2 uv, out float n_quads_per_direct
7793
uv = vec2(float(col) / n_quads_per_direction, float(row) / n_quads_per_direction);
7894

7995
/////////
80-
highp vec2 geom_uv = uv;
81-
uint geom_zoom = texelFetch(instance_2_zoom_sampler, ivec2(uint(gl_InstanceID), 0), 0).x;
82-
highp uvec3 geom_tile_id = unpack_tile_id(instance_tile_id_packed);
83-
decrease_zoom_level_until(geom_tile_id, geom_uv, geom_zoom);
84-
highp float geom_texture_layer_f = float(texelFetch(instance_2_array_index_sampler, ivec2(uint(gl_InstanceID), 0), 0).x);
85-
// float altitude_tex = float(geom_texture_layer_f);
86-
float altitude_tex = float(texture(height_tex_sampler, vec3(geom_uv, geom_texture_layer_f)).r);
96+
highp vec2 dtm_uv = uv;
97+
uint dtm_zoom = dtm_tile_id.z;
98+
dtm_tile_id = instance_tile_id;
99+
decrease_zoom_level_until(dtm_tile_id, dtm_uv, dtm_zoom);
100+
101+
highp float dtm_texture_layer_f = float(texelFetch(instance_2_array_index_sampler, ivec2(uint(gl_InstanceID), 0), 0).x);
102+
float altitude_tex = float(texture(height_tex_sampler, vec3(dtm_uv, dtm_texture_layer_f)).r);
87103
////////
88104
// float altitude_tex = float(texelFetch(height_tex_sampler, ivec3(col, row, height_texture_layer), 0).r);
89105
float adjusted_altitude = altitude_tex * altitude_correction_factor;

gl_engine/shaders/tile_id.glsl

+9
Original file line numberDiff line numberDiff line change
@@ -64,3 +64,12 @@ void decrease_zoom_level_until(inout highp uvec3 id, inout highp vec2 uv, in low
6464
id.y = id.y >> z_delta;
6565
uv = uv / float(1u << z_delta) + vec2(x_border, y_border);
6666
}
67+
68+
void decrease_zoom_level_until(inout highp uvec3 id, in lowp uint zoom_level) {
69+
if(id.z <= zoom_level)
70+
return;
71+
highp uint z_delta = id.z - zoom_level;
72+
id.z = id.z - z_delta;
73+
id.x = id.x >> z_delta;
74+
id.y = id.y >> z_delta;
75+
}

0 commit comments

Comments
 (0)