From d91a5e78830ff93fbda7064df17227b9f4d2d0f8 Mon Sep 17 00:00:00 2001
From: hoontee <5272529+hoontee@users.noreply.github.com>
Date: Tue, 9 Feb 2021 13:37:12 -0600
Subject: [PATCH] Implement CollisionPolygon3D margin
(cherry picked from commit fbb1ef759cca66f44523760569f1fcc3f015e2cb)
---
doc/classes/CollisionPolygon.xml | 3 +++
doc/classes/Shape.xml | 3 ++-
scene/3d/collision_polygon.cpp | 16 ++++++++++++++++
scene/3d/collision_polygon.h | 4 ++++
4 files changed, 25 insertions(+), 1 deletion(-)
diff --git a/doc/classes/CollisionPolygon.xml b/doc/classes/CollisionPolygon.xml
index 4970e2fd166..cde6824dfe3 100644
--- a/doc/classes/CollisionPolygon.xml
+++ b/doc/classes/CollisionPolygon.xml
@@ -17,6 +17,9 @@
If [code]true[/code], no collision will be produced.
+
+ The collision margin for the generated [Shape]. See [member Shape.margin] for more details.
+
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.
diff --git a/doc/classes/Shape.xml b/doc/classes/Shape.xml
index c04da15633b..55d5a04cae4 100644
--- a/doc/classes/Shape.xml
+++ b/doc/classes/Shape.xml
@@ -13,7 +13,8 @@
- 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.
diff --git a/scene/3d/collision_polygon.cpp b/scene/3d/collision_polygon.cpp
index ab0c64a3440..588125f7fa0 100644
--- a/scene/3d/collision_polygon.cpp
+++ b/scene/3d/collision_polygon.cpp
@@ -68,6 +68,7 @@ void CollisionPolygon::_build_polygon() {
}
convex->set_points(cp);
+ convex->set_margin(margin);
parent->shape_owner_add_shape(owner_id, convex);
parent->shape_owner_set_disabled(owner_id, disabled);
}
@@ -162,6 +163,17 @@ bool CollisionPolygon::is_disabled() const {
return disabled;
}
+real_t CollisionPolygon::get_margin() const {
+ return margin;
+}
+
+void CollisionPolygon::set_margin(real_t p_margin) {
+ margin = p_margin;
+ if (parent) {
+ _build_polygon();
+ }
+}
+
String CollisionPolygon::get_configuration_warning() const {
String warning = Spatial::get_configuration_warning();
@@ -196,11 +208,15 @@ void CollisionPolygon::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_disabled", "disabled"), &CollisionPolygon::set_disabled);
ClassDB::bind_method(D_METHOD("is_disabled"), &CollisionPolygon::is_disabled);
+ ClassDB::bind_method(D_METHOD("set_margin", "margin"), &CollisionPolygon::set_margin);
+ ClassDB::bind_method(D_METHOD("get_margin"), &CollisionPolygon::get_margin);
+
ClassDB::bind_method(D_METHOD("_is_editable_3d_polygon"), &CollisionPolygon::_is_editable_3d_polygon);
ADD_PROPERTY(PropertyInfo(Variant::REAL, "depth"), "set_depth", "get_depth");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "disabled"), "set_disabled", "is_disabled");
ADD_PROPERTY(PropertyInfo(Variant::POOL_VECTOR2_ARRAY, "polygon"), "set_polygon", "get_polygon");
+ ADD_PROPERTY(PropertyInfo(Variant::REAL, "margin", PROPERTY_HINT_RANGE, "0.001,10,0.001"), "set_margin", "get_margin");
}
CollisionPolygon::CollisionPolygon() {
diff --git a/scene/3d/collision_polygon.h b/scene/3d/collision_polygon.h
index 94db517b699..58695f40f65 100644
--- a/scene/3d/collision_polygon.h
+++ b/scene/3d/collision_polygon.h
@@ -38,6 +38,7 @@ class CollisionObject;
class CollisionPolygon : public Spatial {
GDCLASS(CollisionPolygon, Spatial);
+ real_t margin = 0.04;
protected:
float depth;
@@ -71,6 +72,9 @@ public:
virtual AABB get_item_rect() const;
+ real_t get_margin() const;
+ void set_margin(real_t p_margin);
+
String get_configuration_warning() const;
CollisionPolygon();