From ec7f7de5c4ed6006c9936cf2eaf72a88707b6cbb Mon Sep 17 00:00:00 2001 From: Lauren Budorick Date: Thu, 7 Aug 2014 12:49:04 -0700 Subject: [PATCH] still not working --- include/mbgl/map/map.hpp | 1 - include/mbgl/renderer/prerendered_texture.hpp | 1 + include/mbgl/renderer/raster_bucket.hpp | 5 ++++- include/mbgl/util/raster.hpp | 4 ++++ src/map/map.cpp | 15 ------------- src/renderer/painter_raster.cpp | 9 ++++++-- src/renderer/prerendered_texture.cpp | 14 ++++++++++++ src/renderer/raster_bucket.cpp | 7 ++++++ src/util/raster.cpp | 22 +++++++++++++++++++ 9 files changed, 59 insertions(+), 19 deletions(-) diff --git a/include/mbgl/map/map.hpp b/include/mbgl/map/map.hpp index c54b40d75..9147d6f5b 100644 --- a/include/mbgl/map/map.hpp +++ b/include/mbgl/map/map.hpp @@ -141,7 +141,6 @@ private: void updateTiles(); void updateRenderState(); - void updateRenderState(const mat4 vtxMatrix); size_t countLayers(const std::vector& layers); diff --git a/include/mbgl/renderer/prerendered_texture.hpp b/include/mbgl/renderer/prerendered_texture.hpp index 4a5b736d4..e4dc61041 100644 --- a/include/mbgl/renderer/prerendered_texture.hpp +++ b/include/mbgl/renderer/prerendered_texture.hpp @@ -29,6 +29,7 @@ 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 631fb3471..4eccb22bd 100644 --- a/include/mbgl/renderer/raster_bucket.hpp +++ b/include/mbgl/renderer/raster_bucket.hpp @@ -28,8 +28,11 @@ public: 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/util/raster.hpp b/include/mbgl/util/raster.hpp index 04c85169e..9124f59ba 100644 --- a/include/mbgl/util/raster.hpp +++ b/include/mbgl/util/raster.hpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include @@ -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; diff --git a/src/map/map.cpp b/src/map/map.cpp index 3a143bc5b..5f72378fe 100644 --- a/src/map/map.cpp +++ b/src/map/map.cpp @@ -522,21 +522,6 @@ void Map::updateRenderState() { } } -void Map::updateRenderState(const mat4 vtxMatrix) { - std::forward_list ids; - - for (const std::shared_ptr &source : getActiveSources()) { - ids.splice_after(ids.before_begin(), source->source->getIDs()); - source->source->updateMatrices(vtxMatrix, state); - } - - const std::map clipIDs = computeClipIDs(ids); - - for (const std::shared_ptr &source : getActiveSources()) { - source->source->updateClipIDs(clipIDs); - } -} - void Map::prepare() { view.make_active(); diff --git a/src/renderer/painter_raster.cpp b/src/renderer/painter_raster.cpp index a1dc969b8..186e860e0 100644 --- a/src/renderer/painter_raster.cpp +++ b/src/renderer/painter_raster.cpp @@ -31,7 +31,7 @@ void Painter::renderRaster(RasterBucket& bucket, std::shared_ptr lay matrix::translate(vtxMatrix, vtxMatrix, 0, -4096, 0); return vtxMatrix; }(); - + map.renderLayers(layer_desc->layers); if (bucket.properties.blur > 0) { @@ -53,7 +53,12 @@ void Painter::renderRaster(RasterBucket& bucket, std::shared_ptr lay // rasterShader->setOpacity(properties.opacity * tile_data->raster->opacity); // TODO fix glDepthRange(strata + strata_epsilon, 1.0f); - bucket.drawRaster(*rasterShader, tileStencilBuffer, coveringRasterArray); + + if (!bucket.hasData()) { + bucket.drawRaster(*rasterShader, tileStencilBuffer, coveringRasterArray, bucket.texture.getTexture()); + } else { + bucket.drawRaster(*rasterShader, tileStencilBuffer, coveringRasterArray); + } depthMask(true); diff --git a/src/renderer/prerendered_texture.cpp b/src/renderer/prerendered_texture.cpp index 59a854a0c..6a21b133a 100644 --- a/src/renderer/prerendered_texture.cpp +++ b/src/renderer/prerendered_texture.cpp @@ -44,11 +44,25 @@ void PrerenderedTexture::bindFramebuffer() { glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, properties.size, properties.size, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); glBindTexture(GL_TEXTURE_2D, 0); } + + if (fbo_depth_stencil == 0) { + // Create depth/stencil buffer + glGenRenderbuffers(1, &fbo_depth_stencil); + glBindRenderbuffer(GL_RENDERBUFFER, fbo_depth_stencil); + glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, properties.size, properties.size); + glBindRenderbuffer(GL_RENDERBUFFER, 0); + } if (fbo == 0) { glGenFramebuffers(1, &fbo); glBindFramebuffer(GL_FRAMEBUFFER, fbo); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0); +#ifdef GL_ES_VERSION_2_0 + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, fbo_depth_stencil); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, fbo_depth_stencil); +#else + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, fbo_depth_stencil); +#endif GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); if (status != GL_FRAMEBUFFER_COMPLETE) { diff --git a/src/renderer/raster_bucket.cpp b/src/renderer/raster_bucket.cpp index dc9b13687..80f5039ac 100644 --- a/src/renderer/raster_bucket.cpp +++ b/src/renderer/raster_bucket.cpp @@ -24,6 +24,13 @@ void RasterBucket::drawRaster(RasterShader& shader, VertexBuffer &vertices, Vert glDrawArrays(GL_TRIANGLES, 0, (GLsizei)vertices.index()); } +void RasterBucket::drawRaster(RasterShader& shader, VertexBuffer &vertices, VertexArrayObject &array, GLuint texture) { + raster.bind(texture); + shader.setImage(0); + array.bind(shader, vertices, BUFFER_OFFSET(0)); + glDrawArrays(GL_TRIANGLES, 0, (GLsizei)vertices.index()); +} + bool RasterBucket::hasData() const { return raster.isLoaded(); } diff --git a/src/util/raster.cpp b/src/util/raster.cpp index 4a040f9cb..1a993c599 100644 --- a/src/util/raster.cpp +++ b/src/util/raster.cpp @@ -68,6 +68,28 @@ void Raster::bind(bool linear) { } } +// overload ::bind for prerendered raster textures +void Raster::bind(const GLuint texture) { + if (img && !textured) { + glBindTexture(GL_TEXTURE_2D, texture); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, img->getData()); + img.reset(); + textured = true; + } else if (textured) { + glBindTexture(GL_TEXTURE_2D, texture); + } + + GLuint filter = GL_LINEAR; + if (filter != this->filter) { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filter); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filter); + this->filter = filter; + } + +} + void Raster::beginFadeInTransition() { timestamp start = util::now(); fade_transition = std::make_shared>(opacity, 1.0, opacity, start, 250_milliseconds);