Skip to content

Commit fe49594

Browse files
committed
Remove Jolt Physics project setting "Areas Detect Static Bodies"
1 parent 28089c4 commit fe49594

File tree

6 files changed

+20
-24
lines changed

6 files changed

+20
-24
lines changed

doc/classes/ProjectSettings.xml

-6
Original file line numberDiff line numberDiff line change
@@ -2596,12 +2596,6 @@
25962596
<member name="physics/jolt_physics_3d/simulation/allow_sleep" type="bool" setter="" getter="" default="true">
25972597
If [code]true[/code], [RigidBody3D] nodes are allowed to go to sleep if their velocity is below the threshold defined in [member physics/jolt_physics_3d/simulation/sleep_velocity_threshold] for the duration set in [member physics/jolt_physics_3d/simulation/sleep_time_threshold]. This can improve physics simulation performance when there are non-moving [RigidBody3D] nodes, at the cost of some nodes possibly failing to wake up in certain scenarios. Consider disabling this temporarily to troubleshoot [RigidBody3D] nodes not moving when they should.
25982598
</member>
2599-
<member name="physics/jolt_physics_3d/simulation/areas_detect_static_bodies" type="bool" setter="" getter="" default="false">
2600-
If [code]true[/code], [Area3D] nodes are able to detect overlaps with [StaticBody3D] nodes.
2601-
[b]Note:[/b] Enabling this setting can come at a heavy CPU and memory cost if you allow many/large [Area3D] to overlap with complex static geometry, such as [ConcavePolygonShape3D] or [HeightMapShape3D]. It is strongly recommended that you set up your collision layers and masks in such a way that only a few small [Area3D] nodes can detect [StaticBody3D] nodes.
2602-
[b]Note:[/b] This also applies to overlaps with a [RigidBody3D] frozen with [constant RigidBody3D.FREEZE_MODE_STATIC].
2603-
[b]Note:[/b] This is not needed to detect overlaps with [AnimatableBody3D], as it is a kinematic body, despite inheriting from [StaticBody3D].
2604-
</member>
26052599
<member name="physics/jolt_physics_3d/simulation/baumgarte_stabilization_factor" type="float" setter="" getter="" default="0.2">
26062600
How much of the position error of a [RigidBody3D] to fix during a physics step, where [code]0.0[/code] is none and [code]1.0[/code] is the full amount. This affects things like how quickly bodies depenetrate.
26072601
[b]Note:[/b] Setting this value too high can make [RigidBody3D] nodes unstable.

modules/jolt_physics/jolt_project_settings.cpp

-2
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ void JoltProjectSettings::register_settings() {
3636
GLOBAL_DEF(PropertyInfo(Variant::INT, "physics/jolt_physics_3d/simulation/velocity_steps", PROPERTY_HINT_RANGE, U"2,16,or_greater"), 10);
3737
GLOBAL_DEF(PropertyInfo(Variant::INT, "physics/jolt_physics_3d/simulation/position_steps", PROPERTY_HINT_RANGE, U"1,16,or_greater"), 2);
3838
GLOBAL_DEF(PropertyInfo(Variant::BOOL, "physics/jolt_physics_3d/simulation/use_enhanced_internal_edge_removal"), true);
39-
GLOBAL_DEF(PropertyInfo(Variant::BOOL, "physics/jolt_physics_3d/simulation/areas_detect_static_bodies"), false);
4039
GLOBAL_DEF(PropertyInfo(Variant::BOOL, "physics/jolt_physics_3d/simulation/generate_all_kinematic_contacts"), false);
4140
GLOBAL_DEF(PropertyInfo(Variant::FLOAT, "physics/jolt_physics_3d/simulation/penetration_slop", PROPERTY_HINT_RANGE, U"0,1,0.00001,or_greater,suffix:m"), 0.02f);
4241
GLOBAL_DEF(PropertyInfo(Variant::FLOAT, "physics/jolt_physics_3d/simulation/speculative_contact_distance", PROPERTY_HINT_RANGE, U"0,1,0.00001,or_greater,suffix:m"), 0.02f);
@@ -81,7 +80,6 @@ void JoltProjectSettings::read_settings() {
8180
simulation_velocity_steps = GLOBAL_GET("physics/jolt_physics_3d/simulation/velocity_steps");
8281
simulation_position_steps = GLOBAL_GET("physics/jolt_physics_3d/simulation/position_steps");
8382
use_enhanced_internal_edge_removal_for_bodies = GLOBAL_GET("physics/jolt_physics_3d/simulation/use_enhanced_internal_edge_removal");
84-
areas_detect_static_bodies = GLOBAL_GET("physics/jolt_physics_3d/simulation/areas_detect_static_bodies");
8583
generate_all_kinematic_contacts = GLOBAL_GET("physics/jolt_physics_3d/simulation/generate_all_kinematic_contacts");
8684
penetration_slop = GLOBAL_GET("physics/jolt_physics_3d/simulation/penetration_slop");
8785
speculative_contact_distance = GLOBAL_GET("physics/jolt_physics_3d/simulation/speculative_contact_distance");

modules/jolt_physics/jolt_project_settings.h

-1
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@ class JoltProjectSettings {
4242
inline static int simulation_velocity_steps;
4343
inline static int simulation_position_steps;
4444
inline static bool use_enhanced_internal_edge_removal_for_bodies;
45-
inline static bool areas_detect_static_bodies;
4645
inline static bool generate_all_kinematic_contacts;
4746
inline static float penetration_slop;
4847
inline static float speculative_contact_distance;

modules/jolt_physics/objects/jolt_area_3d.cpp

+1-4
Original file line numberDiff line numberDiff line change
@@ -72,15 +72,12 @@ void JoltArea3D::_add_to_space() {
7272
jolt_settings->mCollisionGroup = JPH::CollisionGroup(nullptr, group_id, sub_group_id);
7373
jolt_settings->mMotionType = _get_motion_type();
7474
jolt_settings->mIsSensor = true;
75+
jolt_settings->mCollideKinematicVsNonDynamic = true;
7576
jolt_settings->mUseManifoldReduction = false;
7677
jolt_settings->mOverrideMassProperties = JPH::EOverrideMassProperties::MassAndInertiaProvided;
7778
jolt_settings->mMassPropertiesOverride.mMass = 1.0f;
7879
jolt_settings->mMassPropertiesOverride.mInertia = JPH::Mat44::sIdentity();
7980

80-
if (JoltProjectSettings::areas_detect_static_bodies) {
81-
jolt_settings->mCollideKinematicVsNonDynamic = true;
82-
}
83-
8481
jolt_settings->SetShape(jolt_shape);
8582

8683
const JPH::BodyID new_jolt_id = space->add_rigid_body(*this, *jolt_settings);

modules/jolt_physics/spaces/jolt_layers.cpp

+8-11
Original file line numberDiff line numberDiff line change
@@ -52,28 +52,25 @@ class JoltBroadPhaseMatrix {
5252
using namespace JoltBroadPhaseLayer;
5353

5454
allow_collision(BODY_STATIC, BODY_DYNAMIC);
55+
allow_collision(BODY_STATIC, AREA_DETECTABLE);
56+
allow_collision(BODY_STATIC, AREA_UNDETECTABLE);
5557
allow_collision(BODY_STATIC_BIG, BODY_DYNAMIC);
58+
allow_collision(BODY_STATIC_BIG, AREA_DETECTABLE);
59+
allow_collision(BODY_STATIC_BIG, AREA_UNDETECTABLE);
5660
allow_collision(BODY_DYNAMIC, BODY_STATIC);
5761
allow_collision(BODY_DYNAMIC, BODY_STATIC_BIG);
5862
allow_collision(BODY_DYNAMIC, BODY_DYNAMIC);
5963
allow_collision(BODY_DYNAMIC, AREA_DETECTABLE);
6064
allow_collision(BODY_DYNAMIC, AREA_UNDETECTABLE);
6165
allow_collision(AREA_DETECTABLE, BODY_DYNAMIC);
66+
allow_collision(AREA_DETECTABLE, BODY_STATIC);
67+
allow_collision(AREA_DETECTABLE, BODY_STATIC_BIG);
6268
allow_collision(AREA_DETECTABLE, AREA_DETECTABLE);
6369
allow_collision(AREA_DETECTABLE, AREA_UNDETECTABLE);
6470
allow_collision(AREA_UNDETECTABLE, BODY_DYNAMIC);
71+
allow_collision(AREA_UNDETECTABLE, BODY_STATIC);
72+
allow_collision(AREA_UNDETECTABLE, BODY_STATIC_BIG);
6573
allow_collision(AREA_UNDETECTABLE, AREA_DETECTABLE);
66-
67-
if (JoltProjectSettings::areas_detect_static_bodies) {
68-
allow_collision(BODY_STATIC, AREA_DETECTABLE);
69-
allow_collision(BODY_STATIC, AREA_UNDETECTABLE);
70-
allow_collision(BODY_STATIC_BIG, AREA_DETECTABLE);
71-
allow_collision(BODY_STATIC_BIG, AREA_UNDETECTABLE);
72-
allow_collision(AREA_DETECTABLE, BODY_STATIC);
73-
allow_collision(AREA_DETECTABLE, BODY_STATIC_BIG);
74-
allow_collision(AREA_UNDETECTABLE, BODY_STATIC);
75-
allow_collision(AREA_UNDETECTABLE, BODY_STATIC_BIG);
76-
}
7774
}
7875

7976
void allow_collision(UnderlyingType p_layer1, UnderlyingType p_layer2) { masks[p_layer1] |= uint8_t(1U << p_layer2); }

modules/jolt_physics/spaces/jolt_space_3d.cpp

+11
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@
4848
#include "core/string/print_string.h"
4949
#include "core/variant/variant_utility.h"
5050

51+
#include "Jolt/Physics/Collision/CollideShapeVsShapePerLeaf.h"
52+
#include "Jolt/Physics/Collision/CollisionCollectorImpl.h"
5153
#include "Jolt/Physics/PhysicsScene.h"
5254

5355
namespace {
@@ -121,6 +123,15 @@ JoltSpace3D::JoltSpace3D(JPH::JobSystem *p_job_system) :
121123
physics_system->SetContactListener(contact_listener);
122124
physics_system->SetSoftBodyContactListener(contact_listener);
123125

126+
physics_system->SetSimCollideBodyVsBody([](const JPH::Body &p_body1, const JPH::Body &p_body2, JPH::Mat44Arg p_transform_com1, JPH::Mat44Arg p_transform_com2, JPH::CollideShapeSettings &p_collide_shape_settings, JPH::CollideShapeCollector &p_collector, const JPH::ShapeFilter &p_shape_filter) {
127+
if (p_body1.IsSensor() || p_body2.IsSensor()) {
128+
JPH::SubShapeIDCreator part1, part2;
129+
JPH::CollideShapeVsShapePerLeaf<JPH::AnyHitCollisionCollector<JPH::CollideShapeCollector>>(p_body1.GetShape(), p_body2.GetShape(), JPH::Vec3::sOne(), JPH::Vec3::sOne(), p_transform_com1, p_transform_com2, part1, part2, p_collide_shape_settings, p_collector, p_shape_filter);
130+
} else {
131+
JPH::PhysicsSystem::sDefaultSimCollideBodyVsBody(p_body1, p_body2, p_transform_com1, p_transform_com2, p_collide_shape_settings, p_collector, p_shape_filter);
132+
}
133+
});
134+
124135
physics_system->SetCombineFriction([](const JPH::Body &p_body1, const JPH::SubShapeID &p_sub_shape_id1, const JPH::Body &p_body2, const JPH::SubShapeID &p_sub_shape_id2) {
125136
return Math::abs(MIN(p_body1.GetFriction(), p_body2.GetFriction()));
126137
});

0 commit comments

Comments
 (0)