Actually compiled
This commit is contained in:
@@ -1,10 +1,11 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
docker build -t myapp:latest -f .ci/dolphin/Dockerfile .
|
docker build -t myapp:latest -f .ci/dolphin/Dockerfile .
|
||||||
docker run -it -v ./:/workdir myapp:latest /bin/bash -c ' \
|
docker run -it -v ./:/workdir myapp:latest /bin/bash -c ' \
|
||||||
|
export PATH="$DEVKITPPC/bin:$PATH" && \
|
||||||
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"
|
cmake -S. -Bbuild2 -DDUSK_TARGET_SYSTEM=gamecube -DCMAKE_TOOLCHAIN_FILE="$DEVKITPRO/cmake/GameCube.cmake" && \
|
||||||
cd build2 && \
|
cd build2 && \
|
||||||
make VERBOSE=1 \
|
make VERBOSE=1 \
|
||||||
'
|
'
|
||||||
|
|||||||
@@ -4,7 +4,8 @@
|
|||||||
# https://opensource.org/licenses/MIT
|
# https://opensource.org/licenses/MIT
|
||||||
|
|
||||||
# Setup
|
# Setup
|
||||||
cmake_minimum_required(VERSION 3.13)
|
cmake_minimum_required(VERSION 3.18)
|
||||||
|
|
||||||
set(CMAKE_C_STANDARD 11)
|
set(CMAKE_C_STANDARD 11)
|
||||||
set(CMAKE_C_STANDARD_REQUIRED ON)
|
set(CMAKE_C_STANDARD_REQUIRED ON)
|
||||||
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules)
|
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules)
|
||||||
@@ -17,7 +18,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}/src2")
|
set(DUSK_SOURCES_DIR "${DUSK_ROOT_DIR}/src")
|
||||||
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")
|
||||||
@@ -118,27 +119,11 @@ 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")
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-rtti -fno-exceptions")
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-rtti -fno-exceptions")
|
||||||
|
|
||||||
configure_file(opengl.pc.in opengl.pc @ONLY)
|
configure_file(opengl.pc.in opengl.pc @ONLY)
|
||||||
|
|
||||||
find_package(PkgConfig REQUIRED)
|
find_package(PkgConfig REQUIRED)
|
||||||
pkg_check_modules(SDL2 IMPORTED_TARGET sdl2)
|
|
||||||
pkg_check_modules(SDL2_ttf IMPORTED_TARGET SDL2_ttf)
|
|
||||||
pkg_check_modules(SDL2_image IMPORTED_TARGET SDL2_image)
|
|
||||||
pkg_check_modules(SDL2_mixer IMPORTED_TARGET SDL2_mixer)
|
|
||||||
pkg_check_modules(OPENGL IMPORTED_TARGET opengl)
|
|
||||||
pkg_check_modules(zip IMPORTED_TARGET libzip)
|
pkg_check_modules(zip IMPORTED_TARGET libzip)
|
||||||
pkg_check_modules(GLU IMPORTED_TARGET glu)
|
|
||||||
pkg_check_modules(freetype2 IMPORTED_TARGET freetype2)
|
|
||||||
|
|
||||||
|
|
||||||
target_link_libraries(${DUSK_LIBRARY_TARGET_NAME} PUBLIC
|
|
||||||
PkgConfig::SDL2
|
|
||||||
PkgConfig::SDL2_ttf
|
|
||||||
PkgConfig::SDL2_image
|
|
||||||
PkgConfig::SDL2_mixer
|
|
||||||
PkgConfig::zip
|
|
||||||
PkgConfig::GLU
|
|
||||||
PkgConfig::freetype2
|
|
||||||
)
|
|
||||||
|
|
||||||
target_compile_definitions(${DUSK_LIBRARY_TARGET_NAME} PUBLIC
|
target_compile_definitions(${DUSK_LIBRARY_TARGET_NAME} PUBLIC
|
||||||
DOLPHIN
|
DOLPHIN
|
||||||
@@ -169,14 +154,12 @@ elseif(DUSK_TARGET_SYSTEM STREQUAL "gamecube" OR DUSK_TARGET_SYSTEM STREQUAL "wi
|
|||||||
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)
|
set(Lua_FOUND TRUE CACHE BOOL "Lua found" FORCE)
|
||||||
|
|
||||||
target_link_libraries(${DUSK_LIBRARY_TARGET_NAME} PRIVATE
|
target_link_libraries(${DUSK_LIBRARY_TARGET_NAME} PRIVATE
|
||||||
cglm
|
cglm
|
||||||
liblua
|
liblua
|
||||||
|
|
||||||
stdc++
|
|
||||||
ogc
|
|
||||||
m
|
m
|
||||||
|
PkgConfig::zip
|
||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|||||||
@@ -41,7 +41,6 @@ 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")
|
||||||
target_compile_definitions(${DUSK_LIBRARY_TARGET_NAME}
|
target_compile_definitions(${DUSK_LIBRARY_TARGET_NAME}
|
||||||
PUBLIC
|
PUBLIC
|
||||||
DISPLAY_SDL2=1
|
|
||||||
DISPLAY_WINDOW_WIDTH_DEFAULT=640
|
DISPLAY_WINDOW_WIDTH_DEFAULT=640
|
||||||
DISPLAY_WINDOW_HEIGHT_DEFAULT=480
|
DISPLAY_WINDOW_HEIGHT_DEFAULT=480
|
||||||
DISPLAY_WIDTH=640
|
DISPLAY_WIDTH=640
|
||||||
|
|||||||
@@ -133,12 +133,13 @@ errorret_t displayUpdate(void) {
|
|||||||
|
|
||||||
#if DISPLAY_SDL2
|
#if DISPLAY_SDL2
|
||||||
SDL_GL_SwapWindow(DISPLAY.window);
|
SDL_GL_SwapWindow(DISPLAY.window);
|
||||||
|
|
||||||
|
GLenum err;
|
||||||
|
while((err = glGetError()) != GL_NO_ERROR) {
|
||||||
|
debugPrint("GL Error: %d\n", err);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
GLenum err;
|
|
||||||
while((err = glGetError()) != GL_NO_ERROR) {
|
|
||||||
debugPrint("GL Error: %d\n", err);
|
|
||||||
}
|
|
||||||
|
|
||||||
// For now, we just return an OK error.
|
// For now, we just return an OK error.
|
||||||
errorOk();
|
errorOk();
|
||||||
|
|||||||
@@ -8,25 +8,17 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#if DISPLAY_SDL2
|
#if DISPLAY_SDL2
|
||||||
#if DOLPHIN
|
#include <SDL2/SDL.h>
|
||||||
#include "dusk.h"
|
|
||||||
#include <GL/glu.h>
|
|
||||||
#include <SDL.h>
|
|
||||||
#include <SDL_opengl.h>
|
|
||||||
|
|
||||||
#define GL_COLOR_INDEX8_EXT GX_RGBA8
|
|
||||||
|
|
||||||
#else
|
#define GL_GLEXT_PROTOTYPES
|
||||||
#include <SDL2/SDL.h>
|
#include <GL/gl.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
|
||||||
#endif
|
#endif
|
||||||
|
#elif DOLPHIN
|
||||||
|
// Dolphin.
|
||||||
#else
|
#else
|
||||||
#error "Need to specify display backend."
|
#error "Need to specify display backend."
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -102,16 +102,12 @@ 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
|
||||||
@@ -144,11 +140,7 @@ void frameBufferClear(uint8_t flags, color_t color) {
|
|||||||
glFlags |= GL_DEPTH_BUFFER_BIT;
|
glFlags |= GL_DEPTH_BUFFER_BIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if DOLPHIN
|
glClear(glFlags);
|
||||||
assertUnreachable("Framebuffers not supported on DOLPHIN");
|
|
||||||
#else
|
|
||||||
glClear(glFlags);
|
|
||||||
#endif
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -16,6 +16,9 @@ typedef struct {
|
|||||||
// OpenGL Framebuffer Object ID
|
// OpenGL Framebuffer Object ID
|
||||||
GLuint id;
|
GLuint id;
|
||||||
texture_t texture;
|
texture_t texture;
|
||||||
|
#elif DOLPHIN
|
||||||
|
// --- IGNORE ---
|
||||||
|
uint8_t id;
|
||||||
#else
|
#else
|
||||||
#error "Framebuffers not implemented on this platform."
|
#error "Framebuffers not implemented on this platform."
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -12,6 +12,10 @@ typedef enum {
|
|||||||
MESH_PRIMITIVE_TRIANGLES = GL_TRIANGLES,
|
MESH_PRIMITIVE_TRIANGLES = GL_TRIANGLES,
|
||||||
MESH_PRIMITIVE_LINES = GL_LINES,
|
MESH_PRIMITIVE_LINES = GL_LINES,
|
||||||
MESH_PRIMITIVE_POINTS = GL_POINTS,
|
MESH_PRIMITIVE_POINTS = GL_POINTS,
|
||||||
|
#elif DOLPHIN
|
||||||
|
MESH_PRIMITIVE_TRIANGLES = GX_TRIANGLES,
|
||||||
|
MESH_PRIMITIVE_LINES = GX_LINES,
|
||||||
|
MESH_PRIMITIVE_POINTS = GX_POINTS,
|
||||||
#endif
|
#endif
|
||||||
} meshprimitivetype_t;
|
} meshprimitivetype_t;
|
||||||
|
|
||||||
@@ -19,11 +23,9 @@ typedef enum {
|
|||||||
#define MESH_VERTEX_POS_SIZE 3
|
#define MESH_VERTEX_POS_SIZE 3
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
#if DISPLAY_SDL2
|
color4b_t color;
|
||||||
color4b_t color;
|
float uv[MESH_VERTEX_UV_SIZE];
|
||||||
GLfloat uv[MESH_VERTEX_UV_SIZE];
|
float pos[MESH_VERTEX_POS_SIZE];
|
||||||
GLfloat pos[MESH_VERTEX_POS_SIZE];
|
|
||||||
#endif
|
|
||||||
} meshvertex_t;
|
} meshvertex_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
|||||||
@@ -77,8 +77,6 @@ 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);
|
||||||
@@ -127,14 +125,10 @@ void textureInit(
|
|||||||
GL_UNSIGNED_BYTE, (void*)data.palette.data
|
GL_UNSIGNED_BYTE, (void*)data.palette.data
|
||||||
);
|
);
|
||||||
|
|
||||||
#if DOLPHIN
|
glColorTableEXT(
|
||||||
assertUnreachable("Paletted textures not supported on DOLPHIN");
|
GL_TEXTURE_2D, GL_RGBA, pal->colorCount, GL_RGBA,
|
||||||
#else
|
GL_UNSIGNED_BYTE, (const void*)pal->colors
|
||||||
glColorTableEXT(
|
);
|
||||||
GL_TEXTURE_2D, GL_RGBA, pal->colorCount, GL_RGBA,
|
|
||||||
GL_UNSIGNED_BYTE, (const void*)pal->colors
|
|
||||||
);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -14,12 +14,18 @@ typedef enum {
|
|||||||
TEXTURE_FORMAT_RGBA = GL_RGBA,
|
TEXTURE_FORMAT_RGBA = GL_RGBA,
|
||||||
TEXTURE_FORMAT_ALPHA = GL_ALPHA,
|
TEXTURE_FORMAT_ALPHA = GL_ALPHA,
|
||||||
TEXTURE_FORMAT_PALETTE = GL_COLOR_INDEX8_EXT,
|
TEXTURE_FORMAT_PALETTE = GL_COLOR_INDEX8_EXT,
|
||||||
|
#elif DOLPHIN
|
||||||
|
TEXTURE_FORMAT_RGBA = GX_TF_RGBA8,
|
||||||
|
TEXTURE_FORMAT_ALPHA = GX_TF_A8,
|
||||||
|
TEXTURE_FORMAT_PALETTE = GX_TF_CI8,
|
||||||
#endif
|
#endif
|
||||||
} textureformat_t;
|
} textureformat_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
#if DISPLAY_SDL2
|
#if DISPLAY_SDL2
|
||||||
GLuint id;
|
GLuint id;
|
||||||
|
#elif DOLPHIN
|
||||||
|
uint8_t id;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int32_t width;
|
int32_t width;
|
||||||
|
|||||||
@@ -19,16 +19,17 @@ if(DUSK_TARGET_SYSTEM STREQUAL "linux")
|
|||||||
INPUT_MOUSE=1
|
INPUT_MOUSE=1
|
||||||
INPUT_GAMEPAD=1
|
INPUT_GAMEPAD=1
|
||||||
)
|
)
|
||||||
|
|
||||||
elseif(DUSK_TARGET_SYSTEM STREQUAL "psp")
|
elseif(DUSK_TARGET_SYSTEM STREQUAL "psp")
|
||||||
target_compile_definitions(${DUSK_LIBRARY_TARGET_NAME}
|
target_compile_definitions(${DUSK_LIBRARY_TARGET_NAME}
|
||||||
PUBLIC
|
PUBLIC
|
||||||
INPUT_SDL2=1
|
INPUT_SDL2=1
|
||||||
INPUT_GAMEPAD=1
|
INPUT_GAMEPAD=1
|
||||||
)
|
)
|
||||||
|
|
||||||
elseif(DUSK_TARGET_SYSTEM STREQUAL "gamecube" OR DUSK_TARGET_SYSTEM STREQUAL "wii")
|
elseif(DUSK_TARGET_SYSTEM STREQUAL "gamecube" OR DUSK_TARGET_SYSTEM STREQUAL "wii")
|
||||||
target_compile_definitions(${DUSK_LIBRARY_TARGET_NAME}
|
target_compile_definitions(${DUSK_LIBRARY_TARGET_NAME}
|
||||||
PUBLIC
|
PUBLIC
|
||||||
INPUT_SDL2=1
|
|
||||||
INPUT_GAMEPAD=1
|
INPUT_GAMEPAD=1
|
||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|||||||
@@ -31,7 +31,6 @@ inputbuttondata_t INPUT_BUTTON_DATA[] = {
|
|||||||
{ .name = "lstick_negative_x", { .type = INPUT_BUTTON_TYPE_GAMEPAD_AXIS, .gpAxis = { .axis = SDL_CONTROLLER_AXIS_LEFTX, .positive = false } } },
|
{ .name = "lstick_negative_x", { .type = INPUT_BUTTON_TYPE_GAMEPAD_AXIS, .gpAxis = { .axis = SDL_CONTROLLER_AXIS_LEFTX, .positive = false } } },
|
||||||
{ .name = "lstick_positive_y", { .type = INPUT_BUTTON_TYPE_GAMEPAD_AXIS, .gpAxis = { .axis = SDL_CONTROLLER_AXIS_LEFTY, .positive = true } } },
|
{ .name = "lstick_positive_y", { .type = INPUT_BUTTON_TYPE_GAMEPAD_AXIS, .gpAxis = { .axis = SDL_CONTROLLER_AXIS_LEFTY, .positive = true } } },
|
||||||
{ .name = "lstick_negative_y", { .type = INPUT_BUTTON_TYPE_GAMEPAD_AXIS, .gpAxis = { .axis = SDL_CONTROLLER_AXIS_LEFTY, .positive = false } } },
|
{ .name = "lstick_negative_y", { .type = INPUT_BUTTON_TYPE_GAMEPAD_AXIS, .gpAxis = { .axis = SDL_CONTROLLER_AXIS_LEFTY, .positive = false } } },
|
||||||
#else
|
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -172,6 +171,30 @@ inputbuttondata_t INPUT_BUTTON_DATA[] = {
|
|||||||
{ .name = "kp_enter", { .type = INPUT_BUTTON_TYPE_KEYBOARD, .scancode = SDL_SCANCODE_KP_ENTER } },
|
{ .name = "kp_enter", { .type = INPUT_BUTTON_TYPE_KEYBOARD, .scancode = SDL_SCANCODE_KP_ENTER } },
|
||||||
{ .name = "kp_equals", { .type = INPUT_BUTTON_TYPE_KEYBOARD, .scancode = SDL_SCANCODE_KP_EQUALS } },
|
{ .name = "kp_equals", { .type = INPUT_BUTTON_TYPE_KEYBOARD, .scancode = SDL_SCANCODE_KP_EQUALS } },
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#elif DOLPHIN
|
||||||
|
#if INPUT_GAMEPAD == 1
|
||||||
|
{ .name = "a", { .type = INPUT_BUTTON_TYPE_GAMEPAD, .gpButton = PAD_BUTTON_A } },
|
||||||
|
{ .name = "b", { .type = INPUT_BUTTON_TYPE_GAMEPAD, .gpButton = PAD_BUTTON_B } },
|
||||||
|
{ .name = "x", { .type = INPUT_BUTTON_TYPE_GAMEPAD, .gpButton = PAD_BUTTON_X } },
|
||||||
|
{ .name = "y", { .type = INPUT_BUTTON_TYPE_GAMEPAD, .gpButton = PAD_BUTTON_Y } },
|
||||||
|
{ .name = "start", { .type = INPUT_BUTTON_TYPE_GAMEPAD, .gpButton = PAD_BUTTON_START } },
|
||||||
|
{ .name = "dpad_up", { .type = INPUT_BUTTON_TYPE_GAMEPAD, .gpButton = PAD_BUTTON_UP } },
|
||||||
|
{ .name = "dpad_down", { .type = INPUT_BUTTON_TYPE_GAMEPAD, .gpButton = PAD_BUTTON_DOWN } },
|
||||||
|
{ .name = "dpad_left", { .type = INPUT_BUTTON_TYPE_GAMEPAD, .gpButton = PAD_BUTTON_LEFT } },
|
||||||
|
{ .name = "dpad_right", { .type = INPUT_BUTTON_TYPE_GAMEPAD, .gpButton = PAD_BUTTON_RIGHT } },
|
||||||
|
{ .name = "l", { .type = INPUT_BUTTON_TYPE_GAMEPAD, .gpButton = PAD_TRIGGER_L } },
|
||||||
|
{ .name = "r", { .type = INPUT_BUTTON_TYPE_GAMEPAD, .gpButton = PAD_TRIGGER_R } },
|
||||||
|
{ .name = "z", { .type = INPUT_BUTTON_TYPE_GAMEPAD, .gpButton = PAD_TRIGGER_Z } },
|
||||||
|
{ .name = "lstick_positive_x", { .type = INPUT_BUTTON_TYPE_GAMEPAD_AXIS, .gpAxis = { .axis = INPUT_GAMEPAD_AXIS_LEFT_X, .positive = true } } },
|
||||||
|
{ .name = "lstick_negative_x", { .type = INPUT_BUTTON_TYPE_GAMEPAD_AXIS, .gpAxis = { .axis = INPUT_GAMEPAD_AXIS_LEFT_X, .positive = false } } },
|
||||||
|
{ .name = "lstick_positive_y", { .type = INPUT_BUTTON_TYPE_GAMEPAD_AXIS, .gpAxis = { .axis = INPUT_GAMEPAD_AXIS_LEFT_Y, .positive = true } } },
|
||||||
|
{ .name = "lstick_negative_y", { .type = INPUT_BUTTON_TYPE_GAMEPAD_AXIS, .gpAxis = { .axis = INPUT_GAMEPAD_AXIS_LEFT_Y, .positive = false } } },
|
||||||
|
{ .name = "cstick_positive_x", { .type = INPUT_BUTTON_TYPE_GAMEPAD_AXIS, .gpAxis = { .axis = INPUT_GAMEPAD_AXIS_C_X, .positive = true } } },
|
||||||
|
{ .name = "cstick_negative_x", { .type = INPUT_BUTTON_TYPE_GAMEPAD_AXIS, .gpAxis = { .axis = INPUT_GAMEPAD_AXIS_C_X, .positive = false } } },
|
||||||
|
{ .name = "cstick_positive_y", { .type = INPUT_BUTTON_TYPE_GAMEPAD_AXIS, .gpAxis = { .axis = INPUT_GAMEPAD_AXIS_C_Y, .positive = true } } },
|
||||||
|
{ .name = "cstick_negative_y", { .type = INPUT_BUTTON_TYPE_GAMEPAD_AXIS, .gpAxis = { .axis = INPUT_GAMEPAD_AXIS_C_Y, .positive = false } } },
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
{ .name = NULL }
|
{ .name = NULL }
|
||||||
|
|||||||
@@ -10,6 +10,8 @@
|
|||||||
|
|
||||||
#if INPUT_SDL2 == 1
|
#if INPUT_SDL2 == 1
|
||||||
#include <SDL2/SDL.h>
|
#include <SDL2/SDL.h>
|
||||||
|
#elif DOLPHIN
|
||||||
|
|
||||||
#else
|
#else
|
||||||
#error "No input backend defined"
|
#error "No input backend defined"
|
||||||
#endif
|
#endif
|
||||||
@@ -26,6 +28,16 @@
|
|||||||
#if INPUT_SDL2 == 1
|
#if INPUT_SDL2 == 1
|
||||||
typedef SDL_GameControllerButton inputgamepadbutton_t;
|
typedef SDL_GameControllerButton inputgamepadbutton_t;
|
||||||
typedef SDL_GameControllerAxis inputgamepadaxis_t;
|
typedef SDL_GameControllerAxis inputgamepadaxis_t;
|
||||||
|
#elif DOLPHIN == 1
|
||||||
|
typedef u16 inputgamepadbutton_t;
|
||||||
|
typedef enum {
|
||||||
|
INPUT_GAMEPAD_AXIS_LEFT_X,
|
||||||
|
INPUT_GAMEPAD_AXIS_LEFT_Y,
|
||||||
|
INPUT_GAMEPAD_AXIS_C_X,
|
||||||
|
INPUT_GAMEPAD_AXIS_C_Y,
|
||||||
|
INPUT_GAMEPAD_AXIS_TRIGGER_LEFT,
|
||||||
|
INPUT_GAMEPAD_AXIS_TRIGGER_RIGHT
|
||||||
|
} inputgamepadaxis_t;
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -35,6 +47,7 @@ typedef enum {
|
|||||||
#if INPUT_KEYBOARD == 1
|
#if INPUT_KEYBOARD == 1
|
||||||
INPUT_BUTTON_TYPE_KEYBOARD,
|
INPUT_BUTTON_TYPE_KEYBOARD,
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if INPUT_GAMEPAD == 1
|
#if INPUT_GAMEPAD == 1
|
||||||
INPUT_BUTTON_TYPE_GAMEPAD,
|
INPUT_BUTTON_TYPE_GAMEPAD,
|
||||||
INPUT_BUTTON_TYPE_GAMEPAD_AXIS,
|
INPUT_BUTTON_TYPE_GAMEPAD_AXIS,
|
||||||
|
|||||||
@@ -1,27 +0,0 @@
|
|||||||
# Copyright (c) 2025 Dominic Masters
|
|
||||||
#
|
|
||||||
# This software is released under the MIT License.
|
|
||||||
# https://opensource.org/licenses/MIT
|
|
||||||
|
|
||||||
# Libs
|
|
||||||
|
|
||||||
# Includes
|
|
||||||
target_include_directories(${DUSK_LIBRARY_TARGET_NAME}
|
|
||||||
PUBLIC
|
|
||||||
${CMAKE_CURRENT_LIST_DIR}
|
|
||||||
)
|
|
||||||
|
|
||||||
# Sources
|
|
||||||
|
|
||||||
# Main Binary Source
|
|
||||||
target_sources(${DUSK_BINARY_TARGET_NAME}
|
|
||||||
PRIVATE
|
|
||||||
main.c
|
|
||||||
sdl_starter.c
|
|
||||||
sdl_assets_loader.c
|
|
||||||
)
|
|
||||||
|
|
||||||
# Defs
|
|
||||||
|
|
||||||
|
|
||||||
# Subdirs
|
|
||||||
159
src2/main.c
159
src2/main.c
@@ -1,159 +0,0 @@
|
|||||||
#include <gccore.h>
|
|
||||||
#include "sdl_starter.h"
|
|
||||||
#include "sdl_assets_loader.h"
|
|
||||||
|
|
||||||
SDL_Window *window = NULL;
|
|
||||||
SDL_Renderer *renderer = NULL;
|
|
||||||
|
|
||||||
const int PLAYER_SPEED = 600;
|
|
||||||
|
|
||||||
SDL_Rect player = {SCREEN_WIDTH / 2 - 64, SCREEN_HEIGHT / 2 - 64, 64, 64};
|
|
||||||
|
|
||||||
SDL_Rect ball = {SCREEN_WIDTH / 2 + 50, SCREEN_HEIGHT / 2, 32, 32};
|
|
||||||
|
|
||||||
int ballVelocityX = 400;
|
|
||||||
int ballVelocityY = 400;
|
|
||||||
|
|
||||||
int colorIndex;
|
|
||||||
|
|
||||||
SDL_Color colors[] = {
|
|
||||||
{128, 128, 128, 0}, // gray
|
|
||||||
{255, 255, 255, 0}, // white
|
|
||||||
{255, 0, 0, 0}, // red
|
|
||||||
{0, 255, 0, 0}, // green
|
|
||||||
{0, 0, 255, 0}, // blue
|
|
||||||
{255, 255, 0, 0}, // brown
|
|
||||||
{0, 255, 255, 0}, // cyan
|
|
||||||
{255, 0, 255, 0}, // purple
|
|
||||||
};
|
|
||||||
|
|
||||||
void quitGame()
|
|
||||||
{
|
|
||||||
SDL_DestroyRenderer(renderer);
|
|
||||||
SDL_DestroyWindow(window);
|
|
||||||
SDL_Quit();
|
|
||||||
}
|
|
||||||
|
|
||||||
void handleEvents()
|
|
||||||
{
|
|
||||||
SDL_Event event;
|
|
||||||
|
|
||||||
while (SDL_PollEvent(&event))
|
|
||||||
{
|
|
||||||
if (event.type == SDL_QUIT)
|
|
||||||
{
|
|
||||||
quitGame();
|
|
||||||
exit(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int rand_range(int min, int max)
|
|
||||||
{
|
|
||||||
return min + rand() / (RAND_MAX / (max - min + 1) + 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
void update(float deltaTime)
|
|
||||||
{
|
|
||||||
// PAD_ButtonsDown tells us which buttons were pressed in this loop
|
|
||||||
// this is a "one shot" state which will not fire again until the button has been released
|
|
||||||
const u32 padDown = PAD_ButtonsDown(0);
|
|
||||||
|
|
||||||
// PAD_ButtonsHeld tells us which buttons are keep pressing in this loop
|
|
||||||
const u32 padHeld = PAD_ButtonsHeld(0);
|
|
||||||
|
|
||||||
// We return to the launcher application via exit
|
|
||||||
if (padDown & PAD_BUTTON_START)
|
|
||||||
exit(0);
|
|
||||||
|
|
||||||
if (padHeld & PAD_BUTTON_LEFT && player.x > 0)
|
|
||||||
{
|
|
||||||
player.x -= PLAYER_SPEED * deltaTime;
|
|
||||||
}
|
|
||||||
|
|
||||||
else if (padHeld & PAD_BUTTON_RIGHT && player.x < SCREEN_WIDTH - player.w)
|
|
||||||
{
|
|
||||||
player.x += PLAYER_SPEED * deltaTime;
|
|
||||||
}
|
|
||||||
|
|
||||||
else if (padHeld & PAD_BUTTON_UP && player.y > 0)
|
|
||||||
{
|
|
||||||
player.y -= PLAYER_SPEED * deltaTime;
|
|
||||||
}
|
|
||||||
|
|
||||||
else if (padHeld & PAD_BUTTON_DOWN && player.y < SCREEN_HEIGHT - player.h)
|
|
||||||
{
|
|
||||||
player.y += PLAYER_SPEED * deltaTime;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ball.x < 0 || ball.x > SCREEN_WIDTH - ball.w)
|
|
||||||
{
|
|
||||||
ballVelocityX *= -1;
|
|
||||||
|
|
||||||
colorIndex = rand_range(0, 5);
|
|
||||||
}
|
|
||||||
|
|
||||||
else if (ball.y < 0 || ball.y > SCREEN_HEIGHT - ball.h)
|
|
||||||
{
|
|
||||||
ballVelocityY *= -1;
|
|
||||||
|
|
||||||
colorIndex = rand_range(0, 5);
|
|
||||||
}
|
|
||||||
|
|
||||||
else if (SDL_HasIntersection(&player, &ball))
|
|
||||||
{
|
|
||||||
ballVelocityX *= -1;
|
|
||||||
ballVelocityY *= -1;
|
|
||||||
|
|
||||||
colorIndex = rand_range(0, 5);
|
|
||||||
}
|
|
||||||
|
|
||||||
ball.x += ballVelocityX * deltaTime;
|
|
||||||
ball.y += ballVelocityY * deltaTime;
|
|
||||||
}
|
|
||||||
|
|
||||||
void render()
|
|
||||||
{
|
|
||||||
SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
|
|
||||||
SDL_RenderClear(renderer);
|
|
||||||
|
|
||||||
SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
|
|
||||||
|
|
||||||
SDL_RenderFillRect(renderer, &player);
|
|
||||||
|
|
||||||
SDL_SetRenderDrawColor(renderer, colors[colorIndex].r, colors[colorIndex].g, colors[colorIndex].b, 255);
|
|
||||||
|
|
||||||
SDL_RenderFillRect(renderer, &ball);
|
|
||||||
|
|
||||||
SDL_RenderPresent(renderer);
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
|
||||||
{
|
|
||||||
window = SDL_CreateWindow("My Window", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN);
|
|
||||||
renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
|
|
||||||
|
|
||||||
if (startSDL(window, renderer) > 0)
|
|
||||||
{
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
Uint32 previousFrameTime = SDL_GetTicks();
|
|
||||||
Uint32 currentFrameTime = previousFrameTime;
|
|
||||||
float deltaTime = 0.0f;
|
|
||||||
|
|
||||||
PAD_Init();
|
|
||||||
|
|
||||||
while (true)
|
|
||||||
{
|
|
||||||
PAD_ScanPads();
|
|
||||||
|
|
||||||
currentFrameTime = SDL_GetTicks();
|
|
||||||
deltaTime = (currentFrameTime - previousFrameTime) / 1000.0f;
|
|
||||||
previousFrameTime = currentFrameTime;
|
|
||||||
|
|
||||||
handleEvents();
|
|
||||||
update(deltaTime);
|
|
||||||
render();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
10
src2/null.c
10
src2/null.c
@@ -1,10 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2026 Dominic Masters
|
|
||||||
*
|
|
||||||
* This software is released under the MIT License.
|
|
||||||
* https://opensource.org/licenses/MIT
|
|
||||||
*/
|
|
||||||
|
|
||||||
void dusk_null_method(void) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
@@ -1,74 +0,0 @@
|
|||||||
#include "sdl_assets_loader.h"
|
|
||||||
|
|
||||||
Sprite loadSprite(SDL_Renderer *renderer, const char *filePath, int positionX, int positionY)
|
|
||||||
{
|
|
||||||
SDL_Rect textureBounds = {positionX, positionY, 0, 0};
|
|
||||||
|
|
||||||
SDL_Texture *texture = IMG_LoadTexture(renderer, filePath);
|
|
||||||
|
|
||||||
if (texture != NULL)
|
|
||||||
{
|
|
||||||
SDL_QueryTexture(texture, NULL, NULL, &textureBounds.w, &textureBounds.h);
|
|
||||||
}
|
|
||||||
|
|
||||||
Sprite sprite = {texture, textureBounds};
|
|
||||||
|
|
||||||
return sprite;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Mix_Chunk *loadSound(const char *filePath)
|
|
||||||
{
|
|
||||||
Mix_Chunk *sound = NULL;
|
|
||||||
|
|
||||||
sound = Mix_LoadWAV(filePath);
|
|
||||||
if (sound == NULL)
|
|
||||||
{
|
|
||||||
printf("Failed to load scratch sound effect! SDL_mixer Error: %s\n", Mix_GetError());
|
|
||||||
}
|
|
||||||
|
|
||||||
return sound;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Mix_Music *loadMusic(const char *filePath)
|
|
||||||
{
|
|
||||||
Mix_Music *music = NULL;
|
|
||||||
|
|
||||||
music = Mix_LoadMUS(filePath);
|
|
||||||
if (music == NULL)
|
|
||||||
{
|
|
||||||
printf("Failed to load music! SDL_mixer Error: %s\n", Mix_GetError());
|
|
||||||
}
|
|
||||||
|
|
||||||
return music;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void updateTextureText(SDL_Texture **texture, const char *text, TTF_Font **fontSquare, SDL_Renderer *renderer)
|
|
||||||
{
|
|
||||||
SDL_Color fontColor = {255, 255, 255};
|
|
||||||
|
|
||||||
if (*fontSquare == NULL)
|
|
||||||
{
|
|
||||||
printf("TTF_OpenFont fontSquare: %s\n", TTF_GetError());
|
|
||||||
}
|
|
||||||
|
|
||||||
SDL_Surface *surface = TTF_RenderUTF8_Blended(*fontSquare, text, fontColor);
|
|
||||||
if (surface == NULL)
|
|
||||||
{
|
|
||||||
printf("TTF_OpenFont: %s\n", TTF_GetError());
|
|
||||||
SDL_LogError(SDL_LOG_CATEGORY_ERROR, "Unable to create text surface! SDL Error: %s\n", SDL_GetError());
|
|
||||||
exit(3);
|
|
||||||
}
|
|
||||||
|
|
||||||
SDL_DestroyTexture(*texture);
|
|
||||||
*texture = SDL_CreateTextureFromSurface(renderer, surface);
|
|
||||||
if (*texture == NULL)
|
|
||||||
{
|
|
||||||
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_FreeSurface(surface);
|
|
||||||
}
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include <SDL2/SDL.h>
|
|
||||||
#include <SDL2/SDL_image.h>
|
|
||||||
#include <SDL2/SDL_mixer.h>
|
|
||||||
#include <SDL2/SDL_ttf.h>
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
SDL_Texture *texture;
|
|
||||||
SDL_Rect textureBounds;
|
|
||||||
} Sprite;
|
|
||||||
|
|
||||||
Sprite loadSprite(SDL_Renderer *renderer, const char *filePath, int positionX, int positionY);
|
|
||||||
|
|
||||||
Mix_Chunk *loadSound(const char *filePath);
|
|
||||||
|
|
||||||
Mix_Music *loadMusic(const char *filePath);
|
|
||||||
|
|
||||||
void updateTextureText(SDL_Texture **texture, const char *text, TTF_Font **fontSquare, SDL_Renderer *renderer);
|
|
||||||
@@ -1,55 +0,0 @@
|
|||||||
|
|
||||||
#include "sdl_starter.h"
|
|
||||||
#include <SDL2/SDL_image.h>
|
|
||||||
#include <SDL2/SDL_mixer.h>
|
|
||||||
#include <SDL2/SDL_ttf.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
int startSDL(SDL_Window *window, SDL_Renderer *renderer) {
|
|
||||||
|
|
||||||
|
|
||||||
if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_JOYSTICK) < 0)
|
|
||||||
{
|
|
||||||
printf("SDL crashed. Error: %s\n", SDL_GetError());
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (window == NULL)
|
|
||||||
{
|
|
||||||
fprintf(stderr, "Failed to create window: %s\n", SDL_GetError());
|
|
||||||
SDL_Quit();
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (renderer == NULL)
|
|
||||||
{
|
|
||||||
fprintf(stderr, "Failed to create renderer: %s\n", SDL_GetError());
|
|
||||||
SDL_DestroyWindow(window);
|
|
||||||
SDL_Quit();
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (!IMG_Init(IMG_INIT_PNG))
|
|
||||||
{
|
|
||||||
printf("SDL_image crashed. Error: %s\n", SDL_GetError());
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, 2, 2048) < 0)
|
|
||||||
{
|
|
||||||
printf("SDL_mixer could not initialize! SDL_mixer Error: %s\n", Mix_GetError());
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (TTF_Init() == -1)
|
|
||||||
{
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2026 Dominic Masters
|
|
||||||
*
|
|
||||||
* This software is released under the MIT License.
|
|
||||||
* https://opensource.org/licenses/MIT
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
#include <SDL2/SDL.h>
|
|
||||||
|
|
||||||
#define SCREEN_WIDTH 640
|
|
||||||
#define SCREEN_HEIGHT 480
|
|
||||||
|
|
||||||
int startSDL(SDL_Window *window, SDL_Renderer *renderer);
|
|
||||||
Reference in New Issue
Block a user