mirror of
https://github.com/libretro/tyrquake.git
synced 2026-11-07 04:35:58 -10:00
master
The software renderer's 2D drawing above 320 wide did a byte-sized memset call for every source pixel, and scaled each source row up again for every screen row it covers: 34000 calls a frame at 640x480, about 6% of the frame. Draw_PicScaled now scales a row across once, with plain stores for the scales in use, and copies it down; the transparent and character variants use the same stores, and Draw_ConsoleBackground copies a row the background was scaled up into from the one above. The colored-lighting table (palmap2) is built by a search outward from each colour's red in a palette sorted by red, seeded with the neighbouring cell's colour, instead of against all 255 colours: the same table, lowest index among equals, in under half the startup time. Draw_BeginDisc no longer reads the disc pic before Draw_Init has loaded it. Every frame matches the previous build at 320x200, 640x480 and 1024x768, with colored lighting on and off, in the demos, menus, console and view sizes; at 640x480 a frame takes about 6% fewer instructions.
--------------------
TyrQuake (libretro)
--------------------
A libretro core for Quake and its mission packs, based on TyrQuake 0.62
by Kevin Shanahan (aka. Tyrann) -- http://disenchant.net
TyrQuake is a conservative branch of the original Quake source code:
it keeps the look and feel of the id Software originals while fixing
bugs and adding carefully-scoped enhancements. This libretro port turns
it into a core that runs inside RetroArch and other libretro frontends,
with renderer, video, audio and input features layered on top of the
faithful base engine.
Loading content
---------------
- Load a .pak file (e.g. id1/pak0.pak) from a Quake data directory.
The full directory layout around the pak is used, so custom content
in the same game directory is picked up as usual.
- Mission packs are detected automatically from the content path:
* "hipnotic" -> Scourge of Armagon (-hipnotic)
* "rogue" -> Dissolution of Eternity (-rogue)
* "quoth" -> Quoth (-quoth)
- Any other (non-id1) game directory is launched as a mod via -game,
so total conversions and standalone mods work by loading their pak
from inside their own directory.
- Shareware, registered and mod paks are all supported.
Renderer backends
-----------------
- Software renderer: the classic 8-bit palettized span rasterizer,
extended well beyond the original (see "Rendering features" below).
Output is RGB565.
- Vulkan hardware renderer (optional, RHI_HAVE_VULKAN=1 builds): uses
the libretro Vulkan HW context. Presentation runs as a GPU compute
dispatch (palette LUT expansion on the GPU) rather than a classic
graphics pipeline.
- Compute rendering option: on HW backends with compute support, the
3D view is rendered by a GPU port of Quake's software rasterizer
(spans, affine texturing, surface cache, alias edge stepping) --
pixel-identical to the software renderer but offloaded to the GPU,
which is much faster at high internal resolutions. When disabled,
the HW backend uses traditional hardware rasterization instead.
- "Auto" renderer selection picks the best hardware backend the
frontend offers and falls back to software when no HW context is
available.
Rendering features
------------------
All of these are available in the software renderer and exposed in the
in-game Options -> Video menu (as well as via console cvars):
- Internal resolutions from 320x200 up to 1920x1200 (45 presets),
with sensible per-platform defaults (e.g. 400x240 on 3DS).
- Dither filtering (ordered-dither texture sampling for a smoothed
look without leaving the palette pipeline).
- Colored lighting: Half-Life / Quake II-style RGB lighting in the
software renderer, including support for .lit sidecar files
(with header and size validation), plus a light-dither option.
- Phong shading on models, tri-state: Off / Phong / Phong + specular.
- Transparent liquids: independent alpha controls for water, lava,
slime and teleporters, plus an underwater liquid-blend overlay.
- Polygon subdivision: runtime tessellation of alias (model) meshes,
up to 3 passes, to smooth out low-poly silhouettes.
- Smooth animation and smooth movement: keyframe (r_lerpmodels) and
transform (r_lerpmove) interpolation for fluid entity motion at
high framerates.
- Entity shadows.
- Water warp with adjustable intensity (r_waterwarp_scale).
- Level-of-detail (mip) control.
- Aspect-ratio correction.
- UI scaling (scr_uiscale): integer scaling of the 320x200-native
HUD, menus and console at high resolutions.
- Gamma, brightness and contrast controls.
- Crosshair options.
- Persistent gibs option (Options -> Game).
- Chase camera / third-person view with camera-type selection and a
first-person toggle in the menu.
Timing
------
- Runs at fixed frametimes for consistent physics and demo playback.
- Framerate is selectable from 10 to 600 fps, or "Auto", which
queries the frontend's target refresh rate and matches it.
(Values above 72 fps can expose original-engine timing quirks.)
Audio
-----
- Sound mixed at a selectable output rate: 32 / 44.1 / 48 / 96 kHz,
or "Auto", which matches the frontend's reported target sample rate
to bypass the frontend resampler entirely (lower latency, no extra
filtering).
- Float PCM output is negotiated with frontends that support it, with
a transparent fallback to the standard 16-bit integer batch path.
- Music-stream decode is float-based with bit-identical int16 results
across platforms and FPUs.
Soundtrack / background music
-----------------------------
- CD-audio replacement: rips placed in a "music" directory inside the
game directory (music/track02.<ext>, etc.) play automatically as the
level soundtrack.
- WAV, FLAC and Ogg Vorbis are enabled by default; MP3, Opus, and
tracker formats (MikMod, ModPlug, UMX) are available as build-time
options.
- Mod-supplied tracks take priority over id1 tracks of the same
number, and file format is resolved per-track.
- "music" console command for playing tracks manually.
Input
-----
Four selectable input device types:
- Gamepad Classic: original-style layout with a run-mode toggle.
- Gamepad Classic Alt: alternative classic layout.
- Gamepad Modern: dual-analog FPS layout (move + look on sticks).
- Keyboard + Mouse: full keyboard support via the libretro keyboard
callback plus relative mouse look with five mouse buttons
(including wheel up/down). The console is reachable on ` / ~ / '.
Additional input features:
- Configurable analog stick deadzone (0-30%).
- Invert Y axis option.
- Rumble support: strong motor feedback scaled by damage taken, weak
motor pulses on item pickup.
- Fully rebindable controls through the in-game Customize Controls
menu.
Multiplayer
-----------
- NetQuake UDP networking on platforms built with HAVE_NETWORKING=1:
LAN games, server search and direct connect through the in-game
Multiplayer menu, with cooperative and deathmatch game options
(frag limits, time limits, skill, episode selection, including the
mission-pack episode lists).
- Local (loopback) games on all platforms.
Saves and memory
----------------
- Native Quake save/load system; savegames are written to the
frontend's save directory. (Libretro savestates are not currently
implemented.)
- The engine heap (hunk) is sized automatically from the memory the
frontend reports as available (a quarter of free RAM, capped at
256 MB and never below the tuned per-platform default), so large
modern maps and mods load on capable systems while low-memory
platforms keep a conservative footprint.
Platforms
---------
Builds for a wide range of libretro targets, including Windows
(MinGW and MSVC toolchains as old as 2003), Linux, macOS, iOS/tvOS,
Android, Emscripten (web), Nintendo Switch, Wii, Wii U, GameCube,
3DS, PlayStation Vita, PSP, PS3, Xbox / Xbox 360, Raspberry Pi and
various embedded handhelds (GCW-Zero, Miyoo, RetroFW/Dingux).
Building
--------
make
produces tyrquake_libretro for the host platform. Cross builds use
the usual libretro conventions, e.g.:
make platform=vita
make platform=libnx
Optional build flags:
RHI_HAVE_VULKAN=1 enable the Vulkan renderer backend
(requires vendored Vulkan headers, see
deps/vulkan/README.md)
HAVE_NETWORKING=0/1 toggle UDP multiplayer support
USE_CODEC_MP3=1 enable MP3 soundtrack support
USE_CODEC_OPUS=1 enable Opus soundtrack support
USE_CODEC_MIKMOD=1 enable MikMod tracker music
USE_CODEC_MODPLUG=1 enable ModPlug tracker music
USE_CODEC_UMX=1 enable UMX tracker music
Credits and license
-------------------
- Quake is Copyright (C) 1996-1997 Id Software, Inc.
- TyrQuake is developed by Kevin Shanahan (aka. Tyrann),
http://disenchant.net
- libretro port by the libretro team and contributors.
Distributed under the GNU General Public License, version 2 or later;
see LICENSE.txt. The original id Software readme is preserved as
readme-id.txt.
Languages
C
98.5%
Makefile
0.9%
GLSL
0.3%
Shell
0.1%