mirror of
https://github.com/isledecomp/isle-portable.git
synced 2026-01-11 18:41:14 +00:00
Merge 8c6ee038a1 into 3f974f7317
This commit is contained in:
commit
2228d4b12d
7
.github/workflows/ci.yml
vendored
7
.github/workflows/ci.yml
vendored
@ -46,8 +46,9 @@ jobs:
|
||||
- { name: 'iOS', os: 'macos-15', generator: 'Xcode', dx5: false, config: false, brew: true, werror: true, clang-tidy: false, cmake-args: '-DCMAKE_SYSTEM_NAME=iOS', ios: true }
|
||||
- { name: 'Emscripten', os: 'ubuntu-latest', generator: 'Ninja', dx5: false, config: false, emsdk: true, werror: true, clang-tidy: false, cmake-wrapper: 'emcmake' }
|
||||
- { name: 'Nintendo 3DS', os: 'ubuntu-latest', generator: 'Ninja', dx5: false, config: false, n3ds: true, werror: true, clang-tidy: false, container: 'devkitpro/devkitarm:latest', cmake-args: '-DCMAKE_TOOLCHAIN_FILE=/opt/devkitpro/cmake/3DS.cmake' }
|
||||
- { name: 'Xbox One', os: 'windows-latest', generator: 'Visual Studio 17 2022', dx5: false, config: false, msvc: true, werror: false, clang-tidy: false, vc-arch: 'amd64', cmake-args: '-DCMAKE_SYSTEM_NAME=WindowsStore -DCMAKE_SYSTEM_VERSION=10.0.26100.0', xbox-one: true}
|
||||
- { name: 'Android', os: 'ubuntu-latest', generator: 'Ninja', dx5: false, config: false, android: true, werror: true, clang-tidy: false,}
|
||||
- { name: 'Xbox One', os: 'windows-latest', generator: 'Visual Studio 17 2022', dx5: false, config: false, msvc: true, werror: false, clang-tidy: false, vc-arch: 'amd64', cmake-args: '-DCMAKE_SYSTEM_NAME=WindowsStore -DCMAKE_SYSTEM_VERSION=10.0.26100.0', xbox-one: true }
|
||||
- { name: 'Android', os: 'ubuntu-latest', generator: 'Ninja', dx5: false, config: false, android: true, werror: true, clang-tidy: false }
|
||||
- { name: 'Linux (Debug) [SDL2]',os: 'ubuntu-latest', generator: 'Ninja', dx5: false, config: true, linux: true, werror: true, clang-tidy: false, debug: true, sdl2: true }
|
||||
steps:
|
||||
- name: Setup vcvars
|
||||
if: ${{ !!matrix.msvc }}
|
||||
@ -170,7 +171,7 @@ jobs:
|
||||
-DENABLE_CLANG_TIDY=${{ !!matrix.clang-tidy }} \
|
||||
-DISLE_WERROR=${{ !!matrix.werror }} \
|
||||
-DISLE_DEBUG=${{ matrix.debug || 'OFF' }} \
|
||||
-Werror=dev
|
||||
${{ matrix.sdl2 && '-DUSE_SDL2=ON' || '-Werror=dev' }}
|
||||
|
||||
- name: Build (CMake)
|
||||
if: ${{ !matrix.android }}
|
||||
|
||||
59
3rdparty/CMakeLists.txt
vendored
59
3rdparty/CMakeLists.txt
vendored
@ -48,31 +48,42 @@ add_library(libsmacker STATIC
|
||||
)
|
||||
target_include_directories(libsmacker PUBLIC ${libsmacker_SOURCE_DIR})
|
||||
|
||||
if(DOWNLOAD_DEPENDENCIES)
|
||||
include(FetchContent)
|
||||
FetchContent_Declare(
|
||||
imgui
|
||||
GIT_REPOSITORY "https://github.com/ocornut/imgui"
|
||||
GIT_TAG f5befd2d29e66809cd1110a152e375a7f1981f06
|
||||
)
|
||||
FetchContent_MakeAvailable(imgui)
|
||||
else()
|
||||
set(imgui_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/imgui")
|
||||
endif()
|
||||
if(ISLE_DEBUG)
|
||||
if(DOWNLOAD_DEPENDENCIES)
|
||||
include(FetchContent)
|
||||
FetchContent_Declare(
|
||||
imgui
|
||||
GIT_REPOSITORY "https://github.com/ocornut/imgui"
|
||||
GIT_TAG f5befd2d29e66809cd1110a152e375a7f1981f06
|
||||
)
|
||||
FetchContent_MakeAvailable(imgui)
|
||||
else()
|
||||
set(imgui_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/imgui")
|
||||
endif()
|
||||
|
||||
add_library(imgui STATIC
|
||||
${imgui_SOURCE_DIR}/imgui.cpp
|
||||
${imgui_SOURCE_DIR}/imgui_draw.cpp
|
||||
${imgui_SOURCE_DIR}/imgui_tables.cpp
|
||||
${imgui_SOURCE_DIR}/imgui_widgets.cpp
|
||||
${imgui_SOURCE_DIR}/imgui_demo.cpp
|
||||
${imgui_SOURCE_DIR}/backends/imgui_impl_sdl3.cpp
|
||||
${imgui_SOURCE_DIR}/backends/imgui_impl_sdlrenderer3.cpp
|
||||
)
|
||||
target_include_directories(imgui PUBLIC ${imgui_SOURCE_DIR})
|
||||
target_link_libraries(imgui PUBLIC SDL3::Headers)
|
||||
target_link_libraries(imgui PRIVATE SDL3::SDL3)
|
||||
set_property(TARGET imgui PROPERTY CXX_CLANG_TIDY "")
|
||||
add_library(imgui STATIC
|
||||
${imgui_SOURCE_DIR}/imgui.cpp
|
||||
${imgui_SOURCE_DIR}/imgui_draw.cpp
|
||||
${imgui_SOURCE_DIR}/imgui_tables.cpp
|
||||
${imgui_SOURCE_DIR}/imgui_widgets.cpp
|
||||
${imgui_SOURCE_DIR}/imgui_demo.cpp
|
||||
)
|
||||
if(USE_SDL2)
|
||||
target_sources(imgui PRIVATE
|
||||
${imgui_SOURCE_DIR}/backends/imgui_impl_sdl2.cpp
|
||||
${imgui_SOURCE_DIR}/backends/imgui_impl_sdlrenderer2.cpp
|
||||
)
|
||||
else()
|
||||
target_sources(imgui PRIVATE
|
||||
${imgui_SOURCE_DIR}/backends/imgui_impl_sdl3.cpp
|
||||
${imgui_SOURCE_DIR}/backends/imgui_impl_sdlrenderer3.cpp
|
||||
)
|
||||
endif()
|
||||
|
||||
target_include_directories(imgui PUBLIC ${imgui_SOURCE_DIR})
|
||||
target_link_libraries(imgui PRIVATE SDL3::SDL3)
|
||||
set_property(TARGET imgui PROPERTY CXX_CLANG_TIDY "")
|
||||
endif()
|
||||
|
||||
if(DOWNLOAD_DEPENDENCIES)
|
||||
include(FetchContent)
|
||||
|
||||
18
3rdparty/sdl3-shim/CMakeLists.txt
vendored
Normal file
18
3rdparty/sdl3-shim/CMakeLists.txt
vendored
Normal file
@ -0,0 +1,18 @@
|
||||
file(GLOB SDL2_HEADERS "${SDL2_INCLUDE_DIR}/*.h")
|
||||
foreach(header IN LISTS SDL2_HEADERS)
|
||||
get_filename_component(fname ${header} NAME)
|
||||
configure_file(${header} ${CMAKE_CURRENT_BINARY_DIR}/SDL3/${fname} COPYONLY)
|
||||
endforeach()
|
||||
|
||||
add_library(SDL3_shim STATIC
|
||||
main.cpp
|
||||
)
|
||||
|
||||
target_link_libraries(SDL3_shim PUBLIC SDL2::SDL2)
|
||||
target_include_directories(SDL3_shim PUBLIC
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}"
|
||||
"${CMAKE_CURRENT_BINARY_DIR}"
|
||||
)
|
||||
|
||||
add_library(SDL3::SDL3 ALIAS SDL3_shim)
|
||||
add_library(SDL3::Headers ALIAS SDL3_shim)
|
||||
210
3rdparty/sdl3-shim/SDL3/SDL.h
vendored
Normal file
210
3rdparty/sdl3-shim/SDL3/SDL.h
vendored
Normal file
@ -0,0 +1,210 @@
|
||||
#pragma once
|
||||
|
||||
// https://wiki.libsdl.org/SDL3/README-migration#sdl_stdinch
|
||||
#define SDL_bool bool
|
||||
|
||||
#include <SDL2/SDL.h>
|
||||
#include <SDL2/SDL_keyboard.h>
|
||||
#include <SDL2/SDL_video.h>
|
||||
#include <SDL2/SDL_mouse.h>
|
||||
#include <SDL2/SDL_version.h>
|
||||
|
||||
#include "SDL_audio.h"
|
||||
#include "SDL_events.h"
|
||||
#include "SDL_filesystem.h"
|
||||
#include "SDL_gamepad.h"
|
||||
#include "SDL_iostream.h"
|
||||
#include "SDL_keycode.h"
|
||||
#include "SDL_main.h"
|
||||
#include "SDL_mutex.h"
|
||||
#include "SDL_pixels.h"
|
||||
#include "SDL_surface.h"
|
||||
#include "SDL_timer.h"
|
||||
#include "SDL_platform_defines.h"
|
||||
|
||||
#include <random>
|
||||
|
||||
static std::mt19937 rng(SDL_GetPerformanceCounter());
|
||||
inline Sint32 SDL_rand(const Sint32 n)
|
||||
{
|
||||
std::uniform_int_distribution dist(0, n - 1);
|
||||
return dist(rng);
|
||||
}
|
||||
inline float SDL_randf()
|
||||
{
|
||||
static std::uniform_real_distribution dist(0.0f, 1.0f);
|
||||
return dist(rng);
|
||||
}
|
||||
|
||||
#define SDL_strtok_r SDL_strtokr
|
||||
|
||||
// https://wiki.libsdl.org/SDL3/README-migration#sdl_logh
|
||||
|
||||
#define SDL_LogTrace SDL_LogVerbose
|
||||
|
||||
// https://wiki.libsdl.org/SDL3/README-migration#sdl_videoh
|
||||
|
||||
typedef int SDL_DisplayID;
|
||||
inline SDL_DisplayID SDL_GetPrimaryDisplay()
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
// Modified from 83bb0f9105922fd49282f0b931f7873a71877ac8 SDL_video.c#L1331
|
||||
inline SDL_DisplayMode** SDL_GetFullscreenDisplayModes(int displayID, int* count)
|
||||
{
|
||||
int i;
|
||||
if (count) *count = 0;
|
||||
|
||||
const int num_modes = SDL_GetNumDisplayModes(displayID);
|
||||
SDL_DisplayMode** result = static_cast<SDL_DisplayMode**>(SDL_malloc(sizeof(SDL_DisplayMode*) * (num_modes + 1)));
|
||||
SDL_DisplayMode* modes = static_cast<SDL_DisplayMode*>(SDL_malloc(sizeof(SDL_DisplayMode) * num_modes));
|
||||
if (!result || !modes) {
|
||||
SDL_free(result);
|
||||
SDL_free(modes);
|
||||
return NULL;
|
||||
}
|
||||
for (i = 0; i < num_modes; i++) {
|
||||
if (SDL_GetDisplayMode(displayID, i, &modes[i]) == 0) {
|
||||
result[i] = &modes[i];
|
||||
}
|
||||
}
|
||||
result[i] = NULL;
|
||||
|
||||
if (count) {
|
||||
*count = num_modes;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
inline SDL_DisplayMode g_displayMode;
|
||||
inline SDL_mutex* g_displayMutex = SDL_CreateMutex();
|
||||
|
||||
// This does not handle the differences between the SDL_DisplayMode struct
|
||||
// https://wiki.libsdl.org/SDL3/SDL_DisplayMode
|
||||
// https://wiki.libsdl.org/SDL2/SDL_DisplayMode
|
||||
inline SDL_DisplayMode* SDL_GetCurrentDisplayMode(int displayID)
|
||||
{
|
||||
SDL_LockMutex(g_displayMutex);
|
||||
if (SDL_GetCurrentDisplayMode(displayID, &g_displayMode) == 0) {
|
||||
SDL_UnlockMutex(g_timerMutex);
|
||||
return &g_displayMode;
|
||||
}
|
||||
SDL_UnlockMutex(g_timerMutex);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#define SDL_GetWindowSize(...) (SDL_GetWindowSize(__VA_ARGS__), true )
|
||||
|
||||
// https://wiki.libsdl.org/SDL3/README-migration#sdl_videoh
|
||||
|
||||
#define SDL_GL_DestroyContext SDL_GL_DeleteContext
|
||||
|
||||
// https://wiki.libsdl.org/SDL3/README-migration#sdl_renderh
|
||||
|
||||
// hardcode -1 as all uses are NULL or -1 (hacks out failure)
|
||||
#define SDL_CreateRenderer(window, name) SDL_CreateRenderer(window, -1, 0)
|
||||
|
||||
#define SDL_RenderTexture(...) (SDL_RenderCopyF(__VA_ARGS__) == 0)
|
||||
|
||||
#define SDL_CreateWindowAndRenderer(title, width, height, flags, window, renderer) (SDL_CreateWindowAndRenderer(width, height, flags, window, renderer) == 0)
|
||||
|
||||
#define SDL_SetRenderScale(...) (SDL_RenderSetScale(__VA_ARGS__) == 0)
|
||||
|
||||
// https://wiki.libsdl.org/SDL3/README-migration#sdl_keyboardh
|
||||
|
||||
typedef int SDL_KeyboardID;
|
||||
|
||||
#define SDL_GetKeyFromScancode(scancode, modstate, event) SDL_GetKeyFromScancode(scancode)
|
||||
|
||||
// https://wiki.libsdl.org/SDL3/README-migration#sdl_haptich
|
||||
// SDL_MouseID/SDL_KeyboardID are new
|
||||
|
||||
#define SDL_GetKeyboardState (const bool*)SDL_GetKeyboardState
|
||||
typedef int SDL_HapticID;
|
||||
|
||||
|
||||
#define SDL_CloseHaptic SDL_HapticClose
|
||||
#define SDL_OpenHaptic SDL_HapticOpen
|
||||
#define SDL_OpenHapticFromJoystick SDL_HapticOpenFromJoystick
|
||||
#define SDL_OpenHapticFromMouse SDL_HapticOpenFromMouse
|
||||
#define SDL_InitHapticRumble(...) (SDL_HapticRumbleInit(__VA_ARGS__) == 0)
|
||||
#define SDL_PlayHapticRumble(...) (SDL_HapticRumblePlay(__VA_ARGS__) == 0)
|
||||
|
||||
#define SDL_GetHapticID SDL_HapticIndex
|
||||
|
||||
// Modified from cc9937201e421ec55b12ad3f07ff2268f15096e8 SDL_haptic.c#L150
|
||||
inline SDL_HapticID* SDL_GetHaptics(int *count)
|
||||
{
|
||||
const int num_haptics = SDL_NumHaptics();
|
||||
if (count) *count = 0;
|
||||
|
||||
SDL_HapticID* haptics = static_cast<SDL_HapticID*>(SDL_malloc((num_haptics + 1) * sizeof(*haptics)));
|
||||
if (haptics) {
|
||||
if (count) {
|
||||
*count = num_haptics;
|
||||
}
|
||||
int haptic_index = 0;
|
||||
for (int device_index = 0; device_index < num_haptics; ++device_index) {
|
||||
SDL_Haptic* haptic = SDL_HapticOpen(device_index);
|
||||
if (haptic) {
|
||||
haptics[haptic_index] = SDL_GetHapticID(haptic);
|
||||
SDL_HapticClose(haptic);
|
||||
++haptic_index;
|
||||
}
|
||||
}
|
||||
haptics[haptic_index] = 0;
|
||||
} else { if (count) *count = 0; }
|
||||
|
||||
return haptics;
|
||||
}
|
||||
|
||||
// https://wiki.libsdl.org/SDL3/README-migration#sdl_videoh
|
||||
|
||||
#define SDL_CreateWindow(title, w, h, flags) SDL_CreateWindow(title, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, w, h, flags)
|
||||
#define SDL_SetWindowFullscreen(...) (SDL_SetWindowFullscreen(__VA_ARGS__) == 0)
|
||||
|
||||
#define SDL_GL_MakeCurrent(...) (SDL_GL_MakeCurrent(__VA_ARGS__) == 0)
|
||||
|
||||
#define SDL_GetDisplayForWindow SDL_GetWindowDisplayIndex
|
||||
#define SDL_SetWindowFullscreenMode(...) (SDL_SetWindowDisplayMode(__VA_ARGS__) == 0)
|
||||
// #define SDL_GetClosestFullscreenDisplayMode SDL_GetClosestDisplayMode
|
||||
inline bool SDL_GetClosestFullscreenDisplayMode(SDL_DisplayID displayID, int w, int h, float refresh_rate, bool include_high_density_modes, SDL_DisplayMode *closest)
|
||||
{
|
||||
SDL_DisplayMode desired{};
|
||||
desired.w = w;
|
||||
desired.h = h;
|
||||
desired.refresh_rate = static_cast<int>(refresh_rate);
|
||||
desired.format = 0;
|
||||
desired.driverdata = nullptr;
|
||||
|
||||
SDL_DisplayMode *result = SDL_GetClosestDisplayMode(displayID, &desired, closest);
|
||||
return result != nullptr;
|
||||
}
|
||||
|
||||
|
||||
// https://wiki.libsdl.org/SDL3/README-migration#sdl_mouseh
|
||||
|
||||
typedef Uint32 SDL_MouseID;
|
||||
|
||||
static void SDL_HideCursor() { SDL_ShowCursor(SDL_DISABLE); }
|
||||
static void SDL_ShowCursor() { SDL_ShowCursor(SDL_ENABLE); }
|
||||
|
||||
typedef Uint32 SDL_MouseButtonFlags;
|
||||
|
||||
#define SDL_SYSTEM_CURSOR_COUNT SDL_NUM_SYSTEM_CURSORS
|
||||
#define SDL_SYSTEM_CURSOR_DEFAULT SDL_SYSTEM_CURSOR_ARROW
|
||||
#define SDL_SYSTEM_CURSOR_POINTER SDL_SYSTEM_CURSOR_HAND
|
||||
#define SDL_SYSTEM_CURSOR_TEXT SDL_SYSTEM_CURSOR_IBEAM
|
||||
#define SDL_SYSTEM_CURSOR_NOT_ALLOWED SDL_SYSTEM_CURSOR_NO
|
||||
#define SDL_SYSTEM_CURSOR_MOVE SDL_SYSTEM_CURSOR_SIZEALL
|
||||
#define SDL_SYSTEM_CURSOR_NESW_RESIZE SDL_SYSTEM_CURSOR_SIZENESW
|
||||
#define SDL_SYSTEM_CURSOR_NS_RESIZE SDL_SYSTEM_CURSOR_SIZENS
|
||||
#define SDL_SYSTEM_CURSOR_NWSE_RESIZE SDL_SYSTEM_CURSOR_SIZENWSE
|
||||
#define SDL_SYSTEM_CURSOR_EW_RESIZE SDL_SYSTEM_CURSOR_SIZEWE
|
||||
#define SDL_SYSTEM_CURSOR_PROGRESS SDL_SYSTEM_CURSOR_WAITARROW
|
||||
|
||||
// https://wiki.libsdl.org/SDL3/README-migration#sdl_inith
|
||||
|
||||
#define SDL_Init(...) (SDL_Init(__VA_ARGS__) == 0)
|
||||
112
3rdparty/sdl3-shim/SDL3/SDL_audio.h
vendored
Normal file
112
3rdparty/sdl3-shim/SDL3/SDL_audio.h
vendored
Normal file
@ -0,0 +1,112 @@
|
||||
#pragma once
|
||||
|
||||
#include "SDL.h"
|
||||
|
||||
#include <cstring>
|
||||
#include <map>
|
||||
#include <mutex>
|
||||
|
||||
// https://wiki.libsdl.org/SDL3/README-migration#sdl_audioh
|
||||
|
||||
#define SDL_AUDIO_F32 AUDIO_F32SYS
|
||||
|
||||
#define SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK NULL
|
||||
|
||||
typedef void SDL_AudioStreamCallback(void *userdata, SDL_AudioStream *stream, int additional_amount, int total_amount);
|
||||
|
||||
struct ShimAudioCtx {
|
||||
SDL_AudioDeviceID device;
|
||||
SDL_AudioStream* stream;
|
||||
SDL_AudioStreamCallback* callback;
|
||||
void *userdata;
|
||||
SDL_AudioSpec obtained;
|
||||
};
|
||||
|
||||
static std::map<SDL_AudioStream*, ShimAudioCtx*> g_audioCtxs;
|
||||
static SDL_mutex *g_audioMutex = SDL_CreateMutex();
|
||||
|
||||
static void shim_audio_callback(void *userdata, Uint8 *data_stream, int len) {
|
||||
const auto ctx = static_cast<ShimAudioCtx*>(userdata);
|
||||
SDL_AudioStream* audio_stream = ctx->stream;
|
||||
|
||||
int available = SDL_AudioStreamAvailable(audio_stream);
|
||||
|
||||
int additional_amount = len - available;
|
||||
if (additional_amount < 0)
|
||||
additional_amount = 0;
|
||||
|
||||
ctx->callback(ctx->userdata, audio_stream, additional_amount, len);
|
||||
|
||||
int retrieved = SDL_AudioStreamGet(audio_stream, data_stream, len);
|
||||
if (retrieved < len) {
|
||||
memset(data_stream + retrieved, ctx->obtained.silence, len - retrieved);
|
||||
}
|
||||
}
|
||||
|
||||
#define SDL_ResumeAudioDevice(device) SDL_PauseAudioDevice(device, 0)
|
||||
#define SDL_PutAudioStreamData(...) (SDL_AudioStreamPut(__VA_ARGS__) == 0)
|
||||
|
||||
inline SDL_AudioDeviceID SDL_GetAudioStreamDevice(SDL_AudioStream* stream)
|
||||
{
|
||||
SDL_LockMutex(g_audioMutex);
|
||||
const auto it = g_audioCtxs.find(stream);
|
||||
if (it == g_audioCtxs.end()) {
|
||||
return 0;
|
||||
}
|
||||
SDL_UnlockMutex(g_audioMutex);
|
||||
return it->second->device;
|
||||
}
|
||||
|
||||
inline SDL_AudioStream * SDL_OpenAudioDeviceStream(const char* devid, const SDL_AudioSpec* desired, SDL_AudioStreamCallback callback, void* userdata)
|
||||
{
|
||||
SDL_AudioSpec obtained{};
|
||||
SDL_AudioSpec desired2 = *desired;
|
||||
|
||||
auto ctx = new ShimAudioCtx();
|
||||
ctx->callback = callback;
|
||||
ctx->userdata = userdata;
|
||||
ctx->stream = nullptr;
|
||||
|
||||
desired2.callback = shim_audio_callback;
|
||||
desired2.userdata = ctx;
|
||||
const SDL_AudioDeviceID device = SDL_OpenAudioDevice(devid, 0, &desired2, &obtained, 0);
|
||||
if (device <= 0) {
|
||||
delete ctx;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
SDL_AudioStream* stream = SDL_NewAudioStream(
|
||||
desired->format, desired->channels, desired->freq,
|
||||
obtained.format, obtained.channels, obtained.freq
|
||||
);
|
||||
if (!stream) {
|
||||
SDL_CloseAudioDevice(device);
|
||||
delete ctx;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ctx->device = device;
|
||||
ctx->stream = stream;
|
||||
ctx->obtained = obtained;
|
||||
|
||||
SDL_LockMutex(g_audioMutex);
|
||||
g_audioCtxs[stream] = ctx;
|
||||
SDL_UnlockMutex(g_audioMutex);
|
||||
|
||||
return stream;
|
||||
}
|
||||
|
||||
inline SDL_bool SDL_DestroyAudioStream(SDL_AudioStream* stream)
|
||||
{
|
||||
SDL_LockMutex(g_audioMutex);
|
||||
if (const auto it = g_audioCtxs.find(stream); it != g_audioCtxs.end()) {
|
||||
SDL_CloseAudioDevice(it->second->device);
|
||||
delete it->second;
|
||||
g_audioCtxs.erase(it);
|
||||
SDL_UnlockMutex(g_audioMutex);
|
||||
}
|
||||
SDL_UnlockMutex(g_audioMutex);
|
||||
|
||||
SDL_FreeAudioStream(stream);
|
||||
return true;
|
||||
}
|
||||
126
3rdparty/sdl3-shim/SDL3/SDL_events.h
vendored
Normal file
126
3rdparty/sdl3-shim/SDL3/SDL_events.h
vendored
Normal file
@ -0,0 +1,126 @@
|
||||
#pragma once
|
||||
|
||||
#include "SDL.h"
|
||||
|
||||
#include <SDL2/SDL_events.h>
|
||||
#include <SDL2/SDL_video.h>
|
||||
|
||||
// https://wiki.libsdl.org/SDL3/README-migration#sdl_eventsh
|
||||
|
||||
#define SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED (SDL_WINDOWEVENT + 2 + SDL_WINDOWEVENT_SIZE_CHANGED)
|
||||
#define SDL_EVENT_WINDOW_CLOSE_REQUESTED (SDL_WINDOWEVENT + 2 + SDL_WINDOWEVENT_CLOSE)
|
||||
#define SDL_EVENT_WINDOW_FOCUS_GAINED (SDL_WINDOWEVENT + 2 + SDL_WINDOWEVENT_FOCUS_GAINED)
|
||||
#define SDL_EVENT_WINDOW_FOCUS_LOST (SDL_WINDOWEVENT + 2 + SDL_WINDOWEVENT_FOCUS_LOST)
|
||||
|
||||
// #define SDL_EVENT_MOUSE_BUTTON_DOWN SDL_MOUSEBUTTONDOWN
|
||||
// #define SDL_EVENT_MOUSE_BUTTON_UP SDL_MOUSEBUTTONUP
|
||||
// #define SDL_EVENT_MOUSE_MOTION SDL_MOUSEMOTION
|
||||
//
|
||||
// #define SDL_EVENT_FINGER_MOTION SDL_FINGERMOTION
|
||||
// #define SDL_EVENT_FINGER_DOWN SDL_FINGERDOWN
|
||||
// #define SDL_EVENT_FINGER_UP SDL_FINGERUP
|
||||
#define SDL_EVENT_FINGER_CANCELED 0
|
||||
|
||||
#define SDL_EVENT_QUIT SDL_QUIT
|
||||
|
||||
#define SDL_EVENT_GAMEPAD_AXIS_MOTION SDL_CONTROLLERAXISMOTION
|
||||
#define SDL_EVENT_GAMEPAD_BUTTON_DOWN SDL_CONTROLLERBUTTONDOWN
|
||||
#define SDL_EVENT_GAMEPAD_BUTTON_UP SDL_CONTROLLERBUTTONUP
|
||||
#define SDL_EVENT_GAMEPAD_ADDED SDL_CONTROLLERDEVICEADDED
|
||||
// #define SDL_EVENT_GAMEPAD_REMAPPED SDL_CONTROLLERDEVICEREMAPPED
|
||||
#define SDL_EVENT_GAMEPAD_REMOVED SDL_CONTROLLERDEVICEREMOVED
|
||||
// #define SDL_EVENT_GAMEPAD_SENSOR_UPDATE SDL_CONTROLLERSENSORUPDATE
|
||||
// #define SDL_EVENT_GAMEPAD_STEAM_HANDLE_UPDATED SDL_CONTROLLERSTEAMHANDLEUPDATED
|
||||
// #define SDL_EVENT_GAMEPAD_TOUCHPAD_DOWN SDL_CONTROLLERTOUCHPADDOWN
|
||||
// #define SDL_EVENT_GAMEPAD_TOUCHPAD_MOTION SDL_CONTROLLERTOUCHPADMOTION
|
||||
// #define SDL_EVENT_GAMEPAD_TOUCHPAD_UP SDL_CONTROLLERTOUCHPADUP
|
||||
// #define SDL_EVENT_DROP_BEGIN SDL_DROPBEGIN
|
||||
// #define SDL_EVENT_DROP_COMPLETE SDL_DROPCOMPLETE
|
||||
// #define SDL_EVENT_DROP_FILE SDL_DROPFILE
|
||||
// #define SDL_EVENT_DROP_TEXT SDL_DROPTEXT
|
||||
#define SDL_EVENT_FINGER_DOWN SDL_FINGERDOWN
|
||||
#define SDL_EVENT_FINGER_MOTION SDL_FINGERMOTION
|
||||
#define SDL_EVENT_FINGER_UP SDL_FINGERUP
|
||||
// #define SDL_EVENT_FIRST SDL_FIRSTEVENT
|
||||
// #define SDL_EVENT_JOYSTICK_AXIS_MOTION SDL_JOYAXISMOTION
|
||||
// #define SDL_EVENT_JOYSTICK_BALL_MOTION SDL_JOYBALLMOTION
|
||||
// #define SDL_EVENT_JOYSTICK_BATTERY_UPDATED SDL_JOYBATTERYUPDATED
|
||||
// #define SDL_EVENT_JOYSTICK_BUTTON_DOWN SDL_JOYBUTTONDOWN
|
||||
// #define SDL_EVENT_JOYSTICK_BUTTON_UP SDL_JOYBUTTONUP
|
||||
// #define SDL_EVENT_JOYSTICK_ADDED SDL_JOYDEVICEADDED
|
||||
// #define SDL_EVENT_JOYSTICK_REMOVED SDL_JOYDEVICEREMOVED
|
||||
// #define SDL_EVENT_JOYSTICK_HAT_MOTION SDL_JOYHATMOTION
|
||||
#define SDL_EVENT_KEY_DOWN SDL_KEYDOWN
|
||||
// #define SDL_EVENT_KEYMAP_CHANGED SDL_KEYMAPCHANGED
|
||||
#define SDL_EVENT_KEY_UP SDL_KEYUP
|
||||
// #define SDL_EVENT_LAST SDL_LASTEVENT
|
||||
// #define SDL_EVENT_LOCALE_CHANGED SDL_LOCALECHANGED
|
||||
#define SDL_EVENT_MOUSE_BUTTON_DOWN SDL_MOUSEBUTTONDOWN
|
||||
#define SDL_EVENT_MOUSE_BUTTON_UP SDL_MOUSEBUTTONUP
|
||||
#define SDL_EVENT_MOUSE_MOTION SDL_MOUSEMOTION
|
||||
// #define SDL_EVENT_MOUSE_WHEEL SDL_MOUSEWHEEL
|
||||
// #define SDL_EVENT_POLL_SENTINEL SDL_POLLSENTINEL
|
||||
|
||||
|
||||
|
||||
#define fingerID fingerId
|
||||
#define touchID touchId
|
||||
#define gaxis caxis
|
||||
#define gbutton cbutton
|
||||
|
||||
inline SDL_Window* SDL_GetWindowFromEvent(const SDL_Event* event)
|
||||
{
|
||||
Uint32 windowID = 0;
|
||||
|
||||
if (event->type >= SDL_USEREVENT && event->type <= SDL_LASTEVENT) {
|
||||
windowID = event->user.windowID;
|
||||
}
|
||||
else {
|
||||
switch (event->type) {
|
||||
case SDL_WINDOWEVENT:
|
||||
windowID = event->window.windowID;
|
||||
break;
|
||||
|
||||
case SDL_KEYDOWN:
|
||||
case SDL_KEYUP:
|
||||
case SDL_KEYMAPCHANGED:
|
||||
windowID = event->key.windowID;
|
||||
break;
|
||||
|
||||
case SDL_TEXTEDITING:
|
||||
windowID = event->edit.windowID;
|
||||
break;
|
||||
case SDL_TEXTINPUT:
|
||||
windowID = event->text.windowID;
|
||||
break;
|
||||
case SDL_TEXTEDITING_EXT:
|
||||
windowID = event->editExt.windowID;
|
||||
break;
|
||||
|
||||
case SDL_MOUSEMOTION:
|
||||
windowID = event->motion.windowID;
|
||||
break;
|
||||
case SDL_MOUSEBUTTONDOWN:
|
||||
case SDL_MOUSEBUTTONUP:
|
||||
windowID = event->button.windowID;
|
||||
break;
|
||||
case SDL_MOUSEWHEEL:
|
||||
windowID = event->wheel.windowID;
|
||||
break;
|
||||
|
||||
case SDL_FINGERDOWN:
|
||||
case SDL_FINGERUP:
|
||||
case SDL_FINGERMOTION:
|
||||
windowID = event->tfinger.windowID;
|
||||
break;
|
||||
|
||||
case SDL_DROPFILE:
|
||||
case SDL_DROPTEXT:
|
||||
case SDL_DROPBEGIN:
|
||||
case SDL_DROPCOMPLETE:
|
||||
windowID = event->drop.windowID;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return SDL_GetWindowFromID(windowID);
|
||||
}
|
||||
101
3rdparty/sdl3-shim/SDL3/SDL_filesystem.h
vendored
Normal file
101
3rdparty/sdl3-shim/SDL3/SDL_filesystem.h
vendored
Normal file
@ -0,0 +1,101 @@
|
||||
#pragma once
|
||||
|
||||
#include "SDL.h"
|
||||
#include "SDL_iostream.h"
|
||||
|
||||
#include <filesystem>
|
||||
#include <vector>
|
||||
|
||||
typedef Uint32 SDL_GlobFlags;
|
||||
|
||||
typedef enum SDL_PathType
|
||||
{
|
||||
SDL_PATHTYPE_NONE,
|
||||
SDL_PATHTYPE_FILE,
|
||||
SDL_PATHTYPE_DIRECTORY,
|
||||
SDL_PATHTYPE_OTHER
|
||||
} SDL_PathType;
|
||||
|
||||
typedef struct SDL_PathInfo
|
||||
{
|
||||
SDL_PathType type;
|
||||
Uint64 size;
|
||||
} SDL_PathInfo;
|
||||
|
||||
// https://github.com/libsdl-org/SDL/blob/main/src/filesystem/
|
||||
|
||||
inline char** SDL_GlobDirectory(const char *path, const char *pattern, SDL_GlobFlags flags, int *count)
|
||||
{
|
||||
if (!path || !count) return NULL;
|
||||
*count = 0;
|
||||
|
||||
std::vector<std::string> entries;
|
||||
try {
|
||||
for (const auto& entry : std::filesystem::recursive_directory_iterator(path)) {
|
||||
entries.push_back(std::filesystem::relative(entry.path(), path).string());
|
||||
}
|
||||
} catch (...) {
|
||||
return NULL;
|
||||
}
|
||||
if (entries.empty()) return NULL;
|
||||
|
||||
char** result = static_cast<char**>(SDL_malloc(sizeof(char*) * entries.size()));
|
||||
if (!result) return NULL;
|
||||
|
||||
for (size_t i = 0; i < entries.size(); ++i) {
|
||||
result[i] = SDL_strdup(entries[i].c_str());
|
||||
if (!result[i]) {
|
||||
for (size_t j = 0; j < i; ++j) {
|
||||
SDL_free(result[j]);
|
||||
}
|
||||
SDL_free(result);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
*count = static_cast<int>(entries.size());
|
||||
return result;
|
||||
}
|
||||
|
||||
inline bool SDL_RemovePath(const char *path)
|
||||
{
|
||||
if (!path) return SDL_InvalidParamError("path");
|
||||
if (std::filesystem::remove(path)) return true;
|
||||
return false;
|
||||
}
|
||||
inline bool SDL_RenamePath(const char *oldpath, const char *newpath)
|
||||
{
|
||||
if (!oldpath) return SDL_InvalidParamError("oldpath");
|
||||
if (!newpath) return SDL_InvalidParamError("newpath");
|
||||
|
||||
std::filesystem::rename(oldpath, newpath);
|
||||
return true;
|
||||
}
|
||||
|
||||
inline bool SDL_GetPathInfo(const char *path, SDL_PathInfo *info)
|
||||
{
|
||||
if (!path) return SDL_InvalidParamError("path");
|
||||
|
||||
SDL_PathInfo dummy;
|
||||
if (!info) info = &dummy;
|
||||
|
||||
SDL_zerop(info);
|
||||
switch (const auto status = std::filesystem::status(path);status.type()) {
|
||||
case std::filesystem::file_type::regular:
|
||||
info->type = SDL_PATHTYPE_FILE;
|
||||
info->size = std::filesystem::file_size(path);
|
||||
break;
|
||||
case std::filesystem::file_type::directory:
|
||||
info->type = SDL_PATHTYPE_DIRECTORY;
|
||||
info->size = 0;
|
||||
break;
|
||||
case std::filesystem::file_type::not_found:
|
||||
info->type = SDL_PATHTYPE_NONE;
|
||||
info->size = 0;
|
||||
return false;
|
||||
default:
|
||||
info->type = SDL_PATHTYPE_OTHER;
|
||||
info->size = 0;
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
111
3rdparty/sdl3-shim/SDL3/SDL_gamepad.h
vendored
Normal file
111
3rdparty/sdl3-shim/SDL3/SDL_gamepad.h
vendored
Normal file
@ -0,0 +1,111 @@
|
||||
#pragma once
|
||||
|
||||
#include <SDL2/SDL_gamecontroller.h>
|
||||
|
||||
// https://wiki.libsdl.org/SDL3/README-migration#sdl_gamecontrollerh
|
||||
|
||||
#define SDL_Gamepad SDL_GameController
|
||||
|
||||
#define SDL_INIT_GAMEPAD SDL_INIT_GAMECONTROLLER
|
||||
|
||||
// #define SDL_CloseGamepad SDL_GameControllerClose
|
||||
|
||||
//
|
||||
// #define SDL_GamepadAxis SDL_GameControllerAxis
|
||||
// #define SDL_GamepadBindingType SDL_GameControllerBindType
|
||||
// #define SDL_GamepadButton SDL_GameControllerButton
|
||||
// #define SDL_GamepadType SDL_GameControllerType
|
||||
|
||||
// #define SDL_AddGamepadMapping SDL_GameControllerAddMapping
|
||||
// #define SDL_AddGamepadMappingsFromFile SDL_GameControllerAddMappingsFromFile
|
||||
// #define SDL_AddGamepadMappingsFromIO SDL_GameControllerAddMappingsFromRW
|
||||
#define SDL_CloseGamepad SDL_GameControllerClose
|
||||
// #define SDL_GetGamepadFromID SDL_GameControllerFromInstanceID
|
||||
// #define SDL_GetGamepadFromPlayerIndex SDL_GameControllerFromPlayerIndex
|
||||
// #define SDL_GetGamepadAppleSFSymbolsNameForAxis SDL_GameControllerGetAppleSFSymbolsNameForAxis
|
||||
// #define SDL_GetGamepadAppleSFSymbolsNameForButton SDL_GameControllerGetAppleSFSymbolsNameForButton
|
||||
// #define SDL_GamepadConnected SDL_GameControllerGetAttached
|
||||
#define SDL_GetGamepadAxis SDL_GameControllerGetAxis
|
||||
// #define SDL_GetGamepadAxisFromString SDL_GameControllerGetAxisFromString
|
||||
// #define SDL_GetGamepadButton SDL_GameControllerGetButton
|
||||
// #define SDL_GetGamepadButtonFromString SDL_GameControllerGetButtonFromString
|
||||
// #define SDL_GetGamepadFirmwareVersion SDL_GameControllerGetFirmwareVersion
|
||||
#define SDL_GetGamepadJoystick SDL_GameControllerGetJoystick
|
||||
// #define SDL_GetNumGamepadTouchpadFingers SDL_GameControllerGetNumTouchpadFingers
|
||||
// #define SDL_GetNumGamepadTouchpads SDL_GameControllerGetNumTouchpads
|
||||
// #define SDL_GetGamepadPlayerIndex SDL_GameControllerGetPlayerIndex
|
||||
// #define SDL_GetGamepadProduct SDL_GameControllerGetProduct
|
||||
// #define SDL_GetGamepadProductVersion SDL_GameControllerGetProductVersion
|
||||
// #define SDL_GetGamepadSensorData SDL_GameControllerGetSensorData, returns bool
|
||||
// #define SDL_GetGamepadSensorDataRate SDL_GameControllerGetSensorDataRate
|
||||
// #define SDL_GetGamepadSerial SDL_GameControllerGetSerial
|
||||
// #define SDL_GetGamepadSteamHandle SDL_GameControllerGetSteamHandle
|
||||
// #define SDL_GetGamepadStringForAxis SDL_GameControllerGetStringForAxis
|
||||
// #define SDL_GetGamepadStringForButton SDL_GameControllerGetStringForButton
|
||||
// #define SDL_GetGamepadTouchpadFinger SDL_GameControllerGetTouchpadFinger, returns bool
|
||||
// #define SDL_GetGamepadType SDL_GameControllerGetType
|
||||
// #define SDL_GetGamepadVendor SDL_GameControllerGetVendor
|
||||
// #define SDL_GamepadHasAxis SDL_GameControllerHasAxis
|
||||
// #define SDL_GamepadHasButton SDL_GameControllerHasButton
|
||||
// #define SDL_GamepadHasSensor SDL_GameControllerHasSensor
|
||||
// #define SDL_GamepadSensorEnabled SDL_GameControllerIsSensorEnabled
|
||||
// #define SDL_GetGamepadMapping SDL_GameControllerMapping
|
||||
// #define SDL_GetGamepadMappingForGUID SDL_GameControllerMappingForGUID
|
||||
// #define SDL_GetGamepadName SDL_GameControllerName
|
||||
#define SDL_OpenGamepad SDL_GameControllerOpen
|
||||
// #define SDL_GetGamepadPath SDL_GameControllerPath
|
||||
#define SDL_RumbleGamepad(...) (SDL_GameControllerRumble(__VA_ARGS__) == 0)
|
||||
// #define SDL_RumbleGamepadTriggers SDL_GameControllerRumbleTriggers, returns bool
|
||||
// #define SDL_SendGamepadEffect SDL_GameControllerSendEffect, returns bool
|
||||
// #define SDL_SetGamepadLED SDL_GameControllerSetLED, returns bool
|
||||
// #define SDL_SetGamepadPlayerIndex SDL_GameControllerSetPlayerIndex, returns bool
|
||||
// #define SDL_SetGamepadSensorEnabled SDL_GameControllerSetSensorEnabled, returns bool
|
||||
// #define SDL_UpdateGamepads SDL_GameControllerUpdate
|
||||
// #define SDL_IsGamepad SDL_IsGameController
|
||||
|
||||
// #define SDL_GAMEPAD_AXIS_INVALID SDL_CONTROLLER_AXIS_INVALID
|
||||
#define SDL_GAMEPAD_AXIS_LEFTX SDL_CONTROLLER_AXIS_LEFTX
|
||||
#define SDL_GAMEPAD_AXIS_LEFTY SDL_CONTROLLER_AXIS_LEFTY
|
||||
// #define SDL_GAMEPAD_AXIS_COUNT SDL_CONTROLLER_AXIS_MAX
|
||||
#define SDL_GAMEPAD_AXIS_RIGHTX SDL_CONTROLLER_AXIS_RIGHTX
|
||||
#define SDL_GAMEPAD_AXIS_RIGHTY SDL_CONTROLLER_AXIS_RIGHTY
|
||||
#define SDL_GAMEPAD_AXIS_LEFT_TRIGGER SDL_CONTROLLER_AXIS_TRIGGERLEFT
|
||||
#define SDL_GAMEPAD_AXIS_RIGHT_TRIGGER SDL_CONTROLLER_AXIS_TRIGGERRIGHT
|
||||
// #define SDL_GAMEPAD_BINDTYPE_AXIS SDL_CONTROLLER_BINDTYPE_AXIS
|
||||
// #define SDL_GAMEPAD_BINDTYPE_BUTTON SDL_CONTROLLER_BINDTYPE_BUTTON
|
||||
// #define SDL_GAMEPAD_BINDTYPE_HAT SDL_CONTROLLER_BINDTYPE_HAT
|
||||
#define SDL_GAMEPAD_BINDTYPE_NONE SDL_CONTROLLER_BINDTYPE_NONE
|
||||
#define SDL_GAMEPAD_BUTTON_SOUTH SDL_CONTROLLER_BUTTON_A
|
||||
#define SDL_GAMEPAD_BUTTON_EAST SDL_CONTROLLER_BUTTON_B
|
||||
// #define SDL_GAMEPAD_BUTTON_BACK SDL_CONTROLLER_BUTTON_BACK
|
||||
#define SDL_GAMEPAD_BUTTON_DPAD_DOWN SDL_CONTROLLER_BUTTON_DPAD_DOWN
|
||||
#define SDL_GAMEPAD_BUTTON_DPAD_LEFT SDL_CONTROLLER_BUTTON_DPAD_LEFT
|
||||
#define SDL_GAMEPAD_BUTTON_DPAD_RIGHT SDL_CONTROLLER_BUTTON_DPAD_RIGHT
|
||||
#define SDL_GAMEPAD_BUTTON_DPAD_UP SDL_CONTROLLER_BUTTON_DPAD_UP
|
||||
// #define SDL_GAMEPAD_BUTTON_GUIDE SDL_CONTROLLER_BUTTON_GUIDE
|
||||
// #define SDL_GAMEPAD_BUTTON_INVALID SDL_CONTROLLER_BUTTON_INVALID
|
||||
// #define SDL_GAMEPAD_BUTTON_LEFT_SHOULDER SDL_CONTROLLER_BUTTON_LEFTSHOULDER
|
||||
// #define SDL_GAMEPAD_BUTTON_LEFT_STICK SDL_CONTROLLER_BUTTON_LEFTSTICK
|
||||
// #define SDL_GAMEPAD_BUTTON_COUNT SDL_CONTROLLER_BUTTON_MAX
|
||||
// #define SDL_GAMEPAD_BUTTON_MISC1 SDL_CONTROLLER_BUTTON_MISC1
|
||||
// #define SDL_GAMEPAD_BUTTON_RIGHT_PADDLE1 SDL_CONTROLLER_BUTTON_PADDLE1
|
||||
// #define SDL_GAMEPAD_BUTTON_LEFT_PADDLE1 SDL_CONTROLLER_BUTTON_PADDLE2
|
||||
// #define SDL_GAMEPAD_BUTTON_RIGHT_PADDLE2 SDL_CONTROLLER_BUTTON_PADDLE3
|
||||
// #define SDL_GAMEPAD_BUTTON_LEFT_PADDLE2 SDL_CONTROLLER_BUTTON_PADDLE4
|
||||
// #define SDL_GAMEPAD_BUTTON_RIGHT_SHOULDER SDL_CONTROLLER_BUTTON_RIGHTSHOULDER
|
||||
// #define SDL_GAMEPAD_BUTTON_RIGHT_STICK SDL_CONTROLLER_BUTTON_RIGHTSTICK
|
||||
#define SDL_GAMEPAD_BUTTON_START SDL_CONTROLLER_BUTTON_START
|
||||
// #define SDL_GAMEPAD_BUTTON_TOUCHPAD SDL_CONTROLLER_BUTTON_TOUCHPAD
|
||||
// #define SDL_GAMEPAD_BUTTON_WEST SDL_CONTROLLER_BUTTON_X
|
||||
// #define SDL_GAMEPAD_BUTTON_NORTH SDL_CONTROLLER_BUTTON_Y
|
||||
// #define SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_JOYCON_LEFT SDL_CONTROLLER_TYPE_NINTENDO_SWITCH_JOYCON_LEFT
|
||||
// #define SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_JOYCON_PAIR SDL_CONTROLLER_TYPE_NINTENDO_SWITCH_JOYCON_PAIR
|
||||
// #define SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_JOYCON_RIGHT SDL_CONTROLLER_TYPE_NINTENDO_SWITCH_JOYCON_RIGHT
|
||||
// #define SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_PRO SDL_CONTROLLER_TYPE_NINTENDO_SWITCH_PRO
|
||||
// #define SDL_GAMEPAD_TYPE_PS3 SDL_CONTROLLER_TYPE_PS3
|
||||
// #define SDL_GAMEPAD_TYPE_PS4 SDL_CONTROLLER_TYPE_PS4
|
||||
// #define SDL_GAMEPAD_TYPE_PS5 SDL_CONTROLLER_TYPE_PS5
|
||||
// #define SDL_GAMEPAD_TYPE_STANDARD SDL_CONTROLLER_TYPE_UNKNOWN
|
||||
// #define SDL_GAMEPAD_TYPE_VIRTUAL SDL_CONTROLLER_TYPE_VIRTUAL
|
||||
// #define SDL_GAMEPAD_TYPE_XBOX360 SDL_CONTROLLER_TYPE_XBOX360
|
||||
// #define SDL_GAMEPAD_TYPE_XBOXONE SDL_CONTROLLER_TYPE_XBOXONE
|
||||
49
3rdparty/sdl3-shim/SDL3/SDL_iostream.h
vendored
Normal file
49
3rdparty/sdl3-shim/SDL3/SDL_iostream.h
vendored
Normal file
@ -0,0 +1,49 @@
|
||||
#pragma once
|
||||
|
||||
#include <SDL2/SDL_rwops.h>
|
||||
|
||||
// https://wiki.libsdl.org/SDL3/README-migration#sdl_rwopsh
|
||||
|
||||
#define SDL_IOStream SDL_RWops
|
||||
|
||||
typedef int SDL_IOWhence;
|
||||
|
||||
#define SDL_IO_SEEK_SET RW_SEEK_SET
|
||||
#define SDL_IO_SEEK_CUR RW_SEEK_CUR
|
||||
#define SDL_IO_SEEK_END RW_SEEK_END
|
||||
|
||||
// #define SDL_IOFromConstMem SDL_RWFromConstMem
|
||||
#define SDL_IOFromFile SDL_RWFromFile
|
||||
#define SDL_IOFromMem SDL_RWFromMem
|
||||
#define SDL_CloseIO SDL_RWclose
|
||||
#define SDL_ReadIO(ctx, ptr, size) SDL_RWread(ctx, ptr, 1, size)
|
||||
#define SDL_SeekIO SDL_RWseek
|
||||
#define SDL_GetIOSize SDL_RWsize
|
||||
#define SDL_TellIO SDL_RWtell
|
||||
#define SDL_WriteIO(ctx, ptr, size) SDL_RWwrite(ctx, ptr, 1, size)
|
||||
// #define SDL_ReadU16BE SDL_ReadBE16
|
||||
// #define SDL_ReadU32BE SDL_ReadBE32
|
||||
// #define SDL_ReadU64BE SDL_ReadBE64
|
||||
// #define SDL_ReadU16LE SDL_ReadLE16
|
||||
// #define SDL_ReadU32LE SDL_ReadLE32
|
||||
// #define SDL_ReadU64LE SDL_ReadLE64
|
||||
// #define SDL_WriteU16BE SDL_WriteBE16
|
||||
// #define SDL_WriteU32BE SDL_WriteBE32
|
||||
// #define SDL_WriteU64BE SDL_WriteBE64
|
||||
// #define SDL_WriteU16LE SDL_WriteLE16
|
||||
// #define SDL_WriteU32LE SDL_WriteLE32
|
||||
// #define SDL_WriteU64LE SDL_WriteLE64
|
||||
|
||||
// FIXME: If Write/Read fail SDL_GetIOStatus is not aware.
|
||||
typedef enum SDL_IOStatus
|
||||
{
|
||||
SDL_IO_STATUS_READY,
|
||||
SDL_IO_STATUS_ERROR,
|
||||
} SDL_IOStatus;
|
||||
inline SDL_IOStatus SDL_GetIOStatus(SDL_RWops *context)
|
||||
{
|
||||
if (!context) {
|
||||
return SDL_IO_STATUS_ERROR;
|
||||
}
|
||||
return SDL_IO_STATUS_READY;
|
||||
}
|
||||
60
3rdparty/sdl3-shim/SDL3/SDL_keycode.h
vendored
Normal file
60
3rdparty/sdl3-shim/SDL3/SDL_keycode.h
vendored
Normal file
@ -0,0 +1,60 @@
|
||||
#pragma once
|
||||
|
||||
#include <SDL2/SDL_keycode.h>
|
||||
|
||||
#define SDLK_MEDIA_FAST_FORWARD SDLK_AUDIOFASTFORWARD
|
||||
#define SDL_KMOD_ALT KMOD_ALT
|
||||
#define SDL_KMOD_CAPS KMOD_CAPS
|
||||
#define SDL_KMOD_CTRL KMOD_CTRL
|
||||
#define SDL_KMOD_GUI KMOD_GUI
|
||||
#define SDL_KMOD_LALT KMOD_LALT
|
||||
#define SDL_KMOD_LCTRL KMOD_LCTRL
|
||||
#define SDL_KMOD_LGUI KMOD_LGUI
|
||||
#define SDL_KMOD_LSHIFT KMOD_LSHIFT
|
||||
#define SDL_KMOD_MODE KMOD_MODE
|
||||
#define SDL_KMOD_NONE KMOD_NONE
|
||||
#define SDL_KMOD_NUM KMOD_NUM
|
||||
#define SDL_KMOD_RALT KMOD_RALT
|
||||
#define SDL_KMOD_RCTRL KMOD_RCTRL
|
||||
#define SDL_KMOD_RGUI KMOD_RGUI
|
||||
#define SDL_KMOD_RSHIFT KMOD_RSHIFT
|
||||
#define SDL_KMOD_SCROLL KMOD_SCROLL
|
||||
#define SDL_KMOD_SHIFT KMOD_SHIFT
|
||||
#define SDLK_MEDIA_FAST_FORWARD SDLK_AUDIOFASTFORWARD
|
||||
#define SDLK_MUTE SDLK_AUDIOMUTE
|
||||
#define SDLK_MEDIA_NEXT_TRACK SDLK_AUDIONEXT
|
||||
#define SDLK_MEDIA_PLAY SDLK_AUDIOPLAY
|
||||
#define SDLK_MEDIA_PREVIOUS_TRACK SDLK_AUDIOPREV
|
||||
#define SDLK_MEDIA_REWIND SDLK_AUDIOREWIND
|
||||
#define SDLK_MEDIA_STOP SDLK_AUDIOSTOP
|
||||
#define SDLK_GRAVE SDLK_BACKQUOTE
|
||||
#define SDLK_MEDIA_EJECT SDLK_EJECT
|
||||
#define SDLK_MEDIA_SELECT SDLK_MEDIASELECT
|
||||
#define SDLK_APOSTROPHE SDLK_QUOTE
|
||||
#define SDLK_DBLAPOSTROPHE SDLK_QUOTEDBL
|
||||
#define SDLK_A SDLK_a
|
||||
#define SDLK_B SDLK_b
|
||||
#define SDLK_C SDLK_c
|
||||
#define SDLK_D SDLK_d
|
||||
#define SDLK_E SDLK_e
|
||||
#define SDLK_F SDLK_f
|
||||
#define SDLK_G SDLK_g
|
||||
#define SDLK_H SDLK_h
|
||||
#define SDLK_I SDLK_i
|
||||
#define SDLK_J SDLK_j
|
||||
#define SDLK_K SDLK_k
|
||||
#define SDLK_L SDLK_l
|
||||
#define SDLK_M SDLK_m
|
||||
#define SDLK_N SDLK_n
|
||||
#define SDLK_O SDLK_o
|
||||
#define SDLK_P SDLK_p
|
||||
#define SDLK_Q SDLK_q
|
||||
#define SDLK_R SDLK_r
|
||||
#define SDLK_S SDLK_s
|
||||
#define SDLK_T SDLK_t
|
||||
#define SDLK_U SDLK_u
|
||||
#define SDLK_V SDLK_v
|
||||
#define SDLK_W SDLK_w
|
||||
#define SDLK_X SDLK_x
|
||||
#define SDLK_Y SDLK_y
|
||||
#define SDLK_Z SDLK_z
|
||||
13
3rdparty/sdl3-shim/SDL3/SDL_main.h
vendored
Normal file
13
3rdparty/sdl3-shim/SDL3/SDL_main.h
vendored
Normal file
@ -0,0 +1,13 @@
|
||||
#pragma once
|
||||
|
||||
typedef enum SDL_AppResult
|
||||
{
|
||||
SDL_APP_CONTINUE,
|
||||
SDL_APP_SUCCESS,
|
||||
SDL_APP_FAILURE
|
||||
} SDL_AppResult;
|
||||
|
||||
SDL_AppResult SDL_AppInit(void **appstate, int argc, char *argv[]);
|
||||
SDL_AppResult SDL_AppIterate(void *appstate);
|
||||
SDL_AppResult SDL_AppEvent(void *appstate, SDL_Event *event);
|
||||
void SDL_AppQuit(void *appstate, SDL_AppResult result);
|
||||
12
3rdparty/sdl3-shim/SDL3/SDL_mutex.h
vendored
Normal file
12
3rdparty/sdl3-shim/SDL3/SDL_mutex.h
vendored
Normal file
@ -0,0 +1,12 @@
|
||||
#pragma once
|
||||
|
||||
#include <SDL2/SDL_mutex.h>
|
||||
|
||||
// https://wiki.libsdl.org/SDL3/README-migration#sdl_mutexh
|
||||
|
||||
#define SDL_Mutex SDL_mutex
|
||||
|
||||
#define SDL_Semaphore SDL_sem
|
||||
|
||||
#define SDL_WaitSemaphore SDL_SemWait
|
||||
#define SDL_SignalSemaphore SDL_SemPost
|
||||
47
3rdparty/sdl3-shim/SDL3/SDL_pixels.h
vendored
Normal file
47
3rdparty/sdl3-shim/SDL3/SDL_pixels.h
vendored
Normal file
@ -0,0 +1,47 @@
|
||||
#pragma once
|
||||
|
||||
#include <SDL2/SDL_pixels.h>
|
||||
|
||||
// https://wiki.libsdl.org/SDL3/README-migration#sdl_pixelsh
|
||||
#define bits_per_pixel BitsPerPixel
|
||||
|
||||
typedef SDL_PixelFormat SDL2_PixelFormat;
|
||||
#define SDL_PixelFormatDetails SDL2_PixelFormat
|
||||
#define SDL_PixelFormat SDL_PixelFormatEnum
|
||||
|
||||
#define SDL_GetRGBA(pixel, format, palette, r,g,b,a) SDL_GetRGBA(pixel, format, r,g,b,a)
|
||||
#define SDL_MapRGBA(format, palette, r,g,b,a) SDL_MapRGBA(format, r,g,b,a)
|
||||
#define SDL_GetRGB(pixel, format, palette, r,g,b) SDL_GetRGB(pixel, format, r,g,b)
|
||||
#define SDL_MapRGB(format, palette, r,g,b) SDL_MapRGB(format, r,g,b)
|
||||
|
||||
template<typename T>
|
||||
SDL_PixelFormatDetails* SDL_GetPixelFormatDetails(T format) {
|
||||
if constexpr (std::is_same_v<T, SDL_PixelFormat>) {
|
||||
return SDL_AllocFormat(format);
|
||||
} else {
|
||||
return SDL_AllocFormat(format->format);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static bool operator!=(SDL_PixelFormatDetails* lhs, SDL_PixelFormatEnum rhs)
|
||||
{
|
||||
return lhs->format != rhs;
|
||||
}
|
||||
|
||||
#define SDL_CreatePalette SDL_AllocPalette
|
||||
#define SDL_DestroyPalette SDL_FreePalette
|
||||
|
||||
// #define SDL_GetPixelFormatForMasks (SDL_PixelFormat)SDL_MasksToPixelFormatEnum
|
||||
inline SDL_PixelFormatEnum SDL_GetPixelFormatForMasks(int bpp, Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask)
|
||||
{
|
||||
// SDL2 checks if Rmask == 0; SDL3 just returns INDEX8 if Rmask doesn't match
|
||||
// https://github.com/libsdl-org/SDL/blob/66d87bf0e1e29377b398d3c567e1ab3590760d8c/src/video/SDL_pixels.c#L310C5-L321C13
|
||||
// https://github.com/libsdl-org/SDL/blob/3669920fddcc418c5f9aca97e77a3f380308d9c0/src/video/SDL_pixels.c#L411-L418C16
|
||||
if (bpp == 8 && Rmask != 0xE0) {
|
||||
return SDL_PIXELFORMAT_INDEX8;
|
||||
}
|
||||
return static_cast<SDL_PixelFormatEnum>(SDL_MasksToPixelFormatEnum(bpp, Rmask, Gmask, Bmask, Amask));
|
||||
}
|
||||
|
||||
#define SDL_GetSurfacePalette(surface) (nullptr)
|
||||
43
3rdparty/sdl3-shim/SDL3/SDL_platform_defines.h
vendored
Normal file
43
3rdparty/sdl3-shim/SDL3/SDL_platform_defines.h
vendored
Normal file
@ -0,0 +1,43 @@
|
||||
#pragma once
|
||||
|
||||
#include <SDL2/SDL_platform.h>
|
||||
|
||||
// https://wiki.libsdl.org/SDL3/README-migration#sdl_platformh
|
||||
|
||||
// #define SDL_PLATFORM_3DS __3DS__
|
||||
// #define SDL_PLATFORM_AIX __AIX__
|
||||
// #define SDL_PLATFORM_ANDROID __ANDROID__
|
||||
// #define SDL_PLATFORM_APPLE __APPLE__
|
||||
// #define SDL_PLATFORM_BSDI __BSDI__
|
||||
#ifdef __CYGWIN__
|
||||
#define SDL_PLATFORM_CYGWIN 1
|
||||
#endif
|
||||
// #define SDL_PLATFORM_EMSCRIPTEN __EMSCRIPTEN__
|
||||
// #define SDL_PLATFORM_FREEBSD __FREEBSD__
|
||||
// #define SDL_PLATFORM_GDK __GDK__
|
||||
// #define SDL_PLATFORM_HAIKU __HAIKU__
|
||||
// #define SDL_PLATFORM_HPUX __HPUX__
|
||||
// #define SDL_PLATFORM_IOS __IPHONEOS__
|
||||
// #define SDL_PLATFORM_IRIX __IRIX__
|
||||
// #define SDL_PLATFORM_LINUX __LINUX__
|
||||
// #define SDL_PLATFORM_MACOS __MACOSX__
|
||||
// #define SDL_PLATFORM_NETBSD __NETBSD__
|
||||
// #define SDL_PLATFORM_OPENBSD __OPENBSD__
|
||||
// #define SDL_PLATFORM_OS2 __OS2__
|
||||
// #define SDL_PLATFORM_OSF __OSF__
|
||||
// #define SDL_PLATFORM_PS2 __PS2__
|
||||
// #define SDL_PLATFORM_PSP __PSP__
|
||||
// #define SDL_PLATFORM_QNXNTO __QNXNTO__
|
||||
// #define SDL_PLATFORM_RISCOS __RISCOS__
|
||||
// #define SDL_PLATFORM_SOLARIS __SOLARIS__
|
||||
// #define SDL_PLATFORM_TVOS __TVOS__
|
||||
// #define SDL_PLATFORM_UNI __unix__
|
||||
// #define SDL_PLATFORM_VITA __VITA__
|
||||
// #define SDL_PLATFORM_WIN32 __WIN32__
|
||||
// #define SDL_PLATFORM_WINGDK __WINGDK__
|
||||
// #define SDL_PLATFORM_XBOXONE __XBOXONE__
|
||||
// #define SDL_PLATFORM_XBOXSERIES __XBOXSERIES__
|
||||
|
||||
#if defined(_WIN32) || defined(SDL_PLATFORM_CYGWIN)
|
||||
#define SDL_PLATFORM_WINDOWS 1
|
||||
#endif
|
||||
38
3rdparty/sdl3-shim/SDL3/SDL_surface.h
vendored
Normal file
38
3rdparty/sdl3-shim/SDL3/SDL_surface.h
vendored
Normal file
@ -0,0 +1,38 @@
|
||||
#pragma once
|
||||
|
||||
#include <SDL2/SDL_surface.h>
|
||||
#include "SDL_pixels.h"
|
||||
|
||||
// https://wiki.libsdl.org/SDL3/README-migration#sdl_surfaceh
|
||||
|
||||
#define SDL_FillSurfaceRect(...) (SDL_FillRect(__VA_ARGS__) == 0)
|
||||
|
||||
#define SDL_DestroySurface SDL_FreeSurface
|
||||
|
||||
#define SDL_LockSurface(...) (SDL_LockSurface(__VA_ARGS__) == 0)
|
||||
|
||||
template<typename T>
|
||||
SDL_Surface* SDL_CreateSurface( int width, int height, T format) {
|
||||
if constexpr (std::is_same_v<T, SDL_PixelFormat>) {
|
||||
return SDL_CreateRGBSurfaceWithFormat(0 , width, height, SDL_BITSPERPIXEL(format) ,format);
|
||||
} else {
|
||||
return SDL_CreateRGBSurfaceWithFormat(0 , width, height, SDL_BITSPERPIXEL(format->format) ,format->format);
|
||||
}
|
||||
}
|
||||
|
||||
inline SDL_Surface* SDL_ConvertSurface(SDL_Surface* surface, SDL_PixelFormat format)
|
||||
{
|
||||
return SDL_ConvertSurfaceFormat(surface, format, 0);
|
||||
};
|
||||
inline SDL_Surface* SDL_ConvertSurface(SDL_Surface* surface, const SDL_PixelFormatDetails* formatDetails)
|
||||
{
|
||||
return SDL_ConvertSurface(surface, formatDetails, 0);
|
||||
}
|
||||
|
||||
#define SDL_SCALEMODE_LINEAR SDL_ScaleModeLinear
|
||||
#define SDL_SCALEMODE_NEAREST SDL_ScaleModeNearest
|
||||
|
||||
#define SDL_BlitSurfaceScaled(surface, rect, destSurface, destRect, scaleMode) (SDL_BlitScaled(surface, rect, destSurface, destRect) == 0)
|
||||
#define SDL_SetSurfaceColorKey(...) (SDL_SetColorKey(__VA_ARGS__) == 0)
|
||||
|
||||
#define SDL_LoadBMP_IO SDL_LoadBMP_RW
|
||||
72
3rdparty/sdl3-shim/SDL3/SDL_timer.h
vendored
Normal file
72
3rdparty/sdl3-shim/SDL3/SDL_timer.h
vendored
Normal file
@ -0,0 +1,72 @@
|
||||
#pragma once
|
||||
|
||||
#include <SDL2/SDL.h>
|
||||
#include <SDL2/SDL_timer.h>
|
||||
#include <SDL2/SDL_mutex.h>
|
||||
|
||||
// https://wiki.libsdl.org/SDL3/README-migration#sdl_timerh
|
||||
// https://wiki.libsdl.org/SDL3/README-migration#sdl_timerh | SDL_GetTicksNS()
|
||||
|
||||
#define SDL_GetTicksNS SDL_GetTicks
|
||||
|
||||
// time is in miliseconds not nanoseconds
|
||||
#define SDL_NS_TO_MS(MS) (MS)
|
||||
|
||||
typedef Uint32 SDL3_TimerCallback(void* userdata, SDL_TimerID timerID, Uint32 interval);
|
||||
|
||||
struct SDL2TimerShimData {
|
||||
SDL3_TimerCallback* callback;
|
||||
void* userdata;
|
||||
SDL_TimerID id;
|
||||
};
|
||||
|
||||
inline std::map<SDL_TimerID, SDL2TimerShimData*> g_timers;
|
||||
inline SDL_mutex* g_timerMutex = SDL_CreateMutex();
|
||||
|
||||
inline Uint32 shim_timer_callback(Uint32 interval, void* param)
|
||||
{
|
||||
auto* shim = static_cast<SDL2TimerShimData*>(param);
|
||||
const Uint32 next = shim->callback(shim->userdata, shim->id, interval);
|
||||
|
||||
if (next == 0) {
|
||||
SDL_LockMutex(g_timerMutex);
|
||||
g_timers.erase(shim->id);
|
||||
SDL_free(shim);
|
||||
SDL_UnlockMutex(g_timerMutex);
|
||||
}
|
||||
|
||||
return next;
|
||||
}
|
||||
|
||||
inline SDL_TimerID SDL_AddTimer(Uint32 interval, SDL3_TimerCallback* callback, void* userdata)
|
||||
{
|
||||
auto* shim = static_cast<SDL2TimerShimData*>(SDL_malloc(sizeof(SDL2TimerShimData)));
|
||||
shim->callback = callback;
|
||||
shim->userdata = userdata;
|
||||
|
||||
const SDL_TimerID id = ::SDL_AddTimer(interval, shim_timer_callback, shim);
|
||||
if (id == 0) {
|
||||
SDL_free(shim);
|
||||
return 0;
|
||||
}
|
||||
shim->id = id;
|
||||
|
||||
SDL_LockMutex(g_timerMutex);
|
||||
g_timers[id] = shim;
|
||||
SDL_UnlockMutex(g_timerMutex);
|
||||
|
||||
return id;
|
||||
}
|
||||
|
||||
inline SDL_bool SDL_RemoveTimer2(SDL_TimerID id)
|
||||
{
|
||||
SDL_LockMutex(g_timerMutex);
|
||||
if (const auto it = g_timers.find(id); it != g_timers.end()) {
|
||||
SDL_free(it->second);
|
||||
g_timers.erase(it);
|
||||
}
|
||||
SDL_UnlockMutex(g_timerMutex);
|
||||
|
||||
return ::SDL_RemoveTimer(id);
|
||||
}
|
||||
#define SDL_RemoveTimer SDL_RemoveTimer2
|
||||
30
3rdparty/sdl3-shim/main.cpp
vendored
Normal file
30
3rdparty/sdl3-shim/main.cpp
vendored
Normal file
@ -0,0 +1,30 @@
|
||||
#include <SDL2/SDL.h>
|
||||
#include "SDL3/SDL_events.h"
|
||||
#include "SDL3/SDL_main.h"
|
||||
|
||||
static void TranslateSDLEvents(SDL_Event* e)
|
||||
{
|
||||
// Extend to SDL_DISPLAYEVENT & fully replace the event object passed to AppEvent
|
||||
// if wanting to drop the ifs on key, mouse and keyboard events.
|
||||
if (e->type == SDL_WINDOWEVENT) {
|
||||
e->type = SDL_WINDOWEVENT + 2 + e->window.event;
|
||||
}
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
void *appstate = NULL;
|
||||
if (SDL_AppInit(&appstate, argc, argv) != 0) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
SDL_Event e;
|
||||
while (!SDL_AppIterate(appstate)) {
|
||||
while (SDL_PollEvent(&e)) {
|
||||
TranslateSDLEvents(&e);
|
||||
SDL_AppEvent(appstate, &e);
|
||||
}
|
||||
}
|
||||
|
||||
SDL_AppQuit(appstate, static_cast<SDL_AppResult>(NULL));
|
||||
return 0;
|
||||
}
|
||||
@ -55,6 +55,7 @@ cmake_dependent_option(ISLE_COMPILE_SHADERS "Compile shaders" ON "SDL_SHADERCROS
|
||||
option(CMAKE_POSITION_INDEPENDENT_CODE "Build with -fPIC" ON)
|
||||
option(ENABLE_CLANG_TIDY "Enable clang-tidy")
|
||||
option(DOWNLOAD_DEPENDENCIES "Download dependencies" ON)
|
||||
option(USE_SDL2 "Use SDL2 instead of SDL3 via a shim" OFF)
|
||||
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}" CACHE PATH "Directory where to put executables and dll")
|
||||
set(ISLE_EMSCRIPTEN_HOST "" CACHE STRING "Host URL for Emscripten streaming (e.g., https://test.com)")
|
||||
cmake_dependent_option(BUILD_SHARED_LIBS "Build lego1 as a shared library" ON "NOT EMSCRIPTEN" OFF)
|
||||
@ -66,6 +67,7 @@ message(STATUS "Internal miniwin: ${ISLE_MINIWIN}")
|
||||
message(STATUS "Isle extensions: ${ISLE_EXTENSIONS}")
|
||||
message(STATUS "Isle debugging: ${ISLE_DEBUG}")
|
||||
message(STATUS "Compile shaders: ${ISLE_COMPILE_SHADERS}")
|
||||
message(STATUS "Use SDL2: ${USE_SDL2}")
|
||||
|
||||
add_library(Isle::iniparser INTERFACE IMPORTED)
|
||||
|
||||
@ -74,26 +76,41 @@ if (DOWNLOAD_DEPENDENCIES)
|
||||
message(STATUS "Fetching SDL3 and iniparser. This might take a while...")
|
||||
include(FetchContent)
|
||||
|
||||
if(ANDROID)
|
||||
# Built by Gradle
|
||||
find_package(SDL3 REQUIRED CONFIG COMPONENTS Shared)
|
||||
else()
|
||||
if (WINDOWS_STORE)
|
||||
FetchContent_Declare(
|
||||
SDL3
|
||||
GIT_REPOSITORY "https://github.com/Helloyunho/SDL3-uwp.git"
|
||||
GIT_TAG "main"
|
||||
EXCLUDE_FROM_ALL
|
||||
)
|
||||
if(NOT USE_SDL2)
|
||||
if(ANDROID)
|
||||
# Built by Gradle
|
||||
find_package(SDL3 REQUIRED CONFIG COMPONENTS Shared)
|
||||
else()
|
||||
FetchContent_Declare(
|
||||
SDL3
|
||||
GIT_REPOSITORY "https://github.com/libsdl-org/SDL.git"
|
||||
GIT_TAG "main"
|
||||
EXCLUDE_FROM_ALL
|
||||
)
|
||||
if (WINDOWS_STORE)
|
||||
FetchContent_Declare(
|
||||
SDL3
|
||||
GIT_REPOSITORY "https://github.com/Helloyunho/SDL3-uwp.git"
|
||||
GIT_TAG "main"
|
||||
EXCLUDE_FROM_ALL
|
||||
)
|
||||
else()
|
||||
FetchContent_Declare(
|
||||
SDL3
|
||||
GIT_REPOSITORY "https://github.com/libsdl-org/SDL.git"
|
||||
GIT_TAG "main"
|
||||
EXCLUDE_FROM_ALL
|
||||
)
|
||||
endif()
|
||||
FetchContent_MakeAvailable(SDL3)
|
||||
endif()
|
||||
FetchContent_MakeAvailable(SDL3)
|
||||
else()
|
||||
FetchContent_Declare(
|
||||
SDL2
|
||||
GIT_REPOSITORY "https://github.com/libsdl-org/SDL.git"
|
||||
GIT_TAG SDL2
|
||||
EXCLUDE_FROM_ALL
|
||||
)
|
||||
# set(SDL_STATIC ON CACHE BOOL "" FORCE)
|
||||
# set(SDL_SHARED OFF CACHE BOOL "" FORCE)
|
||||
FetchContent_MakeAvailable(SDL2)
|
||||
|
||||
set(SDL2_INCLUDE_DIR ${SDL2_SOURCE_DIR}/include)
|
||||
add_subdirectory(3rdparty/sdl3-shim SYSTEM)
|
||||
endif()
|
||||
|
||||
FetchContent_Declare(
|
||||
@ -112,7 +129,12 @@ else()
|
||||
# find_package looks for already-installed system packages.
|
||||
# Configure with `-DCMAKE_PREFIX_PATH="/path/to/package1;/path/to/package2"`
|
||||
# to add search paths.
|
||||
find_package(SDL3 CONFIG REQUIRED)
|
||||
if(NOT USE_SDL2)
|
||||
find_package(SDL3 CONFIG REQUIRED)
|
||||
else()
|
||||
find_package(SDL2 CONFIG REQUIRED)
|
||||
add_subdirectory(3rdparty/sdl3-shim SYSTEM)
|
||||
endif()
|
||||
|
||||
find_package(iniparser REQUIRED CONFIG COMPONENTS shared)
|
||||
target_link_libraries(Isle::iniparser INTERFACE iniparser-shared)
|
||||
|
||||
@ -480,10 +480,16 @@ SDL_AppResult SDL_AppEvent(void* appstate, SDL_Event* event)
|
||||
if (event->key.repeat) {
|
||||
break;
|
||||
}
|
||||
|
||||
#if SDL_MAJOR_VERSION >= 3
|
||||
SDL_Keycode keyCode = event->key.key;
|
||||
|
||||
if ((event->key.mod & SDL_KMOD_LALT) && keyCode == SDLK_RETURN) {
|
||||
#else
|
||||
SDL_Keycode keyCode = event->key.keysym.sym;
|
||||
|
||||
if ((event->key.keysym.mod & SDL_KMOD_LALT) && keyCode == SDLK_RETURN) {
|
||||
#endif
|
||||
|
||||
SDL_SetWindowFullscreen(window, !(SDL_GetWindowFlags(window) & SDL_WINDOW_FULLSCREEN));
|
||||
}
|
||||
else {
|
||||
@ -493,6 +499,7 @@ SDL_AppResult SDL_AppEvent(void* appstate, SDL_Event* event)
|
||||
}
|
||||
break;
|
||||
}
|
||||
#if SDL_MAJOR_VERSION >= 3
|
||||
case SDL_EVENT_KEYBOARD_ADDED:
|
||||
if (InputManager()) {
|
||||
InputManager()->AddKeyboard(event->kdevice.which);
|
||||
@ -513,6 +520,7 @@ SDL_AppResult SDL_AppEvent(void* appstate, SDL_Event* event)
|
||||
InputManager()->RemoveMouse(event->mdevice.which);
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
case SDL_EVENT_GAMEPAD_ADDED:
|
||||
if (InputManager()) {
|
||||
InputManager()->AddJoystick(event->jdevice.which);
|
||||
@ -879,20 +887,34 @@ MxResult IsleApp::SetupWindow()
|
||||
m_cursorBusyBitmap = &busy_cursor;
|
||||
m_cursorNoBitmap = &no_cursor;
|
||||
|
||||
#if SDL_MAJOR_VERSION >= 3
|
||||
SDL_PropertiesID props = SDL_CreateProperties();
|
||||
SDL_SetNumberProperty(props, SDL_PROP_WINDOW_CREATE_WIDTH_NUMBER, g_targetWidth);
|
||||
SDL_SetNumberProperty(props, SDL_PROP_WINDOW_CREATE_HEIGHT_NUMBER, g_targetHeight);
|
||||
SDL_SetBooleanProperty(props, SDL_PROP_WINDOW_CREATE_FULLSCREEN_BOOLEAN, m_fullScreen);
|
||||
SDL_SetStringProperty(props, SDL_PROP_WINDOW_CREATE_TITLE_STRING, WINDOW_TITLE);
|
||||
#endif
|
||||
#if defined(MINIWIN) && !defined(__3DS__) && !defined(WINDOWS_STORE)
|
||||
#if SDL_MAJOR_VERSION >= 3
|
||||
SDL_SetBooleanProperty(props, SDL_PROP_WINDOW_CREATE_OPENGL_BOOLEAN, true);
|
||||
#endif
|
||||
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
|
||||
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);
|
||||
#endif
|
||||
|
||||
#if SDL_MAJOR_VERSION >= 3
|
||||
window = SDL_CreateWindowWithProperties(props);
|
||||
SDL_SetPointerProperty(SDL_GetWindowProperties(window), ISLE_PROP_WINDOW_CREATE_VIDEO_PARAM, &m_videoParam);
|
||||
#else
|
||||
Uint32 flags = 0;
|
||||
flags |= SDL_WINDOW_OPENGL;
|
||||
if (m_fullScreen) {
|
||||
flags |= SDL_WINDOW_FULLSCREEN;
|
||||
}
|
||||
window = SDL_CreateWindow(WINDOW_TITLE, g_targetWidth, g_targetHeight, flags);
|
||||
|
||||
SDL_SetWindowData(window, ISLE_PROP_WINDOW_CREATE_VIDEO_PARAM, &m_videoParam);
|
||||
#endif
|
||||
if (m_exclusiveFullScreen && m_fullScreen) {
|
||||
SDL_DisplayMode closestMode;
|
||||
SDL_DisplayID displayID = SDL_GetDisplayForWindow(window);
|
||||
@ -914,9 +936,9 @@ MxResult IsleApp::SetupWindow()
|
||||
m_windowHandle =
|
||||
(HWND) SDL_GetPointerProperty(SDL_GetWindowProperties(window), SDL_PROP_WINDOW_WIN32_HWND_POINTER, NULL);
|
||||
#endif
|
||||
|
||||
#if SDL_MAJOR_VERSION >= 3
|
||||
SDL_DestroyProperties(props);
|
||||
|
||||
#endif
|
||||
if (!m_windowHandle) {
|
||||
return FAILURE;
|
||||
}
|
||||
|
||||
@ -12,8 +12,19 @@
|
||||
#include "mxticklemanager.h"
|
||||
|
||||
#include <SDL3/SDL.h>
|
||||
#if SDL_MAJOR_VERSION >= 3
|
||||
#include <backends/imgui_impl_sdl3.h>
|
||||
#include <backends/imgui_impl_sdlrenderer3.h>
|
||||
#else
|
||||
#include <backends/imgui_impl_sdl2.h>
|
||||
#include <backends/imgui_impl_sdlrenderer2.h>
|
||||
#define ImGui_ImplSDL3_InitForSDLRenderer ImGui_ImplSDL2_InitForSDLRenderer
|
||||
#define ImGui_ImplSDLRenderer3_Init ImGui_ImplSDLRenderer2_Init
|
||||
#define ImGui_ImplSDL3_ProcessEvent ImGui_ImplSDL2_ProcessEvent
|
||||
#define ImGui_ImplSDLRenderer3_NewFrame ImGui_ImplSDLRenderer2_NewFrame
|
||||
#define ImGui_ImplSDL3_NewFrame ImGui_ImplSDL2_NewFrame
|
||||
#define ImGui_ImplSDLRenderer3_RenderDrawData ImGui_ImplSDLRenderer2_RenderDrawData
|
||||
#endif
|
||||
#include <imgui.h>
|
||||
|
||||
#ifdef ISLE_VALGRIND
|
||||
@ -221,7 +232,11 @@ bool IsleDebug_Event(SDL_Event* event)
|
||||
return false;
|
||||
}
|
||||
if (event->type == SDL_EVENT_KEY_DOWN) {
|
||||
#if SDL_MAJOR_VERSION >= 3
|
||||
if (event->key.scancode == SCANCODE_KEY_PAUSE) {
|
||||
#else
|
||||
if (event->key.keysym.scancode == SCANCODE_KEY_PAUSE) {
|
||||
#endif
|
||||
if (!g_debugPaused) {
|
||||
IsleDebug_SetPaused(true);
|
||||
}
|
||||
@ -230,7 +245,11 @@ bool IsleDebug_Event(SDL_Event* event)
|
||||
}
|
||||
return true;
|
||||
}
|
||||
#if SDL_MAJOR_VERSION >= 3
|
||||
if (event->key.scancode == SCANCODE_KEY_RESUME) {
|
||||
#else
|
||||
if (event->key.keysym.scancode == SCANCODE_KEY_RESUME) {
|
||||
#endif
|
||||
g_debugDoStep = false;
|
||||
if (g_debugPaused) {
|
||||
IsleDebug_SetPaused(false);
|
||||
|
||||
@ -8,6 +8,7 @@
|
||||
#include "mxpresenter.h"
|
||||
#include "mxqueue.h"
|
||||
|
||||
#include <SDL3/SDL.h>
|
||||
#include <SDL3/SDL_haptic.h>
|
||||
#include <SDL3/SDL_joystick.h>
|
||||
#include <SDL3/SDL_keyboard.h>
|
||||
|
||||
@ -31,9 +31,12 @@
|
||||
#include "realtime/realtime.h"
|
||||
#include "scripts.h"
|
||||
|
||||
#include <SDL3/SDL_events.h>
|
||||
#if SDL_MAJOR_VERSION >= 3
|
||||
#include <SDL3/SDL_process.h>
|
||||
#endif
|
||||
#include <SDL3/SDL_events.h>
|
||||
#include <SDL3/SDL_stdinc.h>
|
||||
#include <SDL3/SDL_version.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <vec.h>
|
||||
@ -322,8 +325,10 @@ void InvokeAction(Extra::ActionType p_actionId, const MxAtomId& p_pAtom, MxS32 p
|
||||
|
||||
break;
|
||||
case Extra::ActionType::e_run: {
|
||||
#if SDL_MAJOR_VERSION >= 3
|
||||
const char* args[] = {"/lego/sources/main/main.exe", "/script", p_pAtom.GetInternal(), NULL};
|
||||
SDL_Process* process = SDL_CreateProcess(args, false);
|
||||
#endif
|
||||
} break;
|
||||
case Extra::ActionType::e_enable:
|
||||
assert(p_streamId != DS_NOT_A_STREAM);
|
||||
|
||||
@ -13,6 +13,7 @@
|
||||
#include "roi/legoroi.h"
|
||||
|
||||
#include <SDL3/SDL_log.h>
|
||||
#include <SDL3/SDL_version.h>
|
||||
|
||||
DECOMP_SIZE_ASSERT(LegoInputManager, 0x338)
|
||||
DECOMP_SIZE_ASSERT(LegoNotifyList, 0x18)
|
||||
@ -783,14 +784,26 @@ void LegoInputManager::UpdateLastInputMethod(SDL_Event* p_event)
|
||||
switch (p_event->type) {
|
||||
case SDL_EVENT_KEY_DOWN:
|
||||
case SDL_EVENT_KEY_UP:
|
||||
#if SDL_MAJOR_VERSION >= 3
|
||||
m_lastInputMethod = SDL_KeyboardID_v{p_event->key.which};
|
||||
#else
|
||||
m_lastInputMethod = SDL_KeyboardID_v{1};
|
||||
#endif
|
||||
break;
|
||||
case SDL_EVENT_MOUSE_BUTTON_DOWN:
|
||||
case SDL_EVENT_MOUSE_BUTTON_UP:
|
||||
#if SDL_MAJOR_VERSION >= 3
|
||||
m_lastInputMethod = SDL_MouseID_v{p_event->button.which};
|
||||
#else
|
||||
m_lastInputMethod = SDL_MouseID_v{1};
|
||||
#endif
|
||||
break;
|
||||
case SDL_EVENT_MOUSE_MOTION:
|
||||
#if SDL_MAJOR_VERSION >= 3
|
||||
m_lastInputMethod = SDL_MouseID_v{p_event->motion.which};
|
||||
#else
|
||||
m_lastInputMethod = SDL_MouseID_v{1};
|
||||
#endif
|
||||
break;
|
||||
case SDL_EVENT_GAMEPAD_BUTTON_DOWN:
|
||||
case SDL_EVENT_GAMEPAD_BUTTON_UP:
|
||||
|
||||
@ -72,11 +72,16 @@ BOOL MxDirect3D::Create(
|
||||
}
|
||||
|
||||
if (m_pDirect3d->QueryInterface(IID_IDirect3DMiniwin, (void**) &miniwind3d) == DD_OK) {
|
||||
#if SDL_MAJOR_VERSION >= 3
|
||||
MxVideoParam* videoParam = (MxVideoParam*) SDL_GetPointerProperty(
|
||||
SDL_GetWindowProperties(reinterpret_cast<SDL_Window*>(hWnd)),
|
||||
ISLE_PROP_WINDOW_CREATE_VIDEO_PARAM,
|
||||
nullptr
|
||||
);
|
||||
#else
|
||||
MxVideoParam* videoParam =
|
||||
(MxVideoParam*) SDL_GetWindowData(reinterpret_cast<SDL_Window*>(hWnd), ISLE_PROP_WINDOW_CREATE_VIDEO_PARAM);
|
||||
#endif
|
||||
#ifndef MXDIRECTX_FOR_CONFIG
|
||||
assert(videoParam);
|
||||
#endif
|
||||
|
||||
@ -3,6 +3,7 @@
|
||||
#include "omni/include/mxvideoparam.h"
|
||||
|
||||
#include <SDL3/SDL_log.h>
|
||||
#include <SDL3/SDL_version.h>
|
||||
#include <assert.h>
|
||||
#include <miniwin/miniwind3d.h>
|
||||
#include <stdio.h> // for vsprintf
|
||||
@ -228,11 +229,16 @@ BOOL MxDeviceEnumerate::EnumDirectDrawCallback(LPGUID p_guid, LPSTR p_driverDesc
|
||||
|
||||
result = lpDD->QueryInterface(IID_IDirect3DMiniwin, (void**) &miniwind3d);
|
||||
if (result == DD_OK) {
|
||||
#if SDL_MAJOR_VERSION >= 3
|
||||
MxVideoParam* videoParam = (MxVideoParam*) SDL_GetPointerProperty(
|
||||
SDL_GetWindowProperties(reinterpret_cast<SDL_Window*>(m_hWnd)),
|
||||
ISLE_PROP_WINDOW_CREATE_VIDEO_PARAM,
|
||||
nullptr
|
||||
);
|
||||
#else
|
||||
MxVideoParam* videoParam = (MxVideoParam*)
|
||||
SDL_GetWindowData(reinterpret_cast<SDL_Window*>(m_hWnd), ISLE_PROP_WINDOW_CREATE_VIDEO_PARAM);
|
||||
#endif
|
||||
#ifndef MXDIRECTX_FOR_CONFIG
|
||||
assert(videoParam);
|
||||
#endif
|
||||
|
||||
@ -3,6 +3,7 @@
|
||||
#include "decomp.h"
|
||||
|
||||
#include <SDL3/SDL_timer.h>
|
||||
#include <SDL3/SDL_version.h>
|
||||
|
||||
DECOMP_SIZE_ASSERT(MxThread, 0x1c)
|
||||
|
||||
@ -34,6 +35,7 @@ MxResult MxThread::Start(MxS32 p_stackSize, MxS32 p_flag)
|
||||
}
|
||||
|
||||
{
|
||||
#if SDL_MAJOR_VERSION >= 3
|
||||
const SDL_PropertiesID props = SDL_CreateProperties();
|
||||
SDL_SetPointerProperty(props, SDL_PROP_THREAD_CREATE_ENTRY_FUNCTION_POINTER, (void*) MxThread::ThreadProc);
|
||||
SDL_SetPointerProperty(props, SDL_PROP_THREAD_CREATE_USERDATA_POINTER, this);
|
||||
@ -44,6 +46,11 @@ MxResult MxThread::Start(MxS32 p_stackSize, MxS32 p_flag)
|
||||
}
|
||||
|
||||
SDL_DestroyProperties(props);
|
||||
#else
|
||||
if (!((m_thread = SDL_CreateThread(&MxThread::ThreadProc, "MxThread", this)))) {
|
||||
goto done;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
result = SUCCESS;
|
||||
|
||||
@ -28,7 +28,9 @@ target_compile_definitions(miniwin PRIVATE
|
||||
)
|
||||
|
||||
list(APPEND GRAPHICS_BACKENDS USE_SOFTWARE_RENDER)
|
||||
list(APPEND GRAPHICS_BACKENDS USE_SDL_GPU)
|
||||
if(NOT USE_SDL2)
|
||||
list(APPEND GRAPHICS_BACKENDS USE_SDL_GPU)
|
||||
endif()
|
||||
|
||||
if(NOT WINDOWS_STORE)
|
||||
find_package(OpenGL)
|
||||
@ -116,11 +118,16 @@ endif()
|
||||
|
||||
target_compile_definitions(miniwin PUBLIC MINIWIN)
|
||||
|
||||
target_include_directories(miniwin PRIVATE
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/src/internal
|
||||
)
|
||||
|
||||
if(USE_SDL_GPU IN_LIST GRAPHICS_BACKENDS)
|
||||
target_include_directories(miniwin
|
||||
PRIVATE
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/src/internal
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/src/d3drm/backends/sdl3gpu/shaders/generated
|
||||
)
|
||||
endif()
|
||||
target_link_libraries(miniwin PUBLIC miniwin-headers)
|
||||
|
||||
target_link_libraries(miniwin PRIVATE SDL3::SDL3)
|
||||
@ -129,7 +136,7 @@ target_compile_definitions(miniwin PUBLIC ${GRAPHICS_BACKENDS})
|
||||
|
||||
|
||||
# Shader stuff
|
||||
|
||||
if(USE_SDL_GPU IN_LIST GRAPHICS_BACKENDS)
|
||||
set(shader_src_dir "${CMAKE_CURRENT_SOURCE_DIR}/src/d3drm/backends/sdl3gpu/shaders/src")
|
||||
set(shader_gen_dir "${CMAKE_CURRENT_SOURCE_DIR}/src/d3drm/backends/sdl3gpu/shaders/generated")
|
||||
set(py_gencshadersource "${CMAKE_CURRENT_SOURCE_DIR}/src/d3drm/backends/sdl3gpu/shaders/gencshadersource.py")
|
||||
@ -213,7 +220,7 @@ endforeach()
|
||||
|
||||
set(index_cpp "${shader_gen_dir}/ShaderIndex.cpp")
|
||||
set(index_h "${shader_gen_dir}/ShaderIndex.h")
|
||||
|
||||
endif()
|
||||
if(ISLE_COMPILE_SHADERS)
|
||||
add_custom_command(OUTPUT "${index_h}" "${index_cpp}"
|
||||
COMMAND Python3::Interpreter "${py_gencshadersource}" "index"
|
||||
|
||||
@ -152,7 +152,7 @@ HRESULT DirectDrawImpl::EnumDisplayModes(
|
||||
#ifdef MINIWIN_PIXELFORMAT
|
||||
format = MINIWIN_PIXELFORMAT;
|
||||
#else
|
||||
format = modes[i]->format;
|
||||
format = static_cast<SDL_PixelFormat>(modes[i]->format);
|
||||
#endif
|
||||
|
||||
const SDL_PixelFormatDetails* details = SDL_GetPixelFormatDetails(format);
|
||||
@ -245,7 +245,7 @@ HRESULT DirectDrawImpl::GetDisplayMode(LPDDSURFACEDESC lpDDSurfaceDesc)
|
||||
#ifdef MINIWIN_PIXELFORMAT
|
||||
format = MINIWIN_PIXELFORMAT;
|
||||
#else
|
||||
format = mode->format;
|
||||
format = static_cast<SDL_PixelFormat>(mode->format);
|
||||
#endif
|
||||
|
||||
const SDL_PixelFormatDetails* details = SDL_GetPixelFormatDetails(format);
|
||||
|
||||
Loading…
Reference in New Issue
Block a user