"Improved"

This commit is contained in:
2026-02-04 15:54:09 -06:00
parent ad13d6c6a1
commit 708c4d0ec3
15 changed files with 150 additions and 154 deletions

View File

@@ -1,5 +1,5 @@
FROM devkitpro/devkitppc FROM devkitpro/devkitppc
RUN apt update && \ RUN apt update && \
apt install -y cmake git cmake python3 python3-pip python3-polib python3-pil python3-dotenv python3-pyqt5 python3-opengl && \ apt install -y python3 python3-pip python3-polib python3-pil python3-dotenv python3-pyqt5 python3-opengl && \
dkp-pacman -S --needed --noconfirm gamecube-sdl2 ppc-liblzma ppc-libzip ppc-liblua51 dkp-pacman -S --needed --noconfirm gamecube-sdl2 ppc-liblzma ppc-libzip

View File

@@ -4,8 +4,8 @@ docker run -it -v ./:/workdir myapp:latest /bin/bash -c ' \
cd /workdir && \ cd /workdir && \
rm -rf build2 && \ rm -rf build2 && \
mkdir -p build2 && \ mkdir -p build2 && \
cmake -S. -Bbuild2 -DDUSK_TARGET_SYSTEM=gamecube -DCMAKE_TOOLCHAIN_FILE="$DEVKITPRO/cmake/GameCube.cmake"
cd build2 && \ cd build2 && \
cmake .. -DDUSK_TARGET_SYSTEM=gamecube -DCMAKE_C_COMPILER=$DEVKITPPC/bin/powerpc-eabi-gcc -DCMAKE_CXX_COMPILER=$DEVKITPPC/bin/powerpc-eabi-g++ -DBUILD_SHARED_LIBS=OFF && \
make VERBOSE=1 \ make VERBOSE=1 \
' '
# docker run -it -v ./:/workdir myapp:latest /bin/bash # docker run -it -v ./:/workdir myapp:latest /bin/bash

View File

@@ -17,7 +17,7 @@ set(DUSK_CACHE_TARGET "dusk-target")
# Build variables # Build variables
set(DUSK_ROOT_DIR "${CMAKE_SOURCE_DIR}") set(DUSK_ROOT_DIR "${CMAKE_SOURCE_DIR}")
set(DUSK_BUILD_DIR "${CMAKE_BINARY_DIR}") set(DUSK_BUILD_DIR "${CMAKE_BINARY_DIR}")
set(DUSK_SOURCES_DIR "${DUSK_ROOT_DIR}/src") set(DUSK_SOURCES_DIR "${DUSK_ROOT_DIR}/src2")
set(DUSK_TEST_DIR "${DUSK_ROOT_DIR}/test") set(DUSK_TEST_DIR "${DUSK_ROOT_DIR}/test")
set(DUSK_TEMP_DIR "${DUSK_BUILD_DIR}/temp") set(DUSK_TEMP_DIR "${DUSK_BUILD_DIR}/temp")
set(DUSK_TOOLS_DIR "${DUSK_ROOT_DIR}/tools") set(DUSK_TOOLS_DIR "${DUSK_ROOT_DIR}/tools")
@@ -117,129 +117,66 @@ elseif(DUSK_TARGET_SYSTEM STREQUAL "psp")
) )
elseif(DUSK_TARGET_SYSTEM STREQUAL "gamecube" OR DUSK_TARGET_SYSTEM STREQUAL "wii") elseif(DUSK_TARGET_SYSTEM STREQUAL "gamecube" OR DUSK_TARGET_SYSTEM STREQUAL "wii")
if(NOT DEFINED ENV{DEVKITPPC}) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-rtti -fno-exceptions")
message(FATAL_ERROR "DEVKITPPC environment variable not set!") configure_file(opengl.pc.in opengl.pc @ONLY)
endif() find_package(PkgConfig REQUIRED)
set(DEVKITPPC $ENV{DEVKITPPC}) pkg_check_modules(SDL2 IMPORTED_TARGET sdl2)
if(NOT DEFINED ENV{DEVKITPRO}) pkg_check_modules(SDL2_ttf IMPORTED_TARGET SDL2_ttf)
message(FATAL_ERROR "DEVKITPRO environment variable not set!") pkg_check_modules(SDL2_image IMPORTED_TARGET SDL2_image)
endif() pkg_check_modules(SDL2_mixer IMPORTED_TARGET SDL2_mixer)
set(DEVKITPRO $ENV{DEVKITPRO}) pkg_check_modules(OPENGL IMPORTED_TARGET opengl)
pkg_check_modules(zip IMPORTED_TARGET libzip)
pkg_check_modules(GLU IMPORTED_TARGET glu)
pkg_check_modules(freetype2 IMPORTED_TARGET freetype2)
string(APPEND CMAKE_C_FLAGS "-g -O2 -mcpu=750 -meabi -mhard-float -Wall -mogc -DGEKKO")
set(CMAKE_FIND_ROOT_PATH "${DEVKITPRO}" "${DEVKITPPC}") target_link_libraries(${DUSK_LIBRARY_TARGET_NAME} PUBLIC
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) PkgConfig::SDL2
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) PkgConfig::SDL2_ttf
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) PkgConfig::SDL2_image
set(CMAKE_SKIP_RPATH TRUE) PkgConfig::SDL2_mixer
set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE) PkgConfig::zip
set(CMAKE_INSTALL_RPATH "") PkgConfig::GLU
PkgConfig::freetype2
set(PORTLIBS_PATH "${DEVKITPRO}/portlibs")
if(DUSK_TARGET_SYSTEM STREQUAL "gamecube")
set(_PORTLIBS_FLAVOR "gamecube")
set(_LIBOGC_LIBDIR "${DEVKITPRO}/libogc/lib/cube")
target_compile_definitions(${DUSK_LIBRARY_TARGET_NAME} PRIVATE HW_DOL GAMECUBE)
set(_MACHDEP_OPTS -mogc)
else()
set(_PORTLIBS_FLAVOR "wii")
set(_LIBOGC_LIBDIR "${DEVKITPRO}/libogc/lib/wii")
target_compile_definitions(${DUSK_LIBRARY_TARGET_NAME} PRIVATE HW_RVL WII)
set(_MACHDEP_OPTS -mrvll)
endif()
target_compile_options(${DUSK_LIBRARY_TARGET_NAME} PRIVATE ${_MACHDEP_OPTS} -DGEKKO -DDOLPHIN -Wall -O2 -DSDL_MAIN_HANDLED -meabi -mhard-float -g -mcpu=750)
target_link_options(${DUSK_LIBRARY_TARGET_NAME} PRIVATE ${_MACHDEP_OPTS} -DGEKKO -DDOLPHIN -Wall -O2 -DSDL_MAIN_HANDLED -meabi -mhard-float -g -mcpu=750)
execute_process(
COMMAND /opt/devkitpro/portlibs/${_PORTLIBS_FLAVOR}/bin/powerpc-eabi-pkg-config --libs sdl2 SDL2_ttf SDL2_gfx SDL2_mixer SDL2_image
OUTPUT_VARIABLE PKG_CONFIG_LIBS
OUTPUT_STRIP_TRAILING_WHITESPACE
)
# message(FATAL_ERROR "DISABLED FOR NOW ${PKG_CONFIG_LIBS}")
target_compile_options(${DUSK_LIBRARY_TARGET_NAME} PUBLIC ${PKG_CONFIG_LIBS})
target_link_options(${DUSK_LIBRARY_TARGET_NAME} PUBLIC ${PKG_CONFIG_LIBS})
target_include_directories(${DUSK_LIBRARY_TARGET_NAME} PRIVATE
"${DEVKITPRO}/libogc/include"
"${PORTLIBS_PATH}/${_PORTLIBS_FLAVOR}/include"
"${PORTLIBS_PATH}/${_PORTLIBS_FLAVOR}/include/SDL2"
"${PORTLIBS_PATH}/ppc/include"
) )
target_link_directories(${DUSK_LIBRARY_TARGET_NAME} PRIVATE target_compile_definitions(${DUSK_LIBRARY_TARGET_NAME} PUBLIC
"${_LIBOGC_LIBDIR}" DOLPHIN
"${PORTLIBS_PATH}/${_PORTLIBS_FLAVOR}/lib"
"${PORTLIBS_PATH}/ppc/lib"
) )
set(Lua_FOUND TRUE)
set(libzip_FOUND TRUE)
# Custom flags for cglm # Custom flags for cglm
# set(CGLM_SHARED OFF CACHE BOOL "Build cglm shared" FORCE) set(CGLM_SHARED OFF CACHE BOOL "Build cglm shared" FORCE)
# set(CGLM_STATIC ON CACHE BOOL "Build cglm static" FORCE) set(CGLM_STATIC ON CACHE BOOL "Build cglm static" FORCE)
# find_package(cglm REQUIRED) find_package(cglm REQUIRED)
# Compile lua # Compile lua
# include(FetchContent) include(FetchContent)
# FetchContent_Declare( FetchContent_Declare(
# liblua liblua
# URL https://www.lua.org/ftp/lua-5.5.0.tar.gz URL https://www.lua.org/ftp/lua-5.5.0.tar.gz
# ) )
# FetchContent_MakeAvailable(liblua) FetchContent_MakeAvailable(liblua)
# set(LUA_SRC_DIR "${liblua_SOURCE_DIR}/src") set(LUA_SRC_DIR "${liblua_SOURCE_DIR}/src")
# set(LUA_C_FILES set(LUA_C_FILES
# lapi.c lauxlib.c lbaselib.c lcode.c lcorolib.c lctype.c ldblib.c ldebug.c lapi.c lauxlib.c lbaselib.c lcode.c lcorolib.c lctype.c ldblib.c ldebug.c
# ldo.c ldump.c lfunc.c lgc.c linit.c liolib.c llex.c lmathlib.c lmem.c ldo.c ldump.c lfunc.c lgc.c linit.c liolib.c llex.c lmathlib.c lmem.c
# loadlib.c lobject.c lopcodes.c loslib.c lparser.c lstate.c lstring.c loadlib.c lobject.c lopcodes.c loslib.c lparser.c lstate.c lstring.c
# lstrlib.c ltable.c ltablib.c ltm.c lundump.c lutf8lib.c lvm.c lzio.c lstrlib.c ltable.c ltablib.c ltm.c lundump.c lutf8lib.c lvm.c lzio.c
# ) )
# list(TRANSFORM LUA_C_FILES PREPEND "${LUA_SRC_DIR}/") list(TRANSFORM LUA_C_FILES PREPEND "${LUA_SRC_DIR}/")
# add_library(liblua STATIC ${LUA_C_FILES}) add_library(liblua STATIC ${LUA_C_FILES})
# target_include_directories(liblua PUBLIC "${LUA_SRC_DIR}") target_include_directories(liblua PUBLIC "${LUA_SRC_DIR}")
# target_compile_definitions(liblua PRIVATE LUA_USE_C89) target_compile_definitions(liblua PRIVATE LUA_USE_C89)
# add_library(lua::lua ALIAS liblua) add_library(lua::lua ALIAS liblua)
set(Lua_FOUND TRUE CACHE BOOL "Lua found" FORCE)
target_link_libraries(${DUSK_LIBRARY_TARGET_NAME} PUBLIC target_link_libraries(${DUSK_LIBRARY_TARGET_NAME} PRIVATE
# cglm cglm
# liblua liblua
# zip
# bz2
# z
SDL2_ttf
m
harfbuzz
SDL2_gfx
SDL2_mixer
m
stdc++ stdc++
ogg
vorbisidec
modplug
mpg123
opusfile
opus
FLAC
SDL2_image
SDL2main
SDL2
pthread
aesnd
opengx
fat
ogc ogc
png16 m
z
jpeg
freetype
) )
endif() endif()
@@ -247,7 +184,7 @@ endif()
set(ENABLE_TESTS OFF CACHE BOOL "Enable tests" FORCE) set(ENABLE_TESTS OFF CACHE BOOL "Enable tests" FORCE)
# Add code # Add code
add_subdirectory(src2) add_subdirectory(${DUSK_SOURCES_DIR})
# Handle tests # Handle tests
if(ENABLE_TESTS) if(ENABLE_TESTS)

10
opengl.pc.in Normal file
View File

@@ -0,0 +1,10 @@
prefix=@CMAKE_INSTALL_PREFIX@
libdir=${prefix}/lib
includedir=${prefix}/include
Name: OpenGL
Description: OpenGL (without GLX) library and headers.
Version: @PROJECT_VERSION@
Libs.private: -lstdc++ -logc -lm
Libs: -L${libdir} -lopengx
Cflags: -I${includedir}

View File

@@ -8,11 +8,21 @@
#pragma once #pragma once
#if DISPLAY_SDL2 #if DISPLAY_SDL2
#include <SDL2/SDL.h> #if DOLPHIN
#include "dusk.h"
#include <GL/glu.h>
#include <SDL.h>
#include <SDL_opengl.h>
#define GL_COLOR_INDEX8_EXT GX_RGBA8
#define GL_GLEXT_PROTOTYPES #else
#include <GL/gl.h> #include <SDL2/SDL.h>
#include <GL/glext.h>
#define GL_GLEXT_PROTOTYPES
#include <GL/gl.h>
#include <GL/glext.h>
#endif
#ifndef DISPLAY_SIZE_DYNAMIC #ifndef DISPLAY_SIZE_DYNAMIC
#define DISPLAY_SIZE_DYNAMIC 1 #define DISPLAY_SIZE_DYNAMIC 1

View File

@@ -102,12 +102,16 @@ void frameBufferBind(const framebuffer_t *framebuffer) {
if(framebuffer == &FRAMEBUFFER_BACKBUFFER) { if(framebuffer == &FRAMEBUFFER_BACKBUFFER) {
#if PSP #if PSP
#elif DOLPHIN
#else #else
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
#endif #endif
} else { } else {
#if PSP #if PSP
assertUnreachable("Framebuffers not supported on PSP"); assertUnreachable("Framebuffers not supported on PSP");
#elif DOLPHIN
assertUnreachable("Framebuffers not supported on DOLPHIN");
#else #else
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, framebuffer->id); glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, framebuffer->id);
#endif #endif
@@ -140,7 +144,11 @@ void frameBufferClear(uint8_t flags, color_t color) {
glFlags |= GL_DEPTH_BUFFER_BIT; glFlags |= GL_DEPTH_BUFFER_BIT;
} }
glClear(glFlags); #if DOLPHIN
assertUnreachable("Framebuffers not supported on DOLPHIN");
#else
glClear(glFlags);
#endif
#endif #endif
} }

View File

@@ -77,6 +77,8 @@ void textureInit(
#if PSP #if PSP
havePalTex = true; havePalTex = true;
#elif DOLPHIN
havePalTex = false;
#else #else
GLint mask = 0; GLint mask = 0;
glGetIntegerv(GL_CONTEXT_PROFILE_MASK, &mask); glGetIntegerv(GL_CONTEXT_PROFILE_MASK, &mask);
@@ -125,10 +127,14 @@ void textureInit(
GL_UNSIGNED_BYTE, (void*)data.palette.data GL_UNSIGNED_BYTE, (void*)data.palette.data
); );
glColorTableEXT( #if DOLPHIN
GL_TEXTURE_2D, GL_RGBA, pal->colorCount, GL_RGBA, assertUnreachable("Paletted textures not supported on DOLPHIN");
GL_UNSIGNED_BYTE, (const void*)pal->colors #else
); glColorTableEXT(
GL_TEXTURE_2D, GL_RGBA, pal->colorCount, GL_RGBA,
GL_UNSIGNED_BYTE, (const void*)pal->colors
);
#endif
} }
break; break;

View File

@@ -31,7 +31,6 @@
#if DOLPHIN #if DOLPHIN
#include <gccore.h> #include <gccore.h>
#include <SDL2/SDL.h>
#endif #endif
typedef bool bool_t; typedef bool bool_t;

View File

@@ -16,9 +16,9 @@ target_include_directories(${DUSK_LIBRARY_TARGET_NAME}
# Main Binary Source # Main Binary Source
target_sources(${DUSK_BINARY_TARGET_NAME} target_sources(${DUSK_BINARY_TARGET_NAME}
PRIVATE PRIVATE
main.cpp main.c
sdl_starter.cpp sdl_starter.c
sdl_assets_loader.cpp sdl_assets_loader.c
) )
# Defs # Defs

View File

@@ -2,8 +2,8 @@
#include "sdl_starter.h" #include "sdl_starter.h"
#include "sdl_assets_loader.h" #include "sdl_assets_loader.h"
SDL_Window *window = nullptr; SDL_Window *window = NULL;
SDL_Renderer *renderer = nullptr; SDL_Renderer *renderer = NULL;
const int PLAYER_SPEED = 600; const int PLAYER_SPEED = 600;

10
src2/null.c Normal file
View File

@@ -0,0 +1,10 @@
/**
* Copyright (c) 2026 Dominic Masters
*
* This software is released under the MIT License.
* https://opensource.org/licenses/MIT
*/
void dusk_null_method(void) {
return;
}

View File

@@ -6,7 +6,7 @@ Sprite loadSprite(SDL_Renderer *renderer, const char *filePath, int positionX, i
SDL_Texture *texture = IMG_LoadTexture(renderer, filePath); SDL_Texture *texture = IMG_LoadTexture(renderer, filePath);
if (texture != nullptr) if (texture != NULL)
{ {
SDL_QueryTexture(texture, NULL, NULL, &textureBounds.w, &textureBounds.h); SDL_QueryTexture(texture, NULL, NULL, &textureBounds.w, &textureBounds.h);
} }
@@ -16,12 +16,13 @@ Sprite loadSprite(SDL_Renderer *renderer, const char *filePath, int positionX, i
return sprite; return sprite;
} }
Mix_Chunk *loadSound(const char *filePath) Mix_Chunk *loadSound(const char *filePath)
{ {
Mix_Chunk *sound = nullptr; Mix_Chunk *sound = NULL;
sound = Mix_LoadWAV(filePath); sound = Mix_LoadWAV(filePath);
if (sound == nullptr) if (sound == NULL)
{ {
printf("Failed to load scratch sound effect! SDL_mixer Error: %s\n", Mix_GetError()); printf("Failed to load scratch sound effect! SDL_mixer Error: %s\n", Mix_GetError());
} }
@@ -29,12 +30,13 @@ Mix_Chunk *loadSound(const char *filePath)
return sound; return sound;
} }
Mix_Music *loadMusic(const char *filePath) Mix_Music *loadMusic(const char *filePath)
{ {
Mix_Music *music = nullptr; Mix_Music *music = NULL;
music = Mix_LoadMUS(filePath); music = Mix_LoadMUS(filePath);
if (music == nullptr) if (music == NULL)
{ {
printf("Failed to load music! SDL_mixer Error: %s\n", Mix_GetError()); printf("Failed to load music! SDL_mixer Error: %s\n", Mix_GetError());
} }
@@ -42,26 +44,27 @@ Mix_Music *loadMusic(const char *filePath)
return music; return music;
} }
void updateTextureText(SDL_Texture *&texture, const char *text, TTF_Font *&fontSquare, SDL_Renderer *renderer)
void updateTextureText(SDL_Texture **texture, const char *text, TTF_Font **fontSquare, SDL_Renderer *renderer)
{ {
SDL_Color fontColor = {255, 255, 255}; SDL_Color fontColor = {255, 255, 255};
if (fontSquare == nullptr) if (*fontSquare == NULL)
{ {
printf("TTF_OpenFont fontSquare: %s\n", TTF_GetError()); printf("TTF_OpenFont fontSquare: %s\n", TTF_GetError());
} }
SDL_Surface *surface = TTF_RenderUTF8_Blended(fontSquare, text, fontColor); SDL_Surface *surface = TTF_RenderUTF8_Blended(*fontSquare, text, fontColor);
if (surface == nullptr) if (surface == NULL)
{ {
printf("TTF_OpenFont: %s\n", TTF_GetError()); printf("TTF_OpenFont: %s\n", TTF_GetError());
SDL_LogError(SDL_LOG_CATEGORY_ERROR, "Unable to create text surface! SDL Error: %s\n", SDL_GetError()); SDL_LogError(SDL_LOG_CATEGORY_ERROR, "Unable to create text surface! SDL Error: %s\n", SDL_GetError());
exit(3); exit(3);
} }
SDL_DestroyTexture(texture); SDL_DestroyTexture(*texture);
texture = SDL_CreateTextureFromSurface(renderer, surface); *texture = SDL_CreateTextureFromSurface(renderer, surface);
if (texture == nullptr) if (*texture == NULL)
{ {
printf("TTF_OpenFont: %s\n", TTF_GetError()); printf("TTF_OpenFont: %s\n", TTF_GetError());
SDL_LogError(SDL_LOG_CATEGORY_ERROR, "Unable to create texture from surface! SDL Error: %s\n", SDL_GetError()); SDL_LogError(SDL_LOG_CATEGORY_ERROR, "Unable to create texture from surface! SDL Error: %s\n", SDL_GetError());

View File

@@ -4,7 +4,6 @@
#include <SDL2/SDL_image.h> #include <SDL2/SDL_image.h>
#include <SDL2/SDL_mixer.h> #include <SDL2/SDL_mixer.h>
#include <SDL2/SDL_ttf.h> #include <SDL2/SDL_ttf.h>
#include <iostream>
typedef struct typedef struct
{ {
@@ -18,4 +17,4 @@ Mix_Chunk *loadSound(const char *filePath);
Mix_Music *loadMusic(const char *filePath); Mix_Music *loadMusic(const char *filePath);
void updateTextureText(SDL_Texture *&texture, const char *text, TTF_Font *&fontSquare, SDL_Renderer *renderer); void updateTextureText(SDL_Texture **texture, const char *text, TTF_Font **fontSquare, SDL_Renderer *renderer);

View File

@@ -1,44 +1,51 @@
#include "sdl_starter.h" #include "sdl_starter.h"
#include <SDL2/SDL_image.h> #include <SDL2/SDL_image.h>
#include <SDL2/SDL_mixer.h> #include <SDL2/SDL_mixer.h>
#include <SDL2/SDL_ttf.h> #include <SDL2/SDL_ttf.h>
#include <iostream> #include <stdio.h>
int startSDL(SDL_Window *window, SDL_Renderer *renderer) { int startSDL(SDL_Window *window, SDL_Renderer *renderer) {
if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_JOYSTICK) < 0) if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_JOYSTICK) < 0)
{ {
std::cout << "SDL crashed. Error: " << SDL_GetError(); printf("SDL crashed. Error: %s\n", SDL_GetError());
return 1; return 1;
} }
if (window == nullptr)
if (window == NULL)
{ {
std::cerr << "Failed to create window: " << SDL_GetError() << std::endl; fprintf(stderr, "Failed to create window: %s\n", SDL_GetError());
SDL_Quit(); SDL_Quit();
return 1; return 1;
} }
if (renderer == nullptr)
if (renderer == NULL)
{ {
std::cerr << "Failed to create renderer: " << SDL_GetError() << std::endl; fprintf(stderr, "Failed to create renderer: %s\n", SDL_GetError());
SDL_DestroyWindow(window); SDL_DestroyWindow(window);
SDL_Quit(); SDL_Quit();
return 1; return 1;
} }
if (!IMG_Init(IMG_INIT_PNG)) if (!IMG_Init(IMG_INIT_PNG))
{ {
std::cout << "SDL_image crashed. Error: " << SDL_GetError(); printf("SDL_image crashed. Error: %s\n", SDL_GetError());
return 1; return 1;
} }
if (Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, 2, 2048) < 0) if (Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, 2, 2048) < 0)
{ {
printf("SDL_mixer could not initialize! SDL_mixer Error: %s\n", Mix_GetError()); printf("SDL_mixer could not initialize! SDL_mixer Error: %s\n", Mix_GetError());
return 1; return 1;
} }
if (TTF_Init() == -1) if (TTF_Init() == -1)
{ {
return 1; return 1;

View File

@@ -1,8 +1,15 @@
#pragma once /**
* Copyright (c) 2026 Dominic Masters
*
* This software is released under the MIT License.
* https://opensource.org/licenses/MIT
*/
#pragma once
#include <SDL2/SDL.h> #include <SDL2/SDL.h>
const int SCREEN_WIDTH = 640; #define SCREEN_WIDTH 640
const int SCREEN_HEIGHT = 480; #define SCREEN_HEIGHT 480
int startSDL(SDL_Window *window, SDL_Renderer *renderer); int startSDL(SDL_Window *window, SDL_Renderer *renderer);