Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

In-game input viewer #2138

Merged
merged 3 commits into from
Mar 19, 2024
Merged
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
2,109 changes: 1,071 additions & 1,038 deletions ASM/build/asm_symbols.txt

Large diffs are not rendered by default.

Binary file modified ASM/build/bundle.o
Binary file not shown.
1,075 changes: 552 additions & 523 deletions ASM/build/c_symbols.txt

Large diffs are not rendered by default.

24 changes: 0 additions & 24 deletions ASM/c/dungeon_info.c
Original file line number Diff line number Diff line change
Expand Up @@ -87,30 +87,6 @@ int d_right_dungeon_idx(int i) {
return dungeon_idx;
}

// Helper function for drawing numbers to the HUD.
void draw_int(z64_disp_buf_t* db, uint16_t number, int16_t left, int16_t top, colorRGBA8_t color) {
uint8_t digits[10];
uint8_t j = 0;
// Extract each digit. They are added, in reverse order, to digits[]
do {
digits[j] = number % 10;
number = number / 10;
j++;
}
while (number > 0);
// This combiner mode makes it look like the rupee count
gDPSetCombineLERP(db->p++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE,
TEXEL0, 0, PRIMITIVE, 0);

// Set the color
gDPSetPrimColor(db->p++, 0, 0, color.r, color.g, color.b, color.a);
// Draw each digit
for (uint8_t c = j; c > 0; c--) {
sprite_texture(db, &rupee_digit_sprite, digits[c-1], left, top, 8, 16);
left += 8;
}
}

// When in a silver rupee room, draw the silver rupee count for that room.
void draw_silver_rupee_count(z64_game_t* globalCtx, z64_disp_buf_t* db) {
if (!CFG_DUNGEON_INFO_SILVER_RUPEES) return;
Expand Down
75 changes: 53 additions & 22 deletions ASM/c/gfx.c
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ sprite_t buttons_sprite = {

int sprite_bytes_per_tile(sprite_t* sprite) {
if (sprite->im_siz == G_IM_SIZ_4b) {
// No idea why
// this format is nibble based, so 4bits = half a byte
return sprite->tile_w * sprite->tile_h * sprite->bytes_per_texel / 2;
}
return sprite->tile_w * sprite->tile_h * sprite->bytes_per_texel;
Expand All @@ -119,7 +119,20 @@ void sprite_load(z64_disp_buf_t* db, sprite_t* sprite,
int start_tile, int tile_count) {
int width = sprite->tile_w;
int height = sprite->tile_h * tile_count;
gDPLoadTextureTile(db->p++,
if (sprite->im_siz == G_IM_SIZ_4b) {
gDPLoadTextureTile_4b(db->p++,
sprite->buf + start_tile * sprite_bytes_per_tile(sprite),
sprite->im_fmt,
width, height,
0, 0,
width - 1, height - 1,
0,
G_TX_WRAP, G_TX_WRAP,
G_TX_NOMASK, G_TX_NOMASK,
G_TX_NOLOD, G_TX_NOLOD);
}
else {
gDPLoadTextureTile(db->p++,
sprite->buf + start_tile * sprite_bytes_per_tile(sprite),
sprite->im_fmt, sprite->im_siz,
width, height,
Expand All @@ -129,16 +142,17 @@ void sprite_load(z64_disp_buf_t* db, sprite_t* sprite,
G_TX_WRAP, G_TX_WRAP,
G_TX_NOMASK, G_TX_NOMASK,
G_TX_NOLOD, G_TX_NOLOD);
}
}

void sprite_texture(z64_disp_buf_t* db, sprite_t* sprite, int tile_index, int16_t left, int16_t top,
int16_t width, int16_t height) {
int width_factor = (1<<10) * sprite->tile_w / width;
int height_factor = (1<<10) * sprite->tile_h / height;
if (sprite->im_siz == G_IM_SIZ_4b) {
gDPLoadTextureBlock_4b(db->p++,
gDPLoadTextureBlock(db->p++,
((uint8_t*)(sprite->buf)) + (tile_index * sprite_bytes_per_tile(sprite)),
sprite->im_fmt,
sprite->im_siz,
sprite->tile_w,
sprite->tile_h,
0,
Expand All @@ -148,26 +162,43 @@ void sprite_texture(z64_disp_buf_t* db, sprite_t* sprite, int tile_index, int16_
G_TX_NOMASK,
G_TX_NOLOD,
G_TX_NOLOD
);
}
else {
gDPLoadTextureBlock(db->p++,
((uint8_t*)(sprite->buf)) + (tile_index * sprite_bytes_per_tile(sprite)),
sprite->im_fmt,
sprite->im_siz,
sprite->tile_w,
sprite->tile_h,
0,
G_TX_NOMIRROR | G_TX_WRAP,
G_TX_NOMIRROR | G_TX_WRAP,
G_TX_NOMASK,
G_TX_NOMASK,
G_TX_NOLOD,
G_TX_NOLOD
);
);

gSPTextureRectangle(db->p++, left * 4, top * 4, (left + width) * 4, (top * height) * 4, G_TX_RENDERTILE, 0,0,width_factor, height_factor);
}

void sprite_texture_4b(z64_disp_buf_t *db, sprite_t *sprite, int tile_index, int16_t left, int16_t top,
int16_t width, int16_t height) {

if (sprite->im_siz != G_IM_SIZ_4b) {
return;
}

gSPTextureRectangle(db->p++, left * 4, top * 4, (left + width) * 4, (top * height) * 4, G_TX_RENDERTILE, 0, 0, width_factor, height_factor);
int width_factor = (1<<10) * sprite->tile_w / width;
int height_factor = (1<<10) * sprite->tile_h / height;

gDPPipeSync(db->p++);
gDPSetCombineLERP(db->p++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE,
ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);

gDPSetEnvColor(db->p++, 0, 0, 0, 255);

gDPLoadTextureBlock_4b(db->p++,
((uint8_t*)(sprite->buf)) + tile_index * sprite_bytes_per_tile(sprite),
sprite->im_fmt,
sprite->tile_w,
sprite->tile_h,
0,
G_TX_NOMIRROR | G_TX_CLAMP,
G_TX_NOMIRROR | G_TX_CLAMP,
G_TX_NOMASK,
G_TX_NOMASK,
G_TX_NOLOD,
G_TX_NOLOD
);

gSPTextureRectangle(db->p++, left * 4, top * 4, (left + width) * 4,
(top * height) * 4, G_TX_RENDERTILE, 0, 0, width_factor, height_factor);
}

void sprite_draw(z64_disp_buf_t* db, sprite_t* sprite, int tile_index,
Expand Down
2 changes: 2 additions & 0 deletions ASM/c/gfx.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,5 +41,7 @@ void sprite_draw(z64_disp_buf_t* db, sprite_t* sprite, int tile_index,

void sprite_texture(z64_disp_buf_t* db, sprite_t* sprite, int tile_index,
int16_t left, int16_t top, int16_t width, int16_t height);
void sprite_texture_4b(z64_disp_buf_t* db, sprite_t* sprite, int tile_index,
int16_t left, int16_t top, int16_t width, int16_t height);

#endif
171 changes: 171 additions & 0 deletions ASM/c/inputviewer.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,171 @@
#include "inputviewer.h"

extern uint8_t CFG_INPUT_VIEWER;

const int8_t input_icon_width = 13;
const int8_t input_icon_height = 13;
const int8_t input_number_width = 6;
const int8_t input_number_height = 12;
const int16_t left_alignment = Z64_SCREEN_WIDTH / 12;
const int16_t top_alignment = 11 * Z64_SCREEN_HEIGHT / 12 + 2;

void draw_x_stick(z64_disp_buf_t* db) {
colorRGBA8_t color = {0xF4, 0xEC, 0x30, 0xFF};
draw_int_size(db, z64_game.common.input[0].raw.x, left_alignment, top_alignment, color, input_number_width, input_number_height);
}

void draw_y_stick(z64_disp_buf_t* db) {
colorRGBA8_t color = {0xF4, 0xEC, 0x30, 0xFF};
int8_t xy_stick_length = 3 * rupee_digit_sprite.tile_w + font_sprite.tile_w;
draw_int_size(db, z64_game.common.input[0].raw.y, left_alignment + xy_stick_length, top_alignment, color, input_number_width, input_number_height);
}

void draw_a(z64_disp_buf_t* db) {
if (z64_game.common.input[0].raw.pad.a) {
gDPSetPrimColor(db->p++, 0, 0, CFG_A_BUTTON_COLOR.r, CFG_A_BUTTON_COLOR.g, CFG_A_BUTTON_COLOR.b, 0xFF);
int8_t xy_stick_length = 3 * rupee_digit_sprite.tile_w + font_sprite.tile_w - 2;
sprite_texture_4b(db, &buttons_sprite, 0, left_alignment + 2 * xy_stick_length, top_alignment, input_icon_width, input_icon_height);
}
}

void draw_b(z64_disp_buf_t* db) {
if (z64_game.common.input[0].raw.pad.b) {
gDPSetPrimColor(db->p++, 0, 0, CFG_B_BUTTON_COLOR.r, CFG_B_BUTTON_COLOR.g, CFG_B_BUTTON_COLOR.b, 0xFF);
int8_t xy_stick_length = 3 * rupee_digit_sprite.tile_w + font_sprite.tile_w - 2;
sprite_texture_4b(db, &buttons_sprite, 1, left_alignment + 2 * xy_stick_length + input_icon_width,
top_alignment, input_icon_width, input_icon_height);
}
}

void draw_start(z64_disp_buf_t* db) {
if (z64_game.common.input[0].raw.pad.s) {
gDPSetPrimColor(db->p++, 0, 0, 0xDC, 0xDC, 0xDC, 0xFF); // grey
int8_t xy_stick_length = 3 * rupee_digit_sprite.tile_w + font_sprite.tile_w - 2;
text_print_size("S", left_alignment + 2 * xy_stick_length + buttons_sprite.tile_w, top_alignment, input_icon_width);
text_flush_size(db, input_icon_width, input_icon_height, 0, 0);
}
}

void draw_cdown(z64_disp_buf_t* db) {
if (z64_game.common.input[0].raw.pad.cd) {
gDPSetPrimColor(db->p++, 0, 0, CFG_C_BUTTON_COLOR.r, CFG_C_BUTTON_COLOR.g, CFG_C_BUTTON_COLOR.b, 0xFF);
int8_t xy_stick_length = 3 * rupee_digit_sprite.tile_w + font_sprite.tile_w - 2;
sprite_texture(db, &buttons_sprite, 7, left_alignment + 2 * xy_stick_length + 2 * input_icon_width,
top_alignment, input_icon_width, input_icon_height);
}
}

void draw_cup(z64_disp_buf_t* db) {
if (z64_game.common.input[0].raw.pad.cu) {
gDPSetPrimColor(db->p++, 0, 0, CFG_C_BUTTON_COLOR.r, CFG_C_BUTTON_COLOR.g, CFG_C_BUTTON_COLOR.b, 0xFF);
int8_t xy_stick_length = 3 * rupee_digit_sprite.tile_w + font_sprite.tile_w - 2;
sprite_texture_4b(db, &buttons_sprite, 6, left_alignment + 2 * xy_stick_length + 5 * input_icon_width,
top_alignment, input_icon_width, input_icon_height);
}
}


void draw_cleft(z64_disp_buf_t* db) {
if (z64_game.common.input[0].raw.pad.cl) {
gDPSetPrimColor(db->p++, 0, 0, CFG_C_BUTTON_COLOR.r, CFG_C_BUTTON_COLOR.g, CFG_C_BUTTON_COLOR.b, 0xFF);
int8_t xy_stick_length = 3 * rupee_digit_sprite.tile_w + font_sprite.tile_w - 2;
sprite_texture_4b(db, &buttons_sprite, 8, left_alignment + 2 * xy_stick_length + 4 * input_icon_width,
top_alignment, input_icon_width, input_icon_height);
}
}

void draw_cright(z64_disp_buf_t* db) {
if (z64_game.common.input[0].raw.pad.cr) {
gDPSetPrimColor(db->p++, 0, 0, CFG_C_BUTTON_COLOR.r, CFG_C_BUTTON_COLOR.g, CFG_C_BUTTON_COLOR.b, 0xFF);
int8_t xy_stick_length = 3 * rupee_digit_sprite.tile_w + font_sprite.tile_w - 2;
sprite_texture_4b(db, &buttons_sprite, 9, left_alignment + 2 * xy_stick_length + 3 * input_icon_width,
top_alignment, input_icon_width, input_icon_height);
}
}

void draw_z(z64_disp_buf_t* db) {
if (z64_game.common.input[0].raw.pad.z) {
gDPSetPrimColor(db->p++, 0, 0, 0xDC, 0xDC, 0xDC, 0xFF); // grey
int8_t xy_stick_length = 3 * rupee_digit_sprite.tile_w + font_sprite.tile_w - 2;
sprite_texture_4b(db, &buttons_sprite, 5, left_alignment + 2 * xy_stick_length + 6 * input_icon_width,
top_alignment, input_icon_width, input_icon_height);
}
}

void draw_l(z64_disp_buf_t* db) {
if (z64_game.common.input[0].raw.pad.l) {
gDPSetPrimColor(db->p++, 0, 0, 0xDC, 0xDC, 0xDC, 0xFF); // grey
int8_t xy_stick_length = 3 * rupee_digit_sprite.tile_w + font_sprite.tile_w - 2;
sprite_texture_4b(db, &buttons_sprite, 3, left_alignment + 2 * xy_stick_length + 7 * input_icon_width,
top_alignment, input_icon_width, input_icon_height);
}
}

void draw_r(z64_disp_buf_t* db) {
if (z64_game.common.input[0].raw.pad.r) {
gDPSetPrimColor(db->p++, 0, 0, 0xDC, 0xDC, 0xDC, 0xFF); // grey
int8_t xy_stick_length = 3 * rupee_digit_sprite.tile_w + font_sprite.tile_w - 2;
sprite_texture_4b(db, &buttons_sprite, 4, left_alignment + 2 * xy_stick_length + 8 * input_icon_width,
top_alignment, input_icon_width, input_icon_height);
}
}

void draw_ddown(z64_disp_buf_t* db) {
if (z64_game.common.input[0].raw.pad.dd) {
gDPSetPrimColor(db->p++, 0, 0, 0xDC, 0xDC, 0xDC, 0xFF); // grey
int8_t xy_stick_length = 3 * rupee_digit_sprite.tile_w + font_sprite.tile_w - 2;
sprite_texture(db, &buttons_sprite, 7, left_alignment + 2 * xy_stick_length + 9 * input_icon_width,
top_alignment, input_icon_width, input_icon_height);
}
}

void draw_dup(z64_disp_buf_t* db) {
if (z64_game.common.input[0].raw.pad.du) {
gDPSetPrimColor(db->p++, 0, 0, 0xDC, 0xDC, 0xDC, 0xFF); // grey
int8_t xy_stick_length = 3 * rupee_digit_sprite.tile_w + font_sprite.tile_w - 2;
sprite_texture_4b(db, &buttons_sprite, 6, left_alignment + 2 * xy_stick_length + 12 * input_icon_width,
top_alignment, input_icon_width, input_icon_height);
}
}


void draw_dleft(z64_disp_buf_t* db) {
if (z64_game.common.input[0].raw.pad.dl) {
gDPSetPrimColor(db->p++, 0, 0, 0xDC, 0xDC, 0xDC, 0xFF); // grey
int8_t xy_stick_length = 3 * rupee_digit_sprite.tile_w + font_sprite.tile_w - 2;
sprite_texture_4b(db, &buttons_sprite, 8, left_alignment + 2 * xy_stick_length + 11 * input_icon_width,
top_alignment, input_icon_width, input_icon_height);
}
}

void draw_dright(z64_disp_buf_t* db) {
if (z64_game.common.input[0].raw.pad.dr) {
gDPSetPrimColor(db->p++, 0, 0, 0xDC, 0xDC, 0xDC, 0xFF); // grey
int8_t xy_stick_length = 3 * rupee_digit_sprite.tile_w + font_sprite.tile_w - 2;
sprite_texture_4b(db, &buttons_sprite, 9, left_alignment + 2 * xy_stick_length + 10 * input_icon_width,
top_alignment, input_icon_width, input_icon_height);
}
}

void draw_input_viewer(z64_disp_buf_t* db) {
if (CFG_INPUT_VIEWER) {
draw_a(db);
draw_b(db);
draw_cup(db);
draw_cdown(db);
draw_cleft(db);
draw_cright(db);

draw_z(db);
draw_l(db);
draw_r(db);

draw_dup(db);
draw_ddown(db);
draw_dleft(db);
draw_dright(db);

draw_x_stick(db);
draw_y_stick(db);
}
}
14 changes: 14 additions & 0 deletions ASM/c/inputviewer.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
#ifndef INPUTVIEWER_H
#define INPUTVIEWER_H

#include "z64.h"
#include "gfx.h"
#include "text.h"

extern colorRGB16_t CFG_A_BUTTON_COLOR;
extern colorRGB16_t CFG_B_BUTTON_COLOR;
extern colorRGB16_t CFG_C_BUTTON_COLOR;

void draw_input_viewer(z64_disp_buf_t* db);

#endif
3 changes: 3 additions & 0 deletions ASM/c/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@
#include "music.h"
#include "uninvertYaxis.h"
#include "debug.h"
#include "inputviewer.h"


void Gameplay_InitSkybox(z64_game_t* globalCtx, int16_t skyboxId);

Expand Down Expand Up @@ -53,6 +55,7 @@ void after_game_state_update() {
draw_triforce_count(&(z64_ctxt.gfx->overlay));
draw_silver_rupee_count(&z64_game, &(z64_ctxt.gfx->overlay));
draw_illegal_model_text(&(z64_ctxt.gfx->overlay));
draw_input_viewer(&(z64_ctxt.gfx->overlay));
debug_utilities(&(z64_ctxt.gfx->overlay));
}
give_ganon_boss_key();
Expand Down
38 changes: 38 additions & 0 deletions ASM/c/text.c
Original file line number Diff line number Diff line change
Expand Up @@ -68,3 +68,41 @@ void text_flush_size(z64_disp_buf_t* db, int width, int height, int hoffset, int
void text_flush(z64_disp_buf_t* db) {
text_flush_size(db, font_sprite.tile_w, font_sprite.tile_h, 0, 0);
}

int draw_int(z64_disp_buf_t* db, int32_t number, int16_t left, int16_t top, colorRGBA8_t color) {
draw_int_size(db, number, left, top, color, 8, 16);
}

// Helper function for drawing numbers to the HUD.
int draw_int_size(z64_disp_buf_t* db, int32_t number, int16_t left, int16_t top, colorRGBA8_t color, int16_t width, int16_t height) {
int isNegative = 0;
if (number < 0) {
number *= -1;
isNegative = 1;
}

uint8_t digits[10];
uint8_t j = 0;
// Extract each digit. They are added, in reverse order, to digits[]
do {
digits[j] = number % 10;
number = number / 10;
j++;
} while (number > 0);
// This combiner mode makes it look like the rupee count
gDPSetCombineLERP(db->p++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE,
TEXEL0, 0, PRIMITIVE, 0);

// Set the color
gDPSetPrimColor(db->p++, 0, 0, color.r, color.g, color.b, color.a);
if (isNegative) {
text_print_size("-", left - rupee_digit_sprite.tile_w, top, width);
text_flush_size(db, width, height, 0, 0);
}
// Draw each digit
for (uint8_t c = j; c > 0; c--) {
sprite_texture(db, &rupee_digit_sprite, digits[c-1], left, top, width, height);
left += width;
}
return j;
}
Loading
Loading