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<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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user