Browse Source

Merge pull request #29109 from RandomShaper/fix_onion_skinning

Fix onion skinning
Rémi Verschelde 6 years ago
parent
commit
c088386c5b

+ 2 - 1
editor/plugins/animation_player_editor_plugin.cpp

@@ -1431,6 +1431,7 @@ void AnimationPlayerEditor::_prepare_onion_layers_2() {
 		new_state["show_rulers"] = false;
 		new_state["show_guides"] = false;
 		new_state["show_helpers"] = false;
+		new_state["show_zoom_control"] = false;
 		// TODO: Save/restore only affected entries
 		CanvasItemEditor::get_singleton()->set_state(new_state);
 	}
@@ -1483,7 +1484,7 @@ void AnimationPlayerEditor::_prepare_onion_layers_2() {
 		if (valid) {
 			player->seek(pos, true);
 			get_tree()->flush_transform_notifications(); // Needed for transforms of Spatials
-			values_backup.update_skeletons(); // Needed for Skeletons
+			values_backup.update_skeletons(); // Needed for Skeletons (2D & 3D)
 
 			VS::get_singleton()->viewport_set_active(onion.captures[cidx], true);
 			VS::get_singleton()->viewport_set_parent_viewport(root_vp, onion.captures[cidx]);

+ 13 - 1
editor/plugins/canvas_item_editor_plugin.cpp

@@ -4009,6 +4009,7 @@ void CanvasItemEditor::_popup_callback(int p_op) {
 			show_rulers = !show_rulers;
 			int idx = view_menu->get_popup()->get_item_index(SHOW_RULERS);
 			view_menu->get_popup()->set_item_checked(idx, show_rulers);
+			_update_scrollbars();
 			viewport->update();
 		} break;
 		case SHOW_GUIDES: {
@@ -4531,6 +4532,7 @@ Dictionary CanvasItemEditor::get_state() const {
 	state["show_rulers"] = show_rulers;
 	state["show_guides"] = show_guides;
 	state["show_helpers"] = show_helpers;
+	state["show_zoom_control"] = zoom_hb->is_visible();
 	state["show_edit_locks"] = show_edit_locks;
 	state["snap_rotation"] = snap_rotation;
 	state["snap_relative"] = snap_relative;
@@ -4541,6 +4543,7 @@ Dictionary CanvasItemEditor::get_state() const {
 
 void CanvasItemEditor::set_state(const Dictionary &p_state) {
 
+	bool update_scrollbars = false;
 	Dictionary state = p_state;
 	if (state.has("zoom")) {
 		zoom = p_state["zoom"];
@@ -4549,7 +4552,7 @@ void CanvasItemEditor::set_state(const Dictionary &p_state) {
 	if (state.has("ofs")) {
 		view_offset = p_state["ofs"];
 		previous_update_view_offset = view_offset;
-		_update_scrollbars();
+		update_scrollbars = true;
 	}
 
 	if (state.has("grid_offset")) {
@@ -4637,6 +4640,7 @@ void CanvasItemEditor::set_state(const Dictionary &p_state) {
 		show_rulers = state["show_rulers"];
 		int idx = view_menu->get_popup()->get_item_index(SHOW_RULERS);
 		view_menu->get_popup()->set_item_checked(idx, show_rulers);
+		update_scrollbars = true;
 	}
 
 	if (state.has("show_guides")) {
@@ -4657,6 +4661,11 @@ void CanvasItemEditor::set_state(const Dictionary &p_state) {
 		view_menu->get_popup()->set_item_checked(idx, show_edit_locks);
 	}
 
+	if (state.has("show_zoom_control")) {
+		// This one is not user-controllable, but instrumentable
+		zoom_hb->set_visible(state["show_zoom_control"]);
+	}
+
 	if (state.has("snap_rotation")) {
 		snap_rotation = state["snap_rotation"];
 		int idx = snap_config_menu->get_popup()->get_item_index(SNAP_USE_ROTATION);
@@ -4681,6 +4690,9 @@ void CanvasItemEditor::set_state(const Dictionary &p_state) {
 		skeleton_menu->get_popup()->set_item_checked(idx, skeleton_show_bones);
 	}
 
+	if (update_scrollbars) {
+		_update_scrollbars();
+	}
 	viewport->update();
 }
 

+ 6 - 0
scene/2d/skeleton_2d.h

@@ -39,6 +39,9 @@ class Bone2D : public Node2D {
 	GDCLASS(Bone2D, Node2D)
 
 	friend class Skeleton2D;
+#ifdef TOOLS_ENABLED
+	friend class AnimatedValuesBackup;
+#endif
 
 	Bone2D *parent_bone;
 	Skeleton2D *skeleton;
@@ -71,6 +74,9 @@ class Skeleton2D : public Node2D {
 	GDCLASS(Skeleton2D, Node2D);
 
 	friend class Bone2D;
+#ifdef TOOLS_ENABLED
+	friend class AnimatedValuesBackup;
+#endif
 
 	struct Bone {
 		bool operator<(const Bone &p_bone) const {

+ 8 - 0
scene/animation/animation_player.cpp

@@ -37,12 +37,20 @@
 
 #ifdef TOOLS_ENABLED
 #include "editor/editor_settings.h"
+#include "scene/2d/skeleton_2d.h"
 
 void AnimatedValuesBackup::update_skeletons() {
 
 	for (int i = 0; i < entries.size(); i++) {
 		if (entries[i].bone_idx != -1) {
+			// 3D bone
 			Object::cast_to<Skeleton>(entries[i].object)->notification(Skeleton::NOTIFICATION_UPDATE_SKELETON);
+		} else {
+			Bone2D *bone = Object::cast_to<Bone2D>(entries[i].object);
+			if (bone && bone->skeleton) {
+				// 2D bone
+				bone->skeleton->_update_transform();
+			}
 		}
 	}
 }