Break physics engine
This commit is contained in:
parent
e290a60856
commit
ae1da1ef30
|
@ -87,6 +87,15 @@ void collisionObjectCollideWithQuad(struct CollisionObject* object, struct Colli
|
|||
contactInsert(contact, &result);
|
||||
}
|
||||
|
||||
void collisionObjectHandleSweptCollision(struct CollisionObject* object, struct Vector3* normal, float restitution) {
|
||||
float velocityDot = vector3Dot(normal, &object->body->velocity);
|
||||
|
||||
if (velocityDot < 0.0f) {
|
||||
vector3AddScaled(&object->body->velocity, normal, (1 + restitution) * -velocityDot, &object->body->velocity);
|
||||
vector3AddScaled(&object->body->transform.position, normal, -0.01f, &object->body->transform.position);
|
||||
}
|
||||
}
|
||||
|
||||
void collisionObjectCollideWithQuadSwept(struct CollisionObject* object, struct Vector3* objectPrevPos, struct Box3D* sweptBB, struct CollisionObject* quadObject, struct ContactSolver* contactSolver) {
|
||||
if ((object->collisionLayers & quadObject->collisionLayers) == 0) {
|
||||
return;
|
||||
|
@ -160,6 +169,8 @@ void collisionObjectCollideWithQuadSwept(struct CollisionObject* object, struct
|
|||
|
||||
transformPointInverseNoScale(&object->body->transform, &result.contactB, &result.contactB);
|
||||
contactInsert(contact, &result);
|
||||
|
||||
collisionObjectHandleSweptCollision(object, &contact->normal, contact->restitution);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -603,7 +603,6 @@ void collisionSceneUpdateDynamics() {
|
|||
for (unsigned i = 0; i < gCollisionScene.dynamicObjectCount; ++i) {
|
||||
// added back in by contactSolverRemoveUnusedContacts if there are actually contacts
|
||||
gCollisionScene.dynamicObjects[i]->flags &= ~COLLISION_OBJECT_HAS_CONTACTS;
|
||||
// gCollisionScene.dynamicObjects[i]->flags |= COLLISION_OBJECT_HAS_CONTACTS;
|
||||
}
|
||||
|
||||
contactSolverRemoveUnusedContacts(&gContactSolver);
|
||||
|
@ -613,6 +612,10 @@ void collisionSceneUpdateDynamics() {
|
|||
|
||||
for (unsigned i = 0; i < gCollisionScene.dynamicObjectCount; ++i) {
|
||||
struct CollisionObject* object = gCollisionScene.dynamicObjects[i];
|
||||
|
||||
prevPosList[i] = object->body->transform.position;
|
||||
sweptBB[i] = object->boundingBox;
|
||||
|
||||
if (!collisionObjectShouldGenerateConctacts(object)) {
|
||||
continue;
|
||||
}
|
||||
|
@ -633,44 +636,11 @@ void collisionSceneUpdateDynamics() {
|
|||
continue;
|
||||
}
|
||||
|
||||
prevPosList[i] = object->body->transform.position;
|
||||
rigidBodyUpdate(object->body);
|
||||
collisionObjectUpdateBB(object);
|
||||
box3DUnion(&sweptBB[i], &object->boundingBox, &sweptBB[i]);
|
||||
|
||||
if (object->flags & COLLISION_OBJECT_HAS_CONTACTS || !collisionObjectIsActive(object)) {
|
||||
collisionObjectCollideWithScene(object, &gCollisionScene, &gContactSolver);
|
||||
} else {
|
||||
sweptBB[i] = object->boundingBox;
|
||||
|
||||
rigidBodyUpdate(object->body);
|
||||
collisionObjectUpdateBB(object);
|
||||
box3DUnion(&sweptBB[i], &object->boundingBox, &sweptBB[i]);
|
||||
|
||||
collisionObjectCollideWithSceneSwept(object, &prevPosList[i], &sweptBB[i], &gCollisionScene, &gContactSolver);
|
||||
|
||||
struct ContactManifold* manifold = contactSolverNextManifold(&gContactSolver, object, NULL);
|
||||
|
||||
struct ContactManifold* contact = NULL;
|
||||
|
||||
while (manifold) {
|
||||
contactSolverCleanupManifold(manifold);
|
||||
|
||||
if (manifold->contactCount) {
|
||||
contact = manifold;
|
||||
}
|
||||
|
||||
manifold = contactSolverNextManifold(&gContactSolver, object, manifold);
|
||||
}
|
||||
|
||||
if (contact) {
|
||||
float velocityDot = vector3Dot(&contact->normal, &object->body->velocity);
|
||||
|
||||
if (velocityDot < 0.0f) {
|
||||
vector3AddScaled(&object->body->velocity, &contact->normal, (1 + contact->restitution) * -velocityDot, &object->body->velocity);
|
||||
vector3AddScaled(&object->body->transform.position, &contact->normal, -0.01f, &object->body->transform.position);
|
||||
}
|
||||
}
|
||||
|
||||
collisionObjectUpdateBB(object);
|
||||
}
|
||||
collisionObjectCollideMixed(object, &prevPosList[i], &sweptBB[i], &gCollisionScene, &gContactSolver);
|
||||
}
|
||||
|
||||
collisionSceneCollideDynamicPairs(&gCollisionScene, prevPosList, sweptBB);
|
||||
|
@ -694,11 +664,6 @@ void collisionSceneUpdateDynamics() {
|
|||
continue;
|
||||
}
|
||||
|
||||
// if the object has no contacts then the rigidBodyUpdate
|
||||
// was already done before before doing a swept collision
|
||||
if (collisionObject->flags & COLLISION_OBJECT_HAS_CONTACTS) {
|
||||
rigidBodyUpdate(collisionObject->body);
|
||||
}
|
||||
rigidBodyCheckPortals(collisionObject->body);
|
||||
collisionObjectUpdateBB(collisionObject);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue