[core] change bool overdraw to PaintMode::Overdraw

This commit is contained in:
Konstantin Käfer
2016-09-06 12:57:08 +02:00
parent ff0c895eaa
commit 85e222c825
12 changed files with 83 additions and 55 deletions

View File

@@ -119,49 +119,57 @@ bool FillBucket::needsClipping() const {
return true;
}
void FillBucket::drawElements(PlainShader& shader, gl::ObjectStore& store, bool overdraw) {
void FillBucket::drawElements(PlainShader& shader, gl::ObjectStore& store, PaintMode paintMode) {
GLbyte* vertex_index = BUFFER_OFFSET(0);
GLbyte* elements_index = BUFFER_OFFSET(0);
for (auto& group : triangleGroups) {
assert(group);
group->array[overdraw ? 1 : 0].bind(shader, vertexBuffer, triangleElementsBuffer, vertex_index, store);
MBGL_CHECK_ERROR(glDrawElements(GL_TRIANGLES, group->elements_length * 3, GL_UNSIGNED_SHORT, elements_index));
group->array[paintMode == PaintMode::Overdraw ? 1 : 0].bind(
shader, vertexBuffer, triangleElementsBuffer, vertex_index, store);
MBGL_CHECK_ERROR(glDrawElements(GL_TRIANGLES, group->elements_length * 3, GL_UNSIGNED_SHORT,
elements_index));
vertex_index += group->vertex_length * vertexBuffer.itemSize;
elements_index += group->elements_length * triangleElementsBuffer.itemSize;
}
}
void FillBucket::drawElements(PatternShader& shader, gl::ObjectStore& store, bool overdraw) {
void FillBucket::drawElements(PatternShader& shader, gl::ObjectStore& store, PaintMode paintMode) {
GLbyte* vertex_index = BUFFER_OFFSET(0);
GLbyte* elements_index = BUFFER_OFFSET(0);
for (auto& group : triangleGroups) {
assert(group);
group->array[overdraw ? 3 : 2].bind(shader, vertexBuffer, triangleElementsBuffer, vertex_index, store);
MBGL_CHECK_ERROR(glDrawElements(GL_TRIANGLES, group->elements_length * 3, GL_UNSIGNED_SHORT, elements_index));
group->array[paintMode == PaintMode::Overdraw ? 3 : 2].bind(
shader, vertexBuffer, triangleElementsBuffer, vertex_index, store);
MBGL_CHECK_ERROR(glDrawElements(GL_TRIANGLES, group->elements_length * 3, GL_UNSIGNED_SHORT,
elements_index));
vertex_index += group->vertex_length * vertexBuffer.itemSize;
elements_index += group->elements_length * triangleElementsBuffer.itemSize;
}
}
void FillBucket::drawVertices(OutlineShader& shader, gl::ObjectStore& store, bool overdraw) {
void FillBucket::drawVertices(OutlineShader& shader, gl::ObjectStore& store, PaintMode paintMode) {
GLbyte* vertex_index = BUFFER_OFFSET(0);
GLbyte* elements_index = BUFFER_OFFSET(0);
for (auto& group : lineGroups) {
assert(group);
group->array[overdraw ? 1 : 0].bind(shader, vertexBuffer, lineElementsBuffer, vertex_index, store);
MBGL_CHECK_ERROR(glDrawElements(GL_LINES, group->elements_length * 2, GL_UNSIGNED_SHORT, elements_index));
group->array[paintMode == PaintMode::Overdraw ? 1 : 0].bind(
shader, vertexBuffer, lineElementsBuffer, vertex_index, store);
MBGL_CHECK_ERROR(glDrawElements(GL_LINES, group->elements_length * 2, GL_UNSIGNED_SHORT,
elements_index));
vertex_index += group->vertex_length * vertexBuffer.itemSize;
elements_index += group->elements_length * lineElementsBuffer.itemSize;
}
}
void FillBucket::drawVertices(OutlinePatternShader& shader, gl::ObjectStore& store, bool overdraw) {
void FillBucket::drawVertices(OutlinePatternShader& shader, gl::ObjectStore& store, PaintMode paintMode) {
GLbyte* vertex_index = BUFFER_OFFSET(0);
GLbyte* elements_index = BUFFER_OFFSET(0);
for (auto& group : lineGroups) {
assert(group);
group->array[overdraw? 3 : 2].bind(shader, vertexBuffer, lineElementsBuffer, vertex_index, store);
MBGL_CHECK_ERROR(glDrawElements(GL_LINES, group->elements_length * 2, GL_UNSIGNED_SHORT, elements_index));
group->array[paintMode == PaintMode::Overdraw ? 3 : 2].bind(
shader, vertexBuffer, lineElementsBuffer, vertex_index, store);
MBGL_CHECK_ERROR(glDrawElements(GL_LINES, group->elements_length * 2, GL_UNSIGNED_SHORT,
elements_index));
vertex_index += group->vertex_length * vertexBuffer.itemSize;
elements_index += group->elements_length * lineElementsBuffer.itemSize;
}

View File

@@ -27,10 +27,10 @@ public:
void addGeometry(const GeometryCollection&);
void drawElements(PlainShader&, gl::ObjectStore&, bool overdraw);
void drawElements(PatternShader&, gl::ObjectStore&, bool overdraw);
void drawVertices(OutlineShader&, gl::ObjectStore&, bool overdraw);
void drawVertices(OutlinePatternShader&, gl::ObjectStore&, bool overdraw);
void drawElements(PlainShader&, gl::ObjectStore&, PaintMode);
void drawElements(PatternShader&, gl::ObjectStore&, PaintMode);
void drawVertices(OutlineShader&, gl::ObjectStore&, PaintMode);
void drawVertices(OutlinePatternShader&, gl::ObjectStore&, PaintMode);
private:
FillVertexBuffer vertexBuffer;

View File

@@ -460,7 +460,7 @@ bool LineBucket::needsClipping() const {
return true;
}
void LineBucket::drawLines(LineShader& shader, gl::ObjectStore& store, bool overdraw) {
void LineBucket::drawLines(LineShader& shader, gl::ObjectStore& store, PaintMode paintMode) {
GLbyte* vertex_index = BUFFER_OFFSET(0);
GLbyte* elements_index = BUFFER_OFFSET(0);
for (auto& group : triangleGroups) {
@@ -468,7 +468,8 @@ void LineBucket::drawLines(LineShader& shader, gl::ObjectStore& store, bool over
if (!group->elements_length) {
continue;
}
group->array[overdraw ? 1 : 0].bind(shader, vertexBuffer, triangleElementsBuffer, vertex_index, store);
group->array[paintMode == PaintMode::Overdraw ? 1 : 0].bind(
shader, vertexBuffer, triangleElementsBuffer, vertex_index, store);
MBGL_CHECK_ERROR(glDrawElements(GL_TRIANGLES, group->elements_length * 3, GL_UNSIGNED_SHORT,
elements_index));
vertex_index += group->vertex_length * vertexBuffer.itemSize;
@@ -476,7 +477,7 @@ void LineBucket::drawLines(LineShader& shader, gl::ObjectStore& store, bool over
}
}
void LineBucket::drawLineSDF(LineSDFShader& shader, gl::ObjectStore& store, bool overdraw) {
void LineBucket::drawLineSDF(LineSDFShader& shader, gl::ObjectStore& store, PaintMode paintMode) {
GLbyte* vertex_index = BUFFER_OFFSET(0);
GLbyte* elements_index = BUFFER_OFFSET(0);
for (auto& group : triangleGroups) {
@@ -484,7 +485,8 @@ void LineBucket::drawLineSDF(LineSDFShader& shader, gl::ObjectStore& store, bool
if (!group->elements_length) {
continue;
}
group->array[overdraw ? 3 : 2].bind(shader, vertexBuffer, triangleElementsBuffer, vertex_index, store);
group->array[paintMode == PaintMode::Overdraw ? 3 : 2].bind(
shader, vertexBuffer, triangleElementsBuffer, vertex_index, store);
MBGL_CHECK_ERROR(glDrawElements(GL_TRIANGLES, group->elements_length * 3, GL_UNSIGNED_SHORT,
elements_index));
vertex_index += group->vertex_length * vertexBuffer.itemSize;
@@ -492,7 +494,7 @@ void LineBucket::drawLineSDF(LineSDFShader& shader, gl::ObjectStore& store, bool
}
}
void LineBucket::drawLinePatterns(LinepatternShader& shader, gl::ObjectStore& store, bool overdraw) {
void LineBucket::drawLinePatterns(LinepatternShader& shader, gl::ObjectStore& store, PaintMode paintMode) {
GLbyte* vertex_index = BUFFER_OFFSET(0);
GLbyte* elements_index = BUFFER_OFFSET(0);
for (auto& group : triangleGroups) {
@@ -500,7 +502,8 @@ void LineBucket::drawLinePatterns(LinepatternShader& shader, gl::ObjectStore& st
if (!group->elements_length) {
continue;
}
group->array[overdraw ? 5 : 4].bind(shader, vertexBuffer, triangleElementsBuffer, vertex_index, store);
group->array[paintMode == PaintMode::Overdraw ? 5 : 4].bind(
shader, vertexBuffer, triangleElementsBuffer, vertex_index, store);
MBGL_CHECK_ERROR(glDrawElements(GL_TRIANGLES, group->elements_length * 3, GL_UNSIGNED_SHORT,
elements_index));
vertex_index += group->vertex_length * vertexBuffer.itemSize;

View File

@@ -32,9 +32,9 @@ public:
void addGeometry(const GeometryCollection&);
void addGeometry(const GeometryCoordinates& line);
void drawLines(LineShader&, gl::ObjectStore&, bool overdraw);
void drawLineSDF(LineSDFShader&, gl::ObjectStore&, bool overdraw);
void drawLinePatterns(LinepatternShader&, gl::ObjectStore&, bool overdraw);
void drawLines(LineShader&, gl::ObjectStore&, PaintMode);
void drawLineSDF(LineSDFShader&, gl::ObjectStore&, PaintMode);
void drawLinePatterns(LinepatternShader&, gl::ObjectStore&, PaintMode);
private:
struct TriangleElement {

View File

@@ -68,7 +68,7 @@ void Painter::render(const Style& style, const FrameData& frame_, SpriteAtlas& a
PaintParameters parameters {
#ifndef NDEBUG
isOverdraw() ? *overdrawShaders : *shaders
paintMode() == PaintMode::Overdraw ? *overdrawShaders : *shaders
#else
*shaders
#endif
@@ -127,7 +127,7 @@ void Painter::render(const Style& style, const FrameData& frame_, SpriteAtlas& a
config.depthMask = GL_TRUE;
config.colorMask = { GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE };
if (isOverdraw()) {
if (paintMode() == PaintMode::Overdraw) {
config.blend = GL_TRUE;
config.blendFunc = { GL_CONSTANT_COLOR, GL_ONE };
const float overdraw = 1.0f / 8.0f;
@@ -245,7 +245,7 @@ void Painter::renderPass(PaintParameters& parameters,
if (!layer.baseImpl->hasRenderPass(pass))
continue;
if (isOverdraw()) {
if (paintMode() == PaintMode::Overdraw) {
config.blend = GL_TRUE;
} else if (pass == RenderPass::Translucent) {
config.blendFunc.reset();

View File

@@ -125,7 +125,7 @@ private:
float scaleDivisor,
std::array<float, 2> texsize,
SDFShader& sdfShader,
void (SymbolBucket::*drawSDF)(SDFShader&, gl::ObjectStore&, bool),
void (SymbolBucket::*drawSDF)(SDFShader&, gl::ObjectStore&, PaintMode),
// Layout
style::AlignmentType rotationAlignment,
@@ -145,9 +145,14 @@ private:
void setDepthSublayer(int n);
#ifndef NDEBUG
bool isOverdraw() const { return frame.debugOptions & MapDebugOptions::Overdraw; }
PaintMode paintMode() const {
return frame.debugOptions & MapDebugOptions::Overdraw ? PaintMode::Overdraw
: PaintMode::Regular;
}
#else
bool isOverdraw() const { return false; }
PaintMode paintMode() const {
return PaintMode::Regular;
}
#endif
mat4 projMatrix;

View File

@@ -69,7 +69,7 @@ void Painter::renderFill(PaintParameters& parameters,
// the (non-antialiased) fill.
setDepthSublayer(0); // OK
}
bucket.drawVertices(outlineShader, store, isOverdraw());
bucket.drawVertices(outlineShader, store, paintMode());
}
if (pattern) {
@@ -105,7 +105,7 @@ void Painter::renderFill(PaintParameters& parameters,
// Draw the actual triangles into the color & stencil buffer.
setDepthSublayer(0);
bucket.drawElements(patternShader, store, isOverdraw());
bucket.drawElements(patternShader, store, paintMode());
if (properties.fillAntialias && !isOutlineColorDefined) {
config.program = outlinePatternShader.getID();
@@ -132,7 +132,7 @@ void Painter::renderFill(PaintParameters& parameters,
spriteAtlas->bind(true, store, config, 0);
setDepthSublayer(2);
bucket.drawVertices(outlinePatternShader, store, isOverdraw());
bucket.drawVertices(outlinePatternShader, store, paintMode());
}
}
} else {
@@ -149,7 +149,7 @@ void Painter::renderFill(PaintParameters& parameters,
// Draw the actual triangles into the color & stencil buffer.
setDepthSublayer(1);
bucket.drawElements(plainShader, store, isOverdraw());
bucket.drawElements(plainShader, store, paintMode());
}
}
@@ -166,7 +166,7 @@ void Painter::renderFill(PaintParameters& parameters,
outlineShader.u_world = worldSize;
setDepthSublayer(2);
bucket.drawVertices(outlineShader, store, isOverdraw());
bucket.drawVertices(outlineShader, store, paintMode());
}
}

View File

@@ -96,7 +96,7 @@ void Painter::renderLine(PaintParameters& parameters,
linesdfShader.u_image = 0;
lineAtlas->bind(store, config, 0);
bucket.drawLineSDF(linesdfShader, store, isOverdraw());
bucket.drawLineSDF(linesdfShader, store, paintMode());
} else if (!properties.linePattern.value.from.empty()) {
optional<SpriteAtlasPosition> imagePosA = spriteAtlas->getPosition(
@@ -139,7 +139,7 @@ void Painter::renderLine(PaintParameters& parameters,
linepatternShader.u_image = 0;
spriteAtlas->bind(true, store, config, 0);
bucket.drawLinePatterns(linepatternShader, store, isOverdraw());
bucket.drawLinePatterns(linepatternShader, store, paintMode());
} else {
config.program = lineShader.getID();
@@ -157,7 +157,7 @@ void Painter::renderLine(PaintParameters& parameters,
lineShader.u_color = color;
lineShader.u_opacity = opacity;
bucket.drawLines(lineShader, store, isOverdraw());
bucket.drawLines(lineShader, store, paintMode());
}
}

View File

@@ -20,7 +20,7 @@ void Painter::renderSDF(SymbolBucket& bucket,
float sdfFontSize,
std::array<float, 2> texsize,
SDFShader& sdfShader,
void (SymbolBucket::*drawSDF)(SDFShader&, gl::ObjectStore&, bool),
void (SymbolBucket::*drawSDF)(SDFShader&, gl::ObjectStore&, PaintMode),
// Layout
AlignmentType rotationAlignment,
@@ -96,7 +96,7 @@ void Painter::renderSDF(SymbolBucket& bucket,
sdfShader.u_buffer = (haloOffset - haloWidth / fontScale) / sdfPx;
setDepthSublayer(0);
(bucket.*drawSDF)(sdfShader, store, isOverdraw());
(bucket.*drawSDF)(sdfShader, store, paintMode());
}
// Then, we draw the text/icon over the halo
@@ -107,7 +107,7 @@ void Painter::renderSDF(SymbolBucket& bucket,
sdfShader.u_buffer = (256.0f - 64.0f) / 256.0f;
setDepthSublayer(1);
(bucket.*drawSDF)(sdfShader, store, isOverdraw());
(bucket.*drawSDF)(sdfShader, store, paintMode());
}
}
@@ -219,7 +219,7 @@ void Painter::renderSymbol(PaintParameters& parameters,
iconShader.u_fadetexture = 1;
setDepthSublayer(0);
bucket.drawIcons(iconShader, store, isOverdraw());
bucket.drawIcons(iconShader, store, paintMode());
}
}

View File

@@ -24,4 +24,10 @@ constexpr RenderPass operator&(RenderPass a, RenderPass b) {
return RenderPass(mbgl::underlying_type(a) & mbgl::underlying_type(b));
}
// Defines whether the overdraw shaders should be used instead of the regular shaders.
enum class PaintMode : bool {
Regular = false,
Overdraw = true,
};
} // namespace mbgl

View File

@@ -601,40 +601,46 @@ void SymbolBucket::swapRenderData() {
}
}
void SymbolBucket::drawGlyphs(SDFShader& shader, gl::ObjectStore& store, bool overdraw) {
void SymbolBucket::drawGlyphs(SDFShader& shader, gl::ObjectStore& store, PaintMode paintMode) {
GLbyte *vertex_index = BUFFER_OFFSET_0;
GLbyte *elements_index = BUFFER_OFFSET_0;
auto& text = renderData->text;
for (auto &group : text.groups) {
assert(group);
group->array[overdraw ? 1 : 0].bind(shader, text.vertices, text.triangles, vertex_index, store);
MBGL_CHECK_ERROR(glDrawElements(GL_TRIANGLES, group->elements_length * 3, GL_UNSIGNED_SHORT, elements_index));
group->array[paintMode == PaintMode::Overdraw ? 1 : 0].bind(
shader, text.vertices, text.triangles, vertex_index, store);
MBGL_CHECK_ERROR(glDrawElements(GL_TRIANGLES, group->elements_length * 3, GL_UNSIGNED_SHORT,
elements_index));
vertex_index += group->vertex_length * text.vertices.itemSize;
elements_index += group->elements_length * text.triangles.itemSize;
}
}
void SymbolBucket::drawIcons(SDFShader& shader, gl::ObjectStore& store, bool overdraw) {
void SymbolBucket::drawIcons(SDFShader& shader, gl::ObjectStore& store, PaintMode paintMode) {
GLbyte *vertex_index = BUFFER_OFFSET_0;
GLbyte *elements_index = BUFFER_OFFSET_0;
auto& icon = renderData->icon;
for (auto &group : icon.groups) {
assert(group);
group->array[overdraw ? 1 : 0].bind(shader, icon.vertices, icon.triangles, vertex_index, store);
MBGL_CHECK_ERROR(glDrawElements(GL_TRIANGLES, group->elements_length * 3, GL_UNSIGNED_SHORT, elements_index));
group->array[paintMode == PaintMode::Overdraw ? 1 : 0].bind(
shader, icon.vertices, icon.triangles, vertex_index, store);
MBGL_CHECK_ERROR(glDrawElements(GL_TRIANGLES, group->elements_length * 3, GL_UNSIGNED_SHORT,
elements_index));
vertex_index += group->vertex_length * icon.vertices.itemSize;
elements_index += group->elements_length * icon.triangles.itemSize;
}
}
void SymbolBucket::drawIcons(IconShader& shader, gl::ObjectStore& store, bool overdraw) {
void SymbolBucket::drawIcons(IconShader& shader, gl::ObjectStore& store, PaintMode paintMode) {
GLbyte *vertex_index = BUFFER_OFFSET_0;
GLbyte *elements_index = BUFFER_OFFSET_0;
auto& icon = renderData->icon;
for (auto &group : icon.groups) {
assert(group);
group->array[overdraw ? 3 : 2].bind(shader, icon.vertices, icon.triangles, vertex_index, store);
MBGL_CHECK_ERROR(glDrawElements(GL_TRIANGLES, group->elements_length * 3, GL_UNSIGNED_SHORT, elements_index));
group->array[paintMode == PaintMode::Overdraw ? 3 : 2].bind(
shader, icon.vertices, icon.triangles, vertex_index, store);
MBGL_CHECK_ERROR(glDrawElements(GL_TRIANGLES, group->elements_length * 3, GL_UNSIGNED_SHORT,
elements_index));
vertex_index += group->vertex_length * icon.vertices.itemSize;
elements_index += group->elements_length * icon.triangles.itemSize;
}

View File

@@ -82,9 +82,9 @@ public:
GlyphAtlas&,
GlyphStore&);
void drawGlyphs(SDFShader&, gl::ObjectStore&, bool overdraw);
void drawIcons(SDFShader&, gl::ObjectStore&, bool overdraw);
void drawIcons(IconShader&, gl::ObjectStore&, bool overdraw);
void drawGlyphs(SDFShader&, gl::ObjectStore&, PaintMode);
void drawIcons(SDFShader&, gl::ObjectStore&, PaintMode);
void drawIcons(IconShader&, gl::ObjectStore&, PaintMode);
void drawCollisionBoxes(CollisionBoxShader&, gl::ObjectStore&);
void parseFeatures(const GeometryTileLayer&, const style::Filter&);