mirror of
https://github.com/mwpenny/portal64-still-alive.git
synced 2024-10-19 22:27:36 -04:00
Fix crash around collision of objects
This commit is contained in:
parent
0e701017c6
commit
2eb87888a1
|
@ -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
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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:
|
||||
|
|
Loading…
Reference in a new issue