diff --git a/.github/workflows/avara-ci.yml b/.github/workflows/avara-ci.yml index c7be1c71e..6e242b33b 100644 --- a/.github/workflows/avara-ci.yml +++ b/.github/workflows/avara-ci.yml @@ -11,75 +11,60 @@ jobs: name: Ubuntu Latest runs-on: ubuntu-latest steps: - - name: install dependencies - run: | - sudo add-apt-repository -y "deb http://archive.ubuntu.com/ubuntu `lsb_release -sc` main universe restricted multiverse" - sudo apt-get update -y -qq - sudo apt-get install libsdl2-dev libsdl2-image-dev libsdl2-mixer-dev libsdl2-ttf-dev libegl1-mesa-dev libgles2-mesa-dev libdirectfb-dev libgtest-dev libsqlite3-dev - - uses: actions/checkout@v4 - - name: make - run: make -j2 - - name: Run headless test - uses: GabrielBB/xvfb-action@v1.7 - with: - run: make tests + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: '3.x' + - name: Install dependencies + run: | + sudo add-apt-repository -y "deb http://archive.ubuntu.com/ubuntu `lsb_release -sc` main universe restricted multiverse" + sudo apt-get update -y -qq + sudo apt-get install libegl1-mesa-dev libgles2-mesa-dev + python -m pip install meson ninja + - name: Configure Project + run: meson setup build + env: + CC: clang + CXX: clang++ + - name: Build + run: meson compile -C build + - name: Run headless test + uses: GabrielBB/xvfb-action@v1.7 + with: + run: meson test -v -C build Windows: name: Windows runs-on: windows-latest steps: - uses: actions/checkout@v4 - - name: Add MSBuild to PATH - uses: microsoft/setup-msbuild@v2 - - name: Setup vcpkg - uses: lukka/run-vcpkg@v11 - - name: Build - run: | - vcpkg integrate install - .\bin\git_version.ps1 - msbuild /m /p:Platform=x64 /p:Configuration=Release .\Avara.msvc\Avara.sln - shell: pwsh - - name: Run headless test - run: .\Avara.msvc\x64\Release\Tests.exe - shell: pwsh - - name: WinAvara archive - run: .\bin\winavarazip.ps1 - shell: pwsh - - name: deploy main nightly - if: startsWith(github.repository_owner, 'avaraline') && endsWith(github.ref, 'main') - uses: WebFreak001/deploy-nightly@v1.0.1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - uses: actions/setup-python@v5 + with: + python-version: '3.x' + - name: Install dependencies + run: python -m pip install meson ninja + - name: Prepare MSVC + uses: bus1/cabuild/action/msdevshell@v1 with: - upload_url: https://uploads.github.com/repos/avaraline/Avara/releases/28954246/assets{?name,label} - release_id: 28954246 - asset_path: ./WinAvara.zip - asset_name: Avara-Windows-Nightly-$$.zip - asset_content_type: application/zip - max_releases: 1 + architecture: x64 + - name: Prepare build + run: meson setup build + - name: Build + run: meson compile -C build + - name: Test + run: meson test -v -C build macOS: name: macOS runs-on: macos-13 steps: - - name: install dependencies - run: | - wget -q "https://github.com/libsdl-org/SDL/releases/download/release-2.26.2/SDL2-2.26.2.dmg" - hdiutil attach SDL2-2.26.2.dmg - sudo cp -R /Volumes/SDL2/SDL2.framework /Library/Frameworks/ - brew install googletest - uses: actions/checkout@v4 - - name: Run headless tests - run: make -j4 tests - - name: make macdist - run: make -j4 clean macdist - - name: deploy main nightly - if: startsWith(github.repository_owner, 'avaraline') && endsWith(github.ref, 'main') - uses: WebFreak001/deploy-nightly@v1.0.1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - uses: actions/setup-python@v5 with: - upload_url: https://uploads.github.com/repos/avaraline/Avara/releases/28954246/assets{?name,label} - release_id: 28954246 - asset_path: ./build/MacAvara.zip - asset_name: Avara-macOS-Nightly-$$.zip - asset_content_type: application/zip - max_releases: 1 + python-version: '3.x' + - name: Install dependencies + run: python -m pip install meson ninja + - name: Prepare build + run: meson setup build + - name: Build + run: meson compile -C build + - name: Test + run: meson test -v -C build diff --git a/Avara.msvc/AvaraCore.vcxproj b/Avara.msvc/AvaraCore.vcxproj index 230d2fcfe..6e7a4ef6f 100644 --- a/Avara.msvc/AvaraCore.vcxproj +++ b/Avara.msvc/AvaraCore.vcxproj @@ -159,6 +159,7 @@ + @@ -369,6 +370,7 @@ + diff --git a/Avara.msvc/AvaraCore.vcxproj.filters b/Avara.msvc/AvaraCore.vcxproj.filters index 6b69ebb97..fc26d5085 100644 --- a/Avara.msvc/AvaraCore.vcxproj.filters +++ b/Avara.msvc/AvaraCore.vcxproj.filters @@ -57,6 +57,9 @@ Header Files + + Header Files + Header Files @@ -995,6 +998,9 @@ Source Files + + Source Files + Source Files diff --git a/Avara.xcodeproj/project.pbxproj b/Avara.xcodeproj/project.pbxproj index ebeb56fa3..fe52a3667 100644 --- a/Avara.xcodeproj/project.pbxproj +++ b/Avara.xcodeproj/project.pbxproj @@ -8,6 +8,9 @@ /* Begin PBXBuildFile section */ 6025AE4E2C255E6A00A57EFB /* LegacyOpenGLRenderer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 60C274E22C23EBE9005B67A9 /* LegacyOpenGLRenderer.cpp */; }; + 6055BF212DEA8A79005E3CFB /* BasePath.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6055BF202DEA8A79005E3CFB /* BasePath.cpp */; }; + 6055BF222DEA8A79005E3CFB /* BasePath.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6055BF202DEA8A79005E3CFB /* BasePath.cpp */; }; + 6055BF232DEA8A79005E3CFB /* BasePath.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6055BF202DEA8A79005E3CFB /* BasePath.cpp */; }; 940541ED2B5875B200E32241 /* OpenGLShader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 940541EC2B5875B200E32241 /* OpenGLShader.cpp */; }; 940541EE2B5875B200E32241 /* OpenGLShader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 940541EC2B5875B200E32241 /* OpenGLShader.cpp */; }; 9419E8472B49ECB1007C50D0 /* CTeamColorAdjuster.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9419E8462B49ECB1007C50D0 /* CTeamColorAdjuster.cpp */; }; @@ -577,6 +580,8 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 6055BF1F2DEA8A79005E3CFB /* BasePath.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = BasePath.h; sourceTree = ""; }; + 6055BF202DEA8A79005E3CFB /* BasePath.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = BasePath.cpp; sourceTree = ""; }; 60C274E22C23EBE9005B67A9 /* LegacyOpenGLRenderer.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = LegacyOpenGLRenderer.cpp; sourceTree = ""; }; 60C274E32C23EBE9005B67A9 /* LegacyOpenGLRenderer.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.h; path = LegacyOpenGLRenderer.h; sourceTree = ""; }; 940541EB2B58744500E32241 /* OpenGLShader.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = OpenGLShader.h; sourceTree = ""; }; @@ -1290,6 +1295,8 @@ 944F2F6E2B323E2100856E53 /* LocalAssetRepository.h */, 948CBF132B335A1400147E80 /* BaseAssetStorage.cpp */, 948CBF122B3359D700147E80 /* BaseAssetStorage.h */, + 6055BF1F2DEA8A79005E3CFB /* BasePath.h */, + 6055BF202DEA8A79005E3CFB /* BasePath.cpp */, ); path = assets; sourceTree = ""; @@ -2384,6 +2391,7 @@ files = ( E517F0EA299714220036B206 /* glad.c in Sources */, E517F0EB299714220036B206 /* nanovg.c in Sources */, + 6055BF222DEA8A79005E3CFB /* BasePath.cpp in Sources */, E517F0EC299714220036B206 /* stb_vorbis.c in Sources */, E517F053299713DB0036B206 /* tests.cpp in Sources */, E517F054299713DB0036B206 /* CBasicSound.cpp in Sources */, @@ -2557,6 +2565,7 @@ files = ( E5890F1B29895124007A875D /* pugixml.cpp in Sources */, E5890CFE29895118007A875D /* CSmartPart.cpp in Sources */, + 6055BF232DEA8A79005E3CFB /* BasePath.cpp in Sources */, E5890F9529895124007A875D /* nanovg.c in Sources */, E5890CE729895118007A875D /* CShuriken.cpp in Sources */, E5890D0E29895118007A875D /* CRosterWindow.cpp in Sources */, @@ -2851,6 +2860,7 @@ E5A21A2F2DC59135007D54FF /* OpenGLShader.cpp in Sources */, E5A21A302DC59135007D54FF /* OpenGLVertices.cpp in Sources */, E5A21A312DC59135007D54FF /* AbstractRenderer.cpp in Sources */, + 6055BF212DEA8A79005E3CFB /* BasePath.cpp in Sources */, E5A21A322DC59135007D54FF /* CommandManager.cpp in Sources */, E5A21A332DC59135007D54FF /* TextCommand.cpp in Sources */, E5A21A342DC59135007D54FF /* ARGBColor.cpp in Sources */, diff --git a/Makefile b/Makefile index 016774a58..227987174 100644 --- a/Makefile +++ b/Makefile @@ -96,16 +96,16 @@ DEPS := $(OBJS:.o=.d) # Alternatively set this to "NONE" for no code signing. SIGNING_ID := NONE -avara: set-version $(BUILD_DIR)/Avara resources +avara: set-version $(BUILD_DIR)/Avara -tests: set-version $(BUILD_DIR)/tests resources - $(BUILD_DIR)/tests +tests: set-version $(BUILD_DIR)/tests + AVARA_RSRC_PATH=$(shell pwd)/ $(BUILD_DIR)/tests -bspviewer: $(BUILD_DIR)/BSPViewer resources +bspviewer: $(BUILD_DIR)/BSPViewer -levelviewer: $(BUILD_DIR)/AvaraLevelViewer resources +levelviewer: $(BUILD_DIR)/AvaraLevelViewer -hsnd2wav: set-version $(BUILD_DIR)/hsnd2wav resources +hsnd2wav: set-version $(BUILD_DIR)/hsnd2wav frandom: $(BUILD_DIR)/frandom @@ -124,7 +124,8 @@ macdist: macapp winapp: avara $(RMDIR) $(BUILD_DIR)/WinAvara $(MKDIR_P) $(BUILD_DIR)/WinAvara - cp -r $(BUILD_DIR)/{Avara.exe,levels,rsrc} $(BUILD_DIR)/WinAvara + cp -r $(BUILD_DIR)/Avara.exe $(BUILD_DIR)/WinAvara + cp -r {levels,rsrc} ${BUILD_DIR}/WinAvara cp /mingw64/bin/{libstdc++-6,libwinpthread-1,libgcc_s_seh-1,SDL2}.dll $(BUILD_DIR)/WinAvara windist: winapp @@ -192,9 +193,4 @@ clean-levels: $(RM) levels/*/ogg/*.ogg $(RM) levels/*/wav/*.wav -resources: - # python3 bin/pict2svg.py - # cp -r bsps levels rsrc shaders $(BUILD_DIR) - rsync -av levels rsrc $(BUILD_DIR) - -include $(DEPS) diff --git a/bin/winavarazip.ps1 b/bin/winavarazip.ps1 index b582d5b27..de72e757a 100644 --- a/bin/winavarazip.ps1 +++ b/bin/winavarazip.ps1 @@ -1,6 +1,6 @@ mkdir WinAvara -cp .\Avara.msvc\x64\Release\*.exe WinAvara -cp .\Avara.msvc\x64\Release\*.dll WinAvara +cp .\build\*.exe WinAvara +cp .\build\*.dll WinAvara cp -r .\levels WinAvara cp -r .\rsrc WinAvara Compress-Archive -Path .\WinAvara -DestinationPath .\WinAvara.zip \ No newline at end of file diff --git a/meson.build b/meson.build new file mode 100644 index 000000000..3e7e02c59 --- /dev/null +++ b/meson.build @@ -0,0 +1,248 @@ +project( + 'avara', + ['c', 'cpp'], + version : '0.7.6', + meson_version : '>= 1.3.0', + default_options : ['c_std=c17', 'warning_level=3', 'cpp_std=c++17'], +) +cxx = meson.get_compiler('cpp') + +m_dep = cxx.find_library('m', required: false) +thread_dep = dependency('threads') +gl_dep = dependency('gl') +sdl2_dep = dependency('sdl2') +sqlite3_dep = dependency('sqlite3') +gtest_dep = dependency('gtest') + +avara_deps = [ + m_dep, + thread_dep, + gl_dep, + sdl2_dep, + sqlite3_dep +] + +test_deps = avara_deps +test_deps += gtest_dep + +inc_dir = include_directories( + 'src/compat', + 'src/net', + 'src/util', + 'src/util/huffman', + 'src/tui', + 'src/render', + 'src/game', + 'src/bsp', + 'src/audio', + 'src/gui', + 'src/level', + 'src/assets', + 'src/base', + 'vendor', + 'vendor/glad', + 'vendor/glad/KHR', + 'vendor/glm', + 'vendor/nanogui', + 'vendor/nanovg', + 'vendor/pugixml', + 'vendor/utf8', +) + +srcs = [ + 'src/compat/Memory.cpp', + 'src/compat/System.cpp', + 'src/net/CCommManager.cpp', + 'src/net/CUDPComm.cpp', + 'src/net/AvaraTCP.cpp', + 'src/net/CUDPConnection.cpp', + 'src/net/CProtoControl.cpp', + 'src/util/CRC.cpp', + 'src/util/Beeper.cpp', + 'src/util/huffman/CHuffProcessor.cpp', + 'src/util/huffman/CAbstractPipe.cpp', + 'src/util/huffman/CAbstractHuffPipe.cpp', + 'src/util/huffman/CHandlePipe.cpp', + 'src/util/FastMat.cpp', + 'src/util/ARGBColor.cpp', + 'src/util/Debug.cpp', + 'src/util/CStringDictionary.cpp', + 'src/util/PascalStrings.cpp', + 'src/util/RamFiles.cpp', + 'src/tui/CommandManager.cpp', + 'src/tui/TextCommand.cpp', + 'src/render/ModernOpenGLRenderer.cpp', + 'src/render/LegacyOpenGLRenderer.cpp', + 'src/render/OpenGLShader.cpp', + 'src/render/OpenGLVertices.cpp', + 'src/render/AbstractRenderer.cpp', + 'src/game/CLogic.cpp', + 'src/game/CFreeSolid.cpp', + 'src/game/CIncarnator.cpp', + 'src/game/CForceField.cpp', + 'src/game/CTeamColorAdjuster.cpp', + 'src/game/CPlacedActors.cpp', + 'src/game/CHUD.cpp', + 'src/game/CWeapon.cpp', + 'src/game/KeyFuncs.cpp', + 'src/game/CDome.cpp', + 'src/game/CAbstractMissile.cpp', + 'src/game/CScout.cpp', + 'src/game/CSwitchActor.cpp', + 'src/game/CAbstractActor.cpp', + 'src/game/CGoal.cpp', + 'src/game/CParasite.cpp', + 'src/game/CDoorActor.cpp', + 'src/game/CLogicTimer.cpp', + 'src/game/CLogicCounter.cpp', + 'src/game/CGuardActor.cpp', + 'src/game/CRUDsqlite.cpp', + 'src/game/CMineActor.cpp', + 'src/game/CFreeCam.cpp', + 'src/game/CLogicBase.cpp', + 'src/game/CPlayerMissile.cpp', + 'src/game/CWorldShader.cpp', + 'src/game/CGoody.cpp', + 'src/game/CAvaraApp.cpp', + 'src/game/CWallActor.cpp', + 'src/game/CTriPyramidActor.cpp', + 'src/game/CAbstractPlayer.cpp', + 'src/game/CSphereActor.cpp', + 'src/game/CHologramActor.cpp', + 'src/game/CBall.cpp', + 'src/game/CUfo.cpp', + 'src/game/CSmart.cpp', + 'src/game/CMarkerActor.cpp', + 'src/game/CAbstractYon.cpp', + 'src/game/CGlowActors.cpp', + 'src/game/PlayerRatingsSimpleElo.cpp', + 'src/game/CWallDoor.cpp', + 'src/game/CRandomIncarnator.cpp', + 'src/game/CYonSphere.cpp', + 'src/game/CAvaraGame.cpp', + 'src/game/CTextActor.cpp', + 'src/game/CLogicAnd.cpp', + 'src/game/CYonBox.cpp', + 'src/game/CLogicDistributor.cpp', + 'src/game/CLogicDelay.cpp', + 'src/game/CAbstractMovers.cpp', + 'src/game/CRealMovers.cpp', + 'src/game/CGrenade.cpp', + 'src/game/CAreaActor.cpp', + 'src/game/CWalkerActor.cpp', + 'src/game/CZombieActor.cpp', + 'src/game/CShuriken.cpp', + 'src/game/CSkyColorAdjuster.cpp', + 'src/game/CNetManager.cpp', + 'src/game/CDepot.cpp', + 'src/game/CPlayerActor.cpp', + 'src/game/CTeleporter.cpp', + 'src/game/CMissile.cpp', + 'src/game/CScoreKeeper.cpp', + 'src/game/CWallSolid.cpp', + 'src/game/CPlayerManager.cpp', + 'src/game/LevelInfo.cpp', + 'src/game/CSliverPart.cpp', + 'src/game/CPill.cpp', + 'src/game/CSoundActor.cpp', + 'src/game/CSolidActor.cpp', + 'src/game/CRamp.cpp', + 'src/game/CGroundColorAdjuster.cpp', + 'src/game/CRealShooters.cpp', + 'src/game/CDoor2Actor.cpp', + 'src/bsp/CCompoundShape.cpp', + 'src/bsp/CBSPWorld.cpp', + 'src/bsp/CSmartBox.cpp', + 'src/bsp/CViewParameters.cpp', + 'src/bsp/CScaledBSP.cpp', + 'src/bsp/CBSPPart.cpp', + 'src/bsp/CSmartPart.cpp', + 'src/audio/OggFile.cpp', + 'src/audio/CRateSound.cpp', + 'src/audio/CSoundHub.cpp', + 'src/audio/DopplerPlug.cpp', + 'src/audio/CBasicSound.cpp', + 'src/audio/CSoundMixer.cpp', + 'src/gui/CServerWindow.cpp', + 'src/gui/CNetworkWindow.cpp', + 'src/gui/ColorManager.cpp', + 'src/gui/CWindow.cpp', + 'src/gui/CPlayerWindow.cpp', + 'src/gui/Tags.cpp', + 'src/gui/CTrackerWindow.cpp', + 'src/gui/CRosterWindow.cpp', + 'src/gui/CLevelWindow.cpp', + 'src/gui/CApplication.cpp', + 'src/level/LevelLoader.cpp', + 'src/level/LinkLoose.cpp', + 'src/level/Parser.cpp', + 'src/assets/BasePath.cpp', + 'src/assets/BaseAssetStorage.cpp', + 'src/assets/AssetManager.cpp', + 'src/assets/PackageManifest.cpp', + 'src/assets/LocalAssetRepository.cpp', + 'src/base/CBaseObject.cpp', + 'src/base/CTagBase.cpp', + 'src/base/CDirectObject.cpp', + 'vendor/csscolorparser.cpp', + 'vendor/nanogui/widget.cpp', + 'vendor/nanogui/colorcombobox.cpp', + 'vendor/nanogui/common.cpp', + 'vendor/nanogui/checkbox.cpp', + 'vendor/nanogui/vscrollpanel.cpp', + 'vendor/nanogui/button.cpp', + 'vendor/nanogui/text.cpp', + 'vendor/nanogui/stackedwidget.cpp', + 'vendor/nanogui/tabheader.cpp', + 'vendor/nanogui/window.cpp', + 'vendor/nanogui/screen.cpp', + 'vendor/nanogui/popup.cpp', + 'vendor/nanogui/layout.cpp', + 'vendor/nanogui/nanogui_resources.cpp', + 'vendor/nanogui/glcanvas.cpp', + 'vendor/nanogui/tabwidget.cpp', + 'vendor/nanogui/progressbar.cpp', + 'vendor/nanogui/combobox.cpp', + 'vendor/nanogui/theme.cpp', + 'vendor/nanogui/label.cpp', + 'vendor/nanogui/messagedialog.cpp', + 'vendor/nanogui/glutil.cpp', + 'vendor/nanogui/textbox.cpp', + 'vendor/nanogui/slider.cpp', + 'vendor/nanogui/popupbutton.cpp', + 'vendor/nanogui/desccombobox.cpp', + 'vendor/pugixml/pugixml.cpp', + 'vendor/glm/detail/glm.cpp', + 'vendor/stb_vorbis.c', + 'vendor/glad/glad.c', + 'vendor/nanovg/nanovg.c' +] + +avara_srcs = srcs +avara_srcs += 'src/Avara.cpp' + +bindir = meson.current_build_dir() +exe = executable( + 'Avara', + avara_srcs, + install : true, + install_dir : bindir, + dependencies : avara_deps, + include_directories : inc_dir, + cpp_args: '-DNANOGUI_GLAD' +) + +test_srcs = srcs +test_srcs += 'src/tests.cpp' + +tests = executable( + 'tests', + test_srcs, + install : true, + install_dir : bindir, + dependencies : test_deps, + include_directories : inc_dir, + cpp_args: '-DNANOGUI_GLAD' +) + +test('avara tests', tests, args: ['--basepath', (meson.current_source_dir() / '')]) \ No newline at end of file diff --git a/src/Avara.cpp b/src/Avara.cpp index e58c16bfc..2be32fbce 100644 --- a/src/Avara.cpp +++ b/src/Avara.cpp @@ -14,6 +14,7 @@ #include "CBSPPart.h" #include "FastMat.h" #include "Preferences.h" +#include "BasePath.h" #ifdef _WIN32 #include @@ -82,6 +83,12 @@ std::vector combinedArgs(std::string defaultArgs, int argc, char* a } int main(int argc, char *argv[]) { + // Check basepath override. + for (int i = 0; i < argc; i++) { + if (strcmp(argv[i], "--basepath") == 0) { + SetBasePath(argv[++i]); + } + } // Allow Windows to run in HiDPI mode. SetHiDPI(); @@ -133,6 +140,9 @@ int main(int argc, char *argv[]) { textCommand.insert(0, "/"); } textCommands.push_back(textCommand); + } else if (arg == "--basepath") { + // skip, it was handled earlier in main() + i = i + 2; } else { SDL_Log("Unknown command-line argument '%s'\n", args[i].c_str()); exit(1); diff --git a/src/assets/AssetManager.cpp b/src/assets/AssetManager.cpp index f3723a7ca..67120912f 100644 --- a/src/assets/AssetManager.cpp +++ b/src/assets/AssetManager.cpp @@ -1,7 +1,7 @@ #include "AssetManager.h" #include "BaseAssetStorage.h" #include "LocalAssetRepository.h" - +#include "BasePath.h" #include "LevelLoader.h" #include @@ -33,18 +33,12 @@ void AssetCache::RemoveAll(std::vector &packageList) } }; -std::shared_ptr _baseStorage = BaseAssetStorage::GetInstance(); -std::shared_ptr _localStorage = LocalAssetRepository::GetInstance(); -std::shared_ptr _localRepo = LocalAssetRepository::GetInstance(); - // Initialize static variables. BasePackage AssetManager::basePackage = BasePackage::Avara; std::vector AssetManager::externalPackages = {}; -std::shared_ptr AssetManager::baseStorage = _baseStorage; -std::shared_ptr AssetManager::assetStorage = _localStorage; -std::vector> AssetManager::repositoryStack = { - _localRepo -}; +std::shared_ptr AssetManager::baseStorage = {}; +std::shared_ptr AssetManager::assetStorage = {}; +std::vector> AssetManager::repositoryStack = {}; std::shared_ptr AssetManager::objectTypes = nullptr; SimpleAssetCache AssetManager::manifestCache = {}; SimpleAssetCache AssetManager::avarascriptCache = {}; @@ -206,6 +200,12 @@ std::optional> AssetManager::GetHull(int16_t i void AssetManager::Init() { + baseStorage = BaseAssetStorage::GetInstance(); + assetStorage = LocalAssetRepository::GetInstance(); + repositoryStack = { + LocalAssetRepository::GetInstance() + }; + LoadManifest(NoPackage); LoadScript(NoPackage); LoadEnumeratedObjectTypes(); diff --git a/src/assets/AssetManager.h b/src/assets/AssetManager.h index 4e393c5c4..d5011e36c 100644 --- a/src/assets/AssetManager.h +++ b/src/assets/AssetManager.h @@ -25,13 +25,6 @@ # endif #endif -// Path separator -#if defined(_WIN32) -#define PATHSEP "\\" -#else -#define PATHSEP "/" -#endif - // Package structure #define MANIFESTFILE "set.json" @@ -183,7 +176,7 @@ class AssetManager { static bool PackageInStorage(std::string packageName); private: AssetManager() {} - + static BasePackage basePackage; static std::vector externalPackages; static std::shared_ptr baseStorage; diff --git a/src/assets/BaseAssetStorage.cpp b/src/assets/BaseAssetStorage.cpp index 155bcb189..c0444acb4 100644 --- a/src/assets/BaseAssetStorage.cpp +++ b/src/assets/BaseAssetStorage.cpp @@ -1,14 +1,12 @@ #include "BaseAssetStorage.h" #include "AssetManager.h" +#include "BasePath.h" -#include #include BaseAssetStorage::BaseAssetStorage() { - char *sdlPathTmp = SDL_GetBasePath(); - basePath = std::string(sdlPathTmp); - SDL_free(sdlPathTmp); + basePath = GetBasePath(); } std::shared_ptr BaseAssetStorage::GetInstance() { diff --git a/src/assets/BasePath.cpp b/src/assets/BasePath.cpp new file mode 100644 index 000000000..415b5c788 --- /dev/null +++ b/src/assets/BasePath.cpp @@ -0,0 +1,33 @@ +#include "BasePath.h" +#include +#include + + +#define RSRC_PATH_ENV_VAR "AVARA_RSRC_PATH" +bool basepathLookupDone = false; +std::string basepath = ""; + +void SetBasePath(char* bp) { + // if set from a command line argument, override env var + basepath.assign(bp); + basepathLookupDone = true; + SDL_Log("Asset base path set by --basepath to %s", basepath.c_str()); +} + +std::string GetBasePath() { + if (!basepathLookupDone) { + // look at environment variable + if (const char* env_bp = std::getenv(RSRC_PATH_ENV_VAR)) { + size_t length = strlen(env_bp); + if (length > 0) { + basepath.assign(env_bp); + } + } + if (basepath.length() < 1) + basepath.assign(SDL_GetBasePath()); + basepathLookupDone = true; + SDL_Log("Asset base path set to %s", basepath.c_str()); + } + return basepath; +} + diff --git a/src/assets/BasePath.h b/src/assets/BasePath.h new file mode 100644 index 000000000..f758f3508 --- /dev/null +++ b/src/assets/BasePath.h @@ -0,0 +1,15 @@ +#ifndef BASE_PATH_H +#define BASE_PATH_H +#include + +// Path separator +#if defined(_WIN32) +#define PATHSEP "\\" +#else +#define PATHSEP "/" +#endif + +void SetBasePath(char* bp); +std::string GetBasePath(); + +#endif diff --git a/src/assets/LocalAssetRepository.cpp b/src/assets/LocalAssetRepository.cpp index ffaa0c6a6..9da4bcec1 100644 --- a/src/assets/LocalAssetRepository.cpp +++ b/src/assets/LocalAssetRepository.cpp @@ -1,19 +1,16 @@ #include "LocalAssetRepository.h" #include "AssetManager.h" +#include "BasePath.h" #define CUTE_FILES_IMPLEMENTATION #include -#include - #include #include LocalAssetRepository::LocalAssetRepository() { - char *sdlPathTmp = SDL_GetBasePath(); - basePath = std::string(sdlPathTmp); - SDL_free(sdlPathTmp); + basePath = GetBasePath(); } std::shared_ptr LocalAssetRepository::GetInstance() diff --git a/src/hsnd2wav.cpp b/src/hsnd2wav.cpp index 849096815..2ac0f5c90 100644 --- a/src/hsnd2wav.cpp +++ b/src/hsnd2wav.cpp @@ -4,6 +4,7 @@ #include "FastMat.h" #include "SDL2/SDL.h" #include "SoundSystemDefines.h" +#include "BasePath.h" #include @@ -37,7 +38,7 @@ typedef SampleHeaderPtr *SampleHeaderHandle; static SampleHeaderHandle sampleList = NULL; static CHuffProcessor *itsCompressor = new CHuffProcessor; -static std::string defaultResource(std::string(SDL_GetBasePath()) + "rsrc/Avara.r"); +static std::string defaultResource(GetBasePath() + "rsrc/Avara.r"); static std::string currentResource(""); @@ -50,7 +51,7 @@ bool IsEquals(const std::string& str1, const std::string& str2) { } void UseResFile(std::string filename) { - currentResource.assign(std::string(SDL_GetBasePath()) + filename); + currentResource.assign(GetBasePath() + filename); } Handle FindResource(SDL_RWops *file, OSType theType, short theID, std::string name) { diff --git a/src/level/LevelLoader.cpp b/src/level/LevelLoader.cpp index fcc2d5109..792d0e15b 100644 --- a/src/level/LevelLoader.cpp +++ b/src/level/LevelLoader.cpp @@ -11,6 +11,7 @@ #include "AbstractRenderer.h" #include "AssetManager.h" +#include "BasePath.h" #include "CAvaraGame.h" #include "CWallActor.h" #include "FastMat.h" diff --git a/src/tests.cpp b/src/tests.cpp index 49b4af04c..aa8ce4545 100644 --- a/src/tests.cpp +++ b/src/tests.cpp @@ -1,5 +1,6 @@ #include "gtest/gtest.h" #include +#include "BasePath.h" #include "AssetManager.h" #include "CAvaraApp.h" #include "CBSPPart.h" @@ -1236,6 +1237,12 @@ TEST(MATERIALS, Manipulation) { } int main(int argc, char **argv) { + // Check basepath override. + for (int i = 0; i < argc; i++) { + if (strcmp(argv[i], "--basepath") == 0) { + SetBasePath(argv[++i]); + } + } nanogui::init(); InitMatrix(); ::testing::InitGoogleTest(&argc, argv); diff --git a/src/util/Beeper.cpp b/src/util/Beeper.cpp index 35f7b3eee..f0fe395d2 100644 --- a/src/util/Beeper.cpp +++ b/src/util/Beeper.cpp @@ -1,5 +1,5 @@ #include "Beeper.h" - +#include "BasePath.h" #include #include #include @@ -14,7 +14,7 @@ void Beep() { if (!beepLoaded) { // TODO: backslash on Windows char wavPath[256]; - snprintf(wavPath, 256, "%srsrc/%s", SDL_GetBasePath(), "sosumi.wav"); + snprintf(wavPath, 256, "%srsrc/%s", GetBasePath().c_str(), "sosumi.wav"); SDL_memset(&wavSpec, 0, sizeof(wavSpec)); if (SDL_LoadWAV(wavPath, &wavSpec, &wavBuffer, &wavLength)) { beepLoaded = true; diff --git a/subprojects/gtest.wrap b/subprojects/gtest.wrap new file mode 100644 index 000000000..1ef791e60 --- /dev/null +++ b/subprojects/gtest.wrap @@ -0,0 +1,16 @@ +[wrap-file] +directory = googletest-1.17.0 +source_url = https://github.com/google/googletest/archive/refs/tags/v1.17.0.tar.gz +source_filename = gtest-1.17.0.tar.gz +source_hash = 65fab701d9829d38cb77c14acdc431d2108bfdbf8979e40eb8ae567edf10b27c +patch_filename = gtest_1.17.0-2_patch.zip +patch_url = https://wrapdb.mesonbuild.com/v2/gtest_1.17.0-2/get_patch +patch_hash = c6ff59f36c8ee48bcd6d968f08a5a08c2c4216a2327079c0ae2323b2e062971e +source_fallback_url = https://github.com/mesonbuild/wrapdb/releases/download/gtest_1.17.0-2/gtest-1.17.0.tar.gz +wrapdb_version = 1.17.0-2 + +[provide] +gtest = gtest_dep +gtest_main = gtest_main_dep +gmock = gmock_dep +gmock_main = gmock_main_dep diff --git a/subprojects/sdl2.wrap b/subprojects/sdl2.wrap new file mode 100644 index 000000000..bb790fb88 --- /dev/null +++ b/subprojects/sdl2.wrap @@ -0,0 +1,15 @@ +[wrap-file] +directory = SDL2-2.30.6 +source_url = https://github.com/libsdl-org/SDL/releases/download/release-2.30.6/SDL2-2.30.6.tar.gz +source_filename = SDL2-2.30.6.tar.gz +source_hash = c6ef64ca18a19d13df6eb22df9aff19fb0db65610a74cc81dae33a82235cacd4 +patch_filename = sdl2_2.30.6-2_patch.zip +patch_url = https://wrapdb.mesonbuild.com/v2/sdl2_2.30.6-2/get_patch +patch_hash = aa9f6a4947b07510c2ea84fb457e965bebe5a5deeb9f5059fbcf10dfe6b76d1f +source_fallback_url = https://github.com/mesonbuild/wrapdb/releases/download/sdl2_2.30.6-2/SDL2-2.30.6.tar.gz +wrapdb_version = 2.30.6-2 + +[provide] +sdl2 = sdl2_dep +sdl2main = sdl2main_dep +sdl2_test = sdl2_test_dep diff --git a/subprojects/sqlite3.wrap b/subprojects/sqlite3.wrap new file mode 100644 index 000000000..1d16669e8 --- /dev/null +++ b/subprojects/sqlite3.wrap @@ -0,0 +1,13 @@ +[wrap-file] +directory = sqlite-amalgamation-3490200 +source_url = https://www.sqlite.org/2025/sqlite-amalgamation-3490200.zip +source_filename = sqlite-amalgamation-3490200.zip +source_hash = 921fc725517a694df7df38a2a3dfede6684024b5788d9de464187c612afb5918 +patch_filename = sqlite3_3.49.2-1_patch.zip +patch_url = https://wrapdb.mesonbuild.com/v2/sqlite3_3.49.2-1/get_patch +patch_hash = e3eef046409329c5c1ca8308255caa2266710fc1b9d8695fdedd04cebe42a690 +source_fallback_url = https://github.com/mesonbuild/wrapdb/releases/download/sqlite3_3.49.2-1/sqlite-amalgamation-3490200.zip +wrapdb_version = 3.49.2-1 + +[provide] +sqlite3 = sqlite3_dep diff --git a/vcpkg.json b/vcpkg.json deleted file mode 100644 index 8564dd458..000000000 --- a/vcpkg.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "name": "avara", - "version-date": "2024-03-19", - "dependencies": [ - "sdl2", - "glad", - "gtest", - "sqlite3" - ], - "builtin-baseline":"000d1bda1ffa95a73e0b40334fa4103d6f4d3d48" -}