don't used element arrays

This commit is contained in:
Konstantin Käfer
2014-02-19 14:46:50 +01:00
parent 420e534306
commit 504b60b93e
3 changed files with 15 additions and 43 deletions

View File

@@ -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;
};
}

View File

@@ -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) {

View File

@@ -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);
}