From b0cd37eeaa72ae54428ad096caae328796d4ab9d Mon Sep 17 00:00:00 2001 From: Dominic Masters Date: Tue, 12 Aug 2025 00:05:58 -0500 Subject: [PATCH] About to add scene rendering --- CMakeLists.txt | 4 +- src/dusk/game.c | 6 +-- src/dusksdl2/CMakeLists.txt | 2 +- src/dusksdl2/display/CMakeLists.txt | 1 + src/dusksdl2/display/render.c | 18 ++++++-- src/dusksdl2/display/renderscene.c | 20 ++++++++ src/dusksdl2/display/renderscene.h | 24 ++++++++++ src/dusksdl2/display/rendertext.c | 17 +++++-- src/dusksdl2/display/rendertext.h | 7 ++- src/dusksdl2/dusksdl2input.c | 44 ++++++++++++++++++ src/dusksdl2/dusksdl2input.h | 52 +++++++++++++++++++++ src/dusksdl2/input.c | 71 ----------------------------- src/dusksdl2/main.c | 7 --- 13 files changed, 181 insertions(+), 92 deletions(-) create mode 100644 src/dusksdl2/display/renderscene.c create mode 100644 src/dusksdl2/display/renderscene.h create mode 100644 src/dusksdl2/dusksdl2input.c create mode 100644 src/dusksdl2/dusksdl2input.h delete mode 100644 src/dusksdl2/input.c diff --git a/CMakeLists.txt b/CMakeLists.txt index ef97795..261b240 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,8 +10,8 @@ set(CMAKE_C_STANDARD_REQUIRED ON) set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules) if(NOT DEFINED DUSK_TARGET_SYSTEM) - # set(DUSK_TARGET_SYSTEM "linux") - set(DUSK_TARGET_SYSTEM "psp") + set(DUSK_TARGET_SYSTEM "linux") + # set(DUSK_TARGET_SYSTEM "psp") endif() # Prep cache diff --git a/src/dusk/game.c b/src/dusk/game.c index 7ae5628..d02d7df 100644 --- a/src/dusk/game.c +++ b/src/dusk/game.c @@ -26,9 +26,9 @@ void gameInit(void) { } void gameUpdate(void) { - // overworldUpdate(); - // uiTextboxUpdate(); - // eventUpdate(); + overworldUpdate(); + uiTextboxUpdate(); + eventUpdate(); consoleUpdate(); inputUpdate(); diff --git a/src/dusksdl2/CMakeLists.txt b/src/dusksdl2/CMakeLists.txt index 3bd7b6e..71651bb 100644 --- a/src/dusksdl2/CMakeLists.txt +++ b/src/dusksdl2/CMakeLists.txt @@ -27,7 +27,7 @@ target_include_directories(${DUSK_TARGET_NAME} # Sources target_sources(${DUSK_TARGET_NAME} PRIVATE - input.c + dusksdl2input.c main.c ) diff --git a/src/dusksdl2/display/CMakeLists.txt b/src/dusksdl2/display/CMakeLists.txt index 736e2db..beafd81 100644 --- a/src/dusksdl2/display/CMakeLists.txt +++ b/src/dusksdl2/display/CMakeLists.txt @@ -10,6 +10,7 @@ target_sources(${DUSK_TARGET_NAME} renderbackbuffer.c rendertext.c renderconsole.c + renderscene.c ) # Subdirs diff --git a/src/dusksdl2/display/render.c b/src/dusksdl2/display/render.c index d9a80a1..adb295c 100644 --- a/src/dusksdl2/display/render.c +++ b/src/dusksdl2/display/render.c @@ -11,6 +11,8 @@ #include "rendertext.h" #include "renderconsole.h" #include "console/console.h" +#include "dusksdl2input.h" +#include "renderscene.h" SDL_Window *RENDER_WINDOW; SDL_Renderer *RENDER_RENDERER; @@ -18,7 +20,13 @@ bool_t RENDER_RUNNING; errorret_t renderInit(void) { // Init SDL - if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_GAMECONTROLLER) != 0) { + uint32_t flags = SDL_INIT_VIDEO; + + #if INPUT_SUPPORT_GAMEPAD + flags |= SDL_INIT_GAMECONTROLLER; + #endif + + if(SDL_Init(flags) != 0) { errorThrow( "SDL Failed to Initialize: %s", SDL_GetError() @@ -32,8 +40,7 @@ errorret_t renderInit(void) { SDL_WINDOWPOS_UNDEFINED, RENDER_WINDOW_WIDTH_DEFAULT, RENDER_WINDOW_HEIGHT_DEFAULT, - 0 - // SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI + SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI ); if(!RENDER_WINDOW) { errorThrow("SDL_CreateWindow failed: %s", SDL_GetError()); @@ -54,6 +61,7 @@ errorret_t renderInit(void) { // Init other things renderTextInit(); + renderSceneInit(); // Mark ready. RENDER_RUNNING = true; @@ -78,6 +86,7 @@ errorret_t renderDraw(void) { renderBackBufferBind(); // Draw everything + renderSceneDraw(); renderConsoleDraw(); // Unbind the backbuffer @@ -93,6 +102,9 @@ errorret_t renderDraw(void) { } errorret_t renderDispose(void) { + renderTextDispose(); + renderSceneDispose(); + renderBackBufferDispose(); SDL_DestroyRenderer(RENDER_RENDERER); diff --git a/src/dusksdl2/display/renderscene.c b/src/dusksdl2/display/renderscene.c new file mode 100644 index 0000000..87c8633 --- /dev/null +++ b/src/dusksdl2/display/renderscene.c @@ -0,0 +1,20 @@ +/** + * Copyright (c) 2025 Dominic Masters + * + * This software is released under the MIT License. + * https://opensource.org/licenses/MIT + */ + +#include "renderscene.h" + +void renderSceneInit(void) { + // Initialize scene-related resources here +} + +void renderSceneDraw(void) { + // Draw the current scene here +} + +void renderSceneDispose(void) { + // Dispose of scene-related resources here +} \ No newline at end of file diff --git a/src/dusksdl2/display/renderscene.h b/src/dusksdl2/display/renderscene.h new file mode 100644 index 0000000..541a148 --- /dev/null +++ b/src/dusksdl2/display/renderscene.h @@ -0,0 +1,24 @@ +/** + * Copyright (c) 2025 Dominic Masters + * + * This software is released under the MIT License. + * https://opensource.org/licenses/MIT + */ + +#pragma once +#include "dusk.h" + +/** + * Initializes the render scene module. + */ +void renderSceneInit(void); + +/** + * Draws the current scene. + */ +void renderSceneDraw(void); + +/** + * Disposes of the render scene module. + */ +void renderSceneDispose(void); \ No newline at end of file diff --git a/src/dusksdl2/display/rendertext.c b/src/dusksdl2/display/rendertext.c index 4d7e989..6ec40b4 100644 --- a/src/dusksdl2/display/rendertext.c +++ b/src/dusksdl2/display/rendertext.c @@ -27,9 +27,11 @@ void renderTextInit(void) { ); assertNotNull(surface, "Failed to create surface for text rendering"); + // Get the pixel format and pitch const int32_t pitch_px = surface->pitch / 4; uint32_t *pixels = (uint32_t *)surface->pixels; + // Buffer the pixels. for(int tileIndex = 0; tileIndex < FONT_TILE_COUNT; ++tileIndex) { const int32_t tileX = (tileIndex % FONT_COLUMN_COUNT) * FONT_TILE_WIDTH; const int32_t tileY = (tileIndex / FONT_COLUMN_COUNT) * FONT_TILE_HEIGHT; @@ -37,20 +39,21 @@ void renderTextInit(void) { for (int y = 0; y < FONT_TILE_HEIGHT; ++y) { for (int x = 0; x < FONT_TILE_WIDTH; ++x) { - const uint8_t color = tile[y * FONT_TILE_WIDTH + x] ? 0xFF : 0; - // Convert to RGBA (8 bits per channel) - const uint32_t rgba = color ? 0xFFFFFFFF : 0x00000000; - pixels[(tileY + y) * pitch_px + (tileX + x)] = rgba; + pixels[(tileY + y) * pitch_px + (tileX + x)] = ( + tile[y * FONT_TILE_WIDTH + x] ? 0xFFFFFFFF : 0x00000000 + ); } } } + // Create texture from the surface RENDER_TEXT_TEXTURE = SDL_CreateTextureFromSurface( RENDER_RENDERER, surface ); assertNotNull(RENDER_TEXT_TEXTURE, "Failed to create texture from surface"); + // Cleanup the surface SDL_FreeSurface(surface); SDL_SetTextureBlendMode(RENDER_TEXT_TEXTURE, SDL_BLENDMODE_BLEND); } @@ -109,4 +112,10 @@ void renderTextDraw( renderTextDrawChar(posX, posY, c); posX += FONT_TILE_WIDTH; } +} + +void renderTextDispose(void) { + assertNotNull(RENDER_TEXT_TEXTURE, "Texture cannot be NULL"); + SDL_DestroyTexture(RENDER_TEXT_TEXTURE); + RENDER_TEXT_TEXTURE = NULL; } \ No newline at end of file diff --git a/src/dusksdl2/display/rendertext.h b/src/dusksdl2/display/rendertext.h index 048c0b5..499d407 100644 --- a/src/dusksdl2/display/rendertext.h +++ b/src/dusksdl2/display/rendertext.h @@ -40,4 +40,9 @@ void renderTextDraw( const float_t x, const float_t y, const char_t *text -); \ No newline at end of file +); + +/** + * Disposes of the text rendering system, freeing any allocated resources. + */ +void renderTextDispose(void); \ No newline at end of file diff --git a/src/dusksdl2/dusksdl2input.c b/src/dusksdl2/dusksdl2input.c new file mode 100644 index 0000000..9c22fc5 --- /dev/null +++ b/src/dusksdl2/dusksdl2input.c @@ -0,0 +1,44 @@ +/** + * Copyright (c) 2025 Dominic Masters + * + * This software is released under the MIT License. + * https://opensource.org/licenses/MIT + */ + +#include "dusksdl2input.h" + +uint8_t inputStateGet() { + uint8_t state = 0; + + #if INPUT_SUPPORT_GAMEPAD + // Get gamepad state. + for(int32_t i = 0; i < SDL_NumJoysticks(); i++) { + if(!SDL_IsGameController(i)) continue; + + SDL_GameController *controller = SDL_GameControllerOpen(i); + if(!controller) continue; + + inputsdlbuttonmap_t *map = INPUT_SDL_BUTTON_MAP; + do { + if(SDL_GameControllerGetButton(controller, map->button)) { + state |= map->bind; + } + map++; + } while(map->bind != 0); + } + #endif + + // Get keyboard state. + #if INPUT_SUPPORT_KEYBOARD + const uint8_t *keyboardState = SDL_GetKeyboardState(NULL); + inputsdlkbmap_t *kbmap = INPUT_SDL_KEYBOARD_MAP; + do { + if(keyboardState[kbmap->code]) { + state |= kbmap->bind; + } + kbmap++; + } while(kbmap->bind != 0); + #endif + + return state; +} \ No newline at end of file diff --git a/src/dusksdl2/dusksdl2input.h b/src/dusksdl2/dusksdl2input.h new file mode 100644 index 0000000..4cd6e72 --- /dev/null +++ b/src/dusksdl2/dusksdl2input.h @@ -0,0 +1,52 @@ +/** + * Copyright (c) 2025 Dominic Masters + * + * This software is released under the MIT License. + * https://opensource.org/licenses/MIT + */ + +#pragma once +#include "dusksdl2.h" +#include "input.h" + +#ifndef INPUT_SUPPORT_GAMEPAD + #define INPUT_SUPPORT_GAMEPAD 1 +#endif + +#ifndef INPUT_SUPPORT_KEYBOARD + #define INPUT_SUPPORT_KEYBOARD 1 +#endif + +#if INPUT_SUPPORT_GAMEPAD + typedef struct { + const SDL_GameControllerButton button; + const uint8_t bind; + } inputsdlbuttonmap_t; + + static const inputsdlbuttonmap_t INPUT_SDL_BUTTON_MAP[] = { + { SDL_CONTROLLER_BUTTON_DPAD_UP, INPUT_BIND_UP }, + { SDL_CONTROLLER_BUTTON_DPAD_DOWN, INPUT_BIND_DOWN }, + { SDL_CONTROLLER_BUTTON_DPAD_LEFT, INPUT_BIND_LEFT }, + { SDL_CONTROLLER_BUTTON_DPAD_RIGHT, INPUT_BIND_RIGHT }, + { SDL_CONTROLLER_BUTTON_A, INPUT_BIND_ACTION }, + { SDL_CONTROLLER_BUTTON_B, INPUT_BIND_CANCEL }, + { 0, 0 } + }; +#endif + +#if INPUT_SUPPORT_KEYBOARD + typedef struct { + SDL_Scancode code; + uint8_t bind; + } inputsdlkbmap_t; + + static const inputsdlkbmap_t INPUT_SDL_KEYBOARD_MAP[] = { + { SDL_SCANCODE_W, INPUT_BIND_UP }, + { SDL_SCANCODE_S, INPUT_BIND_DOWN }, + { SDL_SCANCODE_A, INPUT_BIND_LEFT }, + { SDL_SCANCODE_D, INPUT_BIND_RIGHT }, + { SDL_SCANCODE_SPACE, INPUT_BIND_ACTION }, + { SDL_SCANCODE_ESCAPE, INPUT_BIND_CANCEL }, + { 0, 0 } + }; +#endif \ No newline at end of file diff --git a/src/dusksdl2/input.c b/src/dusksdl2/input.c deleted file mode 100644 index 53eef7f..0000000 --- a/src/dusksdl2/input.c +++ /dev/null @@ -1,71 +0,0 @@ -/** - * Copyright (c) 2025 Dominic Masters - * - * This software is released under the MIT License. - * https://opensource.org/licenses/MIT - */ - -#include "dusksdl2.h" -#include "input.h" - -typedef struct { - const SDL_GameControllerButton button; - const uint8_t bind; -} inputsdlbuttonmap_t; - -typedef struct { - SDL_Scancode code; - uint8_t bind; -} inputsdlkbmap_t; - -inputsdlbuttonmap_t INPUT_SDL_BUTTON_MAP[] = { - { SDL_CONTROLLER_BUTTON_DPAD_UP, INPUT_BIND_UP }, - { SDL_CONTROLLER_BUTTON_DPAD_DOWN, INPUT_BIND_DOWN }, - { SDL_CONTROLLER_BUTTON_DPAD_LEFT, INPUT_BIND_LEFT }, - { SDL_CONTROLLER_BUTTON_DPAD_RIGHT, INPUT_BIND_RIGHT }, - { SDL_CONTROLLER_BUTTON_A, INPUT_BIND_ACTION }, - { SDL_CONTROLLER_BUTTON_B, INPUT_BIND_CANCEL }, - { 0, 0 } -}; - -inputsdlkbmap_t INPUT_SDL_KEYBOARD_MAP[] = { - { SDL_SCANCODE_W, INPUT_BIND_UP }, - { SDL_SCANCODE_S, INPUT_BIND_DOWN }, - { SDL_SCANCODE_A, INPUT_BIND_LEFT }, - { SDL_SCANCODE_D, INPUT_BIND_RIGHT }, - { SDL_SCANCODE_SPACE, INPUT_BIND_ACTION }, - { SDL_SCANCODE_ESCAPE, INPUT_BIND_CANCEL }, - { 0, 0 } -}; - -uint8_t inputStateGet() { - uint8_t state = 0; - - // Get gamepad state. - for(int32_t i = 0; i < SDL_NumJoysticks(); i++) { - if(!SDL_IsGameController(i)) continue; - - SDL_GameController *controller = SDL_GameControllerOpen(i); - if(!controller) continue; - - inputsdlbuttonmap_t *map = INPUT_SDL_BUTTON_MAP; - do { - if(SDL_GameControllerGetButton(controller, map->button)) { - state |= map->bind; - } - map++; - } while(map->bind != 0); - } - - // Get keyboard state. - const uint8_t *keyboardState = SDL_GetKeyboardState(NULL); - inputsdlkbmap_t *kbmap = INPUT_SDL_KEYBOARD_MAP; - do { - if(keyboardState[kbmap->code]) { - state |= kbmap->bind; - } - kbmap++; - } while(kbmap->bind != 0); - - return state; -} \ No newline at end of file diff --git a/src/dusksdl2/main.c b/src/dusksdl2/main.c index f46368b..d04db35 100644 --- a/src/dusksdl2/main.c +++ b/src/dusksdl2/main.c @@ -25,13 +25,6 @@ int main(int argc, char *argv[]) { while(RENDER_RUNNING) { gameUpdate(); mainError(renderDraw()); - - if(inputPressed(INPUT_BIND_UP)) consolePrint("Up pressed"); - if(inputPressed(INPUT_BIND_DOWN)) consolePrint("Down pressed"); - if(inputPressed(INPUT_BIND_LEFT)) consolePrint("Left pressed"); - if(inputPressed(INPUT_BIND_RIGHT)) consolePrint("Right pressed"); - if(inputPressed(INPUT_BIND_ACTION)) consolePrint("Action pressed"); - if(inputPressed(INPUT_BIND_CANCEL)) consolePrint("Cancel pressed"); } gameDispose();