updated variable names to match Ryan Dwyer's work clarifying the zbuffer behavior

This commit is contained in:
joshuarwood committed 2025-05-03 19:57:52 -05:00
1 parent 75e34ace8c
commit 0d6c557982
6 files changed
+95 -75

No files matched your search

+4 -6
View File
@@ -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);
+50 -30
View File
@@ -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;
+5 -5
View File
@@ -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;
}
}
+18 -18
View File
@@ -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;
}
+10 -8
View File
@@ -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;
};
+8 -8
View File
@@ -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;
}
}
}