1
0
Fork 0

Merge pull request #26918 from aqnuep/skeleton_reparenting_fix

Fix skeleton reparenting to also work when the skeleton node is not a bone
This commit is contained in:
Rémi Verschelde 2019-04-05 16:48:42 +02:00 committed by GitHub
commit e6979adb1b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 22 additions and 12 deletions

View File

@ -1697,6 +1697,22 @@ void EditorSceneImporterGLTF::_assign_scene_names(GLTFState &state) {
}
}
void EditorSceneImporterGLTF::_reparent_skeleton(GLTFState &state, int p_node, Vector<Skeleton *> &skeletons, Node *p_parent_node) {
//reparent skeletons to proper place
Vector<int> nodes = state.skeleton_nodes[p_node];
for (int i = 0; i < nodes.size(); i++) {
Skeleton *skeleton = skeletons[nodes[i]];
Node *owner = skeleton->get_owner();
skeleton->get_parent()->remove_child(skeleton);
p_parent_node->add_child(skeleton);
skeleton->set_owner(owner);
//may have meshes as children, set owner in them too
for (int j = 0; j < skeleton->get_child_count(); j++) {
skeleton->get_child(j)->set_owner(owner);
}
}
}
void EditorSceneImporterGLTF::_generate_node(GLTFState &state, int p_node, Node *p_parent, Node *p_owner, Vector<Skeleton *> &skeletons) {
ERR_FAIL_INDEX(p_node, state.nodes.size());
@ -1768,24 +1784,17 @@ void EditorSceneImporterGLTF::_generate_node(GLTFState &state, int p_node, Node
_generate_node(state, n->children[i], node, p_owner, skeletons);
}
}
if (state.skeleton_nodes.has(p_node)) {
_reparent_skeleton(state, p_node, skeletons, node);
}
}
void EditorSceneImporterGLTF::_generate_bone(GLTFState &state, int p_node, Vector<Skeleton *> &skeletons, Node *p_parent_node) {
ERR_FAIL_INDEX(p_node, state.nodes.size());
if (state.skeleton_nodes.has(p_node)) {
//reparent skeletons to proper place
Vector<int> nodes = state.skeleton_nodes[p_node];
for (int i = 0; i < nodes.size(); i++) {
Node *owner = skeletons[i]->get_owner();
skeletons[i]->get_parent()->remove_child(skeletons[i]);
p_parent_node->add_child(skeletons[i]);
skeletons[i]->set_owner(owner);
//may have meshes as children, set owner in them too
for (int j = 0; j < skeletons[i]->get_child_count(); j++) {
skeletons[i]->get_child(j)->set_owner(owner);
}
}
_reparent_skeleton(state, p_node, skeletons, p_parent_node);
}
GLTFNode *n = state.nodes[p_node];

View File

@ -310,6 +310,7 @@ class EditorSceneImporterGLTF : public EditorSceneImporter {
Vector<Basis> _decode_accessor_as_basis(GLTFState &state, int p_accessor, bool p_for_vertex);
Vector<Transform> _decode_accessor_as_xform(GLTFState &state, int p_accessor, bool p_for_vertex);
void _reparent_skeleton(GLTFState &state, int p_node, Vector<Skeleton *> &skeletons, Node *p_parent_node);
void _generate_bone(GLTFState &state, int p_node, Vector<Skeleton *> &skeletons, Node *p_parent_node);
void _generate_node(GLTFState &state, int p_node, Node *p_parent, Node *p_owner, Vector<Skeleton *> &skeletons);
void _import_animation(GLTFState &state, AnimationPlayer *ap, int index, int bake_fps, Vector<Skeleton *> skeletons);