[core] Move pattern coordinate division by texture size into shader
This makes pattern usage more like icons, and will be necessary for data-driven *-pattern properties.
This commit is contained in:
@@ -45,6 +45,7 @@ FillExtrusionUniforms::values(mat4 matrix,
|
||||
|
||||
FillExtrusionPatternUniforms::Values
|
||||
FillExtrusionPatternUniforms::values(mat4 matrix,
|
||||
Size atlasSize,
|
||||
const SpriteAtlasElement& a,
|
||||
const SpriteAtlasElement& b,
|
||||
const Faded<std::string>& fading,
|
||||
@@ -66,6 +67,7 @@ FillExtrusionPatternUniforms::values(mat4 matrix,
|
||||
uniforms::u_pattern_size_b::Value{ b.size },
|
||||
uniforms::u_scale_a::Value{ fading.fromScale },
|
||||
uniforms::u_scale_b::Value{ fading.toScale },
|
||||
uniforms::u_texsize::Value{ atlasSize },
|
||||
uniforms::u_mix::Value{ fading.t },
|
||||
uniforms::u_image::Value{ 0 },
|
||||
uniforms::u_pixel_coord_upper::Value{ std::array<float, 2>{{ float(pixelX >> 16), float(pixelY >> 16) }} },
|
||||
|
||||
@@ -55,6 +55,7 @@ struct FillExtrusionPatternUniforms : gl::Uniforms<
|
||||
uniforms::u_pattern_size_b,
|
||||
uniforms::u_scale_a,
|
||||
uniforms::u_scale_b,
|
||||
uniforms::u_texsize,
|
||||
uniforms::u_mix,
|
||||
uniforms::u_image,
|
||||
uniforms::u_pixel_coord_upper,
|
||||
@@ -66,6 +67,7 @@ struct FillExtrusionPatternUniforms : gl::Uniforms<
|
||||
uniforms::u_lightintensity>
|
||||
{
|
||||
static Values values(mat4,
|
||||
Size atlasSize,
|
||||
const SpriteAtlasElement&,
|
||||
const SpriteAtlasElement&,
|
||||
const Faded<std::string>&,
|
||||
|
||||
@@ -13,6 +13,7 @@ static_assert(sizeof(FillLayoutVertex) == 4, "expected FillLayoutVertex size");
|
||||
FillPatternUniforms::Values
|
||||
FillPatternUniforms::values(mat4 matrix,
|
||||
Size framebufferSize,
|
||||
Size atlasSize,
|
||||
const SpriteAtlasElement& a,
|
||||
const SpriteAtlasElement& b,
|
||||
const Faded<std::string>& fading,
|
||||
@@ -26,6 +27,7 @@ FillPatternUniforms::values(mat4 matrix,
|
||||
return FillPatternUniforms::Values {
|
||||
uniforms::u_matrix::Value{ matrix },
|
||||
uniforms::u_world::Value{ framebufferSize },
|
||||
uniforms::u_texsize::Value{ atlasSize },
|
||||
uniforms::u_pattern_tl_a::Value{ a.tl },
|
||||
uniforms::u_pattern_br_a::Value{ a.br },
|
||||
uniforms::u_pattern_tl_b::Value{ b.tl },
|
||||
|
||||
@@ -33,6 +33,7 @@ struct FillUniforms : gl::Uniforms<
|
||||
struct FillPatternUniforms : gl::Uniforms<
|
||||
uniforms::u_matrix,
|
||||
uniforms::u_world,
|
||||
uniforms::u_texsize,
|
||||
uniforms::u_pattern_tl_a,
|
||||
uniforms::u_pattern_br_a,
|
||||
uniforms::u_pattern_tl_b,
|
||||
@@ -49,6 +50,7 @@ struct FillPatternUniforms : gl::Uniforms<
|
||||
{
|
||||
static Values values(mat4 matrix,
|
||||
Size framebufferSize,
|
||||
Size atlasSize,
|
||||
const SpriteAtlasElement&,
|
||||
const SpriteAtlasElement&,
|
||||
const Faded<std::string>&,
|
||||
|
||||
@@ -88,6 +88,7 @@ LinePatternProgram::uniformValues(const LinePaintProperties::PossiblyEvaluated&
|
||||
const RenderTile& tile,
|
||||
const TransformState& state,
|
||||
const std::array<float, 2>& pixelsToGLUnits,
|
||||
const Size atlasSize,
|
||||
const SpriteAtlasElement& posA,
|
||||
const SpriteAtlasElement& posB) {
|
||||
std::array<float, 2> sizeA {{
|
||||
@@ -111,6 +112,7 @@ LinePatternProgram::uniformValues(const LinePaintProperties::PossiblyEvaluated&
|
||||
uniforms::u_pattern_br_b::Value{ posB.br },
|
||||
uniforms::u_pattern_size_a::Value{ sizeA },
|
||||
uniforms::u_pattern_size_b::Value{ sizeB },
|
||||
uniforms::u_texsize::Value{ atlasSize },
|
||||
uniforms::u_fade::Value{ properties.get<LinePattern>().t },
|
||||
uniforms::u_image::Value{ 0 }
|
||||
);
|
||||
|
||||
@@ -112,6 +112,7 @@ class LinePatternProgram : public Program<
|
||||
uniforms::u_pattern_br_b,
|
||||
uniforms::u_pattern_size_a,
|
||||
uniforms::u_pattern_size_b,
|
||||
uniforms::u_texsize,
|
||||
uniforms::u_fade,
|
||||
uniforms::u_image>,
|
||||
style::LinePaintProperties>
|
||||
@@ -123,6 +124,7 @@ public:
|
||||
const RenderTile&,
|
||||
const TransformState&,
|
||||
const std::array<float, 2>& pixelsToGLUnits,
|
||||
Size atlasSize,
|
||||
const SpriteAtlasElement& posA,
|
||||
const SpriteAtlasElement& posB);
|
||||
};
|
||||
|
||||
@@ -51,7 +51,7 @@ Values makeValues(const bool isText,
|
||||
values.translateAnchor,
|
||||
state) },
|
||||
uniforms::u_extrude_scale::Value{ extrudeScale },
|
||||
uniforms::u_texsize::Value{ std::array<float, 2> {{ float(texsize.width), float(texsize.height) }} },
|
||||
uniforms::u_texsize::Value{ texsize },
|
||||
uniforms::u_zoom::Value{ float(state.getZoom()) },
|
||||
uniforms::u_rotate_with_map::Value{ values.rotationAlignment == AlignmentType::Map },
|
||||
uniforms::u_texture::Value{ 0 },
|
||||
|
||||
@@ -29,7 +29,6 @@ class RenderTile;
|
||||
class TransformState;
|
||||
|
||||
namespace uniforms {
|
||||
MBGL_DEFINE_UNIFORM_VECTOR(float, 2, u_texsize);
|
||||
MBGL_DEFINE_UNIFORM_SCALAR(bool, u_rotate_with_map);
|
||||
MBGL_DEFINE_UNIFORM_SCALAR(bool, u_pitch_with_map);
|
||||
MBGL_DEFINE_UNIFORM_SCALAR(gl::TextureUnit, u_texture);
|
||||
|
||||
@@ -18,6 +18,7 @@ MBGL_DEFINE_UNIFORM_SCALAR(float, u_pitch);
|
||||
MBGL_DEFINE_UNIFORM_SCALAR(float, u_bearing);
|
||||
|
||||
MBGL_DEFINE_UNIFORM_SCALAR(Size, u_world);
|
||||
MBGL_DEFINE_UNIFORM_SCALAR(Size, u_texsize);
|
||||
|
||||
MBGL_DEFINE_UNIFORM_VECTOR(float, 2, u_extrude_scale);
|
||||
|
||||
|
||||
@@ -42,6 +42,7 @@ void Painter::renderBackground(PaintParameters& parameters, const RenderBackgrou
|
||||
FillPatternUniforms::values(
|
||||
matrixForTile(tileID),
|
||||
context.viewport.getCurrentValue().size,
|
||||
spriteAtlas->getSize(),
|
||||
*imagePosA,
|
||||
*imagePosB,
|
||||
background.get<BackgroundPattern>(),
|
||||
|
||||
@@ -49,6 +49,7 @@ void Painter::renderFill(PaintParameters& parameters,
|
||||
properties.get<FillTranslateAnchor>(),
|
||||
state),
|
||||
context.viewport.getCurrentValue().size,
|
||||
spriteAtlas->getSize(),
|
||||
*imagePosA,
|
||||
*imagePosB,
|
||||
properties.get<FillPattern>(),
|
||||
|
||||
@@ -46,6 +46,7 @@ void Painter::renderFillExtrusion(PaintParameters& parameters,
|
||||
tile.translatedClipMatrix(properties.get<FillExtrusionTranslate>(),
|
||||
properties.get<FillExtrusionTranslateAnchor>(),
|
||||
state),
|
||||
spriteAtlas->getSize(),
|
||||
*imagePosA,
|
||||
*imagePosB,
|
||||
properties.get<FillExtrusionPattern>(),
|
||||
|
||||
@@ -75,6 +75,7 @@ void Painter::renderLine(PaintParameters& parameters,
|
||||
tile,
|
||||
state,
|
||||
pixelsToGLUnits,
|
||||
spriteAtlas->getSize(),
|
||||
*posA,
|
||||
*posB));
|
||||
|
||||
|
||||
@@ -73,6 +73,7 @@ uniform vec2 u_pattern_tl_a;
|
||||
uniform vec2 u_pattern_br_a;
|
||||
uniform vec2 u_pattern_tl_b;
|
||||
uniform vec2 u_pattern_br_b;
|
||||
uniform vec2 u_texsize;
|
||||
uniform float u_mix;
|
||||
|
||||
uniform sampler2D u_image;
|
||||
@@ -89,11 +90,11 @@ void main() {
|
||||
|
||||
|
||||
vec2 imagecoord = mod(v_pos_a, 1.0);
|
||||
vec2 pos = mix(u_pattern_tl_a, u_pattern_br_a, imagecoord);
|
||||
vec2 pos = mix(u_pattern_tl_a / u_texsize, u_pattern_br_a / u_texsize, imagecoord);
|
||||
vec4 color1 = texture2D(u_image, pos);
|
||||
|
||||
vec2 imagecoord_b = mod(v_pos_b, 1.0);
|
||||
vec2 pos2 = mix(u_pattern_tl_b, u_pattern_br_b, imagecoord_b);
|
||||
vec2 pos2 = mix(u_pattern_tl_b / u_texsize, u_pattern_br_b / u_texsize, imagecoord_b);
|
||||
vec4 color2 = texture2D(u_image, pos2);
|
||||
|
||||
vec4 mixedColor = mix(color1, color2, u_mix);
|
||||
|
||||
@@ -41,7 +41,7 @@ void main() {
|
||||
|
||||
|
||||
float dist = length(v_pos - gl_FragCoord.xy);
|
||||
float alpha = smoothstep(1.0, 0.0, dist);
|
||||
float alpha = 1.0 - smoothstep(0.0, 1.0, dist);
|
||||
gl_FragColor = outline_color * (alpha * opacity);
|
||||
|
||||
#ifdef OVERDRAW_INSPECTOR
|
||||
|
||||
@@ -44,6 +44,7 @@ uniform vec2 u_pattern_tl_a;
|
||||
uniform vec2 u_pattern_br_a;
|
||||
uniform vec2 u_pattern_tl_b;
|
||||
uniform vec2 u_pattern_br_b;
|
||||
uniform vec2 u_texsize;
|
||||
uniform float u_mix;
|
||||
|
||||
uniform sampler2D u_image;
|
||||
@@ -58,17 +59,17 @@ void main() {
|
||||
|
||||
|
||||
vec2 imagecoord = mod(v_pos_a, 1.0);
|
||||
vec2 pos = mix(u_pattern_tl_a, u_pattern_br_a, imagecoord);
|
||||
vec2 pos = mix(u_pattern_tl_a / u_texsize, u_pattern_br_a / u_texsize, imagecoord);
|
||||
vec4 color1 = texture2D(u_image, pos);
|
||||
|
||||
vec2 imagecoord_b = mod(v_pos_b, 1.0);
|
||||
vec2 pos2 = mix(u_pattern_tl_b, u_pattern_br_b, imagecoord_b);
|
||||
vec2 pos2 = mix(u_pattern_tl_b / u_texsize, u_pattern_br_b / u_texsize, imagecoord_b);
|
||||
vec4 color2 = texture2D(u_image, pos2);
|
||||
|
||||
// find distance to outline for alpha interpolation
|
||||
|
||||
float dist = length(v_pos - gl_FragCoord.xy);
|
||||
float alpha = smoothstep(1.0, 0.0, dist);
|
||||
float alpha = 1.0 - smoothstep(0.0, 1.0, dist);
|
||||
|
||||
|
||||
gl_FragColor = mix(color1, color2, u_mix) * alpha * opacity;
|
||||
|
||||
@@ -40,6 +40,7 @@ uniform vec2 u_pattern_tl_a;
|
||||
uniform vec2 u_pattern_br_a;
|
||||
uniform vec2 u_pattern_tl_b;
|
||||
uniform vec2 u_pattern_br_b;
|
||||
uniform vec2 u_texsize;
|
||||
uniform float u_mix;
|
||||
|
||||
uniform sampler2D u_image;
|
||||
@@ -53,11 +54,11 @@ void main() {
|
||||
|
||||
|
||||
vec2 imagecoord = mod(v_pos_a, 1.0);
|
||||
vec2 pos = mix(u_pattern_tl_a, u_pattern_br_a, imagecoord);
|
||||
vec2 pos = mix(u_pattern_tl_a / u_texsize, u_pattern_br_a / u_texsize, imagecoord);
|
||||
vec4 color1 = texture2D(u_image, pos);
|
||||
|
||||
vec2 imagecoord_b = mod(v_pos_b, 1.0);
|
||||
vec2 pos2 = mix(u_pattern_tl_b, u_pattern_br_b, imagecoord_b);
|
||||
vec2 pos2 = mix(u_pattern_tl_b / u_texsize, u_pattern_br_b / u_texsize, imagecoord_b);
|
||||
vec4 color2 = texture2D(u_image, pos2);
|
||||
|
||||
gl_FragColor = mix(color1, color2, u_mix) * opacity;
|
||||
|
||||
@@ -111,6 +111,7 @@ uniform vec2 u_pattern_tl_a;
|
||||
uniform vec2 u_pattern_br_a;
|
||||
uniform vec2 u_pattern_tl_b;
|
||||
uniform vec2 u_pattern_br_b;
|
||||
uniform vec2 u_texsize;
|
||||
uniform float u_fade;
|
||||
|
||||
uniform sampler2D u_image;
|
||||
@@ -140,8 +141,8 @@ void main() {
|
||||
float x_b = mod(v_linesofar / u_pattern_size_b.x, 1.0);
|
||||
float y_a = 0.5 + (v_normal.y * v_width2.s / u_pattern_size_a.y);
|
||||
float y_b = 0.5 + (v_normal.y * v_width2.s / u_pattern_size_b.y);
|
||||
vec2 pos_a = mix(u_pattern_tl_a, u_pattern_br_a, vec2(x_a, y_a));
|
||||
vec2 pos_b = mix(u_pattern_tl_b, u_pattern_br_b, vec2(x_b, y_b));
|
||||
vec2 pos_a = mix(u_pattern_tl_a / u_texsize, u_pattern_br_a / u_texsize, vec2(x_a, y_a));
|
||||
vec2 pos_b = mix(u_pattern_tl_b / u_texsize, u_pattern_br_b / u_texsize, vec2(x_b, y_b));
|
||||
|
||||
vec4 color = mix(texture2D(u_image, pos_a), texture2D(u_image, pos_b), u_fade);
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@ static constexpr uint32_t padding = 1;
|
||||
|
||||
SpriteAtlasElement::SpriteAtlasElement(Rect<uint16_t> rect_,
|
||||
const style::Image::Impl& image,
|
||||
Size size_, float pixelRatio)
|
||||
float pixelRatio)
|
||||
: pos(std::move(rect_)),
|
||||
sdf(image.sdf),
|
||||
relativePixelRatio(image.pixelRatio / pixelRatio),
|
||||
@@ -28,8 +28,8 @@ SpriteAtlasElement::SpriteAtlasElement(Rect<uint16_t> rect_,
|
||||
const float w = image.image.size.width / pixelRatio;
|
||||
const float h = image.image.size.height / pixelRatio;
|
||||
|
||||
tl = {{ float(pos.x + padding) / size_.width, float(pos.y + padding) / size_.height }};
|
||||
br = {{ float(pos.x + padding + w) / size_.width, float(pos.y + padding + h) / size_.height }};
|
||||
tl = {{ float(pos.x + padding), float(pos.y + padding) }};
|
||||
br = {{ float(pos.x + padding + w), float(pos.y + padding + h) }};
|
||||
}
|
||||
|
||||
SpriteAtlas::SpriteAtlas(Size size_, float pixelRatio_)
|
||||
@@ -142,7 +142,6 @@ optional<SpriteAtlasElement> SpriteAtlas::getImage(const std::string& id,
|
||||
return SpriteAtlasElement {
|
||||
*(entry.*entryRect),
|
||||
*entry.image,
|
||||
size,
|
||||
pixelRatio
|
||||
};
|
||||
}
|
||||
@@ -164,7 +163,6 @@ optional<SpriteAtlasElement> SpriteAtlas::getImage(const std::string& id,
|
||||
return SpriteAtlasElement {
|
||||
rect,
|
||||
*entry.image,
|
||||
size,
|
||||
pixelRatio
|
||||
};
|
||||
}
|
||||
|
||||
@@ -20,7 +20,7 @@ class Context;
|
||||
|
||||
class SpriteAtlasElement {
|
||||
public:
|
||||
SpriteAtlasElement(Rect<uint16_t>, const style::Image::Impl&, Size size, float pixelRatio);
|
||||
SpriteAtlasElement(Rect<uint16_t>, const style::Image::Impl&, float pixelRatio);
|
||||
|
||||
Rect<uint16_t> pos;
|
||||
bool sdf;
|
||||
|
||||
Reference in New Issue
Block a user