A stab at generating room points. This might need to be thrown out. Committing for fututre reference. Also fixed the other tools menu options.

This commit is contained in:
Relintai 2021-08-13 22:58:12 +02:00
parent 0b42390563
commit 66f4a662c6
4 changed files with 113 additions and 6 deletions

View File

@ -81,6 +81,18 @@ void PropEditorPlugin::convert_scene(Node *root, const String &path) {
} }
} }
void PropEditorPlugin::find_room_points(Variant param) {
SceneTree *st = SceneTree::get_singleton();
if (st) {
Node *scene = st->get_edited_scene_root();
if (scene) {
PropUtils::get_singleton()->generate_room_points_node(scene);
}
}
}
void PropEditorPlugin::_quick_convert_button_pressed() { void PropEditorPlugin::_quick_convert_button_pressed() {
convert_active_scene_to_prop_data(); convert_active_scene_to_prop_data();
} }
@ -98,6 +110,7 @@ PropEditorPlugin::PropEditorPlugin(EditorNode *p_node) {
#if VERSION_MAJOR < 4 #if VERSION_MAJOR < 4
editor->add_tool_menu_item("Convert active scene to PropData", this, "convert_active_scene_to_prop_data"); editor->add_tool_menu_item("Convert active scene to PropData", this, "convert_active_scene_to_prop_data");
editor->add_tool_menu_item("Convert selected scene(s) to PropData", this, "convert_selected_scene_to_prop_data"); editor->add_tool_menu_item("Convert selected scene(s) to PropData", this, "convert_selected_scene_to_prop_data");
editor->add_tool_menu_item("(Prop) Find room points.", this, "find_room_points");
#else #else
#endif #endif
@ -120,8 +133,10 @@ PropEditorPlugin::~PropEditorPlugin() {
} }
void PropEditorPlugin::_bind_methods() { void PropEditorPlugin::_bind_methods() {
ClassDB::bind_method(D_METHOD("convert_active_scene_to_prop_data"), &PropEditorPlugin::convert_active_scene_to_prop_data); ClassDB::bind_method(D_METHOD("convert_active_scene_to_prop_data"), &PropEditorPlugin::_convert_active_scene_to_prop_data);
ClassDB::bind_method(D_METHOD("convert_selected_scene_to_prop_data"), &PropEditorPlugin::convert_selected_scene_to_prop_data); ClassDB::bind_method(D_METHOD("convert_selected_scene_to_prop_data"), &PropEditorPlugin::_convert_active_scene_to_prop_data);
ClassDB::bind_method(D_METHOD("find_room_points"), &PropEditorPlugin::find_room_points);
ClassDB::bind_method(D_METHOD("_quick_convert_button_pressed"), &PropEditorPlugin::_quick_convert_button_pressed); ClassDB::bind_method(D_METHOD("_quick_convert_button_pressed"), &PropEditorPlugin::_quick_convert_button_pressed);
} }

View File

@ -47,6 +47,8 @@ public:
void convert_selected_scene_to_prop_data(); void convert_selected_scene_to_prop_data();
void convert_scene(Node *root, const String &path); void convert_scene(Node *root, const String &path);
void find_room_points(Variant param);
void _convert_active_scene_to_prop_data(Variant param); void _convert_active_scene_to_prop_data(Variant param);
void _convert_selected_scene_to_prop_data(Variant param); void _convert_selected_scene_to_prop_data(Variant param);
void _quick_convert_button_pressed(); void _quick_convert_button_pressed();

View File

@ -28,6 +28,8 @@ SOFTWARE.
#include "scene/3d/room.h" #include "scene/3d/room.h"
#include "core/version.h" #include "core/version.h"
#include "scene/3d/room.h"
#include "scene/3d/room_manager.h"
#if VERSION_MAJOR > 3 #if VERSION_MAJOR > 3
#include "core/config/engine.h" #include "core/config/engine.h"
@ -105,10 +107,6 @@ void PropUtils::_convert_tree(Ref<PropData> prop_data, Node *node, const Transfo
PoolVector3Array points = r->get_points(); PoolVector3Array points = r->get_points();
if (points.size() == 0) {
//TODO generate points
}
prop_data->set_room_bounds(points); prop_data->set_room_bounds(points);
} }
} }
@ -128,6 +126,92 @@ void PropUtils::_convert_tree(Ref<PropData> prop_data, Node *node, const Transfo
} }
} }
bool PropUtils::generate_room_points_node(Node *node) {
ERR_FAIL_COND_V(!ObjectDB::instance_validate(node), false);
Room *r = Object::cast_to<Room>(node);
if (r) {
generate_room_points(r);
return true;
}
for (int i = 0; i < node->get_child_count(); ++i) {
if (generate_room_points_node(node->get_child(i))) {
return true;
}
}
return false;
}
void PropUtils::generate_room_points(Room *room) {
ERR_FAIL_COND(!ObjectDB::instance_validate(room));
Node *rn = room->duplicate();
rn = substitute_prop_classes(rn);
Room *r = Object::cast_to<Room>(rn);
r->set_name("room");
RoomManager *rm = memnew(RoomManager);
rm->set_merge_meshes(false);
rm->add_child(r);
rm->set_roomlist_path(NodePath("./room"));
//don't set owner, so it won't show up in the editor
room->add_child(rm);
r->generate_points();
print_error(String::num(r->get_points().size()));
room->remove_child(rm);
room->set_points(r->get_points());
memdelete(rm);
}
Node *PropUtils::substitute_prop_classes(Node *node) {
ERR_FAIL_COND_V(!ObjectDB::instance_validate(node), nullptr);
//start with children
for (int i = 0; i < node->get_child_count(); ++i) {
substitute_prop_classes(node->get_child(i));
}
Node *n = get_substitute_prop_class(node);
if (n) {
for (int i = 0; i < node->get_child_count();) {
Node *c = node->get_child(i);
node->remove_child(c);
n->add_child(c);
}
memdelete(node);
return n;
}
return node;
}
Node *PropUtils::get_substitute_prop_class(Node *node) {
if (node->has_method("get_substitute_for_room")) {
Node *n = node->call("get_substitute_for_room");
return n;
}
return nullptr;
}
int PropUtils::add_processor(const Ref<PropDataEntry> &processor) { int PropUtils::add_processor(const Ref<PropDataEntry> &processor) {
ERR_FAIL_COND_V(!processor.is_valid(), 0); ERR_FAIL_COND_V(!processor.is_valid(), 0);

View File

@ -41,6 +41,7 @@ SOFTWARE.
class PropData; class PropData;
class PropDataEntry; class PropDataEntry;
class Room;
class PropUtils : public Object { class PropUtils : public Object {
GDCLASS(PropUtils, Object); GDCLASS(PropUtils, Object);
@ -51,6 +52,11 @@ public:
Ref<PropData> convert_tree(Node *root); Ref<PropData> convert_tree(Node *root);
void _convert_tree(Ref<PropData> prop_data, Node *node, const Transform &transform); void _convert_tree(Ref<PropData> prop_data, Node *node, const Transform &transform);
bool generate_room_points_node(Node *node);
void generate_room_points(Room *room);
Node *substitute_prop_classes(Node *node);
Node *get_substitute_prop_class(Node *node);
static int add_processor(const Ref<PropDataEntry> &processor); static int add_processor(const Ref<PropDataEntry> &processor);
static Ref<PropDataEntry> get_processor(const int index); static Ref<PropDataEntry> get_processor(const int index);
static void swap_processors(const int index1, const int index2); static void swap_processors(const int index1, const int index2);