diff options
author | Lauren Budorick <lbudorick@gmail.com> | 2014-08-12 10:55:22 -0700 |
---|---|---|
committer | Lauren Budorick <lbudorick@gmail.com> | 2014-08-12 10:55:22 -0700 |
commit | 3941908cee9d91ac505908e3443b4490644b2cf7 (patch) | |
tree | df14f963c5b2d42c027c371b64aa0b9383c096b9 /include | |
parent | 46e754f806e24af7b88ef19dcf786e7ee006ba40 (diff) | |
parent | 28d8c13c2c1852062857070c17bc211d26902ba0 (diff) | |
download | qtlocation-mapboxgl-3941908cee9d91ac505908e3443b4490644b2cf7.tar.gz |
Merge pull request #400 from mapbox/rasterize
raster prerendering (parity)
Diffstat (limited to 'include')
22 files changed, 64 insertions, 85 deletions
diff --git a/include/mbgl/geometry/geometry.hpp b/include/mbgl/geometry/geometry.hpp index 47981ce83b..961569204d 100644 --- a/include/mbgl/geometry/geometry.hpp +++ b/include/mbgl/geometry/geometry.hpp @@ -12,7 +12,7 @@ class Geometry : private util::noncopyable { public: inline explicit Geometry(pbf& data); - + enum command : uint8_t { end = 0, move_to = 1, diff --git a/include/mbgl/map/map.hpp b/include/mbgl/map/map.hpp index 554962c713..fba38879ed 100644 --- a/include/mbgl/map/map.hpp +++ b/include/mbgl/map/map.hpp @@ -45,6 +45,8 @@ public: // Triggers a lazy rerender: only performs a render when the map is not clean. void rerender(); + void renderLayer(std::shared_ptr<StyleLayer> layer_desc, RenderPass pass, const Tile::ID* id = nullptr, const mat4* matrix = nullptr); + // Forces a map update: always triggers a rerender. void update(); @@ -123,6 +125,7 @@ public: inline std::shared_ptr<uv::loop> getLoop() { return loop; } inline timestamp getAnimationTime() const { return animationTime; } inline timestamp getTime() const { return animationTime; } + void updateTiles(); private: // uv async callbacks @@ -137,7 +140,6 @@ private: void updateSources(); void updateSources(const std::shared_ptr<StyleLayerGroup> &group); - void updateTiles(); void updateRenderState(); size_t countLayers(const std::vector<LayerDescription>& layers); @@ -146,12 +148,10 @@ private: // the stylesheet. void prepare(); - enum RenderPass { Opaque, Translucent }; // Unconditionally performs a render with the current map state. void render(); void renderLayers(std::shared_ptr<StyleLayerGroup> group); - void renderLayer(std::shared_ptr<StyleLayer> layer_desc, RenderPass pass); private: bool async = false; diff --git a/include/mbgl/map/raster_tile_data.hpp b/include/mbgl/map/raster_tile_data.hpp index bf8691454f..98aa3baaf5 100644 --- a/include/mbgl/map/raster_tile_data.hpp +++ b/include/mbgl/map/raster_tile_data.hpp @@ -22,10 +22,11 @@ public: ~RasterTileData(); virtual void parse(); - virtual void render(Painter &painter, std::shared_ptr<StyleLayer> layer_desc); + virtual void render(Painter &painter, std::shared_ptr<StyleLayer> layer_desc, const mat4 &matrix); virtual bool hasData(std::shared_ptr<StyleLayer> layer_desc) const; protected: + StyleBucketRaster properties; RasterBucket bucket; }; diff --git a/include/mbgl/map/source.hpp b/include/mbgl/map/source.hpp index c3f2d4fe8b..4ffd097193 100644 --- a/include/mbgl/map/source.hpp +++ b/include/mbgl/map/source.hpp @@ -32,6 +32,7 @@ public: void drawClippingMasks(Painter &painter); size_t getTileCount() const; void render(Painter &painter, std::shared_ptr<StyleLayer> layer_desc); + void render(Painter &painter, std::shared_ptr<StyleLayer> layer_desc, const Tile::ID &id, const mat4 &matrix); void finishRender(Painter &painter); std::forward_list<Tile::ID> getIDs() const; diff --git a/include/mbgl/map/tile_data.hpp b/include/mbgl/map/tile_data.hpp index c349ea2bae..5991613a2d 100644 --- a/include/mbgl/map/tile_data.hpp +++ b/include/mbgl/map/tile_data.hpp @@ -53,7 +53,7 @@ public: virtual void beforeParse(); virtual void parse() = 0; virtual void afterParse(); - virtual void render(Painter &painter, std::shared_ptr<StyleLayer> layer_desc) = 0; + virtual void render(Painter &painter, std::shared_ptr<StyleLayer> layer_desc, const mat4 &matrix) = 0; virtual bool hasData(std::shared_ptr<StyleLayer> layer_desc) const = 0; diff --git a/include/mbgl/map/tile_parser.hpp b/include/mbgl/map/tile_parser.hpp index 9aa0f4dc66..f011d47a38 100644 --- a/include/mbgl/map/tile_parser.hpp +++ b/include/mbgl/map/tile_parser.hpp @@ -14,6 +14,7 @@ namespace mbgl { class Bucket; +class Texturepool; class FontStack; class GlyphAtlas; class GlyphStore; @@ -22,6 +23,7 @@ class Sprite; class Style; class StyleBucket; class StyleBucketFill; +class StyleBucketRaster; class StyleBucketLine; class StyleBucketSymbol; class StyleLayerGroup; @@ -45,6 +47,7 @@ private: std::unique_ptr<Bucket> createBucket(std::shared_ptr<StyleBucket> bucket_desc); std::unique_ptr<Bucket> createFillBucket(const VectorTileLayer& layer, const FilterExpression &filter, const StyleBucketFill &fill); + std::unique_ptr<Bucket> createRasterBucket(const std::shared_ptr<Texturepool> &texturepool, const StyleBucketRaster &raster); std::unique_ptr<Bucket> createLineBucket(const VectorTileLayer& layer, const FilterExpression &filter, const StyleBucketLine &line); std::unique_ptr<Bucket> createSymbolBucket(const VectorTileLayer& layer, const FilterExpression &filter, const StyleBucketSymbol &symbol); @@ -60,6 +63,7 @@ private: std::shared_ptr<GlyphStore> glyphStore; std::shared_ptr<SpriteAtlas> spriteAtlas; std::shared_ptr<Sprite> sprite; + std::shared_ptr<Texturepool> texturePool; Collision collision; }; diff --git a/include/mbgl/map/vector_tile_data.hpp b/include/mbgl/map/vector_tile_data.hpp index edad228999..deb628e485 100644 --- a/include/mbgl/map/vector_tile_data.hpp +++ b/include/mbgl/map/vector_tile_data.hpp @@ -32,7 +32,7 @@ public: virtual void beforeParse(); virtual void parse(); virtual void afterParse(); - virtual void render(Painter &painter, std::shared_ptr<StyleLayer> layer_desc); + virtual void render(Painter &painter, std::shared_ptr<StyleLayer> layer_desc, const mat4 &matrix); virtual bool hasData(std::shared_ptr<StyleLayer> layer_desc) const; protected: diff --git a/include/mbgl/renderer/bucket.hpp b/include/mbgl/renderer/bucket.hpp index 18f58ee464..1391f6e3e3 100644 --- a/include/mbgl/renderer/bucket.hpp +++ b/include/mbgl/renderer/bucket.hpp @@ -5,7 +5,6 @@ #include <memory> #include <mbgl/map/tile.hpp> #include <mbgl/util/noncopyable.hpp> -#include <mbgl/renderer/prerendered_texture.hpp> namespace mbgl { @@ -14,11 +13,10 @@ class StyleLayer; class Bucket : private util::noncopyable { public: - virtual void render(Painter& painter, std::shared_ptr<StyleLayer> layer_desc, const Tile::ID& id) = 0; + virtual void render(Painter& painter, std::shared_ptr<StyleLayer> layer_desc, const Tile::ID& id, const mat4 &matrix) = 0; virtual bool hasData() const = 0; virtual ~Bucket() {} - std::unique_ptr<PrerenderedTexture> prerendered; }; } diff --git a/include/mbgl/renderer/debug_bucket.hpp b/include/mbgl/renderer/debug_bucket.hpp index ac4f18cc2c..660b7fcba8 100644 --- a/include/mbgl/renderer/debug_bucket.hpp +++ b/include/mbgl/renderer/debug_bucket.hpp @@ -20,7 +20,7 @@ class DebugBucket : public Bucket { public: DebugBucket(DebugFontBuffer& fontBuffer); - virtual void render(Painter& painter, std::shared_ptr<StyleLayer> layer_desc, const Tile::ID& id); + virtual void render(Painter& painter, std::shared_ptr<StyleLayer> layer_desc, const Tile::ID& id, const mat4 &matrix); virtual bool hasData() const; void drawLines(PlainShader& shader); diff --git a/include/mbgl/renderer/fill_bucket.hpp b/include/mbgl/renderer/fill_bucket.hpp index 9193b09149..e9340cce68 100644 --- a/include/mbgl/renderer/fill_bucket.hpp +++ b/include/mbgl/renderer/fill_bucket.hpp @@ -44,7 +44,7 @@ public: const StyleBucketFill& properties); ~FillBucket(); - virtual void render(Painter& painter, std::shared_ptr<StyleLayer> layer_desc, const Tile::ID& id); + virtual void render(Painter& painter, std::shared_ptr<StyleLayer> layer_desc, const Tile::ID& id, const mat4 &matrix); virtual bool hasData() const; void addGeometry(pbf& data); diff --git a/include/mbgl/renderer/line_bucket.hpp b/include/mbgl/renderer/line_bucket.hpp index d42b10bfb7..f65ca35605 100644 --- a/include/mbgl/renderer/line_bucket.hpp +++ b/include/mbgl/renderer/line_bucket.hpp @@ -28,7 +28,7 @@ public: PointElementsBuffer& pointElementsBuffer, const StyleBucketLine& properties); - virtual void render(Painter& painter, std::shared_ptr<StyleLayer> layer_desc, const Tile::ID& id); + virtual void render(Painter& painter, std::shared_ptr<StyleLayer> layer_desc, const Tile::ID& id, const mat4 &matrix); virtual bool hasData() const; void addGeometry(pbf& data); diff --git a/include/mbgl/renderer/painter.hpp b/include/mbgl/renderer/painter.hpp index b4023de167..db85d8703d 100644 --- a/include/mbgl/renderer/painter.hpp +++ b/include/mbgl/renderer/painter.hpp @@ -29,6 +29,8 @@ namespace mbgl { +enum class RenderPass : bool { Opaque, Translucent }; + class Transform; class Style; class Tile; @@ -40,8 +42,10 @@ class FillBucket; class LineBucket; class SymbolBucket; class RasterBucket; +class PrerenderedTexture; struct FillProperties; +struct RasterProperties; struct CompositeProperties; class LayerDescription; @@ -69,27 +73,27 @@ public: void changeMatrix(); // Renders a particular layer from a tile. - void renderTileLayer(const Tile& tile, std::shared_ptr<StyleLayer> layer_desc); + void renderTileLayer(const Tile& tile, std::shared_ptr<StyleLayer> layer_desc, const mat4 &matrix); // Renders debug information for a tile. void renderTileDebug(const Tile& tile); // Renders the red debug frame around a tile, visualizing its perimeter. - void renderDebugFrame(); + void renderDebugFrame(const mat4 &matrix); - void renderDebugText(DebugBucket& bucket); + void renderDebugText(DebugBucket& bucket, const mat4 &matrix); void renderDebugText(const std::vector<std::string> &strings); - void renderFill(FillBucket& bucket, const FillProperties& properties, const Tile::ID& id, const mat4 &mat); - void renderFill(FillBucket& bucket, std::shared_ptr<StyleLayer> layer_desc, const Tile::ID& id); - void renderLine(LineBucket& bucket, std::shared_ptr<StyleLayer> layer_desc, const Tile::ID& id); - void renderSymbol(SymbolBucket& bucket, std::shared_ptr<StyleLayer> layer_desc, const Tile::ID& id); - void renderRaster(RasterBucket& bucket, std::shared_ptr<StyleLayer> layer_desc, const Tile::ID& id); + void renderFill(FillBucket& bucket, const FillProperties& properties, const Tile::ID& id, const mat4 &matrix); + void renderFill(FillBucket& bucket, std::shared_ptr<StyleLayer> layer_desc, const Tile::ID& id, const mat4 &matrix); + void renderLine(LineBucket& bucket, std::shared_ptr<StyleLayer> layer_desc, const Tile::ID& id, const mat4 &matrix); + void renderSymbol(SymbolBucket& bucket, std::shared_ptr<StyleLayer> layer_desc, const Tile::ID& id, const mat4 &matrix); + void renderRaster(RasterBucket& bucket, std::shared_ptr<StyleLayer> layer_desc, const Tile::ID& id, const mat4 &matrix); + + void preparePrerender(RasterBucket &bucket); - void preparePrerender(PrerenderedTexture &texture); - void finishPrerender(PrerenderedTexture &texture); + void renderPrerenderedTexture(RasterBucket &bucket, const mat4 &matrix, const RasterProperties& properties); - template <typename Properties> - void renderPrerenderedTexture(PrerenderedTexture &texture, const Properties &properties); + void createPrerendered(RasterBucket& bucket, std::shared_ptr<StyleLayer> layer_desc, const Tile::ID& id); void resize(); @@ -117,7 +121,7 @@ public: bool needsAnimation() const; private: void setupShaders(); - const mat4 &translatedMatrix(const std::array<float, 2> &translation, const Tile::ID &id, TranslateAnchorType anchor = TranslateAnchorType::Map); + const mat4 &translatedMatrix(const mat4& matrix, const std::array<float, 2> &translation, const Tile::ID &id, TranslateAnchorType anchor = TranslateAnchorType::Map); void prepareTile(const Tile& tile); @@ -127,7 +131,6 @@ public: void depthMask(bool value); public: - mat4 matrix; mat4 vtxMatrix; mat4 projMatrix; mat4 nativeMatrix; @@ -153,7 +156,7 @@ private: bool gl_depthMask = true; std::array<uint16_t, 2> gl_viewport = {{ 0, 0 }}; float strata = 0; - enum { Opaque, Translucent } pass = Opaque; + RenderPass pass = RenderPass::Opaque; const float strata_epsilon = 1.0f / (1 << 16); public: diff --git a/include/mbgl/renderer/prerendered_texture.hpp b/include/mbgl/renderer/prerendered_texture.hpp index 9c72e14b88..e4dc610418 100644 --- a/include/mbgl/renderer/prerendered_texture.hpp +++ b/include/mbgl/renderer/prerendered_texture.hpp @@ -3,15 +3,15 @@ #include <mbgl/util/noncopyable.hpp> #include <mbgl/platform/gl.hpp> -#include <mbgl/style/rasterize_properties.hpp> namespace mbgl { +class StyleBucketRaster; class Painter; class PrerenderedTexture : private util::noncopyable { public: - PrerenderedTexture(const RasterizedProperties &properties); + PrerenderedTexture(const StyleBucketRaster &properties); ~PrerenderedTexture(); void bindTexture(); @@ -23,12 +23,13 @@ public: void blur(Painter& painter, uint16_t passes); public: - const RasterizedProperties properties; + const StyleBucketRaster &properties; private: GLint previous_fbo = 0; GLuint fbo = 0; GLuint texture = 0; + GLuint fbo_depth_stencil = 0; }; } diff --git a/include/mbgl/renderer/raster_bucket.hpp b/include/mbgl/renderer/raster_bucket.hpp index c111193126..a68475565b 100644 --- a/include/mbgl/renderer/raster_bucket.hpp +++ b/include/mbgl/renderer/raster_bucket.hpp @@ -3,6 +3,10 @@ #include <mbgl/renderer/bucket.hpp> #include <mbgl/util/raster.hpp> +#include <mbgl/renderer/prerendered_texture.hpp> +#include <mbgl/style/style_bucket.hpp> + + namespace mbgl { @@ -12,17 +16,23 @@ class VertexArrayObject; class RasterBucket : public Bucket { public: - RasterBucket(const std::shared_ptr<Texturepool> &texturepool); + RasterBucket(const std::shared_ptr<Texturepool> &texturepool, const StyleBucketRaster& properties); - virtual void render(Painter& painter, std::shared_ptr<StyleLayer> layer_desc, const Tile::ID& id); + virtual void render(Painter& painter, std::shared_ptr<StyleLayer> layer_desc, const Tile::ID& id, const mat4 &matrix); virtual bool hasData() const; bool setImage(const std::string &data); + const StyleBucketRaster &properties; + PrerenderedTexture texture; + void drawRaster(RasterShader& shader, VertexBuffer &vertices, VertexArrayObject &array); -private: + void drawRaster(RasterShader& shader, VertexBuffer &vertices, VertexArrayObject &array, GLuint texture); + Raster raster; + +private: }; } diff --git a/include/mbgl/renderer/symbol_bucket.hpp b/include/mbgl/renderer/symbol_bucket.hpp index c003230cae..e890274238 100644 --- a/include/mbgl/renderer/symbol_bucket.hpp +++ b/include/mbgl/renderer/symbol_bucket.hpp @@ -53,7 +53,7 @@ class SymbolBucket : public Bucket { public: SymbolBucket(const StyleBucketSymbol &properties, Collision &collision); - virtual void render(Painter &painter, std::shared_ptr<StyleLayer> layer_desc, const Tile::ID &id); + virtual void render(Painter &painter, std::shared_ptr<StyleLayer> layer_desc, const Tile::ID &id, const mat4 &matrix); virtual bool hasData() const; virtual bool hasTextData() const; virtual bool hasIconData() const; diff --git a/include/mbgl/style/property_key.hpp b/include/mbgl/style/property_key.hpp index 68dc709597..7d24981765 100644 --- a/include/mbgl/style/property_key.hpp +++ b/include/mbgl/style/property_key.hpp @@ -54,7 +54,7 @@ enum class PropertyKey { CompositeOpacity, RasterOpacity, - RasterSpin, + RasterHueRotate, RasterBrightnessLow, RasterBrightnessHigh, RasterSaturation, diff --git a/include/mbgl/style/rasterize_properties.hpp b/include/mbgl/style/rasterize_properties.hpp deleted file mode 100644 index aea90dfbdd..0000000000 --- a/include/mbgl/style/rasterize_properties.hpp +++ /dev/null @@ -1,38 +0,0 @@ -#ifndef MBGL_STYLE_RASTERIZE_PROPERTIES -#define MBGL_STYLE_RASTERIZE_PROPERTIES - -#include <mbgl/style/function_properties.hpp> - -namespace mbgl { - -// The calculated properties for a layer in a tile. -class RasterizedProperties { -public: - float buffer = 1.0f / 32.0f; - uint16_t size = 256; - uint8_t blur = 0; -}; - -class RasterizeProperties { -public: - Function<bool> enabled = ConstantFunction<bool>(false); - Function<float> buffer = ConstantFunction<float>(1.0f / 32.0f); - Function<float> size = ConstantFunction<float>(256); - Function<float> blur = ConstantFunction<float>(0); - - inline bool isEnabled(const int8_t z) const { - return util::apply_visitor(FunctionEvaluator<bool>(z), enabled); - } - - inline RasterizedProperties get(const int8_t z) const { - RasterizedProperties properties; - properties.buffer = util::apply_visitor(FunctionEvaluator<float>(z), buffer); - properties.size = util::apply_visitor(FunctionEvaluator<float>(z), size); - properties.blur = util::apply_visitor(FunctionEvaluator<float>(z), blur); - return properties; - } -}; - -} - -#endif diff --git a/include/mbgl/style/style_bucket.hpp b/include/mbgl/style/style_bucket.hpp index 530e0c1259..11b87d849d 100644 --- a/include/mbgl/style/style_bucket.hpp +++ b/include/mbgl/style/style_bucket.hpp @@ -82,6 +82,10 @@ public: class StyleBucketRaster { public: + bool prerendered = false; + uint16_t size = 256; + float blur = 0.0f; + float buffer = 0.03125f; }; typedef util::variant<StyleBucketFill, StyleBucketLine, StyleBucketSymbol, diff --git a/include/mbgl/style/style_layer.hpp b/include/mbgl/style/style_layer.hpp index 14d60ed9b6..f8cfff7f63 100644 --- a/include/mbgl/style/style_layer.hpp +++ b/include/mbgl/style/style_layer.hpp @@ -4,7 +4,6 @@ #include <mbgl/style/class_dictionary.hpp> #include <mbgl/style/class_properties.hpp> #include <mbgl/style/style_properties.hpp> -#include <mbgl/style/rasterize_properties.hpp> #include <mbgl/style/applied_class_properties.hpp> #include <vector> @@ -20,8 +19,7 @@ class StyleLayerGroup; class StyleLayer { public: - StyleLayer(const std::string &id, std::map<ClassID, ClassProperties> &&styles, - std::unique_ptr<const RasterizeProperties> &&rasterize); + StyleLayer(const std::string &id, std::map<ClassID, ClassProperties> &&styles); template <typename T> const T &getProperties() { if (properties.is<T>()) { @@ -80,11 +78,6 @@ public: // layer's type. StyleProperties properties; - // Rasterization properties are used for prerendering the tile to a bitmap, - // which is then used as a raster image instead of rendering this layer - // directly in every frame. - const std::unique_ptr<const RasterizeProperties> rasterize; - // Child layer array (if this layer has child layers). std::shared_ptr<StyleLayerGroup> layers; }; diff --git a/include/mbgl/style/style_parser.hpp b/include/mbgl/style/style_parser.hpp index 8b8dc74f21..e4e1b7f632 100644 --- a/include/mbgl/style/style_parser.hpp +++ b/include/mbgl/style/style_parser.hpp @@ -6,7 +6,6 @@ #include <mbgl/style/style_source.hpp> #include <mbgl/style/filter_expression.hpp> #include <mbgl/style/class_properties.hpp> -#include <mbgl/style/rasterize_properties.hpp> #include <mbgl/style/style_bucket.hpp> #include <unordered_map> @@ -52,7 +51,6 @@ private: void parseLayer(std::pair<JSVal, std::shared_ptr<StyleLayer>> &pair); void parseStyles(JSVal value, std::map<ClassID, ClassProperties> &styles); void parseStyle(JSVal, ClassProperties &properties); - std::unique_ptr<RasterizeProperties> parseRasterize(JSVal value); void parseReference(JSVal value, std::shared_ptr<StyleLayer> &layer); void parseBucket(JSVal value, std::shared_ptr<StyleLayer> &layer); void parseRender(JSVal value, std::shared_ptr<StyleLayer> &layer); diff --git a/include/mbgl/style/style_properties.hpp b/include/mbgl/style/style_properties.hpp index 35ea97781b..f12ab430e3 100644 --- a/include/mbgl/style/style_properties.hpp +++ b/include/mbgl/style/style_properties.hpp @@ -89,7 +89,7 @@ struct CompositeProperties { struct RasterProperties { inline RasterProperties() {} float opacity = 1.0f; - float spin = 0.0f; + float hue_rotate = 0.0f; std::array<float, 2> brightness = {{ 0, 1 }}; float saturation = 0.0f; float contrast = 0.0f; diff --git a/include/mbgl/util/raster.hpp b/include/mbgl/util/raster.hpp index 04c85169e2..e526ffa5ac 100644 --- a/include/mbgl/util/raster.hpp +++ b/include/mbgl/util/raster.hpp @@ -4,6 +4,7 @@ #include <mbgl/util/transition.hpp> #include <mbgl/util/texturepool.hpp> #include <mbgl/util/image.hpp> +#include <mbgl/renderer/prerendered_texture.hpp> #include <string> #include <mutex> @@ -25,6 +26,9 @@ public: // bind current texture void bind(bool linear = false); + // bind prerendered texture + void bind(const GLuint texture); + // loaded status bool isLoaded() const; |