Fix performance regression from workaround to missing items after bedfil

This commit is contained in:
tamasmeszaros 2023-09-04 13:11:32 +02:00
parent e86cd23b45
commit d499c367f8
2 changed files with 18 additions and 8 deletions

View File

@ -20,6 +20,10 @@ struct FillBedTask: public ArrangeTaskBase
std::vector<ArrItem> selected, unselected; std::vector<ArrItem> selected, unselected;
// For workaround regarding "holes" when filling the bed with the same
// item's copies
std::vector<ArrItem> selected_fillers;
ArrangeSettings settings; ArrangeSettings settings;
ExtendedBed bed; ExtendedBed bed;
size_t selected_existing_count = 0; size_t selected_existing_count = 0;

View File

@ -74,8 +74,7 @@ void extract(FillBedTask<ArrItem> &task,
// Workaround for missing items when arranging the same geometry only: // Workaround for missing items when arranging the same geometry only:
// Injecting a number of items but with slightly shrinked shape, so that // Injecting a number of items but with slightly shrinked shape, so that
// they can fill the emerging holes. Priority is set to lowest so that // they can fill the emerging holes.
// these filler items will only be inserted as the last ones.
ArrItem prototype_item_shrinked; ArrItem prototype_item_shrinked;
scene.model().visit_arrangeable(selected_ids.front(), scene.model().visit_arrangeable(selected_ids.front(),
[&prototype_item_shrinked, &itm_conv](const Arrangeable &arrbl) { [&prototype_item_shrinked, &itm_conv](const Arrangeable &arrbl) {
@ -104,10 +103,6 @@ void extract(FillBedTask<ArrItem> &task,
} }
}; };
// Set the lowest priority to the shrinked prototype (hole filler) item
set_priority(prototype_item_shrinked,
lowest_priority(range(task.selected)) - 1);
scene.model().for_each_arrangeable(collect_task_items); scene.model().for_each_arrangeable(collect_task_items);
int needed_items = calculate_items_needed_to_fill_bed(task.bed, int needed_items = calculate_items_needed_to_fill_bed(task.bed,
@ -122,7 +117,7 @@ void extract(FillBedTask<ArrItem> &task,
// Add as many filler items as there are needed items. Most of them will // Add as many filler items as there are needed items. Most of them will
// be discarded anyways. // be discarded anyways.
std::fill_n(std::back_inserter(task.selected), needed_items, std::fill_n(std::back_inserter(task.selected_fillers), needed_items,
prototype_item_shrinked); prototype_item_shrinked);
} }
@ -175,7 +170,7 @@ std::unique_ptr<FillBedTaskResult> FillBedTask<ArrItem>::process_native(
void on_packed(ArrItem &itm) override void on_packed(ArrItem &itm) override
{ {
// Stop at the first filler that is not on the physical bed // Stop at the first filler that is not on the physical bed
do_stop = get_bed_index(itm) > PhysicalBedId && get_priority(itm) < 0; do_stop = get_bed_index(itm) > PhysicalBedId && get_priority(itm) == 0;
} }
} subctl(ctl, *this); } subctl(ctl, *this);
@ -184,6 +179,13 @@ std::unique_ptr<FillBedTaskResult> FillBedTask<ArrItem>::process_native(
arranger->arrange(selected, unselected, bed, subctl); arranger->arrange(selected, unselected, bed, subctl);
auto unsel_cpy = unselected;
for (const auto &itm : selected) {
unsel_cpy.emplace_back(itm);
}
arranger->arrange(selected_fillers, unsel_cpy, bed, FillBedCtl{ctl, *this});
auto arranged_range = Range{selected.begin(), auto arranged_range = Range{selected.begin(),
selected.begin() + selected_existing_count}; selected.begin() + selected_existing_count};
@ -196,6 +198,10 @@ std::unique_ptr<FillBedTaskResult> FillBedTask<ArrItem>::process_native(
if (get_bed_index(itm) == PhysicalBedId) if (get_bed_index(itm) == PhysicalBedId)
result->add_new_item(itm); result->add_new_item(itm);
for (auto &itm : selected_fillers)
if (get_bed_index(itm) == PhysicalBedId)
result->add_new_item(itm);
return result; return result;
} }