2
0
Эх сурвалжийг харах

Added the following features to RemoteTransform and RemoteTransform2D:
- Added the ability to toggle changes in position, rotation, and scale
- Added the ability to toggle changes in either local or global coordinates

TwistedTwigleg 8 жил өмнө
parent
commit
3400c42c4d

+ 100 - 1
scene/2d/remote_transform_2d.cpp

@@ -63,7 +63,50 @@ void RemoteTransform2D::_update_remote() {
 		return;
 
 	//todo make faster
-	n->set_global_transform(get_global_transform());
+	if (use_global_coordinates) {
+
+		if (update_remote_position && update_remote_rotation && update_remote_scale) {
+			n->set_global_transform(get_global_transform());
+		} else {
+			Transform2D n_trans = n->get_global_transform();
+			Transform2D our_trans = get_global_transform();
+			Vector2 n_scale = n->get_global_scale();
+
+			if (!update_remote_position)
+				our_trans.set_origin(n_trans.get_origin());
+			if (!update_remote_rotation)
+				our_trans.set_rotation(n_trans.get_rotation());
+
+			n->set_global_transform(our_trans);
+
+			if (update_remote_scale)
+				n->set_scale(get_global_scale());
+			else
+				n->set_scale(n_scale);
+		}
+
+	} else {
+
+		if (update_remote_position && update_remote_rotation && update_remote_scale) {
+			n->set_transform(get_transform());
+		} else {
+			Transform2D n_trans = n->get_transform();
+			Transform2D our_trans = get_transform();
+			Vector2 n_scale = n->get_scale();
+
+			if (!update_remote_position)
+				our_trans.set_origin(n_trans.get_origin());
+			if (!update_remote_rotation)
+				our_trans.set_rotation(n_trans.get_rotation());
+
+			n->set_transform(our_trans);
+
+			if (update_remote_scale)
+				n->set_scale(get_scale());
+			else
+				n->set_scale(n_scale);
+		}
+	}
 }
 
 void RemoteTransform2D::_notification(int p_what) {
@@ -102,6 +145,41 @@ NodePath RemoteTransform2D::get_remote_node() const {
 	return remote_node;
 }
 
+void RemoteTransform2D::set_use_global_coordinates(const bool p_enable) {
+	use_global_coordinates = p_enable;
+}
+
+bool RemoteTransform2D::get_use_global_coordinates() const {
+	return use_global_coordinates;
+}
+
+void RemoteTransform2D::set_update_position(const bool p_update) {
+	update_remote_position = p_update;
+	_update_remote();
+}
+
+bool RemoteTransform2D::get_update_position() const {
+	return update_remote_position;
+}
+
+void RemoteTransform2D::set_update_rotation(const bool p_update) {
+	update_remote_rotation = p_update;
+	_update_remote();
+}
+
+bool RemoteTransform2D::get_update_rotation() const {
+	return update_remote_rotation;
+}
+
+void RemoteTransform2D::set_update_scale(const bool p_update) {
+	update_remote_scale = p_update;
+	_update_remote();
+}
+
+bool RemoteTransform2D::get_update_scale() const {
+	return update_remote_scale;
+}
+
 String RemoteTransform2D::get_configuration_warning() const {
 
 	if (!has_node(remote_node) || !get_node(remote_node) || !get_node(remote_node)->cast_to<Node2D>()) {
@@ -116,11 +194,32 @@ void RemoteTransform2D::_bind_methods() {
 	ClassDB::bind_method(D_METHOD("set_remote_node", "path"), &RemoteTransform2D::set_remote_node);
 	ClassDB::bind_method(D_METHOD("get_remote_node"), &RemoteTransform2D::get_remote_node);
 
+	ClassDB::bind_method(D_METHOD("set_use_global_coordinates", "use_global_coordinates"), &RemoteTransform2D::set_use_global_coordinates);
+	ClassDB::bind_method(D_METHOD("get_use_global_coordinates"), &RemoteTransform2D::get_use_global_coordinates);
+
+	ClassDB::bind_method(D_METHOD("set_update_position", "update_remote_position"), &RemoteTransform2D::set_update_position);
+	ClassDB::bind_method(D_METHOD("get_update_position"), &RemoteTransform2D::get_update_position);
+	ClassDB::bind_method(D_METHOD("set_update_rotation", "update_remote_rotation"), &RemoteTransform2D::set_update_rotation);
+	ClassDB::bind_method(D_METHOD("get_update_rotation"), &RemoteTransform2D::get_update_rotation);
+	ClassDB::bind_method(D_METHOD("set_update_scale", "update_remote_scale"), &RemoteTransform2D::set_update_scale);
+	ClassDB::bind_method(D_METHOD("get_update_scale"), &RemoteTransform2D::get_update_scale);
+
 	ADD_PROPERTY(PropertyInfo(Variant::NODE_PATH, "remote_path"), "set_remote_node", "get_remote_node");
+	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "use_global_coordinates"), "set_use_global_coordinates", "get_use_global_coordinates");
+
+	ADD_GROUP("Update", "update_");
+	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "update_position"), "set_update_position", "get_update_position");
+	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "update_rotation"), "set_update_rotation", "get_update_rotation");
+	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "update_scale"), "set_update_scale", "get_update_scale");
 }
 
 RemoteTransform2D::RemoteTransform2D() {
 
+	use_global_coordinates = true;
+	update_remote_position = true;
+	update_remote_rotation = true;
+	update_remote_scale = true;
+
 	cache = 0;
 	set_notify_transform(true);
 }

+ 17 - 0
scene/2d/remote_transform_2d.h

@@ -37,6 +37,11 @@ class RemoteTransform2D : public Node2D {
 
 	ObjectID cache;
 
+	bool use_global_coordinates;
+	bool update_remote_position;
+	bool update_remote_rotation;
+	bool update_remote_scale;
+
 	void _update_remote();
 	void _update_cache();
 	//void _node_exited_scene();
@@ -48,6 +53,18 @@ public:
 	void set_remote_node(const NodePath &p_remote_node);
 	NodePath get_remote_node() const;
 
+	void set_use_global_coordinates(const bool p_enable);
+	bool get_use_global_coordinates() const;
+
+	void set_update_position(const bool p_update);
+	bool get_update_position() const;
+
+	void set_update_rotation(const bool p_update);
+	bool get_update_rotation() const;
+
+	void set_update_scale(const bool p_update);
+	bool get_update_scale() const;
+
 	virtual String get_configuration_warning() const;
 
 	RemoteTransform2D();

+ 95 - 1
scene/3d/remote_transform.cpp

@@ -63,7 +63,45 @@ void RemoteTransform::_update_remote() {
 		return;
 
 	//todo make faster
-	n->set_global_transform(get_global_transform());
+	if (use_global_coordinates) {
+
+		if (update_remote_position && update_remote_rotation && update_remote_scale) {
+			n->set_global_transform(get_global_transform());
+		} else {
+			Transform n_trans = n->get_global_transform();
+			Transform our_trans = get_global_transform();
+
+			if (!update_remote_position)
+				our_trans.set_origin(n_trans.get_origin());
+
+			n->set_global_transform(our_trans);
+
+			if (!update_remote_rotation)
+				n->set_rotation(n_trans.basis.get_rotation());
+
+			if (!update_remote_scale)
+				n->set_scale(n_trans.basis.get_scale());
+		}
+
+	} else {
+		if (update_remote_position && update_remote_rotation && update_remote_scale) {
+			n->set_global_transform(get_global_transform());
+		} else {
+			Transform n_trans = n->get_transform();
+			Transform our_trans = get_transform();
+
+			if (!update_remote_position)
+				our_trans.set_origin(n_trans.get_origin());
+
+			n->set_transform(our_trans);
+
+			if (!update_remote_rotation)
+				n->set_rotation(n_trans.basis.get_rotation());
+
+			if (!update_remote_scale)
+				n->set_scale(n_trans.basis.get_scale());
+		}
+	}
 }
 
 void RemoteTransform::_notification(int p_what) {
@@ -102,6 +140,41 @@ NodePath RemoteTransform::get_remote_node() const {
 	return remote_node;
 }
 
+void RemoteTransform::set_use_global_coordinates(const bool p_enable) {
+	use_global_coordinates = p_enable;
+}
+
+bool RemoteTransform::get_use_global_coordinates() const {
+	return use_global_coordinates;
+}
+
+void RemoteTransform::set_update_position(const bool p_update) {
+	update_remote_position = p_update;
+	_update_remote();
+}
+
+bool RemoteTransform::get_update_position() const {
+	return update_remote_position;
+}
+
+void RemoteTransform::set_update_rotation(const bool p_update) {
+	update_remote_rotation = p_update;
+	_update_remote();
+}
+
+bool RemoteTransform::get_update_rotation() const {
+	return update_remote_rotation;
+}
+
+void RemoteTransform::set_update_scale(const bool p_update) {
+	update_remote_scale = p_update;
+	_update_remote();
+}
+
+bool RemoteTransform::get_update_scale() const {
+	return update_remote_scale;
+}
+
 String RemoteTransform::get_configuration_warning() const {
 
 	if (!has_node(remote_node) || !get_node(remote_node) || !get_node(remote_node)->cast_to<Spatial>()) {
@@ -116,11 +189,32 @@ void RemoteTransform::_bind_methods() {
 	ClassDB::bind_method(D_METHOD("set_remote_node", "path"), &RemoteTransform::set_remote_node);
 	ClassDB::bind_method(D_METHOD("get_remote_node"), &RemoteTransform::get_remote_node);
 
+	ClassDB::bind_method(D_METHOD("set_use_global_coordinates", "use_global_coordinates"), &RemoteTransform::set_use_global_coordinates);
+	ClassDB::bind_method(D_METHOD("get_use_global_coordinates"), &RemoteTransform::get_use_global_coordinates);
+
+	ClassDB::bind_method(D_METHOD("set_update_position", "update_remote_position"), &RemoteTransform::set_update_position);
+	ClassDB::bind_method(D_METHOD("get_update_position"), &RemoteTransform::get_update_position);
+	ClassDB::bind_method(D_METHOD("set_update_rotation", "update_remote_rotation"), &RemoteTransform::set_update_rotation);
+	ClassDB::bind_method(D_METHOD("get_update_rotation"), &RemoteTransform::get_update_rotation);
+	ClassDB::bind_method(D_METHOD("set_update_scale", "update_remote_scale"), &RemoteTransform::set_update_scale);
+	ClassDB::bind_method(D_METHOD("get_update_scale"), &RemoteTransform::get_update_scale);
+
 	ADD_PROPERTY(PropertyInfo(Variant::NODE_PATH, "remote_path"), "set_remote_node", "get_remote_node");
+	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "use_global_coordinates"), "set_use_global_coordinates", "get_use_global_coordinates");
+
+	ADD_GROUP("Update", "update_");
+	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "update_position"), "set_update_position", "get_update_position");
+	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "update_rotation"), "set_update_rotation", "get_update_rotation");
+	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "update_scale"), "set_update_scale", "get_update_scale");
 }
 
 RemoteTransform::RemoteTransform() {
 
+	use_global_coordinates = true;
+	update_remote_position = true;
+	update_remote_rotation = true;
+	update_remote_scale = true;
+
 	cache = 0;
 	set_notify_transform(true);
 }

+ 17 - 0
scene/3d/remote_transform.h

@@ -39,6 +39,11 @@ class RemoteTransform : public Spatial {
 
 	ObjectID cache;
 
+	bool use_global_coordinates;
+	bool update_remote_position;
+	bool update_remote_rotation;
+	bool update_remote_scale;
+
 	void _update_remote();
 	void _update_cache();
 
@@ -50,6 +55,18 @@ public:
 	void set_remote_node(const NodePath &p_remote_node);
 	NodePath get_remote_node() const;
 
+	void set_use_global_coordinates(const bool p_enable);
+	bool get_use_global_coordinates() const;
+
+	void set_update_position(const bool p_update);
+	bool get_update_position() const;
+
+	void set_update_rotation(const bool p_update);
+	bool get_update_rotation() const;
+
+	void set_update_scale(const bool p_update);
+	bool get_update_scale() const;
+
 	virtual String get_configuration_warning() const;
 
 	RemoteTransform();