This is a modern Quake III Arena engine aimed to be fast, secure and compatible with all existing Q3A mods. It is based on last non-SDL source dump of ioquake3 with latest upstream fixes applied.
This project is a continuation of innactive urbanterror-slim, kept fully up-to-date with all relevent changes from Quake3e.
Go to rorgoroth/mingw-cmake-env/releases to download latest Windows binaries.
This repository does not contain any game content so in order to play you must copy the resulting binaries into your existing Urban Terror installation.
- Quake3e Urban Terror
- Optimized OpenGL renderer
- Optimized Vulkan renderer
- Raw mouse input support, enabled automatically instead of DirectInput (
\in_mouse 1
) if available - Unlagged mouse events processing, can be reverted by setting
in_lagged 1
\in_minimize
- hotkey for minimize/restore main window (win32-only, direct replacement for Q3Minimizer)\video-pipe
- to use external ffmpeg binary as an encoder for better quality and smaller output files- Significally reworked QVM (Quake Virtual Machine)
- Improved server-side DoS protection, much reduced memory usage
- Raised filesystem limits (up to 20,000 maps can be handled in a single directory)
- Reworked Zone memory allocator, no more out-of-memory errors
- Non-intrusive support for SDL2 backend (video, audio, input), selectable at compile time
- Tons of bug fixes and other improvements
Based on Quake-III-Arena-Kenny-Edition with many additions:
- High-quality per-pixel dynamic lighting
- Very fast flares (
\r_flares 1
) - Anisotropic filtering (
\r_ext_texture_filter_anisotropic
) - Greatly reduced API overhead (call/dispatch ratio)
- Flexible vertex buffer memory management to allow loading huge maps
- Multiple command buffers to reduce processing bottlenecks
- Reversed depth buffer to eliminate z-fighting on big maps
- Merged lightmaps (atlases)
- Multitexturing optimizations
- Static world surfaces cached in VBO (
\r_vbo 1
) - Useful debug markers for tools like RenderDoc
- Fixed framebuffer corruption on some Intel iGPUs
- Offscreen rendering, enabled with
\r_fbo 1
, all following requires it enabled: screenMap
texture rendering - to create realistic environment reflections- Multisample anti-aliasing (
\r_ext_multisample
) - Supersample anti-aliasing (
\r_ext_supersample
) - Per-window gamma-correction which is important for screen-capture tools like OBS
- You can minimize game window any time during
\video
or\video-pipe
recording - High dynamic range render targets (
\r_hdr 1
) to avoid color banding - Bloom post-processing effect
- Arbitrary resolution rendering
- Greyscale mode
In general, not counting offscreen rendering features you might expect from 10% to 200%+ FPS increase comparing to KE's original version. Highly recommended to use on modern systems
Based on classic OpenGL renderers from idq3/ioquake3/cnq3/openarena, features:
- OpenGL 1.1 compatible, uses features from newer versions whenever available
- High-quality per-pixel dynamic lighting, can be triggered by
\r_dlightMode
cvar - Merged lightmaps (atlases)
- Static world surfaces cached in VBO (
\r_vbo 1
) - All set of offscreen rendering features mentioned in Vulkan renderer, plus:
- Bloom reflection post-processing effect
Performance is usually greater or equal to other opengl1 renderers
Original ioquake3 renderer, performance is very poor on non-nvidia systems, unmaintained
- A lot of security, performance and bug fixes
- Much improved autocompletion (map, demo, exec and other commands), in-game
\callvote
argument autocompletion \com_affinityMask
- bind Quake3e process to bitmask-specified CPU core(s)- Raized filesystem limits, much faster startup with 1000+ pk3 files in use, level restart times were also reduced as well
\fs_locked 0|1
- Keep opened pk3 files locked or not, removes pk3 file limit when unlocked
-
Raw mouse input support, enabled automatically instead of DirectInput (
\in_mouse 1
) on Windows XP and newer windows operating systems -
Unlagged mouse processing, can be reverted by setting
in_lagged 1
-
MOUSE4 and MOUSE5 works in
\in_mouse -1
mode -
\minimize
in-game command to minimize main window, can be used with binds/scripting -
\in_minimize
- hotkey for minimize/restore main window (direct replacement for Q3Minimizer) -
\in_forceCharset 0|1|2
0
- Disabled1
- Try to translate non-ASCII chars in keyboard input2
- Force EN/US keyboard layout
-
\in_nograb 0|1
Do not capture mouse in game, may be useful during online streaming. -
\s_muteWhenUnfocused 0|1
-
\s_muteWhenMinimized 0|1
-
\s_device
- Linux-only, specified sound device to use with ALSA, enter aplay -L in your shell to see all available options -
\screenshotBMP
and\screenshotBMP clipboard
commands -
Hardcoded PrintScreen key - For "\screenshotBMP clipboard"
-
Hardcoded Shift+PrintScreen - For "\screenshotBMP"
-
\com_maxfpsUnfocused
- Will save cpu when inactive,set to your desktop refresh rate, for example -
\com_skipIdLogo 0|1
- Skip playing idlogo movie at startup -
\com_yieldCPU <milliseconds>
- Try to sleep specified amout of time between rendered frames when game is active, this will greatly reduce CPU load, use0
only if you're experiencing some lags (also it is usually reduces performance on integrated graphics because CPU steals GPU's power budget) -
\r_defaultImage <filename>|#rgb|#rrggbb
- Replace default (missing) image texture by either exact file or solid #rgb|#rrggbb background color -
\r_vbo 0|1
- Use Vertex Buffer Objects to cache static map geometry, may improve FPS on modern GPUs, increases hunk memory usage by 15-30MB (map-dependent) -
\r_fbo 0|1
- Use framebuffer objects, enables gamma correction in windowed mode and allows arbitrary size (i.e. greater than logical desktop resolution) screenshot/video capture, required for bloom, hdr rendering, anti-aliasing, greyscale effects, OpenGL 3.0+ required -
\r_hdr \-1|0|1
- Select texture format for framebuffer:-1
- 4-bit, for testing purposes, heavy color banding, might not work on all systems0
- 8 bit, default, moderate color banding with multi-stage shaders1
- 16 bit, enhanced blending precision, no color banding, might decrease performance on AMD/Intel GPUs
-
\r_bloom 0|1|2
- High-quality light bloom postprocessing effect (\r_bloom) -
\r_dlightMode 0|1|2
- Dynamic light mode0
- VQ3 'fake' dynamic lights1
- New high-quality per-pixel dynamic lights, slightly faster than VQ3's on modern hardware2
- Same as 1 but applies to all MD3 models too
-
\r_modeFullscreen
- Dedicated mode string for fullscreen mode, set to-2
to use desktop resolution, set empty to use\r_mode
in all cases. -
\r_nomip 0|1
- Apply picmip only on worldspawn textures -
\r_neatsky 0|1
- nopicmip for skyboxes -
\r_greyscale [0..1.0]
- Desaturates rendered frame, requires\r_fbo 1
, can be changed on the fly. -
\r_mapGreyScale [-1.0..1.0]
- Desaturate world map textures only, works independently from\r_greyscale
, Negative values desaturates lightmaps only. -
\r_ext_multisample 0|2|4|6|8
- Multi-sample anti-aliasing, requires\r_fbo 1
, can be changed on the fly. -
\r_ext_supersample 0|1
- Super-sample anti-aliasing, requires\r_fbo 1
-
\r_noborder 0|1
- To draw game window without border, hold ALT to drag & drop it with opened console. -
\r_noportals 0|1|2
- Disable in-game portals (1), and mirrors too (2) -
Negative
\r_overBrightBits
- Force hardware gamma in windowed mode, not actual with\r_fbo 1
. -
\video-pipe
- Redirect captured video to ffmpeg input pipe and save encoded file as -
\r_renderWidth | \r_renderHeight
- arbitrary resolution rendering, requires\r_fbo 1
-
\cl_conColor [RRR GGG BBB AAA]
- Custom console color, non-archived, use\seta
command to set archive flag and store in config -
\cl_autoNudge 0|1
- Automatic time nudge that uses your average ping as the time nudge, values:0
- Use fixed\cl_timeNudge
1
- Factor of median average ping to use as timenudge
-
\cl_mapAutoDownload 0|1
- automatic map download for play and demo playback (via automatic\dlmap
call) -
Less spam in console (try to set
\developer 1
to see what important things you missing) -
Faster shader loading, tolerant to non-fatal errors
-
Fast client downloads (http/ftp redirection)
-
\download | \dlmap
- Fast client-initiated downloads from specified map server -
You can use
\record
during\demo playback
-
Linear dynamic lights
\sv_levelTimeReset 0|1
- Reset or do not reset leveltime after new map loads, when enabled - fixes gfx for clients affected by "frameloss" bug, however it may be necessary disable in case of troubles with GTV\sv_maxclientsPerIP
- Limit number of simultaneous connections from the same IP address- Much improved DDoS protection
\sv_minPing | \sv_maxPing
were removed because of new much better client connection code- Userinfo filtering system, see docs/filter.txt
rcon
Now is always available on dedicated serversrconPassword2
- Hidden master rcon password that can be set only from command line, eg:+set rconPassword2 "123456"
can be used to change/revoke compromisedrconPassword
- Significally reduced memory usage for client slots.
cvar that specifies hotkey for fast minimize/restore main windows, set values in form:
\in_minimize "ctrl+z"
\in_minimize "lshift+ralt+p"
or so then do \in_restart
to apply changes.
Usually downloads in Q3 is slow because all downloaded data is requested/received from game server directly. So called `download redirection' allows very fast downloads because game server just tells you from where you should download all required mods/maps etc. - it can be internet or local http/ftp server So what you need:
set sv_dlURL
cvar to download location, for example: sets sv_dlURL "ftp://myftp.com/games/q3"
Please note that your link should point on root game directory not particular mod or so.
Fill your download location with files. Please note that you should post ALL files that client may download, don't worry about pk3 overflows etc. on client side as client will download and use only required files
You can easy download pk3 files you need from any ftp/http/etc resource via following commands:
\download filename.pk3
\dlmap mapname.pk3
\dlmap
is the same as \download
but also will check for map existence
cl_dlURL
cvar must point to a download location, where (optional) %1
pattern will be replaced by \download|dlmap
command argument (filename/mapmane) and HTTP header may be analysed to obtain destination filename
For example:
- If
cl_dlURL
is<http://127.0.0.1>
and you type\download promaps.pk3
- The resulting download url will be<http://127.0.0.1/promaps.pk3>
- If
cl_dlURL
is<http://127.0.0.1/%1>
and you type\dlmap dm17
- The resulting download url will be<http://127.0.0.1/dm17>
Also in this case HTTP-header will be analysed and resulting filename may be changed
To stop download just specify '-' as argument:
\dlmap -
cl_dlDirectory
cvar specifies where to save downloaded files:
0
- save in current game directory1
- save in fs_basegame (baseq3) directory
Optional "if"-"elif"-"else" keywords can be used to control which shaders stages can be loaded depending from some cvar values. For example, old shader:
console
{
nopicmip
nomipmaps
{
map image1.tga
blendFunc blend
tcmod scale 1 1
}
}
New shader:
console
{
nopicmip
nomipmaps
if ( $r_vertexLight == 1 && $r_dynamicLight )
{
map image1.tga
blendFunc blend
tcmod scale 1 1
}
else
{
map image2.tga
blendFunc add
tcmod scale 1 1
}
}
lvalue-only conditions are supported, count of conditions inside if()/elif() is not limited
In order to use this functionality you need to install ffmpeg package (on Linux) or put ffmpeg binary near quake3e executable (on Windows).
Use \cl_aviPipeFormat
to control encoder parameters passed to ffmpeg, see ffmpeg documentation for details, default value is set according to YouTube recommendations:
-c:v libx264 -preset slow -crf 18 -c:a aac -b:a 192k -pix_fmt yuv420p
If you need higher bitrate - decrease -crf
parameter, if you need better compression at cost of cpu time - set -preset
to slow or slower.
And since ffmpeg can utilize all available CPU cores for faster encoding - make sure you have \com_affinityMask
set to 0.
Use \r_renderWidth
and \r_renderHeight
cvars to set persistent rendering resolution, i.e. game frame will be rendered at this resolution and later upscaled/downscaled to window size set by either \r_mode
or \r_modeFullscreen
cvars.
Cvar \r_renderScale
controls upscale/downscale behaviour:
0
- disabled1
- nearest filtering, stretch to full size2
- nearest filtering, preserve aspect ratio (black bars on sides)3
- linear filtering, stretch to full size4
- linear filtering, preserve aspect ratio (black bars on sides)
It may be useful if you want to render and record 4k+ video on HD display or if you're preferring playing at low resolution but your monitor or GPU driver can't set video/scaling mode properly.
Requires \r_fbo 1
, available operation modes via \r_bloom
cvar:
0
- disabled1
- enabled2
- enabled + applies to 2D/HUD elements too
\r_bloom_threshold
- Colour level to extract to bloom texture, default is 0.6
\r_bloom_threshold_mode
- Colour extraction mode:
0
- (r|g|b) >= threshold1
- (r+g+b)/3 >= threshold2
- luma(r,g,b) >= threshold
\r_bloom_modulate
- modulate extracted color:
0
- off (color=color, i.e. no changes)1
- by itself (color=color*color)2
- by intensity (color=color*luma(color))
\r_bloom_intensity
- final bloom blend factor, default is 0.5
\r_bloom_passes
- count of downsampled passes (framebuffers) to blend on final bloom image, default is 5
\r_bloom_blend_base
- 0-based, topmost downsampled framebuffer to use for final image, high values can be used for stronger haze effect, results in overall weaker intensity
\r_bloom_filter_size
- filter size of Gaussian Blur effect for each pass, bigger filter size means stronger and wider blur, lower value are faster, default is 6
\r_bloom_reflection
- bloom lens reflection effect, value is an intensity factor of the effect, negative value means blend only reflection and skip main bloom texture