From 454b8a91ba616c1380329d6a57531f66f1139be3 Mon Sep 17 00:00:00 2001 From: Dominic Masters Date: Thu, 25 Jun 2026 22:21:12 -0500 Subject: [PATCH] Fixed dolphin ratioing --- cmake/targets/dolphin.cmake | 7 ++++-- src/dusk/display/screen/screen.c | 28 ++++++++++++++++------- src/dusk/engine/engine.c | 2 +- src/dusk/rpg/overworld/worldpos.h | 8 ++++--- src/dusk/scene/overworld/sceneoverworld.c | 16 ++++++++++--- src/dusk/ui/overlay/uicrop.c | 4 ++++ src/duskdolphin/system/systemdolphin.c | 15 ++++++++++++ 7 files changed, 63 insertions(+), 17 deletions(-) diff --git a/cmake/targets/dolphin.cmake b/cmake/targets/dolphin.cmake index ff6164ba..a20b9d81 100644 --- a/cmake/targets/dolphin.cmake +++ b/cmake/targets/dolphin.cmake @@ -7,8 +7,11 @@ set_property(CACHE DUSK_DOLPHIN_BUILD_TYPE PROPERTY STRINGS "DOL" "ISO") target_compile_definitions(${DUSK_LIBRARY_TARGET_NAME} PUBLIC DUSK_DOLPHIN DUSK_INPUT_GAMEPAD - DUSK_DISPLAY_WIDTH=640 - DUSK_DISPLAY_HEIGHT=480 + # DUSK_DISPLAY_WIDTH=640 + # DUSK_DISPLAY_HEIGHT=480 + DUSK_DISPLAY_WIDTH=320 + DUSK_DISPLAY_HEIGHT=240 + DUSK_DISPLAY_OVERSCAN=16 DUSK_THREAD_PTHREAD DOL=1 ISO=2 diff --git a/src/dusk/display/screen/screen.c b/src/dusk/display/screen/screen.c index 79920a12..1690ea4a 100644 --- a/src/dusk/display/screen/screen.c +++ b/src/dusk/display/screen/screen.c @@ -56,10 +56,15 @@ errorret_t screenBind() { // Assume backbuffer is currently bound. switch(SCREEN.mode) { case SCREEN_MODE_BACKBUFFER: { - // Screen mode backbuffer uses the full display size - SCREEN.width = frameBufferGetWidth(FRAMEBUFFER_BOUND); - SCREEN.height = frameBufferGetHeight(FRAMEBUFFER_BOUND); - SCREEN.aspect = frameBufferGetAspect(FRAMEBUFFER_BOUND); + #if defined(DUSK_DISPLAY_WIDTH) && defined(DUSK_DISPLAY_HEIGHT) + SCREEN.width = DUSK_DISPLAY_WIDTH; + SCREEN.height = DUSK_DISPLAY_HEIGHT; + SCREEN.aspect = (float_t)DUSK_DISPLAY_WIDTH / (float_t)DUSK_DISPLAY_HEIGHT; + #else + SCREEN.width = frameBufferGetWidth(FRAMEBUFFER_BOUND); + SCREEN.height = frameBufferGetHeight(FRAMEBUFFER_BOUND); + SCREEN.aspect = frameBufferGetAspect(FRAMEBUFFER_BOUND); + #endif screenUpdateScan(); // No needd for a framebuffer. @@ -407,10 +412,17 @@ errorret_t screenRender() { } void screenUpdateScan(void) { - SCREEN.scanX = 0; - SCREEN.scanY = 0; - SCREEN.scanWidth = SCREEN.width; - SCREEN.scanHeight = SCREEN.height; + #ifdef DUSK_DISPLAY_OVERSCAN + SCREEN.scanX = DUSK_DISPLAY_OVERSCAN; + SCREEN.scanY = DUSK_DISPLAY_OVERSCAN; + SCREEN.scanWidth = SCREEN.width - DUSK_DISPLAY_OVERSCAN * 2; + SCREEN.scanHeight = SCREEN.height - DUSK_DISPLAY_OVERSCAN * 2; + #else + SCREEN.scanX = 0; + SCREEN.scanY = 0; + SCREEN.scanWidth = SCREEN.width; + SCREEN.scanHeight = SCREEN.height; + #endif #ifdef DUSK_DISPLAY_SIZE_DYNAMIC // Find the smallest standard ratio >= the screen aspect. diff --git a/src/dusk/engine/engine.c b/src/dusk/engine/engine.c index 04c234ad..54c59f3e 100644 --- a/src/dusk/engine/engine.c +++ b/src/dusk/engine/engine.c @@ -33,9 +33,9 @@ errorret_t engineInit(const int32_t argc, const char_t **argv) { ENGINE.version = DUSK_VERSION; // Init systems. Order is important. - errorChain(systemInit()); timeInit(); consoleInit(); + errorChain(systemInit()); errorChain(inputInit()); errorChain(assetInit()); // errorChain(saveInit()); diff --git a/src/dusk/rpg/overworld/worldpos.h b/src/dusk/rpg/overworld/worldpos.h index 1543bf2f..8008312e 100644 --- a/src/dusk/rpg/overworld/worldpos.h +++ b/src/dusk/rpg/overworld/worldpos.h @@ -8,14 +8,16 @@ #pragma once #include "dusk.h" -#define CHUNK_WIDTH 16 -#define CHUNK_HEIGHT CHUNK_WIDTH +#define TILE_SIZE_PIXELS 24 + +#define CHUNK_WIDTH 12 +#define CHUNK_HEIGHT 16 #define CHUNK_DEPTH 8 #define CHUNK_TILE_COUNT (CHUNK_WIDTH * CHUNK_HEIGHT * CHUNK_DEPTH) #define MAP_CHUNK_WIDTH 5 -#define MAP_CHUNK_HEIGHT 5 +#define MAP_CHUNK_HEIGHT 4 #define MAP_CHUNK_DEPTH 3 #define MAP_CHUNK_COUNT (MAP_CHUNK_WIDTH * MAP_CHUNK_HEIGHT * MAP_CHUNK_DEPTH) diff --git a/src/dusk/scene/overworld/sceneoverworld.c b/src/dusk/scene/overworld/sceneoverworld.c index feca011c..e2e83570 100644 --- a/src/dusk/scene/overworld/sceneoverworld.c +++ b/src/dusk/scene/overworld/sceneoverworld.c @@ -58,12 +58,22 @@ errorret_t sceneOverworldRender(scenedata_t *sceneData) { errorChain(shaderSetMatrix(&SHADER_UNLIT, SHADER_UNLIT_PROJECTION, proj)); // Camera Eye - float_t pixelsPerUnit = 16.0f; - float_t worldH = (float)SCREEN.height / pixelsPerUnit; + float_t pixelsPerUnit = TILE_SIZE_PIXELS; + float_t worldH = (float_t)SCREEN.height / pixelsPerUnit; float_t z = (worldH * 0.5f) / tanf(fov * 0.5f); vec3 worldPosVec; rpgCameraGetPosition(worldPosVec); - float_t offset = -16.0f; + float_t offset = -32.0f * (worldH / TILE_SIZE_PIXELS); + + // consolePrint( + // "FOV: %f, Aspect: %f, WorldH: %f, Z: %f, Offset: %f, ScreenH: %d", + // fov, + // (float_t)SCREEN.width / (float_t)SCREEN.height, + // worldH, + // z, + // offset, + // SCREEN.height + // ); glm_vec3_add(worldPosVec, (vec3){ 0.5f, 0.5f, 0.5f }, worldPosVec); diff --git a/src/dusk/ui/overlay/uicrop.c b/src/dusk/ui/overlay/uicrop.c index f37bf310..3e8d388b 100644 --- a/src/dusk/ui/overlay/uicrop.c +++ b/src/dusk/ui/overlay/uicrop.c @@ -19,6 +19,10 @@ errorret_t uiCropInit(void) { } errorret_t uiCropDraw(void) { + #ifndef DUSK_DISPLAY_SIZE_DYNAMIC + errorOk(); + #endif + if( SCREEN.scanX == 0 && SCREEN.scanY == 0 && diff --git a/src/duskdolphin/system/systemdolphin.c b/src/duskdolphin/system/systemdolphin.c index 1adfd1f6..19915b16 100644 --- a/src/duskdolphin/system/systemdolphin.c +++ b/src/duskdolphin/system/systemdolphin.c @@ -9,8 +9,23 @@ #include "input/input.h" #include "util/string.h" #include "assert/assert.h" +#include "console/console.h" errorret_t systemInitDolphin(void) { + char_t *names[] = { + "4:3", + "16:9", + "Unknown" + }; + + int32_t ratio = systemGetAspectRatioDolphin(); + uint8_t i = ( + ratio == CONF_ASPECT_4_3 ? 0 : + ratio == CONF_ASPECT_16_9 ? 1 : + 2 + ); + consolePrint("Dolphin Aspect Ratio: %s", names[i]); + errorOk(); }