Browse Source

Use Vector3 instead of 3 floats for CSGBox3D dimensions

Marcel Admiraal 4 years ago
parent
commit
4da4feed18

+ 1 - 1
doc/classes/BoxMesh.xml

@@ -13,7 +13,7 @@
 	</methods>
 	<members>
 		<member name="size" type="Vector3" setter="set_size" getter="get_size" default="Vector3( 2, 2, 2 )">
-			Size of the box mesh.
+			The box's width, height and depth.
 		</member>
 		<member name="subdivide_depth" type="int" setter="set_subdivide_depth" getter="get_subdivide_depth" default="0">
 			Number of extra edge loops inserted along the Z axis.

+ 16 - 52
modules/csg/csg_gizmos.cpp

@@ -56,8 +56,7 @@ String CSGShape3DGizmoPlugin::get_handle_name(const EditorNode3DGizmo *p_gizmo,
 	}
 
 	if (Object::cast_to<CSGBox3D>(cs)) {
-		static const char *hname[3] = { "Width", "Height", "Depth" };
-		return hname[p_idx];
+		return "Size";
 	}
 
 	if (Object::cast_to<CSGCylinder3D>(cs)) {
@@ -81,14 +80,7 @@ Variant CSGShape3DGizmoPlugin::get_handle_value(EditorNode3DGizmo *p_gizmo, int
 
 	if (Object::cast_to<CSGBox3D>(cs)) {
 		CSGBox3D *s = Object::cast_to<CSGBox3D>(cs);
-		switch (p_idx) {
-			case 0:
-				return s->get_width();
-			case 1:
-				return s->get_height();
-			case 2:
-				return s->get_depth();
-		}
+		return s->get_size();
 	}
 
 	if (Object::cast_to<CSGCylinder3D>(cs)) {
@@ -149,17 +141,9 @@ void CSGShape3DGizmoPlugin::set_handle(EditorNode3DGizmo *p_gizmo, int p_idx, Ca
 			d = 0.001;
 		}
 
-		switch (p_idx) {
-			case 0:
-				s->set_width(d * 2);
-				break;
-			case 1:
-				s->set_height(d * 2);
-				break;
-			case 2:
-				s->set_depth(d * 2);
-				break;
-		}
+		Vector3 h = s->get_size();
+		h[p_idx] = d * 2;
+		s->set_size(h);
 	}
 
 	if (Object::cast_to<CSGCylinder3D>(cs)) {
@@ -229,38 +213,14 @@ void CSGShape3DGizmoPlugin::commit_handle(EditorNode3DGizmo *p_gizmo, int p_idx,
 	if (Object::cast_to<CSGBox3D>(cs)) {
 		CSGBox3D *s = Object::cast_to<CSGBox3D>(cs);
 		if (p_cancel) {
-			switch (p_idx) {
-				case 0:
-					s->set_width(p_restore);
-					break;
-				case 1:
-					s->set_height(p_restore);
-					break;
-				case 2:
-					s->set_depth(p_restore);
-					break;
-			}
+			s->set_size(p_restore);
 			return;
 		}
 
 		UndoRedo *ur = Node3DEditor::get_singleton()->get_undo_redo();
-		ur->create_action(TTR("Change Box Shape Extents"));
-		static const char *method[3] = { "set_width", "set_height", "set_depth" };
-		float current = 0;
-		switch (p_idx) {
-			case 0:
-				current = s->get_width();
-				break;
-			case 1:
-				current = s->get_height();
-				break;
-			case 2:
-				current = s->get_depth();
-				break;
-		}
-
-		ur->add_do_method(s, method[p_idx], current);
-		ur->add_undo_method(s, method[p_idx], p_restore);
+		ur->create_action(TTR("Change Box Shape Size"));
+		ur->add_do_method(s, "set_size", s->get_size());
+		ur->add_undo_method(s, "set_size", p_restore);
 		ur->commit_action();
 	}
 
@@ -408,9 +368,13 @@ void CSGShape3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) {
 		CSGBox3D *s = Object::cast_to<CSGBox3D>(cs);
 
 		Vector<Vector3> handles;
-		handles.push_back(Vector3(s->get_width() * 0.5, 0, 0));
-		handles.push_back(Vector3(0, s->get_height() * 0.5, 0));
-		handles.push_back(Vector3(0, 0, s->get_depth() * 0.5));
+
+		for (int i = 0; i < 3; i++) {
+			Vector3 h;
+			h[i] = s->get_size()[i] / 2;
+			handles.push_back(h);
+		}
+
 		p_gizmo->add_handles(handles, handles_material);
 	}
 

+ 9 - 46
modules/csg/csg_shape.cpp

@@ -1125,7 +1125,7 @@ CSGBrush *CSGBox3D::_build_brush() {
 
 		int face = 0;
 
-		Vector3 vertex_mul(width * 0.5, height * 0.5, depth * 0.5);
+		Vector3 vertex_mul = size / 2;
 
 		{
 			for (int i = 0; i < 6; i++) {
@@ -1194,55 +1194,25 @@ CSGBrush *CSGBox3D::_build_brush() {
 }
 
 void CSGBox3D::_bind_methods() {
-	ClassDB::bind_method(D_METHOD("set_width", "width"), &CSGBox3D::set_width);
-	ClassDB::bind_method(D_METHOD("get_width"), &CSGBox3D::get_width);
-
-	ClassDB::bind_method(D_METHOD("set_height", "height"), &CSGBox3D::set_height);
-	ClassDB::bind_method(D_METHOD("get_height"), &CSGBox3D::get_height);
-
-	ClassDB::bind_method(D_METHOD("set_depth", "depth"), &CSGBox3D::set_depth);
-	ClassDB::bind_method(D_METHOD("get_depth"), &CSGBox3D::get_depth);
+	ClassDB::bind_method(D_METHOD("set_size", "size"), &CSGBox3D::set_size);
+	ClassDB::bind_method(D_METHOD("get_size"), &CSGBox3D::get_size);
 
 	ClassDB::bind_method(D_METHOD("set_material", "material"), &CSGBox3D::set_material);
 	ClassDB::bind_method(D_METHOD("get_material"), &CSGBox3D::get_material);
 
-	ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "width", PROPERTY_HINT_EXP_RANGE, "0.001,1000.0,0.001,or_greater"), "set_width", "get_width");
-	ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "height", PROPERTY_HINT_EXP_RANGE, "0.001,1000.0,0.001,or_greater"), "set_height", "get_height");
-	ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "depth", PROPERTY_HINT_EXP_RANGE, "0.001,1000.0,0.001,or_greater"), "set_depth", "get_depth");
+	ADD_PROPERTY(PropertyInfo(Variant::VECTOR3, "size"), "set_size", "get_size");
 	ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "material", PROPERTY_HINT_RESOURCE_TYPE, "StandardMaterial3D,ShaderMaterial"), "set_material", "get_material");
 }
 
-void CSGBox3D::set_width(const float p_width) {
-	width = p_width;
-	_make_dirty();
-	update_gizmo();
-	_change_notify("width");
-}
-
-float CSGBox3D::get_width() const {
-	return width;
-}
-
-void CSGBox3D::set_height(const float p_height) {
-	height = p_height;
-	_make_dirty();
-	update_gizmo();
-	_change_notify("height");
-}
-
-float CSGBox3D::get_height() const {
-	return height;
-}
-
-void CSGBox3D::set_depth(const float p_depth) {
-	depth = p_depth;
+void CSGBox3D::set_size(const Vector3 &p_size) {
+	size = p_size;
 	_make_dirty();
 	update_gizmo();
-	_change_notify("depth");
+	_change_notify("size");
 }
 
-float CSGBox3D::get_depth() const {
-	return depth;
+Vector3 CSGBox3D::get_size() const {
+	return size;
 }
 
 void CSGBox3D::set_material(const Ref<Material> &p_material) {
@@ -1255,13 +1225,6 @@ Ref<Material> CSGBox3D::get_material() const {
 	return material;
 }
 
-CSGBox3D::CSGBox3D() {
-	// defaults
-	width = 2.0;
-	height = 2.0;
-	depth = 2.0;
-}
-
 ///////////////
 
 CSGBrush *CSGCylinder3D::_build_brush() {

+ 4 - 12
modules/csg/csg_shape.h

@@ -240,27 +240,19 @@ class CSGBox3D : public CSGPrimitive3D {
 	virtual CSGBrush *_build_brush() override;
 
 	Ref<Material> material;
-	float width;
-	float height;
-	float depth;
+	Vector3 size = Vector3(2, 2, 2);
 
 protected:
 	static void _bind_methods();
 
 public:
-	void set_width(const float p_width);
-	float get_width() const;
-
-	void set_height(const float p_height);
-	float get_height() const;
-
-	void set_depth(const float p_depth);
-	float get_depth() const;
+	void set_size(const Vector3 &p_size);
+	Vector3 get_size() const;
 
 	void set_material(const Ref<Material> &p_material);
 	Ref<Material> get_material() const;
 
-	CSGBox3D();
+	CSGBox3D() {}
 };
 
 class CSGCylinder3D : public CSGPrimitive3D {

+ 2 - 8
modules/csg/doc_classes/CSGBox3D.xml

@@ -11,17 +11,11 @@
 	<methods>
 	</methods>
 	<members>
-		<member name="depth" type="float" setter="set_depth" getter="get_depth" default="2.0">
-			Depth of the box measured from the center of the box.
-		</member>
-		<member name="height" type="float" setter="set_height" getter="get_height" default="2.0">
-			Height of the box measured from the center of the box.
-		</member>
 		<member name="material" type="Material" setter="set_material" getter="get_material">
 			The material used to render the box.
 		</member>
-		<member name="width" type="float" setter="set_width" getter="get_width" default="2.0">
-			Width of the box measured from the center of the box.
+		<member name="size" type="Vector3" setter="set_size" getter="get_size" default="Vector3( 2, 2, 2 )">
+			The box's width, height and depth.
 		</member>
 	</members>
 	<constants>