]> git.tdb.fi Git - libs/game.git/commitdiff
Only update transform component if the physics body is dynamic
authorMikko Rasa <tdb@tdb.fi>
Sun, 13 Apr 2025 15:02:37 +0000 (18:02 +0300)
committerMikko Rasa <tdb@tdb.fi>
Mon, 14 Apr 2025 10:17:49 +0000 (13:17 +0300)
The simulation does not affect static bodies at all and kinematic bodies
are expected to end up in the externally specified position.

source/game/physicssystem.cpp

index 210706cfe7d71c5b79af3ef121334fa6e03c2cb2..f2455e28b7c8772e242d80d095e332fb7e1ffa5d 100644 (file)
@@ -115,6 +115,9 @@ void PhysicsSystem::tick(Time::TimeDelta dt)
                                b.physics_body->move_kinematic(tv.position, tv.rotation, dt);
                        else
                                b.physics_body->set_transform(tv.position, tv.rotation);
+
+                       if(b.body->is_kinematic() || !b.motion)
+                               b.transform_generation = transform->get_read_generation();
                }
 
                if(motion_changed)
@@ -127,18 +130,20 @@ void PhysicsSystem::tick(Time::TimeDelta dt)
        world.step(dt/Time::sec);
 
        for(SimulatedRigidBody &b: rigid_bodies)
-       {
-               Handle<Transform> transform = b.entity->get_transform();
-               transform->set_position(b.physics_body->get_position());
-               transform->set_rotation(b.physics_body->get_rotation());
-               b.transform_generation = transform->get_write_generation();
                if(b.motion)
                {
+                       if(!b.body->is_kinematic())
+                       {
+                               Handle<Transform> transform = b.entity->get_transform();
+                               transform->set_position(b.physics_body->get_position());
+                               transform->set_rotation(b.physics_body->get_rotation());
+                               b.transform_generation = transform->get_write_generation();
+                       }
+
                        b.motion->set_linear_velocity(b.physics_body->get_linear_velocity());
                        b.motion->set_angular_velocity(b.physics_body->get_angular_velocity());
                        b.motion_generation = b.motion->get_write_generation();
                }
-       }
 
        for(const Events::Collision &c: collision_queue)
                event_source.emit<Events::Collision>(c);