From 4a1d15965dbb8487555740dabcddda721ebf5d21 Mon Sep 17 00:00:00 2001 From: Matthieu Milan Date: Sun, 15 Dec 2019 01:29:42 +0100 Subject: [PATCH] Add Nintendo Switch support --- Code/CMakeLists.txt | 16 ++++++++++++++++ Code/Libraries/3D/src/GL2/gl2renderer.cpp | 2 +- Code/Libraries/Core/src/core.h | 4 ++++ Code/Libraries/Core/src/display.cpp | 6 +++++- Code/Libraries/Core/src/fileutil.cpp | 6 +++--- Code/Libraries/Core/src/inputsystem.cpp | 6 +++++- Code/Libraries/Core/src/timedate.cpp | 2 +- Code/Libraries/Core/src/timedate.h | 2 +- Code/Libraries/Core/src/versions.h | 10 ++++++++-- Code/Libraries/Core/src/xinputcontroller.cpp | 9 ++++++++- Code/Libraries/Framework/CMakeLists.txt | 3 +++ Code/Libraries/Framework/src/framework3d.cpp | 17 +++++++++++++++-- Code/Libraries/Framework/src/framework3d.h | 4 +++- Code/Projects/Eld/src/eldframework.cpp | 4 ++++ Code/Projects/Eld/src/main.cpp | 9 +++++++++ Code/icon.jpg | Bin 0 -> 29144 bytes 16 files changed, 86 insertions(+), 14 deletions(-) create mode 100644 Code/icon.jpg diff --git a/Code/CMakeLists.txt b/Code/CMakeLists.txt index 405c83b..ac79c45 100644 --- a/Code/CMakeLists.txt +++ b/Code/CMakeLists.txt @@ -48,6 +48,22 @@ if(GLES) add_definitions(-DHAVE_GLES) endif(GLES) +if(SWITCH_LIBNX) + set(CMAKE_CXX_FLAGS "-O3 -march=armv8-a -mtune=cortex-a57 -mtp=soft -fPIE -ffunction-sections -fdata-sections -ftls-model=local-exec") + include_directories($ENV{DEVKITPRO}/libnx/include $ENV{DEVKITPRO}/portlibs/switch/include) + add_definitions(-D__SWITCH__) + add_custom_target(${CMAKE_PROJECT_NAME}.nro + DEPENDS ${CMAKE_PROJECT_NAME} + COMMAND nacptool --create "Eldritch" "usineur" "406" ${CMAKE_PROJECT_NAME}.nacp + COMMAND elf2nro Projects/Eld/${CMAKE_PROJECT_NAME} ${CMAKE_PROJECT_NAME}.nro + --icon=${CMAKE_SOURCE_DIR}/icon.jpg --nacp=${CMAKE_PROJECT_NAME}.nacp + ) + add_custom_target(nxlink + DEPENDS ${CMAKE_PROJECT_NAME}.nro + COMMAND nxlink -a $(SWITCHIP) ${CMAKE_PROJECT_NAME}.nro -s -p ${CMAKE_PROJECT_NAME}/${CMAKE_PROJECT_NAME}.nro + ) +endif(SWITCH_LIBNX) + add_subdirectory(Libraries/Core/) add_subdirectory(Libraries/Math/) add_subdirectory(Libraries/3D/) diff --git a/Code/Libraries/3D/src/GL2/gl2renderer.cpp b/Code/Libraries/3D/src/GL2/gl2renderer.cpp index 40adda4..63202ca 100644 --- a/Code/Libraries/3D/src/GL2/gl2renderer.cpp +++ b/Code/Libraries/3D/src/GL2/gl2renderer.cpp @@ -220,7 +220,7 @@ bool GL2Renderer::Reset() /*virtual*/ void GL2Renderer::Refresh() { -#if BUILD_SDL +#if BUILD_SDL && !BUILD_SWITCH // On Linux, at least, SDL needs to be set as the current context *after* the // GL window is shown, so this allows be to do it there. if( m_Window && m_Window->GetSDLWindow() && m_RenderContext ) diff --git a/Code/Libraries/Core/src/core.h b/Code/Libraries/Core/src/core.h index 76c211e..01017f9 100644 --- a/Code/Libraries/Core/src/core.h +++ b/Code/Libraries/Core/src/core.h @@ -35,6 +35,10 @@ #include #endif +#if BUILD_SWITCH +#include +#endif + // This should be the first file included in every .cpp (even before that // file's matching header). // This should be kept a very lightweight include that can go anywhere. diff --git a/Code/Libraries/Core/src/display.cpp b/Code/Libraries/Core/src/display.cpp index 24ad46d..af1768c 100644 --- a/Code/Libraries/Core/src/display.cpp +++ b/Code/Libraries/Core/src/display.cpp @@ -34,7 +34,11 @@ Display::Display() m_AspectRatio = static_cast( m_Width ) / static_cast( m_Height ); STATICHASH( Fullscreen ); +#if BUILD_SWITCH + m_Fullscreen = true; +#else m_Fullscreen = ConfigManager::GetBool( sFullscreen ); +#endif #if BUILD_LINUX // On Linux, changing the screen resolution isn't really supported, so always upscale. @@ -358,4 +362,4 @@ void Display::GetCurrentDisplayMode( int& Width, int& Height, int& RefreshRate ) PRINTF( "Using display mode %dx%d\n", BestDisplayMode.Width, BestDisplayMode.Height ); return BestDisplayMode; -} \ No newline at end of file +} diff --git a/Code/Libraries/Core/src/fileutil.cpp b/Code/Libraries/Core/src/fileutil.cpp index 71b83e1..54a4d3a 100644 --- a/Code/Libraries/Core/src/fileutil.cpp +++ b/Code/Libraries/Core/src/fileutil.cpp @@ -9,7 +9,7 @@ #include #endif -#if BUILD_LINUX || BUILD_MAC +#if BUILD_LINUX || BUILD_MAC || BUILD_SWITCH #include #include #include @@ -383,7 +383,7 @@ void GetFilesInFolderInternal( const SimpleString& Path, const SimpleString& Pre FindClose( FileHandle ); } -#elif BUILD_LINUX || BUILD_MAC +#elif BUILD_LINUX || BUILD_MAC || BUILD_SWITCH DIR* pDirectory = opendir( Path.CStr() ); if( pDirectory ) { @@ -465,7 +465,7 @@ void GetFoldersInFolderInternal( const SimpleString& Path, const SimpleString& P FindClose( FileHandle ); } -#elif BUILD_LINUX || BUILD_MAC +#elif BUILD_LINUX || BUILD_MAC || BUILD_SWITCH DIR* pDirectory = opendir( Path.CStr() ); if( pDirectory ) { diff --git a/Code/Libraries/Core/src/inputsystem.cpp b/Code/Libraries/Core/src/inputsystem.cpp index 1f4b8ee..10fa0bd 100644 --- a/Code/Libraries/Core/src/inputsystem.cpp +++ b/Code/Libraries/Core/src/inputsystem.cpp @@ -830,7 +830,11 @@ float InputSystem::GetVelocity( const HashedString& Axis ) const void InputSystem::SetMouseScale( const HashedString& Axis, const float Scale ) { DEBUGASSERT( m_MouseAdjustments.Search( Axis ).IsValid() ); +#if BUILD_SWITCH + m_MouseAdjustments[ Axis ].m_ScaleFactor = 0; +#else m_MouseAdjustments[ Axis ].m_ScaleFactor = Scale; +#endif } bool InputSystem::GetMouseInvert( const HashedString& Axis ) @@ -1788,4 +1792,4 @@ void InputSystem::PublishDisplayInputString( const SDisplayInput& DisplayInput ) MAKEHASH( m_DefinitionName ); MAKEHASHFROM( InputName, DisplayInput.m_Name ); ConfigManager::SetString( sInputName, InputString.CStr(), sm_DefinitionName ); -} \ No newline at end of file +} diff --git a/Code/Libraries/Core/src/timedate.cpp b/Code/Libraries/Core/src/timedate.cpp index 3df70bc..39ac834 100644 --- a/Code/Libraries/Core/src/timedate.cpp +++ b/Code/Libraries/Core/src/timedate.cpp @@ -10,7 +10,7 @@ timedate_tm_t TimeDate::GetLocalTime() _tzset(); // Apply environment variables so that _localtime_s will convert properly _time64( &Time ); _localtime64_s( &TimeStruct, &Time ); -#elif BUILD_LINUX || BUILD_MAC +#elif BUILD_LINUX || BUILD_MAC || BUILD_SWITCH tzset(); time( &Time ); localtime_r( &Time, &TimeStruct ); diff --git a/Code/Libraries/Core/src/timedate.h b/Code/Libraries/Core/src/timedate.h index 51cc4d5..a5cfa0a 100644 --- a/Code/Libraries/Core/src/timedate.h +++ b/Code/Libraries/Core/src/timedate.h @@ -7,7 +7,7 @@ #include typedef __time64_t timedate_time_t; typedef struct tm timedate_tm_t; -#elif BUILD_LINUX || BUILD_MAC +#elif BUILD_LINUX || BUILD_MAC || BUILD_SWITCH #include typedef time_t timedate_time_t; typedef struct tm timedate_tm_t; diff --git a/Code/Libraries/Core/src/versions.h b/Code/Libraries/Core/src/versions.h index 3d53833..e392328 100644 --- a/Code/Libraries/Core/src/versions.h +++ b/Code/Libraries/Core/src/versions.h @@ -19,8 +19,14 @@ #define BUILD_LINUX 0 #endif +#ifdef __SWITCH__ +#define BUILD_SWITCH 1 +#else +#define BUILD_SWITCH 0 +#endif + #define BUILD_STEAM 0 -#define BUILD_SDL ( 0 || BUILD_MAC || BUILD_LINUX ) +#define BUILD_SDL ( 0 || BUILD_MAC || BUILD_LINUX || BUILD_SWITCH ) #define BUILD_WINDOWS_NO_SDL ( BUILD_WINDOWS && ( !BUILD_SDL ) ) #define REPORT_BUILD 0 @@ -50,4 +56,4 @@ #endif #endif // REPORT_BUILD -#endif // VERSIONS_H \ No newline at end of file +#endif // VERSIONS_H diff --git a/Code/Libraries/Core/src/xinputcontroller.cpp b/Code/Libraries/Core/src/xinputcontroller.cpp index fe21194..a7be097 100644 --- a/Code/Libraries/Core/src/xinputcontroller.cpp +++ b/Code/Libraries/Core/src/xinputcontroller.cpp @@ -346,10 +346,17 @@ void XInputController::Tick( const float DeltaTime ) if( SDL_GameControllerGetAttached( m_Controller ) ) { #define SET_BUTTON( EB, SDLB ) m_CurrentState.m_Buttons[ EB ] = SDL_GameControllerGetButton( m_Controller, SDLB ) != 0 +#if BUILD_SWITCH + SET_BUTTON( EB_A, SDL_CONTROLLER_BUTTON_B ); + SET_BUTTON( EB_B, SDL_CONTROLLER_BUTTON_A ); + SET_BUTTON( EB_X, SDL_CONTROLLER_BUTTON_Y ); + SET_BUTTON( EB_Y, SDL_CONTROLLER_BUTTON_X ); +#else SET_BUTTON( EB_A, SDL_CONTROLLER_BUTTON_A ); SET_BUTTON( EB_B, SDL_CONTROLLER_BUTTON_B ); SET_BUTTON( EB_X, SDL_CONTROLLER_BUTTON_X ); SET_BUTTON( EB_Y, SDL_CONTROLLER_BUTTON_Y ); +#endif SET_BUTTON( EB_Up, SDL_CONTROLLER_BUTTON_DPAD_UP ); SET_BUTTON( EB_Down, SDL_CONTROLLER_BUTTON_DPAD_DOWN ); SET_BUTTON( EB_Left, SDL_CONTROLLER_BUTTON_DPAD_LEFT ); @@ -483,4 +490,4 @@ void XInputController::SetFeedback( float Low, float High ) Low = Saturate( Low ); High = Saturate( High ); SetVibration( ( c_uint16 )( Low * 65535.0f ), ( c_uint16 )( High * 65535.0f ) ); -} \ No newline at end of file +} diff --git a/Code/Libraries/Framework/CMakeLists.txt b/Code/Libraries/Framework/CMakeLists.txt index 022f3b7..60dd7e9 100644 --- a/Code/Libraries/Framework/CMakeLists.txt +++ b/Code/Libraries/Framework/CMakeLists.txt @@ -25,3 +25,6 @@ add_library(Framework ${framework_src}) target_link_libraries(Framework Core) target_link_libraries(Framework 3D) target_link_libraries(Framework UI) +if(SWITCH_LIBNX) +target_link_libraries(Framework vorbis ogg EGL drm_nouveau glapi GLESv2 nx) +endif(SWITCH_LIBNX) diff --git a/Code/Libraries/Framework/src/framework3d.cpp b/Code/Libraries/Framework/src/framework3d.cpp index 4d48d76..eefbd30 100644 --- a/Code/Libraries/Framework/src/framework3d.cpp +++ b/Code/Libraries/Framework/src/framework3d.cpp @@ -55,7 +55,9 @@ Framework3D::Framework3D() : m_EventManager( NULL ) , m_Display( NULL ) , m_Window( NULL ) +#if !BUILD_SWITCH , m_SplashWindow( NULL ) +#endif , m_Keyboard( NULL ) , m_Mouse( NULL ) , m_Clock( NULL ) @@ -158,6 +160,11 @@ void Framework3D::Main() } SDL_DisableScreenSaver(); +#if BUILD_SWITCH + SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_COMPATIBILITY); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0); +#endif #endif STATICHASH( Framework ); @@ -310,7 +317,9 @@ void Framework3D::Main() if( ShowWindowASAP() ) { +#if !BUILD_SWITCH SafeDelete( m_SplashWindow ); +#endif #if BUILD_WINDOWS_NO_SDL m_Window->Show( m_CmdShow ); #elif BUILD_SDL @@ -340,6 +349,7 @@ void Framework3D::CreateSplashWindow( const uint WindowIcon, const char* const T STATICHASH( Framework ); STATICHASH( SplashImage ); +#if !BUILD_SWITCH const char* const pSplashImage = ConfigManager::GetString( sSplashImage, NULL, sFramework ); if( !pSplashImage ) { @@ -385,6 +395,7 @@ void Framework3D::CreateSplashWindow( const uint WindowIcon, const char* const T { } #endif +#endif } /*virtual*/ void Framework3D::ShutDown() @@ -409,7 +420,9 @@ void Framework3D::CreateSplashWindow( const uint WindowIcon, const char* const T #endif SafeDelete( m_Display ); +#if !BUILD_SWITCH SafeDelete( m_SplashWindow ); +#endif SafeDelete( m_Clock ); SafeDelete( m_Keyboard ); SafeDelete( m_Mouse ); @@ -429,7 +442,7 @@ void Framework3D::CreateSplashWindow( const uint WindowIcon, const char* const T Profiler::DeleteInstance(); #endif -#if BUILD_SDL +#if BUILD_SDL && !BUILD_SWITCH SDL_Quit(); #endif @@ -1090,4 +1103,4 @@ LRESULT CALLBACK Framework3D::WindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, L return DefWindowProc( hWnd, uMsg, wParam, lParam ); } -#endif // BUILD_WINDOWS_NO_SDL \ No newline at end of file +#endif // BUILD_WINDOWS_NO_SDL diff --git a/Code/Libraries/Framework/src/framework3d.h b/Code/Libraries/Framework/src/framework3d.h index 35ee087..6adf46d 100644 --- a/Code/Libraries/Framework/src/framework3d.h +++ b/Code/Libraries/Framework/src/framework3d.h @@ -126,7 +126,9 @@ class Framework3D : public IWBEventObserver WBEventManager* m_EventManager; // Event manager for framework only, not for game. Display* m_Display; Window* m_Window; +#if !BUILD_SWITCH Window* m_SplashWindow; +#endif Keyboard* m_Keyboard; Mouse* m_Mouse; Clock* m_Clock; @@ -158,4 +160,4 @@ class Framework3D : public IWBEventObserver bool m_IsShuttingDown; }; -#endif \ No newline at end of file +#endif diff --git a/Code/Projects/Eld/src/eldframework.cpp b/Code/Projects/Eld/src/eldframework.cpp index 1d07a8f..0730c87 100644 --- a/Code/Projects/Eld/src/eldframework.cpp +++ b/Code/Projects/Eld/src/eldframework.cpp @@ -599,7 +599,9 @@ ENotificationPosition GetSteamNoticePos( const HashedString& SteamNoticePosName } // All done, show the window finally. +#if !BUILD_SWITCH SafeDelete( m_SplashWindow ); +#endif #if BUILD_WINDOWS_NO_SDL m_Window->Show( m_CmdShow ); #elif BUILD_SDL @@ -1809,7 +1811,9 @@ void EldFramework::PrepareForLoad() { PRINTF( "EldFramework::ToggleFullscreen\n" ); +#if !BUILD_SWITCH Framework3D::ToggleFullscreen(); +#endif // For fullscreen upscaling, we may need a new m_UpscaleView UpdateViews(); diff --git a/Code/Projects/Eld/src/main.cpp b/Code/Projects/Eld/src/main.cpp index 095fce4..8fd263a 100644 --- a/Code/Projects/Eld/src/main.cpp +++ b/Code/Projects/Eld/src/main.cpp @@ -128,6 +128,10 @@ int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLin extern "C" int main( int argc, char* argv[] ) #endif { +#if BUILD_SWITCH + socketInitializeDefault(); + nxlinkStdio(); +#endif #if BUILD_WINDOWS_NO_SDL Unused( hPrevInstance ); Unused( lpCmdLine ); @@ -154,5 +158,10 @@ extern "C" int main( int argc, char* argv[] ) ShutDown(); +#if BUILD_SWITCH + SDL_Quit(); + socketExit(); +#endif + return 0; } diff --git a/Code/icon.jpg b/Code/icon.jpg new file mode 100644 index 0000000000000000000000000000000000000000..08d958bf66fd8afa6cfcc8c8d794735b724e89f9 GIT binary patch literal 29144 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 literal 0 HcmV?d00001