Implement CollisionPolygon3D margin
(cherry picked from commit fbb1ef759c
)
This commit is contained in:
parent
1fa8595bff
commit
d91a5e7883
@ -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 [Shape]. See [member Shape.margin] for more details.
|
||||||
|
</member>
|
||||||
<member name="polygon" type="PoolVector2Array" setter="set_polygon" getter="get_polygon" default="PoolVector2Array( )">
|
<member name="polygon" type="PoolVector2Array" setter="set_polygon" getter="get_polygon" default="PoolVector2Array( )">
|
||||||
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.
|
||||||
|
@ -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>
|
||||||
|
@ -68,6 +68,7 @@ void CollisionPolygon::_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);
|
||||||
}
|
}
|
||||||
@ -162,6 +163,17 @@ bool CollisionPolygon::is_disabled() const {
|
|||||||
return disabled;
|
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 CollisionPolygon::get_configuration_warning() const {
|
||||||
|
|
||||||
String warning = Spatial::get_configuration_warning();
|
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("set_disabled", "disabled"), &CollisionPolygon::set_disabled);
|
||||||
ClassDB::bind_method(D_METHOD("is_disabled"), &CollisionPolygon::is_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);
|
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::REAL, "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::POOL_VECTOR2_ARRAY, "polygon"), "set_polygon", "get_polygon");
|
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() {
|
CollisionPolygon::CollisionPolygon() {
|
||||||
|
@ -38,6 +38,7 @@ class CollisionObject;
|
|||||||
class CollisionPolygon : public Spatial {
|
class CollisionPolygon : public Spatial {
|
||||||
|
|
||||||
GDCLASS(CollisionPolygon, Spatial);
|
GDCLASS(CollisionPolygon, Spatial);
|
||||||
|
real_t margin = 0.04;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
float depth;
|
float depth;
|
||||||
@ -71,6 +72,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;
|
String get_configuration_warning() const;
|
||||||
|
|
||||||
CollisionPolygon();
|
CollisionPolygon();
|
||||||
|
Loading…
Reference in New Issue
Block a user