From 4c99014a1371c4acb352c0fa48d6008c8492d440 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20Ka=CC=88fer?= Date: Thu, 15 May 2014 15:16:34 +0200 Subject: [PATCH] don't use fractional texture coordiantes in the shader --- include/llmr/style/sprite.hpp | 5 ++++- src/renderer/painter_icon.cpp | 12 ++++++------ src/shader/icon.fragment.glsl | 2 +- src/shader/shaders_gl.cpp | 2 +- src/shader/shaders_gles2.cpp | 2 +- src/style/sprite.cpp | 10 ++++++++-- 6 files changed, 21 insertions(+), 12 deletions(-) diff --git a/include/llmr/style/sprite.hpp b/include/llmr/style/sprite.hpp index a4752f9eb..58fd2b1ef 100644 --- a/include/llmr/style/sprite.hpp +++ b/include/llmr/style/sprite.hpp @@ -16,6 +16,7 @@ class Map; class SpritePosition { public: + explicit SpritePosition() {} explicit SpritePosition(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint8_t pixelRatio = 1); uint16_t x = 0, y = 0; @@ -40,7 +41,8 @@ public: void load(const std::string& base_url); - ImagePosition getPosition(const std::string& name, bool repeating = false); + ImagePosition getPosition(const std::string& name, bool repeating = false) const; + const SpritePosition &getSpritePosition(const std::string& name) const; bool isLoaded() const; @@ -62,6 +64,7 @@ private: std::string image; std::atomic loaded; std::map pos; + const SpritePosition empty; }; } diff --git a/src/renderer/painter_icon.cpp b/src/renderer/painter_icon.cpp index 37a7b61e5..28e9c6f66 100644 --- a/src/renderer/painter_icon.cpp +++ b/src/renderer/painter_icon.cpp @@ -25,7 +25,7 @@ void Painter::renderIcon(IconBucket& bucket, const std::string& layer_name, cons color[3] *= properties.opacity; auto &sprite = map.getStyle().sprite; - ImagePosition imagePos; + SpritePosition spritePos; if (properties.image.length() && sprite && sprite->isLoaded()) { std::string sized_image = properties.image; @@ -33,12 +33,12 @@ void Painter::renderIcon(IconBucket& bucket, const std::string& layer_name, cons sized_image.append("-"); sized_image.append(std::to_string(static_cast(std::round(properties.size)))); } - imagePos = sprite->getPosition(sized_image, false); + spritePos = sprite->getSpritePosition(sized_image); } const mat4 &vtxMatrix = translatedMatrix(properties.translate, id, properties.translateAnchor); - if (!imagePos.size) { + if (!spritePos.width || !spritePos.height) { useProgram(dotShader->program); dotShader->setMatrix(vtxMatrix); dotShader->setColor(color); @@ -59,8 +59,8 @@ void Painter::renderIcon(IconBucket& bucket, const std::string& layer_name, cons iconShader->setColor(color); iconShader->setImage(0); iconShader->setPosition({{ - 0.5f * (imagePos.tl.x + imagePos.br.x), - 0.5f * (imagePos.tl.y + imagePos.br.y), + spritePos.x + (float)spritePos.width / 2.0f, + spritePos.y + (float)spritePos.height / 2.0f, }}); iconShader->setDimension({{ @@ -70,7 +70,7 @@ void Painter::renderIcon(IconBucket& bucket, const std::string& layer_name, cons sprite->raster.bind(map.getState().isChanging()); - const float iconSize = util::max(imagePos.size.x, imagePos.size.y) + 2; + const float iconSize = util::max(spritePos.width, spritePos.height) + 2; iconShader->setSize(iconSize); #ifndef GL_ES_VERSION_2_0 glPointSize(iconSize); diff --git a/src/shader/icon.fragment.glsl b/src/shader/icon.fragment.glsl index d82bfaa88..f5a424ae9 100644 --- a/src/shader/icon.fragment.glsl +++ b/src/shader/icon.fragment.glsl @@ -5,6 +5,6 @@ uniform vec4 u_color; uniform float u_size; void main() { - vec2 pos = u_pos + (gl_PointCoord - 0.5) * u_size / u_dimension; + vec2 pos = (u_pos + (gl_PointCoord - 0.5) * u_size) / u_dimension; gl_FragColor = texture2D(u_image, pos) * u_color; } diff --git a/src/shader/shaders_gl.cpp b/src/shader/shaders_gl.cpp index b78dc0436..45f1651dc 100644 --- a/src/shader/shaders_gl.cpp +++ b/src/shader/shaders_gl.cpp @@ -12,7 +12,7 @@ const shader_source llmr::shaders[SHADER_COUNT] = { }, { "#version 120\nattribute vec2 a_pos;\nuniform mat4 u_matrix;\nuniform float u_size;\nvoid main ()\n{\n vec4 tmpvar_1;\n tmpvar_1.zw = vec2(0.0, 1.0);\n tmpvar_1.xy = a_pos;\n gl_Position = (u_matrix * tmpvar_1);\n gl_PointSize = u_size;\n}\n\n", - "#version 120\nuniform sampler2D u_image;\nuniform vec2 u_pos;\nuniform vec2 u_dimension;\nuniform vec4 u_color;\nuniform float u_size;\nvoid main ()\n{\n gl_FragColor = (texture2D (u_image, (u_pos + (\n ((gl_PointCoord - 0.5) * u_size)\n / u_dimension))) * u_color);\n}\n\n", + "#version 120\nuniform sampler2D u_image;\nuniform vec2 u_pos;\nuniform vec2 u_dimension;\nuniform vec4 u_color;\nuniform float u_size;\nvoid main ()\n{\n gl_FragColor = (texture2D (u_image, ((u_pos + \n ((gl_PointCoord - 0.5) * u_size)\n ) / u_dimension)) * u_color);\n}\n\n", }, { "#version 120\nattribute vec2 a_pos;\nattribute vec2 a_extrude;\nattribute float a_linesofar;\nuniform mat4 u_matrix;\nuniform mat4 u_exmatrix;\nuniform float u_ratio;\nuniform vec2 u_linewidth;\nvarying vec2 v_normal;\nvarying float v_linesofar;\nvoid main ()\n{\n vec2 normal_1;\n vec2 tmpvar_2;\n tmpvar_2 = (vec2(mod (a_pos, 2.0)));\n normal_1.x = tmpvar_2.x;\n normal_1.y = sign((tmpvar_2.y - 0.5));\n v_normal = normal_1;\n vec4 tmpvar_3;\n tmpvar_3.zw = vec2(0.0, 0.0);\n tmpvar_3.xy = ((u_linewidth.x * a_extrude) * 0.015873);\n vec4 tmpvar_4;\n tmpvar_4.zw = vec2(0.0, 1.0);\n tmpvar_4.xy = floor((a_pos * 0.5));\n gl_Position = ((u_matrix * tmpvar_4) + (u_exmatrix * tmpvar_3));\n v_linesofar = (a_linesofar * u_ratio);\n}\n\n", diff --git a/src/shader/shaders_gles2.cpp b/src/shader/shaders_gles2.cpp index b6d6832a1..d94e04f29 100644 --- a/src/shader/shaders_gles2.cpp +++ b/src/shader/shaders_gles2.cpp @@ -12,7 +12,7 @@ const shader_source llmr::shaders[SHADER_COUNT] = { }, { "precision highp float;\nattribute vec2 a_pos;\nuniform mat4 u_matrix;\nuniform float u_size;\nvoid main ()\n{\n vec4 tmpvar_1;\n tmpvar_1.zw = vec2(0.0, 1.0);\n tmpvar_1.xy = a_pos;\n gl_Position = (u_matrix * tmpvar_1);\n gl_PointSize = u_size;\n}\n\n", - "precision highp float;\nuniform sampler2D u_image;\nuniform vec2 u_pos;\nuniform vec2 u_dimension;\nuniform vec4 u_color;\nuniform float u_size;\nvoid main ()\n{\n mediump vec2 tmpvar_1;\n tmpvar_1 = (u_pos + ((\n (gl_PointCoord - 0.5)\n * u_size) / u_dimension));\n lowp vec4 tmpvar_2;\n tmpvar_2 = (texture2D (u_image, tmpvar_1) * u_color);\n gl_FragColor = tmpvar_2;\n}\n\n", + "precision highp float;\nuniform sampler2D u_image;\nuniform vec2 u_pos;\nuniform vec2 u_dimension;\nuniform vec4 u_color;\nuniform float u_size;\nvoid main ()\n{\n mediump vec2 tmpvar_1;\n tmpvar_1 = ((u_pos + (\n (gl_PointCoord - 0.5)\n * u_size)) / u_dimension);\n lowp vec4 tmpvar_2;\n tmpvar_2 = (texture2D (u_image, tmpvar_1) * u_color);\n gl_FragColor = tmpvar_2;\n}\n\n", }, { "precision highp float;\nattribute vec2 a_pos;\nattribute vec2 a_extrude;\nattribute float a_linesofar;\nuniform mat4 u_matrix;\nuniform mat4 u_exmatrix;\nuniform float u_ratio;\nuniform vec2 u_linewidth;\nvarying vec2 v_normal;\nvarying float v_linesofar;\nvoid main ()\n{\n vec2 normal_1;\n vec2 tmpvar_2;\n tmpvar_2 = (vec2(mod (a_pos, 2.0)));\n normal_1.x = tmpvar_2.x;\n normal_1.y = sign((tmpvar_2.y - 0.5));\n v_normal = normal_1;\n vec4 tmpvar_3;\n tmpvar_3.zw = vec2(0.0, 0.0);\n tmpvar_3.xy = ((u_linewidth.x * a_extrude) * 0.015873);\n vec4 tmpvar_4;\n tmpvar_4.zw = vec2(0.0, 1.0);\n tmpvar_4.xy = floor((a_pos * 0.5));\n gl_Position = ((u_matrix * tmpvar_4) + (u_exmatrix * tmpvar_3));\n v_linesofar = (a_linesofar * u_ratio);\n}\n\n", diff --git a/src/style/sprite.cpp b/src/style/sprite.cpp index 016149385..93dd6bd24 100644 --- a/src/style/sprite.cpp +++ b/src/style/sprite.cpp @@ -107,7 +107,7 @@ void Sprite::parseJSON(std::shared_ptr &sprite) { } } -ImagePosition Sprite::getPosition(const std::string& name, bool repeating) { +ImagePosition Sprite::getPosition(const std::string& name, bool repeating) const { if (!isLoaded()) return ImagePosition {}; // `repeating` indicates that the image will be used in a repeating pattern @@ -118,7 +118,7 @@ ImagePosition Sprite::getPosition(const std::string& name, bool repeating) { auto it = pos.find(name); if (it == pos.end()) return ImagePosition {}; - SpritePosition& pos = it->second; + const SpritePosition& pos = it->second; return ImagePosition { { pos.width, @@ -134,3 +134,9 @@ ImagePosition Sprite::getPosition(const std::string& name, bool repeating) { } }; } + +const SpritePosition &Sprite::getSpritePosition(const std::string& name) const { + if (!isLoaded()) return empty; + auto it = pos.find(name); + return it == pos.end() ? empty : it->second; +}