Fix skeleton reparenting to also work when the skeleton node is not a bone

Existing code only did the reparenting when the parent node was a bone. This
change fixes that, plus the reparenting code itself, which used the index of
the skin instead of the skin index itself to address the skeleton array.

(cherry picked from commit 1cf7ca87ce)
This commit is contained in:
Daniel Rakos 2019-03-11 15:53:53 +01:00 committed by Rémi Verschelde
parent e31d6367ea
commit b439515d73
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) { 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()); 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); _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) { void EditorSceneImporterGLTF::_generate_bone(GLTFState &state, int p_node, Vector<Skeleton *> &skeletons, Node *p_parent_node) {
ERR_FAIL_INDEX(p_node, state.nodes.size()); ERR_FAIL_INDEX(p_node, state.nodes.size());
if (state.skeleton_nodes.has(p_node)) { if (state.skeleton_nodes.has(p_node)) {
//reparent skeletons to proper place _reparent_skeleton(state, p_node, skeletons, p_parent_node);
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);
}
}
} }
GLTFNode *n = state.nodes[p_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<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); 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_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 _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); void _import_animation(GLTFState &state, AnimationPlayer *ap, int index, int bake_fps, Vector<Skeleton *> skeletons);