mirror of
https://github.com/mwpenny/portal64-still-alive.git
synced 2024-10-20 10:37:37 -04:00
Some physics is unborken
This commit is contained in:
parent
ae1da1ef30
commit
17df946bc4
|
@ -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);
|
||||||
|
|
Loading…
Reference in a new issue