Quake III old-Mac port app icon

A port of ioquake3 for the same six old Macs as my Quake and Quake II builds. One fat binary holds a G3, a G4 and an Intel slice, and macOS picks the right one when it launches. The headline is Quake III rendering on a 449 MHz iMac G3 with a 16 MB Rage 128 — the machine that sat right on the minimum spec when Q3 shipped in 1999.

This one is early, warts and all. So far it's about getting a clean fat binary that builds, launches and renders across the fleet, plus a first benchmark baseline. There's no per-machine optimisation or visual tuning yet, so on the G3 it looks plain next to the Quake and Quake II ports, which have had rounds of work. Four of the six machines are benched so far.

# Framerate (v0 baseline)

The four timedemo, fullscreen, default settings with no per-machine tuning, median of runs 2 and 3.

Machine CPU GPU macOS 640×480 1024×768
yosemite G3 449 MHz Rage 128, 16 MB 10.3.9 Panther 45 27
quicksilver G4 733 MHz Radeon 9000, 64 MB 10.4.11 Tiger 61 60
imac-g5 G5 2.0 GHz Radeon 9600, 128 MB 10.5.8 Leopard 133
mini-intel Core 2 Duo 2.33 GHz GMA 950 10.7.5 Lion 238 105

The G3 clears the 20 fps floor and the G4 clears 60 at stock settings. In actual gameplay with a bit of tuning the G3 holds around 35 fps and the G4 around 96. The G4's flat 60 in the table is its screen's refresh rate, not a ceiling, and the G5 runs about 87 fps at its native 1440×900. The G4 sawtooth, the Mac mini G4 and the 2019 iMac aren't benched yet.

# Get the build

The first release is v0.1.0.

Bundle Size Runs on
ioquake3-OldMac-v0.1.0.dmg 3.2 MB Panther 10.3.9 → modern macOS (PowerPC and Intel)

One bundle runs across the fleet: macOS picks the right slice for the chip when it launches. It doesn't include the game data, so you bring the baseq3 pak files from your own copy of Quake III Arena.

# Screenshots from the fleet

Quake III on yosemite, a 1999 PowerMac G3 with a 16 MB ATI Rage 128 — a red pentagram floor with an enemy across the room, running at 35 fps
yosemite — 1999 PowerMac G3 / Rage 128, the minimum-spec machine
Quake III on quicksilver, a 2001 PowerMac G4 with a Radeon 9000 — a plasma explosion mid-frag
quicksilver — 2001 PowerMac G4 / Radeon 9000
Quake III on an iMac G5 with a Radeon 9600 — a lava-floored arena with hanging cages, at 97 fps
imac-g5 — iMac G5 / Radeon 9600
Quake III on an iMac G5 — a blood-splattered corridor with a rocket launcher pickup and a dropped weapon
imac-g5 — rocket launcher in a corridor
Quake III on mini-intel, a 2007 Mac mini with a GMA 950 on Lion — a teleporter arena at 86 fps
mini-intel — 2007 Mac mini / GMA 950 / Lion
Quake III on mini-intel — a fast strafe past two teleporters with motion blur, at 142 fps
mini-intel — strafing past the teleporters

# Why a special port

Modern ioquake3 is CMake and SDL2, and SDL2 has never supported Mac OS X 10.3 or 10.4. The PowerPC machines here run Panther 10.3.9 and Tiger 10.4.11, so a current ioquake3 binary won't launch on a single one of them. This port is pinned to the last SDL 1.2 release of ioquake3, the same SDL 1.2 that still talks to a Rage 128 under Panther. Two bundled libraries (libSDLmain.a and the SDL 1.2 dylib) were 10.4+ builds that crashed instantly on 10.3.9 in the Cocoa startup; both are rebuilt from source so the G3 slice launches. The full story is in the repo's MISTAKES.md.

# Apple Watch companion

Quake III drives the same Apple Watch tactical computer as the Quake 1 and Quake II ports. A cvar-gated patch, cl_watchlink.c, streams the player's live health, armour, ammo, weapon and score to an iPhone and Apple Watch over Bonjour. It's off by default; turn it on with seta watch_host "auto".

# Tech stack

C OpenGL 1.x PowerPC AltiVec x86_64 SDL 1.2 Apple gcc 4.0.1 Apple clang Bash ssh + rsync