Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
### ✨ New features

- *...Add new stuff here...*
- [core] Add support for colorizing SDF fill patterns with `fill-color` ([#4526](https://github.com/maplibre/maplibre-native/issues/4526)).
- [core] Locally rasterized CJK glyphs now render at 2x texture resolution, preserving fine strokes. Mirrors [maplibre-gl-js#3006](https://github.com/maplibre/maplibre-gl-js/pull/3006).
- [core] Added new map observer events: onPreCompileShader, onPostCompileShader, onShaderCompileFailed, onGlyphsLoaded, onGlyphsError, onGlyphsRequested, onTileAction, onSpriteLoaded, onSpriteError, onSpriteRequested ([#2694](https://github.com/maplibre/maplibre-native/pull/2694)).
- [core] Add WebP image decoding support to default platform (Linux, Windows)
Expand Down
21 changes: 15 additions & 6 deletions include/mln/shaders/fill_layer_ubo.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -48,15 +48,19 @@ struct alignas(16) FillPatternDrawableUBO {
/* 84 */ float pattern_from_t;
/* 88 */ float pattern_to_t;
/* 92 */ float opacity_t;
/* 96 */
/* 96 */ float color_t;
/*100 */ float pad1;
/*104 */ float pad2;
/*108 */ float pad3;
/*112 */
};
static_assert(sizeof(FillPatternDrawableUBO) == 6 * 16);
static_assert(sizeof(FillPatternDrawableUBO) == 7 * 16);

struct alignas(16) FillPatternTilePropsUBO {
/* 0 */ std::array<float, 4> pattern_from;
/* 16 */ std::array<float, 4> pattern_to;
/* 32 */ std::array<float, 2> texsize;
/* 40 */ float pad1;
/* 40 */ float sdf;
/* 44 */ float pad2;
/* 48 */
};
Expand All @@ -75,15 +79,19 @@ struct alignas(16) FillOutlinePatternDrawableUBO {
/* 84 */ float pattern_from_t;
/* 88 */ float pattern_to_t;
/* 92 */ float opacity_t;
/* 96 */
/* 96 */ float color_t;
/*100 */ float pad1;
/*104 */ float pad2;
/*108 */ float pad3;
/*112 */
};
static_assert(sizeof(FillOutlinePatternDrawableUBO) == 6 * 16);
static_assert(sizeof(FillOutlinePatternDrawableUBO) == 7 * 16);

struct alignas(16) FillOutlinePatternTilePropsUBO {
/* 0 */ std::array<float, 4> pattern_from;
/* 16 */ std::array<float, 4> pattern_to;
/* 32 */ std::array<float, 2> texsize;
/* 40 */ float pad1;
/* 40 */ float sdf;
/* 44 */ float pad2;
/* 48 */
};
Expand Down Expand Up @@ -123,6 +131,7 @@ union FillDrawableUnionUBO {
FillOutlinePatternDrawableUBO fillOutlinePatternDrawableUBO;
FillOutlineTriangulatedDrawableUBO fillOutlineTriangulatedDrawableUBO;
};
static_assert(sizeof(FillDrawableUnionUBO) == 7 * 16);

union FillTilePropsUnionUBO {
FillPatternTilePropsUBO fillPatternTilePropsUBO;
Expand Down
40 changes: 34 additions & 6 deletions include/mln/shaders/gl/fill_outline_pattern.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,13 +29,17 @@ layout (std140) uniform FillOutlinePatternDrawableUBO {
highp float u_pattern_from_t;
highp float u_pattern_to_t;
highp float u_opacity_t;
highp float u_color_t;
lowp float drawable_pad1;
lowp float drawable_pad2;
lowp float drawable_pad3;
};

layout (std140) uniform FillOutlinePatternTilePropsUBO {
highp vec4 u_pattern_from;
highp vec4 u_pattern_to;
highp vec2 u_texsize;
lowp float tileprops_pad1;
lowp float u_sdf;
lowp float tileprops_pad2;
};

Expand All @@ -54,20 +58,29 @@ out vec2 v_pos_a;
out vec2 v_pos_b;
out vec2 v_pos;

#ifndef HAS_UNIFORM_u_color
layout (location = 1) in highp vec4 a_color;
out highp vec4 color;
#endif
#ifndef HAS_UNIFORM_u_opacity
layout (location = 1) in lowp vec2 a_opacity;
layout (location = 2) in lowp vec2 a_opacity;
out lowp float opacity;
#endif
#ifndef HAS_UNIFORM_u_pattern_from
layout (location = 2) in lowp vec4 a_pattern_from;
layout (location = 3) in lowp vec4 a_pattern_from;
out lowp vec4 pattern_from;
#endif
#ifndef HAS_UNIFORM_u_pattern_to
layout (location = 3) in lowp vec4 a_pattern_to;
layout (location = 4) in lowp vec4 a_pattern_to;
out lowp vec4 pattern_to;
#endif

void main() {
#ifndef HAS_UNIFORM_u_color
color = unpack_mix_color(a_color, u_color_t);
#else
highp vec4 color = u_color;
#endif
#ifndef HAS_UNIFORM_u_opacity
opacity = unpack_mix_vec2(a_opacity, u_opacity_t);
#else
Expand Down Expand Up @@ -109,7 +122,7 @@ mediump vec4 pattern_to = u_pattern_to;
highp vec4 u_pattern_from;
highp vec4 u_pattern_to;
highp vec2 u_texsize;
lowp float tileprops_pad1;
lowp float u_sdf;
lowp float tileprops_pad2;
};

Expand All @@ -128,6 +141,9 @@ in vec2 v_pos_a;
in vec2 v_pos_b;
in vec2 v_pos;

#ifndef HAS_UNIFORM_u_color
in highp vec4 color;
#endif
#ifndef HAS_UNIFORM_u_opacity
in lowp float opacity;
#endif
Expand All @@ -139,6 +155,9 @@ in lowp vec4 pattern_to;
#endif

void main() {
#ifdef HAS_UNIFORM_u_color
highp vec4 color = u_color;
#endif
#ifdef HAS_UNIFORM_u_opacity
lowp float opacity = u_opacity;
#endif
Expand Down Expand Up @@ -168,7 +187,16 @@ mediump vec4 pattern_to = u_pattern_to;
float alpha = 1.0 - smoothstep(0.0, 1.0, dist);


fragColor = mix(color1, color2, u_fade) * alpha * opacity;
if (u_sdf > 0.5) {
highp float sdf_edge = (256.0 - 64.0) / 256.0;
highp float sdf_gamma_a = max(fwidth(color1.a) * 0.5, 1.0 / 255.0 / 16.0);
highp float sdf_gamma_b = max(fwidth(color2.a) * 0.5, 1.0 / 255.0 / 16.0);
float sdf_alpha_a = smoothstep(sdf_edge - sdf_gamma_a, sdf_edge + sdf_gamma_a, color1.a);
float sdf_alpha_b = smoothstep(sdf_edge - sdf_gamma_b, sdf_edge + sdf_gamma_b, color2.a);
fragColor = mix(color * sdf_alpha_a, color * sdf_alpha_b, u_fade) * alpha * opacity;
} else {
fragColor = mix(color1, color2, u_fade) * alpha * opacity;
}

#ifdef OVERDRAW_INSPECTOR
fragColor = vec4(1.0);
Expand Down
40 changes: 34 additions & 6 deletions include/mln/shaders/gl/fill_pattern.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,13 +29,17 @@ layout (std140) uniform FillPatternDrawableUBO {
highp float u_pattern_from_t;
highp float u_pattern_to_t;
highp float u_opacity_t;
highp float u_color_t;
lowp float drawable_pad1;
lowp float drawable_pad2;
lowp float drawable_pad3;
};

layout (std140) uniform FillPatternTilePropsUBO {
highp vec4 u_pattern_from;
highp vec4 u_pattern_to;
highp vec2 u_texsize;
lowp float tileprops_pad1;
lowp float u_sdf;
lowp float tileprops_pad2;
};

Expand All @@ -53,20 +57,29 @@ layout (location = 0) in vec2 a_pos;
out vec2 v_pos_a;
out vec2 v_pos_b;

#ifndef HAS_UNIFORM_u_color
layout (location = 1) in highp vec4 a_color;
out highp vec4 color;
#endif
#ifndef HAS_UNIFORM_u_opacity
layout (location = 1) in lowp vec2 a_opacity;
layout (location = 2) in lowp vec2 a_opacity;
out lowp float opacity;
#endif
#ifndef HAS_UNIFORM_u_pattern_from
layout (location = 2) in lowp vec4 a_pattern_from;
layout (location = 3) in lowp vec4 a_pattern_from;
out lowp vec4 pattern_from;
#endif
#ifndef HAS_UNIFORM_u_pattern_to
layout (location = 3) in lowp vec4 a_pattern_to;
layout (location = 4) in lowp vec4 a_pattern_to;
out lowp vec4 pattern_to;
#endif

void main() {
#ifndef HAS_UNIFORM_u_color
color = unpack_mix_color(a_color, u_color_t);
#else
highp vec4 color = u_color;
#endif
#ifndef HAS_UNIFORM_u_opacity
opacity = unpack_mix_vec2(a_opacity, u_opacity_t);
#else
Expand Down Expand Up @@ -105,7 +118,7 @@ mediump vec4 pattern_to = u_pattern_to;
highp vec4 u_pattern_from;
highp vec4 u_pattern_to;
highp vec2 u_texsize;
lowp float tileprops_pad1;
lowp float u_sdf;
lowp float tileprops_pad2;
};

Expand All @@ -123,6 +136,9 @@ uniform sampler2D u_image;
in vec2 v_pos_a;
in vec2 v_pos_b;

#ifndef HAS_UNIFORM_u_color
in highp vec4 color;
#endif
#ifndef HAS_UNIFORM_u_opacity
in lowp float opacity;
#endif
Expand All @@ -134,6 +150,9 @@ in lowp vec4 pattern_to;
#endif

void main() {
#ifdef HAS_UNIFORM_u_color
highp vec4 color = u_color;
#endif
#ifdef HAS_UNIFORM_u_opacity
lowp float opacity = u_opacity;
#endif
Expand Down Expand Up @@ -161,7 +180,16 @@ mediump vec4 pattern_to = u_pattern_to;
vec2 pos2 = mix(pattern_tl_b / u_texsize, pattern_br_b / u_texsize, imagecoord_b);
vec4 color2 = texture(u_image, pos2);

fragColor = mix(color1, color2, u_fade) * opacity;
if (u_sdf > 0.5) {
highp float sdf_edge = (256.0 - 64.0) / 256.0;
highp float sdf_gamma_a = max(fwidth(color1.a) * 0.5, 1.0 / 255.0 / 16.0);
highp float sdf_gamma_b = max(fwidth(color2.a) * 0.5, 1.0 / 255.0 / 16.0);
float sdf_alpha_a = smoothstep(sdf_edge - sdf_gamma_a, sdf_edge + sdf_gamma_a, color1.a);
float sdf_alpha_b = smoothstep(sdf_edge - sdf_gamma_b, sdf_edge + sdf_gamma_b, color2.a);
fragColor = mix(color * sdf_alpha_a, color * sdf_alpha_b, u_fade) * opacity;
} else {
fragColor = mix(color1, color2, u_fade) * opacity;
}

#ifdef OVERDRAW_INSPECTOR
fragColor = vec4(1.0);
Expand Down
Loading