mm/src/code/z_scene_proc.c

522 lines
17 KiB
C

#include <ultra64.h>
#include <global.h>
void SceneProc_DrawCurrentSceneAnimatedTextures(GlobalContext* ctxt) {
gSceneProcSceneDrawFuncs[ctxt->sceneConfig](ctxt);
}
void SceneProc_DrawSceneConfig0(GlobalContext* ctxt) {
GraphicsContext* gCtxt = ctxt->common.gCtxt;
gSPDisplayList(gCtxt->polyOpa.append++, gSceneProcDefaultDl);
gSPDisplayList(gCtxt->polyXlu.append++, gSceneProcDefaultDl);
}
Gfx* SceneProc_SetTile1Layer(GlobalContext* ctxt, ScrollingTextureParams* params) {
return Rcp_GenerateSetTileSizeDl((ctxt->common).gCtxt,
params->xStep * gSceneProcStep,
-(params->yStep * gSceneProcStep),
params->width,
params->height);
}
void SceneProc_DrawType0Texture(GlobalContext* ctxt, u32 segment, ScrollingTextureParams* params) {
Gfx* dl = SceneProc_SetTile1Layer(ctxt, params);
{
GraphicsContext* gCtxt = ctxt->common.gCtxt;
if (gSceneProcFlags & 1) {
gSPSegment(gCtxt->polyOpa.append++, segment, dl);
}
if (gSceneProcFlags & 2) {
gSPSegment(gCtxt->polyXlu.append++, segment, dl);
}
}
}
Gfx* SceneProc_SetTile2Layers(GlobalContext* ctxt, ScrollingTextureParams* params) {
return Rcp_GenerateSetTileSize2Dl((ctxt->common).gCtxt,
0,
params[0].xStep * gSceneProcStep,
-(params[0].yStep * gSceneProcStep),
params[0].width,
params[0].height,
1,
params[1].xStep * gSceneProcStep,
-(params[1].yStep * gSceneProcStep),
params[1].width,
params[1].height);
}
void SceneProc_DrawType1Texture(GlobalContext* ctxt, u32 segment, ScrollingTextureParams* params) {
Gfx* dl = SceneProc_SetTile2Layers(ctxt, params);
{
GraphicsContext* gCtxt = ctxt->common.gCtxt;
if (gSceneProcFlags & 1) {
gSPSegment(gCtxt->polyOpa.append++, segment, dl);
}
if (gSceneProcFlags & 2) {
gSPSegment(gCtxt->polyXlu.append++, segment, dl);
}
}
}
#ifdef NON_MATCHING
// Slight ordering differences at the beginning
void SceneProc_DrawFlashingTexture(GlobalContext* ctxt, u32 segment, FlashingTexturePrimColor* primColor, RGBA8* envColor) {
GraphicsContext* gCtxt;
Gfx* dl;
{
Gfx* _g = (Gfx*)ctxt->common.gCtxt->polyOpa.appendEnd - 4;
dl = _g;
ctxt->common.gCtxt->polyOpa.appendEnd = _g;
}
gCtxt = ctxt->common.gCtxt;
if (gSceneProcFlags & 1) {
gSPSegment(gCtxt->polyOpa.append++, segment, dl);
}
if (gSceneProcFlags & 2) {
gSPSegment(gCtxt->polyXlu.append++, segment, dl);
}
gDPSetPrimColor(dl++,
0,
primColor->lodFrac,
primColor->red,
primColor->green,
primColor->blue,
(u8)(primColor->alpha * gSceneProcFlashingAlpha));
if (envColor != NULL) {
gDPSetEnvColor(dl++,
envColor->red,
envColor->green,
envColor->blue,
envColor->alpha);
}
gSPEndDisplayList(dl++);
}
#else
GLOBAL_ASM("./asm/non_matchings/z_scene_proc/SceneProc_DrawFlashingTexture.asm")
#endif
void SceneProc_DrawType2Texture(GlobalContext* ctxt, u32 segment, FlashingTextureParams* params) {
RGBA8* envColor;
FlashingTexturePrimColor* primColor = (FlashingTexturePrimColor *)Lib_PtrSegToVirt(params->primColors);
u32 pad;
u32 index = gSceneProcStep % params->cycleLength;
primColor += index;
if (params->envColors) {
envColor = (RGBA8*)Lib_PtrSegToVirt(params->envColors) + index;
} else {
envColor = NULL;
}
SceneProc_DrawFlashingTexture(ctxt, segment, primColor, envColor);
}
s32 SceneProc_Lerp(s32 a, s32 b, f32 t) {
return (s32)((b - a) * t) + a;
}
#ifdef NON_MATCHING
// Slight ordering and regalloc differences around t = ...
void SceneProc_DrawType3Texture(GlobalContext* ctxt, u32 segment, FlashingTextureParams* params) {
FlashingTextureParams* params2 = params;
RGBA8* envColorTo;
FlashingTexturePrimColor* primColorTo = (FlashingTexturePrimColor *)Lib_PtrSegToVirt(params2->primColors);
u16* keyFrames = (u16*)Lib_PtrSegToVirt(params2->keyFrames);
s32 index = gSceneProcStep % params2->cycleLength;
s32 pad1;
s32 keyFrameIndex;
RGBA8* envColorPtrIn;
f32 t;
s32 pad2;
FlashingTexturePrimColor primColorIn;
RGBA8* envColorFrom;
RGBA8 envColorIn;
s32 pad3;
FlashingTexturePrimColor* primColorFrom;
keyFrameIndex = 1;
keyFrames += 1;
while (params2->numKeyFrames > keyFrameIndex) {
if (index < *keyFrames) break;
keyFrameIndex++;
keyFrames++;
}
primColorTo += keyFrameIndex;
pad1 = keyFrames[0] - keyFrames[-1];
pad2 = index - keyFrames[-1];
t = (f32)pad2 / (f32)pad1;
primColorFrom = primColorTo - 1;
primColorIn.red = SceneProc_Lerp(primColorFrom->red, primColorTo->red, t);
primColorIn.green = SceneProc_Lerp(primColorFrom->green, primColorTo->green, t);
primColorIn.blue = SceneProc_Lerp(primColorFrom->blue, primColorTo->blue, t);
primColorIn.alpha = SceneProc_Lerp(primColorFrom->alpha, primColorTo->alpha, t);
primColorIn.lodFrac = SceneProc_Lerp(primColorFrom->lodFrac, primColorTo->lodFrac, t);
if (params2->envColors) {
envColorTo = (RGBA8*)Lib_PtrSegToVirt(params2->envColors) + keyFrameIndex;
envColorFrom = envColorTo - 1;
envColorIn.red = SceneProc_Lerp(envColorFrom->red, envColorTo->red, t);
envColorIn.green = SceneProc_Lerp(envColorFrom->green, envColorTo->green, t);
envColorIn.blue = SceneProc_Lerp(envColorFrom->blue, envColorTo->blue, t);
envColorIn.alpha = SceneProc_Lerp(envColorFrom->alpha, envColorTo->alpha, t);
} else {
envColorTo = NULL;
}
if (envColorTo) {
envColorPtrIn = &envColorIn;
} else {
envColorPtrIn = NULL;
}
SceneProc_DrawFlashingTexture(ctxt, segment, &primColorIn, envColorPtrIn);
}
#else
GLOBAL_ASM("./asm/non_matchings/z_scene_proc/SceneProc_DrawType3Texture.asm")
#endif
GLOBAL_ASM("./asm/non_matchings/z_scene_proc/SceneProc_Interpolate.asm")
u8 SceneProc_InterpolateClamped(u32 numKeyFrames, f32* keyFrames, f32* values, f32 frame) {
s32 ret = SceneProc_Interpolate(numKeyFrames, keyFrames, values, frame);
return (ret < 0) ? 0 :
(ret > 0xFF)? 0xFF :
ret;
}
GLOBAL_ASM("./asm/non_matchings/z_scene_proc/SceneProc_DrawType4Texture.asm")
void SceneProc_DrawType5Texture(GlobalContext* ctxt, u32 segment, CyclingTextureParams* params) {
u8* offsets;
Gfx** dls;
Gfx* dl;
GraphicsContext* gCtxt;
s32 step;
dls = (Gfx**)Lib_PtrSegToVirt(params->textureDls);
offsets = (u8*)Lib_PtrSegToVirt(params->textureDlOffsets);
step = gSceneProcStep % params->cycleLength;
dl = (Gfx*)Lib_PtrSegToVirt(dls[offsets[step]]);
gCtxt = ctxt->common.gCtxt;
if (gSceneProcFlags & 1) {
gSPSegment(gCtxt->polyOpa.append++, segment, dl);
}
if (gSceneProcFlags & 2) {
gSPSegment(gCtxt->polyXlu.append++, segment, dl);
}
}
void SceneProc_DrawAnimatedTextures(GlobalContext* ctxt, AnimatedTexture* textures, f32 flashingAlpha, u32 step, u32 flags) {
s32 segmentAbs;
s32 segment;
gSceneProcFlashingAlpha = flashingAlpha;
gSceneProcStep = step;
gSceneProcFlags = flags;
if ((textures != NULL) && (textures->segment != 0)) {
do {
segment = textures->segment;
segmentAbs = ((segment < 0)? -segment : segment) + 7;
gSceneProcDrawFuncs[textures->type](ctxt, segmentAbs, (void*)Lib_PtrSegToVirt(textures->params));
textures++;
} while (segment > -1);
}
}
void SceneProc_DrawAllSceneAnimatedTextures(GlobalContext* ctxt, AnimatedTexture* textures) {
SceneProc_DrawAnimatedTextures(ctxt, textures, 1, ctxt->unk18840, 3);
}
void SceneProc_DrawOpaqueSceneAnimatedTextures(GlobalContext* ctxt, AnimatedTexture* textures) {
SceneProc_DrawAnimatedTextures(ctxt, textures, 1, ctxt->unk18840, 1);
}
void SceneProc_DrawTranslucentSceneAnimatedTextures(GlobalContext* ctxt, AnimatedTexture* textures) {
SceneProc_DrawAnimatedTextures(ctxt, textures, 1, ctxt->unk18840, 2);
}
void SceneProc_DrawAllSceneAnimatedTexturesWithAlpha(GlobalContext* ctxt, AnimatedTexture* textures, f32 alpha) {
SceneProc_DrawAnimatedTextures(ctxt, textures, alpha, ctxt->unk18840, 3);
}
void SceneProc_DrawOpaqueSceneAnimatedTexturesWithAlpha(GlobalContext* ctxt, AnimatedTexture* textures, f32 alpha) {
SceneProc_DrawAnimatedTextures(ctxt, textures, alpha, ctxt->unk18840, 1);
}
void SceneProc_DrawTranslucentSceneAnimatedTexturesWithAlpha(GlobalContext* ctxt, AnimatedTexture* textures, f32 alpha) {
SceneProc_DrawAnimatedTextures(ctxt, textures, alpha, ctxt->unk18840, 2);
}
void SceneProc_DrawAllAnimatedTextures(GlobalContext* ctxt, AnimatedTexture* textures, u32 step) {
SceneProc_DrawAnimatedTextures(ctxt, textures, 1, step, 3);
}
void SceneProc_DrawOpaqueAnimatedTextures(GlobalContext* ctxt, AnimatedTexture* textures, u32 step) {
SceneProc_DrawAnimatedTextures(ctxt, textures, 1, step, 1);
}
void SceneProc_DrawTranslucentAnimatedTextures(GlobalContext* ctxt, AnimatedTexture* textures, u32 step) {
SceneProc_DrawAnimatedTextures(ctxt, textures, 1, step, 2);
}
void SceneProc_DrawAllAnimatedTexturesWithAlpha(GlobalContext* ctxt, AnimatedTexture* textures, f32 alpha, u32 step) {
SceneProc_DrawAnimatedTextures(ctxt, textures, alpha, step, 3);
}
void SceneProc_DrawOpaqueAnimatedTexturesWithAlpha(GlobalContext* ctxt, AnimatedTexture* textures, f32 alpha, u32 step) {
SceneProc_DrawAnimatedTextures(ctxt, textures, alpha, step, 1);
}
void SceneProc_DrawTranslucentAnimatedTexturesWithAlpha(GlobalContext* ctxt, AnimatedTexture* textures, f32 alpha, u32 step) {
SceneProc_DrawAnimatedTextures(ctxt, textures, alpha, step, 2);
}
void SceneProc_DrawSceneConfig1(GlobalContext* ctxt) {
SceneProc_DrawAllSceneAnimatedTextures(ctxt, ctxt->sceneTextureAnimations);
}
#ifdef NON_MATCHING
// This function still needs a lot of work
void SceneProc_DrawSceneConfig3(GlobalContext* ctxt) {
GraphicsContext* gCtxt = ctxt->common.gCtxt;
u32 frames = ctxt->unk18840;
if (0);
gSPSegment(gCtxt->polyXlu.append++, 8,
Rcp_GenerateSetTileSizeDl(ctxt->common.gCtxt, 0, frames & 0x3f, 0x100, 0x10));
gSPSegment(gCtxt->polyXlu.append++, 9,
Rcp_GenerateSetTileSize2Dl(ctxt->common.gCtxt,
0, 0x7F - (frames & 0x7F), frames & 0x7F, 0x20, 0x20,
1, frames & 0x7F, frames & 0x7F, 0x20, 0x20));
gSPSegment(gCtxt->polyOpa.append++, 10,
Rcp_GenerateSetTileSize2Dl(ctxt->common.gCtxt,
0, 0, 0, 0x20, 0x20,
1, 0, 0x7F - (frames & 0x7F), 0x20, 0x20));
gSPSegment(gCtxt->polyOpa.append++, 11,
Rcp_GenerateSetTileSizeDl(ctxt->common.gCtxt, 0, frames & 0x7F, 0x20, 0x20));
gSPSegment(gCtxt->polyXlu.append++, 12,
Rcp_GenerateSetTileSize2Dl(ctxt->common.gCtxt,
0, 0, frames * 0x32 & 0x7Ff, 8, 0x200,
1, 0, frames * 0x3c & 0x7Ff, 8, 0x200));
gSPSegment(gCtxt->polyOpa.append++, 13,
Rcp_GenerateSetTileSize2Dl(ctxt->common.gCtxt,
0, 0, 0, 0x20, 0x40,
1, 0, frames & 0x7F, 0x20, 0x20));
gDPPipeSync(gCtxt->polyXlu.append++);
gDPSetEnvColor(gCtxt->polyXlu.append++, 0x80, 0x80, 0x80, 0x80);
gDPPipeSync(gCtxt->polyOpa.append++);
gDPSetEnvColor(gCtxt->polyOpa.append++, 0x80, 0x80, 0x80, 0x80);
}
#else
GLOBAL_ASM("./asm/non_matchings/z_scene_proc/SceneProc_DrawSceneConfig3.asm")
#endif
void SceneProc_DrawSceneConfig4(GlobalContext* ctxt) {
u32 frames;
GraphicsContext* gCtxt = ctxt->common.gCtxt;
u32 frames2;
frames = ctxt->unk18840;
frames2 = frames * 1;
gSPSegment(gCtxt->polyXlu.append++, 8,
Rcp_GenerateSetTileSize2Dl(ctxt->common.gCtxt,
0, 0x7F - (frames & 0x7F), frames2 & 0x7F, 0x20, 0x20,
1, (frames & 0x7F), frames2 & 0x7F, 0x20, 0x20));
gDPPipeSync(gCtxt->polyOpa.append++);
gDPSetEnvColor(gCtxt->polyOpa.append++, 0x80, 0x80, 0x80, 0x80);
gDPPipeSync(gCtxt->polyXlu.append++);
gDPSetEnvColor(gCtxt->polyXlu.append++, 0x80, 0x80, 0x80, 0x80);
}
void SceneProc_DrawSceneConfig2(GlobalContext* ctxt){}
void func_80131DF0(GlobalContext* ctxt, u32 param_2, u32 flags) {
Gfx* dl = D_801C3C50[param_2];
{
GraphicsContext* gCtxt = ctxt->common.gCtxt;
if (flags & 1) {
gSPSegment(gCtxt->polyOpa.append++, 12, dl);
}
if (flags & 2) {
gSPSegment(gCtxt->polyXlu.append++, 12, dl);
}
}
}
void func_80131E58(GlobalContext* ctxt, u32 param_2, u32 flags) {
Gfx* dl = D_801C3C80[param_2];
{
GraphicsContext* gCtxt = ctxt->common.gCtxt;
if (flags & 1) {
gSPSegment(gCtxt->polyOpa.append++, 12, dl);
}
if (flags & 2) {
gSPSegment(gCtxt->polyXlu.append++, 12, dl);
}
}
}
void SceneProc_DrawSceneConfig5(GlobalContext* ctxt) {
u32 dlIndex;
u32 alpha;
GraphicsContext* gCtxt;
if (ctxt->roomContext.unk7A[0] != 0) {
dlIndex = 1;
alpha = ctxt->roomContext.unk7A[1];
} else {
dlIndex = 0;
alpha = 0xff;
}
if (alpha == 0) {
ctxt->roomContext.unk78 = 0;
} else {
gCtxt = ctxt->common.gCtxt;
ctxt->roomContext.unk78 = 1;
SceneProc_DrawAllSceneAnimatedTextures(ctxt, ctxt->sceneTextureAnimations);
func_80131DF0(ctxt, dlIndex, 3);
gDPSetEnvColor(gCtxt->polyOpa.append++, 0xFF, 0xFF, 0xFF, alpha);
gDPSetEnvColor(gCtxt->polyXlu.append++, 0xFF, 0xFF, 0xFF, alpha);
}
}
void SceneProc_DrawSceneConfig7(GlobalContext* ctxt) {
SceneProc_DrawAllAnimatedTextures(ctxt, ctxt->sceneTextureAnimations, ctxt->roomContext.unk7A[0]);
}
void SceneProc_DrawSceneConfig6(GlobalContext* ctxt) {
s32 i;
Gfx* dlHead;
u32 pad1;
u32 pad2;
GraphicsContext* gCtxt;
u32 pad3;
u32 pad4;
u32 pad5;
u32 pad6;
Gfx* dl;
if (Actor_GetSwitchFlag(ctxt,0x33) &&
Actor_GetSwitchFlag(ctxt,0x34) &&
Actor_GetSwitchFlag(ctxt,0x35) &&
Actor_GetSwitchFlag(ctxt,0x36)) {
func_800C3C00(&ctxt->bgCheckContext, 1);
} else {
func_800C3C14(&ctxt->bgCheckContext, 1);
}
{
dl = (Gfx*)ctxt->common.gCtxt->polyOpa.appendEnd - 18;
//dl = _g;
ctxt->common.gCtxt->polyOpa.appendEnd = dl;
}
SceneProc_DrawAllSceneAnimatedTextures(ctxt, ctxt->sceneTextureAnimations);
gCtxt = ctxt->common.gCtxt;
dlHead = dl;
for (i = 0; i < 9; i++, dlHead += 2) {
u32 lodFrac = 0;
_bcopy(D_801C3C88, dlHead, sizeof(Gfx[2]));
switch(i) {
case 0:
if (Actor_GetSwitchFlag(ctxt,0x33) &&
Actor_GetSwitchFlag(ctxt,0x34) &&
Actor_GetSwitchFlag(ctxt,0x35) &&
Actor_GetSwitchFlag(ctxt,0x36)) {
lodFrac = 0xFF;
}
break;
case 1:
if (Actor_GetSwitchFlag(ctxt,0x37)) {
lodFrac = 0x44;
}
break;
case 2:
if (Actor_GetSwitchFlag(ctxt,0x37) &&
Actor_GetSwitchFlag(ctxt,0x38)) {
lodFrac = 0x44;
}
break;
case 3:
if (Actor_GetSwitchFlag(ctxt,0x37) &&
Actor_GetSwitchFlag(ctxt,0x38) &&
Actor_GetSwitchFlag(ctxt,0x39)) {
lodFrac = 0x44;
}
break;
case 4:
if (!Actor_GetSwitchFlag(ctxt,0x33)) {
lodFrac = 0x44;
}
break;
case 5:
if (Actor_GetSwitchFlag(ctxt,0x34)) {
lodFrac = 0x44;
}
break;
case 6:
if (Actor_GetSwitchFlag(ctxt,0x34) &&
Actor_GetSwitchFlag(ctxt,0x35)) {
lodFrac = 0x44;
}
break;
case 7:
if (Actor_GetSwitchFlag(ctxt,0x34) &&
Actor_GetSwitchFlag(ctxt,0x35) &&
Actor_GetSwitchFlag(ctxt,0x36)) {
lodFrac = 0x44;
}
break;
case 8:
if (Actor_GetSwitchFlag(ctxt,0x3A)) {
lodFrac = 0x44;
}
break;
}
gDPSetPrimColor(dlHead, 0, lodFrac, 0xFF, 0xFF, 0xFF, 0xFF);
}
gSPSegment(gCtxt->polyOpa.append++, 6, dl);
gSPSegment(gCtxt->polyXlu.append++, 6, dl);
}