Reworked region creation

This commit is contained in:
2024-11-16 11:42:25 +03:00
parent abd814eba2
commit 74afcaf126
4 changed files with 43 additions and 72 deletions

View File

@@ -50,8 +50,6 @@ public:
flecs::entity get_layout_grid_base();
flecs::entity get_layout_base();
flecs::entity create_cell(flecs::entity floor_e,
flecs::entity region_e, int id);
bool have_cell(flecs::entity floor_e, int id);
void grow_cell(flecs::entity seed_e, int id);
void queue_grow_cell(flecs::entity seed_e, int id);

View File

@@ -177,33 +177,6 @@ flecs::entity BuildingLayoutGraph::graph_module::get_layout_base()
}
}
flecs::entity
BuildingLayoutGraph::graph_module::create_cell(flecs::entity floor_e,
flecs::entity region_e, int id)
{
flecs::entity ret;
if (floor_e.get<WorldEditor::components::buildings_layout_grid_floor>()
->cells.has(id)) {
flecs::log::err("cell %d already exists", id);
return ret;
}
String pname("cell_" + itos(id));
flecs::entity cell_e = floor_e.lookup(pname.ascii().ptr());
assert(!cell_e.is_valid());
cell_e = floor_e.world().entity(pname.ascii().ptr()).child_of(floor_e);
floor_e.get_mut<WorldEditor::components::buildings_layout_grid_floor>()
->cells.insert(id);
floor_e.get_mut<WorldEditor::components::buildings_layout_grid_floor>()
->size_left--;
floor_e.modified<WorldEditor::components::buildings_layout_grid_floor>();
if (cell_e.is_valid()) {
cell_e.set<WorldEditor::components::buildings_layout_grid_cell>(
{ String(region_e.name()), id });
cell_e.add<WorldEditor::components::belongs>(region_e);
}
return cell_e;
}
bool BuildingLayoutGraph::graph_module::have_cell(flecs::entity floor_e, int id)
{
if (floor_e.get<WorldEditor::components::buildings_layout_grid_floor>()
@@ -313,6 +286,31 @@ void growth_regions::create_region(flecs::entity floor_e, flecs::entity seed_e,
region_e.path().c_str());
}
}
flecs::entity growth_regions::create_cell(flecs::entity floor_e,
flecs::entity region_e, int id)
{
flecs::entity ret;
if (floor_e.get<WorldEditor::components::buildings_layout_grid_floor>()
->cells.has(id)) {
flecs::log::err("cell %d already exists", id);
return ret;
}
String pname("cell_" + itos(id));
flecs::entity cell_e = floor_e.lookup(pname.ascii().ptr());
assert(!cell_e.is_valid());
cell_e = floor_e.world().entity(pname.ascii().ptr()).child_of(floor_e);
floor_e.get_mut<WorldEditor::components::buildings_layout_grid_floor>()
->cells.insert(id);
floor_e.get_mut<WorldEditor::components::buildings_layout_grid_floor>()
->size_left--;
floor_e.modified<WorldEditor::components::buildings_layout_grid_floor>();
if (cell_e.is_valid()) {
cell_e.set<WorldEditor::components::buildings_layout_grid_cell>(
{ String(region_e.name()), id });
cell_e.add<WorldEditor::components::belongs>(region_e);
}
return cell_e;
}
bool BuildingLayoutGraph::graph_module::check_region(flecs::entity floor_e,
int index,
const Rect2i &rect) const

View File

@@ -64,6 +64,8 @@ struct growth_regions {
void create_region(flecs::entity floor_e, flecs::entity seed_e,
flecs::entity region_e, const Vector2i &position,
float area);
flecs::entity create_cell(flecs::entity floor_e, flecs::entity region_e,
int id);
};
struct make_random {

View File

@@ -108,60 +108,35 @@ struct grid_misc {
out:
return result;
}
struct region_desc {
flecs::entity region_e;
int cell_id;
Vector2i position;
float area;
template <class T>
void create_region(T *obj, flecs::entity grid_floor_e)
{
flecs::entity cell_e = obj->create_cell(
grid_floor_e, region_e, cell_id);
growth_regions *g =
grid_floor_e.get_mut<growth_regions>();
g->create_region(grid_floor_e, cell_e, region_e,
position, area);
flecs::log::warn("grid cell: %s",
cell_e.path().c_str());
}
};
Vector<struct region_desc> regions;
void setup_floor(flecs::entity grid_floor_e, int grid_size,
BuildingLayoutGraph::graph_module *obj)
void place_regions(flecs::entity grid_floor_e)
{
int i;
assert(grid_floor_e.is_valid());
int grid_size =
grid_floor_e
.get<WorldEditor::components::
buildings_layout_grid_floor>()
->grid_size;
flecs::entity grid_e = grid_floor_e.parent();
assert(grid_e.is_valid());
flecs::log::dbg("grid: %s", grid_e.path().c_str());
flecs::log::warn("grid floor: %s", grid_floor_e.path().c_str());
assert(check_duplicates());
int region_count = 0;
regions.resize(positions.size());
growth_regions *g = grid_floor_e.get_mut<growth_regions>();
for (i = 0; i < (int)positions.size(); i++) {
int cell_id = positions[i].second.x +
grid_size * positions[i].second.y;
flecs::entity region_e =
grid_e.world().entity(positions[i].first);
assert(region_e.is_valid());
float area = get_entity_area(region_e);
Rect2i check;
check.position = positions[i].second;
check.size = Vector2i(1, 1);
assert(obj->check_region(grid_floor_e, -1, check));
regions.write[region_count++] = { region_e, cell_id,
positions[i].second,
area };
assert(g->check_region(-1, check));
flecs::entity cell_e =
g->create_cell(grid_floor_e, region_e, cell_id);
float area = get_entity_area(region_e);
g->create_region(grid_floor_e, cell_e, region_e,
positions[i].second, area);
flecs::log::warn("grid cell: %s",
cell_e.path().c_str());
}
regions.resize(region_count);
}
void place_regions(flecs::entity grid_floor_e,
BuildingLayoutGraph::graph_module *obj)
{
int i;
for (i = 0; i < regions.size(); i++)
regions.write[i].create_region(obj, grid_floor_e);
}
float get_entity_area(flecs::entity e) const
{
@@ -665,9 +640,7 @@ void BuildingLayoutGraph::graph_module::growth_module(flecs::world &ecs,
base_floor_e);
create_floor_components(grid_floor_e,
base_floor_e, size);
grid.setup_floor(grid_floor_e, size.grid_size,
this);
grid.place_regions(grid_floor_e, this);
grid.place_regions(grid_floor_e);
me = me->next();
}