This commit is contained in:
Shpoike 2021-08-31 07:05:26 +01:00
commit 9119c1d546
58 changed files with 777 additions and 566 deletions

View file

@ -2,14 +2,13 @@
<article>
<title>QuakeSpasm
<toc>
<verb></verb>
<em>Page last edited: August 2021</em>
<sect> About <p>
<url url="http://quakespasm.sourceforge.net" name="QuakeSpasm">
is a modern, cross-platform Quake 1 engine based on <url url="http://www.celephais.net/fitzquake" name="FitzQuake">.
is a modern, cross-platform Quake engine based on <url url="http://www.celephais.net/fitzquake" name="FitzQuake">.
</p><p>
It includes support for 64 bit CPUs and custom music playback, a new
sound driver, some graphical niceities, and numerous bug-fixes and other improvements.
@ -22,30 +21,26 @@ SDL is probably less buggy, but SDL2 has nicer features and smoother mouse input
<itemize>
<item><url url="http://quakespasm.sourceforge.net/download.htm" name="Project Downloads">
<item><url url="https://sourceforge.net/p/quakespasm/quakespasm/ci/master/tree/" name="Latest code repository">
<item><url url="http://quakespasm.ericwa.com/job/quakespasm-sdl2/" name="Automatic Builds (dead link)">
</itemize>
<sect> Hints <p>
<em>Visit the <url url="http://www.celephais.net/fitzquake" name="FitzQuake homepage"> for a full run-down of the engine's commands and variables.</em>
<itemize>
<item>To disable some changes, use "<bf>quakespasm -fitz</bf>"
<item>Quakespasm's custom data is stored in "quakespasm.pak". Install this file alongside your id1 directory to enable the custom console background and other minor features.
<item>For different sound backend drivers use "<bf>SDL_AUDIODRIVER=</bf><em>DRIVER</em><bf> ./quakespasm</bf>"
, where DRIVER may be alsa, dsp, pulse, esd ...
<item>For different sound backend drivers use :<newline>
"<bf>SDL_AUDIODRIVER=</bf><em>DRIVER</em><bf> ./quakespasm</bf>"<newline>
where DRIVER may be alsa, dsp, pulse, esd ...
<item><bf>Shift+Escape</bf> draws the Console.
<item>From the console, use <bf>UP</bf> to browse the command line history and
<bf>TAB</bf> to autocomplete command and map names.
<item>There is currently no CD Music volume support and SDL2 doesn't support CD audio. cd_sdl.c needs replacing with cd_linux.c, cd_bsd.c etc..
<item>In windows, alternative CD drives are accessible by "<bf>quakespasm -cddev F</bf>" (for example)
<item>Quakespasm allows loading new games (mods) on the fly with "<bf>game</bf> <em>GAMENAME {-quoth/hipnotic/rogue}</em>"
<item>In windows, alternative CD drives are accessible by<newline>
"<bf>quakespasm -cddev F</bf>" (for example)
<item>Quakespasm allows loading new games (mods) on the fly with<newline>
"<bf>game</bf> <em>GAMENAME {-quoth/hipnotic/rogue}</em>"
<item>Use "<bf>quakespasm -condebug</bf>" to save console log to "qconsole.log". SDL2 builds no longer generate stdout.txt/stderr.txt.
</itemize>
</p>
@ -103,10 +98,12 @@ These buttons can be bound normally:
<item>XBUTTON
<item>YBUTTON
</itemize>
quakespasm.pak contains a default.cfg which has been updated to give some default bindings. L/R shoulder buttons are bound to weapon switching, and L/R triggers are jump and attack.
<p>
The controller support started as Jeremiah Sypult's implementation in Quakespasm-Rift and also uses ideas and code from LordHavoc (DarkPlaces).
<sect> Compiling and Installation<p>
<p>See the Downloads section to get the sourcecode, then below for platform specific instructions.
Quakespasm can also be built with the cross-platform Codeblocks.
@ -122,12 +119,12 @@ Compile time options include
<itemize>
<item><bf>make DO_USERDIRS=1</bf> to include user directories support
<item><bf>make DEBUG=1</bf> for debugging
<item><bf>make SDL_CONFIG=</bf><em>/PATH/TO/SDL-CONFIG</em> for unusual SDL installations
<item><bf>make SDL_CONFIG=</bf><em>/PATH/TO/sdl-config</em> for unusual SDL installations
<item><bf>make USE_SDL2=1</bf> to compile against SDL2 instead of SDL-1.2
</itemize>
<sect1> Windows <p>
The QuakeSpasm developers cross-compile windows binaries using <url url="http://www.mingw.org" name="MinGW"> and <url url="http://mingw-w64.sf.net" name="Mingw-w64">.
The QuakeSpasm developers cross-compile windows binaries using <url url="http://www.mingw.org" name="MinGW"> and <url url="http://mingw-w64.sf.net" name="MinGW-w64">.
The project can also be built using Visual Studio 2005 (or newer).</p>
@ -137,29 +134,31 @@ A Quakespasm App (including program launcher and update framework) can be made u
Alternatively, have a look at <bf>Makefile.darwin</bf> for more instructions on building from a console.
</p>
<sect> Known Bugs <p>
Brightness issues should be fixed with GLSL gamma in 0.90.1, if your system supports OpenGL 2. For reference on older systems:
<newline>
Some versions of Xorg and SDL have brightness issues.
<newline>
Try setting "export SDL_VIDEO_X11_NODIRECTCOLOR=1", or if you have Xorg >= 7.5 and broken brightness,
these patched libSDL binaries may help.
<sect> Quake '2021 re-release' <p>
QuakeSpasm 0.94.0 has initial support for playing the 2021 re-release content:
<itemize>
<item><url url="http://sf.net/projects/quakespasm/files/Support%20Files/libSDL_gamma_patched.tgz/download"
name="Gamma patched libSDL (i686-linux)"></li>
<item><url url="http://sf.net/projects/quakespasm/files/Support%20Files/libSDL_gamma_patched-AMD64.tgz/download"
name="Gamma patched libSDL (x86_64-linux)">
<item> Copy the quakespasm exe to your rerelease installation.
<item> Extract the localization folder from QuakeEX.kpf (which is actually a zip file), and place it in the rerelease directory. Linux (Unix) users can do the following, for example:<newline>
<verb>unzip QuakeEX.kpf localization/loc_english.txt</verb>
<item> Run quakespasm as you normally do.
</itemize>
<sect> Changes<p>
<sect1> Changes in 0.93.3<p>
<sect1> Changes in 0.94.0<p>
<itemize>
<item> Initial support for playing the 'Quake 2021 re-release' content (thanks to Andrei Drexler for bulk of the work.)
<item> Fix rendering bug when cl_bobcycle was set to zero (sf.net bug/41)
<item> Fixed buffer overflow with large char skybox names (sf.net bug/38)
<item> Fixed a missing MAXALIASFRAMES bounds check (sf.net bug/37)
<item> OpenGL: workaround Intel UHD 600 driver bug (sf.net bug/39)
<item> OpenGL: merged surface mark & cull optimizations from vkQuake.
<item> Changed 'model has a skin taller than 480' error into a warning
<item> Reject lit files if they're the wrong size (eg hipnotic/start.bsp vs id1/start.lit or just a bsp that no longer has any coloured lits, etc)
<item> External ent files are now versioned using 4 digit crc of the original map's ents, like e1m1@c49d.ent, which is much safer. The old method (e.g. e1m1.ent) still works but isn't recommended.
<item> Support for external vis files.
<item> Save: remove CR/LFs from level name to avoids broken saves, e.g. with autumn_sp map.
<item> Music: improvements to mp3 tag detection / skipping.
<item> Music: umx loader fix for malformed / crafted files.
@ -174,7 +173,7 @@ these patched libSDL binaries may help.
<item> Lightmaps are now dynamically allocated (from QSS), and BLOCK_WIDTH/HEIGHT raised from 128 to 256.
<item> Fixed several uncheked limits that would crash the Slayer's Testaments mod (sf.net bug #33).
<item> Raised MAXALIASTRIS from 2048 to 4096, so that the Slayer's Testaments mod works.
<item> Fixed 'pants' and 'shirt' types so that those textures load correctly on platforms where char is unsigned by default (sf.net bug #28).
<item> Fixed 'pants' and 'shirt' types so that those textures load correctly on platforms where char type is unsigned by default (sf.net bug #28).
<item> Windows audio: WASAPI-enabled SDL2 dlls function properly now.
<item> Update the third-party libraries. Other fixes/cleanups.
</itemize>
@ -210,11 +209,11 @@ these patched libSDL binaries may help.
<item> Change default screenshot format to png. The 'screenshot' command now supports optional format (tga, png or jpg) and quality (1-100) arguments.
<item> Revert "always run" changes from 0.85.9 and move the QuakeSpasm customizations to a new "cl_alwaysrun" cvar: Set to 1 in order to scale forward/side/up speed by "cl_movespeedkey" (usually 2), and to make "speedkey" act as "slowkey".
<item> Change the "always run" menu option to offer three choices:
<itemize>
<item> off (cl_alwaysrun 0, cl_forwardspeed 200, cl_backspeed 200)
<item> vanilla (cl_alwaysrun 0, cl_forwardspeed 400, cl_backspeed 400)
<item> quakespasm (cl_alwaysrun 1, cl_forwardspeed 200, cl_backspeed 200)
</itemize>
<verb>
off (cl_alwaysrun 0, cl_forwardspeed 200, cl_backspeed 200)
vanilla (cl_alwaysrun 0, cl_forwardspeed 400, cl_backspeed 400)
quakespasm (cl_alwaysrun 1, cl_forwardspeed 200, cl_backspeed 200)
</verb>
<item> New "r_scale" cvar. Set to 2, 3, or 4 to render the view at 1/2, 1/3, or 1/4 resolution.
<item> New "r_viewmodel_quake" cvar. Set to 1 for WinQuake gun position (from MarkV).
<item> New "find" / "apropos" command, searches for commands/cvar names for the given substring (from Spike).
@ -348,7 +347,8 @@ these patched libSDL binaries may help.
<sect1> Changes in 0.90.0<p>
<itemize>
<item> Fix issues on Windows systems with DPI scaling.</item>
<item> Unix/Mac user directories support. Disabled by default, 'make DO_USERDIRS=1' to enable it.
<item> Unix/Mac user directories support. Disabled by default,<newline>
'make DO_USERDIRS=1' to enable it.
<item> SDL2 support. Disabled by default, 'make USE_SDL2=1' to enable it.
<item> Revised keyboard input code.
<item> Revised/improved the 'game' command, i.e. on-the-fly mod changing. It now accepts an optional second argument for mission packs or quoth support i.e. -hipnotic, -rogue, or -quoth. For example, for WarpSpasm: "game warp -quoth"
@ -546,12 +546,6 @@ these patched libSDL binaries may help.
</itemize>
<sect> Todo <p>
<itemize>
<item>Add uHexen2's first person camera (and menu item)
<item>Native CD audio support (if desired). cd_sdl.c doesn't have proper volume controls and SDL2 doesn't support CD audio
</itemize>
<sect> Copyright <p>
<itemize>
<item>Quake and Quakespasm are released under the <url url="http://www.gnu.org/licenses/gpl-2.0.html" name="GNU GENERAL PUBLIC LICENSE Version 2">

View file

@ -17,7 +17,7 @@
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>0.93.3</string>
<string>0.94.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>LSApplicationCategoryType</key>

View file

@ -1,6 +1,10 @@
#ifndef XMP_H
#define XMP_H
#if defined(EMSCRIPTEN)
# include <emscripten.h>
#endif
#ifdef __cplusplus
extern "C" {
#endif
@ -26,7 +30,6 @@ extern "C" {
#elif defined(__SUNPRO_C) && defined(XMP_LDSCOPE_GLOBAL)
# define LIBXMP_EXPORT __global
#elif defined(EMSCRIPTEN)
# include <emscripten.h>
# define LIBXMP_EXPORT EMSCRIPTEN_KEEPALIVE
# define LIBXMP_EXPORT_VAR
#else

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -1,10 +1,10 @@
allow plain files to override files inside a PAK file -- Sander van Dijk.
Index: Quake/common.c
===================================================================
--- Quake/common.c (revision 1476)
+++ Quake/common.c (working copy)
@@ -2036,13 +2036,6 @@ static void COM_AddGameDirectory (const
diff --git a/Quake/common.c b/Quake/common.c
index 6206c3f..27833b8 100644
--- a/Quake/common.c
+++ b/Quake/common.c
@@ -2037,13 +2037,6 @@ static void COM_AddGameDirectory (const char *base, const char *dir)
else path_id = 1U;
_add_path:
@ -18,7 +18,7 @@ Index: Quake/common.c
// add any pak files in the format pak0.pak pak1.pak, ...
for (i = 0; ; i++)
{
@@ -2074,6 +2067,13 @@ _add_path:
@@ -2075,6 +2068,13 @@ _add_path:
if (!pak) break;
}

View file

@ -1,10 +1,10 @@
INPUT := gfx/conback.lmp \
maps/e1m1.ent \
maps/e1m2.ent \
maps/e1m4.ent \
maps/e2m2.ent \
maps/e2m3.ent \
maps/e2m7.ent \
maps/e1m1@c49d.ent \
maps/e1m2@0caa.ent \
maps/e1m4@958e.ent \
maps/e2m2@fbfe.ent \
maps/e2m3@237a.ent \
maps/e2m7@10a8.ent \
default.cfg
OUTPUT := quakespasm.pak

View file

@ -1,41 +1,39 @@
Index: Quake/gl_model.c
===================================================================
--- Quake/gl_model.c (revision 1463)
+++ Quake/gl_model.c (working copy)
@@ -429,6 +429,8 @@ void Mod_LoadTextures (lump_t *l)
extern byte *hunk_base;
//johnfitz
diff --git a/Quake/gl_model.c b/Quake/gl_model.c
index 2b15080..07ff6fd 100644
--- a/Quake/gl_model.c
+++ b/Quake/gl_model.c
@@ -37,6 +37,8 @@ qmodel_t *Mod_LoadModel (qmodel_t *mod, qboolean crash);
cvar_t external_ents = {"external_ents", "1", CVAR_ARCHIVE};
cvar_t external_vis = {"external_vis", "1", CVAR_ARCHIVE};
+ extern cvar_t r_externaltexture_fix; //mk
+extern cvar_t r_externaltexture_fix; //mk
+
//johnfitz -- don't return early if no textures; still need to create dummy texture
if (!l->filelen)
{
@@ -490,7 +492,17 @@ void Mod_LoadTextures (lump_t *l)
static byte *mod_novis;
static int mod_novis_capacity;
@@ -498,7 +500,16 @@ void Mod_LoadTextures (lump_t *l)
if (!isDedicated) //no texture uploading for dedicated server
{
if (!q_strncasecmp(tx->name,"sky",3)) //sky texture //also note -- was Q_strncmp, changed to match qbsp
+ {
+ //mk -- begin
+ if (r_externaltexture_fix.value) {
+ if (r_externaltexture_fix.value) { //mk
+ if (strstr(tx->name,"sky4")) {
+ if (CRC_Block((byte *)(tx+1), tx->width * tx->height)==13039)
+ q_strlcpy(tx->name, "sky1", sizeof(tx->name));
+ Con_Printf(" using %s\n", tx->name);
+ }
+ } //mk -- end
+ }
Sky_LoadTexture (tx);
+ }
else if (tx->name[0] == '*') //warping texture
{
//external textures -- first look in "textures/mapname/" then look in "textures/"
@@ -540,6 +552,52 @@ void Mod_LoadTextures (lump_t *l)
@@ -548,6 +559,50 @@ void Mod_LoadTextures (lump_t *l)
//external textures -- first look in "textures/mapname/" then look in "textures/"
mark = Hunk_LowMark ();
COM_StripExtension (loadmodel->name + 5, mapname, sizeof(mapname));
+ //mk begin
+ if (r_externaltexture_fix.value) {
+
+ if (r_externaltexture_fix.value) { //mk
+ if (strstr(tx->name,"plat_top1")) {
+ if (CRC_Block((byte *)(tx+1), tx->width * tx->height)==24428)
+ q_strlcpy(tx->name, "plat_top1_cable", sizeof(tx->name));
@ -43,7 +41,6 @@ Index: Quake/gl_model.c
+ q_strlcpy(tx->name, "plat_top1_bolt", sizeof(tx->name));
+ Con_Printf(" using %s\n", tx->name);
+ }
+
+ if (strstr(tx->name,"metal5_2")) {
+ if (CRC_Block((byte *)(tx+1), tx->width * tx->height)==49173)
+ q_strlcpy(tx->name, "metal5_2_x", sizeof(tx->name));
@ -51,7 +48,6 @@ Index: Quake/gl_model.c
+ q_strlcpy(tx->name, "metal5_2_arc", sizeof(tx->name));
+ Con_Printf(" using %s\n", tx->name);
+ }
+
+ if (strstr(tx->name,"metal5_4")) {
+ if (CRC_Block((byte *)(tx+1), tx->width * tx->height)==20977)
+ q_strlcpy(tx->name, "metal5_4_double", sizeof(tx->name));
@ -78,29 +74,29 @@ Index: Quake/gl_model.c
+ q_strlcpy(tx->name, "window03_e4m2", sizeof(tx->name));
+ Con_Printf(" using %s\n", tx->name);
+ }
+ } //mk end
+ }
+
q_snprintf (filename, sizeof(filename), "textures/%s/%s", mapname, tx->name);
data = Image_LoadImage (filename, &fwidth, &fheight);
if (!data)
Index: Quake/gl_rmain.c
===================================================================
--- Quake/gl_rmain.c (revision 1406)
+++ Quake/gl_rmain.c (working copy)
@@ -101,6 +101,8 @@
diff --git a/Quake/gl_rmain.c b/Quake/gl_rmain.c
index a41d8b1..b0020c5 100644
--- a/Quake/gl_rmain.c
+++ b/Quake/gl_rmain.c
@@ -102,6 +102,8 @@ cvar_t r_noshadow_list = {"r_noshadow_list", "progs/flame2.mdl,progs/flame.mdl,p
extern cvar_t r_vfog;
//johnfitz
+
+cvar_t r_externaltexture_fix = {"r_externaltexture_fix","0", CVAR_ARCHIVE}; //mk
+cvar_t r_externaltexture_fix = {"r_externaltexture_fix", "0", CVAR_ARCHIVE}; //mk
+
cvar_t gl_zfix = {"gl_zfix", "0", CVAR_NONE}; // QuakeSpasm z-fighting fix
Index: Quake/gl_rmisc.c
===================================================================
--- Quake/gl_rmisc.c (revision 1406)
+++ Quake/gl_rmisc.c (working copy)
@@ -47,6 +47,7 @@
cvar_t r_lavaalpha = {"r_lavaalpha","0",CVAR_NONE};
diff --git a/Quake/gl_rmisc.c b/Quake/gl_rmisc.c
index dfdb84d..9c441bd 100644
--- a/Quake/gl_rmisc.c
+++ b/Quake/gl_rmisc.c
@@ -47,6 +47,7 @@ extern cvar_t r_nolerp_list;
extern cvar_t r_noshadow_list;
//johnfitz
extern cvar_t gl_zfix; // QuakeSpasm z-fighting fix
@ -108,7 +104,7 @@ Index: Quake/gl_rmisc.c
extern gltexture_t *playertextures[MAX_SCOREBOARD]; //johnfitz
@@ -231,6 +232,7 @@ void R_Init (void)
@@ -218,6 +219,7 @@ void R_Init (void)
Cvar_RegisterVariable (&r_noshadow_list);
Cvar_SetCallback (&r_noshadow_list, R_Model_ExtraFlags_List_f);
//johnfitz

View file

@ -265,6 +265,9 @@ void Cmd_StuffCmds_f (void)
Cbuf_InsertText (cmds);
}
/* id1/pak0.pak from 2021 re-release doesn't have a default.cfg
* embedding Quakespasm's customized default.cfg for that... */
#include "default_cfg.h"
/*
===============
@ -284,6 +287,9 @@ void Cmd_Exec_f (void)
mark = Hunk_LowMark ();
f = (char *)COM_LoadHunkFile (Cmd_Argv(1), NULL);
if (!f && !strcmp(Cmd_Argv(1), "default.cfg")) {
f = default_cfg; /* see above.. */
}
if (!f)
{
if (cmd_warncmd.value)

View file

@ -3370,3 +3370,425 @@ void COM_Effectinfo_Enumerate(int (*cb)(const char *pname))
}
free(buf);
}
/*
============================================================================
LOCALIZATION
============================================================================
*/
typedef struct
{
char *key;
char *value;
} locentry_t;
typedef struct
{
int numentries;
int maxnumentries;
int numindices;
unsigned *indices;
locentry_t *entries;
char *text;
} localization_t;
static localization_t localization;
/*
================
COM_HashString
Computes the FNV-1a hash of string str
================
*/
unsigned COM_HashString (const char *str)
{
unsigned hash = 0x811c9dc5u;
while (*str)
{
hash ^= *str++;
hash *= 0x01000193u;
}
return hash;
}
/*
================
LOC_LoadFile
================
*/
void LOC_LoadFile (const char *file)
{
char path[1024];
FILE *fp = NULL;
int i,lineno;
char *cursor;
// clear existing data
if (localization.text)
{
free(localization.text);
localization.text = NULL;
}
localization.numentries = 0;
localization.numindices = 0;
if (!file || !*file)
return;
Con_Printf("\nLanguage initialization\n");
q_snprintf(path, sizeof(path), "%s/%s", com_basedir, file);
fp = fopen(path, "r");
if (!fp) goto fail;
fseek(fp, 0, SEEK_END);
i = ftell(fp);
if (i <= 0) goto fail;
localization.text = (char *) calloc(1, i+1);
if (!localization.text)
{
fail: if (fp) fclose(fp);
Con_Printf("Couldn't load '%s'\nfrom '%s'\n", file, com_basedir);
return;
}
fseek(fp, 0, SEEK_SET);
fread(localization.text, 1, i, fp);
fclose(fp);
cursor = localization.text;
// skip BOM
if ((unsigned char)(cursor[0]) == 0xEF && (unsigned char)(cursor[1]) == 0xBB && cursor[2] == 0xB)
cursor += 3;
lineno = 0;
while (*cursor)
{
char *line, *equals;
lineno++;
// skip leading whitespace
while (q_isblank(*cursor))
++cursor;
line = cursor;
equals = NULL;
// find line end and first equals sign, if any
while (*cursor && *cursor != '\n')
{
if (*cursor == '=' && !equals)
equals = cursor;
cursor++;
}
if (line[0] == '/')
{
if (line[1] != '/')
Con_DPrintf("LOC_LoadFile: malformed comment on line %d\n", lineno);
}
else if (equals)
{
char *key_end = equals;
qboolean leading_quote;
qboolean trailing_quote;
locentry_t *entry;
char *value_src;
char *value_dst;
char *value;
// trim whitespace before equals sign
while (key_end != line && q_isspace(key_end[-1]))
key_end--;
*key_end = 0;
value = equals + 1;
// skip whitespace after equals sign
while (value != cursor && q_isspace(*value))
value++;
leading_quote = (*value == '\"');
trailing_quote = false;
value += leading_quote;
// transform escape sequences in-place
value_src = value;
value_dst = value;
while (value_src != cursor)
{
if (*value_src == '\\' && value_src + 1 != cursor)
{
char c = value_src[1];
value_src += 2;
switch (c)
{
case 'n': *value_dst++ = '\n'; break;
case 't': *value_dst++ = '\t'; break;
case 'v': *value_dst++ = '\v'; break;
case 'b': *value_dst++ = '\b'; break;
case 'f': *value_dst++ = '\f'; break;
case '"':
case '\'':
*value_dst++ = c;
break;
default:
Con_Printf("LOC_LoadFile: unrecognized escape sequence \\%c on line %d\n", c, lineno);
*value_dst++ = c;
break;
}
continue;
}
if (*value_src == '\"')
{
trailing_quote = true;
*value_dst = 0;
break;
}
*value_dst++ = *value_src++;
}
// if not a quoted string, trim trailing whitespace
if (!trailing_quote)
{
while (value_dst != value && q_isblank(value_dst[-1]))
{
*value_dst = 0;
value_dst--;
}
}
if (localization.numentries == localization.maxnumentries)
{
// grow by 50%
localization.maxnumentries += localization.maxnumentries >> 1;
localization.maxnumentries = q_max(localization.maxnumentries, 32);
localization.entries = (locentry_t*) realloc(localization.entries, sizeof(*localization.entries) * localization.maxnumentries);
}
entry = &localization.entries[localization.numentries++];
entry->key = line;
entry->value = value;
}
if (*cursor)
*cursor++ = 0; // terminate line and advance to next
}
// hash all entries
localization.numindices = localization.numentries * 2; // 50% load factor
if (localization.numindices == 0)
{
Con_Printf("No localized strings in file '%s'\n", file);
return;
}
localization.indices = (unsigned*) realloc(localization.indices, localization.numindices * sizeof(*localization.indices));
memset(localization.indices, 0, localization.numindices * sizeof(*localization.indices));
for (i = 0; i < localization.numentries; i++)
{
locentry_t *entry = &localization.entries[i];
unsigned pos = COM_HashString(entry->key) % localization.numindices, end = pos;
for (;;)
{
if (!localization.indices[pos])
{
localization.indices[pos] = i + 1;
break;
}
++pos;
if (pos == localization.numindices)
pos = 0;
if (pos == end)
Sys_Error("LOC_LoadFile failed");
}
}
Con_Printf("Loaded %d strings from '%s'\n", localization.numentries, file);
}
/*
================
LOC_Init
================
*/
void LOC_Init(void)
{
LOC_LoadFile("localization/loc_english.txt");
}
/*
================
LOC_Shutdown
================
*/
void LOC_Shutdown(void)
{
free(localization.indices);
free(localization.entries);
free(localization.text);
}
/*
================
LOC_GetRawString
Returns localized string if available, or NULL otherwise
================
*/
const char* LOC_GetRawString (const char *key)
{
unsigned pos, end;
if (!localization.numindices || !key || !*key || *key != '$')
return NULL;
key++;
pos = COM_HashString(key) % localization.numindices;
end = pos;
do
{
unsigned idx = localization.indices[pos];
locentry_t *entry;
if (!idx)
return NULL;
entry = &localization.entries[idx - 1];
if (!Q_strcmp(entry->key, key))
return entry->value;
++pos;
if (pos == localization.numindices)
pos = 0;
} while (pos != end);
return NULL;
}
/*
================
LOC_GetString
Returns localized string if available, or input string otherwise
================
*/
const char* LOC_GetString (const char *key)
{
const char* value = LOC_GetRawString(key);
return value ? value : key;
}
/*
================
LOC_ParseArg
Returns argument index (>= 0) and advances the string if it starts with a placeholder ({} or {N}),
otherwise returns a negative value and leaves the pointer unchanged
================
*/
static int LOC_ParseArg (const char **pstr)
{
int arg;
const char *start;
const char *str = *pstr;
// opening brace
if (*str != '{')
return -1;
start = ++str;
// optional index, defaulting to 0
arg = 0;
while (q_isdigit(*str))
arg = arg * 10 + *str++ - '0';
// closing brace
if (*str != '}')
return -1;
*pstr = ++str;
return arg;
}
/*
================
LOC_HasPlaceholders
================
*/
qboolean LOC_HasPlaceholders (const char *str)
{
if (!localization.numindices)
return false;
while (*str)
{
if (LOC_ParseArg(&str) >= 0)
return true;
str++;
}
return false;
}
/*
================
LOC_Format
Replaces placeholders (of the form {} or {N}) with the corresponding arguments
Returns number of written chars, excluding the NUL terminator
If len > 0, output is always NUL-terminated
================
*/
size_t LOC_Format (const char *format, const char* (*getarg_fn) (int idx, void* userdata), void* userdata, char* out, size_t len)
{
size_t written = 0;
int numargs = 0;
if (!len)
{
Con_DPrintf("LOC_Format: no output space\n");
return 0;
}
--len; // reserve space for the terminator
while (*format && written < len)
{
const char* insert;
size_t space_left;
size_t insert_len;
int argindex = LOC_ParseArg(&format);
if (argindex < 0)
{
out[written++] = *format++;
continue;
}
insert = getarg_fn(argindex, userdata);
space_left = len - written;
insert_len = Q_strlen(insert);
if (insert_len > space_left)
{
Con_DPrintf("LOC_Format: overflow at argument #%d\n", numargs);
insert_len = space_left;
}
Q_memcpy(out + written, insert, insert_len);
written += insert_len;
}
if (*format)
Con_DPrintf("LOC_Format: overflow\n");
out[written] = 0;
return written;
}

View file

@ -218,6 +218,15 @@ void COM_CreatePath (char *path);
char *va (const char *format, ...) FUNC_PRINTF(1,2);
// does a varargs printf into a temp buffer
unsigned COM_HashString (const char *str);
// localization support for 2021 rerelease version:
void LOC_Init (void);
void LOC_Shutdown (void);
const char* LOC_GetRawString (const char *key);
const char* LOC_GetString (const char *key);
qboolean LOC_HasPlaceholders (const char *str);
size_t LOC_Format (const char *format, const char* (*getarg_fn)(int idx, void* userdata), void* userdata, char* out, size_t len);
//============================================================================

92
Quake/default_cfg.h Normal file
View file

@ -0,0 +1,92 @@
// keep in sync with Misc/qs_pak/default.cfg
static char default_cfg[] =
"unbindall\n"
"bind ALT +strafe\n"
"bind , +moveleft\n"
"bind a +moveleft\n"
"bind . +moveright\n"
"bind d +moveright\n"
"bind DEL +lookdown\n"
"bind PGDN +lookup\n"
"bind END centerview\n"
"bind e +moveup\n"
"bind c +movedown\n"
"bind SHIFT +speed\n"
"bind CTRL +attack\n"
"bind UPARROW +forward\n"
"bind w +forward\n"
"bind DOWNARROW +back\n"
"bind s +back\n"
"bind LEFTARROW +left\n"
"bind RIGHTARROW +right\n"
"bind SPACE +jump\n"
"bind TAB +showscores\n"
"bind 1 \"impulse 1\"\n"
"bind 2 \"impulse 2\"\n"
"bind 3 \"impulse 3\"\n"
"bind 4 \"impulse 4\"\n"
"bind 5 \"impulse 5\"\n"
"bind 6 \"impulse 6\"\n"
"bind 7 \"impulse 7\"\n"
"bind 8 \"impulse 8\"\n"
"bind 0 \"impulse 0\"\n"
"bind / \"impulse 10\"\n"
"bind MWHEELDOWN \"impulse 10\"\n"
"bind MWHEELUP \"impulse 12\"\n"
"alias zoom_in \"sensitivity 2;fov 90;wait;fov 70;wait;fov 50;wait;fov 30;wait;fov 10;wait;fov 5;bind F11 zoom_out\"\n"
"alias zoom_out \"sensitivity 4;fov 5;wait;fov 10;wait;fov 30;wait;fov 50;wait;fov 70;wait;fov 90;bind F11 zoom_in; sensitivity 3\"\n"
"bind F11 zoom_in\n"
"bind F1 \"help\"\n"
"bind F2 \"menu_save\"\n"
"bind F3 \"menu_load\"\n"
"bind F4 \"menu_options\"\n"
"bind F5 \"menu_multiplayer\"\n"
"bind F6 \"echo Quicksaving...; wait; save quick\"\n"
"bind F9 \"echo Quickloading...; wait; load quick\"\n"
"bind F10 \"quit\"\n"
"bind F12 \"screenshot\"\n"
"bind \\ +mlook\n"
"bind PAUSE \"pause\"\n"
"bind ESCAPE \"togglemenu\"\n"
"bind ~ \"toggleconsole\"\n"
"bind ` \"toggleconsole\"\n"
"bind t \"messagemode\"\n"
"bind + \"sizeup\"\n"
"bind = \"sizeup\"\n"
"bind - \"sizedown\"\n"
"bind INS +klook\n"
"bind MOUSE1 +attack\n"
"bind MOUSE2 +jump\n"
"bind LSHOULDER \"impulse 12\"\n"
"bind RSHOULDER \"impulse 10\"\n"
"bind LTRIGGER +jump\n"
"bind RTRIGGER +attack\n"
"gamma 1.0\n"
"volume 0.7\n"
"sensitivity 3\n"
"viewsize 110\n"
"scr_conscale 1.6\n"
"scr_menuscale 1.6\n"
"scr_sbarscale 1.6\n"
"+mlook\n";

View file

@ -1068,20 +1068,35 @@ Mod_LoadEntities
*/
void Mod_LoadEntities (lump_t *l)
{
char basemapname[MAX_QPATH];
char entfilename[MAX_QPATH];
char *ents;
int mark;
unsigned int path_id;
unsigned int crc = 0;
if (! external_ents.value)
goto _load_embedded;
q_strlcpy(entfilename, loadmodel->name, sizeof(entfilename));
COM_StripExtension(entfilename, entfilename, sizeof(entfilename));
q_strlcat(entfilename, ".ent", sizeof(entfilename));
Con_DPrintf2("trying to load %s\n", entfilename);
mark = Hunk_LowMark();
if (l->filelen > 0) {
crc = CRC_Block(mod_base + l->fileofs, l->filelen - 1);
}
q_strlcpy(basemapname, loadmodel->name, sizeof(basemapname));
COM_StripExtension(basemapname, basemapname, sizeof(basemapname));
q_snprintf(entfilename, sizeof(entfilename), "%s@%04x.ent", basemapname, crc);
Con_DPrintf2("trying to load %s\n", entfilename);
ents = (char *) COM_LoadHunkFile (entfilename, &path_id);
if (!ents)
{
q_snprintf(entfilename, sizeof(entfilename), "%s.ent", basemapname);
Con_DPrintf2("trying to load %s\n", entfilename);
ents = (char *) COM_LoadHunkFile (entfilename, &path_id);
}
if (ents)
{
// use ent file only from the same gamedir as the map

View file

@ -1727,11 +1727,18 @@ void VID_Init (void)
vid.colormap = host_colormap;
vid.fullbright = 256 - LittleLong (*((int *)vid.colormap + 2048));
#if !defined(USE_SDL2)
// set window icon
PL_SetWindowIcon();
#endif
VID_SetMode (width, height, refreshrate, bpp, fullscreen);
#if defined(USE_SDL2)
// set window icon
PL_SetWindowIcon();
#endif
GL_Init ();
GL_SetupState ();
Cmd_AddCommand ("gl_info", GL_Info_f); //johnfitz

View file

@ -1085,6 +1085,8 @@ void Host_Init (void)
CL_Init ();
}
LOC_Init (); // for 2021 rerelease support.
Hunk_AllocName (0, "-HOST_HUNKLEVEL-");
host_hunklevel = Hunk_LowMark ();
@ -1167,5 +1169,7 @@ void Host_Shutdown(void)
}
LOG_Close ();
LOC_Shutdown ();
}

View file

@ -42,21 +42,44 @@ char *PR_GetTempString (void)
===============================================================================
*/
static const char* PF_GetStringArg(int idx, void* userdata)
{
if (userdata)
idx += *(int*)userdata;
if (idx < 0 || idx >= qcvm->argc)
return "";
return LOC_GetString(G_STRING(OFS_PARM0 + idx * 3));
}
char *PF_VarString (int first)
{
int i;
static char out[1024];
const char *format;
size_t s;
out[0] = 0;
s = 0;
for (i = first; i < qcvm->argc; i++)
if (first >= qcvm->argc)
return out;
format = LOC_GetString(G_STRING((OFS_PARM0 + first * 3)));
if (LOC_HasPlaceholders(format))
{
s = q_strlcat(out, G_STRING((OFS_PARM0+i*3)), sizeof(out));
if (s >= sizeof(out))
int offset = first + 1;
s = LOC_Format(format, PF_GetStringArg, &offset, out, sizeof(out));
}
else
{
for (i = first; i < qcvm->argc; i++)
{
Con_Warning("PF_VarString: overflow (string truncated)\n");
return out;
s = q_strlcat(out, LOC_GetString(G_STRING(OFS_PARM0+i*3)), sizeof(out));
if (s >= sizeof(out))
{
Con_Warning("PF_VarString: overflow (string truncated)\n");
return out;
}
}
}
if (s > 255)
@ -1649,7 +1672,7 @@ static void PF_sv_WriteCoord (void)
static void PF_sv_WriteString (void)
{
MSG_WriteString (WriteDest(), G_STRING(OFS_PARM1));
MSG_WriteString (WriteDest(), LOC_GetString(G_STRING(OFS_PARM1)));
}
static void PF_sv_WriteEntity (void)

View file

@ -36,8 +36,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#define X11_VERSION 1.10
#define FITZQUAKE_VERSION 0.85 //johnfitz
#define QUAKESPASM_VERSION 0.93
#define QUAKESPASM_VER_PATCH 3 // helper to print a string like 0.93.2
#define QUAKESPASM_VERSION 0.94
#define QUAKESPASM_VER_PATCH 0 // helper to print a string like 0.93.3
#ifndef QUAKESPASM_VER_SUFFIX
#define QUAKESPASM_VER_SUFFIX // optional version suffix string literal like "-beta1"
#endif

Binary file not shown.

View file

@ -8,10 +8,6 @@
<H1>QuakeSpasm</H1>
<H2></H2>
<P>
<PRE>
</PRE>
</P>
<P><EM>Page last edited: August 2021</EM></P>
<P>
@ -36,13 +32,13 @@
<LI><A NAME="toc4.3">4.3</A> <A HREF="Quakespasm.html#ss4.3">Mac OS X </A>
</UL>
<P>
<H2><A NAME="toc5">5.</A> <A HREF="Quakespasm.html#s5">Known Bugs </A></H2>
<H2><A NAME="toc5">5.</A> <A HREF="Quakespasm.html#s5">Quake '2021 re-release' </A></H2>
<P>
<H2><A NAME="toc6">6.</A> <A HREF="Quakespasm.html#s6">Changes</A></H2>
<UL>
<LI><A NAME="toc6.1">6.1</A> <A HREF="Quakespasm.html#ss6.1">Changes in 0.93.3</A>
<LI><A NAME="toc6.1">6.1</A> <A HREF="Quakespasm.html#ss6.1">Changes in 0.94.0</A>
<LI><A NAME="toc6.2">6.2</A> <A HREF="Quakespasm.html#ss6.2">Changes in 0.93.2</A>
<LI><A NAME="toc6.3">6.3</A> <A HREF="Quakespasm.html#ss6.3">Changes in 0.93.1</A>
<LI><A NAME="toc6.4">6.4</A> <A HREF="Quakespasm.html#ss6.4">Changes in 0.93.0</A>
@ -62,16 +58,13 @@
<LI><A NAME="toc6.18">6.18</A> <A HREF="Quakespasm.html#ss6.18">Changes in 0.85.1</A>
</UL>
<P>
<H2><A NAME="toc7">7.</A> <A HREF="Quakespasm.html#s7">Todo </A></H2>
<H2><A NAME="toc7">7.</A> <A HREF="Quakespasm.html#s7">Copyright </A></H2>
<P>
<H2><A NAME="toc8">8.</A> <A HREF="Quakespasm.html#s8">Copyright </A></H2>
<H2><A NAME="toc8">8.</A> <A HREF="Quakespasm.html#s8">Contact </A></H2>
<P>
<H2><A NAME="toc9">9.</A> <A HREF="Quakespasm.html#s9">Contact </A></H2>
<P>
<H2><A NAME="toc10">10.</A> <A HREF="Quakespasm.html#s10">Links </A></H2>
<H2><A NAME="toc9">9.</A> <A HREF="Quakespasm.html#s9">Links </A></H2>
<HR>
@ -80,7 +73,7 @@
<P>
<A HREF="http://quakespasm.sourceforge.net">QuakeSpasm</A>
is a modern, cross-platform Quake 1 engine based on
is a modern, cross-platform Quake engine based on
<A HREF="http://www.celephais.net/fitzquake">FitzQuake</A>.</P>
<P>It includes support for 64 bit CPUs and custom music playback, a new
sound driver, some graphical niceities, and numerous bug-fixes and other improvements.</P>
@ -96,8 +89,6 @@ SDL is probably less buggy, but SDL2 has nicer features and smoother mouse input
<A HREF="http://quakespasm.sourceforge.net/download.htm">Project Downloads</A></LI>
<LI>
<A HREF="https://sourceforge.net/p/quakespasm/quakespasm/ci/master/tree/">Latest code repository</A></LI>
<LI>
<A HREF="http://quakespasm.ericwa.com/job/quakespasm-sdl2/">Automatic Builds (dead link)</A></LI>
</UL>
</P>
@ -106,24 +97,21 @@ SDL is probably less buggy, but SDL2 has nicer features and smoother mouse input
<P><EM>Visit the
<A HREF="http://www.celephais.net/fitzquake">FitzQuake homepage</A> for a full run-down of the engine's commands and variables.</EM></P>
<P>
<A HREF="http://www.celephais.net/fitzquake">FitzQuake homepage</A> for a full run-down of the engine's commands and variables.</EM>
<UL>
<LI>To disable some changes, use "<B>quakespasm -fitz</B>"
</LI>
<LI>Quakespasm's custom data is stored in "quakespasm.pak". Install this file alongside your id1 directory to enable the custom console background and other minor features.
</LI>
<LI>For different sound backend drivers use "<B>SDL_AUDIODRIVER=</B><EM>DRIVER</EM><B> ./quakespasm</B>"
, where DRIVER may be alsa, dsp, pulse, esd ...
</LI>
<LI>To disable some changes, use "<B>quakespasm -fitz</B>"</LI>
<LI>Quakespasm's custom data is stored in "quakespasm.pak". Install this file alongside your id1 directory to enable the custom console background and other minor features.</LI>
<LI>For different sound backend drivers use :<BR>
"<B>SDL_AUDIODRIVER=</B><EM>DRIVER</EM><B> ./quakespasm</B>"<BR>
where DRIVER may be alsa, dsp, pulse, esd ...</LI>
<LI><B>Shift+Escape</B> draws the Console.</LI>
<LI>From the console, use <B>UP</B> to browse the command line history and
<B>TAB</B> to autocomplete command and map names.</LI>
<LI>There is currently no CD Music volume support and SDL2 doesn't support CD audio. cd_sdl.c needs replacing with cd_linux.c, cd_bsd.c etc..</LI>
<LI>In windows, alternative CD drives are accessible by "<B>quakespasm -cddev F</B>" (for example)
</LI>
<LI>Quakespasm allows loading new games (mods) on the fly with "<B>game</B> <EM>GAMENAME {-quoth/hipnotic/rogue}</EM>"
</LI>
<LI>In windows, alternative CD drives are accessible by<BR>
"<B>quakespasm -cddev F</B>" (for example)</LI>
<LI>Quakespasm allows loading new games (mods) on the fly with<BR>
"<B>game</B> <EM>GAMENAME {-quoth/hipnotic/rogue}</EM>"</LI>
<LI>Use "<B>quakespasm -condebug</B>" to save console log to "qconsole.log". SDL2 builds no longer generate stdout.txt/stderr.txt.</LI>
</UL>
</P>
@ -189,10 +177,11 @@ SDL is probably less buggy, but SDL2 has nicer features and smoother mouse input
<LI>XBUTTON</LI>
<LI>YBUTTON</LI>
</UL>
quakespasm.pak contains a default.cfg which has been updated to give some default bindings. L/R shoulder buttons are bound to weapon switching, and L/R triggers are jump and attack.</P>
</P>
<P>quakespasm.pak contains a default.cfg which has been updated to give some default bindings. L/R shoulder buttons are bound to weapon switching, and L/R triggers are jump and attack.</P>
<P>The controller support started as Jeremiah Sypult's implementation in Quakespasm-Rift and also uses ideas and code from LordHavoc (DarkPlaces).</P>
<H2><A NAME="s4">4.</A> <A HREF="#toc4">Compiling and Installation</A></H2>
@ -209,7 +198,7 @@ Compile time options include
<UL>
<LI><B>make DO_USERDIRS=1</B> to include user directories support</LI>
<LI><B>make DEBUG=1</B> for debugging</LI>
<LI><B>make SDL_CONFIG=</B><EM>/PATH/TO/SDL-CONFIG</EM> for unusual SDL installations</LI>
<LI><B>make SDL_CONFIG=</B><EM>/PATH/TO/sdl-config</EM> for unusual SDL installations</LI>
<LI><B>make USE_SDL2=1</B> to compile against SDL2 instead of SDL-1.2</LI>
</UL>
</P>
@ -219,42 +208,47 @@ Compile time options include
<P>The QuakeSpasm developers cross-compile windows binaries using
<A HREF="http://www.mingw.org">MinGW</A> and
<A HREF="http://mingw-w64.sf.net">Mingw-w64</A>.</P>
<A HREF="http://mingw-w64.sf.net">MinGW-w64</A>.</P>
<P>The project can also be built using Visual Studio 2005 (or newer).</P>
<H2><A NAME="ss4.3">4.3</A> <A HREF="#toc4.3">Mac OS X </A>
</H2>
<P>A Quakespasm App (including program launcher and update framework) can be made using the <B>Xcode</B> template found in the MacOSX directory.</P>
<P>Alternatively, have a look at <B>Makefile.darwin</B> for more instructions on building from a console.</P>
<H2><A NAME="s5">5.</A> <A HREF="#toc5">Known Bugs </A></H2>
<H2><A NAME="s5">5.</A> <A HREF="#toc5">Quake '2021 re-release' </A></H2>
<P>Brightness issues should be fixed with GLSL gamma in 0.90.1, if your system supports OpenGL 2. For reference on older systems:<BR>
Some versions of Xorg and SDL have brightness issues.<BR>
Try setting "export SDL_VIDEO_X11_NODIRECTCOLOR=1", or if you have Xorg >= 7.5 and broken brightness,
these patched libSDL binaries may help.
<P>QuakeSpasm 0.94.0 has initial support for playing the 2021 re-release content:
<UL>
<LI>
<A HREF="http://sf.net/projects/quakespasm/files/Support%20Files/libSDL_gamma_patched.tgz/download">Gamma patched libSDL (i686-linux)</A></LI>
<LI>
<A HREF="http://sf.net/projects/quakespasm/files/Support%20Files/libSDL_gamma_patched-AMD64.tgz/download">Gamma patched libSDL (x86_64-linux)</A></LI>
<LI> Copy the quakespasm exe to your rerelease installation.</LI>
<LI> Extract the localization folder from QuakeEX.kpf (which is actually a zip file), and place it in the rerelease directory. Linux (Unix) users can do the following, for example:<BR>
<PRE>
unzip QuakeEX.kpf localization/loc_english.txt
</PRE>
</LI>
<LI> Run quakespasm as you normally do.</LI>
</UL>
</P>
<H2><A NAME="s6">6.</A> <A HREF="#toc6">Changes</A></H2>
<H2><A NAME="ss6.1">6.1</A> <A HREF="#toc6.1">Changes in 0.93.3</A>
<H2><A NAME="ss6.1">6.1</A> <A HREF="#toc6.1">Changes in 0.94.0</A>
</H2>
<P>
<UL>
<LI> Initial support for playing the 'Quake 2021 re-release' content (thanks to Andrei Drexler for bulk of the work.)</LI>
<LI> Fix rendering bug when cl_bobcycle was set to zero (sf.net bug/41)</LI>
<LI> Fixed buffer overflow with large char skybox names (sf.net bug/38)</LI>
<LI> Fixed a missing MAXALIASFRAMES bounds check (sf.net bug/37)</LI>
<LI> OpenGL: workaround Intel UHD 600 driver bug (sf.net bug/39)</LI>
<LI> OpenGL: merged surface mark &amp; cull optimizations from vkQuake.</LI>
<LI> Changed 'model has a skin taller than 480' error into a warning</LI>
<LI> Reject lit files if they're the wrong size (eg hipnotic/start.bsp vs id1/start.lit or just a bsp that no longer has any coloured lits, etc)</LI>
<LI> External ent files are now versioned using 4 digit crc of the original map's ents, like e1m1@c49d.ent, which is much safer. The old method (e.g. e1m1.ent) still works but isn't recommended.</LI>
<LI> Support for external vis files.</LI>
<LI> Save: remove CR/LFs from level name to avoids broken saves, e.g. with autumn_sp map.</LI>
<LI> Music: improvements to mp3 tag detection / skipping.</LI>
<LI> Music: umx loader fix for malformed / crafted files.</LI>
@ -271,7 +265,7 @@ these patched libSDL binaries may help.
<LI> Lightmaps are now dynamically allocated (from QSS), and BLOCK_WIDTH/HEIGHT raised from 128 to 256.</LI>
<LI> Fixed several uncheked limits that would crash the Slayer's Testaments mod (sf.net bug #33).</LI>
<LI> Raised MAXALIASTRIS from 2048 to 4096, so that the Slayer's Testaments mod works.</LI>
<LI> Fixed 'pants' and 'shirt' types so that those textures load correctly on platforms where char is unsigned by default (sf.net bug #28).</LI>
<LI> Fixed 'pants' and 'shirt' types so that those textures load correctly on platforms where char type is unsigned by default (sf.net bug #28).</LI>
<LI> Windows audio: WASAPI-enabled SDL2 dlls function properly now.</LI>
<LI> Update the third-party libraries. Other fixes/cleanups.</LI>
</UL>
@ -311,11 +305,11 @@ these patched libSDL binaries may help.
<LI> Change default screenshot format to png. The 'screenshot' command now supports optional format (tga, png or jpg) and quality (1-100) arguments.</LI>
<LI> Revert "always run" changes from 0.85.9 and move the QuakeSpasm customizations to a new "cl_alwaysrun" cvar: Set to 1 in order to scale forward/side/up speed by "cl_movespeedkey" (usually 2), and to make "speedkey" act as "slowkey".</LI>
<LI> Change the "always run" menu option to offer three choices:
<UL>
<LI> off (cl_alwaysrun 0, cl_forwardspeed 200, cl_backspeed 200)</LI>
<LI> vanilla (cl_alwaysrun 0, cl_forwardspeed 400, cl_backspeed 400)</LI>
<LI> quakespasm (cl_alwaysrun 1, cl_forwardspeed 200, cl_backspeed 200)</LI>
</UL>
<PRE>
off (cl_alwaysrun 0, cl_forwardspeed 200, cl_backspeed 200)
vanilla (cl_alwaysrun 0, cl_forwardspeed 400, cl_backspeed 400)
quakespasm (cl_alwaysrun 1, cl_forwardspeed 200, cl_backspeed 200)
</PRE>
</LI>
<LI> New "r_scale" cvar. Set to 2, 3, or 4 to render the view at 1/2, 1/3, or 1/4 resolution.</LI>
<LI> New "r_viewmodel_quake" cvar. Set to 1 for WinQuake gun position (from MarkV).</LI>
@ -489,7 +483,8 @@ these patched libSDL binaries may help.
<P>
<UL>
<LI> Fix issues on Windows systems with DPI scaling.</LI>
<LI> Unix/Mac user directories support. Disabled by default, 'make DO_USERDIRS=1' to enable it.</LI>
<LI> Unix/Mac user directories support. Disabled by default,<BR>
'make DO_USERDIRS=1' to enable it.</LI>
<LI> SDL2 support. Disabled by default, 'make USE_SDL2=1' to enable it.</LI>
<LI> Revised keyboard input code.</LI>
<LI> Revised/improved the 'game' command, i.e. on-the-fly mod changing. It now accepts an optional second argument for mission packs or quoth support i.e. -hipnotic, -rogue, or -quoth. For example, for WarpSpasm: "game warp -quoth"</LI>
@ -710,16 +705,7 @@ these patched libSDL binaries may help.
</P>
<H2><A NAME="s7">7.</A> <A HREF="#toc7">Todo </A></H2>
<P>
<UL>
<LI>Add uHexen2's first person camera (and menu item)</LI>
<LI>Native CD audio support (if desired). cd_sdl.c doesn't have proper volume controls and SDL2 doesn't support CD audio</LI>
</UL>
</P>
<H2><A NAME="s8">8.</A> <A HREF="#toc8">Copyright </A></H2>
<H2><A NAME="s7">7.</A> <A HREF="#toc7">Copyright </A></H2>
<P>
<UL>
@ -730,7 +716,7 @@ these patched libSDL binaries may help.
</UL>
</P>
<H2><A NAME="s9">9.</A> <A HREF="#toc9">Contact </A></H2>
<H2><A NAME="s8">8.</A> <A HREF="#toc8">Contact </A></H2>
<P>
<UL>
@ -745,7 +731,7 @@ these patched libSDL binaries may help.
</UL>
</P>
<H2><A NAME="s10">10.</A> <A HREF="#toc10">Links </A></H2>
<H2><A NAME="s9">9.</A> <A HREF="#toc9">Links </A></H2>
<P>

View file

@ -17,9 +17,10 @@
4.2 Windows
4.3 Mac OS X
5. Known Bugs
5. Quake '2021 re-release'
6. Changes
6.1 Changes in 0.93.3
6.1 Changes in 0.94.0
6.2 Changes in 0.93.2
6.3 Changes in 0.93.1
6.4 Changes in 0.93.0
@ -48,21 +49,20 @@
6.17 Changes in 0.85.2
6.18 Changes in 0.85.1
7. Todo
8. Copyright
9. Contact
10. Links
7. Copyright
8. Contact
9. Links
______________________________________________________________________
Page last edited: August 2021
1. About
QuakeSpasm <http://quakespasm.sourceforge.net> is a modern, cross-
platform Quake 1 engine based on FitzQuake
platform Quake engine based on FitzQuake
<http://www.celephais.net/fitzquake>.
It includes support for 64 bit CPUs and custom music playback, a new
@ -81,9 +81,6 @@
o Latest code repository:
https://sourceforge.net/p/quakespasm/quakespasm/ci/master/tree/
o Automatic Builds (dead link):
http://quakespasm.ericwa.com/job/quakespasm-sdl2/
3. Hints
@ -110,10 +107,10 @@
cd_bsd.c etc..
o In windows, alternative CD drives are accessible by
"quakespasm -cddev F" (for example)
"quakespasm -cddev F" (for example)
o Quakespasm allows loading new games (mods) on the fly with
"game GAMENAME {-quoth/hipnotic/rogue}"
"game GAMENAME {-quoth/hipnotic/rogue}"
o Use "quakespasm -condebug" to save console log to "qconsole.log".
SDL2 builds no longer generate stdout.txt/stderr.txt.
@ -182,35 +179,22 @@
menu:
o Back - alias for TAB
o Start - alias for ESC
o DPad, analog sticks - mapped to arrow keys
o A Button - alias for ENTER in menus
o B Button - alias for ESC in menus
These buttons can be bound normally:
o LTRIGGER - Left trigger
o RTRIGGER - Right trigger
o LSHOULDER - Left shoulder button
o RSHOULDER - Right shoulder button
o LTHUMB - Clicking the left thumbstick
o RTHUMB - Clicking the right thumbstick
o ABUTTON
o BBUTTON
o XBUTTON
o YBUTTON
quakespasm.pak contains a default.cfg which has been updated to give
@ -247,14 +231,14 @@
o make DEBUG=1 for debugging
o make SDL_CONFIG=/PATH/TO/SDL-CONFIG for unusual SDL installations
o make SDL_CONFIG=/PATH/TO/sdl-config for unusual SDL installations
o make USE_SDL2=1 to compile against SDL2 instead of SDL-1.2
4.2. Windows
The QuakeSpasm developers cross-compile windows binaries using MinGW
<http://www.mingw.org> and Mingw-w64 <http://mingw-w64.sf.net>.
<http://www.mingw.org> and MinGW-w64 <http://mingw-w64.sf.net>.
The project can also be built using Visual Studio 2005 (or newer).
@ -267,27 +251,28 @@
building from a console.
5. Known Bugs
5. Quake '2021 re-release'
Brightness issues should be fixed with GLSL gamma in 0.90.1, if your
system supports OpenGL 2. For reference on older systems:
QuakeSpasm 0.94.0 has initial support for playing the 2021 re-release
content:
Some versions of Xorg and SDL have brightness issues.
Try setting "export SDL_VIDEO_X11_NODIRECTCOLOR=1", or if you have
Xorg >= 7.5 and broken brightness, these patched libSDL binaries may
help.
o Copy the quakespasm exe to your rerelease installation.
o Gamma patched libSDL (i686-linux)
http://sf.net/projects/quakespasm/files/Support%20Files/libSDL_gamma_patched.tgz/download
o Extract the localization folder from QuakeEX.kpf (which is actually
a zip file), and place it in the rerelease directory. Linux (Unix)
users can do the following, for example:
unzip QuakeEX.kpf localization/loc_english.txt
o Gamma patched libSDL (x86_64-linux)
http://sf.net/projects/quakespasm/files/Support%20Files/libSDL_gamma_patched-AMD64.tgz/download
o Run quakespasm as you normally do.
6. Changes
6.1. Changes in 0.93.3
6.1. Changes in 0.94.0
o Initial support for playing the 'Quake 2021 re-release' content
(thanks to Andrei Drexler for bulk of the work.)
o Fix rendering bug when cl_bobcycle was set to zero (sf.net bug/41)
@ -299,10 +284,18 @@
o OpenGL: merged surface mark & cull optimizations from vkQuake.
o Changed 'model has a skin taller than 480' error into a warning
o Reject lit files if they're the wrong size (eg hipnotic/start.bsp
vs id1/start.lit or just a bsp that no longer has any coloured
lits, etc)
o External ent files are now versioned using 4 digit crc of the
original map's ents, like e1m1@c49d.ent, which is much safer. The
old method (e.g. e1m1.ent) still works but isn't recommended.
o Support for external vis files.
o Save: remove CR/LFs from level name to avoids broken saves, e.g.
with autumn_sp map.
@ -321,22 +314,22 @@
6.2. Changes in 0.93.2
o Lightmaps are now dynamically allocated (from QSS), and
BLOCK_WIDTH/HEIGHT raised from 128 to 256.
o Lightmaps are now dynamically allocated (from QSS), and
BLOCK_WIDTH/HEIGHT raised from 128 to 256.
o Fixed several uncheked limits that would crash the Slayer's
Testaments mod (sf.net bug #33).
o Fixed several uncheked limits that would crash the Slayer's
Testaments mod (sf.net bug #33).
o Raised MAXALIASTRIS from 2048 to 4096, so that the Slayer's
Testaments mod works.
o Raised MAXALIASTRIS from 2048 to 4096, so that the Slayer's
Testaments mod works.
o Fixed 'pants' and 'shirt' types so that those textures load
correctly on platforms where char is unsigned by default
(sf.net bug #28).
o Fixed 'pants' and 'shirt' types so that those textures load
correctly on platforms where char type is unsigned by default
(sf.net bug #28).
o Windows audio: WASAPI-enabled SDL2 dlls function properly now.
o Windows audio: WASAPI-enabled SDL2 dlls function properly now.
o Update the third-party libraries. Other fixes/cleanups.
o Update the third-party libraries. Other fixes/cleanups.
6.3. Changes in 0.93.1
@ -348,7 +341,7 @@
o Fixed buttons crushing players in 64-bit builds.
o Change controller movement to use cubic easing by default; added
"joy_exponent_move" cvar.
"joy_exponent_move" cvar.
o config.cfg is no longer written in case of a Sys_Error.
@ -397,10 +390,10 @@
scale forward/side/up speed by "cl_movespeedkey" (usually 2), and
to make "speedkey" act as "slowkey".
o Change "always run" menu option to offer three choices:
- off (cl_alwaysrun 0, cl_forwardspeed 200, cl_backspeed 200)
- vanilla (cl_alwaysrun 0, cl_forwardspeed 400, cl_backspeed 400)
- quakespasm (cl_alwaysrun 1, cl_forwardspeed 200, cl_backspeed 200)
o Change the "always run" menu option to offer three choices:
off (cl_alwaysrun 0, cl_forwardspeed 200, cl_backspeed 200)
vanilla (cl_alwaysrun 0, cl_forwardspeed 400, cl_backspeed 400)
quakespasm (cl_alwaysrun 1, cl_forwardspeed 200, cl_backspeed 200)
o New "r_scale" cvar. Set to 2, 3, or 4 to render the view at 1/2,
1/3, or 1/4 resolution.
@ -1032,15 +1025,7 @@
r_wateralpha, r_dynamic, r_novis
7. Todo
o Add uHexen2's first person camera (and menu item)
o Native CD audio support (if desired). cd_sdl.c doesn't have proper
volume controls and SDL2 doesn't support CD audio
8. Copyright
7. Copyright
o Quake and Quakespasm are released under the GNU GENERAL PUBLIC
LICENSE Version 2: http://www.gnu.org/licenses/gpl-2.0.html
@ -1050,7 +1035,7 @@
http://creativecommons.org/licenses/by/3.0/legalcode
9. Contact
8. Contact
o QuakeSpasm Project page:
https://sourceforge.net/projects/quakespasm/
@ -1063,7 +1048,7 @@
Sander <mailto:gmail - dot - com - username - a.h.vandijk>
10. Links
9. Links
o QuakeSpasm Homepage: http://quakespasm.sourceforge.net

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -1,6 +1,10 @@
#ifndef XMP_H
#define XMP_H
#if defined(EMSCRIPTEN)
# include <emscripten.h>
#endif
#ifdef __cplusplus
extern "C" {
#endif
@ -26,7 +30,6 @@ extern "C" {
#elif defined(__SUNPRO_C) && defined(XMP_LDSCOPE_GLOBAL)
# define LIBXMP_EXPORT __global
#elif defined(EMSCRIPTEN)
# include <emscripten.h>
# define LIBXMP_EXPORT EMSCRIPTEN_KEEPALIVE
# define LIBXMP_EXPORT_VAR
#else

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -1,167 +0,0 @@
; Definition file of vulkan-1.dll
; Automatic generated by gendef
; written by Kai Tietz 2008
;
; generated from VulkanSDK/1.0.54.0/Source/lib/vulkan-1.dll
; to build an import library:
; x86_64-w64-mingw32-dlltool --as-flags=--64 -m i386:x86-64 -k --as=x86_64-w64-mingw32-as --output-lib libvulkan-1.dll.a --input-def vulkan-1.def
;
LIBRARY "vulkan-1.dll"
EXPORTS
vkAcquireNextImageKHR
vkAllocateCommandBuffers
vkAllocateDescriptorSets
vkAllocateMemory
vkBeginCommandBuffer
vkBindBufferMemory
vkBindImageMemory
vkCmdBeginQuery
vkCmdBeginRenderPass
vkCmdBindDescriptorSets
vkCmdBindIndexBuffer
vkCmdBindPipeline
vkCmdBindVertexBuffers
vkCmdBlitImage
vkCmdClearAttachments
vkCmdClearColorImage
vkCmdClearDepthStencilImage
vkCmdCopyBuffer
vkCmdCopyBufferToImage
vkCmdCopyImage
vkCmdCopyImageToBuffer
vkCmdCopyQueryPoolResults
vkCmdDispatch
vkCmdDispatchIndirect
vkCmdDraw
vkCmdDrawIndexed
vkCmdDrawIndexedIndirect
vkCmdDrawIndirect
vkCmdEndQuery
vkCmdEndRenderPass
vkCmdExecuteCommands
vkCmdFillBuffer
vkCmdNextSubpass
vkCmdPipelineBarrier
vkCmdPushConstants
vkCmdResetEvent
vkCmdResetQueryPool
vkCmdResolveImage
vkCmdSetBlendConstants
vkCmdSetDepthBias
vkCmdSetDepthBounds
vkCmdSetEvent
vkCmdSetLineWidth
vkCmdSetScissor
vkCmdSetStencilCompareMask
vkCmdSetStencilReference
vkCmdSetStencilWriteMask
vkCmdSetViewport
vkCmdUpdateBuffer
vkCmdWaitEvents
vkCmdWriteTimestamp
vkCreateBuffer
vkCreateBufferView
vkCreateCommandPool
vkCreateComputePipelines
vkCreateDescriptorPool
vkCreateDescriptorSetLayout
vkCreateDevice
vkCreateDisplayModeKHR
vkCreateDisplayPlaneSurfaceKHR
vkCreateEvent
vkCreateFence
vkCreateFramebuffer
vkCreateGraphicsPipelines
vkCreateImage
vkCreateImageView
vkCreateInstance
vkCreatePipelineCache
vkCreatePipelineLayout
vkCreateQueryPool
vkCreateRenderPass
vkCreateSampler
vkCreateSemaphore
vkCreateShaderModule
vkCreateSharedSwapchainsKHR
vkCreateSwapchainKHR
vkCreateWin32SurfaceKHR
vkDestroyBuffer
vkDestroyBufferView
vkDestroyCommandPool
vkDestroyDescriptorPool
vkDestroyDescriptorSetLayout
vkDestroyDevice
vkDestroyEvent
vkDestroyFence
vkDestroyFramebuffer
vkDestroyImage
vkDestroyImageView
vkDestroyInstance
vkDestroyPipeline
vkDestroyPipelineCache
vkDestroyPipelineLayout
vkDestroyQueryPool
vkDestroyRenderPass
vkDestroySampler
vkDestroySemaphore
vkDestroyShaderModule
vkDestroySurfaceKHR
vkDestroySwapchainKHR
vkDeviceWaitIdle
vkEndCommandBuffer
vkEnumerateDeviceExtensionProperties
vkEnumerateDeviceLayerProperties
vkEnumerateInstanceExtensionProperties
vkEnumerateInstanceLayerProperties
vkEnumeratePhysicalDevices
vkFlushMappedMemoryRanges
vkFreeCommandBuffers
vkFreeDescriptorSets
vkFreeMemory
vkGetBufferMemoryRequirements
vkGetDeviceMemoryCommitment
vkGetDeviceProcAddr
vkGetDeviceQueue
vkGetDisplayModePropertiesKHR
vkGetDisplayPlaneCapabilitiesKHR
vkGetDisplayPlaneSupportedDisplaysKHR
vkGetEventStatus
vkGetFenceStatus
vkGetImageMemoryRequirements
vkGetImageSparseMemoryRequirements
vkGetImageSubresourceLayout
vkGetInstanceProcAddr
vkGetPhysicalDeviceDisplayPlanePropertiesKHR
vkGetPhysicalDeviceDisplayPropertiesKHR
vkGetPhysicalDeviceFeatures
vkGetPhysicalDeviceFormatProperties
vkGetPhysicalDeviceImageFormatProperties
vkGetPhysicalDeviceMemoryProperties
vkGetPhysicalDeviceProperties
vkGetPhysicalDeviceQueueFamilyProperties
vkGetPhysicalDeviceSparseImageFormatProperties
vkGetPhysicalDeviceSurfaceCapabilitiesKHR
vkGetPhysicalDeviceSurfaceFormatsKHR
vkGetPhysicalDeviceSurfacePresentModesKHR
vkGetPhysicalDeviceSurfaceSupportKHR
vkGetPhysicalDeviceWin32PresentationSupportKHR
vkGetPipelineCacheData
vkGetQueryPoolResults
vkGetRenderAreaGranularity
vkGetSwapchainImagesKHR
vkInvalidateMappedMemoryRanges
vkMapMemory
vkMergePipelineCaches
vkQueueBindSparse
vkQueuePresentKHR
vkQueueSubmit
vkQueueWaitIdle
vkResetCommandBuffer
vkResetCommandPool
vkResetDescriptorPool
vkResetEvent
vkResetFences
vkSetEvent
vkUnmapMemory
vkUpdateDescriptorSets
vkWaitForFences

Binary file not shown.

View file

@ -1,167 +0,0 @@
; Definition file of vulkan-1.dll
; Automatic generated by gendef
; written by Kai Tietz 2008
;
; generated from VulkanSDK/1.0.54.0/Source/lib32/vulkan-1.dll
; to build an import library:
; i686-w64-mingw32-dlltool --as-flags=--32 -m i386 -k --as=i686-w64-mingw32-as --output-lib libvulkan-1.dll.a --input-def vulkan-1.def
;
LIBRARY "vulkan-1.dll"
EXPORTS
vkAcquireNextImageKHR@40
vkAllocateCommandBuffers@12
vkAllocateDescriptorSets@12
vkAllocateMemory@16
vkBeginCommandBuffer@8
vkBindBufferMemory@28
vkBindImageMemory@28
vkCmdBeginQuery@20
vkCmdBeginRenderPass@12
vkCmdBindDescriptorSets@36
vkCmdBindIndexBuffer@24
vkCmdBindPipeline@16
vkCmdBindVertexBuffers@20
vkCmdBlitImage@40
vkCmdClearAttachments@20
vkCmdClearColorImage@28
vkCmdClearDepthStencilImage@28
vkCmdCopyBuffer@28
vkCmdCopyBufferToImage@32
vkCmdCopyImage@36
vkCmdCopyImageToBuffer@32
vkCmdCopyQueryPoolResults@48
vkCmdDispatch@16
vkCmdDispatchIndirect@20
vkCmdDraw@20
vkCmdDrawIndexed@24
vkCmdDrawIndexedIndirect@28
vkCmdDrawIndirect@28
vkCmdEndQuery@16
vkCmdEndRenderPass@4
vkCmdExecuteCommands@12
vkCmdFillBuffer@32
vkCmdNextSubpass@8
vkCmdPipelineBarrier@40
vkCmdPushConstants@28
vkCmdResetEvent@16
vkCmdResetQueryPool@20
vkCmdResolveImage@36
vkCmdSetBlendConstants@8
vkCmdSetDepthBias@16
vkCmdSetDepthBounds@12
vkCmdSetEvent@16
vkCmdSetLineWidth@8
vkCmdSetScissor@16
vkCmdSetStencilCompareMask@12
vkCmdSetStencilReference@12
vkCmdSetStencilWriteMask@12
vkCmdSetViewport@16
vkCmdUpdateBuffer@32
vkCmdWaitEvents@44
vkCmdWriteTimestamp@20
vkCreateBuffer@16
vkCreateBufferView@16
vkCreateCommandPool@16
vkCreateComputePipelines@28
vkCreateDescriptorPool@16
vkCreateDescriptorSetLayout@16
vkCreateDevice@16
vkCreateDisplayModeKHR@24
vkCreateDisplayPlaneSurfaceKHR@16
vkCreateEvent@16
vkCreateFence@16
vkCreateFramebuffer@16
vkCreateGraphicsPipelines@28
vkCreateImage@16
vkCreateImageView@16
vkCreateInstance@12
vkCreatePipelineCache@16
vkCreatePipelineLayout@16
vkCreateQueryPool@16
vkCreateRenderPass@16
vkCreateSampler@16
vkCreateSemaphore@16
vkCreateShaderModule@16
vkCreateSharedSwapchainsKHR@20
vkCreateSwapchainKHR@16
vkCreateWin32SurfaceKHR@16
vkDestroyBuffer@16
vkDestroyBufferView@16
vkDestroyCommandPool@16
vkDestroyDescriptorPool@16
vkDestroyDescriptorSetLayout@16
vkDestroyDevice@8
vkDestroyEvent@16
vkDestroyFence@16
vkDestroyFramebuffer@16
vkDestroyImage@16
vkDestroyImageView@16
vkDestroyInstance@8
vkDestroyPipeline@16
vkDestroyPipelineCache@16
vkDestroyPipelineLayout@16
vkDestroyQueryPool@16
vkDestroyRenderPass@16
vkDestroySampler@16
vkDestroySemaphore@16
vkDestroyShaderModule@16
vkDestroySurfaceKHR@16
vkDestroySwapchainKHR@16
vkDeviceWaitIdle@4
vkEndCommandBuffer@4
vkEnumerateDeviceExtensionProperties@16
vkEnumerateDeviceLayerProperties@12
vkEnumerateInstanceExtensionProperties@12
vkEnumerateInstanceLayerProperties@8
vkEnumeratePhysicalDevices@12
vkFlushMappedMemoryRanges@12
vkFreeCommandBuffers@20
vkFreeDescriptorSets@20
vkFreeMemory@16
vkGetBufferMemoryRequirements@16
vkGetDeviceMemoryCommitment@16
vkGetDeviceProcAddr@8
vkGetDeviceQueue@16
vkGetDisplayModePropertiesKHR@20
vkGetDisplayPlaneCapabilitiesKHR@20
vkGetDisplayPlaneSupportedDisplaysKHR@16
vkGetEventStatus@12
vkGetFenceStatus@12
vkGetImageMemoryRequirements@16
vkGetImageSparseMemoryRequirements@20
vkGetImageSubresourceLayout@20
vkGetInstanceProcAddr@8
vkGetPhysicalDeviceDisplayPlanePropertiesKHR@12
vkGetPhysicalDeviceDisplayPropertiesKHR@12
vkGetPhysicalDeviceFeatures@8
vkGetPhysicalDeviceFormatProperties@12
vkGetPhysicalDeviceImageFormatProperties@28
vkGetPhysicalDeviceMemoryProperties@8
vkGetPhysicalDeviceProperties@8
vkGetPhysicalDeviceQueueFamilyProperties@12
vkGetPhysicalDeviceSparseImageFormatProperties@32
vkGetPhysicalDeviceSurfaceCapabilitiesKHR@16
vkGetPhysicalDeviceSurfaceFormatsKHR@20
vkGetPhysicalDeviceSurfacePresentModesKHR@20
vkGetPhysicalDeviceSurfaceSupportKHR@20
vkGetPhysicalDeviceWin32PresentationSupportKHR@8
vkGetPipelineCacheData@20
vkGetQueryPoolResults@40
vkGetRenderAreaGranularity@16
vkGetSwapchainImagesKHR@20
vkInvalidateMappedMemoryRanges@12
vkMapMemory@36
vkMergePipelineCaches@20
vkQueueBindSparse@20
vkQueuePresentKHR@8
vkQueueSubmit@20
vkQueueWaitIdle@4
vkResetCommandBuffer@8
vkResetCommandPool@16
vkResetDescriptorPool@16
vkResetEvent@12
vkResetFences@12
vkSetEvent@12
vkUnmapMemory@12
vkUpdateDescriptorSets@20
vkWaitForFences@24