]> git.tdb.fi Git - libs/game.git/commitdiff
Refactor layer and collision mask logic in PhysicsSystem
authorMikko Rasa <tdb@tdb.fi>
Tue, 22 Apr 2025 21:36:58 +0000 (00:36 +0300)
committerMikko Rasa <tdb@tdb.fi>
Tue, 22 Apr 2025 21:40:03 +0000 (00:40 +0300)
Collisions between moving and incorporeal were not two-way, and the
chained ternary was a bit hard to read.

source/game/physicssystem.cpp

index 07aca88c0ba62c4ce3b2694ec33708711b115e07..8464f1f6ec19de201fae3609c7626de31b0a87ea 100644 (file)
@@ -104,10 +104,26 @@ void PhysicsSystem::early_tick()
                                srb->physics_body->set_corporeal(srb->body->is_corporeal());
                                srb->physics_body->set_report_contacts(srb->body->reports_collisions());
 
-                               unsigned layer = (!srb->body->is_corporeal() ? CollisionLayer::INCORPOREAL : motion==Physics::STATIC ? CollisionLayer::STATIC : CollisionLayer::MOVING);
-                               uint32_t collision_mask = (1<<CollisionLayer::STATIC) | (1<<CollisionLayer::MOVING);
+                               unsigned layer;
+                               uint32_t collision_mask = 1<<CollisionLayer::MOVING;
+
+                               if(!srb->body->is_corporeal())
+                                       layer = CollisionLayer::INCORPOREAL;
+                               else
+                               {
+                                       collision_mask |= 1<<CollisionLayer::STATIC;
+                                       if(motion==Physics::STATIC)
+                                               layer = CollisionLayer::STATIC;
+                                       else
+                                       {
+                                               layer = CollisionLayer::MOVING;
+                                               collision_mask |= 1<<CollisionLayer::INCORPOREAL;
+                                       }
+                               }
+
                                if(srb->shape->is_raycast_target())
                                        collision_mask |= 1<<CollisionLayer::RAYCAST;
+
                                srb->physics_body->set_collisions(layer, collision_mask);
 
                                if(srb->body->reports_collisions() || srb->shape->is_raycast_target())