Reworked region creation
This commit is contained in:
@@ -50,8 +50,6 @@ public:
|
|||||||
|
|
||||||
flecs::entity get_layout_grid_base();
|
flecs::entity get_layout_grid_base();
|
||||||
flecs::entity get_layout_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);
|
bool have_cell(flecs::entity floor_e, int id);
|
||||||
void grow_cell(flecs::entity seed_e, int id);
|
void grow_cell(flecs::entity seed_e, int id);
|
||||||
void queue_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)
|
bool BuildingLayoutGraph::graph_module::have_cell(flecs::entity floor_e, int id)
|
||||||
{
|
{
|
||||||
if (floor_e.get<WorldEditor::components::buildings_layout_grid_floor>()
|
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());
|
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,
|
bool BuildingLayoutGraph::graph_module::check_region(flecs::entity floor_e,
|
||||||
int index,
|
int index,
|
||||||
const Rect2i &rect) const
|
const Rect2i &rect) const
|
||||||
|
|||||||
@@ -64,6 +64,8 @@ struct growth_regions {
|
|||||||
void create_region(flecs::entity floor_e, flecs::entity seed_e,
|
void create_region(flecs::entity floor_e, flecs::entity seed_e,
|
||||||
flecs::entity region_e, const Vector2i &position,
|
flecs::entity region_e, const Vector2i &position,
|
||||||
float area);
|
float area);
|
||||||
|
flecs::entity create_cell(flecs::entity floor_e, flecs::entity region_e,
|
||||||
|
int id);
|
||||||
};
|
};
|
||||||
|
|
||||||
struct make_random {
|
struct make_random {
|
||||||
|
|||||||
@@ -108,60 +108,35 @@ struct grid_misc {
|
|||||||
out:
|
out:
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
struct region_desc {
|
void place_regions(flecs::entity grid_floor_e)
|
||||||
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)
|
|
||||||
{
|
{
|
||||||
int i;
|
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();
|
flecs::entity grid_e = grid_floor_e.parent();
|
||||||
assert(grid_e.is_valid());
|
assert(grid_e.is_valid());
|
||||||
flecs::log::dbg("grid: %s", grid_e.path().c_str());
|
growth_regions *g = grid_floor_e.get_mut<growth_regions>();
|
||||||
flecs::log::warn("grid floor: %s", grid_floor_e.path().c_str());
|
|
||||||
assert(check_duplicates());
|
|
||||||
int region_count = 0;
|
|
||||||
regions.resize(positions.size());
|
|
||||||
for (i = 0; i < (int)positions.size(); i++) {
|
for (i = 0; i < (int)positions.size(); i++) {
|
||||||
int cell_id = positions[i].second.x +
|
int cell_id = positions[i].second.x +
|
||||||
grid_size * positions[i].second.y;
|
grid_size * positions[i].second.y;
|
||||||
flecs::entity region_e =
|
flecs::entity region_e =
|
||||||
grid_e.world().entity(positions[i].first);
|
grid_e.world().entity(positions[i].first);
|
||||||
assert(region_e.is_valid());
|
assert(region_e.is_valid());
|
||||||
float area = get_entity_area(region_e);
|
|
||||||
Rect2i check;
|
Rect2i check;
|
||||||
check.position = positions[i].second;
|
check.position = positions[i].second;
|
||||||
check.size = Vector2i(1, 1);
|
check.size = Vector2i(1, 1);
|
||||||
assert(obj->check_region(grid_floor_e, -1, check));
|
assert(g->check_region(-1, check));
|
||||||
regions.write[region_count++] = { region_e, cell_id,
|
flecs::entity cell_e =
|
||||||
positions[i].second,
|
g->create_cell(grid_floor_e, region_e, cell_id);
|
||||||
area };
|
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
|
float get_entity_area(flecs::entity e) const
|
||||||
{
|
{
|
||||||
@@ -665,9 +640,7 @@ void BuildingLayoutGraph::graph_module::growth_module(flecs::world &ecs,
|
|||||||
base_floor_e);
|
base_floor_e);
|
||||||
create_floor_components(grid_floor_e,
|
create_floor_components(grid_floor_e,
|
||||||
base_floor_e, size);
|
base_floor_e, size);
|
||||||
grid.setup_floor(grid_floor_e, size.grid_size,
|
grid.place_regions(grid_floor_e);
|
||||||
this);
|
|
||||||
grid.place_regions(grid_floor_e, this);
|
|
||||||
|
|
||||||
me = me->next();
|
me = me->next();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user