You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-04 12:00:25 +00:00
add support for visualizing bones in Advanced Import Settings
When an imported model Skeleton3D type node is selected, the bones are drawn using lines or octahedrons to provide a clearer reference to their position. Refactored Skeleton3DGizmoPlugin::redraw now uses a static function to generate bone meshes
This commit is contained in:
committed by
Saracen
parent
db76de5de8
commit
030fd71da2
@@ -37,6 +37,7 @@
|
||||
#include "editor/editor_settings.h"
|
||||
#include "editor/editor_string_names.h"
|
||||
#include "editor/gui/editor_file_dialog.h"
|
||||
#include "editor/plugins/skeleton_3d_editor_plugin.h"
|
||||
#include "editor/themes/editor_scale.h"
|
||||
#include "scene/3d/importer_mesh_instance_3d.h"
|
||||
#include "scene/animation/animation_player.h"
|
||||
@@ -419,7 +420,9 @@ void SceneImportSettingsDialog::_fill_scene(Node *p_node, TreeItem *p_parent_ite
|
||||
animation_player->connect(SceneStringName(animation_finished), callable_mp(this, &SceneImportSettingsDialog::_animation_finished));
|
||||
} else if (Object::cast_to<Skeleton3D>(p_node)) {
|
||||
category = ResourceImporterScene::INTERNAL_IMPORT_CATEGORY_SKELETON_3D_NODE;
|
||||
skeletons.push_back(Object::cast_to<Skeleton3D>(p_node));
|
||||
Skeleton3D *skeleton = Object::cast_to<Skeleton3D>(p_node);
|
||||
skeleton->connect(SNAME("tree_entered"), callable_mp(this, &SceneImportSettingsDialog::_skeleton_tree_entered).bind(skeleton));
|
||||
skeletons.push_back(skeleton);
|
||||
} else {
|
||||
category = ResourceImporterScene::INTERNAL_IMPORT_CATEGORY_NODE;
|
||||
}
|
||||
@@ -480,6 +483,11 @@ void SceneImportSettingsDialog::_fill_scene(Node *p_node, TreeItem *p_parent_ite
|
||||
contents_aabb.merge_with(aabb);
|
||||
}
|
||||
}
|
||||
|
||||
Skeleton3D *skeleton = Object::cast_to<Skeleton3D>(p_node);
|
||||
if (skeleton) {
|
||||
bones_mesh_preview->set_mesh(Skeleton3DGizmoPlugin::get_bones_mesh(skeleton, -1, true));
|
||||
}
|
||||
}
|
||||
|
||||
void SceneImportSettingsDialog::_update_scene() {
|
||||
@@ -800,6 +808,7 @@ void SceneImportSettingsDialog::_select(Tree *p_from, const String &p_type, cons
|
||||
mesh_preview->hide();
|
||||
_reset_animation();
|
||||
|
||||
bones_mesh_preview->hide();
|
||||
if (Object::cast_to<Node3D>(scene)) {
|
||||
Object::cast_to<Node3D>(scene)->show();
|
||||
}
|
||||
@@ -834,6 +843,7 @@ void SceneImportSettingsDialog::_select(Tree *p_from, const String &p_type, cons
|
||||
scene_import_settings_data->category = ResourceImporterScene::INTERNAL_IMPORT_CATEGORY_ANIMATION_NODE;
|
||||
} else if (Object::cast_to<Skeleton3D>(nd.node)) {
|
||||
scene_import_settings_data->category = ResourceImporterScene::INTERNAL_IMPORT_CATEGORY_SKELETON_3D_NODE;
|
||||
bones_mesh_preview->show();
|
||||
} else {
|
||||
scene_import_settings_data->category = ResourceImporterScene::INTERNAL_IMPORT_CATEGORY_NODE;
|
||||
scene_import_settings_data->hide_options = editing_animation;
|
||||
@@ -1055,6 +1065,10 @@ void SceneImportSettingsDialog::_animation_slider_value_changed(double p_value)
|
||||
animation_player->seek(p_value * animation_map[selected_id].animation->get_length(), true);
|
||||
}
|
||||
|
||||
void SceneImportSettingsDialog::_skeleton_tree_entered(Skeleton3D *skeleton) {
|
||||
bones_mesh_preview->set_skeleton_path(skeleton->get_path());
|
||||
}
|
||||
|
||||
void SceneImportSettingsDialog::_animation_finished(const StringName &p_name) {
|
||||
Animation::LoopMode loop_mode = animation_loop_mode;
|
||||
|
||||
@@ -1800,6 +1814,13 @@ SceneImportSettingsDialog::SceneImportSettingsDialog() {
|
||||
collider_mat->set_albedo(Color(0.5, 0.5, 1.0));
|
||||
}
|
||||
|
||||
{
|
||||
bones_mesh_preview = memnew(MeshInstance3D);
|
||||
bones_mesh_preview->set_cast_shadows_setting(GeometryInstance3D::SHADOW_CASTING_SETTING_OFF);
|
||||
bones_mesh_preview->set_skeleton_path(NodePath());
|
||||
base_viewport->add_child(bones_mesh_preview);
|
||||
}
|
||||
|
||||
inspector = memnew(EditorInspector);
|
||||
inspector->set_custom_minimum_size(Size2(300 * EDSCALE, 0));
|
||||
inspector->connect(SNAME("property_edited"), callable_mp(this, &SceneImportSettingsDialog::_inspector_property_edited));
|
||||
|
||||
Reference in New Issue
Block a user