[core] Introduce SegmentVector

This commit is contained in:
John Firebaugh
2016-11-14 11:57:02 -08:00
parent 58877d1b3d
commit 377d0fb0d2
18 changed files with 86 additions and 36 deletions

View File

@@ -42,7 +42,7 @@ public:
UniformValues&& uniformValues,
const VertexBuffer<Vertex>& vertexBuffer,
const IndexBuffer<DrawMode>& indexBuffer,
const std::vector<Segment>& segments) {
const SegmentVector<Attributes>& segments) {
static_assert(std::is_same<Primitive, typename DrawMode::Primitive>::value, "incompatible draw mode");
context.draw({
std::move(drawMode),
@@ -66,7 +66,8 @@ public:
StencilMode stencilMode,
ColorMode colorMode,
UniformValues&& uniformValues,
const VertexBuffer<Vertex, DrawMode>& vertexBuffer) {
const VertexBuffer<Vertex, DrawMode>& vertexBuffer,
const SegmentVector<Attributes>& segments) {
static_assert(std::is_same<Primitive, typename DrawMode::Primitive>::value, "incompatible draw mode");
context.draw({
std::move(drawMode),
@@ -76,7 +77,7 @@ public:
program,
vertexBuffer.buffer,
0,
{{ 0, 0, vertexBuffer.vertexCount, 0 }},
segments,
Uniforms::binder(uniformsState, std::move(uniformValues)),
Attributes::binder(attributesState)
});

View File

@@ -23,5 +23,18 @@ public:
std::size_t indexLength;
};
template <class Attributes>
class SegmentVector : public std::vector<Segment> {
public:
SegmentVector() = default;
// This constructor is for unindexed rendering. It creates a SegmentVector with a
// single segment having 0 indexes.
template <class DrawMode>
SegmentVector(const VertexBuffer<typename Attributes::Vertex, DrawMode>& buffer) {
emplace_back(0, 0, buffer.vertexCount, 0);
}
};
} // namespace gl
} // namespace mbgl

View File

@@ -14,11 +14,13 @@ MBGL_DEFINE_UNIFORM_SCALAR(bool, u_scale_with_map);
MBGL_DEFINE_UNIFORM_SCALAR(float, u_devicepixelratio);
} // namespace uniforms
using CircleAttributes = gl::Attributes<
attributes::a_pos>;
class CircleProgram : public Program<
shaders::circle,
gl::Triangle,
gl::Attributes<
attributes::a_pos>,
CircleAttributes,
gl::Uniforms<
uniforms::u_matrix,
uniforms::u_opacity,

View File

@@ -15,13 +15,15 @@ MBGL_DEFINE_UNIFORM_SCALAR(float, u_scale);
MBGL_DEFINE_UNIFORM_SCALAR(float, u_maxzoom);
} // namespace uniforms
using CollisionBoxAttributes = gl::Attributes<
attributes::a_pos,
attributes::a_extrude,
attributes::a_data<2>>;
class CollisionBoxProgram : public Program<
shaders::collision_box,
gl::Line,
gl::Attributes<
attributes::a_pos,
attributes::a_extrude,
attributes::a_data<2>>,
CollisionBoxAttributes,
gl::Uniforms<
uniforms::u_matrix,
uniforms::u_scale,

View File

@@ -7,11 +7,13 @@
namespace mbgl {
using DebugAttributes = gl::Attributes<
attributes::a_pos>;
class DebugProgram : public Program<
shaders::debug,
gl::Line,
gl::Attributes<
attributes::a_pos>,
DebugAttributes,
gl::Uniforms<
uniforms::u_matrix,
uniforms::u_color>>
@@ -20,4 +22,6 @@ public:
using Program::Program;
};
using DebugVertex = DebugProgram::Vertex;
} // namespace mbgl

View File

@@ -23,12 +23,14 @@ MBGL_DEFINE_UNIFORM_VECTOR(float, 3, u_spin_weights);
MBGL_DEFINE_UNIFORM_VECTOR(float, 2, u_tl_parent);
} // namespace uniforms
using RasterAttributes = gl::Attributes<
attributes::a_pos,
attributes::a_texture_pos>;
class RasterProgram : public Program<
shaders::raster,
gl::Triangle,
gl::Attributes<
attributes::a_pos,
attributes::a_texture_pos>,
RasterAttributes,
gl::Uniforms<
uniforms::u_matrix,
uniforms::u_image0,

View File

@@ -22,7 +22,7 @@ public:
gl::VertexVector<CircleVertex> vertices;
gl::IndexVector<gl::Triangles> triangles;
std::vector<gl::Segment> segments;
gl::SegmentVector<CircleAttributes> segments;
optional<gl::VertexBuffer<CircleVertex>> vertexBuffer;
optional<gl::IndexBuffer<gl::Triangles>> indexBuffer;

View File

@@ -80,7 +80,8 @@ DebugBucket::DebugBucket(const OverscaledTileID& id,
modified(std::move(modified_)),
expires(std::move(expires_)),
debugMode(debugMode_),
vertexBuffer(context.createVertexBuffer(buildTextVertices(id, renderable_, complete_, modified_, expires_, debugMode_))) {
vertexBuffer(context.createVertexBuffer(buildTextVertices(id, renderable_, complete_, modified_, expires_, debugMode_))),
segments(vertexBuffer) {
}
} // namespace mbgl

View File

@@ -6,7 +6,7 @@
#include <mbgl/util/optional.hpp>
#include <mbgl/util/noncopyable.hpp>
#include <mbgl/gl/vertex_buffer.hpp>
#include <mbgl/programs/fill_program.hpp>
#include <mbgl/programs/debug_program.hpp>
namespace mbgl {
@@ -32,7 +32,8 @@ public:
const optional<Timestamp> expires;
const MapDebugOptions debugMode;
gl::VertexBuffer<FillVertex, gl::Lines> vertexBuffer;
gl::VertexBuffer<DebugVertex, gl::Lines> vertexBuffer;
gl::SegmentVector<DebugAttributes> segments;
};
} // namespace mbgl

View File

@@ -22,8 +22,8 @@ public:
gl::VertexVector<FillVertex> vertices;
gl::IndexVector<gl::Lines> lines;
gl::IndexVector<gl::Triangles> triangles;
std::vector<gl::Segment> lineSegments;
std::vector<gl::Segment> triangleSegments;
gl::SegmentVector<FillAttributes> lineSegments;
gl::SegmentVector<FillAttributes> triangleSegments;
optional<gl::VertexBuffer<FillVertex>> vertexBuffer;
optional<gl::IndexBuffer<gl::Lines>> lineIndexBuffer;

View File

@@ -28,7 +28,7 @@ public:
gl::VertexVector<LineVertex> vertices;
gl::IndexVector<gl::Triangles> triangles;
std::vector<gl::Segment> segments;
gl::SegmentVector<LineAttributes> segments;
optional<gl::VertexBuffer<LineVertex>> vertexBuffer;
optional<gl::IndexBuffer<gl::Triangles>> indexBuffer;

View File

@@ -77,8 +77,11 @@ Painter::Painter(gl::Context& context_, const TransformState& state_)
: context(context_),
state(state_),
tileTriangleVertexBuffer(context.createVertexBuffer(tileTriangles())),
tileLineStripVertexBuffer(context.createVertexBuffer(tileLineStrip())),
rasterVertexBuffer(context.createVertexBuffer(rasterTriangleStrip())) {
tileTriangleSegments(tileTriangleVertexBuffer),
tileBorderVertexBuffer(context.createVertexBuffer(tileLineStrip())),
tileBorderSegments(tileBorderVertexBuffer),
rasterVertexBuffer(context.createVertexBuffer(rasterTriangleStrip())),
rasterSegments(rasterVertexBuffer) {
#ifndef NDEBUG
gl::debugging::enable();
#endif

View File

@@ -9,6 +9,7 @@
#include <mbgl/renderer/bucket.hpp>
#include <mbgl/gl/context.hpp>
#include <mbgl/programs/debug_program.hpp>
#include <mbgl/programs/fill_program.hpp>
#include <mbgl/programs/raster_program.hpp>
@@ -157,8 +158,13 @@ private:
#endif
gl::VertexBuffer<FillVertex, gl::Triangles> tileTriangleVertexBuffer;
gl::VertexBuffer<FillVertex, gl::LineStrip> tileLineStripVertexBuffer;
gl::SegmentVector<FillAttributes> tileTriangleSegments;
gl::VertexBuffer<DebugVertex, gl::LineStrip> tileBorderVertexBuffer;
gl::SegmentVector<DebugAttributes> tileBorderSegments;
gl::VertexBuffer<RasterVertex, gl::TriangleStrip> rasterVertexBuffer;
gl::SegmentVector<RasterAttributes> rasterSegments;
};
} // namespace mbgl

View File

@@ -44,7 +44,8 @@ void Painter::renderBackground(PaintParameters& parameters, const BackgroundLaye
tileID,
state
),
tileTriangleVertexBuffer
tileTriangleVertexBuffer,
tileTriangleSegments
);
}
} else {
@@ -62,7 +63,8 @@ void Painter::renderBackground(PaintParameters& parameters, const BackgroundLaye
uniforms::u_outline_color::Value{ properties.backgroundColor.value },
uniforms::u_world::Value{ context.viewport.getCurrentValue().size },
},
tileTriangleVertexBuffer
tileTriangleVertexBuffer,
tileTriangleSegments
);
}
}

View File

@@ -26,7 +26,8 @@ void Painter::renderClippingMask(const UnwrappedTileID& tileID, const ClipID& cl
uniforms::u_outline_color::Value{ Color {} },
uniforms::u_world::Value{ context.viewport.getCurrentValue().size },
},
tileTriangleVertexBuffer
tileTriangleVertexBuffer,
tileTriangleSegments
);
}

View File

@@ -18,7 +18,7 @@ void Painter::renderTileDebug(const RenderTile& renderTile) {
MBGL_DEBUG_GROUP(std::string { "debug " } + util::toString(renderTile.id));
auto draw = [&] (Color color, const auto& vertexBuffer, auto drawMode) {
auto draw = [&] (Color color, const auto& vertexBuffer, const auto& segments, auto drawMode) {
programs->debug.draw(
context,
drawMode,
@@ -29,7 +29,8 @@ void Painter::renderTileDebug(const RenderTile& renderTile) {
uniforms::u_matrix::Value{ renderTile.matrix },
uniforms::u_color::Value{ color }
},
vertexBuffer
vertexBuffer,
segments
);
};
@@ -45,12 +46,22 @@ void Painter::renderTileDebug(const RenderTile& renderTile) {
tile.expires, frame.debugOptions, context);
}
draw(Color::white(), tile.debugBucket->vertexBuffer, gl::Lines { 4.0f * frame.pixelRatio });
draw(Color::black(), tile.debugBucket->vertexBuffer, gl::Lines { 2.0f * frame.pixelRatio });
draw(Color::white(),
tile.debugBucket->vertexBuffer,
tile.debugBucket->segments,
gl::Lines { 4.0f * frame.pixelRatio });
draw(Color::black(),
tile.debugBucket->vertexBuffer,
tile.debugBucket->segments,
gl::Lines { 2.0f * frame.pixelRatio });
}
if (frame.debugOptions & MapDebugOptions::TileBorders) {
draw(Color::red(), tileLineStripVertexBuffer, gl::LineStrip { 4.0f * frame.pixelRatio });
draw(Color::red(),
tileBorderVertexBuffer,
tileBorderSegments,
gl::LineStrip { 4.0f * frame.pixelRatio });
}
}

View File

@@ -75,7 +75,8 @@ void Painter::renderRaster(PaintParameters& parameters,
uniforms::u_scale_parent::Value{ 1.0f },
uniforms::u_tl_parent::Value{ std::array<float, 2> {{ 0.0f, 0.0f }} },
},
rasterVertexBuffer
rasterVertexBuffer,
rasterSegments
);
}

View File

@@ -36,7 +36,7 @@ public:
struct TextBuffer {
gl::VertexVector<SymbolVertex> vertices;
gl::IndexVector<gl::Triangles> triangles;
std::vector<gl::Segment> segments;
gl::SegmentVector<SymbolAttributes> segments;
optional<gl::VertexBuffer<SymbolVertex>> vertexBuffer;
optional<gl::IndexBuffer<gl::Triangles>> indexBuffer;
@@ -45,7 +45,7 @@ public:
struct IconBuffer {
gl::VertexVector<SymbolVertex> vertices;
gl::IndexVector<gl::Triangles> triangles;
std::vector<gl::Segment> segments;
gl::SegmentVector<SymbolAttributes> segments;
optional<gl::VertexBuffer<SymbolVertex>> vertexBuffer;
optional<gl::IndexBuffer<gl::Triangles>> indexBuffer;
@@ -54,7 +54,7 @@ public:
struct CollisionBoxBuffer {
gl::VertexVector<CollisionBoxVertex> vertices;
gl::IndexVector<gl::Lines> lines;
std::vector<gl::Segment> segments;
gl::SegmentVector<CollisionBoxAttributes> segments;
optional<gl::VertexBuffer<CollisionBoxVertex>> vertexBuffer;
optional<gl::IndexBuffer<gl::Lines>> indexBuffer;