From 1c4883354b632c1f622e34eebb3a306aed2d7137 Mon Sep 17 00:00:00 2001 From: Stephen Saunders Date: Sat, 7 Jan 2023 22:44:42 -0500 Subject: [PATCH 01/11] Fix linux/macOS CreateOSPath() regression by eliminating path-relative references in fs_basepath --- neo/sys/posix/posix_main.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/neo/sys/posix/posix_main.cpp b/neo/sys/posix/posix_main.cpp index 481bf32d..d05e1f3a 100644 --- a/neo/sys/posix/posix_main.cpp +++ b/neo/sys/posix/posix_main.cpp @@ -425,8 +425,7 @@ const char* Sys_DefaultBasePath() basepath = Sys_EXEPath(); if( basepath.Length() ) { - basepath.StripFilename(); - exepath = basepath; + exepath = basepath.StripFilename(); testbase = basepath; testbase += "/"; testbase += BASE_GAMEDIR; @@ -457,8 +456,9 @@ const char* Sys_DefaultBasePath() if( exepath.Length() ) { #if defined(__APPLE__) - // SRS - Check for macOS app bundle resources path - basepath = exepath + "/../Resources"; + // SRS - Check for macOS app bundle resources path (up one dir level and down to Resources dir) + basepath = exepath; + basepath = basepath.StripFilename() + "/Resources"; testbase = basepath; testbase += "/"; testbase += BASE_GAMEDIR; @@ -471,11 +471,11 @@ const char* Sys_DefaultBasePath() common->Printf( "no '%s' directory in macOS app bundle resources path %s, skipping\n", BASE_GAMEDIR, basepath.c_str() ); } #endif - // SRS - Check for macOS/linux build path (directory structure with build dir and possible config suffix) + // SRS - Check for linux/macOS build path (directory structure with build dir and possible config suffix) + basepath = exepath; + basepath.StripFilename(); // up 1st dir level for linux and macOS single-config makefile builds #if defined(__APPLE__) && !defined( NO_MULTI_CONFIG ) - basepath = exepath + "/../.."; // for macOS Xcode builds with Debug/Release/etc config suffix -#else - basepath = exepath + "/.."; // for linux and macOS single-config makefile builds + basepath.StripFilename(); // up 2nd dir level for macOS Xcode builds with Debug/Release/etc config suffix #endif testbase = basepath; testbase += "/"; From 7485a123f6f1ac66984f3ce1717b0d66587f82fd Mon Sep 17 00:00:00 2001 From: Stephen Saunders Date: Sat, 7 Jan 2023 22:53:11 -0500 Subject: [PATCH 02/11] Fix idParser::Directive_include() to properly handle full os path as fetched by idLexer::GetFileName() --- neo/idlib/Parser.cpp | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/neo/idlib/Parser.cpp b/neo/idlib/Parser.cpp index 2af2272a..c1cd53a7 100644 --- a/neo/idlib/Parser.cpp +++ b/neo/idlib/Parser.cpp @@ -1150,11 +1150,18 @@ int idParser::Directive_include( idToken* token, bool supressWarning ) // try relative to the current file path = scriptstack->GetFileName(); path.StripFilename(); - path += "/"; - path += *token; - if( !script->LoadFile( path, OSPath ) ) + // first remove any trailing path overlap with token + idStr token_path = *token; + if( !path.StripTrailingOnce( token_path.StripFilename() ) ) { - // try absolute path + // if no path overlap add separator before token + path += "/"; + } + path += *token; + // try assuming a full os path from GetFileName() + if( !script->LoadFile( path, true ) ) + { + // try from the token path path = *token; if( !script->LoadFile( path, OSPath ) ) { From 51376371263fb1eb76168107bb5420b48c90e0e8 Mon Sep 17 00:00:00 2001 From: Stephen Saunders Date: Sun, 8 Jan 2023 00:25:05 -0500 Subject: [PATCH 03/11] Filter SDL video modes same as on Win32, fix SDL window position drift when exiting fullscreen --- neo/sys/sdl/sdl_events.cpp | 8 ++++++-- neo/sys/sdl/sdl_vkimp.cpp | 36 +++++++++++++++++++++++++++++++----- 2 files changed, 37 insertions(+), 7 deletions(-) diff --git a/neo/sys/sdl/sdl_events.cpp b/neo/sys/sdl/sdl_events.cpp index 5451c7dd..70e9db83 100644 --- a/neo/sys/sdl/sdl_events.cpp +++ b/neo/sys/sdl/sdl_events.cpp @@ -994,8 +994,12 @@ sysEvent_t Sys_GetEvent() // SRS - Only save window moved events when in windowed modes if( !renderSystem->IsFullScreen() ) { - r_windowX.SetInteger( x ); - r_windowY.SetInteger( y ); + // SRS - take window border into account when when saving window position cvars + int topBorder, leftBorder, bottomBorder, rightBorder; + SDL_Window* window = SDL_GetWindowFromID( ev.window.windowID ); + SDL_GetWindowBordersSize( window, &topBorder, &leftBorder, &bottomBorder, &rightBorder ); + r_windowX.SetInteger( x - leftBorder ); + r_windowY.SetInteger( y - topBorder ); } break; } diff --git a/neo/sys/sdl/sdl_vkimp.cpp b/neo/sys/sdl/sdl_vkimp.cpp index 9f139885..31d7e468 100644 --- a/neo/sys/sdl/sdl_vkimp.cpp +++ b/neo/sys/sdl/sdl_vkimp.cpp @@ -484,7 +484,7 @@ static bool SetScreenParmsFullscreen( glimpParms_t parms ) // if we're currently not in fullscreen mode, we need to switch to fullscreen if( !( SDL_GetWindowFlags( window ) & SDL_WINDOW_FULLSCREEN ) ) { - if( SDL_SetWindowFullscreen( window, SDL_TRUE ) < 0 ) + if( SDL_SetWindowFullscreen( window, SDL_WINDOW_FULLSCREEN ) < 0 ) { common->Warning( "Couldn't switch to fullscreen mode, reason: %s!", SDL_GetError() ); return false; @@ -510,14 +510,16 @@ static bool SetScreenParmsWindowed( glimpParms_t parms ) } } + // if window is maximized, restore it to normal before setting size + if( SDL_GetWindowFlags( window ) & SDL_WINDOW_MAXIMIZED ) + { + SDL_RestoreWindow( window ); + } + SDL_SetWindowSize( window, parms.width, parms.height ); - // SRS - this logic prevents window position drift on linux when coming in and out of fullscreen #if !defined(__APPLE__) - SDL_bool borderState = SDL_GetWindowFlags( window ) & SDL_WINDOW_BORDERLESS ? SDL_FALSE : SDL_TRUE; - SDL_SetWindowBordered( window, SDL_FALSE ); SDL_SetWindowPosition( window, parms.x, parms.y ); - SDL_SetWindowBordered( window, borderState ); #endif return true; @@ -722,6 +724,8 @@ bool R_GetModeListForDisplay( const int requestedDisplayNum, idList& modeList.Clear(); + bool verbose = false; + // DG: SDL2 implementation if( requestedDisplayNum >= SDL_GetNumVideoDisplays() ) { @@ -742,6 +746,28 @@ bool R_GetModeListForDisplay( const int requestedDisplayNum, idList& continue; } + if( SDL_BITSPERPIXEL( m.format ) != 32 && SDL_BITSPERPIXEL( m.format ) != 24 ) + { + continue; + } + if( ( m.refresh_rate != 60 ) && ( m.refresh_rate != 120 ) ) + { + continue; + } + if( m.h < 720 ) + { + continue; + } + if( verbose ) + { + common->Printf( " -------------------\n" ); + common->Printf( " modeNum : %i\n", i ); + common->Printf( " dmBitsPerPel : %i\n", SDL_BITSPERPIXEL( m.format ) ); + common->Printf( " dmPelsWidth : %i\n", m.w ); + common->Printf( " dmPelsHeight : %i\n", m.h ); + common->Printf( " dmDisplayFrequency : %i\n", m.refresh_rate ); + } + vidMode_t mode; mode.width = m.w; mode.height = m.h; From 26edabe75205def62e39bc80cfabb5616a7143c3 Mon Sep 17 00:00:00 2001 From: Stephen Saunders Date: Sun, 8 Jan 2023 00:30:02 -0500 Subject: [PATCH 04/11] Rename / update macOS cmake build scripts, update README to reflect new names --- README.md | 12 ++++++------ neo/cmake-macos-release.sh | 6 ++++++ neo/cmake-macos-retail.sh | 6 ++++++ neo/cmake-macos-vulkan-release.sh | 6 ------ neo/cmake-macos-vulkan-retail.sh | 6 ------ ...ke-xcode-vulkan-debug.sh => cmake-xcode-debug.sh} | 8 ++++---- ...code-vulkan-release.sh => cmake-xcode-release.sh} | 8 ++++---- ...-vulkan-universal.sh => cmake-xcode-universal.sh} | 8 ++++---- 8 files changed, 30 insertions(+), 30 deletions(-) create mode 100755 neo/cmake-macos-release.sh create mode 100755 neo/cmake-macos-retail.sh delete mode 100755 neo/cmake-macos-vulkan-release.sh delete mode 100755 neo/cmake-macos-vulkan-retail.sh rename neo/{cmake-xcode-vulkan-debug.sh => cmake-xcode-debug.sh} (63%) rename neo/{cmake-xcode-vulkan-release.sh => cmake-xcode-release.sh} (60%) rename neo/{cmake-xcode-vulkan-universal.sh => cmake-xcode-universal.sh} (62%) diff --git a/README.md b/README.md index 2bd3bcb2..6048ab89 100644 --- a/README.md +++ b/README.md @@ -498,14 +498,14 @@ Recommended in this case is `cmake-vs2019-64bit.bat` or `cmake-vs2019-64bit-no-f For command line builds: > cd neo/ - > ./cmake-macos-opengl-release.sh + > ./cmake-macos-release.sh For Xcode builds: > cd neo/ - > ./cmake-xcode-opengl-release.sh + > ./cmake-xcode-release.sh or - > ./cmake-xcode-opengl-universal.sh (universal build on macOS Big Sur / Xcode 12.2 or later) + > ./cmake-xcode-universal.sh (universal build on macOS Big Sur / Xcode 12.2 or later) Depending on which package manager you install (Homebrew or MacPorts) you may need to change the openal-soft library and include paths specified in the cmake shell scripts. For single architecture builds (debug, release, retail) the default openal-soft paths are set for Homebrew on x86, while for universal builds the default paths are set for MacPorts on x86 or Apple Silicon. If you want to build using the single architecture shell scripts (debug, release, retail) on Apple Silicon, you will need to change the openal-soft paths from `/usr/local/...` to either `/opt/homebrew/...` (Homebrew) or `/opt/local/...` (MacPorts). @@ -516,7 +516,7 @@ Recommended in this case is `cmake-vs2019-64bit.bat` or `cmake-vs2019-64bit-no-f > cd ../build > make - For Xcode builds double click on RBDOOM-3-BFG/xcode-opengl-\/RBDoom3BFG.xcodeproj and start the build. The generated Xcode project file is pre-configured with the correct targets and build settings. + For Xcode builds double click on RBDOOM-3-BFG/xcode-\/RBDoom3BFG.xcodeproj and start the build. The generated Xcode project file is pre-configured with the correct targets and build settings. --- # Installation, Getting the Game Data, Running the Game @@ -609,11 +609,11 @@ Anyway: * _common.crc * (etc) -5. On macOS the RBDoom3BFG executable will also search for game data within an app bundle's relative path ../Resources/base and, as a last resort, within the absolute path /Applications/RBDoom-3-BFG.app/Contents/Resources/base. In addition, if you want the game to be standalone without dependencies on pre-installed dynamic libs, you can use macdylibbundler to bundle all external dylib dependencies into the app bundle (see https://github.com/auriamg/macdylibbundler or simply install via "brew install dylibbundler" or "sudo port install dylibbundler"). For example, the following command will copy all external dynamic library dependencies to the Contents/libs directory of the game's app bundle and adjust the rpaths within the RBDoom3BFG executable and copied dylibs. +5. On macOS the RBDoom3BFG executable will also search for game data within an app bundle's Contents/Resources/base folder, and as a last resort, within the absolute path /Applications/RBDoom-3-BFG.app/Contents/Resources/base. In addition, if you want the game to be standalone without dependencies on pre-installed dynamic libs, you can use macdylibbundler to bundle all external dylib dependencies into the app bundle (see https://github.com/auriamg/macdylibbundler or simply install via "brew install dylibbundler" or "sudo port install dylibbundler"). For example, the following command will copy all external dylib dependencies to the Contents/libs directory of the game's app bundle and adjust the rpaths within the RBDoom3BFG executable and copied dylibs. > dylibbundler -od -b -x RBDoom-3-BFG.app/Contents/MacOS/RBDoom3BFG -d RBDoom-3-BFG.app/Contents/libs/ - After running dylibbundler you must re-sign the modified executable and dylibs if planning to run on **Apple Silicon** machines. The output of dylibbundler will indicate which dylibs (if any) require re-signing. This code signing step is not needed for x86-based Macs. + After running dylibbundler you may need to re-sign the modified executable and dylibs if planning to run on **Apple Silicon** machines. Newer versions of dylibbundler now do this automatically. The output of dylibbundler will indicate which executable and dylibs (if any) require re-signing. This code signing step is not needed for x86-based Macs. > codesign -s - --force RBDoom-3-BFG.app/Contents/libs/lib.dylib ... diff --git a/neo/cmake-macos-release.sh b/neo/cmake-macos-release.sh new file mode 100755 index 00000000..450a451a --- /dev/null +++ b/neo/cmake-macos-release.sh @@ -0,0 +1,6 @@ +cd .. +rm -rf build +mkdir build +cd build +# change or remove -DCMAKE_OSX_DEPLOYMENT_TARGET= to match supported runtime targets +cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS_RELEASE="-DNDEBUG -DNO_MULTI_CONFIG" -DCMAKE_OSX_DEPLOYMENT_TARGET=12.1 -DFFMPEG=OFF -DBINKDEC=ON -DUSE_MoltenVK=ON -DOPENAL_LIBRARY=/usr/local/opt/openal-soft/lib/libopenal.dylib -DOPENAL_INCLUDE_DIR=/usr/local/opt/openal-soft/include ../neo -Wno-dev diff --git a/neo/cmake-macos-retail.sh b/neo/cmake-macos-retail.sh new file mode 100755 index 00000000..2999f229 --- /dev/null +++ b/neo/cmake-macos-retail.sh @@ -0,0 +1,6 @@ +cd .. +rm -rf build +mkdir build +cd build +# change or remove -DCMAKE_OSX_DEPLOYMENT_TARGET= to match supported runtime targets +cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS_RELEASE="-DNDEBUG -DNO_MULTI_CONFIG -DID_RETAIL" -DCMAKE_OSX_DEPLOYMENT_TARGET=12.1 -DFFMPEG=OFF -DBINKDEC=ON -DUSE_MoltenVK=ON -DOPENAL_LIBRARY=/usr/local/opt/openal-soft/lib/libopenal.dylib -DOPENAL_INCLUDE_DIR=/usr/local/opt/openal-soft/include ../neo -Wno-dev diff --git a/neo/cmake-macos-vulkan-release.sh b/neo/cmake-macos-vulkan-release.sh deleted file mode 100755 index 9c9db4cb..00000000 --- a/neo/cmake-macos-vulkan-release.sh +++ /dev/null @@ -1,6 +0,0 @@ -cd .. -rm -rf build-vulkan -mkdir build-vulkan -cd build-vulkan -# change or remove -DCMAKE_OSX_DEPLOYMENT_TARGET= to match supported runtime targets -cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS_RELEASE="-DNDEBUG -DNO_MULTI_CONFIG" -DCMAKE_OSX_DEPLOYMENT_TARGET=12.1 -DFFMPEG=OFF -DBINKDEC=ON -DUSE_VULKAN=ON -DUSE_MoltenVK=ON -DOPENAL_LIBRARY=/usr/local/opt/openal-soft/lib/libopenal.dylib -DOPENAL_INCLUDE_DIR=/usr/local/opt/openal-soft/include ../neo -Wno-dev diff --git a/neo/cmake-macos-vulkan-retail.sh b/neo/cmake-macos-vulkan-retail.sh deleted file mode 100755 index 386796b0..00000000 --- a/neo/cmake-macos-vulkan-retail.sh +++ /dev/null @@ -1,6 +0,0 @@ -cd .. -rm -rf build-vulkan -mkdir build-vulkan -cd build-vulkan -# change or remove -DCMAKE_OSX_DEPLOYMENT_TARGET= to match supported runtime targets -cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS_RELEASE="-DNDEBUG -DNO_MULTI_CONFIG -DID_RETAIL" -DCMAKE_OSX_DEPLOYMENT_TARGET=12.1 -DFFMPEG=OFF -DBINKDEC=ON -DUSE_VULKAN=ON -DUSE_MoltenVK=ON -DOPENAL_LIBRARY=/usr/local/opt/openal-soft/lib/libopenal.dylib -DOPENAL_INCLUDE_DIR=/usr/local/opt/openal-soft/include ../neo -Wno-dev diff --git a/neo/cmake-xcode-vulkan-debug.sh b/neo/cmake-xcode-debug.sh similarity index 63% rename from neo/cmake-xcode-vulkan-debug.sh rename to neo/cmake-xcode-debug.sh index 6e9489a0..66d77134 100755 --- a/neo/cmake-xcode-vulkan-debug.sh +++ b/neo/cmake-xcode-debug.sh @@ -1,10 +1,10 @@ cd .. -rm -rf xcode-vulkan-debug -mkdir xcode-vulkan-debug -cd xcode-vulkan-debug +rm -rf xcode-debug +mkdir xcode-debug +cd xcode-debug # note 1: remove or set -DCMAKE_SUPPRESS_REGENERATION=OFF to reenable ZERO_CHECK target which checks for CMakeLists.txt changes and re-runs CMake before builds # however, if ZERO_CHECK is reenabled **must** add VULKAN_SDK location to Xcode Custom Paths (under Prefs/Locations) otherwise build failures may occur # note 2: policy CMAKE_POLICY_DEFAULT_CMP0142=NEW suppresses non-existant per-config suffixes on Xcode library search paths, works for cmake version 3.25 and later #note 3: env variable MVK_CONFIG_FULL_IMAGE_VIEW_SWIZZLE=1 enables MoltenVK's image view swizzle which may be required on older macOS versions or hardware (see vulkaninfo) # note 4: env variable MVK_CONFIG_USE_METAL_ARGUMENT_BUFFERS=2 enables MoltenVK's use of Metal argument buffers only if VK_EXT_descriptor_indexing is enabled -cmake -G Xcode -DCMAKE_BUILD_TYPE=Debug -DUSE_VULKAN=ON -DCMAKE_XCODE_GENERATE_SCHEME=ON -DCMAKE_XCODE_SCHEME_ENVIRONMENT="MVK_CONFIG_FULL_IMAGE_VIEW_SWIZZLE=1;MVK_CONFIG_USE_METAL_ARGUMENT_BUFFERS=2" -DCMAKE_SUPPRESS_REGENERATION=ON -DOPENAL_LIBRARY=/usr/local/opt/openal-soft/lib/libopenal.dylib -DOPENAL_INCLUDE_DIR=/usr/local/opt/openal-soft/include ../neo -DCMAKE_POLICY_DEFAULT_CMP0142=NEW -Wno-dev +cmake -G Xcode -DCMAKE_BUILD_TYPE=Debug -DCMAKE_XCODE_GENERATE_SCHEME=ON -DCMAKE_XCODE_SCHEME_ENVIRONMENT="MVK_CONFIG_FULL_IMAGE_VIEW_SWIZZLE=1;MVK_CONFIG_USE_METAL_ARGUMENT_BUFFERS=2" -DCMAKE_SUPPRESS_REGENERATION=ON -DOPENAL_LIBRARY=/usr/local/opt/openal-soft/lib/libopenal.dylib -DOPENAL_INCLUDE_DIR=/usr/local/opt/openal-soft/include ../neo -DCMAKE_POLICY_DEFAULT_CMP0142=NEW -Wno-dev diff --git a/neo/cmake-xcode-vulkan-release.sh b/neo/cmake-xcode-release.sh similarity index 60% rename from neo/cmake-xcode-vulkan-release.sh rename to neo/cmake-xcode-release.sh index fe0aba3c..9577d032 100755 --- a/neo/cmake-xcode-vulkan-release.sh +++ b/neo/cmake-xcode-release.sh @@ -1,8 +1,8 @@ cd .. -rm -rf xcode-vulkan-release -mkdir xcode-vulkan-release -cd xcode-vulkan-release +rm -rf xcode-release +mkdir xcode-release +cd xcode-release # note 1: remove or set -DCMAKE_SUPPRESS_REGENERATION=OFF to reenable ZERO_CHECK target which checks for CMakeLists.txt changes and re-runs CMake before builds # however, if ZERO_CHECK is reenabled **must** add VULKAN_SDK location to Xcode Custom Paths (under Prefs/Locations) otherwise build failures may occur # note 2: policy CMAKE_POLICY_DEFAULT_CMP0142=NEW suppresses non-existant per-config suffixes on Xcode library search paths, works for cmake version 3.25 and later -cmake -G Xcode -DCMAKE_BUILD_TYPE=Release -DCMAKE_CONFIGURATION_TYPES="Release;MinSizeRel;RelWithDebInfo" -DFFMPEG=OFF -DBINKDEC=ON -DUSE_VULKAN=ON -DUSE_MoltenVK=ON -DCMAKE_XCODE_GENERATE_SCHEME=ON -DCMAKE_XCODE_SCHEME_ENABLE_GPU_API_VALIDATION=OFF -DCMAKE_SUPPRESS_REGENERATION=ON -DOPENAL_LIBRARY=/usr/local/opt/openal-soft/lib/libopenal.dylib -DOPENAL_INCLUDE_DIR=/usr/local/opt/openal-soft/include ../neo -DCMAKE_POLICY_DEFAULT_CMP0142=NEW -Wno-dev +cmake -G Xcode -DCMAKE_BUILD_TYPE=Release -DCMAKE_CONFIGURATION_TYPES="Release;MinSizeRel;RelWithDebInfo" -DFFMPEG=OFF -DBINKDEC=ON -DUSE_MoltenVK=ON -DCMAKE_XCODE_GENERATE_SCHEME=ON -DCMAKE_XCODE_SCHEME_ENABLE_GPU_API_VALIDATION=OFF -DCMAKE_SUPPRESS_REGENERATION=ON -DOPENAL_LIBRARY=/usr/local/opt/openal-soft/lib/libopenal.dylib -DOPENAL_INCLUDE_DIR=/usr/local/opt/openal-soft/include ../neo -DCMAKE_POLICY_DEFAULT_CMP0142=NEW -Wno-dev diff --git a/neo/cmake-xcode-vulkan-universal.sh b/neo/cmake-xcode-universal.sh similarity index 62% rename from neo/cmake-xcode-vulkan-universal.sh rename to neo/cmake-xcode-universal.sh index 7e82faaa..63ff3977 100755 --- a/neo/cmake-xcode-vulkan-universal.sh +++ b/neo/cmake-xcode-universal.sh @@ -1,9 +1,9 @@ cd .. -rm -rf xcode-vulkan-universal -mkdir xcode-vulkan-universal -cd xcode-vulkan-universal +rm -rf xcode-universal +mkdir xcode-universal +cd xcode-universal # note 1: remove or set -DCMAKE_SUPPRESS_REGENERATION=OFF to reenable ZERO_CHECK target which checks for CMakeLists.txt changes and re-runs CMake before builds # however, if ZERO_CHECK is reenabled **must** add VULKAN_SDK location to Xcode Custom Paths (under Prefs/Locations) otherwise build failures may occur # note 2: policy CMAKE_POLICY_DEFAULT_CMP0142=NEW suppresses non-existant per-config suffixes on Xcode library search paths, works for cmake version 3.25 and later # note 3: universal openal-soft library and include paths assume MacPorts install locations -cmake -G Xcode -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_ARCHITECTURES="arm64;x86_64" -DCMAKE_CONFIGURATION_TYPES="Release;MinSizeRel;RelWithDebInfo" -DFFMPEG=OFF -DBINKDEC=ON -DUSE_VULKAN=ON -DUSE_MoltenVK=ON -DCMAKE_XCODE_GENERATE_SCHEME=ON -DCMAKE_XCODE_SCHEME_ENABLE_GPU_API_VALIDATION=OFF -DCMAKE_SUPPRESS_REGENERATION=ON -DOPENAL_LIBRARY=/opt/local/lib/libopenal.dylib -DOPENAL_INCLUDE_DIR=/opt/local/include ../neo -DCMAKE_POLICY_DEFAULT_CMP0142=NEW -Wno-dev +cmake -G Xcode -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_ARCHITECTURES="arm64;x86_64" -DCMAKE_CONFIGURATION_TYPES="Release;MinSizeRel;RelWithDebInfo" -DFFMPEG=OFF -DBINKDEC=ON -DUSE_MoltenVK=ON -DCMAKE_XCODE_GENERATE_SCHEME=ON -DCMAKE_XCODE_SCHEME_ENABLE_GPU_API_VALIDATION=OFF -DCMAKE_SUPPRESS_REGENERATION=ON -DOPENAL_LIBRARY=/opt/local/lib/libopenal.dylib -DOPENAL_INCLUDE_DIR=/opt/local/include ../neo -DCMAKE_POLICY_DEFAULT_CMP0142=NEW -Wno-dev From 2d1945044a5ceb636235039fd3efd2e7d164eb8f Mon Sep 17 00:00:00 2001 From: Stephen Saunders Date: Thu, 12 Jan 2023 14:46:36 -0500 Subject: [PATCH 05/11] Create macOS app bundle for Xcode release / universal builds, add macOS app icon, update README --- README.md | 12 ++++++++---- neo/CMakeLists.txt | 22 +++++++++++++++++++++- neo/cmake-xcode-release.sh | 2 +- neo/cmake-xcode-universal.sh | 2 +- neo/framework/Licensee.h | 4 ++-- neo/imgui/BFGimguiImpl.cpp | 4 ++++ neo/sys/posix/res/Doom3BFG.icns | Bin 0 -> 93520 bytes 7 files changed, 37 insertions(+), 9 deletions(-) create mode 100644 neo/sys/posix/res/Doom3BFG.icns diff --git a/README.md b/README.md index 6048ab89..85772b96 100644 --- a/README.md +++ b/README.md @@ -492,6 +492,8 @@ Recommended in this case is `cmake-vs2019-64bit.bat` or `cmake-vs2019-64bit-no-f > sudo port install cmake libsdl2 +universal openal-soft +universal (for universal arch libraries) You don't need FFmpeg to be installed. You can turn it off by adding -DFFMPEG=OFF and -DBINKDEC=ON to the CMake options. For debug builds FFmpeg is enabled by default because the bundled libbinkdec is slow during development if compiled for Debug mode. For release, retail and universal builds FFmpeg is disabled and libbinkdec is enabled by default. + + The Vulkan SDK must be installed and can be obtained from https://vulkan.lunarg.com/sdk/home#mac 3. Generate the Makefiles using CMake: @@ -507,6 +509,8 @@ Recommended in this case is `cmake-vs2019-64bit.bat` or `cmake-vs2019-64bit-no-f or > ./cmake-xcode-universal.sh (universal build on macOS Big Sur / Xcode 12.2 or later) + Xcode release and universal builds now automatically package the executable into a macOS app bundle, defining an Info.plist file and copying the base directory and custom icon into the application bundle's Contents/Resources folder. This is controlled by adding -DMACOSX_BUNDLE=ON to the CMake options. + Depending on which package manager you install (Homebrew or MacPorts) you may need to change the openal-soft library and include paths specified in the cmake shell scripts. For single architecture builds (debug, release, retail) the default openal-soft paths are set for Homebrew on x86, while for universal builds the default paths are set for MacPorts on x86 or Apple Silicon. If you want to build using the single architecture shell scripts (debug, release, retail) on Apple Silicon, you will need to change the openal-soft paths from `/usr/local/...` to either `/opt/homebrew/...` (Homebrew) or `/opt/local/...` (MacPorts). 4. Compile RBDOOM-3-BFG targets: @@ -609,15 +613,15 @@ Anyway: * _common.crc * (etc) -5. On macOS the RBDoom3BFG executable will also search for game data within an app bundle's Contents/Resources/base folder, and as a last resort, within the absolute path /Applications/RBDoom-3-BFG.app/Contents/Resources/base. In addition, if you want the game to be standalone without dependencies on pre-installed dynamic libs, you can use macdylibbundler to bundle all external dylib dependencies into the app bundle (see https://github.com/auriamg/macdylibbundler or simply install via "brew install dylibbundler" or "sudo port install dylibbundler"). For example, the following command will copy all external dylib dependencies to the Contents/libs directory of the game's app bundle and adjust the rpaths within the RBDoom3BFG executable and copied dylibs. +5. On macOS the RBDoom3BFG executable will also search for game data within an app bundle's Contents/Resources/base folder, and as a last resort, within the absolute path /Applications/RBDoom3BFG.app/Contents/Resources/base. In addition, if you want the game to be standalone without dependencies on pre-installed dynamic libs, you can use macdylibbundler to bundle all external dylib dependencies into the app bundle (see https://github.com/auriamg/macdylibbundler or simply install via "brew install dylibbundler" or "sudo port install dylibbundler"). For example, the following command will copy all external dylib dependencies to the Contents/libs directory of the game's app bundle and adjust the rpaths within the RBDoom3BFG executable and copied dylibs. - > dylibbundler -od -b -x RBDoom-3-BFG.app/Contents/MacOS/RBDoom3BFG -d RBDoom-3-BFG.app/Contents/libs/ + > dylibbundler -od -b -x RBDoom3BFG.app/Contents/MacOS/RBDoom3BFG -d RBDoom3BFG.app/Contents/libs/ After running dylibbundler you may need to re-sign the modified executable and dylibs if planning to run on **Apple Silicon** machines. Newer versions of dylibbundler now do this automatically. The output of dylibbundler will indicate which executable and dylibs (if any) require re-signing. This code signing step is not needed for x86-based Macs. - > codesign -s - --force RBDoom-3-BFG.app/Contents/libs/lib.dylib + > codesign -s - --force RBDoom3BFG.app/Contents/libs/lib.dylib ... - > codesign -s - --force RBDoom-3-BFG.app/Contents/MacOS/RBDoom3BFG + > codesign -s - --force RBDoom3BFG.app/Contents/MacOS/RBDoom3BFG 6. Run the game by executing the RBDoom3BFG executable. diff --git a/neo/CMakeLists.txt b/neo/CMakeLists.txt index 3029f889..6104fcd4 100644 --- a/neo/CMakeLists.txt +++ b/neo/CMakeLists.txt @@ -1793,7 +1793,27 @@ else() add_dependencies(precomp_header_rbdoom3bfg idlib) endif() - add_executable(RBDoom3BFG WIN32 ${RBDOOM3_SOURCES}) + if(MACOSX_BUNDLE) + # define contents of macOS app bundle Resources folder + set(MACOS_RESOURCES sys/posix/res/Doom3BFG.icns ../base) + source_group("Resources" FILES ${MACOS_RESOURCES}) + set_source_files_properties(${MACOS_RESOURCES} PROPERTIES MACOSX_PACKAGE_LOCATION Resources) + + # enable Xcode to display the icons file properly + set_source_files_properties(sys/posix/res/Doom3BFG.icns PROPERTIES XCODE_EXPLICIT_FILE_TYPE .icns) + + # add macOS bundle properties to executable + set(MACOSX_BUNDLE_BUNDLE_NAME RBDoom-3-BFG) + set(MACOSX_BUNDLE_BUNDLE_VERSION 1.5.0) + set(MACOSX_BUNDLE_SHORT_VERSION_STRING 1.5.0) + set(MACOSX_BUNDLE_ICON_FILE Doom3BFG.icns) + set(MACOSX_BUNDLE_INFO_STRING "") # to be added by author if desired + set(MACOSX_BUNDLE_COPYRIGHT "") # to be added by author if desired + + add_executable(RBDoom3BFG MACOSX_BUNDLE ${MACOS_RESOURCES} ${RBDOOM3_INCLUDES} ${RBDOOM3_SOURCES}) + else() + add_executable(RBDoom3BFG WIN32 ${RBDOOM3_INCLUDES} ${RBDOOM3_SOURCES}) + endif() if(USE_VULKAN) add_dependencies(RBDoom3BFG nvrhi_vk) diff --git a/neo/cmake-xcode-release.sh b/neo/cmake-xcode-release.sh index 9577d032..3d9991cb 100755 --- a/neo/cmake-xcode-release.sh +++ b/neo/cmake-xcode-release.sh @@ -5,4 +5,4 @@ cd xcode-release # note 1: remove or set -DCMAKE_SUPPRESS_REGENERATION=OFF to reenable ZERO_CHECK target which checks for CMakeLists.txt changes and re-runs CMake before builds # however, if ZERO_CHECK is reenabled **must** add VULKAN_SDK location to Xcode Custom Paths (under Prefs/Locations) otherwise build failures may occur # note 2: policy CMAKE_POLICY_DEFAULT_CMP0142=NEW suppresses non-existant per-config suffixes on Xcode library search paths, works for cmake version 3.25 and later -cmake -G Xcode -DCMAKE_BUILD_TYPE=Release -DCMAKE_CONFIGURATION_TYPES="Release;MinSizeRel;RelWithDebInfo" -DFFMPEG=OFF -DBINKDEC=ON -DUSE_MoltenVK=ON -DCMAKE_XCODE_GENERATE_SCHEME=ON -DCMAKE_XCODE_SCHEME_ENABLE_GPU_API_VALIDATION=OFF -DCMAKE_SUPPRESS_REGENERATION=ON -DOPENAL_LIBRARY=/usr/local/opt/openal-soft/lib/libopenal.dylib -DOPENAL_INCLUDE_DIR=/usr/local/opt/openal-soft/include ../neo -DCMAKE_POLICY_DEFAULT_CMP0142=NEW -Wno-dev +cmake -G Xcode -DCMAKE_BUILD_TYPE=Release -DCMAKE_CONFIGURATION_TYPES="Release;MinSizeRel;RelWithDebInfo" -DMACOSX_BUNDLE=ON -DFFMPEG=OFF -DBINKDEC=ON -DUSE_MoltenVK=ON -DCMAKE_XCODE_GENERATE_SCHEME=ON -DCMAKE_XCODE_SCHEME_ENABLE_GPU_API_VALIDATION=OFF -DCMAKE_SUPPRESS_REGENERATION=ON -DOPENAL_LIBRARY=/usr/local/opt/openal-soft/lib/libopenal.dylib -DOPENAL_INCLUDE_DIR=/usr/local/opt/openal-soft/include ../neo -DCMAKE_POLICY_DEFAULT_CMP0142=NEW -Wno-dev diff --git a/neo/cmake-xcode-universal.sh b/neo/cmake-xcode-universal.sh index 63ff3977..d28fedf3 100755 --- a/neo/cmake-xcode-universal.sh +++ b/neo/cmake-xcode-universal.sh @@ -6,4 +6,4 @@ cd xcode-universal # however, if ZERO_CHECK is reenabled **must** add VULKAN_SDK location to Xcode Custom Paths (under Prefs/Locations) otherwise build failures may occur # note 2: policy CMAKE_POLICY_DEFAULT_CMP0142=NEW suppresses non-existant per-config suffixes on Xcode library search paths, works for cmake version 3.25 and later # note 3: universal openal-soft library and include paths assume MacPorts install locations -cmake -G Xcode -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_ARCHITECTURES="arm64;x86_64" -DCMAKE_CONFIGURATION_TYPES="Release;MinSizeRel;RelWithDebInfo" -DFFMPEG=OFF -DBINKDEC=ON -DUSE_MoltenVK=ON -DCMAKE_XCODE_GENERATE_SCHEME=ON -DCMAKE_XCODE_SCHEME_ENABLE_GPU_API_VALIDATION=OFF -DCMAKE_SUPPRESS_REGENERATION=ON -DOPENAL_LIBRARY=/opt/local/lib/libopenal.dylib -DOPENAL_INCLUDE_DIR=/opt/local/include ../neo -DCMAKE_POLICY_DEFAULT_CMP0142=NEW -Wno-dev +cmake -G Xcode -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_ARCHITECTURES="arm64;x86_64" -DCMAKE_CONFIGURATION_TYPES="Release;MinSizeRel;RelWithDebInfo" -DMACOSX_BUNDLE=ON -DFFMPEG=OFF -DBINKDEC=ON -DUSE_MoltenVK=ON -DCMAKE_XCODE_GENERATE_SCHEME=ON -DCMAKE_XCODE_SCHEME_ENABLE_GPU_API_VALIDATION=OFF -DCMAKE_SUPPRESS_REGENERATION=ON -DOPENAL_LIBRARY=/opt/local/lib/libopenal.dylib -DOPENAL_INCLUDE_DIR=/opt/local/include ../neo -DCMAKE_POLICY_DEFAULT_CMP0142=NEW -Wno-dev diff --git a/neo/framework/Licensee.h b/neo/framework/Licensee.h index 4f3b04fc..7c5c748a 100644 --- a/neo/framework/Licensee.h +++ b/neo/framework/Licensee.h @@ -68,7 +68,7 @@ If you have questions concerning this license or the applicable additional terms // RB begin // Default base path (used only if none could be found) #ifdef __APPLE__ - #define DEFAULT_BASEPATH "/Applications/RBDOOM-3-BFG.app/Contents/Resources" + #define DEFAULT_BASEPATH "/Applications/RBDoom3BFG.app/Contents/Resources" #else #define DEFAULT_BASEPATH "/usr/share/games/doom3bfg" #endif @@ -79,4 +79,4 @@ If you have questions concerning this license or the applicable additional terms #define STEAMPATH_NAME "DOOM 3 BFG Edition" // raynorpat: GOG.com Galaxy Launcher Game ID for figuring out Steam base path -#define GOGPATH_ID "1733124578" \ No newline at end of file +#define GOGPATH_ID "1733124578" diff --git a/neo/imgui/BFGimguiImpl.cpp b/neo/imgui/BFGimguiImpl.cpp index 67aae326..5a79da55 100644 --- a/neo/imgui/BFGimguiImpl.cpp +++ b/neo/imgui/BFGimguiImpl.cpp @@ -254,6 +254,10 @@ bool Init( int windowWidth, int windowHeight ) io.GetClipboardTextFn = GetClipboardText; io.ClipboardUserData = NULL; + // SRS - store imgui.ini file in fs_savepath (not in cwd please!) + static idStr BFG_IniFilename = fileSystem->BuildOSPath( cvarSystem->GetCVarString( "fs_savepath" ), io.IniFilename ); + io.IniFilename = BFG_IniFilename; + // make it a bit prettier with rounded edges ImGuiStyle& style = ImGui::GetStyle(); //style.ChildWindowRounding = 9.0f; diff --git a/neo/sys/posix/res/Doom3BFG.icns b/neo/sys/posix/res/Doom3BFG.icns new file mode 100644 index 0000000000000000000000000000000000000000..b54b175220b1cec9b5efceed12978ca3e62fe765 GIT binary patch literal 93520 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̃o)0+F=#nQPuLNjdoo2WA3W>B7oip?vC!p_q?g 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≀9?}iN<45rH@hyTMh|IFv2TmFmR4Z1vM&6#xr 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%0Aa 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 e|N9IQ-?6H Date: Thu, 12 Jan 2023 15:31:18 -0500 Subject: [PATCH 06/11] Comment out redundant Shaders source groups in main CMakeLists, already handled inside Shaders target --- neo/CMakeLists.txt | 92 ++++++++++++++++++++++++---------------------- 1 file changed, 48 insertions(+), 44 deletions(-) diff --git a/neo/CMakeLists.txt b/neo/CMakeLists.txt index 6104fcd4..e13a4df2 100644 --- a/neo/CMakeLists.txt +++ b/neo/CMakeLists.txt @@ -502,17 +502,18 @@ file(GLOB RENDERER_VULKAN_SOURCES renderer/Vulkan/*.cpp) file(GLOB RENDERER_NVRHI_INCLUDES renderer/NVRHI/*.h) file(GLOB RENDERER_NVRHI_SOURCES renderer/NVRHI/*.cpp) -file(GLOB SHADERS shaders/*.hlsl shaders/*.inc ) -file(GLOB SHADERS_BUILTIN shaders/builtin/*.hlsl ) -file(GLOB SHADERS_BUILTIN_DEBUG shaders/builtin/debug/*.hlsl ) -file(GLOB SHADERS_BUILTIN_FOG shaders/builtin/fog/*.hlsl ) -file(GLOB SHADERS_BUILTIN_LEGACY shaders/builtin/legacy/*.hlsl ) -file(GLOB SHADERS_BUILTIN_LIGHTING shaders/builtin/lighting/*.hlsl ) -file(GLOB SHADERS_BUILTIN_POST shaders/builtin/post/*.hlsl ) -file(GLOB SHADERS_BUILTIN_SSAO shaders/builtin/SSAO/*.hlsl ) -file(GLOB SHADERS_BUILTIN_SSGI shaders/builtin/SSGI/*.hlsl ) -file(GLOB SHADERS_BUILTIN_VIDEO shaders/builtin/video/*.hlsl ) -file(GLOB SHADERS_BUILTIN_VR shaders/builtin/VR/*.hlsl ) +# SRS - not needed, since handled by CMakeLists.txt for Shaders target +#file(GLOB SHADERS shaders/*.hlsl shaders/*.inc ) +#file(GLOB SHADERS_BUILTIN shaders/builtin/*.hlsl ) +#file(GLOB SHADERS_BUILTIN_DEBUG shaders/builtin/debug/*.hlsl ) +#file(GLOB SHADERS_BUILTIN_FOG shaders/builtin/fog/*.hlsl ) +#file(GLOB SHADERS_BUILTIN_LEGACY shaders/builtin/legacy/*.hlsl ) +#file(GLOB SHADERS_BUILTIN_LIGHTING shaders/builtin/lighting/*.hlsl ) +#file(GLOB SHADERS_BUILTIN_POST shaders/builtin/post/*.hlsl ) +#file(GLOB SHADERS_BUILTIN_SSAO shaders/builtin/SSAO/*.hlsl ) +#file(GLOB SHADERS_BUILTIN_SSGI shaders/builtin/SSGI/*.hlsl ) +#file(GLOB SHADERS_BUILTIN_VIDEO shaders/builtin/video/*.hlsl ) +#file(GLOB SHADERS_BUILTIN_VR shaders/builtin/VR/*.hlsl ) file(GLOB IRRXML_INCLUDES libs/irrxml/src/*.h) file(GLOB IRRXML_SOURCES libs/irrxml/src/*.cpp) @@ -1139,17 +1140,18 @@ source_group("renderer\\Vulkan" FILES ${RENDERER_VULKAN_SOURCES}) source_group("renderer\\SMAA" FILES ${RENDERER_SMAA_INCLUDES}) -source_group("renderer\\Shaders" FILES ${SHADERS}) -source_group("renderer\\Shaders\\builtin" FILES ${SHADERS_BUILTIN}) -source_group("renderer\\Shaders\\builtin\\debug" FILES ${SHADERS_BUILTIN_DEBUG}) -source_group("renderer\\Shaders\\builtin\\fog" FILES ${SHADERS_BUILTIN_FOG}) -source_group("renderer\\Shaders\\builtin\\legacy" FILES ${SHADERS_BUILTIN_LEGACY}) -source_group("renderer\\Shaders\\builtin\\lighting" FILES ${SHADERS_BUILTIN_LIGHTING}) -source_group("renderer\\Shaders\\builtin\\post" FILES ${SHADERS_BUILTIN_POST}) -source_group("renderer\\Shaders\\builtin\\SSAO" FILES ${SHADERS_BUILTIN_SSAO}) -source_group("renderer\\Shaders\\builtin\\SSGI" FILES ${SHADERS_BUILTIN_SSGI}) -source_group("renderer\\Shaders\\builtin\\video" FILES ${SHADERS_BUILTIN_VIDEO}) -source_group("renderer\\Shaders\\builtin\\VR" FILES ${SHADERS_BUILTIN_VR}) +# SRS - not needed, since handled by CMakeLists.txt for Shaders target +#source_group("renderer\\Shaders" FILES ${SHADERS}) +#source_group("renderer\\Shaders\\builtin" FILES ${SHADERS_BUILTIN}) +#source_group("renderer\\Shaders\\builtin\\debug" FILES ${SHADERS_BUILTIN_DEBUG}) +#source_group("renderer\\Shaders\\builtin\\fog" FILES ${SHADERS_BUILTIN_FOG}) +#source_group("renderer\\Shaders\\builtin\\legacy" FILES ${SHADERS_BUILTIN_LEGACY}) +#source_group("renderer\\Shaders\\builtin\\lighting" FILES ${SHADERS_BUILTIN_LIGHTING}) +#source_group("renderer\\Shaders\\builtin\\post" FILES ${SHADERS_BUILTIN_POST}) +#source_group("renderer\\Shaders\\builtin\\SSAO" FILES ${SHADERS_BUILTIN_SSAO}) +#source_group("renderer\\Shaders\\builtin\\SSGI" FILES ${SHADERS_BUILTIN_SSGI}) +#source_group("renderer\\Shaders\\builtin\\video" FILES ${SHADERS_BUILTIN_VIDEO}) +#source_group("renderer\\Shaders\\builtin\\VR" FILES ${SHADERS_BUILTIN_VR}) source_group("libs\\irrxml" FILES ${IRRXML_INCLUDES}) source_group("libs\\irrxml" FILES ${IRRXML_SOURCES}) @@ -1336,17 +1338,18 @@ set(RBDOOM3_INCLUDES ${RENDERER_JOBS_STATICSHADOWVOLUME_INCLUDES} ${RENDERER_PASSES_INCLUDES} - ${SHADERS} - ${SHADERS_BUILTIN} - ${SHADERS_BUILTIN_DEBUG} - ${SHADERS_BUILTIN_FOG} - ${SHADERS_BUILTIN_LEGACY} - ${SHADERS_BUILTIN_LIGHTING} - ${SHADERS_BUILTIN_POST} - ${SHADERS_BUILTIN_SSAO} - ${SHADERS_BUILTIN_SSGI} - ${SHADERS_BUILTIN_VIDEO} - ${SHADERS_BUILTIN_VR} + # SRS - not needed, since handled by CMakeLists.txt for Shaders target + #${SHADERS} + #${SHADERS_BUILTIN} + #${SHADERS_BUILTIN_DEBUG} + #${SHADERS_BUILTIN_FOG} + #${SHADERS_BUILTIN_LEGACY} + #${SHADERS_BUILTIN_LIGHTING} + #${SHADERS_BUILTIN_POST} + #${SHADERS_BUILTIN_SSAO} + #${SHADERS_BUILTIN_SSGI} + #${SHADERS_BUILTIN_VIDEO} + #${SHADERS_BUILTIN_VR} ${RENDERER_SMAA_INCLUDES} ${IRRXML_INCLUDES} @@ -1606,17 +1609,18 @@ if(MSVC) ) endif() - set_source_files_properties( ${SHADERS} PROPERTIES VS_TOOL_OVERRIDE "None" ) - set_source_files_properties( ${SHADERS_BUILTIN} PROPERTIES VS_TOOL_OVERRIDE "None" ) - set_source_files_properties( ${SHADERS_BUILTIN_DEBUG} PROPERTIES VS_TOOL_OVERRIDE "None" ) - set_source_files_properties( ${SHADERS_BUILTIN_FOG} PROPERTIES VS_TOOL_OVERRIDE "None" ) - set_source_files_properties( ${SHADERS_BUILTIN_LEGACY} PROPERTIES VS_TOOL_OVERRIDE "None" ) - set_source_files_properties( ${SHADERS_BUILTIN_LIGHTING} PROPERTIES VS_TOOL_OVERRIDE "None" ) - set_source_files_properties( ${SHADERS_BUILTIN_POST} PROPERTIES VS_TOOL_OVERRIDE "None" ) - set_source_files_properties( ${SHADERS_BUILTIN_SSAO} PROPERTIES VS_TOOL_OVERRIDE "None" ) - set_source_files_properties( ${SHADERS_BUILTIN_SSGI} PROPERTIES VS_TOOL_OVERRIDE "None" ) - set_source_files_properties( ${SHADERS_BUILTIN_VIDEO} PROPERTIES VS_TOOL_OVERRIDE "None" ) - set_source_files_properties( ${SHADERS_BUILTIN_VR} PROPERTIES VS_TOOL_OVERRIDE "None" ) + # SRS - not needed, since handled by CMakeLists.txt for Shaders target + #set_source_files_properties( ${SHADERS} PROPERTIES VS_TOOL_OVERRIDE "None" ) + #set_source_files_properties( ${SHADERS_BUILTIN} PROPERTIES VS_TOOL_OVERRIDE "None" ) + #set_source_files_properties( ${SHADERS_BUILTIN_DEBUG} PROPERTIES VS_TOOL_OVERRIDE "None" ) + #set_source_files_properties( ${SHADERS_BUILTIN_FOG} PROPERTIES VS_TOOL_OVERRIDE "None" ) + #set_source_files_properties( ${SHADERS_BUILTIN_LEGACY} PROPERTIES VS_TOOL_OVERRIDE "None" ) + #set_source_files_properties( ${SHADERS_BUILTIN_LIGHTING} PROPERTIES VS_TOOL_OVERRIDE "None" ) + #set_source_files_properties( ${SHADERS_BUILTIN_POST} PROPERTIES VS_TOOL_OVERRIDE "None" ) + #set_source_files_properties( ${SHADERS_BUILTIN_SSAO} PROPERTIES VS_TOOL_OVERRIDE "None" ) + #set_source_files_properties( ${SHADERS_BUILTIN_SSGI} PROPERTIES VS_TOOL_OVERRIDE "None" ) + #set_source_files_properties( ${SHADERS_BUILTIN_VIDEO} PROPERTIES VS_TOOL_OVERRIDE "None" ) + #set_source_files_properties( ${SHADERS_BUILTIN_VR} PROPERTIES VS_TOOL_OVERRIDE "None" ) list(APPEND RBDOOM3_SOURCES ${WIN32_RESOURCES}) From aac3ef4f8f4173f48ac22866f2f288165f7ede7b Mon Sep 17 00:00:00 2001 From: Stephen Saunders Date: Fri, 13 Jan 2023 12:11:47 -0500 Subject: [PATCH 07/11] Update .gitignore for base/generated/ and macOS-specifics, update .gitattributes to force script file CRLF line endings --- .gitattributes | 3 +++ .gitignore | 3 +++ 2 files changed, 6 insertions(+) diff --git a/.gitattributes b/.gitattributes index 26bb3c67..27542ee8 100644 --- a/.gitattributes +++ b/.gitattributes @@ -5,3 +5,6 @@ # Don't count 3rd-party libraries neo/libs/* linguist-vendored + +# Make sure script files always have CRLF line endings for save file portability +*.script text eol=crlf diff --git a/.gitignore b/.gitignore index 38ece18b..3b636abd 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ build* eclipse* +xcode* neo/ipch *~ *.gch @@ -7,6 +8,7 @@ neo/ipch *.exe *.7z *.zip +*.DS_Store imgui.ini Doom3BFG.exe @@ -36,6 +38,7 @@ base/strings/ base/video/ base/wads/ base/renderprogs2/ +base/generated/ GPATH GRTAGS From 6ac47026f91370aa526c1c987f7a3ac0181e0efe Mon Sep 17 00:00:00 2001 From: Stephen Saunders Date: Fri, 13 Jan 2023 13:05:53 -0500 Subject: [PATCH 08/11] Update comment in .gitattributes for greater clarity re script files --- .gitattributes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitattributes b/.gitattributes index 27542ee8..340ae930 100644 --- a/.gitattributes +++ b/.gitattributes @@ -6,5 +6,5 @@ # Don't count 3rd-party libraries neo/libs/* linguist-vendored -# Make sure script files always have CRLF line endings for save file portability +# Make sure script files always have CRLF line endings for save file checksum portability *.script text eol=crlf From d07089fc7da67a4f6e5c512ed67918185893280d Mon Sep 17 00:00:00 2001 From: Stephen Saunders Date: Fri, 13 Jan 2023 19:21:40 -0500 Subject: [PATCH 09/11] Remove * wildcard from .DS_Store in .gitignore - not needed --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 3b636abd..af454130 100644 --- a/.gitignore +++ b/.gitignore @@ -8,7 +8,7 @@ neo/ipch *.exe *.7z *.zip -*.DS_Store +.DS_Store imgui.ini Doom3BFG.exe From 2565b1f58f1c2cc3b23bca0e925d9145829c95c6 Mon Sep 17 00:00:00 2001 From: Stephen Saunders Date: Sat, 14 Jan 2023 01:37:49 -0500 Subject: [PATCH 10/11] Generalize basepath search logic for single-config dev builds on linux/macOS when using make or ninja --- neo/CMakeLists.txt | 8 +++++++- neo/cmake-macos-release.sh | 2 +- neo/cmake-macos-retail.sh | 2 +- neo/sys/posix/posix_main.cpp | 6 +++--- 4 files changed, 12 insertions(+), 6 deletions(-) diff --git a/neo/CMakeLists.txt b/neo/CMakeLists.txt index e13a4df2..15beeb6c 100644 --- a/neo/CMakeLists.txt +++ b/neo/CMakeLists.txt @@ -94,10 +94,16 @@ if(UNIX) set(USE_VULKAN ON) # SRS - Disable precompiled headers when cross-compiling on OSX, e.g. when creating universal binaries - if((CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL "x86_64" AND CMAKE_OSX_ARCHITECTURES MATCHES "arm64" ) OR + if((CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL "x86_64" AND CMAKE_OSX_ARCHITECTURES MATCHES "arm64" ) OR (CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL "arm64" AND CMAKE_OSX_ARCHITECTURES MATCHES "x86_64")) set(USE_PRECOMPILED_HEADERS OFF) endif() + + # SRS - For single-config dev builds, define NO_MULTI_CONFIG to search for basepath up 1 dir level vs 2 + if((CMAKE_GENERATOR MATCHES "Unix Makefiles") OR + (CMAKE_GENERATOR MATCHES "Ninja" AND NOT CMAKE_GENERATOR MATCHES "Multi-Config")) + add_definitions(-DNO_MULTI_CONFIG) + endif() endif() if(COMPILE_COMMANDS) diff --git a/neo/cmake-macos-release.sh b/neo/cmake-macos-release.sh index 450a451a..e9064c69 100755 --- a/neo/cmake-macos-release.sh +++ b/neo/cmake-macos-release.sh @@ -3,4 +3,4 @@ rm -rf build mkdir build cd build # change or remove -DCMAKE_OSX_DEPLOYMENT_TARGET= to match supported runtime targets -cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS_RELEASE="-DNDEBUG -DNO_MULTI_CONFIG" -DCMAKE_OSX_DEPLOYMENT_TARGET=12.1 -DFFMPEG=OFF -DBINKDEC=ON -DUSE_MoltenVK=ON -DOPENAL_LIBRARY=/usr/local/opt/openal-soft/lib/libopenal.dylib -DOPENAL_INCLUDE_DIR=/usr/local/opt/openal-soft/include ../neo -Wno-dev +cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS_RELEASE="-DNDEBUG" -DCMAKE_OSX_DEPLOYMENT_TARGET=12.1 -DFFMPEG=OFF -DBINKDEC=ON -DUSE_MoltenVK=ON -DOPENAL_LIBRARY=/usr/local/opt/openal-soft/lib/libopenal.dylib -DOPENAL_INCLUDE_DIR=/usr/local/opt/openal-soft/include ../neo -Wno-dev diff --git a/neo/cmake-macos-retail.sh b/neo/cmake-macos-retail.sh index 2999f229..47844789 100755 --- a/neo/cmake-macos-retail.sh +++ b/neo/cmake-macos-retail.sh @@ -3,4 +3,4 @@ rm -rf build mkdir build cd build # change or remove -DCMAKE_OSX_DEPLOYMENT_TARGET= to match supported runtime targets -cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS_RELEASE="-DNDEBUG -DNO_MULTI_CONFIG -DID_RETAIL" -DCMAKE_OSX_DEPLOYMENT_TARGET=12.1 -DFFMPEG=OFF -DBINKDEC=ON -DUSE_MoltenVK=ON -DOPENAL_LIBRARY=/usr/local/opt/openal-soft/lib/libopenal.dylib -DOPENAL_INCLUDE_DIR=/usr/local/opt/openal-soft/include ../neo -Wno-dev +cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS_RELEASE="-DNDEBUG -DID_RETAIL" -DCMAKE_OSX_DEPLOYMENT_TARGET=12.1 -DFFMPEG=OFF -DBINKDEC=ON -DUSE_MoltenVK=ON -DOPENAL_LIBRARY=/usr/local/opt/openal-soft/lib/libopenal.dylib -DOPENAL_INCLUDE_DIR=/usr/local/opt/openal-soft/include ../neo -Wno-dev diff --git a/neo/sys/posix/posix_main.cpp b/neo/sys/posix/posix_main.cpp index d05e1f3a..72c80336 100644 --- a/neo/sys/posix/posix_main.cpp +++ b/neo/sys/posix/posix_main.cpp @@ -473,9 +473,9 @@ const char* Sys_DefaultBasePath() #endif // SRS - Check for linux/macOS build path (directory structure with build dir and possible config suffix) basepath = exepath; - basepath.StripFilename(); // up 1st dir level for linux and macOS single-config makefile builds -#if defined(__APPLE__) && !defined( NO_MULTI_CONFIG ) - basepath.StripFilename(); // up 2nd dir level for macOS Xcode builds with Debug/Release/etc config suffix + basepath.StripFilename(); // up 1st dir level for single-config dev builds +#if !defined( NO_MULTI_CONFIG ) + basepath.StripFilename(); // up 2nd dir level for multi-config dev builds with Debug/Release/etc suffix #endif testbase = basepath; testbase += "/"; From d62e8a1e558bb93d817751635ac494a84e6d4637 Mon Sep 17 00:00:00 2001 From: Stephen Saunders Date: Mon, 16 Jan 2023 11:28:20 -0500 Subject: [PATCH 11/11] Disable precompiled headers for the Ninja Multi-Config generator on linux & macOS --- neo/CMakeLists.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/neo/CMakeLists.txt b/neo/CMakeLists.txt index 15beeb6c..a8b8c10e 100644 --- a/neo/CMakeLists.txt +++ b/neo/CMakeLists.txt @@ -94,8 +94,10 @@ if(UNIX) set(USE_VULKAN ON) # SRS - Disable precompiled headers when cross-compiling on OSX, e.g. when creating universal binaries + # - Also disable precompiled headers when using the Ninja Multi-Config generator on linux or macOS if((CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL "x86_64" AND CMAKE_OSX_ARCHITECTURES MATCHES "arm64" ) OR - (CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL "arm64" AND CMAKE_OSX_ARCHITECTURES MATCHES "x86_64")) + (CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL "arm64" AND CMAKE_OSX_ARCHITECTURES MATCHES "x86_64") OR + (CMAKE_GENERATOR MATCHES "Ninja Multi-Config")) set(USE_PRECOMPILED_HEADERS OFF) endif()