Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,12 @@ jobs:
cmake ninja-build \
libgl1-mesa-dev \
libx11-dev libxrandr-dev libxi-dev \
libxinerama-dev libxcursor-dev
libxinerama-dev libxcursor-dev \
libpipewire-0.3-dev pkg-config

- name: ccache
if: runner.os == 'Linux'
uses: hendrikmuhs/ccache-action@v1.2

- name: Cache build directory
uses: actions/cache@v5
Expand Down
190 changes: 135 additions & 55 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -26,45 +26,139 @@ if(UNIX AND NOT APPLE)
find_package(OpenGL REQUIRED)
endif()

option(USE_SYSTEM_LIBS "Use system-installed libraries instead of the bundled versions" $ENV{USE_SYSTEM_LIBS})

option(USE_SYSTEM_OPENAL "Use system-installed OpenAL-Soft instead of the bundled version" $ENV{USE_SYSTEM_OPENAL})
option(USE_SYSTEM_BULLET "Use system-installed Bullet3 instead of the bundled version" $ENV{USE_SYSTEM_BULLET})
option(USE_SYSTEM_GLFW "Use system-installed GLFW instead of the bundled version" $ENV{USE_SYSTEM_GLFW})

if(USE_SYSTEM_LIBS)
set(USE_SYSTEM_OPENAL ON CACHE BOOL "" FORCE)
set(USE_SYSTEM_BULLET ON CACHE BOOL "" FORCE)
set(USE_SYSTEM_GLFW ON CACHE BOOL "" FORCE)
endif()

# ---- Vendor Libraries ----
# ---- GLFW ----
set(GLFW_BUILD_DOCS OFF CACHE BOOL "" FORCE)
set(GLFW_BUILD_TESTS OFF CACHE BOOL "" FORCE)
set(GLFW_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE)
set(GLFW_INSTALL OFF CACHE BOOL "" FORCE)
set(GLFW_USE_HYBRID_HPG ON CACHE BOOL "" FORCE)

if(UNIX AND NOT APPLE AND NOT DEFINED GLFW_BUILD_WAYLAND)
find_program(GLFW_WAYLAND_SCANNER_EXECUTABLE NAMES wayland-scanner)
find_package(PkgConfig QUIET)

if(PkgConfig_FOUND)
pkg_check_modules(GLFW_WAYLAND_DEPS QUIET
wayland-client
wayland-cursor
wayland-egl
xkbcommon
)
endif()
set(USE_VENDOR_GLFW ON CACHE BOOL "" FORCE)

if(GLFW_WAYLAND_SCANNER_EXECUTABLE AND GLFW_WAYLAND_DEPS_FOUND)
set(GLFW_BUILD_WAYLAND ON CACHE BOOL "Build support for Wayland")
if (USE_SYSTEM_GLFW)
find_package(glfw3 QUIET)
if(glfw3_FOUND)
message(STATUS "Using system-installed GLFW: ${glfw3_VERSION}")
set(USE_VENDOR_GLFW OFF CACHE BOOL "" FORCE)
else()
set(GLFW_BUILD_WAYLAND OFF CACHE BOOL "Build support for Wayland")
message(STATUS "Using bundled GLFW")
endif()
endif()

if(USE_VENDOR_GLFW)
set(GLFW_BUILD_DOCS OFF CACHE BOOL "" FORCE)
set(GLFW_BUILD_TESTS OFF CACHE BOOL "" FORCE)
set(GLFW_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE)
set(GLFW_INSTALL OFF CACHE BOOL "" FORCE)
set(GLFW_USE_HYBRID_HPG ON CACHE BOOL "" FORCE)

if(UNIX AND NOT APPLE AND NOT DEFINED GLFW_BUILD_WAYLAND)
find_program(GLFW_WAYLAND_SCANNER_EXECUTABLE NAMES wayland-scanner)
find_package(PkgConfig QUIET)

if(PkgConfig_FOUND)
pkg_check_modules(GLFW_WAYLAND_DEPS QUIET
wayland-client
wayland-cursor
wayland-egl
xkbcommon
)
endif()

if(NOT GLFW_WAYLAND_SCANNER_EXECUTABLE)
set(_glfw_wayland_reason "missing wayland-scanner")
elseif(NOT PkgConfig_FOUND)
set(_glfw_wayland_reason "pkg-config is unavailable")
if(GLFW_WAYLAND_SCANNER_EXECUTABLE AND GLFW_WAYLAND_DEPS_FOUND)
set(GLFW_BUILD_WAYLAND ON CACHE BOOL "Build support for Wayland")
else()
set(_glfw_wayland_reason "missing Wayland development packages")
set(GLFW_BUILD_WAYLAND OFF CACHE BOOL "Build support for Wayland")

if(NOT GLFW_WAYLAND_SCANNER_EXECUTABLE)
set(_glfw_wayland_reason "missing wayland-scanner")
elseif(NOT PkgConfig_FOUND)
set(_glfw_wayland_reason "pkg-config is unavailable")
else()
set(_glfw_wayland_reason "missing Wayland development packages")
endif()

message(STATUS "Disabling GLFW Wayland (${_glfw_wayland_reason})")
endif()
endif()
add_subdirectory(vendor/glfw)
endif()


message(STATUS "Disabling GLFW Wayland (${_glfw_wayland_reason})")
# ---- BULLET3 ----
set(USE_VENDOR_BULLET ON CACHE BOOL "" FORCE)
if (USE_SYSTEM_BULLET)
find_package(Bullet QUIET)
if(Bullet_FOUND)
message(STATUS "Using system-installed Bullet: ${Bullet_VERSION}")
set(USE_BUILD_BULLET OFF CACHE BOOL "" FORCE)
else()
message(STATUS "Using bundled Bullet3")
endif()
endif()

add_subdirectory(vendor/glfw)
if(USE_VENDOR_BULLET)
set(BUILD_CPU_DEMOS OFF CACHE BOOL "" FORCE)
set(BUILD_OPENGL3_DEMOS OFF CACHE BOOL "" FORCE)
set(BUILD_BULLET2_DEMOS OFF CACHE BOOL "" FORCE)
set(BUILD_EXTRAS OFF CACHE BOOL "" FORCE)
set(BUILD_UNIT_TESTS OFF CACHE BOOL "" FORCE)
set(BUILD_BULLET3 ON CACHE BOOL "" FORCE)
add_subdirectory(vendor/bullet3)
endif()

# --- OpenAL-Soft ----
set(USE_VENDOR_OPENAL ON CACHE BOOL "" FORCE)

if(USE_SYSTEM_OPENAL)
find_package(OpenAL QUIET)
if (OpenAL_FOUND)
message(STATUS "Using system-installed OpenAL: ${OpenAL_VERSION}")
set(USE_VENDOR_OPENAL OFF CACHE BOOL "" FORCE)
else()
message(STATUS "Using bundled OpenAL-Soft")
endif()
endif()

if(USE_VENDOR_OPENAL)
set(ALSOFT_ENABLE_MODULES OFF CACHE BOOL "" FORCE)
set(LIBTYPE STATIC CACHE STRING "" FORCE)
set(ALSOFT_EMBED_HRTF_DATA ON CACHE BOOL "" FORCE)
set(ALSOFT_EAX ON CACHE BOOL "" FORCE)
set(ALSOFT_EXAMPLES OFF CACHE BOOL "" FORCE)
set(ALSOFT_TESTS OFF CACHE BOOL "" FORCE)
set(ALSOFT_UTILS OFF CACHE BOOL "" FORCE)
set(ALSOFT_INSTALL_CONFIG OFF CACHE BOOL "" FORCE)
set(ALSOFT_INSTALL OFF CACHE BOOL "" FORCE)
if(WIN32)
set(ALSOFT_BACKEND_WASAPI ON CACHE BOOL "" FORCE)
set(ALSOFT_BACKEND_DSOUND OFF CACHE BOOL "" FORCE)
endif()
if (UNIX AND NOT APPLE)
find_package(PkgConfig REQUIRED)
pkg_check_modules(PIPEWIRE libpipewire-0.3>=0.3.23 QUIET)
pkg_check_modules(PULSEAUDIO libpulse QUIET)
pkg_check_modules(ALSA alsa QUIET)
if(PIPEWIRE_FOUND)
set(ALSOFT_BACKEND_PIPEWIRE ON CACHE BOOL "" FORCE)
elseif(PULSEAUDIO_FOUND)
set(ALSOFT_BACKEND_PULSEAUDIO ON CACHE BOOL "" FORCE)
elseif(ALSA_FOUND)
set(ALSOFT_BACKEND_ALSA ON CACHE BOOL "" FORCE)
else()
message(FATAL_ERROR "No suitable audio backend found for OpenAL-Soft. Please install PipeWire, PulseAudio, or ALSA development packages.")
endif()
endif()

add_subdirectory(vendor/openal-soft)
endif()

# ---- GLAD ----
add_library(glad STATIC
Expand All @@ -74,30 +168,6 @@ target_include_directories(glad
PUBLIC vendor/glad/include
)

# ---- BULLET3 ----
set(BUILD_CPU_DEMOS OFF CACHE BOOL "" FORCE)
set(BUILD_OPENGL3_DEMOS OFF CACHE BOOL "" FORCE)
set(BUILD_BULLET2_DEMOS OFF CACHE BOOL "" FORCE)
set(BUILD_EXTRAS OFF CACHE BOOL "" FORCE)
set(BUILD_UNIT_TESTS OFF CACHE BOOL "" FORCE)
set(BUILD_BULLET3 ON CACHE BOOL "" FORCE)
add_subdirectory(vendor/bullet3)

# --- OpenAL-Soft ----
set(ALSOFT_ENABLE_MODULES OFF CACHE BOOL "" FORCE)
set(LIBTYPE STATIC CACHE STRING "" FORCE)
set(ALSOFT_EMBED_HRTF_DATA ON CACHE BOOL "" FORCE)
set(ALSOFT_EAX ON CACHE BOOL "" FORCE)
set(ALSOFT_EXAMPLES OFF CACHE BOOL "" FORCE)
set(ALSOFT_TESTS OFF CACHE BOOL "" FORCE)
set(ALSOFT_UTILS OFF CACHE BOOL "" FORCE)
set(ALSOFT_INSTALL_CONFIG OFF CACHE BOOL "" FORCE)
set(ALSOFT_INSTALL OFF CACHE BOOL "" FORCE)
set(ALSOFT_BACKEND_WASAPI ON CACHE BOOL "" FORCE)
set(ALSOFT_BACKEND_DSOUND OFF CACHE BOOL "" FORCE)

add_subdirectory(vendor/openal-soft)

# ---- GLM (Header-only) ----
add_library(glm INTERFACE)
target_include_directories(glm
Expand Down Expand Up @@ -194,17 +264,27 @@ target_link_libraries(${PROJECT_NAME}
BulletCollision
BulletSoftBody
LinearMath
OpenAL
)

if(USE_SYSTEM_OPENAL AND OpenAL_FOUND)
target_link_libraries(${PROJECT_NAME}
PRIVATE
OpenAL::OpenAL
)
else()
target_link_libraries(${PROJECT_NAME}
PRIVATE
OpenAL
)
endif()

target_compile_definitions(${PROJECT_NAME}
PRIVATE
$<$<CONFIG:Debug>:COLLISION_DEBUG_DRAW>
)

set_target_properties(${PROJECT_NAME} PROPERTIES
RUNTIME_OUTPUT_DIRECTORY_DEBUG ${PROJECT_SOURCE_DIR}/bin
RUNTIME_OUTPUT_DIRECTORY_RELEASE ${PROJECT_SOURCE_DIR}/bin
RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/bin
)

install(TARGETS ${PROJECT_NAME}
Expand Down
7 changes: 7 additions & 0 deletions flake.nix
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,11 @@
# Audio
pipewire

# extra precompiled libs
openal-soft
bullet
glfw

# Wayland
wayland
wayland-protocols
Expand Down Expand Up @@ -56,6 +61,7 @@
devShells.default = pkgs.mkShell {

inherit buildInputs nativeBuildInputs LD_LIBRARY_PATH;
USE_SYSTEM_LIBS = "ON";

packages = with pkgs; [
# helper
Expand Down Expand Up @@ -84,6 +90,7 @@
"-DGLFW_BUILD_WAYLAND=1"
"-DGLFW_BUILD_X11=1"
"-DCMAKE_POLICY_VERSION_MINIMUM=3.5"
"-DUSE_SYSTEM_LIBS=ON"
];

installPhase = ''
Expand Down
14 changes: 11 additions & 3 deletions justfile
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,23 @@ dev:

# Configure the project with CMake
configure:
cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Debug -DCMAKE_COLOR_DIAGNOSTICS=ON -DCMAKE_POLICY_VERSION_MINIMUM=3.5
cmake -S . -B build -G Ninja \
-DCMAKE_BUILD_TYPE=Debug \
-DCMAKE_COLOR_DIAGNOSTICS=ON \
-DCMAKE_POLICY_VERSION_MINIMUM=3.5

# Build the project using Ninja
build: configure
build:
#!/usr/bin/env bash
if [[ ! -f build/build.ninja || CMakeLists.txt -nt build/build.ninja ]]; then
echo "Configuring..."
just configure
fi
cmake --build build -- -j$(nproc)

# Runs the game using the dedicated Nvidia/AMD GPU with optional config
[default]
run config="": build
run config="":
#!/usr/bin/env bash
if command -v nvidia-smi > /dev/null 2>&1; then
export DRI_PRIME=1
Expand Down
Loading