don't use fractional texture coordiantes in the shader
This commit is contained in:
@@ -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<bool> loaded;
|
||||
std::map<std::string, SpritePosition> pos;
|
||||
const SpritePosition empty;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
@@ -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<int>(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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -107,7 +107,7 @@ void Sprite::parseJSON(std::shared_ptr<Sprite> &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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user