Explorar o código

Merge pull request #108235 from mihe/jolt/shapeless-perf

Improve performance for shapeless objects when using Jolt Physics
Thaddeus Crews hai 2 meses
pai
achega
0dc626b1f3

+ 5 - 0
modules/jolt_physics/objects/jolt_area_3d.cpp

@@ -57,6 +57,11 @@ JPH::BroadPhaseLayer JoltArea3D::_get_broad_phase_layer() const {
 JPH::ObjectLayer JoltArea3D::_get_object_layer() const {
 	ERR_FAIL_NULL_V(space, 0);
 
+	if (jolt_shape == nullptr || jolt_shape->GetType() == JPH::EShapeType::Empty) {
+		// No point doing collision checks against a shapeless object.
+		return space->map_to_object_layer(_get_broad_phase_layer(), 0, 0);
+	}
+
 	return space->map_to_object_layer(_get_broad_phase_layer(), collision_layer, collision_mask);
 }
 

+ 5 - 0
modules/jolt_physics/objects/jolt_body_3d.cpp

@@ -93,6 +93,11 @@ JPH::BroadPhaseLayer JoltBody3D::_get_broad_phase_layer() const {
 JPH::ObjectLayer JoltBody3D::_get_object_layer() const {
 	ERR_FAIL_NULL_V(space, 0);
 
+	if (jolt_shape == nullptr || jolt_shape->GetType() == JPH::EShapeType::Empty) {
+		// No point doing collision checks against a shapeless object.
+		return space->map_to_object_layer(_get_broad_phase_layer(), 0, 0);
+	}
+
 	return space->map_to_object_layer(_get_broad_phase_layer(), collision_layer, collision_mask);
 }
 

+ 3 - 0
modules/jolt_physics/objects/jolt_shaped_object_3d.cpp

@@ -167,6 +167,9 @@ void JoltShapedObject3D::_dequeue_needs_optimization() {
 
 void JoltShapedObject3D::_shapes_changed() {
 	commit_shapes(false);
+}
+
+void JoltShapedObject3D::_shapes_committed() {
 	_update_object_layer();
 }
 

+ 1 - 1
modules/jolt_physics/objects/jolt_shaped_object_3d.h

@@ -68,7 +68,7 @@ protected:
 	void _dequeue_needs_optimization();
 
 	virtual void _shapes_changed();
-	virtual void _shapes_committed() {}
+	virtual void _shapes_committed();
 	virtual void _space_changing() override;
 
 public: