summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorJuan Linietsky <reduzio@gmail.com>2014-09-17 10:01:18 -0300
committerJuan Linietsky <reduzio@gmail.com>2014-09-17 10:01:18 -0300
commit2f79107b9a9feeee39e51b91eaec5477cd388a92 (patch)
tree4d710570d03a095e5978bdd6d00e1e2cd547cec3 /tools
parent574a84b40ceb0d52d4bbee5390c18af08d5d754a (diff)
parent0dd29d0512a4e28f83f7b4529fccf9f126982a5d (diff)
Merge pull request #607 from TheoXD/_reimport_anim_merge
Merge animations during reimport
Diffstat (limited to 'tools')
-rw-r--r--tools/editor/io_plugins/editor_scene_import_plugin.cpp68
1 files changed, 60 insertions, 8 deletions
diff --git a/tools/editor/io_plugins/editor_scene_import_plugin.cpp b/tools/editor/io_plugins/editor_scene_import_plugin.cpp
index 4a52f4914f..2482728c87 100644
--- a/tools/editor/io_plugins/editor_scene_import_plugin.cpp
+++ b/tools/editor/io_plugins/editor_scene_import_plugin.cpp
@@ -1548,22 +1548,74 @@ void EditorSceneImportPlugin::_merge_existing_node(Node *p_node,Node *p_imported
skeleton_node->add_bone(skeleton_imported->get_bone_name(i));
skeleton_node->set_bone_parent(i,skeleton_imported->get_bone_parent(i));
skeleton_node->set_bone_rest(i,skeleton_imported->get_bone_rest(i));
- skeleton_node->set_bone_pose(i,skeleton_imported->get_bone_pose(i));
+ //skeleton_node->set_bone_pose(i,skeleton_imported->get_bone_pose(i)); // not in a scene, will throw errors
}
- } else if (p_node->get_type()=="AnimationPlayer") {
+ }
+ else if (p_node->get_type() == "AnimationPlayer") {
//for paths, overwrite path
-
- AnimationPlayer *aplayer_imported =imported_node->cast_to<AnimationPlayer>();
- AnimationPlayer *aplayer_node =p_node->cast_to<AnimationPlayer>();
+ AnimationPlayer *aplayer_imported = imported_node->cast_to<AnimationPlayer>();
+ AnimationPlayer *aplayer_node = p_node->cast_to<AnimationPlayer>();
//use imported bones, obviously
List<StringName> anims;
+ List<StringName> existing_anims;
aplayer_imported->get_animation_list(&anims);
- //use imported animations, could merge some stuff though
- for (List<StringName>::Element *E=anims.front();E;E=E->next()) {
+ aplayer_node->get_animation_list(&existing_anims);
+
+ //use imported animations
+ for (List<StringName>::Element *N = anims.front(); N; N = N->next()) {
+
+ Ref<Animation> candidate = aplayer_imported->get_animation(N->get());
+
+ if (aplayer_node->has_animation(N->get())) {
+
+ Ref<Animation> found = aplayer_node->get_animation(N->get());
+
+ candidate->set_loop(found->has_loop());
+ candidate->set_step(found->get_step());
+
+ //For each track candidate
+ for (int i = 0; i < candidate->get_track_count(); i++) {
+
+ NodePath track_path = candidate->track_get_path(i);
+ // For each track existing
+ for (int x = 0; x < found->get_track_count(); x++) {
+
+ NodePath path_to_compare = found->track_get_path(x);
+
+ if (track_path.hash() == path_to_compare.hash() && candidate->track_get_type(x) == found->track_get_type(i)) {
+ //Tracks matches
+ if (candidate->track_get_interpolation_type(i) != found->track_get_interpolation_type(x))
+ candidate->track_set_interpolation_type(i, found->track_get_interpolation_type(x));
+ if (candidate->track_get_type(i) == Animation::TYPE_VALUE && candidate->value_track_is_continuous(i) != found->value_track_is_continuous(x))
+ candidate->value_track_set_continuous(i, found->value_track_is_continuous(x));
+
+ //Key transitions might have changed, but the animation remained unchanged
+ if (candidate->track_get_key_count(i) == found->track_get_key_count(x)) {
+ for (int k = 0; k < candidate->track_get_key_count(i); k++) {
+
+ if (candidate->track_get_key_transition(i, k) != found->track_get_key_transition(x, k))
+ candidate->track_set_key_transition(i, k, found->track_get_key_transition(x, k));
+ }
+ }
+
+ }
+
+ }
+ }
+
+ // Append function callbacks and values
+ for (int x = 0; x < found->get_track_count(); x++) {
+ if (found->track_get_type(x) == Animation::TYPE_METHOD || found->track_get_type(x) == Animation::TYPE_VALUE)
+ candidate->add_track(found->track_get_type(x), candidate->get_track_count());
+
+ for (int k = 0; k < found->track_get_key_count(x); k++)
+ candidate->track_insert_key(x, found->track_get_key_time(x, k), found->track_get_key_value(x, k), found->track_get_key_transition(x, k));
+ }
+ }
- aplayer_node->add_animation(E->get(),aplayer_imported->get_animation(E->get()));
+ aplayer_node->add_animation(N->get(), candidate);
}
} else if (p_node->get_type()=="CollisionShape") {