diff options
author | Rémi Verschelde <remi@verschelde.fr> | 2015-12-10 15:19:30 +0100 |
---|---|---|
committer | Rémi Verschelde <remi@verschelde.fr> | 2015-12-10 15:19:30 +0100 |
commit | 964a57cb2a3de549cb85f82c5845d4c46b7af8cc (patch) | |
tree | 71b535ed274e2a226b48e08013135591bd32cd02 | |
parent | 8a94297105e0c67055dcfeaa9643ca6fb734ef04 (diff) | |
parent | 354bc0385bde49c08c5d07942d4b0475c919bfd1 (diff) |
Merge pull request #2883 from TheHX/mesh_editor_plugin
Add StaticBody collision generation for all selected MeshInstance nodes
-rw-r--r-- | tools/editor/plugins/mesh_editor_plugin.cpp | 134 | ||||
-rw-r--r-- | tools/editor/plugins/mesh_editor_plugin.h | 13 |
2 files changed, 75 insertions, 72 deletions
diff --git a/tools/editor/plugins/mesh_editor_plugin.cpp b/tools/editor/plugins/mesh_editor_plugin.cpp index cea774f94b..5314529a23 100644 --- a/tools/editor/plugins/mesh_editor_plugin.cpp +++ b/tools/editor/plugins/mesh_editor_plugin.cpp @@ -1,13 +1,8 @@ #include "mesh_editor_plugin.h" -#include "tools/editor/editor_plugin.h" -#include "tools/editor/editor_node.h" -#include "scene/3d/mesh_instance.h" #include "scene/3d/physics_body.h" #include "scene/3d/body_shape.h" -#include "scene/gui/spin_box.h" #include "scene/gui/box_container.h" -#include "scene/3d/mesh_instance.h" #include "scene/3d/navigation_mesh.h" #include "spatial_editor_plugin.h" @@ -38,92 +33,106 @@ void MeshInstanceEditor::_menu_option(int p_option) { } switch(p_option) { - case MENU_OPTION_CREATE_STATIC_TRIMESH_BODY: { + case MENU_OPTION_CREATE_STATIC_TRIMESH_BODY: + case MENU_OPTION_CREATE_STATIC_CONVEX_BODY: { - Ref<Shape> shape = mesh->create_trimesh_shape(); - if (shape.is_null()) - return; - StaticBody *body = memnew( StaticBody ); - CollisionShape *cshape = memnew( CollisionShape ); - cshape->set_shape(shape); - body->add_child(cshape); - Node *owner = node==get_tree()->get_edited_scene_root() ? node : node->get_owner(); + bool trimesh_shape = (p_option==MENU_OPTION_CREATE_STATIC_TRIMESH_BODY); + EditorSelection *editor_selection = EditorNode::get_singleton()->get_editor_selection(); UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo(); - ur->create_action("Create Static Trimesh"); - ur->add_do_method(node,"add_child",body); - ur->add_do_method(body,"set_owner",owner); - ur->add_do_method(cshape,"set_owner",owner); - ur->add_do_reference(body); - ur->add_undo_method(node,"remove_child",body); - ur->commit_action(); - } break; - case MENU_OPTION_CREATE_STATIC_CONVEX_BODY: { + List<Node*> selection = editor_selection->get_selected_node_list(); - Ref<Shape> shape = mesh->create_convex_shape(); - if (shape.is_null()) - return; - StaticBody *body = memnew( StaticBody ); - CollisionShape *cshape = memnew( CollisionShape ); - cshape->set_shape(shape); - body->add_child(cshape); - Node *owner = node==get_tree()->get_edited_scene_root() ? node : node->get_owner(); + if (selection.empty()) { + Ref<Shape> shape = trimesh_shape ? mesh->create_trimesh_shape() : mesh->create_convex_shape(); + if (shape.is_null()) + return; - UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo(); - ur->create_action("Create Static Trimesh"); - ur->add_do_method(node,"add_child",body); - ur->add_do_method(body,"set_owner",owner); - ur->add_do_method(cshape,"set_owner",owner); - ur->add_do_reference(body); - ur->add_undo_method(node,"remove_child",body); - ur->commit_action(); + CollisionShape *cshape = memnew( CollisionShape ); + cshape->set_shape(shape); + StaticBody *body = memnew( StaticBody ); + body->add_child(cshape); - } break; - case MENU_OPTION_CREATE_TRIMESH_COLLISION_SHAPE: { + Node *owner = node==get_tree()->get_edited_scene_root() ? node : node->get_owner(); + if (trimesh_shape) + ur->create_action("Create Static Trimesh Body"); + else + ur->create_action("Create Static Convex Body"); - if (node==get_tree()->get_edited_scene_root()) { - err_dialog->set_text("This doesn't work on scene root!"); - err_dialog->popup_centered_minsize(); + ur->add_do_method(node,"add_child",body); + ur->add_do_method(body,"set_owner",owner); + ur->add_do_method(cshape,"set_owner",owner); + ur->add_do_reference(body); + ur->add_undo_method(node,"remove_child",body); + ur->commit_action(); return; } - Ref<Shape> shape = mesh->create_trimesh_shape(); - if (shape.is_null()) - return; - CollisionShape *cshape = memnew( CollisionShape ); - cshape->set_shape(shape); - Node *owner = node->get_owner(); + if (trimesh_shape) + ur->create_action("Create Static Trimesh Body"); + else + ur->create_action("Create Static Convex Body"); + + for (List<Node*>::Element *E=selection.front();E;E=E->next()) { + + MeshInstance *instance = E->get()->cast_to<MeshInstance>(); + if (!instance) + continue; + + Ref<Mesh> m = instance->get_mesh(); + if (m.is_null()) + continue; + + Ref<Shape> shape = trimesh_shape ? m->create_trimesh_shape() : m->create_convex_shape(); + if (shape.is_null()) + continue; + + CollisionShape *cshape = memnew( CollisionShape ); + cshape->set_shape(shape); + StaticBody *body = memnew( StaticBody ); + body->add_child(cshape); + + Node *owner = instance==get_tree()->get_edited_scene_root() ? instance : instance->get_owner(); + + ur->add_do_method(instance,"add_child",body); + ur->add_do_method(body,"set_owner",owner); + ur->add_do_method(cshape,"set_owner",owner); + ur->add_do_reference(body); + ur->add_undo_method(instance,"remove_child",body); + } - UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo(); - ur->create_action("Create Static Trimesh"); - ur->add_do_method(node->get_parent(),"add_child",cshape); - ur->add_do_method(node->get_parent(),"move_child",cshape,node->get_index()+1); - ur->add_do_method(cshape,"set_owner",owner); - ur->add_do_reference(cshape); - ur->add_undo_method(node->get_parent(),"remove_child",cshape); ur->commit_action(); } break; - case MENU_OPTION_CREATE_CONVEX_COLLISION_SHAPE: { + case MENU_OPTION_CREATE_TRIMESH_COLLISION_SHAPE: + case MENU_OPTION_CREATE_CONVEX_COLLISION_SHAPE: { if (node==get_tree()->get_edited_scene_root()) { err_dialog->set_text("This doesn't work on scene root!"); err_dialog->popup_centered_minsize(); return; } - Ref<Shape> shape = mesh->create_convex_shape(); + + bool trimesh_shape = (p_option==MENU_OPTION_CREATE_TRIMESH_COLLISION_SHAPE); + + Ref<Shape> shape = trimesh_shape ? mesh->create_trimesh_shape() : mesh->create_convex_shape(); if (shape.is_null()) return; + CollisionShape *cshape = memnew( CollisionShape ); cshape->set_shape(shape); Node *owner = node->get_owner(); UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo(); - ur->create_action("Create Static Trimesh"); + + if (trimesh_shape) + ur->create_action("Create Trimesh Shape"); + else + ur->create_action("Create Convex Shape"); + ur->add_do_method(node->get_parent(),"add_child",cshape); ur->add_do_method(node->get_parent(),"move_child",cshape,node->get_index()+1); ur->add_do_method(cshape,"set_owner",owner); @@ -132,10 +141,8 @@ void MeshInstanceEditor::_menu_option(int p_option) { ur->commit_action(); } break; - case MENU_OPTION_CREATE_NAVMESH: { - - + case MENU_OPTION_CREATE_NAVMESH: { Ref<NavigationMesh> nmesh = memnew( NavigationMesh ); @@ -158,6 +165,7 @@ void MeshInstanceEditor::_menu_option(int p_option) { ur->add_undo_method(node,"remove_child",nmi); ur->commit_action(); } break; + case MENU_OPTION_CREATE_OUTLINE_MESH: { outline_dialog->popup_centered(Vector2(200, 90)); diff --git a/tools/editor/plugins/mesh_editor_plugin.h b/tools/editor/plugins/mesh_editor_plugin.h index e502b5dc2b..6b3e23f31f 100644 --- a/tools/editor/plugins/mesh_editor_plugin.h +++ b/tools/editor/plugins/mesh_editor_plugin.h @@ -23,24 +23,19 @@ class MeshInstanceEditor : public Node { MENU_OPTION_CREATE_OUTLINE_MESH, }; + MeshInstance *node; + + MenuButton *options; + ConfirmationDialog *outline_dialog; SpinBox *outline_size; AcceptDialog *err_dialog; - - Panel *panel; - MeshInstance *node; - - LineEdit *surface_source; - LineEdit *mesh_source; - - void _menu_option(int p_option); void _create_outline_mesh(); friend class MeshInstanceEditorPlugin; - MenuButton * options; protected: void _node_removed(Node *p_node); |