Skip to content

Commit eb2ee86

Browse files
committed
improvements to 3D mode
1 parent ca733fd commit eb2ee86

File tree

9 files changed

+54
-23
lines changed

9 files changed

+54
-23
lines changed

include/PR/gbi.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4803,6 +4803,13 @@ typedef union {
48034803
_g->words.w0 = _SHIFTL(G_SPECIAL_1, 24, 8); \
48044804
_g->words.w1 = (unsigned int)(mode); \
48054805
}
4806+
#define gDPForceFlush(pkt) \
4807+
{ \
4808+
Gfx *_g = (Gfx *)(pkt); \
4809+
\
4810+
_g->words.w0 = _SHIFTL(G_SPECIAL_2, 24, 8); \
4811+
}
4812+
48064813
#endif
48074814

48084815
#endif /* _LANGUAGE_C */

src/game/area.c

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -362,12 +362,13 @@ void play_transition_after_delay(s16 transType, s16 time, u8 red, u8 green, u8 b
362362
}
363363

364364
void render_game(void) {
365-
#ifdef ENABLE_N3DS_3D_MODE
366-
gDPSet2d(gDisplayListHead++, 0); // reset 2d mode
367-
#endif
368365
if (gCurrentArea != NULL && !gWarpTransition.pauseRendering) {
369366
geo_process_root(gCurrentArea->unk04, D_8032CE74, D_8032CE78, gFBSetColor);
370367

368+
#ifdef ENABLE_N3DS_3D_MODE
369+
gDPForceFlush(gDisplayListHead++); // flush 3D scene
370+
gDPSet2d(gDisplayListHead++, 1); // HUD is 2D
371+
#endif
371372
gSPViewport(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&D_8032CF00));
372373

373374
gDPSetScissor(gDisplayListHead++, G_SC_NON_INTERLACE, 0, BORDER_HEIGHT, SCREEN_WIDTH,
@@ -376,12 +377,24 @@ void render_game(void) {
376377

377378
gDPSetScissor(gDisplayListHead++, G_SC_NON_INTERLACE, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
378379
render_text_labels();
380+
#ifdef ENABLE_N3DS_3D_MODE
381+
gDPForceFlush(gDisplayListHead++); // flush hud
382+
gDPSet2d(gDisplayListHead++, 0); // reset 2D mode
383+
#endif
379384
do_cutscene_handler();
380385
print_displaying_credits_entry();
386+
387+
#ifdef ENABLE_N3DS_3D_MODE
388+
gDPForceFlush(gDisplayListHead++); // flush credits
389+
gDPSet2d(gDisplayListHead++, 1); // dialog/menus are 2D
390+
#endif
381391
gDPSetScissor(gDisplayListHead++, G_SC_NON_INTERLACE, 0, BORDER_HEIGHT, SCREEN_WIDTH,
382392
SCREEN_HEIGHT - BORDER_HEIGHT);
383393
gPauseScreenMode = render_menus_and_dialogs();
384-
394+
#ifdef ENABLE_N3DS_3D_MODE
395+
gDPForceFlush(gDisplayListHead++); // flush dialog/menus
396+
gDPSet2d(gDisplayListHead++, 0); // reset 2D mode
397+
#endif
385398
if (gPauseScreenMode != 0) {
386399
gSaveOptSelectIndex = gPauseScreenMode;
387400
}
@@ -408,7 +421,15 @@ void render_game(void) {
408421
}
409422
}
410423
} else {
424+
#ifdef ENABLE_N3DS_3D_MODE
425+
gDPForceFlush(gDisplayListHead++); // flush anything
426+
gDPSet2d(gDisplayListHead++, 1); // text labels are 2D
427+
#endif
411428
render_text_labels();
429+
#ifdef ENABLE_N3DS_3D_MODE
430+
gDPForceFlush(gDisplayListHead++); // flush text labels
431+
gDPSet2d(gDisplayListHead++, 0); // reset 2D mode
432+
#endif
412433
if (D_8032CE78 != 0) {
413434
clear_viewport(D_8032CE78, gWarpTransFBSetColor);
414435
} else {

src/game/hud.c

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -447,9 +447,6 @@ void render_hud(void) {
447447
create_dl_ortho_matrix();
448448
#endif
449449

450-
#ifdef ENABLE_N3DS_3D_MODE
451-
gDPSet2d(gDisplayListHead++, 1);
452-
#endif
453450
if (gCurrentArea != NULL && gCurrentArea->camera->mode == CAMERA_MODE_INSIDE_CANNON) {
454451
render_hud_cannon_reticle();
455452
}

src/game/ingame_menu.c

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3040,9 +3040,6 @@ s16 render_course_complete_screen(void) {
30403040
// Only case 1 and 2 are used
30413041
s16 render_menus_and_dialogs() {
30423042
s16 mode = 0;
3043-
#ifdef ENABLE_N3DS_3D_MODE
3044-
gDPSet2d(gDisplayListHead++, 1);
3045-
#endif
30463043

30473044
create_dl_ortho_matrix();
30483045

src/game/print.c

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -428,10 +428,6 @@ void render_text_labels(void) {
428428
gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(mtx), G_MTX_PROJECTION | G_MTX_LOAD | G_MTX_NOPUSH);
429429
gSPDisplayList(gDisplayListHead++, dl_hud_img_begin);
430430

431-
#ifdef ENABLE_N3DS_3D_MODE
432-
gDPSet2d(gDisplayListHead++, 1);
433-
#endif
434-
435431
for (i = 0; i < sTextLabelsCount; i++) {
436432
for (j = 0; j < sTextLabels[i]->length; j++) {
437433
glyphIndex = char_to_glyph_index(sTextLabels[i]->buffer[j]);

src/menu/file_select.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2772,10 +2772,15 @@ static void print_file_select_strings(void) {
27722772
Gfx *geo_file_select_strings_and_menu_cursor(s32 callContext, UNUSED struct GraphNode *node, UNUSED Mat4 mtx) {
27732773
if (callContext == GEO_CONTEXT_RENDER) {
27742774
#ifdef ENABLE_N3DS_3D_MODE
2775+
gDPForceFlush(gDisplayListHead++);
27752776
gDPSet2d(gDisplayListHead++, 1);
27762777
#endif
27772778
print_file_select_strings();
27782779
print_menu_cursor();
2780+
#ifdef ENABLE_N3DS_3D_MODE
2781+
gDPForceFlush(gDisplayListHead++);
2782+
gDPSet2d(gDisplayListHead++, 0);
2783+
#endif
27792784
}
27802785
return NULL;
27812786
}

src/menu/star_select.c

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -302,10 +302,6 @@ void print_act_selector_strings(void) {
302302
}
303303
currLevelName = segmented_to_virtual(levelNameTbl[gCurrCourseNum - 1]);
304304
#endif
305-
306-
#ifdef ENABLE_N3DS_3D_MODE
307-
gDPSet2d(gDisplayListHead++, 1);
308-
#endif
309305
// Print the coin highscore.
310306
gSPDisplayList(gDisplayListHead++, dl_rgba16_text_begin);
311307
gDPSetEnvColor(gDisplayListHead++, 255, 255, 255, 255);
@@ -381,7 +377,15 @@ Gfx *geo_act_selector_strings(s16 callContext, UNUSED struct GraphNode *node, UN
381377
Gfx *geo_act_selector_strings(s16 callContext, UNUSED struct GraphNode *node) {
382378
#endif
383379
if (callContext == GEO_CONTEXT_RENDER) {
380+
#ifdef ENABLE_N3DS_3D_MODE
381+
gDPForceFlush(gDisplayListHead++);
382+
gDPSet2d(gDisplayListHead++, 1);
383+
#endif
384384
print_act_selector_strings();
385+
#ifdef ENABLE_N3DS_3D_MODE
386+
gDPForceFlush(gDisplayListHead);
387+
gDPSet2d(gDisplayListHead++, 0);
388+
#endif
385389
}
386390
return NULL;
387391
}

src/pc/gfx/gfx_citro3d.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -718,6 +718,7 @@ static void gfx_citro3d_draw_triangles_helper(float buf_vbo[], size_t buf_vbo_le
718718
Mtx_Identity(&modelView);
719719
Mtx_Identity(&projLeft);
720720
Mtx_Identity(&projRight);
721+
721722
C3D_FVUnifMtx4x4(GPU_VERTEX_SHADER, uLoc_modelView, &modelView);
722723
C3D_FVUnifMtx4x4(GPU_VERTEX_SHADER, uLoc_projection, &projLeft);
723724

@@ -727,7 +728,7 @@ static void gfx_citro3d_draw_triangles_helper(float buf_vbo[], size_t buf_vbo_le
727728
sOrigBufIdx = sBufIdx;
728729
iod = gSliderLevel / 4.0f;
729730

730-
if (!(sIs2D && buf_vbo_num_tris == 2))
731+
if (!sIs2D)
731732
{
732733
Mtx_PerspStereoTilt(&projLeft, fov, 1.0f , 0.1f, 10.0f, -iod, focalLen, false);
733734
// hacks
@@ -750,7 +751,7 @@ static void gfx_citro3d_draw_triangles_helper(float buf_vbo[], size_t buf_vbo_le
750751
// restore buffer index
751752
sBufIdx = sOrigBufIdx;
752753

753-
if (!(sIs2D && buf_vbo_num_tris == 2))
754+
if (!sIs2D)
754755
{
755756
Mtx_PerspStereoTilt(&projRight, fov, 1.0f, 0.1f, 10.0f, iod, focalLen, false);
756757
// hacks
@@ -827,7 +828,7 @@ static void gfx_citro3d_end_frame(void)
827828

828829
// TOOD: draw the minimap here
829830
gfx_3ds_menu_draw(sVboBuffer, sBufIdx, gShowConfigMenu);
830-
831+
831832
C3D_FrameEnd(0);
832833
if (C3D_GetProcessingTime() < 1000.0f / target_fps)
833834
gspWaitForVBlank();

src/pc/gfx/gfx_pc.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -154,9 +154,9 @@ static struct GfxWindowManagerAPI *gfx_wapi;
154154
static struct GfxRenderingAPI *gfx_rapi;
155155

156156
#ifdef ENABLE_N3DS_3D_MODE
157-
static void gfx_set_is_2d(bool is2d)
157+
static void gfx_set_is_2d(bool is_2d)
158158
{
159-
gfx_rapi->set_is_2d(is2d);
159+
gfx_rapi->set_is_2d(is_2d);
160160
}
161161
#endif
162162

@@ -1537,6 +1537,9 @@ static void gfx_run_dl(Gfx* cmd) {
15371537
case G_SPECIAL_1:
15381538
gfx_set_is_2d(cmd->words.w1 == 1);
15391539
break;
1540+
case G_SPECIAL_2:
1541+
gfx_flush();
1542+
break;
15401543
#endif
15411544
}
15421545
++cmd;

0 commit comments

Comments
 (0)