- C++ 48.8%
- Python 21.5%
- POV-Ray SDL 11%
- Objective-C++ 8.4%
- Go 2%
- Other 8.3%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
| .forgejo/workflows | ||
| deploy/ansible | ||
| docs | ||
| examples/live-timing | ||
| patches/Screens | ||
| server | ||
| src | ||
| tests | ||
| third_party/include | ||
| tools | ||
| .gitignore | ||
| AGENTS.md | ||
| CMakeLists.txt | ||
| GLOSSARY.md | ||
| LICENSE | ||
| README.md | ||
Blur Native
A native Apple Silicon port of Blur (Bizarre Creations / Activision, 2010) for macOS. It runs without Wine, Rosetta or an emulator. The game's x86 code is statically recompiled to arm64 C++ (ADR 0006). Its Direct3D 9 calls go to Metal (ADR 0003), and its Windows API calls go to a native host layer (ADR 0004).
You need your own copy of Blur. This repository contains no game data and no files derived from it. The app installs the game from your disc, ISO or existing Windows install the first time it runs. Amax Emu and OpenTTD handle game files the same way.
The exceptions are the powerup and mod icons in examples/live-timing/icons, fan-wiki images from blur.fandom.com
(ADR 0017), and the car display names in examples/live-timing/cars.js, also
from the wiki (ADR 0018); they remain the property of their rights holders.
Install
Requirements: an Apple Silicon Mac running macOS 13 or later, and Blur for PC (disc, ISO, or an installed copy).
- Download
Blur-Native-<version>-macos-arm64.dmgfrom the releases page and drag Blur Native to Applications. - The app is ad-hoc signed, not notarised. The first time, right-click it and choose Open. On macOS 15 and later, use System Settings → Privacy & Security → Open Anyway instead.
- On first launch, point the installer at
Blur.iso, the disc, or an installed Blur folder. It copies the game to~/Library/Application Support/Blur Native/gameand applies the 1.2 patch from the disc. Installing from a Windows folder still needs the disc or ISO for two runtime DLLs.
Saves go to ~/Library/Application Support/Blur Native/save.
Status
Works:
- Every game mode starts and plays: career races, checkpoint, destruction and boss events, photo mode, and 2- and 4-player split screen. Each was tested for 30-60 s, not played through (modes-status).
- LAN multiplayer.
- Online play through our own server (below): accounts, lobbies, matchmaking and races between players.
- Extra settings in the game's Options → Graphics menu: Show FPS, skip intro videos, frame-rate limit, anisotropic filtering, draw distance and bloom. The game's own Vsync and anti-aliasing (MSAA) settings work too.
- Runs above 100 fps in races at 2560×1600 with maximum settings and MSAA on an M-series Mac.
Not done yet (see also known limitations):
- Online stats, leaderboards, friends and mail return empty results. Online rank and XP aren't saved between sessions.
- Players behind strict NATs may not be able to connect to each other: there's no relay server.
- The new options rows are English only.
- Windows players on Amax Emu can't play with players on our server.
Online
The game connects to wss://blur.entropylan.party/socket by default. Create an account on the game's own Online screen. The
licence-key field is ignored, so any key works, including a blank one (ADR 0010).
To run your own server, see server/README.md: a Docker image, a compose example and an Ansible playbook.
The protocol is documented in docs/online-server-spec.md.
Environment variables
Set these when launching Blur Native.app/Contents/MacOS/blurhost from a terminal.
| Variable | Effect |
|---|---|
BLUR_ONLINE_URL |
online server (wss://host/socket), or off to disable online |
BLUR_ONLINE_KEY |
key for that server |
BLUR_OFFLINE=1 |
no network at all |
BLUR_SHOW_FPS, BLUR_VSYNC, BLUR_FPS_LIMIT, BLUR_ANISO |
override the graphics options |
BLUR_SKIP_INTRO |
1 skips the boot logo and pre-level videos, 0 plays them; overrides Options > Graphics > Skip Intro Videos |
BLUR_NO_AUDIO=1 |
no sound |
BLUR_INSTALL_SRC |
install source (ISO or folder), skipping the file picker |
BLUR_STATE_WS=<port> |
serve the game-state feed as JSON over a localhost-only websocket (format); off if unset |
BLUR_DISCORD_CLIENT_ID |
Discord application id used for Rich Presence (Options > Graphics > Discord Rich Presence turns it off) |
BLUR_PATCH_DIR |
directory of Lua script patches (ADR 0008) |
Command-line flags: --version, --game-dir, --save-dir, --patch-dir. Debug and test flags exist only in dev builds: see docs/dev-flags.md.
Build from source
Needs Xcode Command Line Tools, CMake, Ninja, Python 3, Go (for the server tests), Ghidra 12.1.4 and JDK 21. The recompiled code is generated from your own game files, so there's no build without them.
tools/recomp/build/from_game.sh modules /path/to/Blur.iso work/mods # extract + checksum the 5 game modules
tools/recomp/build/from_game.sh pcode work/mods work/pcode # Ghidra analysis, ~8 min
tools/recomp/build/from_game.sh gen work/pcode # -> work/recomp/m3/gen
python3 tools/app/make_icon.py work/mods/Blur.exe work/app/Blur.icns # optional app icon
cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release [-DBLUR_ONLINE_KEY=<key>]
ninja -C build app # -> build/Blur Native.app
ctest --test-dir build
Set GHIDRA and JAVA_HOME if Ghidra or the JDK aren't in their default locations (see tools/recomp/ghidra/discover.sh).
This is a dev build (BLUR_DEV=ON, the default): debug flags, tests and tools included. Release builds pass
-DBLUR_DEV=OFF (ADR 0015).
Without BLUR_ONLINE_KEY, online only works when the key is set at run time. tools/ci/build_mac.sh builds the release
.dmg; CI and releases are covered in docs/ci.md.
Layout
| Path | Contents |
|---|---|
src/cpu |
guest address space, PE loader, threads, SEH plumbing, recomp engine |
src/host |
Win32 host layer: kernel32, user32, COM, audio, input, Winsock, Cocoa window, installer |
src/d3d9metal |
Direct3D 9 on Metal, shader translator |
src/common |
build-mode helpers shared by the above (dev_env.h) |
tools/recomp |
Ghidra discovery scripts and the x86 → C++ emitter |
tools |
dev tooling: game drivers (modes), trace, replay, track cards, CI scripts; not in release builds |
tests |
unit and guest tests (tests/tests.cmake, dev builds only) |
patches |
Lua patches for the game's menus (shipped in the app) |
server |
blur-online, the online service (Go) |
deploy/ansible |
server deployment |
docs/decisions |
architecture decision records |
Contributing
Gitflow with semver (ADR 0011): work on develop, feature/<name> branches merge
back with --no-ff, and releases are vX.Y.Z tags on main. Read docs/decisions before changing
architecture, tooling or workflow. Never commit game files or anything generated from them (ISO, binaries, P-code, generated
code, the icon).
Credits
- Blur is © Activision. Bizarre Creations developed it. Blur and Activision are trademarks of Activision Publishing, Inc. This project isn't affiliated with or endorsed by Activision.
- The Amax Emu community, for keeping Blur online and for their reverse-engineering notes.
third_party/include/d3d9*.hcome from the Wine project (LGPL 2.1).- Ghidra (NSA) does the code discovery at build time.
Licence
MIT, see LICENSE. Files under third_party/ keep their own licences (the Wine headers are LGPL 2.1).
Disclaimer
The MIT licence covers only the source code in this repository. Blur, its code, data, artwork, audio and other assets belong to Activision Publishing, Inc. and aren't covered by it. Blur and Activision are trademarks of Activision Publishing, Inc. This project isn't affiliated with or endorsed by Activision or Bizarre Creations. You need your own legitimate copy of Blur. Release builds contain code generated from the original game files; that generated code isn't covered by the MIT licence.
MIT License
Copyright (c) 2026 Jessica Smith
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.