Fixed instabilities

This commit is contained in:
2024-10-15 19:59:25 +03:00
parent 3241905ad1
commit b6b5fdada9
4 changed files with 75 additions and 36 deletions

View File

@@ -78,6 +78,7 @@ public:
get_as_node<Control>("%layout_editor")->show(); get_as_node<Control>("%layout_editor")->show();
get_as_node<Spatial>("%bg_floor")->show(); get_as_node<Spatial>("%bg_floor")->show();
{ {
#if 0
// delete children of bg_floor // delete children of bg_floor
int i; int i;
for (i = 0; i < get_as_node<Spatial>("%bg_floor") for (i = 0; i < get_as_node<Spatial>("%bg_floor")
@@ -87,6 +88,7 @@ public:
->get_child(i) ->get_child(i)
->queue_delete(); ->queue_delete();
} }
#endif
visualize_whole(current_layout, is_exterior); visualize_whole(current_layout, is_exterior);
} }
editor->get_viewport()->get_camera()->set_global_translation( editor->get_viewport()->get_camera()->set_global_translation(
@@ -231,6 +233,10 @@ public:
ElementData::get_singleton()->set_grid_element( ElementData::get_singleton()->set_grid_element(
current_layout, is_exterior, current_floor, current_layout, is_exterior, current_floor,
current_cell, element); current_cell, element);
ElementData::get_singleton()->clear_grid_node(current_layout,
is_exterior,
current_floor,
current_cell);
editor->visualize_element_at( editor->visualize_element_at(
element, ElementData::get_singleton()->get_grid_node( element, ElementData::get_singleton()->get_grid_node(
current_layout, is_exterior, current_layout, is_exterior,
@@ -266,6 +272,8 @@ public:
ElementData::get_singleton()->get_grid_node( ElementData::get_singleton()->get_grid_node(
current_layout, is_exterior, current_layout, is_exterior,
current_floor, i); current_floor, i);
ElementData::get_singleton()->clear_grid_node(
current_layout, is_exterior, current_floor, i);
const String &element = const String &element =
ElementData::get_singleton()->get_grid_element( ElementData::get_singleton()->get_grid_element(
current_layout, is_exterior, current_layout, is_exterior,
@@ -302,6 +310,7 @@ public:
ElementData::get_singleton() ElementData::get_singleton()
->get_grid_node(key, exterior, ->get_grid_node(key, exterior,
fl, i); fl, i);
assert(node);
for (j = 0; j < node->get_child_count(); j++) for (j = 0; j < node->get_child_count(); j++)
node->get_child(j)->queue_delete(); node->get_child(j)->queue_delete();
} }
@@ -331,11 +340,16 @@ public:
if (!ElementData::get_singleton()->has_floor( if (!ElementData::get_singleton()->has_floor(
key, exterior, fl)) key, exterior, fl))
continue; continue;
for (i = 0; i < grid_size * grid_size; i++)
ElementData::get_singleton()->clear_grid_node(
key, exterior, fl, i);
for (i = 0; i < grid_size * grid_size; i++) { for (i = 0; i < grid_size * grid_size; i++) {
Spatial *node = Spatial *node =
ElementData::get_singleton() ElementData::get_singleton()
->get_grid_node(key, exterior, ->get_grid_node(key, exterior,
fl, i); fl, i);
assert(node);
assert(node->get_child_count() == 0);
String element = String element =
ElementData::get_singleton() ElementData::get_singleton()
->get_grid_element( ->get_grid_element(
@@ -357,6 +371,9 @@ public:
if (!ElementData::get_singleton()->has_floor( if (!ElementData::get_singleton()->has_floor(
key, exterior, fl)) key, exterior, fl))
continue; continue;
for (i = 0; i < grid_size * grid_size; i++)
ElementData::get_singleton()->clear_grid_node(
key, exterior, fl, i);
for (i = 0; i < grid_size * grid_size; i++) { for (i = 0; i < grid_size * grid_size; i++) {
Spatial *node = Spatial *node =
ElementData::get_singleton() ElementData::get_singleton()
@@ -1068,10 +1085,9 @@ void BuildingLayoutEditor::visualize_element_at(const String &element,
return; return;
const String &element_type = const String &element_type =
ElementData::get_singleton()->get_element_type(element); ElementData::get_singleton()->get_element_type(element);
for (i = 0; i < node->get_child_count(); i++)
node->get_child(i)->queue_delete();
Ref<Mesh> mesh = Ref<Mesh> mesh =
ElementData::get_singleton()->get_element_mesh(element); ElementData::get_singleton()->get_element_mesh(element);
assert(node->get_child_count() == 0);
assert(mesh.is_valid()); assert(mesh.is_valid());
MeshInstance *mi = memnew(MeshInstance); MeshInstance *mi = memnew(MeshInstance);
mi->set_mesh(mesh); mi->set_mesh(mesh);
@@ -1290,29 +1306,41 @@ void BuildingLayoutEditor::select_mode(int mode)
return; return;
if (current_mode != mode) { if (current_mode != mode) {
switch (current_mode) { switch (current_mode) {
case -1:
layout_editor->deactivate();
etype_editor->deactivate();
element_editor->deactivate();
break;
case 0: case 0:
layout_editor->deactivate();
break; break;
case 1: case 1:
etype_editor->deactivate();
break;
case 2:
element_editor->deactivate();
break;
default:
layout_editor->deactivate();
etype_editor->deactivate();
element_editor->deactivate();
break; break;
} }
current_mode = mode; current_mode = mode;
switch (mode) { switch (mode) {
case 0: case 0:
etype_editor->deactivate();
element_editor->deactivate();
layout_editor->activate(); layout_editor->activate();
if (ElementData::get_singleton()->get_element_size() == if (ElementData::get_singleton()->get_element_size() ==
0) 0)
print_error("No elements"); print_error("No elements");
break; break;
case 1: case 1:
element_editor->deactivate();
get_as_node<Spatial>("%bg_floor")->hide(); get_as_node<Spatial>("%bg_floor")->hide();
get_as_node<Spatial>("%refcube") get_as_node<Spatial>("%refcube")
->set_global_transform(Transform()); ->set_global_transform(Transform());
get_viewport()->get_camera()->set_global_translation( get_viewport()->get_camera()->set_global_translation(
Vector3(-10, 10, 10)); Vector3(-10, 10, 10));
element_editor->deactivate();
layout_editor->deactivate();
etype_editor->activate(); etype_editor->activate();
element_keys.clear(); element_keys.clear();
break; break;
@@ -1322,8 +1350,6 @@ void BuildingLayoutEditor::select_mode(int mode)
->set_global_transform(Transform()); ->set_global_transform(Transform());
get_viewport()->get_camera()->set_global_translation( get_viewport()->get_camera()->set_global_translation(
Vector3(-10, 10, 10)); Vector3(-10, 10, 10));
etype_editor->deactivate();
layout_editor->deactivate();
element_editor->activate(); element_editor->activate();
} }
} }

View File

@@ -542,4 +542,37 @@ void ElementData::save_data()
config.set_value("buildings_layout", "grid_layouts", config.set_value("buildings_layout", "grid_layouts",
conf_exterior_grid); conf_exterior_grid);
config.save("res://astream/blayout.conf"); config.save("res://astream/blayout.conf");
}
Spatial *ElementData::get_grid_node(const String &key, bool exterior, int fl,
int i)
{
assert(has_floor(key, exterior, fl));
flecs::entity item_data = get_grid_entity(key, exterior, fl, i);
if (!item_data.has<struct grid_floor_item_node>()) {
Spatial *sp = memnew(Spatial);
get_as_node<Spatial>("%bg_floor")
->call_deferred("add_child", sp);
item_data.set<struct grid_floor_item_node>({ sp });
int x = i % grid_size;
int z = i / grid_size;
int rotation = get_grid_rotation(key, exterior, fl, i);
sp->set_transform(Transform(
Basis().rotated(Vector3(0, 1, 0),
Math_PI * rotation / 2.0f),
Vector3((x - 4) * 4, 1 + 5 * fl, (z - 4) * 4) -
get_as_node<Spatial>("%bg_floor")
->get_transform()
.origin));
} else {
int rotation = get_grid_rotation(key, exterior, fl, i);
const struct grid_floor_item_node *item =
item_data.get<struct grid_floor_item_node>();
Spatial *node = item->node;
assert(node);
Transform xform = node->get_transform();
xform.basis = Basis().rotated(Vector3(0, 1, 0),
rotation * Math_PI / 2.0f);
node->set_transform(xform);
}
return item_data.get<struct grid_floor_item_node>()->node;
} }

View File

@@ -229,36 +229,16 @@ public:
flecs::entity item_data = get_grid_entity(key, exterior, fl, i); flecs::entity item_data = get_grid_entity(key, exterior, fl, i);
item_data.get_mut<grid_floor_item>()->rotation = rotation; item_data.get_mut<grid_floor_item>()->rotation = rotation;
} }
Spatial *get_grid_node(const String &key, bool exterior, int fl, int i) Spatial *get_grid_node(const String &key, bool exterior, int fl, int i);
void clear_grid_node(const String &key, bool exterior, int fl, int i)
{ {
assert(has_floor(key, exterior, fl)); int ch;
flecs::entity item_data = get_grid_entity(key, exterior, fl, i); Spatial *node = get_grid_node(key, exterior, fl, i);
if (!item_data.has<struct grid_floor_item_node>()) { for (ch = 0; ch < node->get_child_count(); ch++) {
Spatial *sp = memnew(Spatial); Node *child = node->get_child(ch);
get_as_node<Spatial>("%bg_floor") node->remove_child(child);
->call_deferred("add_child", sp); child->queue_delete();
item_data.set<struct grid_floor_item_node>({ sp });
int x = i % grid_size;
int z = i / grid_size;
int rotation = get_grid_rotation(key, exterior, fl, i);
sp->set_transform(Transform(
Basis().rotated(Vector3(0, 1, 0),
Math_PI * rotation / 2.0f),
Vector3((x - 4) * 4, 1 + 5 * fl, (z - 4) * 4) -
get_as_node<Spatial>("%bg_floor")
->get_transform()
.origin));
} else {
int rotation = get_grid_rotation(key, exterior, fl, i);
const struct grid_floor_item_node *item =
item_data.get<struct grid_floor_item_node>();
Spatial *node = item->node;
Transform xform = node->get_transform();
xform.basis = Basis().rotated(
Vector3(0, 1, 0), rotation * Math_PI / 2.0f);
node->set_transform(xform);
} }
return item_data.get<struct grid_floor_item_node>()->node;
} }
int get_closest_node_on_floor(const String &key, bool exterior, int fl, int get_closest_node_on_floor(const String &key, bool exterior, int fl,
const Vector3 &position) const Vector3 &position)