You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2026-01-06 19:41:11 +00:00
Merge pull request #52298 from DeleteSystem32/meshlib-transform
implement individual mesh transform for meshlibrary items
This commit is contained in:
@@ -47,23 +47,25 @@ void MeshLibraryEditor::edit(const Ref<MeshLibrary> &p_mesh_library) {
|
||||
}
|
||||
}
|
||||
|
||||
void MeshLibraryEditor::_menu_confirm() {
|
||||
void MeshLibraryEditor::_menu_remove_confirm() {
|
||||
switch (option) {
|
||||
case MENU_OPTION_REMOVE_ITEM: {
|
||||
mesh_library->remove_item(to_erase);
|
||||
} break;
|
||||
case MENU_OPTION_UPDATE_FROM_SCENE: {
|
||||
String existing = mesh_library->get_meta("_editor_source_scene");
|
||||
ERR_FAIL_COND(existing == "");
|
||||
_import_scene_cbk(existing);
|
||||
|
||||
} break;
|
||||
default: {
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
void MeshLibraryEditor::_import_scene(Node *p_scene, Ref<MeshLibrary> p_library, bool p_merge) {
|
||||
void MeshLibraryEditor::_menu_update_confirm(bool p_apply_xforms) {
|
||||
cd_update->hide();
|
||||
apply_xforms = p_apply_xforms;
|
||||
String existing = mesh_library->get_meta("_editor_source_scene");
|
||||
ERR_FAIL_COND(existing == "");
|
||||
_import_scene_cbk(existing);
|
||||
}
|
||||
|
||||
void MeshLibraryEditor::_import_scene(Node *p_scene, Ref<MeshLibrary> p_library, bool p_merge, bool p_apply_xforms) {
|
||||
if (!p_merge) {
|
||||
p_library->clear();
|
||||
}
|
||||
@@ -108,6 +110,13 @@ void MeshLibraryEditor::_import_scene(Node *p_scene, Ref<MeshLibrary> p_library,
|
||||
}
|
||||
|
||||
p_library->set_item_mesh(id, mesh);
|
||||
|
||||
if (p_apply_xforms) {
|
||||
p_library->set_item_mesh_transform(id, mi->get_transform());
|
||||
} else {
|
||||
p_library->set_item_mesh_transform(id, Transform3D());
|
||||
}
|
||||
|
||||
mesh_instances[id] = mi;
|
||||
|
||||
Vector<MeshLibrary::ShapeData> collisions;
|
||||
@@ -197,15 +206,16 @@ void MeshLibraryEditor::_import_scene_cbk(const String &p_str) {
|
||||
|
||||
ERR_FAIL_COND_MSG(!scene, "Cannot create an instance from PackedScene '" + p_str + "'.");
|
||||
|
||||
_import_scene(scene, mesh_library, option == MENU_OPTION_UPDATE_FROM_SCENE);
|
||||
_import_scene(scene, mesh_library, option == MENU_OPTION_UPDATE_FROM_SCENE, apply_xforms);
|
||||
|
||||
memdelete(scene);
|
||||
mesh_library->set_meta("_editor_source_scene", p_str);
|
||||
|
||||
menu->get_popup()->set_item_disabled(menu->get_popup()->get_item_index(MENU_OPTION_UPDATE_FROM_SCENE), false);
|
||||
}
|
||||
|
||||
Error MeshLibraryEditor::update_library_file(Node *p_base_scene, Ref<MeshLibrary> ml, bool p_merge) {
|
||||
_import_scene(p_base_scene, ml, p_merge);
|
||||
Error MeshLibraryEditor::update_library_file(Node *p_base_scene, Ref<MeshLibrary> ml, bool p_merge, bool p_apply_xforms) {
|
||||
_import_scene(p_base_scene, ml, p_merge, p_apply_xforms);
|
||||
return OK;
|
||||
}
|
||||
|
||||
@@ -219,16 +229,21 @@ void MeshLibraryEditor::_menu_cbk(int p_option) {
|
||||
String p = editor->get_inspector()->get_selected_path();
|
||||
if (p.begins_with("/MeshLibrary/item") && p.get_slice_count("/") >= 3) {
|
||||
to_erase = p.get_slice("/", 3).to_int();
|
||||
cd->set_text(vformat(TTR("Remove item %d?"), to_erase));
|
||||
cd->popup_centered(Size2(300, 60));
|
||||
cd_remove->set_text(vformat(TTR("Remove item %d?"), to_erase));
|
||||
cd_remove->popup_centered(Size2(300, 60));
|
||||
}
|
||||
} break;
|
||||
case MENU_OPTION_IMPORT_FROM_SCENE: {
|
||||
apply_xforms = false;
|
||||
file->popup_file_dialog();
|
||||
} break;
|
||||
case MENU_OPTION_IMPORT_FROM_SCENE_APPLY_XFORMS: {
|
||||
apply_xforms = true;
|
||||
file->popup_file_dialog();
|
||||
} break;
|
||||
case MENU_OPTION_UPDATE_FROM_SCENE: {
|
||||
cd->set_text(vformat(TTR("Update from existing scene?:\n%s"), String(mesh_library->get_meta("_editor_source_scene"))));
|
||||
cd->popup_centered(Size2(500, 60));
|
||||
cd_update->set_text(vformat(TTR("Update from existing scene?:\n%s"), String(mesh_library->get_meta("_editor_source_scene"))));
|
||||
cd_update->popup_centered(Size2(500, 60));
|
||||
} break;
|
||||
}
|
||||
}
|
||||
@@ -258,16 +273,22 @@ MeshLibraryEditor::MeshLibraryEditor(EditorNode *p_editor) {
|
||||
menu->get_popup()->add_item(TTR("Add Item"), MENU_OPTION_ADD_ITEM);
|
||||
menu->get_popup()->add_item(TTR("Remove Selected Item"), MENU_OPTION_REMOVE_ITEM);
|
||||
menu->get_popup()->add_separator();
|
||||
menu->get_popup()->add_item(TTR("Import from Scene"), MENU_OPTION_IMPORT_FROM_SCENE);
|
||||
menu->get_popup()->add_item(TTR("Import from Scene (Ignore Transforms)"), MENU_OPTION_IMPORT_FROM_SCENE);
|
||||
menu->get_popup()->add_item(TTR("Import from Scene (Apply Transforms)"), MENU_OPTION_IMPORT_FROM_SCENE_APPLY_XFORMS);
|
||||
menu->get_popup()->add_item(TTR("Update from Scene"), MENU_OPTION_UPDATE_FROM_SCENE);
|
||||
menu->get_popup()->set_item_disabled(menu->get_popup()->get_item_index(MENU_OPTION_UPDATE_FROM_SCENE), true);
|
||||
menu->get_popup()->connect("id_pressed", callable_mp(this, &MeshLibraryEditor::_menu_cbk));
|
||||
menu->hide();
|
||||
|
||||
editor = p_editor;
|
||||
cd = memnew(ConfirmationDialog);
|
||||
add_child(cd);
|
||||
cd->get_ok_button()->connect("pressed", callable_mp(this, &MeshLibraryEditor::_menu_confirm));
|
||||
cd_remove = memnew(ConfirmationDialog);
|
||||
add_child(cd_remove);
|
||||
cd_remove->get_ok_button()->connect("pressed", callable_mp(this, &MeshLibraryEditor::_menu_remove_confirm));
|
||||
cd_update = memnew(ConfirmationDialog);
|
||||
add_child(cd_update);
|
||||
cd_update->get_ok_button()->set_text("Apply without Transforms");
|
||||
cd_update->get_ok_button()->connect("pressed", callable_mp(this, &MeshLibraryEditor::_menu_update_confirm), varray(false));
|
||||
cd_update->add_button("Apply with Transforms")->connect("pressed", callable_mp(this, &MeshLibraryEditor::_menu_update_confirm), varray(true));
|
||||
}
|
||||
|
||||
void MeshLibraryEditorPlugin::edit(Object *p_node) {
|
||||
|
||||
@@ -41,23 +41,27 @@ class MeshLibraryEditor : public Control {
|
||||
|
||||
EditorNode *editor;
|
||||
MenuButton *menu;
|
||||
ConfirmationDialog *cd;
|
||||
ConfirmationDialog *cd_remove;
|
||||
ConfirmationDialog *cd_update;
|
||||
EditorFileDialog *file;
|
||||
bool apply_xforms;
|
||||
int to_erase;
|
||||
|
||||
enum {
|
||||
MENU_OPTION_ADD_ITEM,
|
||||
MENU_OPTION_REMOVE_ITEM,
|
||||
MENU_OPTION_UPDATE_FROM_SCENE,
|
||||
MENU_OPTION_IMPORT_FROM_SCENE
|
||||
MENU_OPTION_IMPORT_FROM_SCENE,
|
||||
MENU_OPTION_IMPORT_FROM_SCENE_APPLY_XFORMS
|
||||
};
|
||||
|
||||
int option;
|
||||
void _import_scene_cbk(const String &p_str);
|
||||
void _menu_cbk(int p_option);
|
||||
void _menu_confirm();
|
||||
void _menu_remove_confirm();
|
||||
void _menu_update_confirm(bool p_apply_xforms);
|
||||
|
||||
static void _import_scene(Node *p_scene, Ref<MeshLibrary> p_library, bool p_merge);
|
||||
static void _import_scene(Node *p_scene, Ref<MeshLibrary> p_library, bool p_merge, bool p_apply_xforms);
|
||||
|
||||
protected:
|
||||
static void _bind_methods();
|
||||
@@ -66,7 +70,7 @@ public:
|
||||
MenuButton *get_menu_button() const { return menu; }
|
||||
|
||||
void edit(const Ref<MeshLibrary> &p_mesh_library);
|
||||
static Error update_library_file(Node *p_base_scene, Ref<MeshLibrary> ml, bool p_merge = true);
|
||||
static Error update_library_file(Node *p_base_scene, Ref<MeshLibrary> ml, bool p_merge = true, bool p_apply_xforms = false);
|
||||
|
||||
MeshLibraryEditor(EditorNode *p_editor);
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user