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"
-}