Skip to content

Dependencies

Snowpulse relies on third-party libraries bundled under snowpulse/external, native platform frameworks, and pinned Android Maven/Prefab artifacts. Desktop vcpkg setup does not replace Snowpulse's vendored GLFW, curl, Assimp, Box2D, Effekseer, Spine, zlib, zstd, or default OpenAL Soft builds; it remains useful for toolchain/bootstrap compatibility and the checked-in manifests.

What Game Developers Configure

A generated game already points CMake at Snowpulse and its bundled native dependencies. You normally do not install or wire these libraries one by one. Start with the settings block near the top of your game's CMakeLists.txt, where you can enable optional engine features and choose the target's web mode:

set(GAME_ENABLE_ASSIMP OFF)
set(GAME_SPINE_VERSION "4.2")
set(GAME_WEB_MODE "GAME")
set(GAME_WEB_PLATFORM "SNOWBLINK_PLAIN")

Use the inventory below when a platform build needs troubleshooting or when you deliberately want to change an engine-wide option. The complete public option table is under Top-Level and Engine Options.

Runtime Libraries

  • GLFW 3.4 (windowing/input on desktop and web; not used on iOS or Android)
  • OpenGL (desktop renderer)
  • OpenGL ES 3.0 (iOS renderer; uses Apple's <OpenGLES/ES3/gl.h> directly)
  • UIKit + CAEAGLLayer + CADisplayLink (iOS windowing/lifecycle)
  • AndroidX GameActivity 4.4.2 + EGL + Frame Pacing 2.1.3 (Android host/presentation)
  • OpenAL / OpenAL Soft (audio on desktop, iOS, and Android; vendored on mobile)
  • Oboe 1.10.0 Prefab backend (Android OpenAL output)
  • libcurl (Schannel/SSPI on Windows, OpenSSL with Apple SecTrust on macOS; the current iOS build remains HTTP-only)
  • OkHttp 5.4.0 (Android HTTPS through the system trust store)
  • CoreMIDI (MIDI on macOS desktop)
  • AVFoundation/CoreMedia/CoreVideo/AudioToolbox (macOS MP4 recording/playback and iOS playback)
  • Media3 1.10.1 ExoPlayer (Android MP4 playback)
  • ScreenCaptureKit (weak-linked process-audio capture for the macOS 13+ recorder)
  • Emscripten (web build toolchain and browser APIs)
  • Box2D 3.1.1 (optional 2D physics, vendored under snowpulse/external/box2d-3.1.1)
  • GameAnalytics 5.3.1 desktop C++, 5.0.2 iOS, 7.0.2 Android, and 5.0.0 web
  • ByteBrew 1.0.1 web; redistribution-approved Android/iOS packages when supplied

OpenAL Toggle

Snowpulse can prefer vendored OpenAL Soft on desktop builds:

  • CMake option: SNOWPULSE_ENABLE_VENDORED_OPENAL (default ON)
  • Vendored location: snowpulse/external/openal-soft
  • Fallback behavior: if vendored OpenAL is missing, CMake warns and falls back to system find_package(OpenAL)

Box2D Toggle

Snowpulse can optionally link against the vendored Box2D target.

  • CMake option: SNOWPULSE_ENABLE_BOX2D (default ON)
  • Engine compile definition: SNOWPULSE_HAS_BOX2D (1 when linked, 0 when unavailable/disabled)

This step only wires dependency/build integration. Gameplay-level physics APIs and components are documented in Physics.

Utility Libraries

  • ImGui 1.92.5 (debug UI)
  • Inter 4.1 static 18pt Regular (pinned under snowpulse/external/inter-4.1 and embedded as ImGui's default UI font; SIL Open Font License 1.1 in OFL.txt, staged with desktop, full-web, iOS, and Android distributions)
  • GLM (math)
  • GLAD (OpenGL loader on desktop and web; not used by iOS or Android GLES)
  • stb (image/audio helpers)
  • dr_mp3 (MP3 decoding)
  • nlohmann/json (JSON parsing)
  • msdf-atlas-gen (font atlas generation pipeline)
  • Spine runtimes (C/C++ skeletal animation)
  • Assimp (optional FBX/model loading)
  • Effekseer 1.80.3 (optional effect playback in the full profile)
  • zstd 1.5.7 (vendored decompressor-only static library for Tiled layer data; exposed internally as ZSTD::zstd with SNOWPULSE_TILED_HAS_ZSTD=1)

Snowpulse does not currently vendor a cross-platform MP4/H.264 encoder such as FFmpeg, libavcodec, x264, or OpenH264. Desktop MP4 recording is implemented for macOS through AVFoundation; Windows needs a future Media Foundation or vendored encoder backend.

Top-Level and Engine Options

All user-facing SNOWPULSE_* cache settings and pinned dependency versions are declared in snowpulse/cmake/SnowpulseOptions.cmake. The top-level engine CMakeLists.txt is an orchestrator; dependency, platform, target-variant, web, and iOS behavior live in neighboring focused modules.

CMake setting Default Effect
SNOWPULSE_BUILD_TESTS ON Builds and registers host-side Snowpulse tests on desktop
SNOWPULSE_BUILD_SNOWGEARS ON Adds the Snowgears gameplay layer
SNOWPULSE_ENABLE_BOX2D ON Enables vendored Box2D and publishes SNOWPULSE_HAS_BOX2D when available
SNOWPULSE_DEFAULT_ENABLE_ASSIMP OFF Default Assimp/FBX selection when a target omits ASSIMP; per-target settings override it
SNOWPULSE_ENABLE_VENDORED_OPENAL ON Prefers vendored OpenAL Soft on desktop; falls back to system OpenAL when absent
SNOWPULSE_ENABLE_VENDORED_ZLIB ON Uses the zlib source bundled with Assimp; missing sources are a configure error
SNOWPULSE_ENABLE_MP4_VIDEO ON Builds MP4 playback when the selected build profile also has video; publishes SNOWPULSE_ENABLE_MP4_VIDEO as 0 or 1
SNOWPULSE_PRODUCTION_DEPENDENCIES OFF Rejects host/fallback dependencies and enables the strict desktop package contract
SNOWPULSE_MSVC_STATIC_RUNTIME ON Uses /MT (or /MTd) so Windows games do not require the Visual C++ Redistributable
SNOWPULSE_DESKTOP_RELEASE_SYMBOLS ON Retains Release debug information for PDB/.dSYM archives
SNOWPULSE_ALLOW_SYSTEM_OPENSSL ON Allows a warned host OpenSSL fallback for non-production macOS development only
SNOWPULSE_OPENSSL_ROOT empty Explicit static OpenSSL prefix; production macOS packaging requires pinned 3.5.8 universal archives
SNOWPULSE_DEFAULT_SPINE_RUNTIME_VERSION 4.2 Default Spine version when a target omits SPINE_VERSION; per-target settings override it

Effekseer does not have a separate user option. It is enabled when the vendored runtime is present and the build profile has Effekseer; consumers should guard its public API with SNOWPULSE_HAS_EFFEKSEER.

Android Dependency Policy

Android compiles vendored OpenAL Soft, Assimp, Box2D, Spine, Effekseer, stb, GLM, JSON, zlib, zstd, and audio decoders as static PIC libraries and links them into the game's shared object. It does not use vcpkg or libcurl. GameActivity, Frame Pacing, Oboe, Media3, OkHttp, and GameAnalytics come from pinned Maven/Prefab artifacts. Those official native artifacts use c++_shared, so the package contains exactly one matching libc++_shared.so; GameActivity and Swappy use static Prefab variants, while Oboe 1.10.0 is published as liboboe.so. The generated Gradle project allows Google Maven, Maven Central, and GameAnalytics's pinned release repository, rejects dynamic versions, and commits verification checksums. See Android.

Web Profile and Packaging Options

CMake setting Default Effect
SNOWPULSE_WEB_BUILD_PROFILE FULL Selects FULL or the Emscripten-only PLAYABLE_AD feature profile
SNOWPULSE_WEB_THREADS OFF Adds the shared pthread compile/link requirements to engine and consumer targets
SNOWPULSE_WEB_UTF8_BINARY_ENCODING OFF Experimental UTF-8 Wasm embedding for single-file playables; base64 remains the production default
SNOWPULSE_WEB_LAZY_ASSET_LOADING OFF Enables boot/deferred asset packs when assets/asset-packs.json exists
SNOWPULSE_PLAYABLE_SIZE_BUDGET_BYTES 2000000 Non-blocking raw HTML size target reported by the playable packaging helper

The profile publishes numeric SNOWPULSE_HAS_HTTP, SNOWPULSE_HAS_MIDI, SNOWPULSE_HAS_VIDEO, SNOWPULSE_HAS_SAVES, SNOWPULSE_HAS_IMGUI, SNOWPULSE_HAS_EFFEKSEER, SNOWPULSE_HAS_NON_GOOGLE_WEB_PORTALS, and SNOWPULSE_HAS_ANALYTICS_SDKS, and SNOWPULSE_WEB_DIRECT_GL definitions. FULL sets all feature definitions to 1 and direct GL to 0; PLAYABLE_AD does the reverse. Google Ads/MRAID is retained by the playable profile.

Packaging and hosting are selected per target and are not inferred from the engine feature profile:

  • WEB_MODE GAME produces normal multi-file HTML and external deferred packs.
  • WEB_MODE PLAYABLE_AD produces standalone single-file HTML, embeds normal assets, injects deferred packs, and reports raw size.
  • WEB_PLATFORM selects the matched shell and runtime portal adapter from the registry. snowpulse_configure_web_target() is the advanced entry point for non-game/custom target setup.

See Platforms for the full profile and portal compatibility matrices.

Assimp and Spine Target Settings

Each game selects Assimp and a vendored Spine runtime in its declarative snowpulse_add_game() call. Snowpulse declares the available Assimp × Spine target matrix inside the engine directory, then links the selected variant. Non-game targets use:

snowpulse_target_link_engine(tool_target
    ASSIMP OFF
    SPINE_VERSION "4.2"
)

SPINE_VERSION accepts each runtime directory available under snowpulse/external/spine (currently 4.2 and 4.3). Assimp is unavailable on platforms where its dependency target cannot be built. All engine-header consumers inherit C++17, feature definitions, and include paths through snowpulse::build_config; do not copy versioned dependency paths into consumer targets.

Example desktop configure:

cmake -S . -B cmake-build-release \
  -DCMAKE_BUILD_TYPE=Release \
  -DSNOWPULSE_ENABLE_BOX2D=ON

See Desktop Production Builds for deterministic curl TLS, Windows static-runtime ZIPs, macOS universal bundles, signing, notarization, and dependency verification.

Example web configure:

emcmake cmake -S . -B cmake-build-release-emscripten \
  -DCMAKE_BUILD_TYPE=Release \
  -DSNOWPULSE_ENABLE_BOX2D=ON

Example mixed-version targets in a project CMake file:

snowpulse_add_game(sample_current
    SOURCES ${SAMPLE_CURRENT_SOURCES}
    DISPLAY_NAME "Current Sample"
    BUNDLE_ID "com.example.samplecurrent"
    ASSETS_DIR "${CMAKE_CURRENT_SOURCE_DIR}/assets"
    ASSIMP OFF
    SPINE_VERSION "4.3"
    WEB_MODE GAME
    WEB_PLATFORM SNOWBLINK_PLAIN
)

snowpulse_add_game(sample_legacy
    SOURCES ${SAMPLE_LEGACY_SOURCES}
    DISPLAY_NAME "Legacy Sample"
    BUNDLE_ID "com.example.samplelegacy"
    ASSETS_DIR "${CMAKE_CURRENT_SOURCE_DIR}/assets"
    ASSIMP OFF
    SPINE_VERSION "4.2"
    WEB_MODE GAME
    WEB_PLATFORM SNOWBLINK_PLAIN
)

Sample Usage

// Add an ImGui panel
if (auto* imgui = context()->imgui()) {
    imgui->addPanel("Stats", []() {
        // ImGui::Text("Hello");
    });
}