Fixed instabilities
This commit is contained in:
Binary file not shown.
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -542,4 +542,37 @@ void ElementData::save_data()
|
||||
config.set_value("buildings_layout", "grid_layouts",
|
||||
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;
|
||||
}
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user