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

View File

@@ -543,3 +543,36 @@ void ElementData::save_data()
conf_exterior_grid);
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);
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));
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;
Transform xform = node->get_transform();
xform.basis = Basis().rotated(
Vector3(0, 1, 0), rotation * Math_PI / 2.0f);
node->set_transform(xform);
int ch;
Spatial *node = get_grid_node(key, exterior, fl, i);
for (ch = 0; ch < node->get_child_count(); ch++) {
Node *child = node->get_child(ch);
node->remove_child(child);
child->queue_delete();
}
return item_data.get<struct grid_floor_item_node>()->node;
}
int get_closest_node_on_floor(const String &key, bool exterior, int fl,
const Vector3 &position)