From 0d6c55798260d955ef0731f9ee717e24be859663 Mon Sep 17 00:00:00 2001 From: joshuarwood Date: Sat, 3 May 2025 19:57:52 -0500 Subject: [PATCH] updated variable names to match Ryan Dwyer's work clarifying the zbuffer behavior --- src/game/bondgun.c | 10 +++--- src/game/game_13c510.c | 80 ++++++++++++++++++++++++++---------------- src/game/sky.c | 10 +++--- src/game/zbuf.c | 36 +++++++++---------- src/include/types.h | 18 +++++----- src/lib/sched.c | 16 ++++----- 6 files changed, 95 insertions(+), 75 deletions(-) diff --git a/src/game/bondgun.c b/src/game/bondgun.c index 2f929cb35..3d463d16e 100644 --- a/src/game/bondgun.c +++ b/src/game/bondgun.c @@ -8477,7 +8477,7 @@ glabel var7f1aca90 /* f0a71e4: 100002d5 */ b .L0f0a7d3c /* f0a71e8: 8fbf0034 */ lw $ra,0x34($sp) .L0f0a71ec: -/* f0a71ec: 0fc5d9ad */ jal zbufDrawArtifactsOffscreen +/* f0a71ec: 0fc5d9ad */ jal zbufSaveArtifactDepths /* f0a71f0: 8fa4014c */ lw $a0,0x14c($sp) /* f0a71f4: afa2014c */ sw $v0,0x14c($sp) /* f0a71f8: 0c002ca0 */ jal viPrepareZbuf @@ -9318,7 +9318,7 @@ glabel var7f1aca90 /* f0a71e4: 100002d5 */ b .L0f0a7d3c /* f0a71e8: 8fbf0034 */ lw $ra,0x34($sp) .L0f0a71ec: -/* f0a71ec: 0fc5d9ad */ jal zbufDrawArtifactsOffscreen +/* f0a71ec: 0fc5d9ad */ jal zbufSaveArtifactDepths /* f0a71f0: 8fa4014c */ lw $a0,0x14c($sp) /* f0a71f4: afa2014c */ sw $v0,0x14c($sp) /* f0a71f8: 0c002ca0 */ jal viPrepareZbuf @@ -10159,7 +10159,7 @@ glabel var7f1aca90 /* f0a4f30: 100002cd */ beqz $zero,.NB0f0a5a68 /* f0a4f34: 8fbf0034 */ lw $ra,0x34($sp) .NB0f0a4f38: -/* f0a4f38: 0fc5c4d5 */ jal zbufDrawArtifactsOffscreen +/* f0a4f38: 0fc5c4d5 */ jal zbufSaveArtifactDepths /* f0a4f3c: 8fa40144 */ lw $a0,0x144($sp) /* f0a4f40: afa20144 */ sw $v0,0x144($sp) /* f0a4f44: 0c002d00 */ jal viPrepareZbuf @@ -10956,9 +10956,7 @@ void bgunRender(Gfx **gdlptr) return; } -#ifdef PLATFORM_N64 // TODO - gdl = zbufDrawArtifactsOffscreen(gdl); -#endif + gdl = zbufSaveArtifactDepths(gdl); gdl = viPrepareZbuf(gdl); gdl = vi0000b1d0(gdl); diff --git a/src/game/game_13c510.c b/src/game/game_13c510.c index f66851b6e..ae79b10dd 100644 --- a/src/game/game_13c510.c +++ b/src/game/game_13c510.c @@ -439,14 +439,14 @@ void artifactsCalculateGlaresForRoom(s32 roomnum) if (index < MAX_ARTIFACTS) { #ifndef PLATFORM_N64 - artifact->unk02 = artifactTestLos(&spec, &g_BgRooms[roomnum].pos, xi, yi); + artifact->visiblelos = artifactTestLos(&spec, &g_BgRooms[roomnum].pos, xi, yi); #endif - artifact->unk04 = floatToIntDepth(f0) >> 2; - artifact->unk08 = &g_ZbufPtr1[viGetWidth() * yi + xi]; + artifact->expecteddepth = floatToIntDepth(f0) >> 2; + artifact->zbufptr = &g_ZbufPtr1[viGetWidth() * yi + xi]; artifact->light = &roomlights[i]; artifact->type = ARTIFACTTYPE_GLARE; - artifact->unk0c.u16_2 = xi; - artifact->unk0c.u16_1 = yi; + artifact->screenx = xi; + artifact->screeny = yi; } } } @@ -457,7 +457,7 @@ void artifactsCalculateGlaresForRoom(s32 roomnum) } } -u8 func0f13d3c4(u8 arg0, u8 arg1) +u8 artifactsClamp(u8 arg0, u8 arg1) { if (arg1 >= arg0 + 7) { return arg0 + 7; @@ -505,18 +505,18 @@ Gfx *artifactsRenderGlaresForRoom(Gfx *gdl, s32 roomnum) u16 min; u16 max; f32 lightop_cur_frac; - s32 t2; + s32 numgood; struct light *light; u8 *s3; s32 k; s32 count; - u16 t4; + u16 actualdepth; f32 add; s32 l; f32 brightness; - s32 avg; + s32 tolerance; f32 f0; - s32 v1; + s32 difference; s32 r; s32 g; s32 b; @@ -542,6 +542,12 @@ Gfx *artifactsRenderGlaresForRoom(Gfx *gdl, s32 roomnum) struct light *light2 = artifacts[i].light; count = 0; + /** + * light arifacts are created from several, closely spaced + * textures that give the appearance of a dynamic light glare + * as the character moves. Loop to count all the sub-artifacts + * in this light. + */ for (j = i; j < MAX_ARTIFACTS && artifacts[j].type == ARTIFACTTYPE_GLARE && artifacts[j].light == light2; j++) { count++; } @@ -552,51 +558,65 @@ Gfx *artifactsRenderGlaresForRoom(Gfx *gdl, s32 roomnum) if (roomnum == light->roomnum) { lightindex = ((uintptr_t)light - (uintptr_t)g_BgLightsFileData) / sizeof(struct light); s3 = &var800a41a0[lightindex * 3]; - t2 = 0; + numgood = 0; min = 0xffff; max = 0; + /** + * loop to determine the min & max depth of + * the sub-artifacts composing this room light. + */ for (k = i; k < i + count; k++) { - if (artifacts[k].unk04 > max) { - max = artifacts[k].unk04; + if (artifacts[k].expecteddepth > max) { + max = artifacts[k].expecteddepth; } - if (artifacts[k].unk04 < min) { - min = artifacts[k].unk04; + if (artifacts[k].expecteddepth < min) { + min = artifacts[k].expecteddepth; } } - avg = (max - min) >> 1; + /** + * Define a depth tolerance from the min & max + * depths of sub-artifacts for a given light. + * This will be used to determine which light + * artifacts are visible when comparing depth + * values of lights to other items rendered + * on screen. Without this, the lights would + * constantly flicker due to z-fighting caused + * by the low precision of the N64 depth. + */ + tolerance = (max - min) >> 1; - if (avg < 25) { - avg = 25; + if (tolerance < 25) { + tolerance = 25; } for (k = i; k < i + count; k++) { -#ifdef PLATFORM_N64 - u16 tmp; - t4 = (artifacts[k].unk02 & 0xfffc) >> 2; - tmp = artifacts[k].unk04; + u16 expecteddepth; + actualdepth = (artifacts[k].actualdepth & 0xfffc) >> 2; + expecteddepth = artifacts[k].expecteddepth; - if (tmp < t4) { - v1 = t4 - tmp; + if (expecteddepth < actualdepth) { + difference = actualdepth - expecteddepth; } else { - v1 = tmp - t4; + difference = expecteddepth - actualdepth; } - if (avg >= v1) { - t2++; +#ifdef PLATFORM_N64 + if (difference <= tolerance) { + numgood++; } #else - t2 += artifacts[k].unk02; + numgood += artifacts[k].visiblelos; #endif artifacts[k].type = ARTIFACTTYPE_FREE; } - s3[0] = func0f13d3c4(s3[0], t2 * 2); + s3[0] = artifactsClamp(s3[0], numgood * 2); - if (t2 > 0) { + if (numgood > 0) { brightness = viGetFovY() * 0.017453292f; add = cosf(brightness) / sinf(brightness) * 14.6f; diff --git a/src/game/sky.c b/src/game/sky.c index e610cad83..d5252919c 100644 --- a/src/game/sky.c +++ b/src/game/sky.c @@ -2518,11 +2518,11 @@ void skyCreateSunArtifact(struct artifact *artifact, s32 x, s32 y) sunpos.x = env->suns[i].pos[0]; sunpos.y = env->suns[i].pos[1]; sunpos.z = env->suns[i].pos[2]; - artifact->unk02 = artifactTestLos(&sunpos, &zero, x, y) * 0xfffc; + artifact->visiblelos = artifactTestLos(&sunpos, &zero, x, y) * 0xfffc; #endif - artifact->unk08 = &g_ZbufPtr1[(s32)camGetScreenWidth() * y + x]; - artifact->unk0c.u16_2 = x; - artifact->unk0c.u16_1 = y; + artifact->zbufptr = &g_ZbufPtr1[(s32)camGetScreenWidth() * y + x]; + artifact->screenx = x; + artifact->screeny = y; artifact->type = ARTIFACTTYPE_CIRCLE; } } @@ -2533,7 +2533,7 @@ f32 skyGetArtifactGroupIntensityFrac(struct artifact *artifacts) s32 i; for (i = 0; i < 8; i++) { - if (artifacts[i].type == ARTIFACTTYPE_CIRCLE && artifacts[i].unk02 == 0xfffc) { + if (artifacts[i].type == ARTIFACTTYPE_CIRCLE && artifacts[i].actualdepth == 0xfffc) { sum += 0.125f; } } diff --git a/src/game/zbuf.c b/src/game/zbuf.c index cf1b62140..0d1d2bb53 100644 --- a/src/game/zbuf.c +++ b/src/game/zbuf.c @@ -177,23 +177,23 @@ u16 *zbufGetArtifactsCfb(s32 index) return addr; } -Gfx *zbufDrawArtifactsOffscreen(Gfx *gdl) +Gfx *zbufSaveArtifactDepths(Gfx *gdl) { struct artifact *artifacts = schedGetWriteArtifacts(); u32 stack; - u16 *sp4c = g_ZbufPtr1; - u32 s4 = 0; - u16 *sp44; - u16 *s2; - u16 *image; + u16 *zbuf = g_ZbufPtr1; + u32 numsamples = 0; + u16 *samples; + u16 *thissample; + u16 *zbufrow; s32 i; viGetBackBuffer(); - sp44 = zbufGetArtifactsCfb(g_SchedWriteArtifactsIndex); + samples = zbufGetArtifactsCfb(g_SchedWriteArtifactsIndex); g_SchedSpecialArtifactIndexes[g_SchedWriteArtifactsIndex] = 1; gDPPipeSync(gdl++); - gDPSetColorImage(gdl++, G_IM_FMT_RGBA, G_IM_SIZ_16b, viGetBufWidth(), OS_PHYSICAL_TO_K0(sp44)); + gDPSetColorImage(gdl++, G_IM_FMT_RGBA, G_IM_SIZ_16b, viGetBufWidth(), OS_PHYSICAL_TO_K0(samples)); gDPSetScissor(gdl++, G_SC_NON_INTERLACE, 0, 0, SCREEN_320, SCREEN_240); gDPSetCycleType(gdl++, G_CYC_COPY); gDPSetTile(gdl++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 0, 0x0000, 5, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD); @@ -220,24 +220,24 @@ Gfx *zbufDrawArtifactsOffscreen(Gfx *gdl) if (1); if (artifacts[i].type != ARTIFACTTYPE_FREE) { - s2 = &sp44[s4]; - image = &sp4c[artifacts[i].unk0c.u16_1 * viGetWidth()]; + thissample = &samples[numsamples]; + zbufrow = &zbuf[artifacts[i].screeny * viGetWidth()]; gDPPipeSync(gdl++); - gDPSetTextureImage(gdl++, G_IM_FMT_RGBA, G_IM_SIZ_16b, SCREEN_320, image); + gDPSetTextureImage(gdl++, G_IM_FMT_RGBA, G_IM_SIZ_16b, SCREEN_320, zbufrow); gDPLoadSync(gdl++); gDPLoadBlock(gdl++, 5, 0, 0, viGetWidth() - 1, 0); gDPPipeSync(gdl++); gSPTextureRectangle(gdl++, - s4 << 2, 0, - (s4 + 3) << 2, 0, - G_TX_RENDERTILE, (artifacts[i].unk0c.u16_2 * 32) + 16, 0x0010, 0x1000, 0); + numsamples << 2, 0, + (numsamples + 3) << 2, 0, + G_TX_RENDERTILE, (artifacts[i].screenx * 32) + 16, 0x0010, 0x1000, 0); - artifacts[i].unk0c.u16p = s2; - s4++; + artifacts[i].depthptr = thissample; + numsamples++; - if (s2); + if (thissample); } } @@ -251,7 +251,7 @@ Gfx *zbufDrawArtifactsOffscreen(Gfx *gdl) gDPSetTexturePersp(gdl++, G_TP_PERSP); gDPSetColorDither(gdl++, G_CD_BAYER); - if (sp44); + if (samples); return gdl; } diff --git a/src/include/types.h b/src/include/types.h index 1da61867b..702c6d6d0 100644 --- a/src/include/types.h +++ b/src/include/types.h @@ -3494,17 +3494,19 @@ struct audioconfig { struct artifact { u16 type; - u16 unk02; - u16 unk04; - u16 unk06; - u16 *unk08; + u16 actualdepth; + u16 expecteddepth; + u16 *zbufptr; +#ifndef PLATFORM_N64 + u16 visiblelos; +#endif union { - u16 *u16p; + u16 *depthptr; struct { - u16 u16_1; - u16 u16_2; + u16 screeny; + u16 screenx; }; - } unk0c; + }; struct light *light; }; diff --git a/src/lib/sched.c b/src/lib/sched.c index 266e4cb68..b70906336 100644 --- a/src/lib/sched.c +++ b/src/lib/sched.c @@ -540,20 +540,20 @@ void schedUpdatePendingArtifacts(void) struct artifact *artifact = &artifacts[i]; if (artifact->type != ARTIFACTTYPE_FREE) { - u16 *unk08 = artifact->unk08; - u16 value08 = unk08[0]; + u16 *currdepthptr = artifact->zbufptr; + u16 currdepth = *currdepthptr; if (g_SchedSpecialArtifactIndexes[g_SchedPendingArtifactsIndex] == 1) { - u16 *unk0c = artifact->unk0c.u16p; - u16 value0c = unk0c[0]; + u16 *prevdepthptr = artifact->depthptr; + u16 prevdepth = *prevdepthptr; - if (value0c > value08) { - artifact->unk02 = value08; + if (currdepth < prevdepth) { + artifact->actualdepth = currdepth; } else { - artifact->unk02 = value0c; + artifact->actualdepth = prevdepth; } } else { - artifact->unk02 = value08; + artifact->actualdepth = currdepth; } } }