]> git.tdb.fi Git - libs/game.git/commitdiff
Add a setup flag to make rigid bodies incorporeal
authorMikko Rasa <tdb@tdb.fi>
Mon, 14 Apr 2025 10:34:07 +0000 (13:34 +0300)
committerMikko Rasa <tdb@tdb.fi>
Mon, 14 Apr 2025 10:34:07 +0000 (13:34 +0300)
It can be used to create triggers which report collisions but don't
affect the physics simulation.

source/game/physicssystem.cpp
source/game/rigidbody.h
source/game/setups.mgs

index ef6faba774cad55cf405958a8a143ca76090bb82..49d8a703462fd8a56c9b6c98244b5369dc094c3e 100644 (file)
@@ -16,6 +16,7 @@ enum
 {
        STATIC,
        MOVING,
+       INCORPOREAL,
        RAYCAST
 };
 
@@ -76,9 +77,10 @@ void PhysicsSystem::early_tick()
                                Handle<Transform> transform = srb->entity->get_transform();
                                Physics::MotionType motion = (srb->motion ? Physics::DYNAMIC : Physics::STATIC);
                                srb->physics_body = make_unique<Physics::RigidBody>(world, srb->shape->get_shape(), transform->get_position(), transform->get_rotation(), motion);
+                               srb->physics_body->set_corporeal(srb->body->is_corporeal());
                                srb->physics_body->set_report_contacts(srb->body->reports_collisions());
 
-                               unsigned layer = (motion==Physics::STATIC ? CollisionLayer::STATIC : CollisionLayer::MOVING);
+                               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);
                                if(srb->shape->is_raycast_target())
                                        collision_mask |= 1<<CollisionLayer::RAYCAST;
index 45d790e3ecca03417aa52844b99a42db07b14f46..4b68b60509ea8b3b9e9cdfb6a331a7000b10d54d 100644 (file)
@@ -25,6 +25,7 @@ public:
 
        void set_kinematic(bool);
        bool is_kinematic() const { return read().kinematic; }
+       bool is_corporeal() const { return setup.corporeal; }
        bool reports_collisions() const { return setup.report_collisions; }
 };
 
index b6e7005f0f382877269f72ffbc40aa0b9d65da88..61c4c56ebc027ad8253ecd5aaf9e58e3537a69a9 100644 (file)
@@ -57,5 +57,6 @@ component HeightmapTerrain
 
 component RigidBody
 {
+       field corporeal bool { default "true"; };
        field report_collisions bool { default "false"; };
 };