bug fixes

This commit is contained in:
James Lambert 2022-07-12 20:35:46 -06:00
parent 66faa76851
commit 5efc317b23
9 changed files with 93 additions and 7 deletions

1
.gitignore vendored
View file

@ -7,6 +7,7 @@
build/ build/
debugger debugger
gfxvalidator
assets_working/ assets_working/
vpk/ vpk/
portal_pak_dir/ portal_pak_dir/

View file

@ -16,7 +16,7 @@ SFZ2N64:=sfz2n64
$(SKELATOOL64): $(SKELATOOL64):
make -C skelatool64 make -C skelatool64
OPTIMIZER := -O0 OPTIMIZER := -O2
LCDEFS := -DDEBUG -g -Isrc/ -I/usr/include/n64/nustd -Werror -Wall LCDEFS := -DDEBUG -g -Isrc/ -I/usr/include/n64/nustd -Werror -Wall
N64LIB := -lultra_rom -lnustd N64LIB := -lultra_rom -lnustd
@ -35,6 +35,11 @@ ASMOBJECTS = $(patsubst %.s, build/%.o, $(ASMFILES))
CODEFILES = $(shell find src/ -type f -name '*.c') CODEFILES = $(shell find src/ -type f -name '*.c')
ifeq ($(WITH_GFX_VALIDATOR),1)
LCDEFS += -DWITH_GFX_VALIDATOR
CODEFILES += gfxvalidator/validator.c gfxvalidator/error_printer.c gfxvalidator/command_printer.c
endif
CODESEGMENT = build/codesegment CODESEGMENT = build/codesegment
BOOT = /usr/lib/n64/PR/bootcode/boot.6102 BOOT = /usr/lib/n64/PR/bootcode/boot.6102

View file

@ -95,3 +95,4 @@ Where `/home/james/Blender/blender-2.93.1-linux-x64` is the folder where Blender
- [x] Implement "Emancipation grid" - [x] Implement "Emancipation grid"
- [x] Cut holes in portal walls - [x] Cut holes in portal walls
- [x] Get an optimized build working - [x] Get an optimized build working
- [x] Portal animations

View file

@ -7,6 +7,14 @@ struct GraphicsTask gGraphicsTasks[2];
extern OSMesgQueue gfxFrameMsgQ; extern OSMesgQueue gfxFrameMsgQ;
extern OSMesgQueue *schedulerCommandQueue; extern OSMesgQueue *schedulerCommandQueue;
#if WITH_GFX_VALIDATOR
#include "../../gfxvalidator/validator.h"
#endif
#if WITH_DEBUGGER
#include "../../debugger/debugger.h"
#endif
#define RDP_OUTPUT_SIZE 0x4000 #define RDP_OUTPUT_SIZE 0x4000
u64* rdpOutput; u64* rdpOutput;
@ -67,8 +75,6 @@ void graphicsCreateTask(struct GraphicsTask* targetTask, GraphicsCallback callba
renderStateFlushCache(renderState); renderStateFlushCache(renderState);
OSScTask *scTask = &targetTask->task; OSScTask *scTask = &targetTask->task;
OSTask_t *task = &scTask->list.t; OSTask_t *task = &scTask->list.t;
@ -100,5 +106,19 @@ void graphicsCreateTask(struct GraphicsTask* targetTask, GraphicsCallback callba
scTask->next = 0; scTask->next = 0;
scTask->state = 0; scTask->state = 0;
#if WITH_GFX_VALIDATOR
struct GFXValidationResult validationResult;
zeroMemory(&validationResult, sizeof(struct GFXValidationResult));
if (!gfxValidate(&scTask->list, MAX_DL_LENGTH, &validationResult)) {
#if WITH_DEBUGGER
gdbBreak();
#else
zeroMemory(&validationResult, sizeof(struct GFXValidationResult));
return;
#endif // WITH_DEBUGGER
}
#endif // WITH_GFX_VALIDATOR
osSendMesg(schedulerCommandQueue, (OSMesg)scTask, OS_MESG_BLOCK); osSendMesg(schedulerCommandQueue, (OSMesg)scTask, OS_MESG_BLOCK);
} }

View file

@ -52,6 +52,10 @@ void screenClipperIncludePoint(struct Vector4* point, struct Box2D* output) {
} }
unsigned screenClipperClipBoundary(struct ScreenClipper* clipper, struct Vector4* input, struct Vector4* output, unsigned pointCount, int axis, int direction, int oppositeSide) { unsigned screenClipperClipBoundary(struct ScreenClipper* clipper, struct Vector4* input, struct Vector4* output, unsigned pointCount, int axis, int direction, int oppositeSide) {
if (pointCount == 0) {
return 0;
}
unsigned outputPointCount = 0; unsigned outputPointCount = 0;
struct Vector4* previous = &input[pointCount - 1]; struct Vector4* previous = &input[pointCount - 1];

View file

@ -243,8 +243,6 @@ void playerUpdate(struct Player* player, struct Transform* cameraTransform) {
player->body.velocity.y = JUMP_IMPULSE; player->body.velocity.y = JUMP_IMPULSE;
} }
OSContPad* controllerInput = controllersGetControllerData(0);
struct Vector3 targetVelocity = gZeroVec; struct Vector3 targetVelocity = gZeroVec;
if (controllerGetButton(0, L_CBUTTONS | L_JPAD)) { if (controllerGetButton(0, L_CBUTTONS | L_JPAD)) {
@ -313,6 +311,19 @@ void playerUpdate(struct Player* player, struct Transform* cameraTransform) {
player->flags |= PlayerFlagsGrounded; player->flags |= PlayerFlagsGrounded;
} else { } else {
player->flags &= ~PlayerFlagsGrounded; player->flags &= ~PlayerFlagsGrounded;
struct ContactManifold* manifold = contactSolverNextManifold(&gContactSolver, &player->collisionObject, NULL);
while (manifold) {
for (int contact = 0; contact < manifold->contactCount; ++contact) {
if (manifold->contacts[contact].id == 0xFFFF) {
manifold->contactCount = 0;
break;
}
}
manifold = contactSolverNextManifold(&gContactSolver, &player->collisionObject, manifold);
}
} }
playerHandleCollision(player); playerHandleCollision(player);
@ -330,8 +341,7 @@ void playerUpdate(struct Player* player, struct Transform* cameraTransform) {
soundPlayerPlay(soundsPortalExit[2 - didPassThroughPortal], 0.75f, 1.0f, NULL); soundPlayerPlay(soundsPortalExit[2 - didPassThroughPortal], 0.75f, 1.0f, NULL);
} }
OSContPad* controllerInput = controllersGetControllerData(0);
float targetYaw = -playerCleanupStickInput(controllerInput->stick_x) * ROTATE_RATE; float targetYaw = -playerCleanupStickInput(controllerInput->stick_x) * ROTATE_RATE;
float targetPitch = playerCleanupStickInput(controllerInput->stick_y) * ROTATE_RATE; float targetPitch = playerCleanupStickInput(controllerInput->stick_y) * ROTATE_RATE;

View file

@ -62,6 +62,10 @@ int portalSurfaceShouldSwapOrder(int portalToMove) {
} }
void portalSurfaceReplacementRevert(struct PortalSurfaceReplacement* replacement) { void portalSurfaceReplacementRevert(struct PortalSurfaceReplacement* replacement) {
if (!(replacement->flags & PortalSurfaceReplacementFlagsIsEnabled)) {
return;
}
gCurrentLevel->staticContent[replacement->staticIndex].displayList = replacement->previousSurface.triangles; gCurrentLevel->staticContent[replacement->staticIndex].displayList = replacement->previousSurface.triangles;
portalSurfaceCleanup(&gCurrentLevel->portalSurfaces[replacement->portalSurfaceIndex]); portalSurfaceCleanup(&gCurrentLevel->portalSurfaces[replacement->portalSurfaceIndex]);
gCurrentLevel->portalSurfaces[replacement->portalSurfaceIndex] = replacement->previousSurface; gCurrentLevel->portalSurfaces[replacement->portalSurfaceIndex] = replacement->previousSurface;

View file

@ -46,6 +46,10 @@ int portalSurfaceFindEnclosingFace(struct PortalSurface* surface, struct Vector2
vector2Sub(&b, &a, &edgeOffset); vector2Sub(&b, &a, &edgeOffset);
vector2Sub(&aroundPointF, &a, &pointOffset); vector2Sub(&aroundPointF, &a, &pointOffset);
if (edgeOffset.x == 0.0f && edgeOffset.y == 0.0f) {
continue;
}
float lerp = vector2Dot(&edgeOffset, &pointOffset) / vector2MagSqr(&edgeOffset); float lerp = vector2Dot(&edgeOffset, &pointOffset) / vector2MagSqr(&edgeOffset);
if (lerp < 0.0f) { if (lerp < 0.0f) {

37
tools/dump_rcp_state.py Normal file
View file

@ -0,0 +1,37 @@
import gdb
import traceback
def dump_hex_integer(output, number):
output.write(format((number >> 24) & 255, "02X"))
output.write(" ")
output.write(format((number >> 16) & 255, "02X"))
output.write(" ")
output.write(format((number >> 8) & 255, "02X"))
output.write(" ")
output.write(format((number >> 0) & 255, "02X"))
try:
dmem_ptr = gdb.parse_and_eval("(int*)0xA4000000")
with open("rcp_dump.txt", "w") as output:
for i in range(0, 4096, 16):
index_offset = i >> 2
output.write(format(i, "03X"))
output.write(" ")
dump_hex_integer(output, int(dmem_ptr[index_offset + 0]))
output.write(" ")
dump_hex_integer(output, int(dmem_ptr[index_offset + 1]))
output.write(" ")
dump_hex_integer(output, int(dmem_ptr[index_offset + 2]))
output.write(" ")
dump_hex_integer(output, int(dmem_ptr[index_offset + 3]))
output.write(" \n")
except:
print("An error happened")
print(traceback.format_exc())