![Build Status](https://github.com/rive-app/rive-runtime/actions/workflows/tests.yml/badge.svg) ![Discord badge](https://img.shields.io/discord/532365473602600965) ![Twitter handle](https://img.shields.io/twitter/follow/rive_app.svg?style=social&label=Follow) # rive-runtime ![Rive hero image](https://cdn.rive.app/rive_logo_dark_bg.png) Rive's C++ runtime — the lowest-level Rive runtime. Loads `.riv` files, advances state machines and animations, and draws via the abstract `Renderer` interface. The built-in GPU renderer (`RiveRenderer`) has `RenderContextImpl` backends for Metal, Vulkan, D3D11, D3D12, and OpenGL/WebGL. Rive's Apple, Android, Flutter, Unity, Unreal, and web runtimes all wrap this library. Features: - Loading artboards and their contents from `.riv` files. - Querying state machines from artboards. - Mutating the artboard hierarchy (the same mechanism used by state machines) and efficiently solving those changes via `Artboard::advance`. - A state-of-the-art vector renderer for Metal, Vulkan, D3D12, D3D11, and OpenGL/WebGL. - An abstract `Renderer` interface for hooking up an external vector renderer. ## Prerequisites - A C++17 toolchain: - **macOS**: clang from Xcode Command Line Tools (`xcode-select --install`). - **Linux**: clang from your distro (e.g. `apt install clang`). - **Windows**: Visual Studio 2022 with the **C++ Clang Compiler for Windows** and **MSBuild support for LLVM (clang-cl) toolset** individual components. - **git** — the build script clones a pinned `premake5` on first run. On Windows, install **Git for Windows** and during setup pick *"Use Git and optional Unix tools from the Command Prompt"* so that `sh.exe` ends up on PATH. - Platform SDK for the renderer you're targeting: - macOS / iOS: Xcode. - Windows: Windows SDK (for D3D). - Linux: a Vulkan or OpenGL development environment. - Vulkan: the Vulkan SDK. ## Build The build is driven by [premake5](https://premake.github.io/) wrapped by a helper script: - `build/build_rive.sh` — macOS / Linux (bash) / Windows (MinGW). - `build/build_rive.ps1` — a PowerShell convenience wrapper for Windows; it shells out to the bash script, so a bash environment (Git for Windows / MinGW, see Prerequisites) must still be on PATH. The helper self-installs the pinned premake version on first run and dispatches to the right build system for your platform (gmake2 on macOS/Linux, MSBuild on Windows). It must be run from a directory that contains a `premake5.lua` — typically `tests/`, which builds the core library, the GPU renderer, and the `player` sample app. ### macOS / Linux ```bash git clone https://github.com/rive-app/rive-runtime.git cd rive-runtime/tests ../build/build_rive.sh release ``` ### Windows ```powershell git clone https://github.com/rive-app/rive-runtime.git cd rive-runtime\tests ..\build\build_rive.ps1 release ``` ### Common variants *(On Windows, substitute `build_rive.ps1` for `build_rive.sh`.)* - `build_rive.sh` *(no args)* — debug build for the host. - `build_rive.sh release clean` — clean then build release. - `build_rive.sh ninja release` — use Ninja instead of make/MSBuild. - `build_rive.sh ios release` — cross-compile for iOS. - `build_rive.sh android release` — cross-compile for Android (defaults to arm64). - `build_rive.sh ninja release wasm` — cross-compile for WebAssembly. - `build_rive.sh --toolset=msc release` *(Windows)* — build with MSVC's cl.exe instead of clang-cl. The build supports both toolchains; the lua warning suppressions cover MSVC too. See the comment header at the top of [`build/build_rive.sh`](https://github.com/rive-app/rive-runtime/blob/main/build/build_rive.sh) for the complete flag reference. ### Build outputs Artifacts land in `out//` relative to the directory you built from (typically `tests/`). The config directory encodes any OS/arch flags you passed: - `out/release`, `out/debug` — host build. - `out/ios_release`, `out/android_arm64_release`, `out/wasm_release` — cross-compile builds. | Artifact | Description | | --- | --- | | `librive.a` / `rive.lib` | Core runtime library. | | `librive_pls_renderer.a` / `rive_pls_renderer.lib` | GPU renderer. | | `player` / `player.exe` | Sample app — loads and renders a `.riv` file. | | `out//goldens`, `out//gms`, `out//bench` | Test harness binaries (regression, golden-image, benchmarking). | | `librive_decoders.a`, `librive_harfbuzz.a`, … | Supporting libraries. | ## Testing The runtime's primary form of testing is **golden testing** — rendering known scenes and diffing the output against checked-in reference images via the `goldens` and `gms` test harness binaries (built into `out//goldens` and `out//gms`). See [`tests/`](https://github.com/rive-app/rive-runtime/tree/main/tests) for how to run and rebaseline goldens. Unit tests are secondary and use the [Catch2](https://github.com/catchorg/Catch2) framework. From the repo root: ```bash cd tests/unit_tests ./test.sh ``` Unit tests live in `tests/unit_tests/runtime/` (core runtime) and `tests/unit_tests/renderer/` (renderer). To add a test, create an `xxx_test.cpp` file in the appropriate directory — the harness picks it up automatically. ## Code formatting rive-runtime uses clang-format. - **macOS**: `brew install clang-format`. - **Windows**: already installed if you have the prerequisites — VS 2022's C++ Clang Compiler component ships `clang-format.exe` alongside `clang-cl.exe` at `C:\Program Files\Microsoft Visual Studio\2022\\VC\Tools\Llvm\x64\bin\`. You can also install LLVM standalone from [llvm.org](https://releases.llvm.org/) or via `winget install LLVM.LLVM`. - **Linux**: install via your distro's package manager (e.g. `apt install clang-format`). ## Memory checks (macOS only) To run the tests under macOS's built-in `leaks` tool: ```bash cd tests/unit_tests ./test.sh memory ``` This wraps the test binary with `leaks --atExit`, which ships with macOS — no install required. The `memory` flag is ignored on Linux and Windows. ## Disassembly explorer (macOS / Linux) To inspect generated assembly per cpp file, install the [Disassembly Explorer](https://marketplace.visualstudio.com/items?itemName=dseight.disasexpl) VSCode extension. A `disassemble` task is provided in `.vscode/tasks.json`. The underlying `gen assembly` task invokes `clang++` directly, so it needs `clang++` on PATH — works out of the box on macOS (Xcode CLI tools) and most Linux distros, but not on a default Windows + VS install (which provides `clang-cl.exe`, not `clang++.exe`). Reach the task from **Tasks: Run Task**, or bind a key in `keybindings.json`: ```json [ { "key": "cmd+d", "command": "workbench.action.tasks.runTask", "args": "disassemble" } ] ```