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* bodyB = cs->shapeB->body;
|
||||
|
||||
if (bodyA && !(bodyA->flags & RigidBodyIsKinematic)) {
|
||||
if (bodyA && (bodyA->flags & (RigidBodyIsKinematic | RigidBodyForceVelocity)) != RigidBodyIsKinematic) {
|
||||
vA = &bodyA->velocity;
|
||||
wA = &bodyA->angularVelocity;
|
||||
} else {
|
||||
|
@ -387,7 +387,7 @@ void contactSolverIterate(struct ContactSolver* contactSolver) {
|
|||
wA = NULL;
|
||||
}
|
||||
|
||||
if (bodyB && !(bodyB->flags & RigidBodyIsKinematic)) {
|
||||
if (bodyB && (bodyB->flags & (RigidBodyIsKinematic | RigidBodyForceVelocity)) != RigidBodyIsKinematic) {
|
||||
vB = &bodyB->velocity;
|
||||
wB = &bodyB->angularVelocity;
|
||||
} else {
|
||||
|
|
|
@ -36,6 +36,7 @@ enum RigidBodyFlags {
|
|||
|
||||
RigidBodyFizzled = (1 << 13),
|
||||
RigidBodyDisableGravity = (1 << 14),
|
||||
RigidBodyForceVelocity = (1 << 15),
|
||||
};
|
||||
|
||||
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);
|
||||
rigidBodyMarkKinematic(&body[i]);
|
||||
|
||||
body[i].flags |= RigidBodyForceVelocity;
|
||||
|
||||
body[i].currentRoom = gCurrentLevel->dynamicBoxes[i].roomIndex;
|
||||
|
||||
collisionSceneAddDynamicObject(&colliders[i]);
|
||||
|
@ -553,7 +555,15 @@ void sceneUpdateAnimatedObjects(struct Scene* scene) {
|
|||
relativeTransform.rotation = boxDef->rotation;
|
||||
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]);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue