[core] Introduce SegmentVector
This commit is contained in:
@@ -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)
|
||||
});
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -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 });
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user