add_triangles_to_feature = function(feature, projection, buffers) {
if (feature.projected) {
return
}
let projected = d3.geoProject(feature.geometry, projection)
feature.projected = projected;
let coordinates;
if (!projected) {
return
}
if (projected.type == "Polygon") {
coordinates = [projected.coordinates]
} else if (projected.type == "MultiPolygon") {
coordinates = projected.coordinates
} else {throw "All elements must be polygons or multipolgyons."}
let all_coords = []
let all_vertices = []
for (let polygon of coordinates) {
const current_vertex = all_coords.length/2
const { coords, vertices } = polygon_to_triangles(polygon);
all_coords.push(...coords)
all_vertices.push(...vertices.map(d => d + current_vertex))
}
const coords = buffers.post_data(all_coords.flat(10), 8)
feature.coord_buffer = coords
feature.vertex_buffer = buffers.regl.elements({
primitive: "triangles",
count: all_vertices.length,
data: all_vertices.flat(10),
type: all_coords.length < 2**8 ? 'uint8' : all_coords.length < 2**16 ? 'uint16' : 'uint32'
})
feature.vertex_buffer.data = all_vertices.flat(10)
}