Browse Source

Merge pull request #47635 from aaronfranke/node2d3d-transform

Display a matrix for Node2D and don't display a duplicate origin
Aaron Franke 4 years ago
parent
commit
f27fa5139d

+ 1 - 1
doc/classes/Node2D.xml

@@ -115,7 +115,7 @@
 		</member>
 		</member>
 		<member name="skew" type="float" setter="set_skew" getter="get_skew" default="0.0">
 		<member name="skew" type="float" setter="set_skew" getter="get_skew" default="0.0">
 		</member>
 		</member>
-		<member name="transform" type="Transform2D" setter="set_transform" getter="get_transform">
+		<member name="transform" type="Transform2D" setter="set_transform" getter="get_transform" default="Transform2D(1, 0, 0, 1, 0, 0)">
 			Local [Transform2D].
 			Local [Transform2D].
 		</member>
 		</member>
 		<member name="y_sort_enabled" type="bool" setter="set_y_sort_enabled" getter="is_y_sort_enabled" default="false">
 		<member name="y_sort_enabled" type="bool" setter="set_y_sort_enabled" getter="is_y_sort_enabled" default="false">

+ 3 - 0
doc/classes/Node3D.xml

@@ -255,6 +255,9 @@
 		</method>
 		</method>
 	</methods>
 	</methods>
 	<members>
 	<members>
+		<member name="basis" type="Basis" setter="set_basis" getter="get_basis" default="Basis(1, 0, 0, 0, 1, 0, 0, 0, 1)">
+			Local space [Basis] of this node, with respect to the parent node. This is the same as [code]transform.basis[/code].
+		</member>
 		<member name="global_transform" type="Transform3D" setter="set_global_transform" getter="get_global_transform">
 		<member name="global_transform" type="Transform3D" setter="set_global_transform" getter="get_global_transform">
 			World3D space (global) [Transform3D] of this node.
 			World3D space (global) [Transform3D] of this node.
 		</member>
 		</member>

+ 5 - 3
editor/editor_properties.cpp

@@ -2268,7 +2268,7 @@ void EditorPropertyTransform2D::setup(double p_min, double p_max, double p_step,
 	}
 	}
 }
 }
 
 
-EditorPropertyTransform2D::EditorPropertyTransform2D() {
+EditorPropertyTransform2D::EditorPropertyTransform2D(bool p_include_origin) {
 	GridContainer *g = memnew(GridContainer);
 	GridContainer *g = memnew(GridContainer);
 	g->set_columns(2);
 	g->set_columns(2);
 	add_child(g);
 	add_child(g);
@@ -2278,7 +2278,9 @@ EditorPropertyTransform2D::EditorPropertyTransform2D() {
 		spin[i] = memnew(EditorSpinSlider);
 		spin[i] = memnew(EditorSpinSlider);
 		spin[i]->set_label(desc[i]);
 		spin[i]->set_label(desc[i]);
 		spin[i]->set_flat(true);
 		spin[i]->set_flat(true);
-		g->add_child(spin[i]);
+		if (p_include_origin || i < 4) {
+			g->add_child(spin[i]);
+		}
 		spin[i]->set_h_size_flags(SIZE_EXPAND_FILL);
 		spin[i]->set_h_size_flags(SIZE_EXPAND_FILL);
 		add_focusable(spin[i]);
 		add_focusable(spin[i]);
 		spin[i]->connect("value_changed", callable_mp(this, &EditorPropertyTransform2D::_value_changed), varray(desc[i]));
 		spin[i]->connect("value_changed", callable_mp(this, &EditorPropertyTransform2D::_value_changed), varray(desc[i]));
@@ -3285,7 +3287,7 @@ EditorProperty *EditorInspectorDefaultPlugin::get_editor_for_property(Object *p_
 
 
 		} break;
 		} break;
 		case Variant::TRANSFORM2D: {
 		case Variant::TRANSFORM2D: {
-			EditorPropertyTransform2D *editor = memnew(EditorPropertyTransform2D);
+			EditorPropertyTransform2D *editor = memnew(EditorPropertyTransform2D(p_usage != PROPERTY_USAGE_EDITOR));
 			EditorPropertyRangeHint hint = _parse_range_hint(p_hint, p_hint_text, default_float_step);
 			EditorPropertyRangeHint hint = _parse_range_hint(p_hint, p_hint_text, default_float_step);
 			editor->setup(hint.min, hint.max, hint.step, hint.hide_slider, hint.suffix);
 			editor->setup(hint.min, hint.max, hint.step, hint.hide_slider, hint.suffix);
 			return editor;
 			return editor;

+ 1 - 1
editor/editor_properties.h

@@ -531,7 +531,7 @@ protected:
 public:
 public:
 	virtual void update_property() override;
 	virtual void update_property() override;
 	void setup(double p_min, double p_max, double p_step, bool p_no_slider, const String &p_suffix = String());
 	void setup(double p_min, double p_max, double p_step, bool p_no_slider, const String &p_suffix = String());
-	EditorPropertyTransform2D();
+	EditorPropertyTransform2D(bool p_include_origin = true);
 };
 };
 
 
 class EditorPropertyBasis : public EditorProperty {
 class EditorPropertyBasis : public EditorProperty {

+ 3 - 1
scene/2d/node_2d.cpp

@@ -421,11 +421,13 @@ void Node2D::_bind_methods() {
 	ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "rotation", PROPERTY_HINT_RANGE, "-360,360,0.1,or_lesser,or_greater,radians"), "set_rotation", "get_rotation");
 	ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "rotation", PROPERTY_HINT_RANGE, "-360,360,0.1,or_lesser,or_greater,radians"), "set_rotation", "get_rotation");
 	ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "scale"), "set_scale", "get_scale");
 	ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "scale"), "set_scale", "get_scale");
 	ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "skew", PROPERTY_HINT_RANGE, "-89.9,89.9,0.1,radians"), "set_skew", "get_skew");
 	ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "skew", PROPERTY_HINT_RANGE, "-89.9,89.9,0.1,radians"), "set_skew", "get_skew");
-	ADD_PROPERTY(PropertyInfo(Variant::TRANSFORM2D, "transform", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NONE), "set_transform", "get_transform");
 
 
 	ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "global_position", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NONE), "set_global_position", "get_global_position");
 	ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "global_position", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NONE), "set_global_position", "get_global_position");
 	ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "global_rotation", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NONE), "set_global_rotation", "get_global_rotation");
 	ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "global_rotation", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NONE), "set_global_rotation", "get_global_rotation");
 	ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "global_scale", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NONE), "set_global_scale", "get_global_scale");
 	ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "global_scale", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NONE), "set_global_scale", "get_global_scale");
+
+	ADD_GROUP("Raw Matrix", "");
+	ADD_PROPERTY(PropertyInfo(Variant::TRANSFORM2D, "transform", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_EDITOR), "set_transform", "get_transform");
 	ADD_PROPERTY(PropertyInfo(Variant::TRANSFORM2D, "global_transform", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NONE), "set_global_transform", "get_global_transform");
 	ADD_PROPERTY(PropertyInfo(Variant::TRANSFORM2D, "global_transform", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NONE), "set_global_transform", "get_global_transform");
 
 
 	ADD_GROUP("Ordering", "");
 	ADD_GROUP("Ordering", "");

+ 26 - 3
scene/3d/node_3d.cpp

@@ -220,6 +220,15 @@ void Node3D::_notification(int p_what) {
 	}
 	}
 }
 }
 
 
+void Node3D::set_basis(const Basis &p_basis) {
+	data.local_transform = Transform3D(p_basis, data.local_transform.origin);
+	data.dirty |= DIRTY_VECTORS;
+	_propagate_transform_changed(this);
+	if (data.notify_local_transform) {
+		notification(NOTIFICATION_LOCAL_TRANSFORM_CHANGED);
+	}
+}
+
 void Node3D::set_transform(const Transform3D &p_transform) {
 void Node3D::set_transform(const Transform3D &p_transform) {
 	data.local_transform = p_transform;
 	data.local_transform = p_transform;
 	data.dirty |= DIRTY_VECTORS;
 	data.dirty |= DIRTY_VECTORS;
@@ -238,6 +247,14 @@ void Node3D::set_global_transform(const Transform3D &p_transform) {
 	set_transform(xform);
 	set_transform(xform);
 }
 }
 
 
+Basis Node3D::get_basis() const {
+	if (data.dirty & DIRTY_LOCAL) {
+		_update_local_transform();
+	}
+
+	return data.local_transform.basis;
+}
+
 Transform3D Node3D::get_transform() const {
 Transform3D Node3D::get_transform() const {
 	if (data.dirty & DIRTY_LOCAL) {
 	if (data.dirty & DIRTY_LOCAL) {
 		_update_local_transform();
 		_update_local_transform();
@@ -765,7 +782,9 @@ NodePath Node3D::get_visibility_parent() const {
 }
 }
 
 
 void Node3D::_bind_methods() {
 void Node3D::_bind_methods() {
-	ClassDB::bind_method(D_METHOD("set_transform", "local"), &Node3D::set_transform);
+	ClassDB::bind_method(D_METHOD("set_basis", "basis"), &Node3D::set_basis);
+	ClassDB::bind_method(D_METHOD("get_basis"), &Node3D::get_basis);
+	ClassDB::bind_method(D_METHOD("set_transform", "transform"), &Node3D::set_transform);
 	ClassDB::bind_method(D_METHOD("get_transform"), &Node3D::get_transform);
 	ClassDB::bind_method(D_METHOD("get_transform"), &Node3D::get_transform);
 	ClassDB::bind_method(D_METHOD("set_position", "position"), &Node3D::set_position);
 	ClassDB::bind_method(D_METHOD("set_position", "position"), &Node3D::set_position);
 	ClassDB::bind_method(D_METHOD("get_position"), &Node3D::get_position);
 	ClassDB::bind_method(D_METHOD("get_position"), &Node3D::get_position);
@@ -838,8 +857,12 @@ void Node3D::_bind_methods() {
 	ADD_PROPERTY(PropertyInfo(Variant::VECTOR3, "rotation", PROPERTY_HINT_RANGE, "-360,360,0.1,or_lesser,or_greater,radians", PROPERTY_USAGE_EDITOR), "set_rotation", "get_rotation");
 	ADD_PROPERTY(PropertyInfo(Variant::VECTOR3, "rotation", PROPERTY_HINT_RANGE, "-360,360,0.1,or_lesser,or_greater,radians", PROPERTY_USAGE_EDITOR), "set_rotation", "get_rotation");
 	ADD_PROPERTY(PropertyInfo(Variant::VECTOR3, "scale", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_EDITOR), "set_scale", "get_scale");
 	ADD_PROPERTY(PropertyInfo(Variant::VECTOR3, "scale", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_EDITOR), "set_scale", "get_scale");
 	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "top_level"), "set_as_top_level", "is_set_as_top_level");
 	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "top_level"), "set_as_top_level", "is_set_as_top_level");
-	ADD_GROUP("Matrix", "");
-	ADD_PROPERTY(PropertyInfo(Variant::TRANSFORM3D, "transform", PROPERTY_HINT_NONE, ""), "set_transform", "get_transform");
+
+	ADD_GROUP("Raw Matrix", "");
+	// No need to display the full Transform, we already have the translation above.
+	ADD_PROPERTY(PropertyInfo(Variant::TRANSFORM3D, "transform", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_STORAGE), "set_transform", "get_transform");
+	ADD_PROPERTY(PropertyInfo(Variant::BASIS, "basis", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_EDITOR), "set_basis", "get_basis");
+
 	ADD_GROUP("Visibility", "");
 	ADD_GROUP("Visibility", "");
 	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "visible"), "set_visible", "is_visible");
 	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "visible"), "set_visible", "is_visible");
 	ADD_PROPERTY(PropertyInfo(Variant::NODE_PATH, "visibility_parent", PROPERTY_HINT_NODE_PATH_VALID_TYPES, "GeometryInstance3D"), "set_visibility_parent", "get_visibility_parent");
 	ADD_PROPERTY(PropertyInfo(Variant::NODE_PATH, "visibility_parent", PROPERTY_HINT_NODE_PATH_VALID_TYPES, "GeometryInstance3D"), "set_visibility_parent", "get_visibility_parent");

+ 2 - 0
scene/3d/node_3d.h

@@ -136,9 +136,11 @@ public:
 	Vector3 get_rotation() const;
 	Vector3 get_rotation() const;
 	Vector3 get_scale() const;
 	Vector3 get_scale() const;
 
 
+	void set_basis(const Basis &p_basis);
 	void set_transform(const Transform3D &p_transform);
 	void set_transform(const Transform3D &p_transform);
 	void set_global_transform(const Transform3D &p_transform);
 	void set_global_transform(const Transform3D &p_transform);
 
 
+	Basis get_basis() const;
 	Transform3D get_transform() const;
 	Transform3D get_transform() const;
 	Transform3D get_global_transform() const;
 	Transform3D get_global_transform() const;