Some physics is unborken

This commit is contained in:
James Lambert 2023-01-07 22:04:42 -07:00
parent ae1da1ef30
commit 17df946bc4

View file

@ -430,7 +430,7 @@ union DynamicBroadphaseEdge {
struct DynamicBroadphase { struct DynamicBroadphase {
union DynamicBroadphaseEdge* edges; union DynamicBroadphaseEdge* edges;
struct CollisionObject** objectsInCurrentRange; short* objectsInCurrentRange;
int objectInRangeCount; int objectInRangeCount;
}; };
@ -504,7 +504,7 @@ void collisionObjectCollidePairMixed(struct CollisionObject* a, struct Vector3*
} }
} }
void collisionSceneWalkBroadphase(struct CollisionScene* collisionScene, struct DynamicBroadphase* broadphase, struct Vector3* prevPos, struct Box3D* sweptB) { void collisionSceneWalkBroadphase(struct CollisionScene* collisionScene, struct DynamicBroadphase* broadphase, struct Vector3* prevPos, struct Box3D* sweptBB) {
int broadphaseEdgeCount = collisionScene->dynamicObjectCount * 2; int broadphaseEdgeCount = collisionScene->dynamicObjectCount * 2;
for (int i = 0; i < broadphaseEdgeCount; ++i) { for (int i = 0; i < broadphaseEdgeCount; ++i) {
union DynamicBroadphaseEdge edge; union DynamicBroadphaseEdge edge;
@ -514,7 +514,8 @@ void collisionSceneWalkBroadphase(struct CollisionScene* collisionScene, struct
if (edge.isLeadingEdge) { if (edge.isLeadingEdge) {
for (int objectIndex = 0; objectIndex < broadphase->objectInRangeCount; ++objectIndex) { for (int objectIndex = 0; objectIndex < broadphase->objectInRangeCount; ++objectIndex) {
struct CollisionObject* existing = broadphase->objectsInCurrentRange[objectIndex]; short existingIndex = broadphase->objectsInCurrentRange[objectIndex];
struct CollisionObject* existing = collisionScene->dynamicObjects[existingIndex];
if ((existing->collisionLayers & subject->collisionLayers) == 0) { if ((existing->collisionLayers & subject->collisionLayers) == 0) {
continue; continue;
@ -528,34 +529,34 @@ void collisionSceneWalkBroadphase(struct CollisionScene* collisionScene, struct
if (existing < subject) { if (existing < subject) {
collisionObjectCollidePairMixed( collisionObjectCollidePairMixed(
existing, existing,
&prevPos[objectIndex], &prevPos[existingIndex],
&sweptB[objectIndex], &sweptBB[existingIndex],
subject, subject,
&prevPos[edge.objectId], &prevPos[edge.objectId],
&sweptB[edge.objectId], &sweptBB[edge.objectId],
&gContactSolver &gContactSolver
); );
} else { } else {
collisionObjectCollidePairMixed( collisionObjectCollidePairMixed(
subject, subject,
&prevPos[edge.objectId], &prevPos[edge.objectId],
&sweptB[edge.objectId], &sweptBB[edge.objectId],
existing, existing,
&prevPos[objectIndex], &prevPos[existingIndex],
&sweptB[objectIndex], &sweptBB[existingIndex],
&gContactSolver &gContactSolver
); );
} }
} }
// add object // add object
broadphase->objectsInCurrentRange[broadphase->objectInRangeCount] = subject; broadphase->objectsInCurrentRange[broadphase->objectInRangeCount] = edge.objectId;
++broadphase->objectInRangeCount; ++broadphase->objectInRangeCount;
} else { } else {
// remove object // remove object
int hasFound = 0; int hasFound = 0;
for (int i = 0; i < broadphase->objectInRangeCount - 1; ++i) { for (int i = 0; i < broadphase->objectInRangeCount - 1; ++i) {
if (broadphase->objectsInCurrentRange[i] == subject) { if (broadphase->objectsInCurrentRange[i] == edge.objectId) {
hasFound = 1; hasFound = 1;
} }
@ -569,7 +570,7 @@ void collisionSceneWalkBroadphase(struct CollisionScene* collisionScene, struct
} }
} }
void collisionSceneCollideDynamicPairs(struct CollisionScene* collisionScene, struct Vector3* prevPos, struct Box3D* sweptB) { void collisionSceneCollideDynamicPairs(struct CollisionScene* collisionScene, struct Vector3* prevPos, struct Box3D* sweptBB) {
struct DynamicBroadphase dynamicBroadphase; struct DynamicBroadphase dynamicBroadphase;
dynamicBroadphase.edges = stackMalloc(sizeof(union DynamicBroadphaseEdge) * collisionScene->dynamicObjectCount * 2); dynamicBroadphase.edges = stackMalloc(sizeof(union DynamicBroadphaseEdge) * collisionScene->dynamicObjectCount * 2);
@ -579,10 +580,10 @@ void collisionSceneCollideDynamicPairs(struct CollisionScene* collisionScene, st
dynamicBroadphaseSort(dynamicBroadphase.edges, tmpEdges, 0, collisionScene->dynamicObjectCount * 2); dynamicBroadphaseSort(dynamicBroadphase.edges, tmpEdges, 0, collisionScene->dynamicObjectCount * 2);
stackMallocFree(tmpEdges); stackMallocFree(tmpEdges);
dynamicBroadphase.objectsInCurrentRange = stackMalloc(sizeof(struct CollisionObject*) * collisionScene->dynamicObjectCount); dynamicBroadphase.objectsInCurrentRange = stackMalloc(sizeof(short) * collisionScene->dynamicObjectCount);
dynamicBroadphase.objectInRangeCount = 0; dynamicBroadphase.objectInRangeCount = 0;
collisionSceneWalkBroadphase(collisionScene, &dynamicBroadphase, prevPos, sweptB); collisionSceneWalkBroadphase(collisionScene, &dynamicBroadphase, prevPos, sweptBB);
stackMallocFree(dynamicBroadphase.objectsInCurrentRange); stackMallocFree(dynamicBroadphase.objectsInCurrentRange);
stackMallocFree(dynamicBroadphase.edges); stackMallocFree(dynamicBroadphase.edges);