don't use fractional texture coordiantes in the shader

This commit is contained in:
Konstantin Käfer
2014-05-15 15:16:34 +02:00
parent 27b695b068
commit 4c99014a13
6 changed files with 21 additions and 12 deletions

View File

@@ -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;
};
}

View File

@@ -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);

View File

@@ -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;
}

View File

@@ -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",

View File

@@ -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",

View File

@@ -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;
}