From 770a163c6315e1da433af8bd032ce89ba35ed2a1 Mon Sep 17 00:00:00 2001 From: Sergey Lapin Date: Mon, 2 Dec 2024 16:32:52 +0300 Subject: [PATCH] Handling aspect --- src/modules/stream/ui/grow_job.cpp | 109 +------------------------- src/modules/stream/ui/region_tree.cpp | 39 +++++++-- src/modules/stream/ui/region_tree.h | 2 +- 3 files changed, 35 insertions(+), 115 deletions(-) diff --git a/src/modules/stream/ui/grow_job.cpp b/src/modules/stream/ui/grow_job.cpp index 643b13a..b0b6870 100644 --- a/src/modules/stream/ui/grow_job.cpp +++ b/src/modules/stream/ui/grow_job.cpp @@ -99,6 +99,7 @@ grow_job_queue::grow_job_queue( grid_e.world().entity(et).path().c_str()); } } +/* Unlimited growth for squares */ void grow_job_queue::job_initial(struct grow_job *job) { int i, j; @@ -110,9 +111,6 @@ void grow_job_queue::job_initial(struct grow_job *job) RegionRect2i clip_rect(1, 1, grid_size - 2, grid_size - 2); const List > &subregions = job->subregions; List initial_regions; -#if 0 - assert(g->regions.size() == 0); -#endif if (subregions.size() == 0) { flecs::log::err("nothing to do"); return; @@ -131,7 +129,7 @@ void grow_job_queue::job_initial(struct grow_job *job) assert(rtree->check(grid_floor_e)); grid_floor_e.modified(); grid_floor_e.get()->dump(grid_floor_e); - grid_floor_e.get_mut()->grow(grid_floor_e); + grid_floor_e.get_mut()->grow(grid_floor_e, true); grid_floor_e.modified(); grid_floor_e.get()->dump(grid_floor_e); // grid_floor_e.get()->place(grid_floor_e); @@ -162,109 +160,6 @@ void grow_job_queue::job_initial(struct grow_job *job) e = e->next(); } -#if 0 - while (fe) { - flecs::entity ce = fe->get().first; - float area = fe->get().second; - flecs::log::warn("generating positions for: %s", - ce.path().c_str()); - job->grid.filter_candidates(ce, area, clip_rect); - fe = fe->next(); - } -#endif -#if 0 - job->grid.place_regions(grid_floor_e); - - flecs::log::dbg("Running grow..."); - queries.get_qr().each( - [this](flecs::entity grid_floor_e, - WorldEditor::components::buildings_layout_grid_floor &fl, - growth_regions &g) { - struct grid_misc grd; - if (g.complete) - return; - grd.grow_region_rects(grid_floor_e, fl, g); - grd.place_region_cells(grid_floor_e, fl, g); - }); - queries.get_qr().each( - [](flecs::entity grid_floor_e, - WorldEditor::components::buildings_layout_grid_floor &fl, - growth_regions &g) { - int i; - for (i = 0; i < (int)g.regions.size(); i++) - g.regions.write[i].complete = true; - g.complete = true; - }); - grid_e.world() - .system(grid_e.world().lookup( - (module_name + "::GrowCommitQueue").ascii().ptr())) - .run(); - queries.get_mark_cells().each([](flecs::entity e, - const WorldEditor::components:: - buildings_layout_grid_cell - &cell) { - int grid_size = - e.parent() - .get() - ->grid_size; - int i; - Vector2i position(cell.index % grid_size, - cell.index / grid_size); - Vector2 west(position.x - 1, position.y); - Vector2 north(position.x, position.y - 1); - Vector2 east(position.x + 1, position.y); - Vector2 south(position.x, position.y + 1); - int west_id = west.x + grid_size * west.y; - int north_id = north.x + grid_size * north.y; - int east_id = east.x + grid_size * east.y; - int south_id = south.x + grid_size * south.y; - std::vector neighbors = { west_id, north_id, east_id, - south_id }; - bool outside = false; - bool border = false; - for (i = 0; i < (int)neighbors.size(); i++) { - int id = neighbors[i]; - print_line("id=" + itos(id)); - if (!e.parent() - .get() - ->cells.has(id)) { - outside = true; - break; - } - } - for (i = 0; i < (int)neighbors.size(); i++) { - int id = neighbors[i]; - print_line("id=" + itos(id)); - String neighbor_name = "cell_" + itos(id); - flecs::entity neighbor_e = - e.parent().lookup(neighbor_name.ascii().ptr()); - if (!neighbor_e.is_valid()) - continue; - const WorldEditor::components::buildings_layout_grid_cell - *neighbor_cell = neighbor_e.get< - WorldEditor::components:: - buildings_layout_grid_cell>(); - if (cell.type != neighbor_cell->type) { - border = true; - break; - } - } - if (outside) - e.add(); - else - e.add(); - if (border) - e.add(); - print_line("outside: " + itos(outside)); - print_line("position: " + (position.operator String())); - print_line("grid size: " + itos(grid_size)); - print_line("tile index: " + itos(cell.index)); - }); - flecs::log::dbg("initial: region count: %d", g->regions.size()); - assert(g->regions.size() > 0); -#endif assert(rtree->check(grid_floor_e)); } void grow_job_queue::job_common(struct grow_job *job) diff --git a/src/modules/stream/ui/region_tree.cpp b/src/modules/stream/ui/region_tree.cpp index 5d85406..ffc1016 100644 --- a/src/modules/stream/ui/region_tree.cpp +++ b/src/modules/stream/ui/region_tree.cpp @@ -102,7 +102,7 @@ void region_tree::dump(flecs::entity grid_floor_e) const } } -void region_tree::grow(flecs::entity grid_floor_e) +void region_tree::grow(flecs::entity grid_floor_e, bool limited) { List grow_list; List queue; @@ -161,18 +161,28 @@ void region_tree::grow(flecs::entity grid_floor_e) break; case 1: candidate = item->region.rect; - candidate.size.x += 1; + candidate.position.x -= 1; + candidate.size.x += 2; break; case 2: candidate = item->region.rect; - candidate.size.y += 1; + candidate.position.y -= 1; + candidate.size.y += 2; break; case 3: + candidate = item->region.rect; + candidate.size.x += 1; + break; + case 4: + candidate = item->region.rect; + candidate.size.y += 1; + break; + case 5: candidate = item->region.rect; candidate.position.x -= 1; candidate.size.x += 1; break; - case 4: + case 6: candidate = item->region.rect; candidate.position.y -= 1; candidate.size.y += 1; @@ -206,6 +216,9 @@ void region_tree::grow(flecs::entity grid_floor_e) if (ok) { struct region backup = item->region; item->update_candidate(candidate); + if (!limited && state[item] == 0) + item->region.remains_area = + backup.remains_area; if (!base_rtree->check(grid_floor_e)) { item->region = backup; flecs::log::err( @@ -215,6 +228,9 @@ void region_tree::grow(flecs::entity grid_floor_e) false; state[item]++; } + if (state[item] > 0 && + item->region.remains_area < 0) + state[item]++; assert(base_rtree->check(grid_floor_e)); } else { flecs::log::err("can't update candidate"); @@ -222,16 +238,19 @@ void region_tree::grow(flecs::entity grid_floor_e) item->region.can_grow_square = false; state[item]++; } - if (item->region.remains_area < -2) { - item->region.can_grow = false; +#if 0 + if () { item->region.can_grow_square = false; + item->region.can_grow = false; item->region.complete = true; } +#endif grow_count++; - if (item->region.can_grow && state[item] < 5) + if (item->region.can_grow && state[item] < 7) queue.push_back(item); else { item->region.can_grow = false; + item->region.can_grow_square = false; item->region.complete = true; } e = e->next(); @@ -287,6 +306,12 @@ bool region_tree::check(flecs::entity grid_floor_e) const (check_regions[i].operator String()).ascii().ptr()); int ok = true; for (i = 0; i < (int)check_regions.size(); i++) { + float aspect = (float)check_regions[i].size.x / + (float)check_regions[i].size.y; + if (aspect < 0.25f || aspect > 4.0f) { + ok = false; + break; + } if (!region.rect.encloses(check_regions[i])) { flecs::log::err("region is not inside parent"); ok = false; diff --git a/src/modules/stream/ui/region_tree.h b/src/modules/stream/ui/region_tree.h index 69e6398..0a47774 100644 --- a/src/modules/stream/ui/region_tree.h +++ b/src/modules/stream/ui/region_tree.h @@ -15,7 +15,7 @@ struct region_tree { return children.size() == 0; } void dump(flecs::entity grid_floor_e) const; - void grow(flecs::entity grid_floor_e); + void grow(flecs::entity grid_floor_e, bool limited = true); bool check(flecs::entity grid_floor_e) const; void place(flecs::entity grid_floor_e) const; void get_rects(List *rect_list) const;