background grid
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user