Fix bug where cubes slide off of moving platforms

This commit is contained in:
James Lambert 2023-12-29 21:42:32 -07:00
parent ee42238411
commit 0c1795485c
3 changed files with 14 additions and 3 deletions

View file

@ -379,7 +379,7 @@ void contactSolverIterate(struct ContactSolver* contactSolver) {
struct RigidBody* bodyA = cs->shapeA->body; struct RigidBody* bodyA = cs->shapeA->body;
struct RigidBody* bodyB = cs->shapeB->body; struct RigidBody* bodyB = cs->shapeB->body;
if (bodyA && !(bodyA->flags & RigidBodyIsKinematic)) { if (bodyA && (bodyA->flags & (RigidBodyIsKinematic | RigidBodyForceVelocity)) != RigidBodyIsKinematic) {
vA = &bodyA->velocity; vA = &bodyA->velocity;
wA = &bodyA->angularVelocity; wA = &bodyA->angularVelocity;
} else { } else {
@ -387,7 +387,7 @@ void contactSolverIterate(struct ContactSolver* contactSolver) {
wA = NULL; wA = NULL;
} }
if (bodyB && !(bodyB->flags & RigidBodyIsKinematic)) { if (bodyB && (bodyB->flags & (RigidBodyIsKinematic | RigidBodyForceVelocity)) != RigidBodyIsKinematic) {
vB = &bodyB->velocity; vB = &bodyB->velocity;
wB = &bodyB->angularVelocity; wB = &bodyB->angularVelocity;
} else { } else {

View file

@ -36,6 +36,7 @@ enum RigidBodyFlags {
RigidBodyFizzled = (1 << 13), RigidBodyFizzled = (1 << 13),
RigidBodyDisableGravity = (1 << 14), RigidBodyDisableGravity = (1 << 14),
RigidBodyForceVelocity = (1 << 15),
}; };
struct RigidBody { struct RigidBody {

View file

@ -71,6 +71,8 @@ void sceneInitDynamicColliders(struct Scene* scene) {
collisionObjectInit(&colliders[i], &colliderType[i], &body[i], 1.0f, COLLISION_LAYERS_TANGIBLE | COLLISION_LAYERS_BLOCK_BALL | COLLISION_LAYERS_STATIC); collisionObjectInit(&colliders[i], &colliderType[i], &body[i], 1.0f, COLLISION_LAYERS_TANGIBLE | COLLISION_LAYERS_BLOCK_BALL | COLLISION_LAYERS_STATIC);
rigidBodyMarkKinematic(&body[i]); rigidBodyMarkKinematic(&body[i]);
body[i].flags |= RigidBodyForceVelocity;
body[i].currentRoom = gCurrentLevel->dynamicBoxes[i].roomIndex; body[i].currentRoom = gCurrentLevel->dynamicBoxes[i].roomIndex;
collisionSceneAddDynamicObject(&colliders[i]); collisionSceneAddDynamicObject(&colliders[i]);
@ -553,7 +555,15 @@ void sceneUpdateAnimatedObjects(struct Scene* scene) {
relativeTransform.rotation = boxDef->rotation; relativeTransform.rotation = boxDef->rotation;
relativeTransform.scale = gOneVec; relativeTransform.scale = gOneVec;
transformConcat(&baseTransform, &relativeTransform, &scene->dynamicColliders[i].body->transform); struct Transform newTransform;
transformConcat(&baseTransform, &relativeTransform, &newTransform);
struct Vector3 movement;
vector3Sub(&newTransform.position, &scene->dynamicColliders[i].body->transform .position, &movement);
scene->dynamicColliders[i].body->transform = newTransform;
vector3Scale(&movement, &scene->dynamicColliders[i].body->velocity, 1.0f / FIXED_DELTA_TIME);
collisionObjectUpdateBB(&scene->dynamicColliders[i]); collisionObjectUpdateBB(&scene->dynamicColliders[i]);
} }