diff options
author | Konstantin Käfer <mail@kkaefer.com> | 2014-05-15 17:19:14 +0200 |
---|---|---|
committer | Konstantin Käfer <mail@kkaefer.com> | 2014-05-19 10:48:36 +0200 |
commit | 27f8ed29e4b79a917b4aa715469bc22018a06037 (patch) | |
tree | 935bbabce976b5cb095dd050a91d7adfc9401e6b | |
parent | 264bcd34d9f3661755e8030e889de2000d662ea1 (diff) | |
download | qtlocation-mapboxgl-27f8ed29e4b79a917b4aa715469bc22018a06037.tar.gz |
encode icon texture coordinate in buffer so we can render all pois with 1 draw call
-rw-r--r-- | bin/style.js | 182 | ||||
-rw-r--r-- | include/llmr/geometry/buffer.hpp | 38 | ||||
-rw-r--r-- | include/llmr/geometry/icon_buffer.hpp | 5 | ||||
-rw-r--r-- | include/llmr/map/tile_parser.hpp | 1 | ||||
-rw-r--r-- | include/llmr/renderer/icon_bucket.hpp | 5 | ||||
-rw-r--r-- | include/llmr/shader/icon_shader.hpp | 5 | ||||
-rw-r--r-- | include/llmr/style/bucket_description.hpp | 5 | ||||
-rw-r--r-- | src/geometry/icon_buffer.cpp | 10 | ||||
-rw-r--r-- | src/map/tile_parser.cpp | 19 | ||||
-rw-r--r-- | src/renderer/icon_bucket.cpp | 27 | ||||
-rw-r--r-- | src/renderer/painter_icon.cpp | 22 | ||||
-rw-r--r-- | src/renderer/painter_text.cpp | 4 | ||||
-rw-r--r-- | src/renderer/text_bucket.cpp | 2 | ||||
-rw-r--r-- | src/shader/dot_shader.cpp | 2 | ||||
-rw-r--r-- | src/shader/icon.fragment.glsl | 5 | ||||
-rw-r--r-- | src/shader/icon.vertex.glsl | 4 | ||||
-rw-r--r-- | src/shader/icon_shader.cpp | 15 | ||||
-rw-r--r-- | src/shader/shaders_gl.cpp | 4 | ||||
-rw-r--r-- | src/shader/shaders_gles2.cpp | 4 | ||||
-rw-r--r-- | src/style/bucket_description.cpp | 2 | ||||
-rw-r--r-- | src/style/style_parser.cpp | 8 | ||||
-rw-r--r-- | src/text/placement.cpp | 2 |
22 files changed, 119 insertions, 252 deletions
diff --git a/bin/style.js b/bin/style.js index 4bd98db8db..558c642422 100644 --- a/bin/style.js +++ b/bin/style.js @@ -452,116 +452,13 @@ module.exports = { "feature_type": "point", "type": "text" }, - "poi_airport": { + "poi": { "source": "mapbox streets", "layer": "poi_label", - "field": "maki", - "value": "airport", - "size": { - "x": 12, - "y": 12 - }, - "type": "point" - }, - "poi_rail": { - "source": "mapbox streets", - "layer": "poi_label", - "field": "maki", - "value": "rail", - "size": { - "x": 12, - "y": 12 - }, - "type": "point" - }, - "poi_fire_station": { - "source": "mapbox streets", - "layer": "poi_label", - "field": "maki", - "value": "fire-station", - "size": { - "x": 12, - "y": 12 - }, - "type": "point" - }, - "poi_bus": { - "source": "mapbox streets", - "layer": "poi_label", - "field": "maki", - "value": "bus", - "size": { - "x": 12, - "y": 12 - }, - "type": "point" - }, - "poi_restaurant": { - "source": "mapbox streets", - "layer": "poi_label", - "field": "maki", - "value": "restaurant", - "size": { - "x": 12, - "y": 12 - }, - "type": "point" - }, - "poi_park": { - "source": "mapbox streets", - "layer": "poi_label", - "field": "maki", - "value": "park", - "size": { - "x": 12, - "y": 12 - }, - "type": "point" - }, - "poi_playground": { - "source": "mapbox streets", - "layer": "poi_label", - "field": "maki", - "value": "playground", - "size": { - "x": 12, - "y": 12 - }, - "type": "point" - }, - "poi_hospital": { - "source": "mapbox streets", - "layer": "poi_label", - "field": "maki", - "value": "hospital", - "size": { - "x": 12, - "y": 12 - }, + "icon": "maki", + "size": 12, "type": "point" }, - "poi_cafe": { - "source": "mapbox streets", - "layer": "poi_label", - "field": "maki", - "value": "cafe", - "size": { - "x": 12, - "y": 12 - }, - "type": "point" - }, - "poi_beer": { - "source": "mapbox streets", - "layer": "poi_label", - "field": "maki", - "value": "beer", - "size": { - "x": 12, - "y": 12 - }, - "type": "point" - } }, "constants": { "land": "#f8f4f0", @@ -802,41 +699,11 @@ module.exports = { "name": "road_label", "bucket": "road_label" }, { - "name": "poi_label", - "bucket": "poi_label" - }, { "name": "water_label", "bucket": "water_label" }, { - "name": "poi_airport", - "bucket": "poi_airport" - }, { - "name": "poi_rail", - "bucket": "poi_rail" - }, { - "name": "poi_bus", - "bucket": "poi_bus" - }, { - "name": "poi_fire_station", - "bucket": "poi_fire_station" - }, { - "name": "poi_restaurant", - "bucket": "poi_restaurant" - }, { - "name": "poi_park", - "bucket": "poi_park" - }, { - "name": "poi_hospital", - "bucket": "poi_hospital" - }, { - "name": "poi_playground", - "bucket": "poi_playground" - }, { - "name": "poi_cafe", - "bucket": "poi_cafe" - }, { - "name": "poi_beer", - "bucket": "poi_beer" + "name": "poi", + "bucket": "poi" }], "classes": [{ "name": "default", @@ -2010,45 +1877,8 @@ module.exports = { 0.75 ], }, - "poi_airport": { - "color": "maki", - "image": "airport-12", - }, - "poi_restaurant": { - "color": "maki", - "image": "restaurant-12", - }, - "poi_bus": { - "color": "maki", - "image": "bus-12", - }, - "poi_rail": { - "color": "maki", - "image": "rail-12", - }, - "poi_fire_station": { - "color": "maki", - "image": "fire-station-12", - }, - "poi_park": { - "color": "maki", - "image": "park-12", - }, - "poi_hospital": { - "color": "maki", - "image": "hospital-12", - }, - "poi_playground": { - "color": "maki", - "image": "playground-12", - }, - "poi_cafe": { - "color": "maki", - "image": "cafe-12", - }, - "poi_beer": { + "poi": { "color": "maki", - "image": "beer-12", }, "satellite": { "type": "raster", diff --git a/include/llmr/geometry/buffer.hpp b/include/llmr/geometry/buffer.hpp index 89adfb37f7..0e31cf4381 100644 --- a/include/llmr/geometry/buffer.hpp +++ b/include/llmr/geometry/buffer.hpp @@ -11,15 +11,13 @@ namespace llmr { template < size_t item_size, int bufferType = GL_ARRAY_BUFFER, - size_t defaultLength = 8192 + size_t defaultLength = 8192, + bool retainAfterUpload = false > class Buffer : private util::noncopyable { public: ~Buffer() { - if (array) { - free(array); - array = nullptr; - } + cleanup(); if (buffer != 0) { glDeleteBuffers(1, &buffer); buffer = 0; @@ -33,19 +31,28 @@ public: } // Transfers this buffer to the GPU and binds the buffer to the GL context. - void bind() { + void bind(bool force = false) { if (buffer == 0) { glGenBuffers(1, &buffer); - glBindBuffer(bufferType, buffer); + force = true; + } + glBindBuffer(bufferType, buffer); + if (force) { + assert("Buffer was already deleted" && array != nullptr); glBufferData(bufferType, pos, array, GL_STATIC_DRAW); + if (!retainAfterUpload) { + cleanup(); + } + } + } + + void cleanup() { + if (array) { free(array); array = nullptr; - } else { - glBindBuffer(bufferType, buffer); } } - protected: // increase the buffer size by at least /required/ bytes. inline void *addElement() { @@ -59,6 +66,17 @@ protected: return static_cast<char *>(array) + (pos - itemSize); } + // Get a pointer to the item at a given index. + inline void *getElement(size_t index) { + assert("Buffer was deleted" && array != nullptr); + + if (index * itemSize >= pos) { + throw new std::runtime_error("Can't get element after array bounds"); + } else { + return static_cast<char *>(array) + (index * itemSize); + } + } + public: static const size_t itemSize = item_size; diff --git a/include/llmr/geometry/icon_buffer.hpp b/include/llmr/geometry/icon_buffer.hpp index fc918c5451..6bb0ec30c1 100644 --- a/include/llmr/geometry/icon_buffer.hpp +++ b/include/llmr/geometry/icon_buffer.hpp @@ -6,12 +6,13 @@ namespace llmr { class IconVertexBuffer : public Buffer< - 4 // 2 coordinates per vertex (== 4 bytes) + 4 + // int16 x/y coordinates per vertex (== 4 bytes) + 4 // uint16 x/y coordinates of icon in sprite (== 4 bytes) > { public: typedef int16_t vertex_type; - void add(vertex_type x, vertex_type y); + void add(vertex_type x, vertex_type y, uint16_t tx, uint16_t ty); }; } diff --git a/include/llmr/map/tile_parser.hpp b/include/llmr/map/tile_parser.hpp index 91566d40aa..12f3da8ff2 100644 --- a/include/llmr/map/tile_parser.hpp +++ b/include/llmr/map/tile_parser.hpp @@ -27,6 +27,7 @@ private: std::unique_ptr<Bucket> createIconBucket(const VectorTileLayer& layer, const BucketDescription& bucket_desc); std::unique_ptr<Bucket> createTextBucket(const VectorTileLayer& layer, const BucketDescription& bucket_desc); template <class Bucket> void addBucketFeatures(Bucket& bucket, const VectorTileLayer& layer, const BucketDescription& bucket_desc); + template <class Bucket, typename... Args> void addBucketFeatures(Bucket& bucket, const VectorTileLayer& layer, const BucketDescription& bucket_desc, Args... args); private: const VectorTile vector_data; diff --git a/include/llmr/renderer/icon_bucket.hpp b/include/llmr/renderer/icon_bucket.hpp index a3338767e7..ce90edce30 100644 --- a/include/llmr/renderer/icon_bucket.hpp +++ b/include/llmr/renderer/icon_bucket.hpp @@ -20,7 +20,8 @@ class IconVertexBuffer; class BucketDescription; class IconShader; class DotShader; -struct pbf; +class Sprite; +class VectorTileFeature; class IconBucket : public Bucket { public: @@ -30,7 +31,7 @@ public: virtual void render(Painter& painter, const std::string& layer_name, const Tile::ID& id); virtual bool hasData() const; - void addGeometry(pbf& data); + void addFeature(const VectorTileFeature &feature, const std::shared_ptr<Sprite> &sprite); void drawIcons(IconShader& shader); void drawIcons(DotShader& shader); diff --git a/include/llmr/shader/icon_shader.hpp b/include/llmr/shader/icon_shader.hpp index db3bfe6867..6b3644f28e 100644 --- a/include/llmr/shader/icon_shader.hpp +++ b/include/llmr/shader/icon_shader.hpp @@ -13,12 +13,12 @@ public: void setImage(int32_t image); void setColor(const std::array<float, 4>& color); - void setPosition(const std::array<float, 2>& pos); void setDimension(const std::array<float, 2>& dimension); void setSize(float size); private: int32_t a_pos = -1; + int32_t a_tex = -1; int32_t image = -1; int32_t u_image = -1; @@ -26,9 +26,6 @@ private: std::array<float, 4> color = {{}}; int32_t u_color = -1; - std::array<float, 2> pos = {{}}; - int32_t u_pos = -1; - std::array<float, 2> dimension = {{}}; int32_t u_dimension = -1; diff --git a/include/llmr/style/bucket_description.hpp b/include/llmr/style/bucket_description.hpp index 615b5af650..54593eec76 100644 --- a/include/llmr/style/bucket_description.hpp +++ b/include/llmr/style/bucket_description.hpp @@ -73,8 +73,9 @@ public: CapType cap = CapType::None; JoinType join = JoinType::None; std::string font; - std::string text_field; - float font_size = 0.0f; + std::string field; + std::string icon; + float size = 0.0f; float miter_limit = 2.0f; float round_limit = 1.0f; TextPathType path = TextPathType::Horizontal; diff --git a/src/geometry/icon_buffer.cpp b/src/geometry/icon_buffer.cpp index df5b7434d3..22a47ff093 100644 --- a/src/geometry/icon_buffer.cpp +++ b/src/geometry/icon_buffer.cpp @@ -5,8 +5,14 @@ using namespace llmr; -void IconVertexBuffer::add(vertex_type x, vertex_type y) { - vertex_type *vertices = static_cast<vertex_type *>(addElement()); +void IconVertexBuffer::add(vertex_type x, vertex_type y, uint16_t tx, uint16_t ty) { + void *data = addElement(); + + vertex_type *vertices = static_cast<vertex_type *>(data); vertices[0] = x; vertices[1] = y; + + uint16_t *texture = static_cast<uint16_t *>(data); + texture[2] = tx; + texture[3] = ty; } diff --git a/src/map/tile_parser.cpp b/src/map/tile_parser.cpp index ebbba78d3d..61957e6074 100644 --- a/src/map/tile_parser.cpp +++ b/src/map/tile_parser.cpp @@ -120,6 +120,15 @@ void TileParser::addBucketFeatures(Bucket& bucket, const VectorTileLayer& layer, } } +template <class Bucket, typename... Args> +void TileParser::addBucketFeatures(Bucket& bucket, const VectorTileLayer& layer, const BucketDescription& bucket_desc, Args... args) { + FilteredVectorTileLayer filtered_layer(layer, bucket_desc); + for (const pbf& feature_pbf : filtered_layer) { + if (obsolete()) return; + bucket->addFeature({ feature_pbf, layer }, args...); + } +} + std::unique_ptr<Bucket> TileParser::createFillBucket(const VectorTileLayer& layer, const BucketDescription& bucket_desc) { std::unique_ptr<FillBucket> bucket = std::make_unique<FillBucket>( tile.fillVertexBuffer, tile.triangleElementsBuffer, tile.lineElementsBuffer, bucket_desc); @@ -137,7 +146,7 @@ std::unique_ptr<Bucket> TileParser::createLineBucket(const VectorTileLayer& laye std::unique_ptr<Bucket> TileParser::createIconBucket(const VectorTileLayer& layer, const BucketDescription& bucket_desc) { std::unique_ptr<IconBucket> bucket = std::make_unique<IconBucket>( tile.iconVertexBuffer, bucket_desc); - addBucketFeatures(bucket, layer, bucket_desc); + addBucketFeatures(bucket, layer, bucket_desc, style.sprite); return obsolete() ? nullptr : std::move(bucket); } @@ -166,12 +175,6 @@ std::unique_ptr<Bucket> TileParser::createTextBucket(const VectorTileLayer& laye std::unique_ptr<TextBucket> bucket = std::make_unique<TextBucket>( tile.textVertexBuffer, tile.triangleElementsBuffer, bucket_desc, placement); - - FilteredVectorTileLayer filtered_layer(layer, bucket_desc); - for (const pbf& feature_pbf : filtered_layer) { - if (obsolete()) return nullptr; - bucket->addFeature({ feature_pbf, layer }, faces, shaping); - } - + addBucketFeatures(bucket, layer, bucket_desc, faces, shaping); return std::move(bucket); } diff --git a/src/renderer/icon_bucket.cpp b/src/renderer/icon_bucket.cpp index 6e3c65276c..060e1e0167 100644 --- a/src/renderer/icon_bucket.cpp +++ b/src/renderer/icon_bucket.cpp @@ -5,6 +5,7 @@ #include <llmr/renderer/painter.hpp> #include <llmr/style/style.hpp> +#include <llmr/style/sprite.hpp> #include <llmr/map/vector_tile.hpp> #include <llmr/platform/gl.hpp> @@ -22,13 +23,35 @@ IconBucket::IconBucket(IconVertexBuffer& vertexBuffer, vertex_start(vertexBuffer.index()) { } -void IconBucket::addGeometry(pbf& geom) { +void IconBucket::addFeature(const VectorTileFeature &feature, const std::shared_ptr<Sprite> &sprite) { + // TODO: We somehow need to reparse the stylesheet, or maintain a mapping of id => sprite name + // For now, we're just not showing points if the sprite was not yet loaded at *parse time* of + // the tile. + if (!sprite || !sprite->isLoaded()) return; + + auto field_it = feature.properties.find(geometry.field); + if (field_it == feature.properties.end()) { + fprintf(stderr, "feature doesn't contain field '%s'\n", geometry.field.c_str()); + return; + } + + std::string field = toString(field_it->second); + if (geometry.size) { + field.append("-"); + field.append(std::to_string(static_cast<int>(std::round(geometry.size)))); + } + + const SpritePosition &pos = sprite->getSpritePosition(field); + const uint16_t tx = pos.x + pos.width / 2; + const uint16_t ty = pos.y + pos.height / 2; + Geometry::command cmd; + pbf geom = feature.geometry; Geometry geometry(geom); int32_t x, y; while ((cmd = geometry.next(x, y)) != Geometry::end) { if (cmd == Geometry::move_to) { - vertexBuffer.add(x, y); + vertexBuffer.add(x, y, tx, ty); } else { fprintf(stderr, "other command than move_to in icon geometry\n"); } diff --git a/src/renderer/painter_icon.cpp b/src/renderer/painter_icon.cpp index 28e9c6f66d..0590aeb1d7 100644 --- a/src/renderer/painter_icon.cpp +++ b/src/renderer/painter_icon.cpp @@ -24,21 +24,11 @@ void Painter::renderIcon(IconBucket& bucket, const std::string& layer_name, cons color[2] *= properties.opacity; color[3] *= properties.opacity; - auto &sprite = map.getStyle().sprite; - SpritePosition spritePos; - - if (properties.image.length() && sprite && sprite->isLoaded()) { - std::string sized_image = properties.image; - if (properties.size) { - sized_image.append("-"); - sized_image.append(std::to_string(static_cast<int>(std::round(properties.size)))); - } - spritePos = sprite->getSpritePosition(sized_image); - } - const mat4 &vtxMatrix = translatedMatrix(properties.translate, id, properties.translateAnchor); - if (!spritePos.width || !spritePos.height) { + const std::shared_ptr<Sprite> &sprite = map.getStyle().sprite; + + if (!sprite || !sprite->isLoaded()) { useProgram(dotShader->program); dotShader->setMatrix(vtxMatrix); dotShader->setColor(color); @@ -58,10 +48,6 @@ void Painter::renderIcon(IconBucket& bucket, const std::string& layer_name, cons iconShader->setMatrix(vtxMatrix); iconShader->setColor(color); iconShader->setImage(0); - iconShader->setPosition({{ - spritePos.x + (float)spritePos.width / 2.0f, - spritePos.y + (float)spritePos.height / 2.0f, - }}); iconShader->setDimension({{ static_cast<float>(sprite->raster.width), @@ -70,7 +56,7 @@ void Painter::renderIcon(IconBucket& bucket, const std::string& layer_name, cons sprite->raster.bind(map.getState().isChanging()); - const float iconSize = util::max(spritePos.width, spritePos.height) + 2; + const float iconSize = bucket.geometry.size * map.getState().getPixelRatio(); iconShader->setSize(iconSize); #ifndef GL_ES_VERSION_2_0 glPointSize(iconSize); diff --git a/src/renderer/painter_text.cpp b/src/renderer/painter_text.cpp index c083da964d..a94df46134 100644 --- a/src/renderer/painter_text.cpp +++ b/src/renderer/painter_text.cpp @@ -28,7 +28,7 @@ void Painter::renderText(TextBucket& bucket, const std::string& layer_name, cons } // If layerStyle.size > bucket.info.fontSize then labels may collide - float fontSize = std::fmin(properties.size, bucket.geom_desc.font_size); + float fontSize = std::fmin(properties.size, bucket.geom_desc.size); matrix::scale(exMatrix, exMatrix, fontSize / 24.0f, fontSize / 24.0f, 1.0f); const mat4 &vtxMatrix = translatedMatrix(properties.translate, id, properties.translateAnchor); @@ -47,7 +47,7 @@ void Painter::renderText(TextBucket& bucket, const std::string& layer_name, cons float angle = std::round((map.getState().getAngle() + rotate) / M_PI * 128); // adjust min/max zooms for variable font sies - float zoomAdjust = log(fontSize / bucket.geom_desc.font_size) / log(2); + float zoomAdjust = log(fontSize / bucket.geom_desc.size) / log(2); textShader->setAngle((int32_t)(angle + 256) % 256); textShader->setFlip(bucket.geom_desc.path == TextPathType::Curve ? 1 : 0); diff --git a/src/renderer/text_bucket.cpp b/src/renderer/text_bucket.cpp index 052fd5a08f..d9aa76d89d 100644 --- a/src/renderer/text_bucket.cpp +++ b/src/renderer/text_bucket.cpp @@ -102,7 +102,7 @@ void TextBucket::addGlyphs(const PlacedGlyphs &glyphs, float placementZoom, void TextBucket::addFeature(const VectorTileFeature &feature, const IndexedFaces &faces, const std::map<Value, Shaping> &shapings) { - auto it_prop = feature.properties.find(geom_desc.text_field); + auto it_prop = feature.properties.find(geom_desc.field); if (it_prop == feature.properties.end()) { // feature does not have the correct property return; diff --git a/src/shader/dot_shader.cpp b/src/shader/dot_shader.cpp index 2f0325427d..e159f0f11b 100644 --- a/src/shader/dot_shader.cpp +++ b/src/shader/dot_shader.cpp @@ -32,7 +32,7 @@ DotShader::DotShader() void DotShader::bind(char *offset) { glEnableVertexAttribArray(a_pos); - glVertexAttribPointer(a_pos, 2, GL_SHORT, false, 0, offset); + glVertexAttribPointer(a_pos, 2, GL_SHORT, false, 8, offset); } void DotShader::setColor(const std::array<float, 4>& new_color) { diff --git a/src/shader/icon.fragment.glsl b/src/shader/icon.fragment.glsl index f5a424ae9f..aacbb6a54b 100644 --- a/src/shader/icon.fragment.glsl +++ b/src/shader/icon.fragment.glsl @@ -1,10 +1,11 @@ uniform sampler2D u_image; -uniform vec2 u_pos; uniform vec2 u_dimension; uniform vec4 u_color; uniform float u_size; +varying vec2 v_tex; + void main() { - vec2 pos = (u_pos + (gl_PointCoord - 0.5) * u_size) / u_dimension; + vec2 pos = (v_tex + (gl_PointCoord - 0.5) * u_size) / u_dimension; gl_FragColor = texture2D(u_image, pos) * u_color; } diff --git a/src/shader/icon.vertex.glsl b/src/shader/icon.vertex.glsl index 4ccc52663b..51b378f3fd 100644 --- a/src/shader/icon.vertex.glsl +++ b/src/shader/icon.vertex.glsl @@ -1,9 +1,13 @@ attribute vec2 a_pos; +attribute vec2 a_tex; uniform mat4 u_matrix; uniform float u_size; +varying vec2 v_tex; + void main() { gl_Position = u_matrix * vec4(a_pos, 0, 1); gl_PointSize = u_size; + v_tex = a_tex; } diff --git a/src/shader/icon_shader.cpp b/src/shader/icon_shader.cpp index 820a5118bb..f991d1f39a 100644 --- a/src/shader/icon_shader.cpp +++ b/src/shader/icon_shader.cpp @@ -17,25 +17,27 @@ IconShader::IconShader() } a_pos = glGetAttribLocation(program, "a_pos"); + a_tex = glGetAttribLocation(program, "a_tex"); u_matrix = glGetUniformLocation(program, "u_matrix"); u_color = glGetUniformLocation(program, "u_color"); u_size = glGetUniformLocation(program, "u_size"); - u_pos = glGetUniformLocation(program, "u_pos"); u_dimension = glGetUniformLocation(program, "u_dimension"); // fprintf(stderr, "IconShader:\n"); // fprintf(stderr, " - u_matrix: %d\n", u_matrix); // fprintf(stderr, " - u_color: %d\n", u_color); // fprintf(stderr, " - u_size: %d\n", u_size); - // fprintf(stderr, " - u_pos: %d\n", u_pos); // fprintf(stderr, " - u_dimension: %d\n", u_dimension); // fprintf(stderr, " - u_image: %d\n", u_image); } void IconShader::bind(char *offset) { glEnableVertexAttribArray(a_pos); - glVertexAttribPointer(a_pos, 2, GL_SHORT, false, 0, offset); + glVertexAttribPointer(a_pos, 2, GL_SHORT, false, 8, offset); + + glEnableVertexAttribArray(a_tex); + glVertexAttribPointer(a_tex, 2, GL_UNSIGNED_SHORT, false, 8, offset + 4); } void IconShader::setImage(int32_t new_image) { @@ -59,13 +61,6 @@ void IconShader::setSize(float new_size) { } } -void IconShader::setPosition(const std::array<float, 2>& new_pos) { - if (pos != new_pos) { - glUniform2fv(u_pos, 1, new_pos.data()); - pos = new_pos; - } -} - void IconShader::setDimension(const std::array<float, 2>& new_dimension) { if (dimension != new_dimension) { glUniform2fv(u_dimension, 1, new_dimension.data()); diff --git a/src/shader/shaders_gl.cpp b/src/shader/shaders_gl.cpp index 45f1651dc4..aebd5bfac4 100644 --- a/src/shader/shaders_gl.cpp +++ b/src/shader/shaders_gl.cpp @@ -11,8 +11,8 @@ const shader_source llmr::shaders[SHADER_COUNT] = { "#version 120\nuniform vec4 u_color;\nuniform float u_blur;\nvoid main ()\n{\n vec2 x_1;\n x_1 = (gl_PointCoord - 0.5);\n float tmpvar_2;\n tmpvar_2 = clamp (((\n sqrt(dot (x_1, x_1))\n - 0.5) / (\n (0.5 - u_blur)\n - 0.5)), 0.0, 1.0);\n gl_FragColor = (u_color * (tmpvar_2 * (tmpvar_2 * \n (3.0 - (2.0 * tmpvar_2))\n )));\n}\n\n", }, { - "#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\nattribute vec2 a_pos;\nattribute vec2 a_tex;\nuniform mat4 u_matrix;\nuniform float u_size;\nvarying vec2 v_tex;\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 v_tex = a_tex;\n}\n\n", + "#version 120\nuniform sampler2D u_image;\nuniform vec2 u_dimension;\nuniform vec4 u_color;\nuniform float u_size;\nvarying vec2 v_tex;\nvoid main ()\n{\n gl_FragColor = (texture2D (u_image, ((v_tex + \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 d94e04f295..185e4c0a87 100644 --- a/src/shader/shaders_gles2.cpp +++ b/src/shader/shaders_gles2.cpp @@ -11,8 +11,8 @@ const shader_source llmr::shaders[SHADER_COUNT] = { "precision highp float;\nuniform vec4 u_color;\nuniform float u_blur;\nvoid main ()\n{\n mediump vec2 x_1;\n x_1 = (gl_PointCoord - 0.5);\n mediump float tmpvar_2;\n tmpvar_2 = clamp (((\n sqrt(dot (x_1, x_1))\n - 0.5) / (\n (0.5 - u_blur)\n - 0.5)), 0.0, 1.0);\n gl_FragColor = (u_color * (tmpvar_2 * (tmpvar_2 * \n (3.0 - (2.0 * tmpvar_2))\n )));\n}\n\n", }, { - "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;\nattribute vec2 a_pos;\nattribute vec2 a_tex;\nuniform mat4 u_matrix;\nuniform float u_size;\nvarying vec2 v_tex;\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 v_tex = a_tex;\n}\n\n", + "precision highp float;\nuniform sampler2D u_image;\nuniform vec2 u_dimension;\nuniform vec4 u_color;\nuniform float u_size;\nvarying vec2 v_tex;\nvoid main ()\n{\n mediump vec2 tmpvar_1;\n tmpvar_1 = ((v_tex + (\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/bucket_description.cpp b/src/style/bucket_description.cpp index eb3b550bef..0dc1a111d2 100644 --- a/src/style/bucket_description.cpp +++ b/src/style/bucket_description.cpp @@ -14,6 +14,6 @@ std::ostream& llmr::operator<<(std::ostream& os, const BucketDescription& bucket os << " - cap: " << (uint32_t)bucket.geometry.cap << std::endl; os << " - join: " << (uint32_t)bucket.geometry.join << std::endl; os << " - font: " << bucket.geometry.font << std::endl; - os << " - font_size: " << bucket.geometry.font_size << std::endl; + os << " - size: " << bucket.geometry.size << std::endl; return os; } diff --git a/src/style/style_parser.cpp b/src/style/style_parser.cpp index 057b75d096..f2c1f30939 100644 --- a/src/style/style_parser.cpp +++ b/src/style/style_parser.cpp @@ -83,15 +83,15 @@ BucketDescription StyleParser::parseBucket(JSVal value) { } else { throw Style::exception("font stack must be a string"); } - } else if (name == "fontSize") { + } else if (name == "fontSize" || name == "size") { if (value.IsNumber()) { - bucket.geometry.font_size = value.GetDouble(); + bucket.geometry.size = value.GetDouble(); } else { throw Style::exception("font size must be a number"); } - } else if (name == "text_field") { + } else if (name == "text_field" || name == "icon") { if (value.IsString()) { - bucket.geometry.text_field = { value.GetString(), value.GetStringLength() }; + bucket.geometry.field = { value.GetString(), value.GetStringLength() }; } else { throw Style::exception("text field must be a string"); } diff --git a/src/text/placement.cpp b/src/text/placement.cpp index 5c8b154741..e48eff5c43 100644 --- a/src/text/placement.cpp +++ b/src/text/placement.cpp @@ -278,7 +278,7 @@ void Placement::addFeature(TextBucket& bucket, const float textMinDistance = info.textMinDistance; const float rotate = info.rotate; const float fontScale = - (tileExtent / util::tileSize) / (glyphSize / info.font_size); + (tileExtent / util::tileSize) / (glyphSize / info.size); const float advance = measureText(faces, shaping); Anchors anchors; |