Reworked region creation
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user