From c1f88d2f15fd82648bff0b7c902ba72e105aa64a Mon Sep 17 00:00:00 2001 From: h4570 Date: Sun, 24 Jul 2022 23:03:48 +0200 Subject: [PATCH] interlacing mode --- engine/inc/renderer/renderer_settings.hpp | 5 ++++ .../src/renderer/core/2d/renderer_core_2d.cpp | 9 +++--- .../src/renderer/core/3d/renderer_core_3d.cpp | 2 +- .../src/renderer/core/gs/renderer_core_gs.cpp | 28 +++++++++++-------- samples/h4570/src/h4570.cpp | 2 +- 5 files changed, 29 insertions(+), 17 deletions(-) diff --git a/engine/inc/renderer/renderer_settings.hpp b/engine/inc/renderer/renderer_settings.hpp index f696329..3317c7d 100644 --- a/engine/inc/renderer/renderer_settings.hpp +++ b/engine/inc/renderer/renderer_settings.hpp @@ -33,6 +33,11 @@ class RendererSettings { const float& getProjectionScale() const { return projectionScale; } const float& getAspectRatio() const { return aspectRatio; } + float getInterlacedHeightF() const { return getHeight() / 2; } + unsigned int getInterlacedHeightUI() const { + return static_cast(getInterlacedHeightF()); + } + static void copy(RendererSettings* out, const RendererSettings* in); void set(const RendererSettings& v); diff --git a/engine/src/renderer/core/2d/renderer_core_2d.cpp b/engine/src/renderer/core/2d/renderer_core_2d.cpp index 11c6aab..cfc0377 100644 --- a/engine/src/renderer/core/2d/renderer_core_2d.cpp +++ b/engine/src/renderer/core/2d/renderer_core_2d.cpp @@ -88,10 +88,11 @@ void RendererCore2D::render(Sprite* sprite, packet2_utils_gs_add_texbuff_clut(packet, texBuffers.core, clutBuffer); draw_enable_blending(); packet2_update(packet, draw_rect_textured(packet->next, 0, rect)); - packet2_update(packet, draw_primitive_xyoffset( - packet->next, 0, - SCREEN_CENTER - (settings->getWidth() / 2.0F), - SCREEN_CENTER - (settings->getHeight() / 2.0F))); + packet2_update( + packet, + draw_primitive_xyoffset( + packet->next, 0, SCREEN_CENTER - (settings->getWidth() / 2.0F), + SCREEN_CENTER - (settings->getInterlacedHeightF() / 2.0F))); draw_disable_blending(); packet2_update(packet, draw_finish(packet->next)); diff --git a/engine/src/renderer/core/3d/renderer_core_3d.cpp b/engine/src/renderer/core/3d/renderer_core_3d.cpp index 189d400..9658ee9 100644 --- a/engine/src/renderer/core/3d/renderer_core_3d.cpp +++ b/engine/src/renderer/core/3d/renderer_core_3d.cpp @@ -37,7 +37,7 @@ void RendererCore3D::setFov(const float& t_fov) { void RendererCore3D::setProjection() { projection = M4x4::perspective( - fov, settings->getWidth(), settings->getHeight(), + fov, settings->getWidth(), settings->getInterlacedHeightF(), settings->getProjectionScale(), settings->getAspectRatio(), settings->getNear(), settings->getFar()); } diff --git a/engine/src/renderer/core/gs/renderer_core_gs.cpp b/engine/src/renderer/core/gs/renderer_core_gs.cpp index 2b6ac67..37085d6 100644 --- a/engine/src/renderer/core/gs/renderer_core_gs.cpp +++ b/engine/src/renderer/core/gs/renderer_core_gs.cpp @@ -52,12 +52,12 @@ void RendererCoreGS::initChannels() { } void RendererCoreGS::allocateBuffers() { - const u16 psm = 24; + const u16 psm = 32; frameBuffers[0].width = static_cast(settings->getWidth()); - frameBuffers[0].height = static_cast(settings->getHeight()); + frameBuffers[0].height = settings->getInterlacedHeightUI(); frameBuffers[0].mask = 0; - frameBuffers[0].psm = GS_PSM_24; + frameBuffers[0].psm = GS_PSM_32; frameBuffers[0].address = graph_vram_allocate(frameBuffers[0].width, frameBuffers[0].height, frameBuffers[0].psm, GRAPH_ALIGN_PAGE); @@ -73,15 +73,20 @@ void RendererCoreGS::allocateBuffers() { zBuffer.enable = DRAW_ENABLE; zBuffer.mask = 0; zBuffer.method = ZTEST_METHOD_GREATER_EQUAL; - zBuffer.zsm = GS_ZBUF_24; + zBuffer.zsm = GS_ZBUF_32; zBuffer.address = graph_vram_allocate(frameBuffers[0].width, frameBuffers[0].height, zBuffer.zsm, GRAPH_ALIGN_PAGE); TYRA_LOG("Framebuffers, zBuffer set and allocated!"); - // Initialize the screen and tie the first framebuffer to the read circuits. - graph_initialize(frameBuffers[1].address, frameBuffers[1].width, - frameBuffers[1].height, frameBuffers[1].psm, 0, 0); + graph_set_mode(GRAPH_MODE_INTERLACED, GRAPH_MODE_NTSC, GRAPH_MODE_FRAME, + GRAPH_ENABLE); + graph_set_screen(0, 0, static_cast(settings->getWidth()), + static_cast(settings->getHeight())); + graph_set_bgcolor(0, 0, 0); + graph_set_framebuffer_filtered(frameBuffers[1].address, frameBuffers[1].width, + frameBuffers[1].psm, 0, 0); + graph_enable_output(); spaceOccupiedByFrameBuffers = ((frameBuffers[0].width / 100.0F) * (frameBuffers[0].height / 100.0F) * @@ -96,10 +101,11 @@ void RendererCoreGS::initDrawingEnvironment() { packet2_t* packet2 = packet2_create(20, P2_TYPE_NORMAL, P2_MODE_NORMAL, 0); packet2_update(packet2, draw_setup_environment(packet2->base, 0, frameBuffers, &zBuffer)); - packet2_update(packet2, draw_primitive_xyoffset( - packet2->next, 0, - screenCenter - (settings->getWidth() / 2.0F), - screenCenter - (settings->getHeight() / 2.0F))); + packet2_update( + packet2, + draw_primitive_xyoffset( + packet2->next, 0, screenCenter - (settings->getWidth() / 2.0F), + screenCenter - (settings->getInterlacedHeightF() / 2.0F))); packet2_update(packet2, draw_finish(packet2->next)); dma_channel_send_packet2(packet2, DMA_CHANNEL_GIF, true); dma_channel_wait(DMA_CHANNEL_GIF, 0); diff --git a/samples/h4570/src/h4570.cpp b/samples/h4570/src/h4570.cpp index 0785eed..5cbce43 100644 --- a/samples/h4570/src/h4570.cpp +++ b/samples/h4570/src/h4570.cpp @@ -113,7 +113,7 @@ void H4570::init() { blocks[i].color = Color(128.0F, 128.0F, 128.0F, 128.0F); } - engine->audio.playSong(); + // engine->audio.playSong(); engine->renderer.setFrameLimit(false); }