Browse Source

Merge pull request #20422 from fire/gltf2_names_3

GLTF2 Bones are now named and their parents are correct.
Rémi Verschelde 7 years ago
parent
commit
e1a1441f4f

+ 15 - 17
editor/import/editor_scene_importer_gltf.cpp

@@ -1711,14 +1711,14 @@ void EditorSceneImporterGLTF::_generate_node(GLTFState &state, int p_node, Node
 #endif
 #endif
 	for (int i = 0; i < n->children.size(); i++) {
 	for (int i = 0; i < n->children.size(); i++) {
 		if (state.nodes[n->children[i]]->joints.size()) {
 		if (state.nodes[n->children[i]]->joints.size()) {
-			_generate_bone(state, n->children[i], skeletons, Vector<int>(), node);
+			_generate_bone(state, n->children[i], skeletons, node);
 		} else {
 		} else {
 			_generate_node(state, n->children[i], node, p_owner, skeletons);
 			_generate_node(state, n->children[i], node, p_owner, skeletons);
 		}
 		}
 	}
 	}
 }
 }
 
 
-void EditorSceneImporterGLTF::_generate_bone(GLTFState &state, int p_node, Vector<Skeleton *> &skeletons, const Vector<int> &p_parent_bones, 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)) {
@@ -1733,30 +1733,28 @@ void EditorSceneImporterGLTF::_generate_bone(GLTFState &state, int p_node, Vecto
 	}
 	}
 
 
 	GLTFNode *n = state.nodes[p_node];
 	GLTFNode *n = state.nodes[p_node];
-	Vector<int> parent_bones;
 
 
 	for (int i = 0; i < n->joints.size(); i++) {
 	for (int i = 0; i < n->joints.size(); i++) {
-		ERR_FAIL_COND(n->joints[i].skin < 0);
+		const int skin = n->joints[i].skin;
+		ERR_FAIL_COND(skin < 0);
 
 
-		int bone_index = n->joints[i].bone;
+		Skeleton *s = skeletons[skin];
+		const GLTFNode *gltf_bone_node = state.nodes[state.skins[skin].bones[n->joints[i].bone].node];
+		const String bone_name = gltf_bone_node->name;
+		const int parent = gltf_bone_node->parent;
+		const int parent_index = s->find_bone(state.nodes[parent]->name);
 
 
-		Skeleton *s = skeletons[n->joints[i].skin];
-		while (s->get_bone_count() <= bone_index) {
-			s->add_bone("Bone " + itos(s->get_bone_count()));
-		}
-
-		if (p_parent_bones.size()) {
-			s->set_bone_parent(bone_index, p_parent_bones[i]);
-		}
-		s->set_bone_rest(bone_index, state.skins[n->joints[i].skin].bones[n->joints[i].bone].inverse_bind.affine_inverse());
+		s->add_bone(bone_name);
+		const int bone_index = s->find_bone(bone_name);
+		s->set_bone_parent(bone_index, parent_index);
+		s->set_bone_rest(bone_index, state.skins[skin].bones[n->joints[i].bone].inverse_bind.affine_inverse());
 
 
 		n->godot_nodes.push_back(s);
 		n->godot_nodes.push_back(s);
 		n->joints[i].godot_bone_index = bone_index;
 		n->joints[i].godot_bone_index = bone_index;
-		parent_bones.push_back(bone_index);
 	}
 	}
 
 
 	for (int i = 0; i < n->children.size(); i++) {
 	for (int i = 0; i < n->children.size(); i++) {
-		_generate_bone(state, n->children[i], skeletons, parent_bones, p_parent_node);
+		_generate_bone(state, n->children[i], skeletons, p_parent_node);
 	}
 	}
 }
 }
 
 
@@ -2070,7 +2068,7 @@ Spatial *EditorSceneImporterGLTF::_generate_scene(GLTFState &state, int p_bake_f
 	}
 	}
 	for (int i = 0; i < state.root_nodes.size(); i++) {
 	for (int i = 0; i < state.root_nodes.size(); i++) {
 		if (state.nodes[state.root_nodes[i]]->joints.size()) {
 		if (state.nodes[state.root_nodes[i]]->joints.size()) {
-			_generate_bone(state, state.root_nodes[i], skeletons, Vector<int>(), root);
+			_generate_bone(state, state.root_nodes[i], skeletons, root);
 		} else {
 		} else {
 			_generate_node(state, state.root_nodes[i], root, root, skeletons);
 			_generate_node(state, state.root_nodes[i], root, root, skeletons);
 		}
 		}

+ 1 - 1
editor/import/editor_scene_importer_gltf.h

@@ -311,7 +311,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 _generate_bone(GLTFState &state, int p_node, Vector<Skeleton *> &skeletons, const Vector<int> &p_parent_bones, 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);