Browse Source

Implement CollisionPolygon3D margin

hoontee 4 years ago
parent
commit
fbb1ef759c

+ 3 - 0
doc/classes/CollisionPolygon3D.xml

@@ -17,6 +17,9 @@
 		<member name="disabled" type="bool" setter="set_disabled" getter="is_disabled" default="false">
 		<member name="disabled" type="bool" setter="set_disabled" getter="is_disabled" default="false">
 			If [code]true[/code], no collision will be produced.
 			If [code]true[/code], no collision will be produced.
 		</member>
 		</member>
+		<member name="margin" type="float" setter="set_margin" getter="get_margin" default="0.04">
+			The collision margin for the generated [Shape3D]. See [member Shape3D.margin] for more details.
+		</member>
 		<member name="polygon" type="PackedVector2Array" setter="set_polygon" getter="get_polygon" default="PackedVector2Array(  )">
 		<member name="polygon" type="PackedVector2Array" setter="set_polygon" getter="get_polygon" default="PackedVector2Array(  )">
 			Array of vertices which define the polygon.
 			Array of vertices which define the polygon.
 			[b]Note:[/b] The returned value is a copy of the original. Methods which mutate the size or properties of the return value will not impact the original polygon. To change properties of the polygon, assign it to a temporary variable and make changes before reassigning the [code]polygon[/code] member.
 			[b]Note:[/b] The returned value is a copy of the original. Methods which mutate the size or properties of the return value will not impact the original polygon. To change properties of the polygon, assign it to a temporary variable and make changes before reassigning the [code]polygon[/code] member.

+ 2 - 1
doc/classes/Shape3D.xml

@@ -13,7 +13,8 @@
 	</methods>
 	</methods>
 	<members>
 	<members>
 		<member name="margin" type="float" setter="set_margin" getter="get_margin" default="0.04">
 		<member name="margin" type="float" setter="set_margin" getter="get_margin" default="0.04">
-			The collision margin for the shape.
+			The collision margin for the shape. Used in Bullet Physics only.
+			Collision margins allows collision detection to be more efficient by adding an extra shell around shapes. Collision algorithms are more expensive when objects overlap by more than their margin, so a higher value for margins is better for performance, at the cost of accuracy around edges as it makes them less sharp.
 		</member>
 		</member>
 	</members>
 	</members>
 	<constants>
 	<constants>

+ 16 - 0
scene/3d/collision_polygon_3d.cpp

@@ -70,6 +70,7 @@ void CollisionPolygon3D::_build_polygon() {
 		}
 		}
 
 
 		convex->set_points(cp);
 		convex->set_points(cp);
+		convex->set_margin(margin);
 		parent->shape_owner_add_shape(owner_id, convex);
 		parent->shape_owner_add_shape(owner_id, convex);
 		parent->shape_owner_set_disabled(owner_id, disabled);
 		parent->shape_owner_set_disabled(owner_id, disabled);
 	}
 	}
@@ -155,6 +156,17 @@ bool CollisionPolygon3D::is_disabled() const {
 	return disabled;
 	return disabled;
 }
 }
 
 
+real_t CollisionPolygon3D::get_margin() const {
+	return margin;
+}
+
+void CollisionPolygon3D::set_margin(real_t p_margin) {
+	margin = p_margin;
+	if (parent) {
+		_build_polygon();
+	}
+}
+
 String CollisionPolygon3D::get_configuration_warning() const {
 String CollisionPolygon3D::get_configuration_warning() const {
 	String warning = Node3D::get_configuration_warning();
 	String warning = Node3D::get_configuration_warning();
 
 
@@ -189,11 +201,15 @@ void CollisionPolygon3D::_bind_methods() {
 	ClassDB::bind_method(D_METHOD("set_disabled", "disabled"), &CollisionPolygon3D::set_disabled);
 	ClassDB::bind_method(D_METHOD("set_disabled", "disabled"), &CollisionPolygon3D::set_disabled);
 	ClassDB::bind_method(D_METHOD("is_disabled"), &CollisionPolygon3D::is_disabled);
 	ClassDB::bind_method(D_METHOD("is_disabled"), &CollisionPolygon3D::is_disabled);
 
 
+	ClassDB::bind_method(D_METHOD("set_margin", "margin"), &CollisionPolygon3D::set_margin);
+	ClassDB::bind_method(D_METHOD("get_margin"), &CollisionPolygon3D::get_margin);
+
 	ClassDB::bind_method(D_METHOD("_is_editable_3d_polygon"), &CollisionPolygon3D::_is_editable_3d_polygon);
 	ClassDB::bind_method(D_METHOD("_is_editable_3d_polygon"), &CollisionPolygon3D::_is_editable_3d_polygon);
 
 
 	ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "depth"), "set_depth", "get_depth");
 	ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "depth"), "set_depth", "get_depth");
 	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "disabled"), "set_disabled", "is_disabled");
 	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "disabled"), "set_disabled", "is_disabled");
 	ADD_PROPERTY(PropertyInfo(Variant::PACKED_VECTOR2_ARRAY, "polygon"), "set_polygon", "get_polygon");
 	ADD_PROPERTY(PropertyInfo(Variant::PACKED_VECTOR2_ARRAY, "polygon"), "set_polygon", "get_polygon");
+	ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "margin", PROPERTY_HINT_RANGE, "0.001,10,0.001"), "set_margin", "get_margin");
 }
 }
 
 
 CollisionPolygon3D::CollisionPolygon3D() {
 CollisionPolygon3D::CollisionPolygon3D() {

+ 4 - 0
scene/3d/collision_polygon_3d.h

@@ -37,6 +37,7 @@
 class CollisionObject3D;
 class CollisionObject3D;
 class CollisionPolygon3D : public Node3D {
 class CollisionPolygon3D : public Node3D {
 	GDCLASS(CollisionPolygon3D, Node3D);
 	GDCLASS(CollisionPolygon3D, Node3D);
+	real_t margin = 0.04;
 
 
 protected:
 protected:
 	real_t depth = 1.0;
 	real_t depth = 1.0;
@@ -70,6 +71,9 @@ public:
 
 
 	virtual AABB get_item_rect() const;
 	virtual AABB get_item_rect() const;
 
 
+	real_t get_margin() const;
+	void set_margin(real_t p_margin);
+
 	String get_configuration_warning() const override;
 	String get_configuration_warning() const override;
 
 
 	CollisionPolygon3D();
 	CollisionPolygon3D();