Fix crash around collision of objects

This commit is contained in:
James Lambert 2023-07-13 08:00:43 -06:00
parent 0e701017c6
commit 2eb87888a1
4 changed files with 74 additions and 10 deletions

View file

@ -134,7 +134,8 @@ make -f Makefile.docker
- [ ] test chamber 02 needs more light in the first room
- [ ] pausing while glados is speaking can end her speech early
- [ ] don't repeat camera destruction speech every time
- [ ] glitch wall lighting when shooting portals on shaded walls
- [ ] don't count boxes on buttons until it is released and stable
- [x] glitch wall lighting when shooting portals on shaded walls
- [x] Adding y-axis/x-axis inverting options #55
- [x] Adding look axis sensitivity setting
- [x] Adding a menu to game #47

View file

@ -102,8 +102,8 @@ void controllerActionReadDirection(enum ControllerActionSource source, int contr
case ControllerActionSourceJoystick:
{
OSContPad* pad = controllersGetControllerData(controllerIndex);
result.x = controllerCleanupStickInput(pad->stick_x);
result.y = controllerCleanupStickInput(pad->stick_y);
result.x += controllerCleanupStickInput(pad->stick_x);
result.y += controllerCleanupStickInput(pad->stick_y);
break;
}
default:

View file

@ -61,6 +61,37 @@ int validateHeap(struct ExpandingSimplex* simplex) {
return 1;
}
int validateExpandingSimplex(struct ExpandingSimplex* simplex) {
for (int triangleIndex = 0; triangleIndex < simplex->triangleCount; ++triangleIndex) {
struct SimplexTriangle* triangle = &simplex->triangles[triangleIndex];
for (int index = 0; index < 3; ++index) {
struct SimplexTriangle* adjacent = &simplex->triangles[triangle->indexData.adjacentFaces[index]];
int nextFromOpposite = NEXT_FACE(triangle->indexData.oppositePoints[index]);
// verify the back link
if (adjacent->indexData.adjacentFaces[nextFromOpposite] != triangleIndex) {
return 0;
}
struct Vector3 offset;
vector3Sub(
&simplex->points[adjacent->indexData.indices[triangle->indexData.oppositePoints[index]]],
&simplex->points[triangle->indexData.indices[index]],
&offset
);
// verify shape is convex
if (vector3Dot(&offset, &triangle->normal) > 0.000001f) {
return 0;
}
}
}
return 1;
}
void expandingSimplexAddPoint(struct ExpandingSimplex* simplex, struct Vector3* aPoint, struct Vector3* pointDiff, int id) {
int result = simplex->pointCount;
simplex->aPoints[result] = *aPoint;
@ -234,6 +265,17 @@ void expandingSimplexRotateEdge(struct ExpandingSimplex* simplex, struct Simplex
triangleA->indexData.oppositePoints[1] = relativeIndex1;
triangleB->indexData.oppositePoints[relativeIndex2] = 0;
// update back references from adjacent triangles
struct SimplexTriangle* adjTriangle = &simplex->triangles[triangleA->indexData.adjacentFaces[0]];
int adjIndex = NEXT_FACE(triangleA->indexData.oppositePoints[0]);
adjTriangle->indexData.adjacentFaces[adjIndex] = triangleAIndex;
adjTriangle->indexData.oppositePoints[adjIndex] = 2;
adjTriangle = &simplex->triangles[triangleB->indexData.adjacentFaces[relativeIndex1]];
adjIndex = NEXT_FACE(triangleB->indexData.oppositePoints[relativeIndex1]);
adjTriangle->indexData.adjacentFaces[adjIndex] = triangleBIndex;
adjTriangle->indexData.oppositePoints[adjIndex] = relativeIndex0;
expandingSimplexTriangleInitNormal(simplex, triangleA);
if (!(simplex->flags & SimplexFlagsSkipDistance)) {
expandingSimplexTriangleDetermineDistance(simplex, triangleA);

View file

@ -288,19 +288,40 @@ def extract_simplex_data(simplex, closestFace):
int(input_triangle["indexData"]["indices"][2])
))
return Simplex(output_vertices, output_triangles, Triangle(
int(closestFace["indexData"]["indices"][0]),
int(closestFace["indexData"]["indices"][1]),
int(closestFace["indexData"]["indices"][2])
))
if closestFace:
closestFaceTriangle = Triangle(
int(closestFace["indexData"]["indices"][0]),
int(closestFace["indexData"]["indices"][1]),
int(closestFace["indexData"]["indices"][2])
)
else:
closestFaceTriangle = None
return Simplex(output_vertices, output_triangles, closestFaceTriangle)
def main():
print("main")
print(gl.glGetString(gl.GL_VENDOR), gl.glGetString(gl.GL_RENDERER))
frame = gdb.selected_frame()
print("Getting simplex")
simplex = extract_simplex_data(frame.read_var("simplex"), frame.read_var("closestFace"))
raycastDir = frame.read_var("raycastDir")
try:
closestFace = frame.read_var("closestFace")
except:
closestFace = None
simplexVar = None
try:
simplexVar = frame.read_var("simplex")
except:
simplexVar = frame.read_var("expandingSimplex")
simplex = extract_simplex_data(simplexVar, closestFace)
try:
raycastDir = frame.read_var("raycastDir")
except:
raycastDir = {"x": 0, "y": 0, "z": 0}
with create_main_window() as window: