Skip to content

Commit

Permalink
Merge pull request #82471 from SaracenOne/recache_bone_attachment
Browse files Browse the repository at this point in the history
Reimport bone attachment fixes
  • Loading branch information
akien-mga committed Oct 30, 2023
2 parents 9144457 + 4b671ee commit e2c79bc
Show file tree
Hide file tree
Showing 5 changed files with 48 additions and 1 deletion.
25 changes: 24 additions & 1 deletion editor/editor_node.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@
#include "core/version.h"
#include "editor/editor_string_names.h"
#include "main/main.h"
#include "scene/3d/bone_attachment_3d.h"
#include "scene/gui/color_picker.h"
#include "scene/gui/dialogs.h"
#include "scene/gui/file_dialog.h"
Expand Down Expand Up @@ -6066,6 +6067,27 @@ void EditorNode::_file_access_close_error_notify_impl(const String &p_str) {
add_io_error(vformat(TTR("Unable to write to file '%s', file in use, locked or lacking permissions."), p_str));
}

// Since we felt that a bespoke NOTIFICATION might not be desirable, this function
// provides the hardcoded callbacks to address known bugs which occur on certain
// nodes during reimport.
// Ideally, we should probably agree on a standardized method name which could be
// called from here instead.
void EditorNode::_notify_scene_updated(Node *p_node) {
Skeleton3D *skel_3d = Object::cast_to<Skeleton3D>(p_node);
if (skel_3d) {
skel_3d->reset_bone_poses();
} else {
BoneAttachment3D *attachment = Object::cast_to<BoneAttachment3D>(p_node);
if (attachment) {
attachment->notify_rebind_required();
}
}

for (int i = 0; i < p_node->get_child_count(); i++) {
_notify_scene_updated(p_node->get_child(i));
}
}

void EditorNode::reload_scene(const String &p_path) {
int scene_idx = -1;
for (int i = 0; i < editor_data.get_edited_scene_count(); i++) {
Expand Down Expand Up @@ -6449,10 +6471,11 @@ void EditorNode::reload_instances_with_path_in_edited_scenes(const String &p_ins
}
}
}

// Cleanup the history of the changes.
editor_history.cleanup_history();

current_edited_scene->propagate_notification(NOTIFICATION_NODE_RECACHE_REQUESTED);
_notify_scene_updated(current_edited_scene);
}
edited_scene_map.clear();
}
Expand Down
2 changes: 2 additions & 0 deletions editor/editor_node.h
Original file line number Diff line number Diff line change
Expand Up @@ -692,6 +692,8 @@ class EditorNode : public Node {

void _begin_first_scan();

void _notify_scene_updated(Node *p_node);

protected:
friend class FileSystemDock;

Expand Down
8 changes: 8 additions & 0 deletions modules/gltf/gltf_document.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5846,6 +5846,10 @@ void GLTFDocument::_generate_scene_node(Ref<GLTFState> p_state, const GLTFNodeIn
BoneAttachment3D *bone_attachment = _generate_bone_attachment(p_state, active_skeleton, p_node_index, gltf_node->parent);

p_scene_parent->add_child(bone_attachment, true);

// Find the correct bone_idx so we can properly serialize it.
bone_attachment->set_bone_idx(active_skeleton->find_bone(gltf_node->get_name()));

bone_attachment->set_owner(p_scene_root);

// There is no gltf_node that represent this, so just directly create a unique name
Expand Down Expand Up @@ -5949,6 +5953,10 @@ void GLTFDocument::_generate_skeleton_bone_node(Ref<GLTFState> p_state, const GL
BoneAttachment3D *bone_attachment = _generate_bone_attachment(p_state, active_skeleton, p_node_index, p_node_index);

p_scene_parent->add_child(bone_attachment, true);

// Find the correct bone_idx so we can properly serialize it.
bone_attachment->set_bone_idx(active_skeleton->find_bone(gltf_node->get_name()));

bone_attachment->set_owner(p_scene_root);

// There is no gltf_node that represent this, so just directly create a unique name
Expand Down
10 changes: 10 additions & 0 deletions scene/3d/bone_attachment_3d.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -349,6 +349,16 @@ void BoneAttachment3D::notify_skeleton_bones_renamed(Node *p_base_scene, Skeleto
}
}
}

void BoneAttachment3D::notify_rebind_required() {
// Ensures bindings are properly updated after a scene reload.
_check_unbind();
if (use_external_skeleton) {
_update_external_skeleton_cache();
}
bone_idx = -1;
_check_bind();
}
#endif // TOOLS_ENABLED

BoneAttachment3D::BoneAttachment3D() {
Expand Down
4 changes: 4 additions & 0 deletions scene/3d/bone_attachment_3d.h
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,10 @@ class BoneAttachment3D : public Node3D {

virtual void on_bone_pose_update(int p_bone_index);

#ifdef TOOLS_ENABLED
virtual void notify_rebind_required();
#endif

BoneAttachment3D();
};

Expand Down

0 comments on commit e2c79bc

Please sign in to comment.