don't used element arrays
This commit is contained in:
@@ -23,16 +23,13 @@ struct Coordinate;
|
||||
struct pbf;
|
||||
|
||||
class PointBucket : public Bucket {
|
||||
typedef ElementGroup<PointShader> group_type;
|
||||
public:
|
||||
PointBucket(const std::shared_ptr<PointVertexBuffer>& vertexBuffer,
|
||||
const std::shared_ptr<PointElementsBuffer>& elementsBuffer,
|
||||
const BucketDescription& bucket_desc);
|
||||
|
||||
virtual void render(Painter& painter, const std::string& layer_name, const Tile::ID& id);
|
||||
|
||||
void addGeometry(pbf& data);
|
||||
void addGeometry(Coordinate& point);
|
||||
|
||||
bool hasPoints() const;
|
||||
|
||||
@@ -43,12 +40,10 @@ public:
|
||||
|
||||
private:
|
||||
std::shared_ptr<PointVertexBuffer> vertexBuffer;
|
||||
std::shared_ptr<PointElementsBuffer> elementsBuffer;
|
||||
VertexArrayObject<PointShader> array;
|
||||
|
||||
const uint32_t vertex_start;
|
||||
const uint32_t elements_start;
|
||||
|
||||
std::vector<group_type> groups;
|
||||
uint32_t vertex_end = 0;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
@@ -207,7 +207,7 @@ std::shared_ptr<Bucket> Tile::createLineBucket(const VectorTileLayer& layer, con
|
||||
}
|
||||
|
||||
std::shared_ptr<Bucket> Tile::createPointBucket(const VectorTileLayer& layer, const BucketDescription& bucket_desc) {
|
||||
std::shared_ptr<PointBucket> bucket = std::make_shared<PointBucket>(pointVertexBuffer, pointElementsBuffer, bucket_desc);
|
||||
std::shared_ptr<PointBucket> bucket = std::make_shared<PointBucket>(pointVertexBuffer, bucket_desc);
|
||||
|
||||
FilteredVectorTileLayer filtered_layer(layer, bucket_desc);
|
||||
for (pbf feature : filtered_layer) {
|
||||
|
||||
@@ -16,43 +16,25 @@ struct geometry_too_long_exception : std::exception {};
|
||||
using namespace llmr;
|
||||
|
||||
PointBucket::PointBucket(const std::shared_ptr<PointVertexBuffer>& vertexBuffer,
|
||||
const std::shared_ptr<PointElementsBuffer>& elementsBuffer,
|
||||
const BucketDescription& bucket_desc)
|
||||
: geometry(bucket_desc.geometry),
|
||||
vertexBuffer(vertexBuffer),
|
||||
elementsBuffer(elementsBuffer),
|
||||
vertex_start(vertexBuffer->index()),
|
||||
elements_start(elementsBuffer->index())
|
||||
{
|
||||
vertex_start(vertexBuffer->index()) {
|
||||
}
|
||||
|
||||
void PointBucket::addGeometry(pbf& geom) {
|
||||
Coordinate point;
|
||||
|
||||
Geometry::command cmd;
|
||||
Geometry geometry(geom);
|
||||
int32_t x, y;
|
||||
geometry.next(x, y);
|
||||
point.x = x;
|
||||
point.y = y;
|
||||
addGeometry(point);
|
||||
}
|
||||
|
||||
typedef uint16_t PointElement;
|
||||
|
||||
void PointBucket::addGeometry(Coordinate& point) {
|
||||
vertexBuffer->add(point.x, point.y);
|
||||
|
||||
{
|
||||
if (!groups.size() || (groups.back().vertex_length + 1 > 65535)) {
|
||||
groups.emplace_back();
|
||||
while ((cmd = geometry.next(x, y)) != Geometry::end) {
|
||||
if (cmd == Geometry::move_to) {
|
||||
vertexBuffer->add(x, y);
|
||||
} else {
|
||||
fprintf(stderr, "other command than move_to in point geometry\n");
|
||||
}
|
||||
|
||||
group_type& group = groups.back();
|
||||
elementsBuffer->add(group.vertex_length + point);
|
||||
|
||||
group.vertex_length++;
|
||||
group.elements_length++;
|
||||
}
|
||||
|
||||
vertex_end = vertexBuffer->index();
|
||||
}
|
||||
|
||||
void PointBucket::render(Painter& painter, const std::string& layer_name, const Tile::ID& id) {
|
||||
@@ -60,16 +42,11 @@ void PointBucket::render(Painter& painter, const std::string& layer_name, const
|
||||
}
|
||||
|
||||
bool PointBucket::hasPoints() const {
|
||||
return !groups.empty();
|
||||
return vertex_end > 0;
|
||||
}
|
||||
|
||||
void PointBucket::drawPoints(PointShader& shader) {
|
||||
char *vertex_index = BUFFER_OFFSET(vertex_start * vertexBuffer->itemSize);
|
||||
char *elements_index = BUFFER_OFFSET(elements_start * elementsBuffer->itemSize);
|
||||
for (group_type& group : groups) {
|
||||
group.array.bind(shader, *vertexBuffer, *elementsBuffer, vertex_index);
|
||||
glDrawElements(GL_POINTS, group.elements_length, GL_UNSIGNED_SHORT, elements_index);
|
||||
vertex_index += group.vertex_length * vertexBuffer->itemSize;
|
||||
elements_index += group.elements_length * elementsBuffer->itemSize;
|
||||
}
|
||||
array.bind(shader, *vertexBuffer, vertex_index);
|
||||
glDrawArrays(GL_POINTS, 0, vertex_end - vertex_start);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user