Skip to content

Commit

Permalink
Add some kind of multisampling to map font shader and add quartercorn…
Browse files Browse the repository at this point in the history
…ers to sea borders
  • Loading branch information
ineveraskedforthis committed Nov 30, 2024
1 parent 049b886 commit f618927
Show file tree
Hide file tree
Showing 2 changed files with 88 additions and 26 deletions.
61 changes: 51 additions & 10 deletions assets/shaders/glsl/text_line_f.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,37 @@ vec4 gamma_correct(vec4 colour) {
return vec4(pow(colour.rgb, vec3(1.f / gamma)), colour.a);
}


float clamp(float x, float lowerlimit = 0.0f, float upperlimit = 1.0f) {
if (x < lowerlimit) return lowerlimit;
if (x > upperlimit) return upperlimit;
return x;
}

float smoothstep (float edge0, float edge1, float x) {
x = clamp((x - edge0) / (edge1 - edge0));

return x * x * (3.0f - 2.0f * x);
}


float get_value(float d) {
float value = 1.f;
if (d > 0.5f) {
return 0.f;
} else if ((d > 0.500f) && (d < 0.510f)) {
value = 1.f - smoothstep(0.500f, 0.510f, d);
} else {
value = 1.f;
}
return value;
}

float get_opacity(float d) {
float t = max(0.0f, d * 16.0f - 7.0f);
return pow(t, 5.f);
}

void main() {
float border_size = 0.022f;
vec3 inner_color = vec3(1.0 - is_black, 1.0 - is_black, 1.0 - is_black);
Expand All @@ -20,15 +51,25 @@ void main() {
outer_color = mix(inner_color, outer_color, text_size * 40.f);

vec4 color_in = texture(texture_sampler, vec2(tex_coord.rg));
if(color_in.r > 0.5) {
frag_color = vec4(inner_color, 1.0f);
} else if(color_in.r > 0.495) {
frag_color = vec4(mix(inner_color, outer_color, 1.0f - (color_in.r - 0.5f) * 200.0f), 1.0f);
} else {
float t = max(0.0f, color_in.r * 16.0f - 7.0f);
frag_color = vec4(outer_color, pow(t, 5.f));
}

frag_color.a *= opacity;

float dist = color_in.r;
vec2 ddist = vec2(dFdx(dist), dFdy(dist));
float pixel_distance = length(ddist) * 0.1f;

float average_value = 0.f;
for (int i = -5; i <= 5; i++) {
average_value += get_value(dist + i * pixel_distance);
}

float average_opacity = 0.f;
for (int i = -5; i <= 5; i++) {
average_opacity += get_opacity(dist + i * pixel_distance);
}

average_value /= 11.f;
average_opacity /= 11.f;


frag_color = vec4(mix(inner_color, outer_color, average_value), average_opacity * opacity);
frag_color = gamma_correct(frag_color);
}
53 changes: 37 additions & 16 deletions src/map/map_borders.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -555,7 +555,7 @@ std::vector<glm::vec2> make_coastal_loop(display_data& dat, sys::state& state, s
int32_t dropped_points_counter = 0;
constexpr int32_t dropped_points_max = 64;

auto add_next = [&](int32_t i, int32_t j, bool& next_found) {
auto add_next = [&](int32_t i, int32_t j, bool& next_found, int32_t prev_i, int32_t prev_j, bool corner) {
if(next_found)
return glm::ivec2(0, 0);
if(visited[i + j * dat.size_x])
Expand All @@ -567,7 +567,7 @@ std::vector<glm::vec2> make_coastal_loop(display_data& dat, sys::state& state, s
// test for colinearity
// this works, but it can result in the border textures being "slanted" because the normals are carried over between two corners

if(points.size() > 2) {
if(points.size() > 2 && !corner) {
auto l = points[points.size() - 1];
auto n = points[points.size() - 2];
if(dropped_points_counter < dropped_points_max &&
Expand All @@ -579,6 +579,17 @@ std::vector<glm::vec2> make_coastal_loop(display_data& dat, sys::state& state, s
dropped_points_counter = 0;
}
}

if(corner) {
float prev_x = float(prev_i) + 0.5f;
float prev_y = 0.5f + float(prev_j) / 2.0f;

float next_x = float(i);
float next_y = 0.5f + float(j) / 2.0f;

points.push_back(glm::vec2((prev_x + next_x) / 2.f, prev_y));
points.push_back(glm::vec2(next_x, (prev_y + next_y) / 2.f));
}

points.push_back(glm::vec2(float(i), 0.5f + float(j) / 2.0f));
next_found = true;
Expand All @@ -591,7 +602,7 @@ std::vector<glm::vec2> make_coastal_loop(display_data& dat, sys::state& state, s
// test for colinearity
// this works, but it can result in the border textures being "slanted" because the normals are carried over between two corners

if(points.size() > 2) {
if(points.size() > 2 && !corner) {
auto l = points[points.size() - 1];
auto n = points[points.size() - 2];
if(dropped_points_counter < dropped_points_max &&
Expand All @@ -603,6 +614,17 @@ std::vector<glm::vec2> make_coastal_loop(display_data& dat, sys::state& state, s
dropped_points_counter = 0;
}
}

if(corner) {
float prev_x = float(prev_i);
float prev_y = 0.5f + float(prev_j) / 2.0f;

float next_x = float(i) + 0.5f;
float next_y = 0.5f + float(j) / 2.0f;

points.push_back(glm::vec2(prev_x, (prev_y + next_y) / 2.f));
points.push_back(glm::vec2((prev_x + next_x) / 2.f, next_y));
}

points.push_back(glm::vec2(float(i) + 0.5f, 0.5f + float(j) / 2.0f));
next_found = true;
Expand All @@ -624,24 +646,24 @@ std::vector<glm::vec2> make_coastal_loop(display_data& dat, sys::state& state, s
if(start_y % 2 == 0) {
bool left_is_sea = dat.safe_get_province(glm::ivec2(start_x - 1, start_y / 2)) == 0 || province::from_map_id(dat.safe_get_province(glm::ivec2(start_x - 1, start_y / 2))).index() >= state.province_definitions.first_sea_province.index();
if(left_is_sea) {
temp += add_next(start_x, start_y + 1, progress);
temp += add_next(start_x, start_y + 2, progress);
temp += add_next(start_x - 1, start_y + 1, progress);
temp += add_next(start_x, start_y + 1, progress, start_x, start_y, true);
temp += add_next(start_x, start_y + 2, progress, start_x, start_y, false);
temp += add_next(start_x - 1, start_y + 1, progress, start_x, start_y, true);
} else {
temp += add_next(start_x - 1, start_y - 1, progress);
temp += add_next(start_x, start_y - 2, progress);
temp += add_next(start_x, start_y - 1, progress);
temp += add_next(start_x - 1, start_y - 1, progress, start_x, start_y, true);
temp += add_next(start_x, start_y - 2, progress, start_x, start_y, false);
temp += add_next(start_x, start_y - 1, progress, start_x, start_y, true);
}
} else {
bool top_is_sea = dat.safe_get_province(glm::ivec2(start_x, start_y / 2)) == 0 || province::from_map_id(dat.safe_get_province(glm::ivec2(start_x, start_y / 2))).index() >= state.province_definitions.first_sea_province.index();
if(top_is_sea) {
temp += add_next(start_x, start_y + 1, progress);
temp += add_next(start_x - 1, start_y, progress);
temp += add_next(start_x, start_y - 1, progress);
temp += add_next(start_x, start_y + 1, progress, start_x, start_y, true);
temp += add_next(start_x - 1, start_y, progress, start_x, start_y, false);
temp += add_next(start_x, start_y - 1, progress, start_x, start_y, true);
} else {
temp += add_next(start_x + 1, start_y - 1, progress);
temp += add_next(start_x + 1, start_y, progress);
temp += add_next(start_x + 1, start_y + 1, progress);
temp += add_next(start_x + 1, start_y - 1, progress, start_x, start_y, true);
temp += add_next(start_x + 1, start_y, progress, start_x, start_y, false);
temp += add_next(start_x + 1, start_y + 1, progress, start_x, start_y, true);
}
}
if(progress) {
Expand Down Expand Up @@ -708,7 +730,6 @@ void add_coastal_loop_vertices(display_data& dat, std::vector<glm::vec2> const&
raw_dist = (current_pos - next_pos) / glm::vec2(dat.size_x, dat.size_y);
raw_dist.x *= 2.0f;
distance += glm::length(raw_dist);

}

// wrap-around
Expand Down

0 comments on commit f618927

Please sign in to comment.