Fix bug where cubes slide off of moving platforms
This commit is contained in:
parent
ee42238411
commit
0c1795485c
|
@ -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 {
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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]);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue