background grid

This commit is contained in:
Justin R. Miller
2014-06-02 11:42:00 -07:00
parent 3f6075711f
commit 1dd3fdfba3
3 changed files with 66 additions and 10 deletions

View File

@@ -37,6 +37,7 @@ public:
bool update();
void updateMatrices(const TransformState &transform);
bool viewportTileParsed();
void drawClippingMasks();
size_t getTileCount() const;
void render(const LayerDescription& layer_desc, const BucketDescription &bucket_desc);

View File

@@ -57,6 +57,19 @@ size_t Source::getTileCount() const {
return tiles.size();
}
bool Source::viewportTileParsed() {
bool parsed = false;
for (auto &pair : tiles) {
Tile::ID id = pair.first;
if (hasTile(id) == TileData::State::parsed) {
parsed = true;
}
}
return parsed;
}
void Source::drawClippingMasks() {
for (std::pair<const Tile::ID, std::unique_ptr<Tile>> &pair : tiles) {
Tile &tile = *pair.second;

View File

@@ -9,22 +9,64 @@ using namespace llmr;
void Painter::drawClippingMasks(const Sources &sources) {
gl::group group("clipping masks");
useProgram(plainShader->program);
glDisable(GL_DEPTH_TEST);
depthMask(false);
glDepthRange(1.0f, 1.0f);
glStencilMask(0xFF);
const BackgroundProperties &properties = map.getStyle()->computed.background;
Color background = properties.color;
const float opacity = properties.opacity;
background[0] *= opacity;
background[1] *= opacity;
background[2] *= opacity;
background[3] *= opacity;
plainShader->setColor(background);
bool ready = false;
coveringPlainArray.bind(*plainShader, tileStencilBuffer, BUFFER_OFFSET(0));
for (const auto &pair : sources) {
Source &source = *pair.second;
if (source.viewportTileParsed()) {
ready = true;
}
}
if (ready) {
// At least one viewport tile is parsed. Draw the background.
useProgram(plainShader->program);
const BackgroundProperties &properties = map.getStyle()->computed.background;
Color background = properties.color;
const float opacity = properties.opacity;
background[0] *= opacity;
background[1] *= opacity;
background[2] *= opacity;
background[3] *= opacity;
plainShader->setColor(background);
coveringPlainArray.bind(*plainShader, tileStencilBuffer, BUFFER_OFFSET(0));
} else {
// No viewport tiles are parsed. Draw the grid pattern.
const std::shared_ptr<Sprite> &sprite = map.getStyle()->sprite;
if (sprite) {
SpriteAtlas &spriteAtlas = *map.getSpriteAtlas();
Rect<uint16_t> imagePos = spriteAtlas.getImage("matte-256", *sprite);
std::array<float, 2> imageSize = {{
(float)(imagePos.w * 0.5),
(float)(imagePos.h * 0.5)
}
};
useProgram(patternShader->program);
patternShader->setPatternSize(imageSize);
patternShader->setPatternTopLeft({{
float(imagePos.x) / spriteAtlas.getWidth(),
float(imagePos.y) / spriteAtlas.getHeight(),
}});
patternShader->setPatternBottomRight({{
float(imagePos.x + imagePos.w) / spriteAtlas.getWidth(),
float(imagePos.y + imagePos.h) / spriteAtlas.getHeight(),
}});
std::array<float, 4> color = {{ 1, 1, 1, 1 }};
patternShader->setColor(color);
spriteAtlas.bind(true);
coveringPatternArray.bind(*patternShader, tileStencilBuffer, BUFFER_OFFSET(0));
}
}
for (const auto &pair : sources) {
Source &source = *pair.second;