new djui hud tools: viewport, scissor and render line (#916)

added these new djui hud tools for Lua:
- djui_hud_set_viewport
- djui_hud_reset_viewport
- djui_hud_set_scissor
- djui_hud_reset_scissor
- djui_hud_render_line - this code could already be done exactly. this is just to make rendering lines more efficient. 

Also made nametags use a viewport for scaling in the credits.
This commit is contained in:
Isaac0-dev 2025-08-27 08:15:41 +10:00 committed by GitHub
parent 95588761fd
commit ac1cf57cf0
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
10 changed files with 383 additions and 25 deletions

View file

@ -3950,6 +3950,34 @@ function djui_hud_get_mouse_scroll_y()
-- ...
end
--- @param x number
--- @param y number
--- @param width number
--- @param height number
--- Sets the viewport to the specified position and size, this will resize
function djui_hud_set_viewport(x, y, width, height)
-- ...
end
--- put the description here
function djui_hud_reset_viewport()
-- ...
end
--- @param x number
--- @param y number
--- @param width number
--- @param height number
--- put the description here
function djui_hud_set_scissor(x, y, width, height)
-- ...
end
--- put the description here
function djui_hud_reset_scissor()
-- ...
end
--- @param message string
--- @return number
--- Measures the length of `message` in the current font
@ -4056,6 +4084,16 @@ function djui_hud_render_rect_interpolated(prevX, prevY, prevWidth, prevHeight,
-- ...
end
--- @param p1X number
--- @param p1Y number
--- @param p2X number
--- @param p2Y number
--- @param size number
--- Renders an DJUI HUD line onto the screen
function djui_hud_render_line(p1X, p1Y, p2X, p2Y, size)
-- ...
end
--- @return number
--- Gets the current camera FOV
function get_current_fov()

View file

@ -3268,6 +3268,100 @@ Returns the amount scrolled vertically (-down/up+)
<br />
## [djui_hud_set_viewport](#djui_hud_set_viewport)
### Description
Sets the viewport to the specified position and size, this will resize
### Lua Example
`djui_hud_set_viewport(x, y, width, height)`
### Parameters
| Field | Type |
| ----- | ---- |
| x | `number` |
| y | `number` |
| width | `number` |
| height | `number` |
### Returns
- None
### C Prototype
`void djui_hud_set_viewport(f32 x, f32 y, f32 width, f32 height);`
[:arrow_up_small:](#)
<br />
## [djui_hud_reset_viewport](#djui_hud_reset_viewport)
### Description
put the description here
### Lua Example
`djui_hud_reset_viewport()`
### Parameters
- None
### Returns
- None
### C Prototype
`void djui_hud_reset_viewport(void);`
[:arrow_up_small:](#)
<br />
## [djui_hud_set_scissor](#djui_hud_set_scissor)
### Description
put the description here
### Lua Example
`djui_hud_set_scissor(x, y, width, height)`
### Parameters
| Field | Type |
| ----- | ---- |
| x | `number` |
| y | `number` |
| width | `number` |
| height | `number` |
### Returns
- None
### C Prototype
`void djui_hud_set_scissor(f32 x, f32 y, f32 width, f32 height);`
[:arrow_up_small:](#)
<br />
## [djui_hud_reset_scissor](#djui_hud_reset_scissor)
### Description
put the description here
### Lua Example
`djui_hud_reset_scissor()`
### Parameters
- None
### Returns
- None
### C Prototype
`void djui_hud_reset_scissor(void);`
[:arrow_up_small:](#)
<br />
## [djui_hud_measure_text](#djui_hud_measure_text)
### Description
@ -3526,6 +3620,33 @@ Renders an interpolated DJUI HUD rect onto the screen
<br />
## [djui_hud_render_line](#djui_hud_render_line)
### Description
Renders an DJUI HUD line onto the screen
### Lua Example
`djui_hud_render_line(p1X, p1Y, p2X, p2Y, size)`
### Parameters
| Field | Type |
| ----- | ---- |
| p1X | `number` |
| p1Y | `number` |
| p2X | `number` |
| p2Y | `number` |
| size | `number` |
### Returns
- None
### C Prototype
`void djui_hud_render_line(f32 p1X, f32 p1Y, f32 p2X, f32 p2Y, f32 size);`
[:arrow_up_small:](#)
<br />
## [get_current_fov](#get_current_fov)
### Description

View file

@ -776,6 +776,10 @@
- [djui_hud_get_mouse_buttons_released](functions-3.md#djui_hud_get_mouse_buttons_released)
- [djui_hud_get_mouse_scroll_x](functions-3.md#djui_hud_get_mouse_scroll_x)
- [djui_hud_get_mouse_scroll_y](functions-3.md#djui_hud_get_mouse_scroll_y)
- [djui_hud_set_viewport](functions-3.md#djui_hud_set_viewport)
- [djui_hud_reset_viewport](functions-3.md#djui_hud_reset_viewport)
- [djui_hud_set_scissor](functions-3.md#djui_hud_set_scissor)
- [djui_hud_reset_scissor](functions-3.md#djui_hud_reset_scissor)
- [djui_hud_measure_text](functions-3.md#djui_hud_measure_text)
- [djui_hud_print_text](functions-3.md#djui_hud_print_text)
- [djui_hud_print_text_interpolated](functions-3.md#djui_hud_print_text_interpolated)
@ -785,6 +789,7 @@
- [djui_hud_render_texture_tile_interpolated](functions-3.md#djui_hud_render_texture_tile_interpolated)
- [djui_hud_render_rect](functions-3.md#djui_hud_render_rect)
- [djui_hud_render_rect_interpolated](functions-3.md#djui_hud_render_rect_interpolated)
- [djui_hud_render_line](functions-3.md#djui_hud_render_line)
- [get_current_fov](functions-3.md#get_current_fov)
- [djui_hud_get_fov_coeff](functions-3.md#djui_hud_get_fov_coeff)
- [djui_hud_world_pos_to_screen_pos](functions-3.md#djui_hud_world_pos_to_screen_pos)

View file

@ -47,8 +47,8 @@ struct SpawnInfo *gMarioSpawnInfo = &gPlayerSpawnInfos[0];
struct Area *gAreas = gAreaData;
struct Area *gCurrentArea = NULL;
struct CreditsEntry *gCurrCreditsEntry = NULL;
Vp *D_8032CE74 = NULL;
Vp *D_8032CE78 = NULL;
Vp *gViewportOverride = NULL;
Vp *gViewportClip = NULL;
s16 gWarpTransDelay = 0;
u32 gFBSetColor = 0;
u32 gWarpTransFBSetColor = 0;
@ -90,7 +90,7 @@ u8 sSpawnTypeFromWarpBhv[] = {
MARIO_SPAWN_AIRBORNE_STAR_COLLECT, MARIO_SPAWN_AIRBORNE_DEATH, MARIO_SPAWN_LAUNCH_STAR_COLLECT, MARIO_SPAWN_LAUNCH_DEATH,
};
Vp D_8032CF00 = { {
Vp gViewportFullscreen = { {
{ 640, 480, 511, 0 },
{ 640, 480, 511, 0 },
} };
@ -107,8 +107,8 @@ void override_viewport_and_clip(Vp *a, Vp *b, u8 c, u8 d, u8 e) {
u16 sp6 = ((c >> 3) << 11) | ((d >> 3) << 6) | ((e >> 3) << 1) | 1;
gFBSetColor = (sp6 << 16) | sp6;
D_8032CE74 = a;
D_8032CE78 = b;
gViewportOverride = a;
gViewportClip = b;
}
void set_warp_transition_rgb(u8 red, u8 green, u8 blue) {
@ -446,9 +446,9 @@ void play_transition_after_delay(s16 transType, s16 time, u8 red, u8 green, u8 b
void render_game(void) {
dynos_update_gfx();
if (gCurrentArea != NULL && !gWarpTransition.pauseRendering) {
geo_process_root(gCurrentArea->root, D_8032CE74, D_8032CE78, gFBSetColor);
geo_process_root(gCurrentArea->root, gViewportOverride, gViewportClip, gFBSetColor);
gSPViewport(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&D_8032CF00));
gSPViewport(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gViewportFullscreen));
gDPSetScissor(gDisplayListHead++, G_SC_NON_INTERLACE, 0, BORDER_HEIGHT, SCREEN_WIDTH,
SCREEN_HEIGHT - BORDER_HEIGHT);
@ -479,8 +479,8 @@ void render_game(void) {
gSaveOptSelectIndex = gPauseScreenMode;
}
if (D_8032CE78 != NULL) {
make_viewport_clip_rect(D_8032CE78);
if (gViewportClip != NULL) {
make_viewport_clip_rect(gViewportClip);
} else
gDPSetScissor(gDisplayListHead++, G_SC_NON_INTERLACE, 0, BORDER_HEIGHT, SCREEN_WIDTH,
SCREEN_HEIGHT - BORDER_HEIGHT);
@ -502,15 +502,15 @@ void render_game(void) {
}
} else {
render_text_labels();
if (D_8032CE78 != NULL) {
clear_viewport(D_8032CE78, gWarpTransFBSetColor);
if (gViewportClip != NULL) {
clear_viewport(gViewportClip, gWarpTransFBSetColor);
} else {
clear_frame_buffer(gWarpTransFBSetColor);
}
}
D_8032CE74 = NULL;
D_8032CE78 = NULL;
gViewportOverride = NULL;
gViewportClip = NULL;
}
void get_area_minimum_y(u8* hasMinY, f32* minY) {

View file

@ -159,6 +159,8 @@ void djui_reset_hud_params(void) {
djui_hud_set_rotation(0, 0, 0);
djui_hud_reset_color();
djui_hud_set_filter(FILTER_NEAREST);
djui_hud_reset_viewport();
djui_hud_reset_scissor();
}
void djui_render(void) {

View file

@ -82,6 +82,24 @@ static void djui_hud_size_translate(f32* size) {
}
}
// Translates position and scale to N64 resolution
static void djui_hud_translate_positions(f32 *outX, f32 *outY, f32 *outW, f32 *outH) {
// translate position
djui_hud_position_translate(outX, outY);
*outX -= GFX_DIMENSIONS_FROM_LEFT_EDGE(0);
*outY -= SCREEN_HEIGHT;
// translate scale
if (sResolution == RESOLUTION_DJUI) {
u32 windowWidth, windowHeight;
gfx_get_dimensions(&windowWidth, &windowHeight);
f32 screenWidth = (f32) windowWidth / djui_gfx_get_scale();
f32 screenHeight = (f32) windowHeight / djui_gfx_get_scale();
*outW = (*outW / screenWidth) * SCREEN_WIDTH;
*outH = (*outH / screenHeight) * SCREEN_HEIGHT;
}
}
////////////
// interp //
////////////
@ -303,6 +321,43 @@ f32 djui_hud_get_mouse_scroll_y(void) {
return mouse_scroll_y;
}
void djui_hud_set_viewport(f32 x, f32 y, f32 width, f32 height) {
// translate position and scale
f32 translatedX = x, translatedY = y, translatedW = width, translatedH = height;
djui_hud_translate_positions(&translatedX, &translatedY, &translatedW, &translatedH);
// convert to viewport structure
static Vp vp = {{
{ 640, 480, 511, 0 },
{ 640, 480, 511, 0 },
}};
Vp_t *viewport = &vp.vp;
viewport->vscale[0] = translatedW * 2.0f;
viewport->vscale[1] = translatedH * 2.0f;
viewport->vtrans[0] = (translatedW + translatedX) * 2.0f;
viewport->vtrans[1] = (translatedH + translatedY) * 2.0f;
gSPViewport(gDisplayListHead++, &vp);
}
void djui_hud_reset_viewport(void) {
extern Vp gViewportFullscreen;
gSPViewport(gDisplayListHead++, &gViewportFullscreen);
}
void djui_hud_set_scissor(f32 x, f32 y, f32 width, f32 height) {
// translate position and scale
f32 translatedX = x, translatedY = y, translatedW = width, translatedH = height;
djui_hud_translate_positions(&translatedX, &translatedY, &translatedW, &translatedH);
// apply the scissor
gDPSetScissor(gDisplayListHead++, G_SC_NON_INTERLACE, translatedX, translatedY, translatedW, translatedH);
}
void djui_hud_reset_scissor(void) {
gDPSetScissor(gDisplayListHead++, G_SC_NON_INTERLACE, 0, BORDER_HEIGHT, SCREEN_WIDTH, SCREEN_HEIGHT - BORDER_HEIGHT);
}
f32 djui_hud_measure_text(const char* message) {
if (message == NULL) { return 0; }
const struct DjuiFont* font = gDjuiFonts[sFont];
@ -644,6 +699,15 @@ void djui_hud_render_rect_interpolated(f32 prevX, f32 prevY, f32 prevWidth, f32
interp->rotation = sRotation;
}
void djui_hud_render_line(f32 p1X, f32 p1Y, f32 p2X, f32 p2Y, f32 size) {
f32 dx = p2X - p1X;
f32 dy = p2Y - p1Y;
f32 angle = atan2s(dy, dx) - 0x4000; // -90 degrees to adjust for djui rotation
f32 hDist = sqrt(sqr(dx) + sqr(dy));
djui_hud_set_rotation(angle, 0, 0.5);
djui_hud_render_rect(p1X, p1Y, hDist, size);
}
static void hud_rotate_and_translate_vec3f(Vec3f vec, Mat4* mtx, Vec3f out) {
out[0] = (*mtx)[0][0] * vec[0] + (*mtx)[1][0] * vec[1] + (*mtx)[2][0] * vec[2];
out[1] = (*mtx)[0][1] * vec[0] + (*mtx)[1][1] * vec[1] + (*mtx)[2][1] * vec[2];
@ -666,6 +730,8 @@ f32 djui_hud_get_fov_coeff() {
return (fovDefault / fovCurrent) * 1.13f;
}
bool gDjuiHudToWorldCalcViewport = true;
bool djui_hud_world_pos_to_screen_pos(Vec3f pos, OUT Vec3f out) {
if (!gCamera) { return false; }
hud_rotate_and_translate_vec3f(pos, &gCamera->mtx, out);
@ -695,9 +761,9 @@ bool djui_hud_world_pos_to_screen_pos(Vec3f pos, OUT Vec3f out) {
out[0] += screenWidth / 2.0f;
out[1] += screenHeight / 2.0f;
extern Vp *D_8032CE74;
if (D_8032CE74) {
Vp_t *viewport = &D_8032CE74->vp;
extern Vp *gViewportOverride;
if (gViewportOverride && gDjuiHudToWorldCalcViewport) {
Vp_t *viewport = &gViewportOverride->vp;
f32 width = viewport->vscale[0] / 2.0f;
f32 height = viewport->vscale[1] / 2.0f;
f32 x = (viewport->vtrans[0] / 4.0f) - width / 2.0f;

View file

@ -104,6 +104,14 @@ u8 djui_hud_get_mouse_buttons_released(void);
f32 djui_hud_get_mouse_scroll_x(void);
/* |description|Returns the amount scrolled vertically (-down/up+)|descriptionEnd| */
f32 djui_hud_get_mouse_scroll_y(void);
/* |description|Sets the viewport to the specified position and size, this will resize |descriptionEnd| */
void djui_hud_set_viewport(f32 x, f32 y, f32 width, f32 height);
/* |description|put the description here|descriptionEnd| */
void djui_hud_reset_viewport(void);
/* |description|put the description here|descriptionEnd| */
void djui_hud_set_scissor(f32 x, f32 y, f32 width, f32 height);
/* |description|put the description here|descriptionEnd| */
void djui_hud_reset_scissor(void);
/* |description|Measures the length of `message` in the current font|descriptionEnd| */
f32 djui_hud_measure_text(const char* message);
@ -125,6 +133,8 @@ void djui_hud_render_texture_tile_interpolated(struct TextureInfo* texInfo, f32
void djui_hud_render_rect(f32 x, f32 y, f32 width, f32 height);
/* |description|Renders an interpolated DJUI HUD rect onto the screen|descriptionEnd| */
void djui_hud_render_rect_interpolated(f32 prevX, f32 prevY, f32 prevWidth, f32 prevHeight, f32 x, f32 y, f32 width, f32 height);
/* |description|Renders an DJUI HUD line onto the screen|descriptionEnd| */
void djui_hud_render_line(f32 p1X, f32 p1Y, f32 p2X, f32 p2Y, f32 size);
/* |description|Gets the current camera FOV|descriptionEnd| */
f32 get_current_fov();

View file

@ -12790,6 +12790,82 @@ int smlua_func_djui_hud_get_mouse_scroll_y(UNUSED lua_State* L) {
return 1;
}
int smlua_func_djui_hud_set_viewport(lua_State* L) {
if (L == NULL) { return 0; }
int top = lua_gettop(L);
if (top != 4) {
LOG_LUA_LINE("Improper param count for '%s': Expected %u, Received %u", "djui_hud_set_viewport", 4, top);
return 0;
}
f32 x = smlua_to_number(L, 1);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "djui_hud_set_viewport"); return 0; }
f32 y = smlua_to_number(L, 2);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 2, "djui_hud_set_viewport"); return 0; }
f32 width = smlua_to_number(L, 3);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 3, "djui_hud_set_viewport"); return 0; }
f32 height = smlua_to_number(L, 4);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 4, "djui_hud_set_viewport"); return 0; }
djui_hud_set_viewport(x, y, width, height);
return 1;
}
int smlua_func_djui_hud_reset_viewport(UNUSED lua_State* L) {
if (L == NULL) { return 0; }
int top = lua_gettop(L);
if (top != 0) {
LOG_LUA_LINE("Improper param count for '%s': Expected %u, Received %u", "djui_hud_reset_viewport", 0, top);
return 0;
}
djui_hud_reset_viewport();
return 1;
}
int smlua_func_djui_hud_set_scissor(lua_State* L) {
if (L == NULL) { return 0; }
int top = lua_gettop(L);
if (top != 4) {
LOG_LUA_LINE("Improper param count for '%s': Expected %u, Received %u", "djui_hud_set_scissor", 4, top);
return 0;
}
f32 x = smlua_to_number(L, 1);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "djui_hud_set_scissor"); return 0; }
f32 y = smlua_to_number(L, 2);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 2, "djui_hud_set_scissor"); return 0; }
f32 width = smlua_to_number(L, 3);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 3, "djui_hud_set_scissor"); return 0; }
f32 height = smlua_to_number(L, 4);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 4, "djui_hud_set_scissor"); return 0; }
djui_hud_set_scissor(x, y, width, height);
return 1;
}
int smlua_func_djui_hud_reset_scissor(UNUSED lua_State* L) {
if (L == NULL) { return 0; }
int top = lua_gettop(L);
if (top != 0) {
LOG_LUA_LINE("Improper param count for '%s': Expected %u, Received %u", "djui_hud_reset_scissor", 0, top);
return 0;
}
djui_hud_reset_scissor();
return 1;
}
int smlua_func_djui_hud_measure_text(lua_State* L) {
if (L == NULL) { return 0; }
@ -13045,6 +13121,31 @@ int smlua_func_djui_hud_render_rect_interpolated(lua_State* L) {
return 1;
}
int smlua_func_djui_hud_render_line(lua_State* L) {
if (L == NULL) { return 0; }
int top = lua_gettop(L);
if (top != 5) {
LOG_LUA_LINE("Improper param count for '%s': Expected %u, Received %u", "djui_hud_render_line", 5, top);
return 0;
}
f32 p1X = smlua_to_number(L, 1);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "djui_hud_render_line"); return 0; }
f32 p1Y = smlua_to_number(L, 2);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 2, "djui_hud_render_line"); return 0; }
f32 p2X = smlua_to_number(L, 3);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 3, "djui_hud_render_line"); return 0; }
f32 p2Y = smlua_to_number(L, 4);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 4, "djui_hud_render_line"); return 0; }
f32 size = smlua_to_number(L, 5);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 5, "djui_hud_render_line"); return 0; }
djui_hud_render_line(p1X, p1Y, p2X, p2Y, size);
return 1;
}
int smlua_func_get_current_fov(UNUSED lua_State* L) {
if (L == NULL) { return 0; }
@ -37175,6 +37276,10 @@ void smlua_bind_functions_autogen(void) {
smlua_bind_function(L, "djui_hud_get_mouse_buttons_released", smlua_func_djui_hud_get_mouse_buttons_released);
smlua_bind_function(L, "djui_hud_get_mouse_scroll_x", smlua_func_djui_hud_get_mouse_scroll_x);
smlua_bind_function(L, "djui_hud_get_mouse_scroll_y", smlua_func_djui_hud_get_mouse_scroll_y);
smlua_bind_function(L, "djui_hud_set_viewport", smlua_func_djui_hud_set_viewport);
smlua_bind_function(L, "djui_hud_reset_viewport", smlua_func_djui_hud_reset_viewport);
smlua_bind_function(L, "djui_hud_set_scissor", smlua_func_djui_hud_set_scissor);
smlua_bind_function(L, "djui_hud_reset_scissor", smlua_func_djui_hud_reset_scissor);
smlua_bind_function(L, "djui_hud_measure_text", smlua_func_djui_hud_measure_text);
smlua_bind_function(L, "djui_hud_print_text", smlua_func_djui_hud_print_text);
smlua_bind_function(L, "djui_hud_print_text_interpolated", smlua_func_djui_hud_print_text_interpolated);
@ -37184,6 +37289,7 @@ void smlua_bind_functions_autogen(void) {
smlua_bind_function(L, "djui_hud_render_texture_tile_interpolated", smlua_func_djui_hud_render_texture_tile_interpolated);
smlua_bind_function(L, "djui_hud_render_rect", smlua_func_djui_hud_render_rect);
smlua_bind_function(L, "djui_hud_render_rect_interpolated", smlua_func_djui_hud_render_rect_interpolated);
smlua_bind_function(L, "djui_hud_render_line", smlua_func_djui_hud_render_line);
smlua_bind_function(L, "get_current_fov", smlua_func_get_current_fov);
smlua_bind_function(L, "djui_hud_get_fov_coeff", smlua_func_djui_hud_get_fov_coeff);
smlua_bind_function(L, "djui_hud_world_pos_to_screen_pos", smlua_func_djui_hud_world_pos_to_screen_pos);

View file

@ -84,6 +84,8 @@ void nametags_render(void) {
vec3f_copy(pos, m->marioBodyState->headPos);
pos[1] += 100;
extern bool gDjuiHudToWorldCalcViewport;
gDjuiHudToWorldCalcViewport = false;
if ((i != 0 || (i == 0 && m->action != ACT_FIRST_PERSON)) &&
djui_hud_world_pos_to_screen_pos(pos, out)) {
@ -114,11 +116,15 @@ void nametags_render(void) {
e->inited = true;
}
// Scissor to clip during credits
extern Vp *D_8032CE74;
extern Vp *D_8032CE78;
Vp *viewport = D_8032CE74 == NULL ? D_8032CE78 : D_8032CE74;
if (viewport) { make_viewport_clip_rect(viewport); }
// Apply viewport for credits
extern Vp *gViewportOverride;
extern Vp *gViewportClip;
extern Vp gViewportFullscreen;
Vp *viewport = gViewportOverride == NULL ? gViewportClip : gViewportOverride;
if (viewport) {
make_viewport_clip_rect(viewport);
gSPViewport(gDisplayListHead++, viewport);
}
djui_hud_print_outlined_text_interpolated(name,
e->prevPos[0] - measure, e->prevPos[1], e->prevScale,
@ -135,12 +141,16 @@ void nametags_render(void) {
);
}
// Reset scissor
if (viewport) { gDPSetScissor(gDisplayListHead++, G_SC_NON_INTERLACE, 0, BORDER_HEIGHT, SCREEN_WIDTH, SCREEN_HEIGHT - BORDER_HEIGHT); }
// Reset viewport
if (viewport) {
gDPSetScissor(gDisplayListHead++, G_SC_NON_INTERLACE, 0, BORDER_HEIGHT, SCREEN_WIDTH, SCREEN_HEIGHT - BORDER_HEIGHT);
gSPViewport(gDisplayListHead++, &gViewportFullscreen);
}
vec3f_copy(e->prevPos, out);
e->prevScale = scale;
}
gDjuiHudToWorldCalcViewport = true;
}
}

View file

@ -76,7 +76,7 @@
#include <SDL2/SDL.h>
#endif
extern Vp D_8032CF00;
extern Vp gViewportFullscreen;
OSMesg D_80339BEC;
OSMesgQueue gSIEventMesgQueue;
@ -363,7 +363,7 @@ void produce_one_dummy_frame(void (*callback)(), u8 clearColorR, u8 clearColorG,
djui_gfx_displaylist_begin();
// fix scaling issues
gSPViewport(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&D_8032CF00));
gSPViewport(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gViewportFullscreen));
gDPSetScissor(gDisplayListHead++, G_SC_NON_INTERLACE, 0, BORDER_HEIGHT, SCREEN_WIDTH, SCREEN_HEIGHT - BORDER_HEIGHT);
// clear screen