Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions include/regs.h
Original file line number Diff line number Diff line change
Expand Up @@ -68,9 +68,9 @@ struct PlayState;
#define R_VI_MODE_EDIT_ULX_ADJ SREG(53)
#define R_VI_MODE_EDIT_LRX_ADJ SREG(54)
#define R_FB_FILTER_TYPE SREG(80)
#define R_FB_FILTER_PRIM_COLOR(c) SREG(81 + (c))
#define R_FB_FILTER_COLOR1(c) SREG(81 + (c))
#define R_FB_FILTER_A SREG(84)
#define R_FB_FILTER_ENV_COLOR(c) SREG(85 + (c))
#define R_FB_FILTER_COLOR2(c) SREG(85 + (c))
#define R_ENABLE_FB_FILTER SREG(88)
#define R_PAUSE_BG_PRERENDER_STATE SREG(94) // `PauseBgPreRenderState`
#define R_CAM_XZ_OFFSET_UPDATE_RATE OREG(2)
Expand Down
90 changes: 30 additions & 60 deletions include/vis.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,81 +4,51 @@
#include "ultra64.h"
#include "color.h"

typedef enum FramebufferFilterType {
/* 0 */ FB_FILTER_NONE,
/* 1 */ FB_FILTER_CVG_RGB,
/* 2 */ FB_FILTER_CVG_RGB_UNIFORM,
/* 3 */ FB_FILTER_CVG_ONLY,
/* 4 */ FB_FILTER_CVG_RGB_FOG, // Not recommended, easily overflows blender
/* 5 */ FB_FILTER_ZBUF_IA,
/* 6 */ FB_FILTER_ZBUF_RGBA,
/* 7 */ FB_FILTER_MONO
} FramebufferFilterType;

typedef enum VisScissorType {
/* 0 */ VIS_NO_SETSCISSOR,
/* 1 */ VIS_SETSCISSOR
} VisScissorType;

typedef struct Vis {
/**
* Meaning of color1 and color2:
* - VisCvg: see VisCvgType for color1. color2 unused
* - VisMono: LERP endpoints. See z_vismono.c file comment
* - VisZBuffer: LERP endpoints. See z_viszbuffer.c file comment
*/
typedef struct VisParams {
/* 0x00 */ u32 type;
/* 0x04 */ u32 scissorType;
/* 0x08 */ Color_RGBA8_u32 primColor;
/* 0x0C */ Color_RGBA8_u32 envColor;
} Vis; // size = 0x10


/* Cvg: Coverage */

#define FB_FILTER_TO_CVG_TYPE(filter) (filter)
/* 0x04 */ u32 setScissor;
/* 0x08 */ Color_RGBA8_u32 color1;
/* 0x0C */ Color_RGBA8_u32 color2;
Comment thread
Dragorn421 marked this conversation as resolved.
} VisParams; // size = 0x10

typedef enum VisCvgType {
/* 0 */ VIS_CVG_TYPE_NONE = FB_FILTER_TO_CVG_TYPE(FB_FILTER_NONE),
/* 1 */ VIS_CVG_TYPE_CVG_RGB = FB_FILTER_TO_CVG_TYPE(FB_FILTER_CVG_RGB),
/* 2 */ VIS_CVG_TYPE_CVG_RGB_UNIFORM = FB_FILTER_TO_CVG_TYPE(FB_FILTER_CVG_RGB_UNIFORM),
/* 3 */ VIS_CVG_TYPE_CVG_ONLY = FB_FILTER_TO_CVG_TYPE(FB_FILTER_CVG_ONLY),
/* 4 */ VIS_CVG_TYPE_CVG_RGB_FOG = FB_FILTER_TO_CVG_TYPE(FB_FILTER_CVG_RGB_FOG)
VISCVG_TYPE_NOP,
VISCVG_TYPE_MODULATE_FB, // Multiply coverage with framebuffer
VISCVG_TYPE_FADE_AND_MODULATE_FB, // Also fade to color1 by color1.a
VISCVG_TYPE_MODULATE_COLOR, // Multiply coverage with color1
VISCVG_TYPE_MODULATE_FB_ADDITIVE_COLOR // Add color1
} VisCvgType;

typedef struct VisCvg {
/* 0x00 */ Vis vis;
/* 0x00 */ VisParams params; // params.color2 unused
} VisCvg; // size = 0x10

void VisCvg_Init(VisCvg* this);
void VisCvg_Destroy(VisCvg* this);
void VisCvg_Draw(VisCvg* this, Gfx** gfxP);


/* Mono: Desaturation */

// Only one type

typedef struct VisMono {
/* 0x00 */ Vis vis;
/* 0x00 */ VisParams params; // params.type unused
/* 0x10 */ u16* tlut;
/* 0x14 */ Gfx* dList;
} VisMono; // size = 0x18

void VisMono_Init(VisMono* this);
void VisMono_Destroy(VisMono* this);
void VisMono_Draw(VisMono* this, Gfx** gfxP);


/* ZBuf: Z-Buffer */
typedef struct VisZBuffer {
/* 0x00 */ VisParams params;
} VisZBuffer; // size = 0x10

#define FB_FILTER_TO_ZBUF_TYPE(filter) ((filter) - FB_FILTER_ZBUF_IA)

typedef enum VisZBufType {
/* 0 */ VIS_ZBUF_TYPE_IA = FB_FILTER_TO_ZBUF_TYPE(FB_FILTER_ZBUF_IA),
/* 1 */ VIS_ZBUF_TYPE_RGBA = FB_FILTER_TO_ZBUF_TYPE(FB_FILTER_ZBUF_RGBA)
} VisZBufType;
void VisCvg_Init(VisCvg* this);
void VisCvg_Destroy(VisCvg* this);
void VisCvg_Draw(VisCvg* this, Gfx** gfxp);

typedef struct VisZBuf {
/* 0x00 */ Vis vis;
} VisZBuf; // size = 0x10
void VisMono_Init(VisMono* this);
void VisMono_Destroy(VisMono* this);
void VisMono_Draw(VisMono* this, Gfx** gfxp);

void VisZBuf_Init(VisZBuf* this);
void VisZBuf_Destroy(VisZBuf* this);
void VisZBuf_Draw(VisZBuf* this, Gfx** gfxP);
void VisZBuffer_Init(VisZBuffer* this);
void VisZBuffer_Destroy(VisZBuffer* this);
void VisZBuffer_Draw(VisZBuffer* this, Gfx** gfxp);

#endif
2 changes: 1 addition & 1 deletion spec/spec
Original file line number Diff line number Diff line change
Expand Up @@ -594,7 +594,7 @@ beginseg
include "$(BUILD_DIR)/src/code/z_vimode.o"
include "$(BUILD_DIR)/src/code/z_viscvg.o"
include "$(BUILD_DIR)/src/code/z_vismono.o"
include "$(BUILD_DIR)/src/code/z_viszbuf.o"
include "$(BUILD_DIR)/src/code/z_viszbuffer.o"
include "$(BUILD_DIR)/src/code/z_vr_box.o"
include "$(BUILD_DIR)/src/code/z_vr_box_draw.o"
include "$(BUILD_DIR)/src/code/z_player_call.o"
Expand Down
87 changes: 42 additions & 45 deletions src/code/game.c
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,9 @@
#pragma increment_block_number "gc-eu:0 gc-eu-mq:0 gc-jp:0 gc-jp-ce:0 gc-jp-mq:0 gc-us:0 gc-us-mq:0"

SpeedMeter D_801664D0;
VisCvg sVisCvg;
VisZBuf sVisZBuf;
VisMono sVisMono;
VisCvg sGameStateVisCvg;
VisZBuffer sGameStateVisZBuffer;
VisMono sGameStateVisMono;
ViMode sViMode;

#if DEBUG_FEATURES
Expand All @@ -58,43 +58,40 @@ void GameState_FaultPrint(void) {
}
#endif

void GameState_SetFBFilter(Gfx** gfxP) {
Gfx* gfx = *gfxP;

if ((R_FB_FILTER_TYPE >= FB_FILTER_CVG_RGB) && (R_FB_FILTER_TYPE <= FB_FILTER_CVG_RGB_FOG)) {
// Visualize coverage
sVisCvg.vis.type = FB_FILTER_TO_CVG_TYPE(R_FB_FILTER_TYPE);
sVisCvg.vis.primColor.r = R_FB_FILTER_PRIM_COLOR(0);
sVisCvg.vis.primColor.g = R_FB_FILTER_PRIM_COLOR(1);
sVisCvg.vis.primColor.b = R_FB_FILTER_PRIM_COLOR(2);
sVisCvg.vis.primColor.a = R_FB_FILTER_A;
VisCvg_Draw(&sVisCvg, &gfx);
} else if ((R_FB_FILTER_TYPE == FB_FILTER_ZBUF_IA) || (R_FB_FILTER_TYPE == FB_FILTER_ZBUF_RGBA)) {
// Visualize z-buffer
sVisZBuf.vis.type = (R_FB_FILTER_TYPE == FB_FILTER_ZBUF_RGBA);
sVisZBuf.vis.primColor.r = R_FB_FILTER_PRIM_COLOR(0);
sVisZBuf.vis.primColor.g = R_FB_FILTER_PRIM_COLOR(1);
sVisZBuf.vis.primColor.b = R_FB_FILTER_PRIM_COLOR(2);
sVisZBuf.vis.primColor.a = R_FB_FILTER_A;
sVisZBuf.vis.envColor.r = R_FB_FILTER_ENV_COLOR(0);
sVisZBuf.vis.envColor.g = R_FB_FILTER_ENV_COLOR(1);
sVisZBuf.vis.envColor.b = R_FB_FILTER_ENV_COLOR(2);
sVisZBuf.vis.envColor.a = R_FB_FILTER_A;
VisZBuf_Draw(&sVisZBuf, &gfx);
} else if (R_FB_FILTER_TYPE == FB_FILTER_MONO) {
// Monochrome filter
sVisMono.vis.type = 0;
sVisMono.vis.primColor.r = R_FB_FILTER_PRIM_COLOR(0);
sVisMono.vis.primColor.g = R_FB_FILTER_PRIM_COLOR(1);
sVisMono.vis.primColor.b = R_FB_FILTER_PRIM_COLOR(2);
sVisMono.vis.primColor.a = R_FB_FILTER_A;
sVisMono.vis.envColor.r = R_FB_FILTER_ENV_COLOR(0);
sVisMono.vis.envColor.g = R_FB_FILTER_ENV_COLOR(1);
sVisMono.vis.envColor.b = R_FB_FILTER_ENV_COLOR(2);
sVisMono.vis.envColor.a = R_FB_FILTER_A;
VisMono_Draw(&sVisMono, &gfx);
void GameState_SetFBFilter(Gfx** gfx) {
Gfx* gfxP = *gfx;

if ((R_FB_FILTER_TYPE > 0) && (R_FB_FILTER_TYPE < 5)) {
sGameStateVisCvg.params.type = R_FB_FILTER_TYPE;
sGameStateVisCvg.params.color1.r = R_FB_FILTER_COLOR1(0);
sGameStateVisCvg.params.color1.g = R_FB_FILTER_COLOR1(1);
sGameStateVisCvg.params.color1.b = R_FB_FILTER_COLOR1(2);
sGameStateVisCvg.params.color1.a = R_FB_FILTER_A;
VisCvg_Draw(&sGameStateVisCvg, &gfxP);
} else if ((R_FB_FILTER_TYPE == 5) || (R_FB_FILTER_TYPE == 6)) {
sGameStateVisZBuffer.params.type = (R_FB_FILTER_TYPE == 6);
sGameStateVisZBuffer.params.color1.r = R_FB_FILTER_COLOR1(0);
sGameStateVisZBuffer.params.color1.g = R_FB_FILTER_COLOR1(1);
sGameStateVisZBuffer.params.color1.b = R_FB_FILTER_COLOR1(2);
sGameStateVisZBuffer.params.color1.a = R_FB_FILTER_A;
sGameStateVisZBuffer.params.color2.r = R_FB_FILTER_COLOR2(0);
sGameStateVisZBuffer.params.color2.g = R_FB_FILTER_COLOR2(1);
sGameStateVisZBuffer.params.color2.b = R_FB_FILTER_COLOR2(2);
sGameStateVisZBuffer.params.color2.a = R_FB_FILTER_A;
VisZBuffer_Draw(&sGameStateVisZBuffer, &gfxP);
} else if (R_FB_FILTER_TYPE == 7) {
sGameStateVisMono.params.type = 0;
sGameStateVisMono.params.color1.r = R_FB_FILTER_COLOR1(0);
sGameStateVisMono.params.color1.g = R_FB_FILTER_COLOR1(1);
sGameStateVisMono.params.color1.b = R_FB_FILTER_COLOR1(2);
sGameStateVisMono.params.color1.a = R_FB_FILTER_A;
sGameStateVisMono.params.color2.r = R_FB_FILTER_COLOR2(0);
sGameStateVisMono.params.color2.g = R_FB_FILTER_COLOR2(1);
sGameStateVisMono.params.color2.b = R_FB_FILTER_COLOR2(2);
sGameStateVisMono.params.color2.a = R_FB_FILTER_A;
VisMono_Draw(&sGameStateVisMono, &gfxP);
}
*gfxP = gfx;
*gfx = gfxP;
}

void func_800C4344(GameState* gameState) {
Expand Down Expand Up @@ -498,9 +495,9 @@ void GameState_Init(GameState* gameState, GameStateFunc init, GraphicsContext* g

startTime = endTime;
LOG_UTILS_CHECK_NULL_POINTER("this->cleanup", gameState->destroy, "../game.c", 1088);
VisCvg_Init(&sVisCvg);
VisZBuf_Init(&sVisZBuf);
VisMono_Init(&sVisMono);
VisCvg_Init(&sGameStateVisCvg);
VisZBuffer_Init(&sGameStateVisZBuffer);
VisMono_Init(&sGameStateVisMono);
if ((R_VI_MODE_EDIT_STATE == VI_MODE_EDIT_STATE_INACTIVE) || !DEBUG_FEATURES) {
ViMode_Init(&sViMode);
}
Expand Down Expand Up @@ -529,9 +526,9 @@ void GameState_Destroy(GameState* gameState) {
}
Rumble_Destroy();
SpeedMeter_Destroy(&D_801664D0);
VisCvg_Destroy(&sVisCvg);
VisZBuf_Destroy(&sVisZBuf);
VisMono_Destroy(&sVisMono);
VisCvg_Destroy(&sGameStateVisCvg);
VisZBuffer_Destroy(&sGameStateVisZBuffer);
VisMono_Destroy(&sGameStateVisMono);
if ((R_VI_MODE_EDIT_STATE == VI_MODE_EDIT_STATE_INACTIVE) || !DEBUG_FEATURES) {
ViMode_Destroy(&sViMode);
}
Expand Down
14 changes: 7 additions & 7 deletions src/code/z_play.c
Original file line number Diff line number Diff line change
Expand Up @@ -47,12 +47,12 @@
#include "save.h"
#include "vis.h"

#pragma increment_block_number "gc-eu:224 gc-eu-mq:224 gc-jp:224 gc-jp-ce:224 gc-jp-mq:224 gc-us:224 gc-us-mq:224" \
"ique-cn:224 ntsc-1.0:240 ntsc-1.1:240 ntsc-1.2:240 pal-1.0:240 pal-1.1:240"
#pragma increment_block_number "gc-eu:221 gc-eu-mq:221 gc-jp:221 gc-jp-ce:221 gc-jp-mq:221 gc-us:221 gc-us-mq:221" \
"ique-cn:221 ntsc-1.0:221 ntsc-1.1:221 ntsc-1.2:221 pal-1.0:221 pal-1.1:221"

TransitionTile gTransitionTile;
s32 gTransitionTileState;
VisMono gPlayVisMono;
VisMono sPlayVisMono;
Color_RGBA8_u32 gVisMonoColor;

#if DEBUG_FEATURES
Expand Down Expand Up @@ -261,7 +261,7 @@ void Play_Destroy(GameState* thisx) {

Letterbox_Destroy();
TransitionFade_Destroy(&this->transitionFadeFlash);
VisMono_Destroy(&gPlayVisMono);
VisMono_Destroy(&sPlayVisMono);

if (gSaveContext.save.linkAge != this->linkAgeOnLoad) {
Inventory_SwapAgeEquipment();
Expand Down Expand Up @@ -482,7 +482,7 @@ void Play_Init(GameState* thisx) {
TransitionFade_SetType(&this->transitionFadeFlash, TRANS_INSTANCE_TYPE_FADE_FLASH);
TransitionFade_SetColor(&this->transitionFadeFlash, RGBA8(160, 160, 160, 255));
TransitionFade_Start(&this->transitionFadeFlash);
VisMono_Init(&gPlayVisMono);
VisMono_Init(&sPlayVisMono);
gVisMonoColor.a = 0;
CutsceneFlags_UnsetAll(this);

Expand Down Expand Up @@ -1217,8 +1217,8 @@ void Play_Draw(PlayState* this) {
if (gVisMonoColor.a > 0)
#endif
{
gPlayVisMono.vis.primColor.rgba = gVisMonoColor.rgba;
VisMono_Draw(&gPlayVisMono, &gfxP);
sPlayVisMono.params.color1.rgba = gVisMonoColor.rgba;
VisMono_Draw(&sPlayVisMono, &gfxP);
}

gSPEndDisplayList(gfxP++);
Expand Down
Loading