Browse Source

Merge pull request #48764 from QbieShay/4-plane-offset

Added a center_offset property to both plane primitive and quad primitive
Rémi Verschelde 4 years ago
parent
commit
fb3961b2ef

+ 3 - 0
doc/classes/PlaneMesh.xml

@@ -12,6 +12,9 @@
 	<methods>
 	<methods>
 	</methods>
 	</methods>
 	<members>
 	<members>
+		<member name="center_offset" type="Vector3" setter="set_center_offset" getter="get_center_offset" default="Vector3(0, 0, 0)">
+			Offset of the generated plane. Useful for particles.
+		</member>
 		<member name="size" type="Vector2" setter="set_size" getter="get_size" default="Vector2(2, 2)">
 		<member name="size" type="Vector2" setter="set_size" getter="get_size" default="Vector2(2, 2)">
 			Size of the generated plane.
 			Size of the generated plane.
 		</member>
 		</member>

+ 3 - 0
doc/classes/QuadMesh.xml

@@ -13,6 +13,9 @@
 	<methods>
 	<methods>
 	</methods>
 	</methods>
 	<members>
 	<members>
+		<member name="center_offset" type="Vector3" setter="set_center_offset" getter="get_center_offset" default="Vector3(0, 0, 0)">
+			Offset of the generated Quad. Useful for particles.
+		</member>
 		<member name="size" type="Vector2" setter="set_size" getter="get_size" default="Vector2(1, 1)">
 		<member name="size" type="Vector2" setter="set_size" getter="get_size" default="Vector2(1, 1)">
 			Size on the X and Y axes.
 			Size on the X and Y axes.
 		</member>
 		</member>

+ 31 - 6
scene/resources/primitive_meshes.cpp

@@ -714,7 +714,7 @@ int BoxMesh::get_subdivide_depth() const {
 BoxMesh::BoxMesh() {}
 BoxMesh::BoxMesh() {}
 
 
 /**
 /**
-  CylinderMesh
+	CylinderMesh
 */
 */
 
 
 void CylinderMesh::_create_mesh_array(Array &p_arr) const {
 void CylinderMesh::_create_mesh_array(Array &p_arr) const {
@@ -955,7 +955,7 @@ void PlaneMesh::_create_mesh_array(Array &p_arr) const {
 			u /= (subdivide_w + 1.0);
 			u /= (subdivide_w + 1.0);
 			v /= (subdivide_d + 1.0);
 			v /= (subdivide_d + 1.0);
 
 
-			points.push_back(Vector3(-x, 0.0, -z));
+			points.push_back(Vector3(-x, 0.0, -z) + center_offset);
 			normals.push_back(Vector3(0.0, 1.0, 0.0));
 			normals.push_back(Vector3(0.0, 1.0, 0.0));
 			ADD_TANGENT(1.0, 0.0, 0.0, 1.0);
 			ADD_TANGENT(1.0, 0.0, 0.0, 1.0);
 			uvs.push_back(Vector2(1.0 - u, 1.0 - v)); /* 1.0 - uv to match orientation with Quad */
 			uvs.push_back(Vector2(1.0 - u, 1.0 - v)); /* 1.0 - uv to match orientation with Quad */
@@ -993,10 +993,13 @@ void PlaneMesh::_bind_methods() {
 	ClassDB::bind_method(D_METHOD("get_subdivide_width"), &PlaneMesh::get_subdivide_width);
 	ClassDB::bind_method(D_METHOD("get_subdivide_width"), &PlaneMesh::get_subdivide_width);
 	ClassDB::bind_method(D_METHOD("set_subdivide_depth", "subdivide"), &PlaneMesh::set_subdivide_depth);
 	ClassDB::bind_method(D_METHOD("set_subdivide_depth", "subdivide"), &PlaneMesh::set_subdivide_depth);
 	ClassDB::bind_method(D_METHOD("get_subdivide_depth"), &PlaneMesh::get_subdivide_depth);
 	ClassDB::bind_method(D_METHOD("get_subdivide_depth"), &PlaneMesh::get_subdivide_depth);
+	ClassDB::bind_method(D_METHOD("set_center_offset", "offset"), &PlaneMesh::set_center_offset);
+	ClassDB::bind_method(D_METHOD("get_center_offset"), &PlaneMesh::get_center_offset);
 
 
 	ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "size"), "set_size", "get_size");
 	ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "size"), "set_size", "get_size");
 	ADD_PROPERTY(PropertyInfo(Variant::INT, "subdivide_width", PROPERTY_HINT_RANGE, "0,100,1,or_greater"), "set_subdivide_width", "get_subdivide_width");
 	ADD_PROPERTY(PropertyInfo(Variant::INT, "subdivide_width", PROPERTY_HINT_RANGE, "0,100,1,or_greater"), "set_subdivide_width", "get_subdivide_width");
 	ADD_PROPERTY(PropertyInfo(Variant::INT, "subdivide_depth", PROPERTY_HINT_RANGE, "0,100,1,or_greater"), "set_subdivide_depth", "get_subdivide_depth");
 	ADD_PROPERTY(PropertyInfo(Variant::INT, "subdivide_depth", PROPERTY_HINT_RANGE, "0,100,1,or_greater"), "set_subdivide_depth", "get_subdivide_depth");
+	ADD_PROPERTY(PropertyInfo(Variant::VECTOR3, "center_offset"), "set_center_offset", "get_center_offset");
 }
 }
 
 
 void PlaneMesh::set_size(const Size2 &p_size) {
 void PlaneMesh::set_size(const Size2 &p_size) {
@@ -1026,6 +1029,15 @@ int PlaneMesh::get_subdivide_depth() const {
 	return subdivide_d;
 	return subdivide_d;
 }
 }
 
 
+void PlaneMesh::set_center_offset(const Vector3 p_offset) {
+	center_offset = p_offset;
+	_request_update();
+}
+
+Vector3 PlaneMesh::get_center_offset() const {
+	return center_offset;
+}
+
 PlaneMesh::PlaneMesh() {}
 PlaneMesh::PlaneMesh() {}
 
 
 /**
 /**
@@ -1326,10 +1338,10 @@ void QuadMesh::_create_mesh_array(Array &p_arr) const {
 	Vector2 _size = Vector2(size.x / 2.0f, size.y / 2.0f);
 	Vector2 _size = Vector2(size.x / 2.0f, size.y / 2.0f);
 
 
 	Vector3 quad_faces[4] = {
 	Vector3 quad_faces[4] = {
-		Vector3(-_size.x, -_size.y, 0),
-		Vector3(-_size.x, _size.y, 0),
-		Vector3(_size.x, _size.y, 0),
-		Vector3(_size.x, -_size.y, 0),
+		Vector3(-_size.x, -_size.y, 0) + center_offset,
+		Vector3(-_size.x, _size.y, 0) + center_offset,
+		Vector3(_size.x, _size.y, 0) + center_offset,
+		Vector3(_size.x, -_size.y, 0) + center_offset,
 	};
 	};
 
 
 	static const int indices[6] = {
 	static const int indices[6] = {
@@ -1365,7 +1377,11 @@ void QuadMesh::_create_mesh_array(Array &p_arr) const {
 void QuadMesh::_bind_methods() {
 void QuadMesh::_bind_methods() {
 	ClassDB::bind_method(D_METHOD("set_size", "size"), &QuadMesh::set_size);
 	ClassDB::bind_method(D_METHOD("set_size", "size"), &QuadMesh::set_size);
 	ClassDB::bind_method(D_METHOD("get_size"), &QuadMesh::get_size);
 	ClassDB::bind_method(D_METHOD("get_size"), &QuadMesh::get_size);
+	ClassDB::bind_method(D_METHOD("set_center_offset", "center_offset"), &QuadMesh::set_center_offset);
+	ClassDB::bind_method(D_METHOD("get_center_offset"), &QuadMesh::get_center_offset);
+
 	ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "size"), "set_size", "get_size");
 	ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "size"), "set_size", "get_size");
+	ADD_PROPERTY(PropertyInfo(Variant::VECTOR3, "center_offset"), "set_center_offset", "get_center_offset");
 }
 }
 
 
 QuadMesh::QuadMesh() {
 QuadMesh::QuadMesh() {
@@ -1381,6 +1397,15 @@ Size2 QuadMesh::get_size() const {
 	return size;
 	return size;
 }
 }
 
 
+void QuadMesh::set_center_offset(Vector3 p_center_offset) {
+	center_offset = p_center_offset;
+	_request_update();
+}
+
+Vector3 QuadMesh::get_center_offset() const {
+	return center_offset;
+}
+
 /**
 /**
   SphereMesh
   SphereMesh
 */
 */

+ 8 - 0
scene/resources/primitive_meshes.h

@@ -211,6 +211,7 @@ private:
 	Size2 size = Size2(2.0, 2.0);
 	Size2 size = Size2(2.0, 2.0);
 	int subdivide_w = 0;
 	int subdivide_w = 0;
 	int subdivide_d = 0;
 	int subdivide_d = 0;
+	Vector3 center_offset;
 
 
 protected:
 protected:
 	static void _bind_methods();
 	static void _bind_methods();
@@ -226,6 +227,9 @@ public:
 	void set_subdivide_depth(const int p_divisions);
 	void set_subdivide_depth(const int p_divisions);
 	int get_subdivide_depth() const;
 	int get_subdivide_depth() const;
 
 
+	void set_center_offset(const Vector3 p_offset);
+	Vector3 get_center_offset() const;
+
 	PlaneMesh();
 	PlaneMesh();
 };
 };
 
 
@@ -274,6 +278,7 @@ class QuadMesh : public PrimitiveMesh {
 
 
 private:
 private:
 	Size2 size = Size2(1.0, 1.0);
 	Size2 size = Size2(1.0, 1.0);
+	Vector3 center_offset;
 
 
 protected:
 protected:
 	static void _bind_methods();
 	static void _bind_methods();
@@ -284,6 +289,9 @@ public:
 
 
 	void set_size(const Size2 &p_size);
 	void set_size(const Size2 &p_size);
 	Size2 get_size() const;
 	Size2 get_size() const;
+
+	void set_center_offset(const Vector3 p_offset);
+	Vector3 get_center_offset() const;
 };
 };
 
 
 /**
 /**