404{
406 return nullptr;
407
408 std::vector<float>
points;
409 std::vector<uint32_t> polygons;
410 std::vector<uint32_t> table;
411 table.reserve(
indices.size() * 6);
412
414 const auto& box = elements.boxes[
index];
415 const uint32_t
label = box.label_id != 0 ? box.label_id :
static_cast<uint32_t
>(
index + 1U);
416
417 const auto first_polygon = static_cast<uint32_t>(polygons.size() / 2);
418 uint32_t polygon_count = 0;
419 for (const auto& contour : elements.contours) {
420 const bool owned = contour.label_id ==
label || (contour.label_id == 0 && contour.parent_label ==
label);
421 if (!owned || contour.points.size() < 3)
422 continue;
423
424 polygons.push_back(
static_cast<uint32_t
>(
points.size() / 2));
425 polygons.push_back(static_cast<uint32_t>(contour.points.size()));
426 for (
const auto& p : contour.
points)
428 ++polygon_count;
429 }
430
431 table.insert(table.end(), {
432 std::bit_cast<uint32_t>(box.x),
433 std::bit_cast<uint32_t>(box.y),
434 std::bit_cast<uint32_t>(box.w),
435 std::bit_cast<uint32_t>(box.h),
436 first_polygon,
437 polygon_count,
438 });
439 }
440
443 if (polygons.empty())
444 polygons.assign(2, 0U);
445
446 const auto count =
static_cast<uint32_t
>(
indices.size());
447
449 use_shader(ctx, "contour_fill.comp.spv", k_wg_image, sizeof(AtlasPC));
450 ctx.stage_image(source);
451 ctx.set_binding_data(3, std::span<const float>(
points));
452 ctx.set_binding_data(4, std::span<const uint32_t>(polygons));
453 ctx.set_binding_data(5, std::span<const uint32_t>(table));
454 ctx.set_push_constants(AtlasPC { .tile_w =
tile_w, .tile_h =
tile_h, .count =
count });
456}
std::vector< uint32_t > indices
std::vector< glm::vec2 > * points