mirror of
https://github.com/Shpoike/Quakespasm.git
synced 2025-03-11 04:20:51 +00:00
Merge remote-tracking branch 'sf/master' into qss
This commit is contained in:
commit
0f1c4fca19
28 changed files with 604 additions and 397 deletions
|
@ -3,7 +3,7 @@
|
||||||
<title>QuakeSpasm
|
<title>QuakeSpasm
|
||||||
<toc>
|
<toc>
|
||||||
|
|
||||||
<em>Page last edited: June 2022.</em>
|
<em>Page last edited: July 2022.</em>
|
||||||
|
|
||||||
<sect> About <p>
|
<sect> About <p>
|
||||||
|
|
||||||
|
@ -131,11 +131,20 @@ Alternatively, have a look at <bf>Makefile.darwin</bf> for more instructions on
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<sect1> Quake '2021 re-release' <p>
|
<sect1> Quake '2021 re-release' <p>
|
||||||
QuakeSpasm 0.94.0 has initial support for playing the 2021 re-release content: Copy the quakespasm binary to your rerelease installation and run quakespasm as you normally do.</p>
|
QuakeSpasm 0.94 has support for playing the 2021 re-release content: Copy the quakespasm binary to your rerelease installation and run as you normally do.</p>
|
||||||
|
|
||||||
|
|
||||||
<sect> Changes<p>
|
<sect> Changes<p>
|
||||||
|
|
||||||
|
<sect1> Changes in 0.94.7<p>
|
||||||
|
<itemize>
|
||||||
|
<item> Fix console history buffer wrapping.
|
||||||
|
<item> Fix wrong external texture use after vid_restart.
|
||||||
|
<item> Update lodepng from mainstream git.
|
||||||
|
<item> Miscellaneous source code cleanups.
|
||||||
|
</itemize>
|
||||||
|
</p>
|
||||||
|
|
||||||
<sect1> Changes in 0.94.6<p>
|
<sect1> Changes in 0.94.6<p>
|
||||||
<itemize>
|
<itemize>
|
||||||
<item> Server protocol size check fixes for sounds and particles.
|
<item> Server protocol size check fixes for sounds and particles.
|
||||||
|
|
Binary file not shown.
|
@ -17,7 +17,7 @@
|
||||||
<key>CFBundlePackageType</key>
|
<key>CFBundlePackageType</key>
|
||||||
<string>APPL</string>
|
<string>APPL</string>
|
||||||
<key>CFBundleShortVersionString</key>
|
<key>CFBundleShortVersionString</key>
|
||||||
<string>0.94.6</string>
|
<string>0.94.7</string>
|
||||||
<key>CFBundleSignature</key>
|
<key>CFBundleSignature</key>
|
||||||
<string>????</string>
|
<string>????</string>
|
||||||
<key>LSApplicationCategoryType</key>
|
<key>LSApplicationCategoryType</key>
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
allow plain files to override files inside a PAK file -- Sander van Dijk.
|
allow plain files to override files inside a PAK file -- Sander van Dijk.
|
||||||
|
|
||||||
diff --git a/Quake/common.c b/Quake/common.c
|
diff --git a/Quake/common.c b/Quake/common.c
|
||||||
index bd246f1..2326383 100644
|
index eff4c30..1478d77 100644
|
||||||
--- a/Quake/common.c
|
--- a/Quake/common.c
|
||||||
+++ b/Quake/common.c
|
+++ b/Quake/common.c
|
||||||
@@ -2039,13 +2039,6 @@ static void COM_AddGameDirectory (const char *base, const char *dir)
|
@@ -2030,13 +2030,6 @@ static void COM_AddGameDirectory (const char *base, const char *dir)
|
||||||
else path_id = 1U;
|
else path_id = 1U;
|
||||||
|
|
||||||
_add_path:
|
_add_path:
|
||||||
|
@ -18,7 +18,7 @@ index bd246f1..2326383 100644
|
||||||
// add any pak files in the format pak0.pak pak1.pak, ...
|
// add any pak files in the format pak0.pak pak1.pak, ...
|
||||||
for (i = 0; ; i++)
|
for (i = 0; ; i++)
|
||||||
{
|
{
|
||||||
@@ -2077,6 +2070,13 @@ _add_path:
|
@@ -2068,6 +2061,13 @@ _add_path:
|
||||||
if (!pak) break;
|
if (!pak) break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,17 +1,17 @@
|
||||||
diff --git a/Quake/gl_model.c b/Quake/gl_model.c
|
diff --git a/Quake/gl_model.c b/Quake/gl_model.c
|
||||||
index 94f0023..fdb8c4c 100644
|
index d193051..783dc4d 100644
|
||||||
--- a/Quake/gl_model.c
|
--- a/Quake/gl_model.c
|
||||||
+++ b/Quake/gl_model.c
|
+++ b/Quake/gl_model.c
|
||||||
@@ -37,6 +37,8 @@ qmodel_t *Mod_LoadModel (qmodel_t *mod, qboolean crash);
|
@@ -39,6 +39,8 @@ static void Mod_Print (void);
|
||||||
cvar_t external_ents = {"external_ents", "1", CVAR_ARCHIVE};
|
static cvar_t external_ents = {"external_ents", "1", CVAR_ARCHIVE};
|
||||||
cvar_t external_vis = {"external_vis", "1", CVAR_ARCHIVE};
|
static cvar_t external_vis = {"external_vis", "1", CVAR_ARCHIVE};
|
||||||
|
|
||||||
+extern cvar_t r_externaltexture_fix; //mk
|
+extern cvar_t r_externaltexture_fix; //mk
|
||||||
+
|
+
|
||||||
static byte *mod_novis;
|
static byte *mod_novis;
|
||||||
static int mod_novis_capacity;
|
static int mod_novis_capacity;
|
||||||
|
|
||||||
@@ -534,6 +536,13 @@ void Mod_LoadTextures (lump_t *l)
|
@@ -542,6 +544,13 @@ static void Mod_LoadTextures (lump_t *l)
|
||||||
{
|
{
|
||||||
if (!q_strncasecmp(tx->name,"sky",3)) //sky texture //also note -- was Q_strncmp, changed to match qbsp
|
if (!q_strncasecmp(tx->name,"sky",3)) //sky texture //also note -- was Q_strncmp, changed to match qbsp
|
||||||
{
|
{
|
||||||
|
@ -23,9 +23,9 @@ index 94f0023..fdb8c4c 100644
|
||||||
+ }
|
+ }
|
||||||
+ }
|
+ }
|
||||||
if (loadmodel->bspversion == BSPVERSION_QUAKE64)
|
if (loadmodel->bspversion == BSPVERSION_QUAKE64)
|
||||||
Sky_LoadTextureQ64 (tx);
|
Sky_LoadTextureQ64 (loadmodel, tx);
|
||||||
else
|
else
|
||||||
@@ -588,6 +597,50 @@ void Mod_LoadTextures (lump_t *l)
|
@@ -596,6 +605,50 @@ static void Mod_LoadTextures (lump_t *l)
|
||||||
//external textures -- first look in "textures/mapname/" then look in "textures/"
|
//external textures -- first look in "textures/mapname/" then look in "textures/"
|
||||||
mark = Hunk_LowMark ();
|
mark = Hunk_LowMark ();
|
||||||
COM_StripExtension (loadmodel->name + 5, mapname, sizeof(mapname));
|
COM_StripExtension (loadmodel->name + 5, mapname, sizeof(mapname));
|
||||||
|
@ -77,10 +77,10 @@ index 94f0023..fdb8c4c 100644
|
||||||
data = Image_LoadImage (filename, &fwidth, &fheight);
|
data = Image_LoadImage (filename, &fwidth, &fheight);
|
||||||
if (!data)
|
if (!data)
|
||||||
diff --git a/Quake/gl_rmain.c b/Quake/gl_rmain.c
|
diff --git a/Quake/gl_rmain.c b/Quake/gl_rmain.c
|
||||||
index a41d8b1..b0020c5 100644
|
index 332ab1e..783a9d6 100644
|
||||||
--- a/Quake/gl_rmain.c
|
--- a/Quake/gl_rmain.c
|
||||||
+++ b/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
|
@@ -99,6 +99,8 @@ cvar_t r_noshadow_list = {"r_noshadow_list", "progs/flame2.mdl,progs/flame.mdl,p
|
||||||
extern cvar_t r_vfog;
|
extern cvar_t r_vfog;
|
||||||
//johnfitz
|
//johnfitz
|
||||||
|
|
||||||
|
@ -90,7 +90,7 @@ index a41d8b1..b0020c5 100644
|
||||||
|
|
||||||
cvar_t r_lavaalpha = {"r_lavaalpha","0",CVAR_NONE};
|
cvar_t r_lavaalpha = {"r_lavaalpha","0",CVAR_NONE};
|
||||||
diff --git a/Quake/gl_rmisc.c b/Quake/gl_rmisc.c
|
diff --git a/Quake/gl_rmisc.c b/Quake/gl_rmisc.c
|
||||||
index dfdb84d..9c441bd 100644
|
index dc3dff0..dbfe922 100644
|
||||||
--- a/Quake/gl_rmisc.c
|
--- a/Quake/gl_rmisc.c
|
||||||
+++ b/Quake/gl_rmisc.c
|
+++ b/Quake/gl_rmisc.c
|
||||||
@@ -47,6 +47,7 @@ extern cvar_t r_nolerp_list;
|
@@ -47,6 +47,7 @@ extern cvar_t r_nolerp_list;
|
||||||
|
@ -109,4 +109,3 @@ index dfdb84d..9c441bd 100644
|
||||||
|
|
||||||
Cvar_RegisterVariable (&gl_zfix); // QuakeSpasm z-fighting fix
|
Cvar_RegisterVariable (&gl_zfix); // QuakeSpasm z-fighting fix
|
||||||
Cvar_RegisterVariable (&r_lavaalpha);
|
Cvar_RegisterVariable (&r_lavaalpha);
|
||||||
|
|
||||||
|
|
|
@ -2146,8 +2146,6 @@ called when the particle system has changed, and any cached indexes are now prob
|
||||||
*/
|
*/
|
||||||
void CL_RegisterParticles(void)
|
void CL_RegisterParticles(void)
|
||||||
{
|
{
|
||||||
extern qmodel_t mod_known[];
|
|
||||||
extern int mod_numknown;
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (cl.protocol == PROTOCOL_VERSION_DP7) //dpp7 sucks.
|
if (cl.protocol == PROTOCOL_VERSION_DP7) //dpp7 sucks.
|
||||||
|
@ -2163,8 +2161,7 @@ void CL_RegisterParticles(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
//and make sure models get the right effects+trails etc too
|
//and make sure models get the right effects+trails etc too
|
||||||
for (i = 0; i < mod_numknown; i++)
|
Mod_ForEachModel(PScript_UpdateModelEffects);
|
||||||
PScript_UpdateModelEffects(&mod_known[i]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -3010,6 +3010,7 @@ static void COM_Game_f (void)
|
||||||
if (!isDedicated)
|
if (!isDedicated)
|
||||||
Draw_ReloadTextures(true);
|
Draw_ReloadTextures(true);
|
||||||
ExtraMaps_NewGame ();
|
ExtraMaps_NewGame ();
|
||||||
|
Host_Resetdemos ();
|
||||||
DemoList_Rebuild ();
|
DemoList_Rebuild ();
|
||||||
|
|
||||||
Con_Printf("\"game\" changed to \"%s\"\n", COM_GetGameNames(true));
|
Con_Printf("\"game\" changed to \"%s\"\n", COM_GetGameNames(true));
|
||||||
|
|
147
Quake/gl_model.c
147
Quake/gl_model.c
|
@ -31,19 +31,21 @@ extern gltexture_t *playertextures[MAX_SCOREBOARD]; //spike - to ensure skins do
|
||||||
qmodel_t *loadmodel;
|
qmodel_t *loadmodel;
|
||||||
char loadname[32]; // for hunk tags
|
char loadname[32]; // for hunk tags
|
||||||
|
|
||||||
void Mod_LoadSpriteModel (qmodel_t *mod, void *buffer);
|
static void Mod_LoadSpriteModel (qmodel_t *mod, void *buffer);
|
||||||
void Mod_LoadBrushModel (qmodel_t *mod, void *buffer);
|
static void Mod_LoadBrushModel (qmodel_t *mod, void *buffer);
|
||||||
void Mod_LoadAliasModel (qmodel_t *mod, void *buffer, int pvtype);
|
static void Mod_LoadAliasModel (qmodel_t *mod, void *buffer, int pvtype);
|
||||||
void Mod_LoadMD3Model (qmodel_t *mod, void *buffer);
|
void Mod_LoadMD3Model (qmodel_t *mod, void *buffer);
|
||||||
void Mod_LoadMD5MeshModel (qmodel_t *mod, void *buffer);
|
void Mod_LoadMD5MeshModel (qmodel_t *mod, void *buffer);
|
||||||
void Mod_LoadIQMModel (qmodel_t *mod, const void *buffer);
|
void Mod_LoadIQMModel (qmodel_t *mod, const void *buffer);
|
||||||
qmodel_t *Mod_LoadModel (qmodel_t *mod, qboolean crash);
|
static qmodel_t *Mod_LoadModel (qmodel_t *mod, qboolean crash);
|
||||||
|
|
||||||
cvar_t external_ents = {"external_ents", "1", CVAR_ARCHIVE};
|
static void Mod_Print (void);
|
||||||
|
|
||||||
|
static cvar_t external_ents = {"external_ents", "1", CVAR_ARCHIVE};
|
||||||
cvar_t gl_load24bit = {"gl_load24bit", "1", CVAR_ARCHIVE};
|
cvar_t gl_load24bit = {"gl_load24bit", "1", CVAR_ARCHIVE};
|
||||||
cvar_t mod_ignorelmscale = {"mod_ignorelmscale", "0"};
|
static cvar_t mod_ignorelmscale = {"mod_ignorelmscale", "0"};
|
||||||
cvar_t r_replacemodels = {"r_replacemodels", "", CVAR_ARCHIVE};
|
cvar_t r_replacemodels = {"r_replacemodels", "", CVAR_ARCHIVE};
|
||||||
cvar_t external_vis = {"external_vis", "1", CVAR_ARCHIVE};
|
static cvar_t external_vis = {"external_vis", "1", CVAR_ARCHIVE};
|
||||||
|
|
||||||
static byte *mod_novis;
|
static byte *mod_novis;
|
||||||
static int mod_novis_capacity;
|
static int mod_novis_capacity;
|
||||||
|
@ -52,8 +54,8 @@ static byte *mod_decompressed;
|
||||||
static int mod_decompressed_capacity;
|
static int mod_decompressed_capacity;
|
||||||
|
|
||||||
#define MAX_MOD_KNOWN 8192 /*spike -- new value, was 2048 in qs, 512 in vanilla. Needs to be big for big maps with many many inline models. */
|
#define MAX_MOD_KNOWN 8192 /*spike -- new value, was 2048 in qs, 512 in vanilla. Needs to be big for big maps with many many inline models. */
|
||||||
qmodel_t mod_known[MAX_MOD_KNOWN];
|
static qmodel_t mod_known[MAX_MOD_KNOWN];
|
||||||
int mod_numknown;
|
static int mod_numknown;
|
||||||
|
|
||||||
texture_t *r_notexture_mip; //johnfitz -- moved here from r_main.c
|
texture_t *r_notexture_mip; //johnfitz -- moved here from r_main.c
|
||||||
texture_t *r_notexture_mip2; //johnfitz -- used for non-lightmapped surfs with a missing texture
|
texture_t *r_notexture_mip2; //johnfitz -- used for non-lightmapped surfs with a missing texture
|
||||||
|
@ -72,6 +74,8 @@ void Mod_Init (void)
|
||||||
Cvar_RegisterVariable (&r_replacemodels);
|
Cvar_RegisterVariable (&r_replacemodels);
|
||||||
Cvar_RegisterVariable (&mod_ignorelmscale);
|
Cvar_RegisterVariable (&mod_ignorelmscale);
|
||||||
|
|
||||||
|
Cmd_AddCommand ("mcache", Mod_Print);
|
||||||
|
|
||||||
//johnfitz -- create notexture miptex
|
//johnfitz -- create notexture miptex
|
||||||
r_notexture_mip = (texture_t *) Hunk_AllocName (sizeof(texture_t), "r_notexture_mip");
|
r_notexture_mip = (texture_t *) Hunk_AllocName (sizeof(texture_t), "r_notexture_mip");
|
||||||
strcpy (r_notexture_mip->name, "notexture");
|
strcpy (r_notexture_mip->name, "notexture");
|
||||||
|
@ -141,7 +145,7 @@ mleaf_t *Mod_PointInLeaf (vec3_t p, qmodel_t *model)
|
||||||
Mod_DecompressVis
|
Mod_DecompressVis
|
||||||
===================
|
===================
|
||||||
*/
|
*/
|
||||||
byte *Mod_DecompressVis (byte *in, qmodel_t *model)
|
static byte *Mod_DecompressVis (byte *in, qmodel_t *model)
|
||||||
{
|
{
|
||||||
int c;
|
int c;
|
||||||
byte *out;
|
byte *out;
|
||||||
|
@ -234,12 +238,14 @@ void Mod_ClearAll (void)
|
||||||
qmodel_t *mod;
|
qmodel_t *mod;
|
||||||
|
|
||||||
for (i=0 , mod=mod_known ; i<mod_numknown ; i++, mod++)
|
for (i=0 , mod=mod_known ; i<mod_numknown ; i++, mod++)
|
||||||
|
{
|
||||||
if (mod->type != mod_alias)
|
if (mod->type != mod_alias)
|
||||||
{
|
{
|
||||||
mod->needload = true;
|
mod->needload = true;
|
||||||
TexMgr_FreeTexturesForOwner (mod); //johnfitz
|
TexMgr_FreeTexturesForOwner (mod); //johnfitz
|
||||||
PScript_ClearSurfaceParticles(mod);
|
PScript_ClearSurfaceParticles(mod);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Mod_ResetAll (void)
|
void Mod_ResetAll (void)
|
||||||
|
@ -249,7 +255,7 @@ void Mod_ResetAll (void)
|
||||||
|
|
||||||
//ericw -- free alias model VBOs
|
//ericw -- free alias model VBOs
|
||||||
GLMesh_DeleteVertexBuffers ();
|
GLMesh_DeleteVertexBuffers ();
|
||||||
|
|
||||||
for (i=0 , mod=mod_known ; i<mod_numknown ; i++, mod++)
|
for (i=0 , mod=mod_known ; i<mod_numknown ; i++, mod++)
|
||||||
{
|
{
|
||||||
if (!mod->needload) //otherwise Mod_ClearAll() did it already
|
if (!mod->needload) //otherwise Mod_ClearAll() did it already
|
||||||
|
@ -262,13 +268,23 @@ void Mod_ResetAll (void)
|
||||||
mod_numknown = 0;
|
mod_numknown = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Mod_ForEachModel(void(*callback)(qmodel_t *mod))
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
qmodel_t *mod;
|
||||||
|
for (i=0 , mod=mod_known ; i<mod_numknown ; i++, mod++)
|
||||||
|
{
|
||||||
|
callback(mod);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
==================
|
==================
|
||||||
Mod_FindName
|
Mod_FindName
|
||||||
|
|
||||||
==================
|
==================
|
||||||
*/
|
*/
|
||||||
qmodel_t *Mod_FindName (const char *name)
|
static qmodel_t *Mod_FindName (const char *name)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
qmodel_t *mod;
|
qmodel_t *mod;
|
||||||
|
@ -280,8 +296,10 @@ qmodel_t *Mod_FindName (const char *name)
|
||||||
// search the currently loaded models
|
// search the currently loaded models
|
||||||
//
|
//
|
||||||
for (i=0 , mod=mod_known ; i<mod_numknown ; i++, mod++)
|
for (i=0 , mod=mod_known ; i<mod_numknown ; i++, mod++)
|
||||||
|
{
|
||||||
if (!strcmp (mod->name, name) )
|
if (!strcmp (mod->name, name) )
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if (i == mod_numknown)
|
if (i == mod_numknown)
|
||||||
{
|
{
|
||||||
|
@ -321,7 +339,7 @@ Mod_LoadModel
|
||||||
Loads a model into the cache
|
Loads a model into the cache
|
||||||
==================
|
==================
|
||||||
*/
|
*/
|
||||||
qmodel_t *Mod_LoadModel (qmodel_t *mod, qboolean crash)
|
static qmodel_t *Mod_LoadModel (qmodel_t *mod, qboolean crash)
|
||||||
{
|
{
|
||||||
byte *buf;
|
byte *buf;
|
||||||
byte stackbuf[1024]; // avoid dirtying the cache heap
|
byte stackbuf[1024]; // avoid dirtying the cache heap
|
||||||
|
@ -585,12 +603,14 @@ static void Q1BSPX_Setup(qmodel_t *mod, char *filebase, unsigned int filelen, lu
|
||||||
Mod_CheckFullbrights -- johnfitz
|
Mod_CheckFullbrights -- johnfitz
|
||||||
=================
|
=================
|
||||||
*/
|
*/
|
||||||
qboolean Mod_CheckFullbrights (byte *pixels, int count)
|
static qboolean Mod_CheckFullbrights (byte *pixels, int count)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
for (i = 0; i < count; i++)
|
for (i = 0; i < count; i++)
|
||||||
|
{
|
||||||
if (*pixels++ > 223)
|
if (*pixels++ > 223)
|
||||||
return true;
|
return true;
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -700,7 +720,7 @@ Quake64 bsp
|
||||||
Check if we have any missing textures in the array
|
Check if we have any missing textures in the array
|
||||||
=================
|
=================
|
||||||
*/
|
*/
|
||||||
qboolean Mod_CheckAnimTextureArrayQ64(texture_t *anims[], int numTex)
|
static qboolean Mod_CheckAnimTextureArrayQ64(texture_t *anims[], int numTex)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
@ -717,7 +737,7 @@ qboolean Mod_CheckAnimTextureArrayQ64(texture_t *anims[], int numTex)
|
||||||
Mod_LoadTextures
|
Mod_LoadTextures
|
||||||
=================
|
=================
|
||||||
*/
|
*/
|
||||||
void Mod_LoadTextures (lump_t *l)
|
static void Mod_LoadTextures (lump_t *l)
|
||||||
{
|
{
|
||||||
int i, j, num, maxanim, altmax;
|
int i, j, num, maxanim, altmax;
|
||||||
miptex_t *mt;
|
miptex_t *mt;
|
||||||
|
@ -730,7 +750,7 @@ void Mod_LoadTextures (lump_t *l)
|
||||||
int nummiptex;
|
int nummiptex;
|
||||||
src_offset_t offset;
|
src_offset_t offset;
|
||||||
int mark, fwidth, fheight;
|
int mark, fwidth, fheight;
|
||||||
char filename[MAX_OSPATH], filename2[MAX_OSPATH], mapname[MAX_OSPATH];
|
char filename[MAX_OSPATH], mapname[MAX_OSPATH];
|
||||||
byte *data;
|
byte *data;
|
||||||
extern byte *hunk_base;
|
extern byte *hunk_base;
|
||||||
//johnfitz
|
//johnfitz
|
||||||
|
@ -788,9 +808,9 @@ void Mod_LoadTextures (lump_t *l)
|
||||||
if (!q_strncasecmp(tx->name,"sky",3)) //sky texture //also note -- was Q_strncmp, changed to match qbsp
|
if (!q_strncasecmp(tx->name,"sky",3)) //sky texture //also note -- was Q_strncmp, changed to match qbsp
|
||||||
{
|
{
|
||||||
if (loadmodel->bspversion == BSPVERSION_QUAKE64)
|
if (loadmodel->bspversion == BSPVERSION_QUAKE64)
|
||||||
Sky_LoadTextureQ64 (tx);
|
Sky_LoadTextureQ64 (loadmodel, tx);
|
||||||
else
|
else
|
||||||
Sky_LoadTexture (tx, fmt, imgwidth, imgheight);
|
Sky_LoadTexture (loadmodel, tx, fmt, imgwidth, imgheight);
|
||||||
}
|
}
|
||||||
else if (tx->name[0] == '*') //warping texture
|
else if (tx->name[0] == '*') //warping texture
|
||||||
{
|
{
|
||||||
|
@ -854,6 +874,7 @@ void Mod_LoadTextures (lump_t *l)
|
||||||
//now load whatever we found
|
//now load whatever we found
|
||||||
if (data) //load external image
|
if (data) //load external image
|
||||||
{
|
{
|
||||||
|
char filename2[MAX_OSPATH];
|
||||||
tx->gltexture = TexMgr_LoadImage (loadmodel, filename, fwidth, fheight,
|
tx->gltexture = TexMgr_LoadImage (loadmodel, filename, fwidth, fheight,
|
||||||
rfmt, data, filename, 0, TEXPREF_MIPMAP | extraflags );
|
rfmt, data, filename, 0, TEXPREF_MIPMAP | extraflags );
|
||||||
|
|
||||||
|
@ -871,7 +892,7 @@ void Mod_LoadTextures (lump_t *l)
|
||||||
|
|
||||||
if (data)
|
if (data)
|
||||||
tx->fullbright = TexMgr_LoadImage (loadmodel, filename2, fwidth, fheight,
|
tx->fullbright = TexMgr_LoadImage (loadmodel, filename2, fwidth, fheight,
|
||||||
rfmt, data, filename, 0, TEXPREF_MIPMAP | extraflags );
|
rfmt, data, filename2, 0, TEXPREF_MIPMAP | extraflags );
|
||||||
}
|
}
|
||||||
else //use the texture from the bsp file
|
else //use the texture from the bsp file
|
||||||
{
|
{
|
||||||
|
@ -1005,7 +1026,7 @@ void Mod_LoadTextures (lump_t *l)
|
||||||
Mod_LoadLighting -- johnfitz -- replaced with lit support code via lordhavoc
|
Mod_LoadLighting -- johnfitz -- replaced with lit support code via lordhavoc
|
||||||
=================
|
=================
|
||||||
*/
|
*/
|
||||||
void Mod_LoadLighting (lump_t *l)
|
static void Mod_LoadLighting (lump_t *l)
|
||||||
{
|
{
|
||||||
int i, mark;
|
int i, mark;
|
||||||
byte *in, *out, *data;
|
byte *in, *out, *data;
|
||||||
|
@ -1138,7 +1159,7 @@ void Mod_LoadLighting (lump_t *l)
|
||||||
Mod_LoadVisibility
|
Mod_LoadVisibility
|
||||||
=================
|
=================
|
||||||
*/
|
*/
|
||||||
void Mod_LoadVisibility (lump_t *l)
|
static void Mod_LoadVisibility (lump_t *l)
|
||||||
{
|
{
|
||||||
loadmodel->viswarn = false;
|
loadmodel->viswarn = false;
|
||||||
if (!l->filelen)
|
if (!l->filelen)
|
||||||
|
@ -1156,7 +1177,7 @@ void Mod_LoadVisibility (lump_t *l)
|
||||||
Mod_LoadEntities
|
Mod_LoadEntities
|
||||||
=================
|
=================
|
||||||
*/
|
*/
|
||||||
void Mod_LoadEntities (lump_t *l)
|
static void Mod_LoadEntities (lump_t *l)
|
||||||
{
|
{
|
||||||
char basemapname[MAX_QPATH];
|
char basemapname[MAX_QPATH];
|
||||||
char entfilename[MAX_QPATH];
|
char entfilename[MAX_QPATH];
|
||||||
|
@ -1260,7 +1281,7 @@ const char *Mod_ParseWorldspawnKey(qmodel_t *mod, const char *wantkey, char *buf
|
||||||
Mod_LoadVertexes
|
Mod_LoadVertexes
|
||||||
=================
|
=================
|
||||||
*/
|
*/
|
||||||
void Mod_LoadVertexes (lump_t *l)
|
static void Mod_LoadVertexes (lump_t *l)
|
||||||
{
|
{
|
||||||
dvertex_t *in;
|
dvertex_t *in;
|
||||||
mvertex_t *out;
|
mvertex_t *out;
|
||||||
|
@ -1288,7 +1309,7 @@ void Mod_LoadVertexes (lump_t *l)
|
||||||
Mod_LoadEdges
|
Mod_LoadEdges
|
||||||
=================
|
=================
|
||||||
*/
|
*/
|
||||||
void Mod_LoadEdges (lump_t *l, int bsp2)
|
static void Mod_LoadEdges (lump_t *l, int bsp2)
|
||||||
{
|
{
|
||||||
medge_t *out;
|
medge_t *out;
|
||||||
int i, count;
|
int i, count;
|
||||||
|
@ -1338,7 +1359,7 @@ void Mod_LoadEdges (lump_t *l, int bsp2)
|
||||||
Mod_LoadTexinfo
|
Mod_LoadTexinfo
|
||||||
=================
|
=================
|
||||||
*/
|
*/
|
||||||
void Mod_LoadTexinfo (lump_t *l)
|
static void Mod_LoadTexinfo (lump_t *l)
|
||||||
{
|
{
|
||||||
texinfo_t *in;
|
texinfo_t *in;
|
||||||
mtexinfo_t *out;
|
mtexinfo_t *out;
|
||||||
|
@ -1395,7 +1416,7 @@ CalcSurfaceExtents
|
||||||
Fills in s->texturemins[] and s->extents[]
|
Fills in s->texturemins[] and s->extents[]
|
||||||
================
|
================
|
||||||
*/
|
*/
|
||||||
void CalcSurfaceExtents (msurface_t *s)
|
static void CalcSurfaceExtents (msurface_t *s)
|
||||||
{
|
{
|
||||||
float mins[2], maxs[2], val;
|
float mins[2], maxs[2], val;
|
||||||
int i,j, e;
|
int i,j, e;
|
||||||
|
@ -1472,7 +1493,7 @@ Mod_PolyForUnlitSurface -- johnfitz -- creates polys for unlightmapped surfaces
|
||||||
TODO: merge this into BuildSurfaceDisplayList?
|
TODO: merge this into BuildSurfaceDisplayList?
|
||||||
================
|
================
|
||||||
*/
|
*/
|
||||||
void Mod_PolyForUnlitSurface (msurface_t *fa)
|
static void Mod_PolyForUnlitSurface (msurface_t *fa)
|
||||||
{
|
{
|
||||||
vec3_t verts[64];
|
vec3_t verts[64];
|
||||||
int numverts, i, lindex;
|
int numverts, i, lindex;
|
||||||
|
@ -1517,7 +1538,7 @@ void Mod_PolyForUnlitSurface (msurface_t *fa)
|
||||||
Mod_CalcSurfaceBounds -- johnfitz -- calculate bounding box for per-surface frustum culling
|
Mod_CalcSurfaceBounds -- johnfitz -- calculate bounding box for per-surface frustum culling
|
||||||
=================
|
=================
|
||||||
*/
|
*/
|
||||||
void Mod_CalcSurfaceBounds (msurface_t *s)
|
static void Mod_CalcSurfaceBounds (msurface_t *s)
|
||||||
{
|
{
|
||||||
int i, e;
|
int i, e;
|
||||||
mvertex_t *v;
|
mvertex_t *v;
|
||||||
|
@ -1554,7 +1575,7 @@ void Mod_CalcSurfaceBounds (msurface_t *s)
|
||||||
Mod_LoadFaces
|
Mod_LoadFaces
|
||||||
=================
|
=================
|
||||||
*/
|
*/
|
||||||
void Mod_LoadFaces (lump_t *l, qboolean bsp2)
|
static void Mod_LoadFaces (lump_t *l, qboolean bsp2)
|
||||||
{
|
{
|
||||||
dsface_t *ins;
|
dsface_t *ins;
|
||||||
dlface_t *inl;
|
dlface_t *inl;
|
||||||
|
@ -1736,7 +1757,7 @@ void Mod_LoadFaces (lump_t *l, qboolean bsp2)
|
||||||
Mod_SetParent
|
Mod_SetParent
|
||||||
=================
|
=================
|
||||||
*/
|
*/
|
||||||
void Mod_SetParent (mnode_t *node, mnode_t *parent)
|
static void Mod_SetParent (mnode_t *node, mnode_t *parent)
|
||||||
{
|
{
|
||||||
node->parent = parent;
|
node->parent = parent;
|
||||||
if (node->contents < 0)
|
if (node->contents < 0)
|
||||||
|
@ -1750,7 +1771,7 @@ void Mod_SetParent (mnode_t *node, mnode_t *parent)
|
||||||
Mod_LoadNodes
|
Mod_LoadNodes
|
||||||
=================
|
=================
|
||||||
*/
|
*/
|
||||||
void Mod_LoadNodes_S (lump_t *l)
|
static void Mod_LoadNodes_S (lump_t *l)
|
||||||
{
|
{
|
||||||
int i, j, count, p;
|
int i, j, count, p;
|
||||||
dsnode_t *in;
|
dsnode_t *in;
|
||||||
|
@ -1806,7 +1827,7 @@ void Mod_LoadNodes_S (lump_t *l)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Mod_LoadNodes_L1 (lump_t *l)
|
static void Mod_LoadNodes_L1 (lump_t *l)
|
||||||
{
|
{
|
||||||
int i, j, count, p;
|
int i, j, count, p;
|
||||||
dl1node_t *in;
|
dl1node_t *in;
|
||||||
|
@ -1858,7 +1879,7 @@ void Mod_LoadNodes_L1 (lump_t *l)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Mod_LoadNodes_L2 (lump_t *l)
|
static void Mod_LoadNodes_L2 (lump_t *l)
|
||||||
{
|
{
|
||||||
int i, j, count, p;
|
int i, j, count, p;
|
||||||
dl2node_t *in;
|
dl2node_t *in;
|
||||||
|
@ -1910,7 +1931,7 @@ void Mod_LoadNodes_L2 (lump_t *l)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Mod_LoadNodes (lump_t *l, int bsp2)
|
static void Mod_LoadNodes (lump_t *l, int bsp2)
|
||||||
{
|
{
|
||||||
if (bsp2 == 2)
|
if (bsp2 == 2)
|
||||||
Mod_LoadNodes_L2(l);
|
Mod_LoadNodes_L2(l);
|
||||||
|
@ -1922,7 +1943,7 @@ void Mod_LoadNodes (lump_t *l, int bsp2)
|
||||||
// Mod_SetParent (loadmodel->nodes, NULL); // sets nodes and leafs
|
// Mod_SetParent (loadmodel->nodes, NULL); // sets nodes and leafs
|
||||||
}
|
}
|
||||||
|
|
||||||
void Mod_ProcessLeafs_S (dsleaf_t *in, int filelen)
|
static void Mod_ProcessLeafs_S (dsleaf_t *in, int filelen)
|
||||||
{
|
{
|
||||||
mleaf_t *out;
|
mleaf_t *out;
|
||||||
int i, j, count, p;
|
int i, j, count, p;
|
||||||
|
@ -1968,7 +1989,7 @@ void Mod_ProcessLeafs_S (dsleaf_t *in, int filelen)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Mod_ProcessLeafs_L1 (dl1leaf_t *in, int filelen)
|
static void Mod_ProcessLeafs_L1 (dl1leaf_t *in, int filelen)
|
||||||
{
|
{
|
||||||
mleaf_t *out;
|
mleaf_t *out;
|
||||||
int i, j, count, p;
|
int i, j, count, p;
|
||||||
|
@ -2011,7 +2032,7 @@ void Mod_ProcessLeafs_L1 (dl1leaf_t *in, int filelen)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Mod_ProcessLeafs_L2 (dl2leaf_t *in, int filelen)
|
static void Mod_ProcessLeafs_L2 (dl2leaf_t *in, int filelen)
|
||||||
{
|
{
|
||||||
mleaf_t *out;
|
mleaf_t *out;
|
||||||
int i, j, count, p;
|
int i, j, count, p;
|
||||||
|
@ -2059,7 +2080,7 @@ void Mod_ProcessLeafs_L2 (dl2leaf_t *in, int filelen)
|
||||||
Mod_LoadLeafs
|
Mod_LoadLeafs
|
||||||
=================
|
=================
|
||||||
*/
|
*/
|
||||||
void Mod_LoadLeafs (lump_t *l, int bsp2)
|
static void Mod_LoadLeafs (lump_t *l, int bsp2)
|
||||||
{
|
{
|
||||||
void *in = (void *)(mod_base + l->fileofs);
|
void *in = (void *)(mod_base + l->fileofs);
|
||||||
|
|
||||||
|
@ -2175,7 +2196,7 @@ void Mod_CheckWaterVis(void)
|
||||||
Mod_LoadClipnodes
|
Mod_LoadClipnodes
|
||||||
=================
|
=================
|
||||||
*/
|
*/
|
||||||
void Mod_LoadClipnodes (lump_t *l, qboolean bsp2)
|
static void Mod_LoadClipnodes (lump_t *l, qboolean bsp2)
|
||||||
{
|
{
|
||||||
dsclipnode_t *ins;
|
dsclipnode_t *ins;
|
||||||
dlclipnode_t *inl;
|
dlclipnode_t *inl;
|
||||||
|
@ -2286,7 +2307,7 @@ Mod_MakeHull0
|
||||||
Duplicate the drawing hull structure as a clipping hull
|
Duplicate the drawing hull structure as a clipping hull
|
||||||
=================
|
=================
|
||||||
*/
|
*/
|
||||||
void Mod_MakeHull0 (void)
|
static void Mod_MakeHull0 (void)
|
||||||
{
|
{
|
||||||
mnode_t *in, *child;
|
mnode_t *in, *child;
|
||||||
mclipnode_t *out; //johnfitz -- was dclipnode_t
|
mclipnode_t *out; //johnfitz -- was dclipnode_t
|
||||||
|
@ -2343,7 +2364,7 @@ void Mod_MakeHull0 (void)
|
||||||
Mod_LoadMarksurfaces
|
Mod_LoadMarksurfaces
|
||||||
=================
|
=================
|
||||||
*/
|
*/
|
||||||
void Mod_LoadMarksurfaces (lump_t *l, int bsp2)
|
static void Mod_LoadMarksurfaces (lump_t *l, int bsp2)
|
||||||
{
|
{
|
||||||
int i, j, count;
|
int i, j, count;
|
||||||
msurface_t **out;
|
msurface_t **out;
|
||||||
|
@ -2401,7 +2422,7 @@ void Mod_LoadMarksurfaces (lump_t *l, int bsp2)
|
||||||
Mod_LoadSurfedges
|
Mod_LoadSurfedges
|
||||||
=================
|
=================
|
||||||
*/
|
*/
|
||||||
void Mod_LoadSurfedges (lump_t *l)
|
static void Mod_LoadSurfedges (lump_t *l)
|
||||||
{
|
{
|
||||||
int i, count;
|
int i, count;
|
||||||
int *in, *out;
|
int *in, *out;
|
||||||
|
@ -2425,7 +2446,7 @@ void Mod_LoadSurfedges (lump_t *l)
|
||||||
Mod_LoadPlanes
|
Mod_LoadPlanes
|
||||||
=================
|
=================
|
||||||
*/
|
*/
|
||||||
void Mod_LoadPlanes (lump_t *l)
|
static void Mod_LoadPlanes (lump_t *l)
|
||||||
{
|
{
|
||||||
int i, j;
|
int i, j;
|
||||||
mplane_t *out;
|
mplane_t *out;
|
||||||
|
@ -2463,7 +2484,7 @@ void Mod_LoadPlanes (lump_t *l)
|
||||||
RadiusFromBounds
|
RadiusFromBounds
|
||||||
=================
|
=================
|
||||||
*/
|
*/
|
||||||
float RadiusFromBounds (vec3_t mins, vec3_t maxs)
|
static float RadiusFromBounds (vec3_t mins, vec3_t maxs)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
vec3_t corner;
|
vec3_t corner;
|
||||||
|
@ -2481,7 +2502,7 @@ float RadiusFromBounds (vec3_t mins, vec3_t maxs)
|
||||||
Mod_LoadSubmodels
|
Mod_LoadSubmodels
|
||||||
=================
|
=================
|
||||||
*/
|
*/
|
||||||
void Mod_LoadSubmodels (lump_t *l)
|
static void Mod_LoadSubmodels (lump_t *l)
|
||||||
{
|
{
|
||||||
mmodel_t *out;
|
mmodel_t *out;
|
||||||
size_t i, j, count;
|
size_t i, j, count;
|
||||||
|
@ -2572,7 +2593,8 @@ Therefore, the bounding box of the hull can be constructed entirely
|
||||||
from axial planes found in the clipnodes for that hull.
|
from axial planes found in the clipnodes for that hull.
|
||||||
=================
|
=================
|
||||||
*/
|
*/
|
||||||
void Mod_BoundsFromClipNode (qmodel_t *mod, int hull, int nodenum)
|
#if 0 /* disabled for now -- see in Mod_SetupSubmodels() */
|
||||||
|
static void Mod_BoundsFromClipNode (qmodel_t *mod, int hull, int nodenum)
|
||||||
{
|
{
|
||||||
mplane_t *plane;
|
mplane_t *plane;
|
||||||
mclipnode_t *node;
|
mclipnode_t *node;
|
||||||
|
@ -2611,6 +2633,7 @@ void Mod_BoundsFromClipNode (qmodel_t *mod, int hull, int nodenum)
|
||||||
Mod_BoundsFromClipNode (mod, hull, node->children[0]);
|
Mod_BoundsFromClipNode (mod, hull, node->children[0]);
|
||||||
Mod_BoundsFromClipNode (mod, hull, node->children[1]);
|
Mod_BoundsFromClipNode (mod, hull, node->children[1]);
|
||||||
}
|
}
|
||||||
|
#endif /* #if 0 */
|
||||||
|
|
||||||
/* EXTERNAL VIS FILE SUPPORT:
|
/* EXTERNAL VIS FILE SUPPORT:
|
||||||
*/
|
*/
|
||||||
|
@ -2712,7 +2735,7 @@ static void Mod_LoadLeafsExternal(FILE* f)
|
||||||
Mod_LoadBrushModel
|
Mod_LoadBrushModel
|
||||||
=================
|
=================
|
||||||
*/
|
*/
|
||||||
void Mod_LoadBrushModel (qmodel_t *mod, void *buffer)
|
static void Mod_LoadBrushModel (qmodel_t *mod, void *buffer)
|
||||||
{
|
{
|
||||||
int i, j;
|
int i, j;
|
||||||
int bsp2;
|
int bsp2;
|
||||||
|
@ -2884,17 +2907,14 @@ int max_triangles;
|
||||||
// a pose is a single set of vertexes. a frame may be
|
// a pose is a single set of vertexes. a frame may be
|
||||||
// an animating sequence of poses
|
// an animating sequence of poses
|
||||||
trivertx_t *poseverts_mdl[MAXALIASFRAMES];
|
trivertx_t *poseverts_mdl[MAXALIASFRAMES];
|
||||||
int posenum;
|
static int posenum;
|
||||||
|
|
||||||
byte **player_8bit_texels_tbl;
|
|
||||||
byte *player_8bit_texels;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
=================
|
=================
|
||||||
Mod_LoadAliasFrame
|
Mod_LoadAliasFrame
|
||||||
=================
|
=================
|
||||||
*/
|
*/
|
||||||
static void * Mod_LoadAliasFrame (void * pin, maliasframedesc_t *frame, int pvtype)
|
static void *Mod_LoadAliasFrame (void * pin, maliasframedesc_t *frame, int pvtype)
|
||||||
{
|
{
|
||||||
trivertx_t *pinframe;
|
trivertx_t *pinframe;
|
||||||
int i;
|
int i;
|
||||||
|
@ -2917,7 +2937,6 @@ static void * Mod_LoadAliasFrame (void * pin, maliasframedesc_t *frame, int pvty
|
||||||
frame->bboxmax.v[i] = pdaliasframe->bboxmax.v[i];
|
frame->bboxmax.v[i] = pdaliasframe->bboxmax.v[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
pinframe = (trivertx_t *)(pdaliasframe + 1);
|
pinframe = (trivertx_t *)(pdaliasframe + 1);
|
||||||
|
|
||||||
poseverts_mdl[posenum] = pinframe;
|
poseverts_mdl[posenum] = pinframe;
|
||||||
|
@ -3007,7 +3026,7 @@ do { \
|
||||||
else if (pos[off] != 255) fdc = pos[off]; \
|
else if (pos[off] != 255) fdc = pos[off]; \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
void Mod_FloodFillSkin( byte *skin, int skinwidth, int skinheight )
|
static void Mod_FloodFillSkin( byte *skin, int skinwidth, int skinheight )
|
||||||
{
|
{
|
||||||
byte fillcolor = *skin; // assume this is the pixel to fill
|
byte fillcolor = *skin; // assume this is the pixel to fill
|
||||||
floodfill_t fifo[FLOODFILL_FIFO_SIZE];
|
floodfill_t fifo[FLOODFILL_FIFO_SIZE];
|
||||||
|
@ -3020,11 +3039,13 @@ void Mod_FloodFillSkin( byte *skin, int skinwidth, int skinheight )
|
||||||
filledcolor = 0;
|
filledcolor = 0;
|
||||||
// attempt to find opaque black
|
// attempt to find opaque black
|
||||||
for (i = 0; i < 256; ++i)
|
for (i = 0; i < 256; ++i)
|
||||||
if (d_8to24table[i] == (unsigned int)LittleLong(255 << 24)) // alpha 1.0
|
{
|
||||||
|
if (d_8to24table[i] == (unsigned int)LittleLong(255ul << 24)) // alpha 1.0
|
||||||
{
|
{
|
||||||
filledcolor = i;
|
filledcolor = i;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// can't fill to filled color or to transparent color (used as visited marker)
|
// can't fill to filled color or to transparent color (used as visited marker)
|
||||||
|
@ -3058,7 +3079,7 @@ void Mod_FloodFillSkin( byte *skin, int skinwidth, int skinheight )
|
||||||
Mod_LoadAllSkins
|
Mod_LoadAllSkins
|
||||||
===============
|
===============
|
||||||
*/
|
*/
|
||||||
void *Mod_LoadAllSkins (int numskins, daliasskintype_t *pskintype)
|
static void *Mod_LoadAllSkins (int numskins, daliasskintype_t *pskintype)
|
||||||
{
|
{
|
||||||
int i, j, k, size, groupskins;
|
int i, j, k, size, groupskins;
|
||||||
char name[MAX_QPATH];
|
char name[MAX_QPATH];
|
||||||
|
@ -3409,7 +3430,9 @@ void Mod_SetExtraFlags (qmodel_t *mod)
|
||||||
if (!strcmp (mod->name, "progs/flame2.mdl") ||
|
if (!strcmp (mod->name, "progs/flame2.mdl") ||
|
||||||
!strcmp (mod->name, "progs/flame.mdl") ||
|
!strcmp (mod->name, "progs/flame.mdl") ||
|
||||||
!strcmp (mod->name, "progs/boss.mdl"))
|
!strcmp (mod->name, "progs/boss.mdl"))
|
||||||
|
{
|
||||||
mod->flags |= MOD_FBRIGHTHACK;
|
mod->flags |= MOD_FBRIGHTHACK;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef PSET_SCRIPT
|
#ifdef PSET_SCRIPT
|
||||||
|
@ -3422,7 +3445,7 @@ void Mod_SetExtraFlags (qmodel_t *mod)
|
||||||
Mod_LoadAliasModel
|
Mod_LoadAliasModel
|
||||||
=================
|
=================
|
||||||
*/
|
*/
|
||||||
void Mod_LoadAliasModel (qmodel_t *mod, void *buffer, int pvtype)
|
static void Mod_LoadAliasModel (qmodel_t *mod, void *buffer, int pvtype)
|
||||||
{
|
{
|
||||||
int i, j;
|
int i, j;
|
||||||
mdl_t *pinmodel;
|
mdl_t *pinmodel;
|
||||||
|
@ -3611,7 +3634,7 @@ void Mod_LoadAliasModel (qmodel_t *mod, void *buffer, int pvtype)
|
||||||
Mod_LoadSpriteFrame
|
Mod_LoadSpriteFrame
|
||||||
=================
|
=================
|
||||||
*/
|
*/
|
||||||
void * Mod_LoadSpriteFrame (void * pin, mspriteframe_t **ppframe, int framenum, enum srcformat fmt)
|
static void *Mod_LoadSpriteFrame (void * pin, mspriteframe_t **ppframe, int framenum, enum srcformat fmt)
|
||||||
{
|
{
|
||||||
dspriteframe_t *pinframe;
|
dspriteframe_t *pinframe;
|
||||||
mspriteframe_t *pspriteframe;
|
mspriteframe_t *pspriteframe;
|
||||||
|
@ -3661,7 +3684,7 @@ void * Mod_LoadSpriteFrame (void * pin, mspriteframe_t **ppframe, int framenum,
|
||||||
Mod_LoadSpriteGroup
|
Mod_LoadSpriteGroup
|
||||||
=================
|
=================
|
||||||
*/
|
*/
|
||||||
void * Mod_LoadSpriteGroup (void * pin, mspriteframe_t **ppframe, int framenum, enum srcformat fmt)
|
static void *Mod_LoadSpriteGroup (void * pin, mspriteframe_t **ppframe, int framenum, enum srcformat fmt)
|
||||||
{
|
{
|
||||||
dspritegroup_t *pingroup;
|
dspritegroup_t *pingroup;
|
||||||
mspritegroup_t *pspritegroup;
|
mspritegroup_t *pspritegroup;
|
||||||
|
@ -3716,7 +3739,7 @@ void * Mod_LoadSpriteGroup (void * pin, mspriteframe_t **ppframe, int framenum,
|
||||||
Mod_LoadSpriteModel
|
Mod_LoadSpriteModel
|
||||||
=================
|
=================
|
||||||
*/
|
*/
|
||||||
void Mod_LoadSpriteModel (qmodel_t *mod, void *buffer)
|
static void Mod_LoadSpriteModel (qmodel_t *mod, void *buffer)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
int version;
|
int version;
|
||||||
|
@ -3803,7 +3826,7 @@ void Mod_LoadSpriteModel (qmodel_t *mod, void *buffer)
|
||||||
Mod_Print
|
Mod_Print
|
||||||
================
|
================
|
||||||
*/
|
*/
|
||||||
void Mod_Print (void)
|
static void Mod_Print (void)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
qmodel_t *mod;
|
qmodel_t *mod;
|
||||||
|
|
|
@ -20,8 +20,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __MODEL__
|
#ifndef GL_MODEL_H
|
||||||
#define __MODEL__
|
#define GL_MODEL_H
|
||||||
|
|
||||||
#include "modelgen.h"
|
#include "modelgen.h"
|
||||||
#include "spritegn.h"
|
#include "spritegn.h"
|
||||||
|
@ -557,6 +557,7 @@ void Mod_Init (void);
|
||||||
void Mod_ClearAll (void);
|
void Mod_ClearAll (void);
|
||||||
void Mod_ResetAll (void); // for gamedir changes (Host_Game_f)
|
void Mod_ResetAll (void); // for gamedir changes (Host_Game_f)
|
||||||
qmodel_t *Mod_ForName (const char *name, qboolean crash);
|
qmodel_t *Mod_ForName (const char *name, qboolean crash);
|
||||||
|
void Mod_ForEachModel(void(*callback)(qmodel_t *mod));
|
||||||
void *Mod_Extradata (qmodel_t *mod); // handles caching
|
void *Mod_Extradata (qmodel_t *mod); // handles caching
|
||||||
void Mod_TouchModel (const char *name);
|
void Mod_TouchModel (const char *name);
|
||||||
|
|
||||||
|
@ -566,4 +567,4 @@ byte *Mod_NoVisPVS (qmodel_t *model);
|
||||||
|
|
||||||
void Mod_SetExtraFlags (qmodel_t *mod);
|
void Mod_SetExtraFlags (qmodel_t *mod);
|
||||||
|
|
||||||
#endif // __MODEL__
|
#endif /* GL_MODEL_H */
|
||||||
|
|
|
@ -24,8 +24,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
#include "quakedef.h"
|
#include "quakedef.h"
|
||||||
#include "glquake.h"
|
#include "glquake.h"
|
||||||
|
|
||||||
qboolean r_cache_thrash; // compatability
|
|
||||||
|
|
||||||
vec3_t modelorg, r_entorigin;
|
vec3_t modelorg, r_entorigin;
|
||||||
|
|
||||||
static entity_t r_worldentity; //so we can make sure currententity is valid
|
static entity_t r_worldentity; //so we can make sure currententity is valid
|
||||||
|
@ -37,9 +35,8 @@ int r_framecount; // used for dlight push checking
|
||||||
mplane_t frustum[4];
|
mplane_t frustum[4];
|
||||||
|
|
||||||
//johnfitz -- rendering statistics
|
//johnfitz -- rendering statistics
|
||||||
int rs_brushpolys, rs_aliaspolys, rs_skypolys, rs_particles, rs_fogpolys;
|
int rs_brushpolys, rs_aliaspolys, rs_skypolys;
|
||||||
int rs_dynamiclightmaps, rs_brushpasses, rs_aliaspasses, rs_skypasses;
|
int rs_dynamiclightmaps, rs_brushpasses, rs_aliaspasses, rs_skypasses;
|
||||||
float rs_megatexels;
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// view origin
|
// view origin
|
||||||
|
@ -600,8 +597,6 @@ void R_SetupView (void)
|
||||||
V_SetContentsColor (viewcontents);
|
V_SetContentsColor (viewcontents);
|
||||||
V_CalcBlend ();
|
V_CalcBlend ();
|
||||||
|
|
||||||
r_cache_thrash = false;
|
|
||||||
|
|
||||||
//johnfitz -- calculate r_fovx and r_fovy here
|
//johnfitz -- calculate r_fovx and r_fovy here
|
||||||
r_fovx = r_refdef.fov_x;
|
r_fovx = r_refdef.fov_x;
|
||||||
r_fovy = r_refdef.fov_y;
|
r_fovy = r_refdef.fov_y;
|
||||||
|
@ -1151,7 +1146,7 @@ void R_RenderView (void)
|
||||||
time1 = Sys_DoubleTime ();
|
time1 = Sys_DoubleTime ();
|
||||||
|
|
||||||
//johnfitz -- rendering statistics
|
//johnfitz -- rendering statistics
|
||||||
rs_brushpolys = rs_aliaspolys = rs_skypolys = rs_particles = rs_fogpolys = rs_megatexels =
|
rs_brushpolys = rs_aliaspolys = rs_skypolys =
|
||||||
rs_dynamiclightmaps = rs_aliaspasses = rs_skypasses = rs_brushpasses = 0;
|
rs_dynamiclightmaps = rs_aliaspasses = rs_skypasses = rs_brushpasses = 0;
|
||||||
}
|
}
|
||||||
else if (gl_finish.value)
|
else if (gl_finish.value)
|
||||||
|
@ -1260,12 +1255,12 @@ void R_RenderView (void)
|
||||||
time2 = Sys_DoubleTime ();
|
time2 = Sys_DoubleTime ();
|
||||||
if (r_pos.value)
|
if (r_pos.value)
|
||||||
Con_Printf ("x %i y %i z %i (pitch %i yaw %i roll %i)\n",
|
Con_Printf ("x %i y %i z %i (pitch %i yaw %i roll %i)\n",
|
||||||
(int)cl.entities[cl.viewentity].origin[0],
|
(int)cl.entities[cl.viewentity].origin[0],
|
||||||
(int)cl.entities[cl.viewentity].origin[1],
|
(int)cl.entities[cl.viewentity].origin[1],
|
||||||
(int)cl.entities[cl.viewentity].origin[2],
|
(int)cl.entities[cl.viewentity].origin[2],
|
||||||
(int)cl.viewangles[PITCH],
|
(int)cl.viewangles[PITCH],
|
||||||
(int)cl.viewangles[YAW],
|
(int)cl.viewangles[YAW],
|
||||||
(int)cl.viewangles[ROLL]);
|
(int)cl.viewangles[ROLL]);
|
||||||
else if (r_speeds.value == 2)
|
else if (r_speeds.value == 2)
|
||||||
Con_Printf ("%3i ms %4i/%4i wpoly %4i/%4i epoly %3i lmap %4i/%4i sky %1.1f mtex\n",
|
Con_Printf ("%3i ms %4i/%4i wpoly %4i/%4i epoly %3i lmap %4i/%4i sky %1.1f mtex\n",
|
||||||
(int)((time2-time1)*1000),
|
(int)((time2-time1)*1000),
|
||||||
|
|
|
@ -94,7 +94,6 @@ cvar_t scr_fov = {"fov","90",CVAR_NONE}; // 10 - 170
|
||||||
cvar_t scr_fov_adapt = {"fov_adapt","1",CVAR_ARCHIVE};
|
cvar_t scr_fov_adapt = {"fov_adapt","1",CVAR_ARCHIVE};
|
||||||
cvar_t scr_conspeed = {"scr_conspeed","500",CVAR_ARCHIVE};
|
cvar_t scr_conspeed = {"scr_conspeed","500",CVAR_ARCHIVE};
|
||||||
cvar_t scr_centertime = {"scr_centertime","2",CVAR_NONE};
|
cvar_t scr_centertime = {"scr_centertime","2",CVAR_NONE};
|
||||||
cvar_t scr_showram = {"showram","1",CVAR_NONE};
|
|
||||||
cvar_t scr_showturtle = {"showturtle","0",CVAR_NONE};
|
cvar_t scr_showturtle = {"showturtle","0",CVAR_NONE};
|
||||||
cvar_t scr_showpause = {"showpause","1",CVAR_NONE};
|
cvar_t scr_showpause = {"showpause","1",CVAR_NONE};
|
||||||
cvar_t scr_printspeed = {"scr_printspeed","8",CVAR_NONE};
|
cvar_t scr_printspeed = {"scr_printspeed","8",CVAR_NONE};
|
||||||
|
@ -106,7 +105,6 @@ extern cvar_t crosshair;
|
||||||
|
|
||||||
qboolean scr_initialized; // ready to draw
|
qboolean scr_initialized; // ready to draw
|
||||||
|
|
||||||
qpic_t *scr_ram;
|
|
||||||
qpic_t *scr_net;
|
qpic_t *scr_net;
|
||||||
qpic_t *scr_turtle;
|
qpic_t *scr_turtle;
|
||||||
|
|
||||||
|
@ -471,7 +469,6 @@ SCR_LoadPics -- johnfitz
|
||||||
*/
|
*/
|
||||||
void SCR_LoadPics (void)
|
void SCR_LoadPics (void)
|
||||||
{
|
{
|
||||||
scr_ram = Draw_PicFromWad ("ram");
|
|
||||||
scr_net = Draw_PicFromWad ("net");
|
scr_net = Draw_PicFromWad ("net");
|
||||||
scr_turtle = Draw_PicFromWad ("turtle");
|
scr_turtle = Draw_PicFromWad ("turtle");
|
||||||
}
|
}
|
||||||
|
@ -504,7 +501,6 @@ void SCR_Init (void)
|
||||||
Cvar_RegisterVariable (&scr_fov_adapt);
|
Cvar_RegisterVariable (&scr_fov_adapt);
|
||||||
Cvar_RegisterVariable (&scr_viewsize);
|
Cvar_RegisterVariable (&scr_viewsize);
|
||||||
Cvar_RegisterVariable (&scr_conspeed);
|
Cvar_RegisterVariable (&scr_conspeed);
|
||||||
Cvar_RegisterVariable (&scr_showram);
|
|
||||||
Cvar_RegisterVariable (&scr_showturtle);
|
Cvar_RegisterVariable (&scr_showturtle);
|
||||||
Cvar_RegisterVariable (&scr_showpause);
|
Cvar_RegisterVariable (&scr_showpause);
|
||||||
Cvar_RegisterVariable (&scr_centertime);
|
Cvar_RegisterVariable (&scr_centertime);
|
||||||
|
@ -641,24 +637,6 @@ void SCR_DrawDevStats (void)
|
||||||
Draw_String (x, (y++)*8-x, str);
|
Draw_String (x, (y++)*8-x, str);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
==============
|
|
||||||
SCR_DrawRam
|
|
||||||
==============
|
|
||||||
*/
|
|
||||||
void SCR_DrawRam (void)
|
|
||||||
{
|
|
||||||
if (!scr_showram.value)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (!r_cache_thrash)
|
|
||||||
return;
|
|
||||||
|
|
||||||
GL_SetCanvas (CANVAS_DEFAULT); //johnfitz
|
|
||||||
|
|
||||||
Draw_Pic (scr_vrect.x+32, scr_vrect.y, scr_ram);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
==============
|
==============
|
||||||
SCR_DrawTurtle
|
SCR_DrawTurtle
|
||||||
|
@ -1244,7 +1222,6 @@ void SCR_UpdateScreen (void)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
SCR_DrawRam ();
|
|
||||||
SCR_DrawNet ();
|
SCR_DrawNet ();
|
||||||
SCR_DrawTurtle ();
|
SCR_DrawTurtle ();
|
||||||
SCR_DrawPause ();
|
SCR_DrawPause ();
|
||||||
|
|
|
@ -29,9 +29,9 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
float Fog_GetDensity(void);
|
float Fog_GetDensity(void);
|
||||||
float *Fog_GetColor(void);
|
float *Fog_GetColor(void);
|
||||||
|
|
||||||
extern qmodel_t *loadmodel;
|
extern int rs_skypolys; // for r_speeds readout
|
||||||
extern int rs_skypolys; //for r_speeds readout
|
extern int rs_skypasses; // for r_speeds readout
|
||||||
extern int rs_skypasses; //for r_speeds readout
|
|
||||||
float skyflatcolor[3];
|
float skyflatcolor[3];
|
||||||
float skymins[2][6], skymaxs[2][6];
|
float skymins[2][6], skymaxs[2][6];
|
||||||
|
|
||||||
|
@ -98,7 +98,7 @@ Sky_LoadTexture
|
||||||
A sky texture is 256*128, with the left side being a masked overlay
|
A sky texture is 256*128, with the left side being a masked overlay
|
||||||
==============
|
==============
|
||||||
*/
|
*/
|
||||||
void Sky_LoadTexture (texture_t *mt, enum srcformat fmt, unsigned int srcwidth, unsigned int height)
|
void Sky_LoadTexture (qmodel_t *mod, texture_t *mt, enum srcformat fmt, unsigned int srcwidth, unsigned int height)
|
||||||
{
|
{
|
||||||
char texturename[64];
|
char texturename[64];
|
||||||
int i, p, r, g, b, count;
|
int i, p, r, g, b, count;
|
||||||
|
@ -123,8 +123,8 @@ void Sky_LoadTexture (texture_t *mt, enum srcformat fmt, unsigned int srcwidth,
|
||||||
for (i=0 ; i<rows ; i++)
|
for (i=0 ; i<rows ; i++)
|
||||||
memcpy(back_data+bb*i*columns, src+bb*(i*columns*2 + columns), columns*bb);
|
memcpy(back_data+bb*i*columns, src+bb*(i*columns*2 + columns), columns*bb);
|
||||||
|
|
||||||
q_snprintf(texturename, sizeof(texturename), "%s:%s_back", loadmodel->name, mt->name);
|
q_snprintf(texturename, sizeof(texturename), "%s:%s_back", mod->name, mt->name);
|
||||||
solidskytexture = TexMgr_LoadImage (loadmodel, texturename, width, height, fmt, back_data, "", (src_offset_t)back_data, TEXPREF_NONE);
|
solidskytexture = TexMgr_LoadImage (mod, texturename, width, height, fmt, back_data, "", (src_offset_t)back_data, TEXPREF_NONE);
|
||||||
|
|
||||||
// extract front layer and upload
|
// extract front layer and upload
|
||||||
for (i=0 ; i<rows ; i++)
|
for (i=0 ; i<rows ; i++)
|
||||||
|
@ -137,8 +137,8 @@ void Sky_LoadTexture (texture_t *mt, enum srcformat fmt, unsigned int srcwidth,
|
||||||
front_data[i] = 255;
|
front_data[i] = 255;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
q_snprintf(texturename, sizeof(texturename), "%s:%s_front", loadmodel->name, mt->name);
|
q_snprintf(texturename, sizeof(texturename), "%s:%s_front", mod->name, mt->name);
|
||||||
alphaskytexture = TexMgr_LoadImage (loadmodel, texturename, width, height, fmt, front_data, "", (src_offset_t)front_data, TEXPREF_ALPHA);
|
alphaskytexture = TexMgr_LoadImage (mod, texturename, width, height, fmt, front_data, "", (src_offset_t)front_data, TEXPREF_ALPHA);
|
||||||
|
|
||||||
// calculate r_fastsky color based on average of all opaque foreground colors, if we can.
|
// calculate r_fastsky color based on average of all opaque foreground colors, if we can.
|
||||||
r = g = b = count = 0;
|
r = g = b = count = 0;
|
||||||
|
@ -157,6 +157,7 @@ void Sky_LoadTexture (texture_t *mt, enum srcformat fmt, unsigned int srcwidth,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
skyflatcolor[0] = (float)r/(count*255);
|
skyflatcolor[0] = (float)r/(count*255);
|
||||||
skyflatcolor[1] = (float)g/(count*255);
|
skyflatcolor[1] = (float)g/(count*255);
|
||||||
skyflatcolor[2] = (float)b/(count*255);
|
skyflatcolor[2] = (float)b/(count*255);
|
||||||
|
@ -169,7 +170,7 @@ Sky_LoadTextureQ64
|
||||||
Quake64 sky textures are 32*64
|
Quake64 sky textures are 32*64
|
||||||
==============
|
==============
|
||||||
*/
|
*/
|
||||||
void Sky_LoadTextureQ64 (texture_t *mt)
|
void Sky_LoadTextureQ64 (qmodel_t *mod, texture_t *mt)
|
||||||
{
|
{
|
||||||
char texturename[64];
|
char texturename[64];
|
||||||
unsigned i, p, r, g, b, count, halfheight, *rgba;
|
unsigned i, p, r, g, b, count, halfheight, *rgba;
|
||||||
|
@ -189,8 +190,8 @@ void Sky_LoadTextureQ64 (texture_t *mt)
|
||||||
front_rgba = (byte *) Hunk_AllocName (4*mt->width*halfheight, "q64_skytex");
|
front_rgba = (byte *) Hunk_AllocName (4*mt->width*halfheight, "q64_skytex");
|
||||||
|
|
||||||
// Normal indexed texture for the back layer
|
// Normal indexed texture for the back layer
|
||||||
q_snprintf(texturename, sizeof(texturename), "%s:%s_back", loadmodel->name, mt->name);
|
q_snprintf(texturename, sizeof(texturename), "%s:%s_back", mod->name, mt->name);
|
||||||
solidskytexture = TexMgr_LoadImage (loadmodel, texturename, mt->width, halfheight, SRC_INDEXED, back, "", (src_offset_t)back, TEXPREF_NONE);
|
solidskytexture = TexMgr_LoadImage (mod, texturename, mt->width, halfheight, SRC_INDEXED, back, "", (src_offset_t)back, TEXPREF_NONE);
|
||||||
|
|
||||||
// front layer, convert to RGBA and upload
|
// front layer, convert to RGBA and upload
|
||||||
p = r = g = b = count = 0;
|
p = r = g = b = count = 0;
|
||||||
|
@ -213,8 +214,8 @@ void Sky_LoadTextureQ64 (texture_t *mt)
|
||||||
count++;
|
count++;
|
||||||
}
|
}
|
||||||
|
|
||||||
q_snprintf(texturename, sizeof(texturename), "%s:%s_front", loadmodel->name, mt->name);
|
q_snprintf(texturename, sizeof(texturename), "%s:%s_front", mod->name, mt->name);
|
||||||
alphaskytexture = TexMgr_LoadImage (loadmodel, texturename, mt->width, halfheight, SRC_RGBA, front_rgba, "", (src_offset_t)front_rgba, TEXPREF_ALPHA);
|
alphaskytexture = TexMgr_LoadImage (mod, texturename, mt->width, halfheight, SRC_RGBA, front_rgba, "", (src_offset_t)front_rgba, TEXPREF_ALPHA);
|
||||||
|
|
||||||
// calculate r_fastsky color based on average of all opaque foreground colors
|
// calculate r_fastsky color based on average of all opaque foreground colors
|
||||||
skyflatcolor[0] = (float)r/(count*255);
|
skyflatcolor[0] = (float)r/(count*255);
|
||||||
|
|
|
@ -670,7 +670,6 @@ void TexMgr_Init (void)
|
||||||
int i;
|
int i;
|
||||||
static byte notexture_data[16] = {159,91,83,255,0,0,0,255,0,0,0,255,159,91,83,255}; //black and pink checker
|
static byte notexture_data[16] = {159,91,83,255,0,0,0,255,0,0,0,255,159,91,83,255}; //black and pink checker
|
||||||
static byte nulltexture_data[16] = {127,191,255,255,0,0,0,255,0,0,0,255,127,191,255,255}; //black and blue checker
|
static byte nulltexture_data[16] = {127,191,255,255,0,0,0,255,0,0,0,255,127,191,255,255}; //black and blue checker
|
||||||
extern texture_t *r_notexture_mip, *r_notexture_mip2;
|
|
||||||
|
|
||||||
// init texture list
|
// init texture list
|
||||||
int initialtexturecount = 256;
|
int initialtexturecount = 256;
|
||||||
|
|
|
@ -45,8 +45,6 @@ float turbsin[] =
|
||||||
//
|
//
|
||||||
//==============================================================================
|
//==============================================================================
|
||||||
|
|
||||||
extern qmodel_t *loadmodel;
|
|
||||||
|
|
||||||
msurface_t *warpface;
|
msurface_t *warpface;
|
||||||
|
|
||||||
cvar_t gl_subdivide_size = {"gl_subdivide_size", "128", CVAR_ARCHIVE};
|
cvar_t gl_subdivide_size = {"gl_subdivide_size", "128", CVAR_ARCHIVE};
|
||||||
|
|
|
@ -131,13 +131,14 @@ typedef struct particle_s
|
||||||
|
|
||||||
//====================================================
|
//====================================================
|
||||||
|
|
||||||
extern qboolean r_cache_thrash; // compatability
|
|
||||||
extern vec3_t modelorg, r_entorigin;
|
extern vec3_t modelorg, r_entorigin;
|
||||||
extern entity_t *currententity;
|
extern entity_t *currententity;
|
||||||
extern int r_visframecount; // ??? what difs?
|
extern int r_visframecount; // ??? what difs?
|
||||||
extern int r_framecount;
|
extern int r_framecount;
|
||||||
extern mplane_t frustum[4];
|
extern mplane_t frustum[4];
|
||||||
|
|
||||||
|
extern texture_t *r_notexture_mip, *r_notexture_mip2;
|
||||||
|
|
||||||
//
|
//
|
||||||
// view origin
|
// view origin
|
||||||
//
|
//
|
||||||
|
@ -299,9 +300,8 @@ extern qboolean gl_texture_env_combine;
|
||||||
extern qboolean gl_texture_env_add; // for GL_EXT_texture_env_add
|
extern qboolean gl_texture_env_add; // for GL_EXT_texture_env_add
|
||||||
|
|
||||||
//johnfitz -- rendering statistics
|
//johnfitz -- rendering statistics
|
||||||
extern int rs_brushpolys, rs_aliaspolys, rs_skypolys, rs_particles, rs_fogpolys;
|
extern int rs_brushpolys, rs_aliaspolys, rs_skypolys;
|
||||||
extern int rs_dynamiclightmaps, rs_brushpasses, rs_aliaspasses, rs_skypasses;
|
extern int rs_dynamiclightmaps, rs_brushpasses, rs_aliaspasses, rs_skypasses;
|
||||||
extern float rs_megatexels;
|
|
||||||
|
|
||||||
//johnfitz -- track developer statistics that vary every frame
|
//johnfitz -- track developer statistics that vary every frame
|
||||||
extern cvar_t devstats;
|
extern cvar_t devstats;
|
||||||
|
@ -438,8 +438,8 @@ void Sky_Init (void);
|
||||||
void Sky_ClearAll (void);
|
void Sky_ClearAll (void);
|
||||||
void Sky_DrawSky (void);
|
void Sky_DrawSky (void);
|
||||||
void Sky_NewMap (void);
|
void Sky_NewMap (void);
|
||||||
void Sky_LoadTexture (texture_t *mt, enum srcformat fmt, unsigned int width, unsigned int height);
|
void Sky_LoadTexture (qmodel_t *mod, texture_t *mt, enum srcformat fmt, unsigned int width, unsigned int height);
|
||||||
void Sky_LoadTextureQ64 (texture_t *mt);
|
void Sky_LoadTextureQ64 (qmodel_t *mod, texture_t *mt);
|
||||||
void Sky_LoadSkyBox (const char *name);
|
void Sky_LoadSkyBox (const char *name);
|
||||||
extern qboolean skyroom_drawn, skyroom_drawing; //we draw a skyroom this frame
|
extern qboolean skyroom_drawn, skyroom_drawing; //we draw a skyroom this frame
|
||||||
extern qboolean skyroom_enabled; //we know where the skyroom is ...
|
extern qboolean skyroom_enabled; //we know where the skyroom is ...
|
||||||
|
|
|
@ -30,8 +30,6 @@ extern cvar_t pausable;
|
||||||
|
|
||||||
int current_skill;
|
int current_skill;
|
||||||
|
|
||||||
void Mod_Print (void);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
==================
|
==================
|
||||||
Host_Quit_f
|
Host_Quit_f
|
||||||
|
@ -2517,6 +2515,19 @@ static void Host_Stopdemo_f (void)
|
||||||
CL_Disconnect ();
|
CL_Disconnect ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
==================
|
||||||
|
Host_Resetdemos
|
||||||
|
|
||||||
|
Clear looping demo list (called on game change)
|
||||||
|
==================
|
||||||
|
*/
|
||||||
|
void Host_Resetdemos (void)
|
||||||
|
{
|
||||||
|
memset (cls.demos, 0, sizeof (cls.demos));
|
||||||
|
cls.demonum = 0;
|
||||||
|
}
|
||||||
|
|
||||||
//=============================================================================
|
//=============================================================================
|
||||||
//download stuff
|
//download stuff
|
||||||
|
|
||||||
|
@ -2877,7 +2888,5 @@ void Host_InitCommands (void)
|
||||||
Cmd_AddCommand ("viewframe", Host_Viewframe_f);
|
Cmd_AddCommand ("viewframe", Host_Viewframe_f);
|
||||||
Cmd_AddCommand ("viewnext", Host_Viewnext_f);
|
Cmd_AddCommand ("viewnext", Host_Viewnext_f);
|
||||||
Cmd_AddCommand ("viewprev", Host_Viewprev_f);
|
Cmd_AddCommand ("viewprev", Host_Viewprev_f);
|
||||||
|
|
||||||
Cmd_AddCommand ("mcache", Mod_Print);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
10
Quake/keys.c
10
Quake/keys.c
|
@ -577,7 +577,7 @@ void Key_Console (int key)
|
||||||
|
|
||||||
// If the last two lines are identical, skip storing this line in history
|
// If the last two lines are identical, skip storing this line in history
|
||||||
// by not incrementing edit_line
|
// by not incrementing edit_line
|
||||||
if (strcmp(workline, key_lines[(edit_line-1)&(CMDLINES - 1)]))
|
if (strcmp(workline, key_lines[(edit_line - 1) & (CMDLINES - 1)]))
|
||||||
edit_line = (edit_line + 1) & (CMDLINES - 1);
|
edit_line = (edit_line + 1) & (CMDLINES - 1);
|
||||||
|
|
||||||
history_line = edit_line;
|
history_line = edit_line;
|
||||||
|
@ -676,11 +676,11 @@ void Key_Console (int key)
|
||||||
len = strlen(workline);
|
len = strlen(workline);
|
||||||
if ((int)len == key_linepos)
|
if ((int)len == key_linepos)
|
||||||
{
|
{
|
||||||
len = strlen(key_lines[(edit_line + (CMDLINES-1)) & (CMDLINES-1)]);
|
len = strlen(key_lines[(edit_line + (CMDLINES - 1)) & (CMDLINES - 1)]);
|
||||||
if ((int)len <= key_linepos)
|
if ((int)len <= key_linepos)
|
||||||
return; // no character to get
|
return; // no character to get
|
||||||
workline += key_linepos;
|
workline += key_linepos;
|
||||||
*workline = key_lines[(edit_line + (CMDLINES-1)) & (CMDLINES-1)][key_linepos];
|
*workline = key_lines[(edit_line + (CMDLINES - 1)) & (CMDLINES - 1)][key_linepos];
|
||||||
workline[1] = 0;
|
workline[1] = 0;
|
||||||
key_linepos++;
|
key_linepos++;
|
||||||
}
|
}
|
||||||
|
@ -698,7 +698,7 @@ void Key_Console (int key)
|
||||||
history_line_last = history_line;
|
history_line_last = history_line;
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
history_line = (history_line - 1) & (CMDLINES-1);
|
history_line = (history_line - 1) & (CMDLINES - 1);
|
||||||
} while (history_line != edit_line && !key_lines[history_line][1]);
|
} while (history_line != edit_line && !key_lines[history_line][1]);
|
||||||
|
|
||||||
if (history_line == edit_line)
|
if (history_line == edit_line)
|
||||||
|
@ -721,7 +721,7 @@ void Key_Console (int key)
|
||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
history_line = (history_line + 1) & (CMDLINES-1);
|
history_line = (history_line + 1) & (CMDLINES - 1);
|
||||||
} while (history_line != edit_line && !key_lines[history_line][1]);
|
} while (history_line != edit_line && !key_lines[history_line][1]);
|
||||||
|
|
||||||
if (history_line == edit_line)
|
if (history_line == edit_line)
|
||||||
|
|
265
Quake/lodepng.c
265
Quake/lodepng.c
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
LodePNG version 20220109
|
LodePNG version 20220717
|
||||||
|
|
||||||
Copyright (c) 2005-2022 Lode Vandevenne
|
Copyright (c) 2005-2022 Lode Vandevenne
|
||||||
|
|
||||||
|
@ -44,10 +44,10 @@ Rename this file to lodepng.cpp to use it for C++, or to lodepng.c to use it for
|
||||||
#pragma warning( disable : 4996 ) /*VS does not like fopen, but fopen_s is not standard C so unusable here*/
|
#pragma warning( disable : 4996 ) /*VS does not like fopen, but fopen_s is not standard C so unusable here*/
|
||||||
#endif /*_MSC_VER */
|
#endif /*_MSC_VER */
|
||||||
|
|
||||||
const char* LODEPNG_VERSION_STRING = "20220109";
|
const char* LODEPNG_VERSION_STRING = "20220717";
|
||||||
|
|
||||||
/*
|
/*
|
||||||
This source file is built up in the following large parts. The code sections
|
This source file is divided into the following large parts. The code sections
|
||||||
with the "LODEPNG_COMPILE_" #defines divide this up further in an intermixed way.
|
with the "LODEPNG_COMPILE_" #defines divide this up further in an intermixed way.
|
||||||
-Tools for C and common code for PNG and Zlib
|
-Tools for C and common code for PNG and Zlib
|
||||||
-C Code for Zlib (huffman, deflate, ...)
|
-C Code for Zlib (huffman, deflate, ...)
|
||||||
|
@ -713,10 +713,11 @@ static unsigned HuffmanTree_makeTable(HuffmanTree* tree) {
|
||||||
numpresent = 0;
|
numpresent = 0;
|
||||||
for(i = 0; i < tree->numcodes; ++i) {
|
for(i = 0; i < tree->numcodes; ++i) {
|
||||||
unsigned l = tree->lengths[i];
|
unsigned l = tree->lengths[i];
|
||||||
unsigned symbol = tree->codes[i]; /*the huffman bit pattern. i itself is the value.*/
|
unsigned symbol, reverse;
|
||||||
/*reverse bits, because the huffman bits are given in MSB first order but the bit reader reads LSB first*/
|
|
||||||
unsigned reverse = reverseBits(symbol, l);
|
|
||||||
if(l == 0) continue;
|
if(l == 0) continue;
|
||||||
|
symbol = tree->codes[i]; /*the huffman bit pattern. i itself is the value.*/
|
||||||
|
/*reverse bits, because the huffman bits are given in MSB first order but the bit reader reads LSB first*/
|
||||||
|
reverse = reverseBits(symbol, l);
|
||||||
numpresent++;
|
numpresent++;
|
||||||
|
|
||||||
if(l <= FIRSTBITS) {
|
if(l <= FIRSTBITS) {
|
||||||
|
@ -1369,8 +1370,11 @@ static unsigned inflateNoCompression(ucvector* out, LodePNGBitReader* reader,
|
||||||
/*read the literal data: LEN bytes are now stored in the out buffer*/
|
/*read the literal data: LEN bytes are now stored in the out buffer*/
|
||||||
if(bytepos + LEN > size) return 23; /*error: reading outside of in buffer*/
|
if(bytepos + LEN > size) return 23; /*error: reading outside of in buffer*/
|
||||||
|
|
||||||
lodepng_memcpy(out->data + out->size - LEN, reader->data + bytepos, LEN);
|
/*out->data can be NULL (when LEN is zero), and arithmetics on NULL ptr is undefined*/
|
||||||
bytepos += LEN;
|
if (LEN) {
|
||||||
|
lodepng_memcpy(out->data + out->size - LEN, reader->data + bytepos, LEN);
|
||||||
|
bytepos += LEN;
|
||||||
|
}
|
||||||
|
|
||||||
reader->bp = bytepos << 3u;
|
reader->bp = bytepos << 3u;
|
||||||
|
|
||||||
|
@ -2371,7 +2375,7 @@ const LodePNGDecompressSettings lodepng_default_decompress_settings = {0, 0, 0,
|
||||||
/* ////////////////////////////////////////////////////////////////////////// */
|
/* ////////////////////////////////////////////////////////////////////////// */
|
||||||
|
|
||||||
|
|
||||||
#ifndef LODEPNG_NO_COMPILE_CRC
|
#ifdef LODEPNG_COMPILE_CRC
|
||||||
/* CRC polynomial: 0xedb88320 */
|
/* CRC polynomial: 0xedb88320 */
|
||||||
static unsigned lodepng_crc32_table[256] = {
|
static unsigned lodepng_crc32_table[256] = {
|
||||||
0u, 1996959894u, 3993919788u, 2567524794u, 124634137u, 1886057615u, 3915621685u, 2657392035u,
|
0u, 1996959894u, 3993919788u, 2567524794u, 124634137u, 1886057615u, 3915621685u, 2657392035u,
|
||||||
|
@ -2417,9 +2421,11 @@ unsigned lodepng_crc32(const unsigned char* data, size_t length) {
|
||||||
}
|
}
|
||||||
return r ^ 0xffffffffu;
|
return r ^ 0xffffffffu;
|
||||||
}
|
}
|
||||||
#else /* !LODEPNG_NO_COMPILE_CRC */
|
#else /* LODEPNG_COMPILE_CRC */
|
||||||
|
/*in this case, the function is only declared here, and must be defined externally
|
||||||
|
so that it will be linked in*/
|
||||||
unsigned lodepng_crc32(const unsigned char* data, size_t length);
|
unsigned lodepng_crc32(const unsigned char* data, size_t length);
|
||||||
#endif /* !LODEPNG_NO_COMPILE_CRC */
|
#endif /* LODEPNG_COMPILE_CRC */
|
||||||
|
|
||||||
/* ////////////////////////////////////////////////////////////////////////// */
|
/* ////////////////////////////////////////////////////////////////////////// */
|
||||||
/* / Reading and writing PNG color channel bits / */
|
/* / Reading and writing PNG color channel bits / */
|
||||||
|
@ -2457,7 +2463,7 @@ static void setBitOfReversedStream(size_t* bitpointer, unsigned char* bitstream,
|
||||||
/* ////////////////////////////////////////////////////////////////////////// */
|
/* ////////////////////////////////////////////////////////////////////////// */
|
||||||
|
|
||||||
unsigned lodepng_chunk_length(const unsigned char* chunk) {
|
unsigned lodepng_chunk_length(const unsigned char* chunk) {
|
||||||
return lodepng_read32bitInt(&chunk[0]);
|
return lodepng_read32bitInt(chunk);
|
||||||
}
|
}
|
||||||
|
|
||||||
void lodepng_chunk_type(char type[5], const unsigned char* chunk) {
|
void lodepng_chunk_type(char type[5], const unsigned char* chunk) {
|
||||||
|
@ -2507,34 +2513,32 @@ void lodepng_chunk_generate_crc(unsigned char* chunk) {
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned char* lodepng_chunk_next(unsigned char* chunk, unsigned char* end) {
|
unsigned char* lodepng_chunk_next(unsigned char* chunk, unsigned char* end) {
|
||||||
if(chunk >= end || end - chunk < 12) return end; /*too small to contain a chunk*/
|
size_t available_size = (size_t)(end - chunk);
|
||||||
|
if(chunk >= end || available_size < 12) return end; /*too small to contain a chunk*/
|
||||||
if(chunk[0] == 0x89 && chunk[1] == 0x50 && chunk[2] == 0x4e && chunk[3] == 0x47
|
if(chunk[0] == 0x89 && chunk[1] == 0x50 && chunk[2] == 0x4e && chunk[3] == 0x47
|
||||||
&& chunk[4] == 0x0d && chunk[5] == 0x0a && chunk[6] == 0x1a && chunk[7] == 0x0a) {
|
&& chunk[4] == 0x0d && chunk[5] == 0x0a && chunk[6] == 0x1a && chunk[7] == 0x0a) {
|
||||||
/* Is PNG magic header at start of PNG file. Jump to first actual chunk. */
|
/* Is PNG magic header at start of PNG file. Jump to first actual chunk. */
|
||||||
return chunk + 8;
|
return chunk + 8;
|
||||||
} else {
|
} else {
|
||||||
size_t total_chunk_length;
|
size_t total_chunk_length;
|
||||||
unsigned char* result;
|
|
||||||
if(lodepng_addofl(lodepng_chunk_length(chunk), 12, &total_chunk_length)) return end;
|
if(lodepng_addofl(lodepng_chunk_length(chunk), 12, &total_chunk_length)) return end;
|
||||||
result = chunk + total_chunk_length;
|
if(total_chunk_length > available_size) return end; /*outside of range*/
|
||||||
if(result < chunk) return end; /*pointer overflow*/
|
return chunk + total_chunk_length;
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const unsigned char* lodepng_chunk_next_const(const unsigned char* chunk, const unsigned char* end) {
|
const unsigned char* lodepng_chunk_next_const(const unsigned char* chunk, const unsigned char* end) {
|
||||||
if(chunk >= end || end - chunk < 12) return end; /*too small to contain a chunk*/
|
size_t available_size = (size_t)(end - chunk);
|
||||||
|
if(chunk >= end || available_size < 12) return end; /*too small to contain a chunk*/
|
||||||
if(chunk[0] == 0x89 && chunk[1] == 0x50 && chunk[2] == 0x4e && chunk[3] == 0x47
|
if(chunk[0] == 0x89 && chunk[1] == 0x50 && chunk[2] == 0x4e && chunk[3] == 0x47
|
||||||
&& chunk[4] == 0x0d && chunk[5] == 0x0a && chunk[6] == 0x1a && chunk[7] == 0x0a) {
|
&& chunk[4] == 0x0d && chunk[5] == 0x0a && chunk[6] == 0x1a && chunk[7] == 0x0a) {
|
||||||
/* Is PNG magic header at start of PNG file. Jump to first actual chunk. */
|
/* Is PNG magic header at start of PNG file. Jump to first actual chunk. */
|
||||||
return chunk + 8;
|
return chunk + 8;
|
||||||
} else {
|
} else {
|
||||||
size_t total_chunk_length;
|
size_t total_chunk_length;
|
||||||
const unsigned char* result;
|
|
||||||
if(lodepng_addofl(lodepng_chunk_length(chunk), 12, &total_chunk_length)) return end;
|
if(lodepng_addofl(lodepng_chunk_length(chunk), 12, &total_chunk_length)) return end;
|
||||||
result = chunk + total_chunk_length;
|
if(total_chunk_length > available_size) return end; /*outside of range*/
|
||||||
if(result < chunk) return end; /*pointer overflow*/
|
return chunk + total_chunk_length;
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3044,6 +3048,9 @@ void lodepng_info_init(LodePNGInfo* info) {
|
||||||
info->iccp_name = NULL;
|
info->iccp_name = NULL;
|
||||||
info->iccp_profile = NULL;
|
info->iccp_profile = NULL;
|
||||||
|
|
||||||
|
info->sbit_defined = 0;
|
||||||
|
info->sbit_r = info->sbit_g = info->sbit_b = info->sbit_a = 0;
|
||||||
|
|
||||||
LodePNGUnknownChunks_init(info);
|
LodePNGUnknownChunks_init(info);
|
||||||
#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
|
#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
|
||||||
}
|
}
|
||||||
|
@ -3588,6 +3595,9 @@ unsigned lodepng_convert(unsigned char* out, const unsigned char* in,
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef LODEPNG_COMPILE_ENCODER
|
||||||
|
|
||||||
|
#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
|
||||||
|
|
||||||
/* Converts a single rgb color without alpha from one type to another, color bits truncated to
|
/* Converts a single rgb color without alpha from one type to another, color bits truncated to
|
||||||
their bitdepth. In case of single channel (gray or palette), only the r channel is used. Slow
|
their bitdepth. In case of single channel (gray or palette), only the r channel is used. Slow
|
||||||
|
@ -3595,7 +3605,7 @@ function, do not use to process all pixels of an image. Alpha channel not suppor
|
||||||
this is for bKGD, supporting alpha may prevent it from finding a color in the palette, from the
|
this is for bKGD, supporting alpha may prevent it from finding a color in the palette, from the
|
||||||
specification it looks like bKGD should ignore the alpha values of the palette since it can use
|
specification it looks like bKGD should ignore the alpha values of the palette since it can use
|
||||||
any palette index but doesn't have an alpha channel. Idem with ignoring color key. */
|
any palette index but doesn't have an alpha channel. Idem with ignoring color key. */
|
||||||
unsigned lodepng_convert_rgb(
|
static unsigned lodepng_convert_rgb(
|
||||||
unsigned* r_out, unsigned* g_out, unsigned* b_out,
|
unsigned* r_out, unsigned* g_out, unsigned* b_out,
|
||||||
unsigned r_in, unsigned g_in, unsigned b_in,
|
unsigned r_in, unsigned g_in, unsigned b_in,
|
||||||
const LodePNGColorMode* mode_out, const LodePNGColorMode* mode_in) {
|
const LodePNGColorMode* mode_out, const LodePNGColorMode* mode_in) {
|
||||||
|
@ -3645,7 +3655,7 @@ unsigned lodepng_convert_rgb(
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef LODEPNG_COMPILE_ENCODER
|
#endif /* LODEPNG_COMPILE_ANCILLARY_CHUNKS */
|
||||||
|
|
||||||
void lodepng_color_stats_init(LodePNGColorStats* stats) {
|
void lodepng_color_stats_init(LodePNGColorStats* stats) {
|
||||||
/*stats*/
|
/*stats*/
|
||||||
|
@ -3938,7 +3948,7 @@ static unsigned auto_choose_color(LodePNGColorMode* mode_out,
|
||||||
if(mode_in->colortype == LCT_PALETTE && mode_in->palettesize >= mode_out->palettesize
|
if(mode_in->colortype == LCT_PALETTE && mode_in->palettesize >= mode_out->palettesize
|
||||||
&& mode_in->bitdepth == mode_out->bitdepth) {
|
&& mode_in->bitdepth == mode_out->bitdepth) {
|
||||||
/*If input should have same palette colors, keep original to preserve its order and prevent conversion*/
|
/*If input should have same palette colors, keep original to preserve its order and prevent conversion*/
|
||||||
lodepng_color_mode_cleanup(mode_out);
|
lodepng_color_mode_cleanup(mode_out); /*clears palette, keeps the above set colortype and bitdepth fields as-is*/
|
||||||
lodepng_color_mode_copy(mode_out, mode_in);
|
lodepng_color_mode_copy(mode_out, mode_in);
|
||||||
}
|
}
|
||||||
} else /*8-bit or 16-bit per channel*/ {
|
} else /*8-bit or 16-bit per channel*/ {
|
||||||
|
@ -4725,6 +4735,47 @@ static unsigned readChunk_iCCP(LodePNGInfo* info, const LodePNGDecoderSettings*
|
||||||
if(!error && !info->iccp_profile_size) error = 100; /*invalid ICC profile size*/
|
if(!error && !info->iccp_profile_size) error = 100; /*invalid ICC profile size*/
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*significant bits chunk (sBIT)*/
|
||||||
|
static unsigned readChunk_sBIT(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) {
|
||||||
|
unsigned bitdepth = (info->color.colortype == LCT_PALETTE) ? 8 : info->color.bitdepth;
|
||||||
|
if(info->color.colortype == LCT_GREY) {
|
||||||
|
/*error: this chunk must be 1 bytes for grayscale image*/
|
||||||
|
if(chunkLength != 1) return 114;
|
||||||
|
if(data[0] == 0 || data[0] > bitdepth) return 115;
|
||||||
|
info->sbit_defined = 1;
|
||||||
|
info->sbit_r = info->sbit_g = info->sbit_b = data[0]; /*setting g and b is not required, but sensible*/
|
||||||
|
} else if(info->color.colortype == LCT_RGB || info->color.colortype == LCT_PALETTE) {
|
||||||
|
/*error: this chunk must be 3 bytes for RGB and palette image*/
|
||||||
|
if(chunkLength != 3) return 114;
|
||||||
|
if(data[0] == 0 || data[1] == 0 || data[2] == 0) return 115;
|
||||||
|
if(data[0] > bitdepth || data[1] > bitdepth || data[2] > bitdepth) return 115;
|
||||||
|
info->sbit_defined = 1;
|
||||||
|
info->sbit_r = data[0];
|
||||||
|
info->sbit_g = data[1];
|
||||||
|
info->sbit_b = data[2];
|
||||||
|
} else if(info->color.colortype == LCT_GREY_ALPHA) {
|
||||||
|
/*error: this chunk must be 2 byte for grayscale with alpha image*/
|
||||||
|
if(chunkLength != 2) return 114;
|
||||||
|
if(data[0] == 0 || data[1] == 0) return 115;
|
||||||
|
if(data[0] > bitdepth || data[1] > bitdepth) return 115;
|
||||||
|
info->sbit_defined = 1;
|
||||||
|
info->sbit_r = info->sbit_g = info->sbit_b = data[0]; /*setting g and b is not required, but sensible*/
|
||||||
|
info->sbit_a = data[1];
|
||||||
|
} else if(info->color.colortype == LCT_RGBA) {
|
||||||
|
/*error: this chunk must be 4 bytes for grayscale image*/
|
||||||
|
if(chunkLength != 4) return 114;
|
||||||
|
if(data[0] == 0 || data[1] == 0 || data[2] == 0 || data[3] == 0) return 115;
|
||||||
|
if(data[0] > bitdepth || data[1] > bitdepth || data[2] > bitdepth || data[3] > bitdepth) return 115;
|
||||||
|
info->sbit_defined = 1;
|
||||||
|
info->sbit_r = data[0];
|
||||||
|
info->sbit_g = data[1];
|
||||||
|
info->sbit_b = data[2];
|
||||||
|
info->sbit_a = data[3];
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0; /* OK */
|
||||||
|
}
|
||||||
#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
|
#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
|
||||||
|
|
||||||
unsigned lodepng_inspect_chunk(LodePNGState* state, size_t pos,
|
unsigned lodepng_inspect_chunk(LodePNGState* state, size_t pos,
|
||||||
|
@ -4739,7 +4790,7 @@ unsigned lodepng_inspect_chunk(LodePNGState* state, size_t pos,
|
||||||
chunkLength = lodepng_chunk_length(chunk);
|
chunkLength = lodepng_chunk_length(chunk);
|
||||||
if(chunkLength > 2147483647) return 63;
|
if(chunkLength > 2147483647) return 63;
|
||||||
data = lodepng_chunk_data_const(chunk);
|
data = lodepng_chunk_data_const(chunk);
|
||||||
if(data + chunkLength + 4 > in + insize) return 30;
|
if(chunkLength + 12 > insize - pos) return 30;
|
||||||
|
|
||||||
if(lodepng_chunk_type_equals(chunk, "PLTE")) {
|
if(lodepng_chunk_type_equals(chunk, "PLTE")) {
|
||||||
error = readChunk_PLTE(&state->info_png.color, data, chunkLength);
|
error = readChunk_PLTE(&state->info_png.color, data, chunkLength);
|
||||||
|
@ -4766,6 +4817,8 @@ unsigned lodepng_inspect_chunk(LodePNGState* state, size_t pos,
|
||||||
error = readChunk_sRGB(&state->info_png, data, chunkLength);
|
error = readChunk_sRGB(&state->info_png, data, chunkLength);
|
||||||
} else if(lodepng_chunk_type_equals(chunk, "iCCP")) {
|
} else if(lodepng_chunk_type_equals(chunk, "iCCP")) {
|
||||||
error = readChunk_iCCP(&state->info_png, &state->decoder, data, chunkLength);
|
error = readChunk_iCCP(&state->info_png, &state->decoder, data, chunkLength);
|
||||||
|
} else if(lodepng_chunk_type_equals(chunk, "sBIT")) {
|
||||||
|
error = readChunk_sBIT(&state->info_png, data, chunkLength);
|
||||||
#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
|
#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
|
||||||
} else {
|
} else {
|
||||||
/* unhandled chunk is ok (is not an error) */
|
/* unhandled chunk is ok (is not an error) */
|
||||||
|
@ -4784,7 +4837,7 @@ static void decodeGeneric(unsigned char** out, unsigned* w, unsigned* h,
|
||||||
LodePNGState* state,
|
LodePNGState* state,
|
||||||
const unsigned char* in, size_t insize) {
|
const unsigned char* in, size_t insize) {
|
||||||
unsigned char IEND = 0;
|
unsigned char IEND = 0;
|
||||||
const unsigned char* chunk;
|
const unsigned char* chunk; /*points to beginning of next chunk*/
|
||||||
unsigned char* idat; /*the data from idat chunks, zlib compressed*/
|
unsigned char* idat; /*the data from idat chunks, zlib compressed*/
|
||||||
size_t idatsize = 0;
|
size_t idatsize = 0;
|
||||||
unsigned char* scanlines = 0;
|
unsigned char* scanlines = 0;
|
||||||
|
@ -4820,14 +4873,15 @@ static void decodeGeneric(unsigned char** out, unsigned* w, unsigned* h,
|
||||||
while(!IEND && !state->error) {
|
while(!IEND && !state->error) {
|
||||||
unsigned chunkLength;
|
unsigned chunkLength;
|
||||||
const unsigned char* data; /*the data in the chunk*/
|
const unsigned char* data; /*the data in the chunk*/
|
||||||
|
size_t pos = (size_t)(chunk - in);
|
||||||
|
|
||||||
/*error: size of the in buffer too small to contain next chunk*/
|
/*error: next chunk out of bounds of the in buffer*/
|
||||||
if((size_t)((chunk - in) + 12) > insize || chunk < in) {
|
if(chunk < in || pos + 12 > insize) {
|
||||||
if(state->decoder.ignore_end) break; /*other errors may still happen though*/
|
if(state->decoder.ignore_end) break; /*other errors may still happen though*/
|
||||||
CERROR_BREAK(state->error, 30);
|
CERROR_BREAK(state->error, 30);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*length of the data of the chunk, excluding the length bytes, chunk type and CRC bytes*/
|
/*length of the data of the chunk, excluding the 12 bytes for length, chunk type and CRC*/
|
||||||
chunkLength = lodepng_chunk_length(chunk);
|
chunkLength = lodepng_chunk_length(chunk);
|
||||||
/*error: chunk length larger than the max PNG chunk size*/
|
/*error: chunk length larger than the max PNG chunk size*/
|
||||||
if(chunkLength > 2147483647) {
|
if(chunkLength > 2147483647) {
|
||||||
|
@ -4835,8 +4889,8 @@ static void decodeGeneric(unsigned char** out, unsigned* w, unsigned* h,
|
||||||
CERROR_BREAK(state->error, 63);
|
CERROR_BREAK(state->error, 63);
|
||||||
}
|
}
|
||||||
|
|
||||||
if((size_t)((chunk - in) + chunkLength + 12) > insize || (chunk + chunkLength + 12) < in) {
|
if(pos + (size_t)chunkLength + 12 > insize || pos + (size_t)chunkLength + 12 < pos) {
|
||||||
CERROR_BREAK(state->error, 64); /*error: size of the in buffer too small to contain next chunk*/
|
CERROR_BREAK(state->error, 64); /*error: size of the in buffer too small to contain next chunk (or int overflow)*/
|
||||||
}
|
}
|
||||||
|
|
||||||
data = lodepng_chunk_data_const(chunk);
|
data = lodepng_chunk_data_const(chunk);
|
||||||
|
@ -4910,6 +4964,9 @@ static void decodeGeneric(unsigned char** out, unsigned* w, unsigned* h,
|
||||||
} else if(lodepng_chunk_type_equals(chunk, "iCCP")) {
|
} else if(lodepng_chunk_type_equals(chunk, "iCCP")) {
|
||||||
state->error = readChunk_iCCP(&state->info_png, &state->decoder, data, chunkLength);
|
state->error = readChunk_iCCP(&state->info_png, &state->decoder, data, chunkLength);
|
||||||
if(state->error) break;
|
if(state->error) break;
|
||||||
|
} else if(lodepng_chunk_type_equals(chunk, "sBIT")) {
|
||||||
|
state->error = readChunk_sBIT(&state->info_png, data, chunkLength);
|
||||||
|
if(state->error) break;
|
||||||
#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
|
#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
|
||||||
} else /*it's not an implemented chunk type, so ignore it: skip over the data*/ {
|
} else /*it's not an implemented chunk type, so ignore it: skip over the data*/ {
|
||||||
/*error: unknown critical chunk (5th bit of first byte of chunk type is 0)*/
|
/*error: unknown critical chunk (5th bit of first byte of chunk type is 0)*/
|
||||||
|
@ -5145,6 +5202,10 @@ static unsigned addChunk_PLTE(ucvector* out, const LodePNGColorMode* info) {
|
||||||
unsigned char* chunk;
|
unsigned char* chunk;
|
||||||
size_t i, j = 8;
|
size_t i, j = 8;
|
||||||
|
|
||||||
|
if(info->palettesize == 0 || info->palettesize > 256) {
|
||||||
|
return 68; /*invalid palette size, it is only allowed to be 1-256*/
|
||||||
|
}
|
||||||
|
|
||||||
CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, info->palettesize * 3, "PLTE"));
|
CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, info->palettesize * 3, "PLTE"));
|
||||||
|
|
||||||
for(i = 0; i != info->palettesize; ++i) {
|
for(i = 0; i != info->palettesize; ++i) {
|
||||||
|
@ -5400,6 +5461,42 @@ static unsigned addChunk_iCCP(ucvector* out, const LodePNGInfo* info, LodePNGCom
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static unsigned addChunk_sBIT(ucvector* out, const LodePNGInfo* info) {
|
||||||
|
unsigned bitdepth = (info->color.colortype == LCT_PALETTE) ? 8 : info->color.bitdepth;
|
||||||
|
unsigned char* chunk = 0;
|
||||||
|
if(info->color.colortype == LCT_GREY) {
|
||||||
|
if(info->sbit_r == 0 || info->sbit_r > bitdepth) return 115;
|
||||||
|
CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 1, "sBIT"));
|
||||||
|
chunk[8] = info->sbit_r;
|
||||||
|
} else if(info->color.colortype == LCT_RGB || info->color.colortype == LCT_PALETTE) {
|
||||||
|
if(info->sbit_r == 0 || info->sbit_g == 0 || info->sbit_b == 0) return 115;
|
||||||
|
if(info->sbit_r > bitdepth || info->sbit_g > bitdepth || info->sbit_b > bitdepth) return 115;
|
||||||
|
CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 3, "sBIT"));
|
||||||
|
chunk[8] = info->sbit_r;
|
||||||
|
chunk[9] = info->sbit_g;
|
||||||
|
chunk[10] = info->sbit_b;
|
||||||
|
} else if(info->color.colortype == LCT_GREY_ALPHA) {
|
||||||
|
if(info->sbit_r == 0 || info->sbit_a == 0) return 115;
|
||||||
|
if(info->sbit_r > bitdepth || info->sbit_a > bitdepth) return 115;
|
||||||
|
CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 2, "sBIT"));
|
||||||
|
chunk[8] = info->sbit_r;
|
||||||
|
chunk[9] = info->sbit_a;
|
||||||
|
} else if(info->color.colortype == LCT_RGBA) {
|
||||||
|
if(info->sbit_r == 0 || info->sbit_g == 0 || info->sbit_b == 0 || info->sbit_a == 0 ||
|
||||||
|
info->sbit_r > bitdepth || info->sbit_g > bitdepth ||
|
||||||
|
info->sbit_b > bitdepth || info->sbit_a > bitdepth) {
|
||||||
|
return 115;
|
||||||
|
}
|
||||||
|
CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 4, "sBIT"));
|
||||||
|
chunk[8] = info->sbit_r;
|
||||||
|
chunk[9] = info->sbit_g;
|
||||||
|
chunk[10] = info->sbit_b;
|
||||||
|
chunk[11] = info->sbit_a;
|
||||||
|
}
|
||||||
|
if(chunk) lodepng_chunk_generate_crc(chunk);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
|
#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
|
||||||
|
|
||||||
static void filterScanline(unsigned char* out, const unsigned char* scanline, const unsigned char* prevline,
|
static void filterScanline(unsigned char* out, const unsigned char* scanline, const unsigned char* prevline,
|
||||||
|
@ -5845,8 +5942,10 @@ unsigned lodepng_encode(unsigned char** out, size_t* outsize,
|
||||||
ucvector outv = ucvector_init(NULL, 0);
|
ucvector outv = ucvector_init(NULL, 0);
|
||||||
LodePNGInfo info;
|
LodePNGInfo info;
|
||||||
const LodePNGInfo* info_png = &state->info_png;
|
const LodePNGInfo* info_png = &state->info_png;
|
||||||
|
LodePNGColorMode auto_color;
|
||||||
|
|
||||||
lodepng_info_init(&info);
|
lodepng_info_init(&info);
|
||||||
|
lodepng_color_mode_init(&auto_color);
|
||||||
|
|
||||||
/*provide some proper output values if error will happen*/
|
/*provide some proper output values if error will happen*/
|
||||||
*out = 0;
|
*out = 0;
|
||||||
|
@ -5856,6 +5955,10 @@ unsigned lodepng_encode(unsigned char** out, size_t* outsize,
|
||||||
/*check input values validity*/
|
/*check input values validity*/
|
||||||
if((info_png->color.colortype == LCT_PALETTE || state->encoder.force_palette)
|
if((info_png->color.colortype == LCT_PALETTE || state->encoder.force_palette)
|
||||||
&& (info_png->color.palettesize == 0 || info_png->color.palettesize > 256)) {
|
&& (info_png->color.palettesize == 0 || info_png->color.palettesize > 256)) {
|
||||||
|
/*this error is returned even if auto_convert is enabled and thus encoder could
|
||||||
|
generate the palette by itself: while allowing this could be possible in theory,
|
||||||
|
it may complicate the code or edge cases, and always requiring to give a palette
|
||||||
|
when setting this color type is a simpler contract*/
|
||||||
state->error = 68; /*invalid palette size, it is only allowed to be 1-256*/
|
state->error = 68; /*invalid palette size, it is only allowed to be 1-256*/
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
@ -5876,6 +5979,7 @@ unsigned lodepng_encode(unsigned char** out, size_t* outsize,
|
||||||
lodepng_info_copy(&info, &state->info_png);
|
lodepng_info_copy(&info, &state->info_png);
|
||||||
if(state->encoder.auto_convert) {
|
if(state->encoder.auto_convert) {
|
||||||
LodePNGColorStats stats;
|
LodePNGColorStats stats;
|
||||||
|
unsigned allow_convert = 1;
|
||||||
lodepng_color_stats_init(&stats);
|
lodepng_color_stats_init(&stats);
|
||||||
#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
|
#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
|
||||||
if(info_png->iccp_defined &&
|
if(info_png->iccp_defined &&
|
||||||
|
@ -5897,23 +6001,85 @@ unsigned lodepng_encode(unsigned char** out, size_t* outsize,
|
||||||
/*the background chunk's color must be taken into account as well*/
|
/*the background chunk's color must be taken into account as well*/
|
||||||
unsigned r = 0, g = 0, b = 0;
|
unsigned r = 0, g = 0, b = 0;
|
||||||
LodePNGColorMode mode16 = lodepng_color_mode_make(LCT_RGB, 16);
|
LodePNGColorMode mode16 = lodepng_color_mode_make(LCT_RGB, 16);
|
||||||
lodepng_convert_rgb(&r, &g, &b, info_png->background_r, info_png->background_g, info_png->background_b, &mode16, &info_png->color);
|
lodepng_convert_rgb(&r, &g, &b,
|
||||||
|
info_png->background_r, info_png->background_g, info_png->background_b, &mode16, &info_png->color);
|
||||||
state->error = lodepng_color_stats_add(&stats, r, g, b, 65535);
|
state->error = lodepng_color_stats_add(&stats, r, g, b, 65535);
|
||||||
if(state->error) goto cleanup;
|
if(state->error) goto cleanup;
|
||||||
}
|
}
|
||||||
#endif /* LODEPNG_COMPILE_ANCILLARY_CHUNKS */
|
#endif /* LODEPNG_COMPILE_ANCILLARY_CHUNKS */
|
||||||
state->error = auto_choose_color(&info.color, &state->info_raw, &stats);
|
state->error = auto_choose_color(&auto_color, &state->info_raw, &stats);
|
||||||
if(state->error) goto cleanup;
|
if(state->error) goto cleanup;
|
||||||
#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
|
#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
|
||||||
/*also convert the background chunk*/
|
if(info_png->sbit_defined) {
|
||||||
if(info_png->background_defined) {
|
/*if sbit is defined, due to strict requirements of which sbit values can be present for which color modes,
|
||||||
if(lodepng_convert_rgb(&info.background_r, &info.background_g, &info.background_b,
|
auto_convert can't be done in many cases. However, do support a few cases here.
|
||||||
info_png->background_r, info_png->background_g, info_png->background_b, &info.color, &info_png->color)) {
|
TODO: more conversions may be possible, and it may also be possible to get a more appropriate color type out of
|
||||||
state->error = 104;
|
auto_choose_color if knowledge about sbit is used beforehand
|
||||||
goto cleanup;
|
*/
|
||||||
|
unsigned sbit_max = LODEPNG_MAX(LODEPNG_MAX(LODEPNG_MAX(info_png->sbit_r, info_png->sbit_g),
|
||||||
|
info_png->sbit_b), info_png->sbit_a);
|
||||||
|
unsigned equal = (!info_png->sbit_g || info_png->sbit_g == info_png->sbit_r)
|
||||||
|
&& (!info_png->sbit_b || info_png->sbit_b == info_png->sbit_r)
|
||||||
|
&& (!info_png->sbit_a || info_png->sbit_a == info_png->sbit_r);
|
||||||
|
allow_convert = 0;
|
||||||
|
if(info.color.colortype == LCT_PALETTE &&
|
||||||
|
auto_color.colortype == LCT_PALETTE) {
|
||||||
|
/* input and output are palette, and in this case it may happen that palette data is
|
||||||
|
expected to be copied from info_raw into the info_png */
|
||||||
|
allow_convert = 1;
|
||||||
|
}
|
||||||
|
/*going from 8-bit RGB to palette (or 16-bit as long as sbit_max <= 8) is possible
|
||||||
|
since both are 8-bit RGB for sBIT's purposes*/
|
||||||
|
if(info.color.colortype == LCT_RGB &&
|
||||||
|
auto_color.colortype == LCT_PALETTE && sbit_max <= 8) {
|
||||||
|
allow_convert = 1;
|
||||||
|
}
|
||||||
|
/*going from 8-bit RGBA to palette is also ok but only if sbit_a is exactly 8*/
|
||||||
|
if(info.color.colortype == LCT_RGBA && auto_color.colortype == LCT_PALETTE &&
|
||||||
|
info_png->sbit_a == 8 && sbit_max <= 8) {
|
||||||
|
allow_convert = 1;
|
||||||
|
}
|
||||||
|
/*going from 16-bit RGB(A) to 8-bit RGB(A) is ok if all sbit values are <= 8*/
|
||||||
|
if((info.color.colortype == LCT_RGB || info.color.colortype == LCT_RGBA) && info.color.bitdepth == 16 &&
|
||||||
|
auto_color.colortype == info.color.colortype && auto_color.bitdepth == 8 &&
|
||||||
|
sbit_max <= 8) {
|
||||||
|
allow_convert = 1;
|
||||||
|
}
|
||||||
|
/*going to less channels is ok if all bit values are equal (all possible values in sbit,
|
||||||
|
as well as the chosen bitdepth of the result). Due to how auto_convert works,
|
||||||
|
we already know that auto_color.colortype has less than or equal amount of channels than
|
||||||
|
info.colortype. Palette is not used here. This conversion is not allowed if
|
||||||
|
info_png->sbit_r < auto_color.bitdepth, because specifically for alpha, non-presence of
|
||||||
|
an sbit value heavily implies that alpha's bit depth is equal to the PNG bit depth (rather
|
||||||
|
than the bit depths set in the r, g and b sbit values, by how the PNG specification describes
|
||||||
|
handling tRNS chunk case with sBIT), so be conservative here about ignoring user input.*/
|
||||||
|
if(info.color.colortype != LCT_PALETTE && auto_color.colortype != LCT_PALETTE &&
|
||||||
|
equal && info_png->sbit_r == auto_color.bitdepth) {
|
||||||
|
allow_convert = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
if(state->encoder.force_palette) {
|
||||||
|
if(info.color.colortype != LCT_GREY && info.color.colortype != LCT_GREY_ALPHA &&
|
||||||
|
(auto_color.colortype == LCT_GREY || auto_color.colortype == LCT_GREY_ALPHA)) {
|
||||||
|
/*user speficially forced a PLTE palette, so cannot convert to grayscale types because
|
||||||
|
the PNG specification only allows writing a suggested palette in PLTE for truecolor types*/
|
||||||
|
allow_convert = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(allow_convert) {
|
||||||
|
lodepng_color_mode_copy(&info.color, &auto_color);
|
||||||
|
#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
|
||||||
|
/*also convert the background chunk*/
|
||||||
|
if(info_png->background_defined) {
|
||||||
|
if(lodepng_convert_rgb(&info.background_r, &info.background_g, &info.background_b,
|
||||||
|
info_png->background_r, info_png->background_g, info_png->background_b, &info.color, &info_png->color)) {
|
||||||
|
state->error = 104;
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
}
|
||||||
#endif /* LODEPNG_COMPILE_ANCILLARY_CHUNKS */
|
#endif /* LODEPNG_COMPILE_ANCILLARY_CHUNKS */
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
|
#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
|
||||||
if(info_png->iccp_defined) {
|
if(info_png->iccp_defined) {
|
||||||
|
@ -5984,6 +6150,10 @@ unsigned lodepng_encode(unsigned char** out, size_t* outsize,
|
||||||
state->error = addChunk_cHRM(&outv, &info);
|
state->error = addChunk_cHRM(&outv, &info);
|
||||||
if(state->error) goto cleanup;
|
if(state->error) goto cleanup;
|
||||||
}
|
}
|
||||||
|
if(info_png->sbit_defined) {
|
||||||
|
state->error = addChunk_sBIT(&outv, &info);
|
||||||
|
if(state->error) goto cleanup;
|
||||||
|
}
|
||||||
#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
|
#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/
|
||||||
/*PLTE*/
|
/*PLTE*/
|
||||||
if(info.color.colortype == LCT_PALETTE) {
|
if(info.color.colortype == LCT_PALETTE) {
|
||||||
|
@ -6090,6 +6260,7 @@ unsigned lodepng_encode(unsigned char** out, size_t* outsize,
|
||||||
cleanup:
|
cleanup:
|
||||||
lodepng_info_cleanup(&info);
|
lodepng_info_cleanup(&info);
|
||||||
lodepng_free(data);
|
lodepng_free(data);
|
||||||
|
lodepng_color_mode_cleanup(&auto_color);
|
||||||
|
|
||||||
/*instead of cleaning the vector up, give it to the output*/
|
/*instead of cleaning the vector up, give it to the output*/
|
||||||
*out = outv.data;
|
*out = outv.data;
|
||||||
|
@ -6284,6 +6455,8 @@ const char* lodepng_error_text(unsigned code) {
|
||||||
/*max ICC size limit can be configured in LodePNGDecoderSettings. This error prevents
|
/*max ICC size limit can be configured in LodePNGDecoderSettings. This error prevents
|
||||||
unreasonable memory consumption when decoding due to impossibly large ICC profile*/
|
unreasonable memory consumption when decoding due to impossibly large ICC profile*/
|
||||||
case 113: return "ICC profile unreasonably large";
|
case 113: return "ICC profile unreasonably large";
|
||||||
|
case 114: return "sBIT chunk has wrong size for the color type of the image";
|
||||||
|
case 115: return "sBIT value out of range";
|
||||||
}
|
}
|
||||||
return "unknown error code";
|
return "unknown error code";
|
||||||
}
|
}
|
||||||
|
@ -6322,7 +6495,7 @@ unsigned decompress(std::vector<unsigned char>& out, const unsigned char* in, si
|
||||||
size_t buffersize = 0;
|
size_t buffersize = 0;
|
||||||
unsigned error = zlib_decompress(&buffer, &buffersize, 0, in, insize, &settings);
|
unsigned error = zlib_decompress(&buffer, &buffersize, 0, in, insize, &settings);
|
||||||
if(buffer) {
|
if(buffer) {
|
||||||
out.insert(out.end(), &buffer[0], &buffer[buffersize]);
|
out.insert(out.end(), buffer, &buffer[buffersize]);
|
||||||
lodepng_free(buffer);
|
lodepng_free(buffer);
|
||||||
}
|
}
|
||||||
return error;
|
return error;
|
||||||
|
@ -6341,7 +6514,7 @@ unsigned compress(std::vector<unsigned char>& out, const unsigned char* in, size
|
||||||
size_t buffersize = 0;
|
size_t buffersize = 0;
|
||||||
unsigned error = zlib_compress(&buffer, &buffersize, in, insize, &settings);
|
unsigned error = zlib_compress(&buffer, &buffersize, in, insize, &settings);
|
||||||
if(buffer) {
|
if(buffer) {
|
||||||
out.insert(out.end(), &buffer[0], &buffer[buffersize]);
|
out.insert(out.end(), buffer, &buffer[buffersize]);
|
||||||
lodepng_free(buffer);
|
lodepng_free(buffer);
|
||||||
}
|
}
|
||||||
return error;
|
return error;
|
||||||
|
@ -6386,7 +6559,7 @@ unsigned decode(std::vector<unsigned char>& out, unsigned& w, unsigned& h, const
|
||||||
state.info_raw.colortype = colortype;
|
state.info_raw.colortype = colortype;
|
||||||
state.info_raw.bitdepth = bitdepth;
|
state.info_raw.bitdepth = bitdepth;
|
||||||
size_t buffersize = lodepng_get_raw_size(w, h, &state.info_raw);
|
size_t buffersize = lodepng_get_raw_size(w, h, &state.info_raw);
|
||||||
out.insert(out.end(), &buffer[0], &buffer[buffersize]);
|
out.insert(out.end(), buffer, &buffer[buffersize]);
|
||||||
}
|
}
|
||||||
lodepng_free(buffer);
|
lodepng_free(buffer);
|
||||||
return error;
|
return error;
|
||||||
|
@ -6404,7 +6577,7 @@ unsigned decode(std::vector<unsigned char>& out, unsigned& w, unsigned& h,
|
||||||
unsigned error = lodepng_decode(&buffer, &w, &h, &state, in, insize);
|
unsigned error = lodepng_decode(&buffer, &w, &h, &state, in, insize);
|
||||||
if(buffer && !error) {
|
if(buffer && !error) {
|
||||||
size_t buffersize = lodepng_get_raw_size(w, h, &state.info_raw);
|
size_t buffersize = lodepng_get_raw_size(w, h, &state.info_raw);
|
||||||
out.insert(out.end(), &buffer[0], &buffer[buffersize]);
|
out.insert(out.end(), buffer, &buffer[buffersize]);
|
||||||
}
|
}
|
||||||
lodepng_free(buffer);
|
lodepng_free(buffer);
|
||||||
return error;
|
return error;
|
||||||
|
@ -6436,7 +6609,7 @@ unsigned encode(std::vector<unsigned char>& out, const unsigned char* in, unsign
|
||||||
size_t buffersize;
|
size_t buffersize;
|
||||||
unsigned error = lodepng_encode_memory(&buffer, &buffersize, in, w, h, colortype, bitdepth);
|
unsigned error = lodepng_encode_memory(&buffer, &buffersize, in, w, h, colortype, bitdepth);
|
||||||
if(buffer) {
|
if(buffer) {
|
||||||
out.insert(out.end(), &buffer[0], &buffer[buffersize]);
|
out.insert(out.end(), buffer, &buffer[buffersize]);
|
||||||
lodepng_free(buffer);
|
lodepng_free(buffer);
|
||||||
}
|
}
|
||||||
return error;
|
return error;
|
||||||
|
@ -6456,7 +6629,7 @@ unsigned encode(std::vector<unsigned char>& out,
|
||||||
size_t buffersize;
|
size_t buffersize;
|
||||||
unsigned error = lodepng_encode(&buffer, &buffersize, in, w, h, &state);
|
unsigned error = lodepng_encode(&buffer, &buffersize, in, w, h, &state);
|
||||||
if(buffer) {
|
if(buffer) {
|
||||||
out.insert(out.end(), &buffer[0], &buffer[buffersize]);
|
out.insert(out.end(), buffer, &buffer[buffersize]);
|
||||||
lodepng_free(buffer);
|
lodepng_free(buffer);
|
||||||
}
|
}
|
||||||
return error;
|
return error;
|
||||||
|
|
103
Quake/lodepng.h
103
Quake/lodepng.h
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
LodePNG version 20220109
|
LodePNG version 20220717
|
||||||
|
|
||||||
Copyright (c) 2005-2022 Lode Vandevenne
|
Copyright (c) 2005-2022 Lode Vandevenne
|
||||||
|
|
||||||
|
@ -35,43 +35,50 @@ The following #defines are used to create code sections. They can be disabled
|
||||||
to disable code sections, which can give faster compile time and smaller binary.
|
to disable code sections, which can give faster compile time and smaller binary.
|
||||||
The "NO_COMPILE" defines are designed to be used to pass as defines to the
|
The "NO_COMPILE" defines are designed to be used to pass as defines to the
|
||||||
compiler command to disable them without modifying this header, e.g.
|
compiler command to disable them without modifying this header, e.g.
|
||||||
-DLODEPNG_NO_COMPILE_ZLIB for gcc.
|
-DLODEPNG_NO_COMPILE_ZLIB for gcc or clang.
|
||||||
In addition to those below, you can also define LODEPNG_NO_COMPILE_CRC to
|
|
||||||
allow implementing a custom lodepng_crc32.
|
|
||||||
*/
|
*/
|
||||||
/*deflate & zlib. If disabled, you must specify alternative zlib functions in
|
/*deflate & zlib. If disabled, you must specify alternative zlib functions in
|
||||||
the custom_zlib field of the compress and decompress settings*/
|
the custom_zlib field of the compress and decompress settings*/
|
||||||
#ifndef LODEPNG_NO_COMPILE_ZLIB
|
#ifndef LODEPNG_NO_COMPILE_ZLIB
|
||||||
|
/*pass -DLODEPNG_NO_COMPILE_ZLIB to the compiler to disable this, or comment out LODEPNG_COMPILE_ZLIB below*/
|
||||||
#define LODEPNG_COMPILE_ZLIB
|
#define LODEPNG_COMPILE_ZLIB
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*png encoder and png decoder*/
|
/*png encoder and png decoder*/
|
||||||
#ifndef LODEPNG_NO_COMPILE_PNG
|
#ifndef LODEPNG_NO_COMPILE_PNG
|
||||||
|
/*pass -DLODEPNG_NO_COMPILE_PNG to the compiler to disable this, or comment out LODEPNG_COMPILE_PNG below*/
|
||||||
#define LODEPNG_COMPILE_PNG
|
#define LODEPNG_COMPILE_PNG
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*deflate&zlib decoder and png decoder*/
|
/*deflate&zlib decoder and png decoder*/
|
||||||
#ifndef LODEPNG_NO_COMPILE_DECODER
|
#ifndef LODEPNG_NO_COMPILE_DECODER
|
||||||
|
/*pass -DLODEPNG_NO_COMPILE_DECODER to the compiler to disable this, or comment out LODEPNG_COMPILE_DECODER below*/
|
||||||
#define LODEPNG_COMPILE_DECODER
|
#define LODEPNG_COMPILE_DECODER
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*deflate&zlib encoder and png encoder*/
|
/*deflate&zlib encoder and png encoder*/
|
||||||
#ifndef LODEPNG_NO_COMPILE_ENCODER
|
#ifndef LODEPNG_NO_COMPILE_ENCODER
|
||||||
|
/*pass -DLODEPNG_NO_COMPILE_ENCODER to the compiler to disable this, or comment out LODEPNG_COMPILE_ENCODER below*/
|
||||||
#define LODEPNG_COMPILE_ENCODER
|
#define LODEPNG_COMPILE_ENCODER
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*the optional built in harddisk file loading and saving functions*/
|
/*the optional built in harddisk file loading and saving functions*/
|
||||||
#ifndef LODEPNG_NO_COMPILE_DISK
|
#ifndef LODEPNG_NO_COMPILE_DISK
|
||||||
|
/*pass -DLODEPNG_NO_COMPILE_DISK to the compiler to disable this, or comment out LODEPNG_COMPILE_DISK below*/
|
||||||
#define LODEPNG_COMPILE_DISK
|
#define LODEPNG_COMPILE_DISK
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*support for chunks other than IHDR, IDAT, PLTE, tRNS, IEND: ancillary and unknown chunks*/
|
/*support for chunks other than IHDR, IDAT, PLTE, tRNS, IEND: ancillary and unknown chunks*/
|
||||||
#ifndef LODEPNG_NO_COMPILE_ANCILLARY_CHUNKS
|
#ifndef LODEPNG_NO_COMPILE_ANCILLARY_CHUNKS
|
||||||
|
/*pass -DLODEPNG_NO_COMPILE_ANCILLARY_CHUNKS to the compiler to disable this,
|
||||||
|
or comment out LODEPNG_COMPILE_ANCILLARY_CHUNKS below*/
|
||||||
#define LODEPNG_COMPILE_ANCILLARY_CHUNKS
|
#define LODEPNG_COMPILE_ANCILLARY_CHUNKS
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*ability to convert error numerical codes to English text string*/
|
/*ability to convert error numerical codes to English text string*/
|
||||||
#ifndef LODEPNG_NO_COMPILE_ERROR_TEXT
|
#ifndef LODEPNG_NO_COMPILE_ERROR_TEXT
|
||||||
|
/*pass -DLODEPNG_NO_COMPILE_ERROR_TEXT to the compiler to disable this,
|
||||||
|
or comment out LODEPNG_COMPILE_ERROR_TEXT below*/
|
||||||
#define LODEPNG_COMPILE_ERROR_TEXT
|
#define LODEPNG_COMPILE_ERROR_TEXT
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -79,12 +86,24 @@ the custom_zlib field of the compress and decompress settings*/
|
||||||
you can define the functions lodepng_free, lodepng_malloc and lodepng_realloc in your
|
you can define the functions lodepng_free, lodepng_malloc and lodepng_realloc in your
|
||||||
source files with custom allocators.*/
|
source files with custom allocators.*/
|
||||||
#ifndef LODEPNG_NO_COMPILE_ALLOCATORS
|
#ifndef LODEPNG_NO_COMPILE_ALLOCATORS
|
||||||
|
/*pass -DLODEPNG_NO_COMPILE_ALLOCATORS to the compiler to disable the built-in ones,
|
||||||
|
or comment out LODEPNG_COMPILE_ALLOCATORS below*/
|
||||||
#define LODEPNG_COMPILE_ALLOCATORS
|
#define LODEPNG_COMPILE_ALLOCATORS
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*Disable built-in CRC function, in that case a custom implementation of
|
||||||
|
lodepng_crc32 must be defined externally so that it can be linked in.*/
|
||||||
|
#ifndef LODEPNG_NO_COMPILE_CRC
|
||||||
|
/*pass -DLODEPNG_NO_COMPILE_CRC to the compiler to disable the built-in one,
|
||||||
|
or comment out LODEPNG_COMPILE_CRC below*/
|
||||||
|
#define LODEPNG_COMPILE_CRC
|
||||||
|
#endif
|
||||||
|
|
||||||
/*compile the C++ version (you can disable the C++ wrapper here even when compiling for C++)*/
|
/*compile the C++ version (you can disable the C++ wrapper here even when compiling for C++)*/
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
#ifndef LODEPNG_NO_COMPILE_CPP
|
#ifndef LODEPNG_NO_COMPILE_CPP
|
||||||
|
/*pass -DLODEPNG_NO_COMPILE_CPP to the compiler to disable C++ (not needed if a C-only compiler),
|
||||||
|
or comment out LODEPNG_COMPILE_CPP below*/
|
||||||
#define LODEPNG_COMPILE_CPP
|
#define LODEPNG_COMPILE_CPP
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
@ -374,8 +393,10 @@ typedef struct LodePNGColorMode {
|
||||||
|
|
||||||
The alpha channels must be set as well, set them to 255 for opaque images.
|
The alpha channels must be set as well, set them to 255 for opaque images.
|
||||||
|
|
||||||
When decoding, by default you can ignore this palette, since LodePNG already
|
When decoding, with the default settings you can ignore this palette, since
|
||||||
fills the palette colors in the pixels of the raw RGBA output.
|
LodePNG already fills the palette colors in the pixels of the raw RGBA output,
|
||||||
|
but when decoding to the original PNG color mode it is needed to reconstruct
|
||||||
|
the colors.
|
||||||
|
|
||||||
The palette is only supported for color type 3.
|
The palette is only supported for color type 3.
|
||||||
*/
|
*/
|
||||||
|
@ -465,10 +486,12 @@ typedef struct LodePNGInfo {
|
||||||
with values truncated to the bit depth in the unsigned integer.
|
with values truncated to the bit depth in the unsigned integer.
|
||||||
|
|
||||||
For grayscale and palette PNGs, the value is stored in background_r. The values
|
For grayscale and palette PNGs, the value is stored in background_r. The values
|
||||||
in background_g and background_b are then unused.
|
in background_g and background_b are then unused. The decoder will set them
|
||||||
|
equal to background_r, the encoder ignores them in this case.
|
||||||
|
|
||||||
So when decoding, you may get these in a different color mode than the one you requested
|
When decoding, you may get these in a different color mode than the one you requested
|
||||||
for the raw pixels.
|
for the raw pixels: the colortype and bitdepth defined by info_png.color, that is the
|
||||||
|
ones defined in the header of the PNG image, are used.
|
||||||
|
|
||||||
When encoding with auto_convert, you must use the color model defined in info_png.color for
|
When encoding with auto_convert, you must use the color model defined in info_png.color for
|
||||||
these values. The encoder normally ignores info_png.color when auto_convert is on, but will
|
these values. The encoder normally ignores info_png.color when auto_convert is on, but will
|
||||||
|
@ -535,7 +558,7 @@ typedef struct LodePNGInfo {
|
||||||
unsigned phys_unit; /*may be 0 (unknown unit) or 1 (metre)*/
|
unsigned phys_unit; /*may be 0 (unknown unit) or 1 (metre)*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Color profile related chunks: gAMA, cHRM, sRGB, iCPP
|
Color profile related chunks: gAMA, cHRM, sRGB, iCPP, sBIT
|
||||||
|
|
||||||
LodePNG does not apply any color conversions on pixels in the encoder or decoder and does not interpret these color
|
LodePNG does not apply any color conversions on pixels in the encoder or decoder and does not interpret these color
|
||||||
profile values. It merely passes on the information. If you wish to use color profiles and convert colors, please
|
profile values. It merely passes on the information. If you wish to use color profiles and convert colors, please
|
||||||
|
@ -598,6 +621,45 @@ typedef struct LodePNGInfo {
|
||||||
unsigned char* iccp_profile;
|
unsigned char* iccp_profile;
|
||||||
unsigned iccp_profile_size; /* The size of iccp_profile in bytes */
|
unsigned iccp_profile_size; /* The size of iccp_profile in bytes */
|
||||||
|
|
||||||
|
/*
|
||||||
|
sBIT chunk: significant bits. Optional metadata, only set this if needed.
|
||||||
|
|
||||||
|
If defined, these values give the bit depth of the original data. Since PNG only stores 1, 2, 4, 8 or 16-bit
|
||||||
|
per channel data, the significant bits value can be used to indicate the original encoded data has another
|
||||||
|
sample depth, such as 10 or 12.
|
||||||
|
|
||||||
|
Encoders using this value, when storing the pixel data, should use the most significant bits
|
||||||
|
of the data to store the original bits, and use a good sample depth scaling method such as
|
||||||
|
"left bit replication" to fill in the least significant bits, rather than fill zeroes.
|
||||||
|
|
||||||
|
Decoders using this value, if able to work with data that's e.g. 10-bit or 12-bit, should right
|
||||||
|
shift the data to go back to the original bit depth, but decoders are also allowed to ignore
|
||||||
|
sbit and work e.g. with the 8-bit or 16-bit data from the PNG directly, since thanks
|
||||||
|
to the encoder contract, the values encoded in PNG are in valid range for the PNG bit depth.
|
||||||
|
|
||||||
|
For grayscale images, sbit_g and sbit_b are not used, and for images that don't use color
|
||||||
|
type RGBA or grayscale+alpha, sbit_a is not used (it's not used even for palette images with
|
||||||
|
translucent palette values, or images with color key). The values that are used must be
|
||||||
|
greater than zero and smaller than or equal to the PNG bit depth.
|
||||||
|
|
||||||
|
The color type from the header in the PNG image defines these used and unused fields: if
|
||||||
|
decoding with a color mode conversion, such as always decoding to RGBA, this metadata still
|
||||||
|
only uses the color type of the original PNG, and may e.g. lack the alpha channel info
|
||||||
|
if the PNG was RGB. When encoding with auto_convert (as well as without), also always the
|
||||||
|
color model defined in info_png.color determines this.
|
||||||
|
|
||||||
|
NOTE: enabling sbit can hurt compression, because the encoder can then not always use
|
||||||
|
auto_convert to choose a more optimal color mode for the data, because the PNG format has
|
||||||
|
strict requirements for the allowed sbit values in combination with color modes.
|
||||||
|
For example, setting these fields to 10-bit will force the encoder to keep using a 16-bit per channel
|
||||||
|
color mode, even if the pixel data would in fact fit in a more efficient 8-bit mode.
|
||||||
|
*/
|
||||||
|
unsigned sbit_defined; /*is significant bits given? if not, the values below are unused*/
|
||||||
|
unsigned sbit_r; /*red or gray component of significant bits*/
|
||||||
|
unsigned sbit_g; /*green component of significant bits*/
|
||||||
|
unsigned sbit_b; /*blue component of significant bits*/
|
||||||
|
unsigned sbit_a; /*alpha component of significant bits*/
|
||||||
|
|
||||||
/* End of color profile related chunks */
|
/* End of color profile related chunks */
|
||||||
|
|
||||||
|
|
||||||
|
@ -770,7 +832,11 @@ typedef struct LodePNGEncoderSettings {
|
||||||
const unsigned char* predefined_filters;
|
const unsigned char* predefined_filters;
|
||||||
|
|
||||||
/*force creating a PLTE chunk if colortype is 2 or 6 (= a suggested palette).
|
/*force creating a PLTE chunk if colortype is 2 or 6 (= a suggested palette).
|
||||||
If colortype is 3, PLTE is _always_ created.*/
|
If colortype is 3, PLTE is always created. If color type is explicitely set
|
||||||
|
to a grayscale type (1 or 4), this is not done and is ignored. If enabling this,
|
||||||
|
a palette must be present in the info_png.
|
||||||
|
NOTE: enabling this may worsen compression if auto_convert is used to choose
|
||||||
|
optimal color mode, because it cannot use grayscale color modes in this case*/
|
||||||
unsigned force_palette;
|
unsigned force_palette;
|
||||||
#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
|
#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS
|
||||||
/*add LodePNG identifier and version as a text chunk, for debugging*/
|
/*add LodePNG identifier and version as a text chunk, for debugging*/
|
||||||
|
@ -824,8 +890,8 @@ unsigned lodepng_inspect(unsigned* w, unsigned* h,
|
||||||
#endif /*LODEPNG_COMPILE_DECODER*/
|
#endif /*LODEPNG_COMPILE_DECODER*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Reads one metadata chunk (other than IHDR) of the PNG file and outputs what it
|
Reads one metadata chunk (other than IHDR, which is handled by lodepng_inspect)
|
||||||
read in the state. Returns error code on failure.
|
of the PNG file and outputs what it read in the state. Returns error code on failure.
|
||||||
Use lodepng_inspect first with a new state, then e.g. lodepng_chunk_find_const
|
Use lodepng_inspect first with a new state, then e.g. lodepng_chunk_find_const
|
||||||
to find the desired chunk type, and if non null use lodepng_inspect_chunk (with
|
to find the desired chunk type, and if non null use lodepng_inspect_chunk (with
|
||||||
chunk_pointer - start_of_file as pos).
|
chunk_pointer - start_of_file as pos).
|
||||||
|
@ -1103,7 +1169,7 @@ TODO:
|
||||||
[.] check compatibility with various compilers - done but needs to be redone for every newer version
|
[.] check compatibility with various compilers - done but needs to be redone for every newer version
|
||||||
[X] converting color to 16-bit per channel types
|
[X] converting color to 16-bit per channel types
|
||||||
[X] support color profile chunk types (but never let them touch RGB values by default)
|
[X] support color profile chunk types (but never let them touch RGB values by default)
|
||||||
[ ] support all public PNG chunk types (almost done except sBIT, sPLT and hIST)
|
[ ] support all public PNG chunk types (almost done except sPLT and hIST)
|
||||||
[ ] make sure encoder generates no chunks with size > (2^31)-1
|
[ ] make sure encoder generates no chunks with size > (2^31)-1
|
||||||
[ ] partial decoding (stream processing)
|
[ ] partial decoding (stream processing)
|
||||||
[X] let the "isFullyOpaque" function check color keys and transparent palettes too
|
[X] let the "isFullyOpaque" function check color keys and transparent palettes too
|
||||||
|
@ -1230,18 +1296,16 @@ The following features are supported by the decoder:
|
||||||
gAMA: RGB gamma correction
|
gAMA: RGB gamma correction
|
||||||
iCCP: ICC color profile
|
iCCP: ICC color profile
|
||||||
sRGB: rendering intent
|
sRGB: rendering intent
|
||||||
|
sBIT: significant bits
|
||||||
|
|
||||||
1.2. features not supported
|
1.2. features not supported
|
||||||
---------------------------
|
---------------------------
|
||||||
|
|
||||||
The following features are _not_ supported:
|
The following features are not (yet) supported:
|
||||||
|
|
||||||
*) some features needed to make a conformant PNG-Editor might be still missing.
|
*) some features needed to make a conformant PNG-Editor might be still missing.
|
||||||
*) partial loading/stream processing. All data must be available and is processed in one call.
|
*) partial loading/stream processing. All data must be available and is processed in one call.
|
||||||
*) The following public chunks are not (yet) supported but treated as unknown chunks by LodePNG:
|
*) The hIST and sPLT public chunks are not (yet) supported but treated as unknown chunks
|
||||||
sBIT
|
|
||||||
hIST
|
|
||||||
sPLT
|
|
||||||
|
|
||||||
|
|
||||||
2. C and C++ version
|
2. C and C++ version
|
||||||
|
@ -1845,6 +1909,7 @@ symbol.
|
||||||
Not all changes are listed here, the commit history in github lists more:
|
Not all changes are listed here, the commit history in github lists more:
|
||||||
https://github.com/lvandeve/lodepng
|
https://github.com/lvandeve/lodepng
|
||||||
|
|
||||||
|
*) 13 jun 2022: added support for the sBIT chunk.
|
||||||
*) 09 jan 2022: minor decoder speed improvements.
|
*) 09 jan 2022: minor decoder speed improvements.
|
||||||
*) 27 jun 2021: added warnings that file reading/writing functions don't support
|
*) 27 jun 2021: added warnings that file reading/writing functions don't support
|
||||||
wide-character filenames (support for this is not planned, opening files is
|
wide-character filenames (support for this is not planned, opening files is
|
||||||
|
|
|
@ -37,7 +37,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
#define FITZQUAKE_VERSION 0.85 //johnfitz
|
#define FITZQUAKE_VERSION 0.85 //johnfitz
|
||||||
#define QUAKESPASM_VERSION 0.94
|
#define QUAKESPASM_VERSION 0.94
|
||||||
#define QUAKESPASM_VER_PATCH 6 // helper to print a string like 0.94.6
|
#define QUAKESPASM_VER_PATCH 7 // helper to print a string like 0.94.7
|
||||||
#ifndef QUAKESPASM_VER_SUFFIX
|
#ifndef QUAKESPASM_VER_SUFFIX
|
||||||
#define QUAKESPASM_VER_SUFFIX // optional version suffix string literal like "-beta1"
|
#define QUAKESPASM_VER_SUFFIX // optional version suffix string literal like "-beta1"
|
||||||
#endif
|
#endif
|
||||||
|
@ -345,6 +345,7 @@ void Host_Quit_f (void);
|
||||||
void Host_ClientCommands (const char *fmt, ...) FUNC_PRINTF(1,2);
|
void Host_ClientCommands (const char *fmt, ...) FUNC_PRINTF(1,2);
|
||||||
void Host_ShutdownServer (qboolean crash);
|
void Host_ShutdownServer (qboolean crash);
|
||||||
void Host_WriteConfiguration (void);
|
void Host_WriteConfiguration (void);
|
||||||
|
void Host_Resetdemos (void);
|
||||||
|
|
||||||
void Host_AppendDownloadData(client_t *client, sizebuf_t *buf);
|
void Host_AppendDownloadData(client_t *client, sizebuf_t *buf);
|
||||||
void Host_DownloadAck(client_t *client);
|
void Host_DownloadAck(client_t *client);
|
||||||
|
|
|
@ -585,7 +585,9 @@ void R_TeleportSplash (vec3_t org)
|
||||||
vec3_t dir;
|
vec3_t dir;
|
||||||
|
|
||||||
for (i=-16 ; i<16 ; i+=4)
|
for (i=-16 ; i<16 ; i+=4)
|
||||||
|
{
|
||||||
for (j=-16 ; j<16 ; j+=4)
|
for (j=-16 ; j<16 ; j+=4)
|
||||||
|
{
|
||||||
for (k=-24 ; k<32 ; k+=4)
|
for (k=-24 ; k<32 ; k+=4)
|
||||||
{
|
{
|
||||||
if (!free_particles)
|
if (!free_particles)
|
||||||
|
@ -611,6 +613,8 @@ void R_TeleportSplash (vec3_t org)
|
||||||
vel = 50 + (rand()&63);
|
vel = 50 + (rand()&63);
|
||||||
VectorScale (dir, vel, p->vel);
|
VectorScale (dir, vel, p->vel);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -900,8 +904,6 @@ void R_DrawParticles (void)
|
||||||
glTexCoord2f (0,0.5);
|
glTexCoord2f (0,0.5);
|
||||||
VectorMA (p->org, scale, right, p_right);
|
VectorMA (p->org, scale, right, p_right);
|
||||||
glVertex3fv (p_right);
|
glVertex3fv (p_right);
|
||||||
|
|
||||||
rs_particles++; //johnfitz //FIXME: just use r_numparticles
|
|
||||||
}
|
}
|
||||||
glEnd ();
|
glEnd ();
|
||||||
}
|
}
|
||||||
|
@ -941,8 +943,6 @@ void R_DrawParticles (void)
|
||||||
glTexCoord2f (0,1);
|
glTexCoord2f (0,1);
|
||||||
VectorMA (p->org, scale, right, p_right);
|
VectorMA (p->org, scale, right, p_right);
|
||||||
glVertex3fv (p_right);
|
glVertex3fv (p_right);
|
||||||
|
|
||||||
rs_particles++; //johnfitz //FIXME: just use r_numparticles
|
|
||||||
}
|
}
|
||||||
glEnd ();
|
glEnd ();
|
||||||
}
|
}
|
||||||
|
|
|
@ -3421,11 +3421,7 @@ void PScript_ClearSurfaceParticles(qmodel_t *mod)
|
||||||
}
|
}
|
||||||
static void PScript_ClearAllSurfaceParticles(void)
|
static void PScript_ClearAllSurfaceParticles(void)
|
||||||
{ //make sure we hit all models, even ones from the previous map. maybe this is overkill
|
{ //make sure we hit all models, even ones from the previous map. maybe this is overkill
|
||||||
extern qmodel_t mod_known[];
|
Mod_ForEachModel(PScript_ClearSurfaceParticles);
|
||||||
extern int mod_numknown;
|
|
||||||
int i;
|
|
||||||
for (i = 0; i < mod_numknown; i++)
|
|
||||||
PScript_ClearSurfaceParticles(&mod_known[i]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void PScript_Shutdown (void)
|
void PScript_Shutdown (void)
|
||||||
|
|
|
@ -185,7 +185,6 @@ void R_PushDlights (void);
|
||||||
// surface cache related
|
// surface cache related
|
||||||
//
|
//
|
||||||
extern int reinit_surfcache; // if 1, surface cache is currently empty and
|
extern int reinit_surfcache; // if 1, surface cache is currently empty and
|
||||||
extern qboolean r_cache_thrash; // set if thrashing the surface cache
|
|
||||||
|
|
||||||
int D_SurfaceCacheForRes (int width, int height);
|
int D_SurfaceCacheForRes (int width, int height);
|
||||||
void D_FlushCaches (void);
|
void D_FlushCaches (void);
|
||||||
|
|
128
Quakespasm.html
128
Quakespasm.html
|
@ -8,7 +8,7 @@
|
||||||
<H1>QuakeSpasm</H1>
|
<H1>QuakeSpasm</H1>
|
||||||
|
|
||||||
<H2></H2>
|
<H2></H2>
|
||||||
<P><EM>Page last edited: June 2022.</EM></P>
|
<P><EM>Page last edited: July 2022.</EM></P>
|
||||||
|
|
||||||
<P>
|
<P>
|
||||||
<H2><A NAME="toc1">1.</A> <A HREF="Quakespasm.html#s1">About </A></H2>
|
<H2><A NAME="toc1">1.</A> <A HREF="Quakespasm.html#s1">About </A></H2>
|
||||||
|
@ -35,30 +35,31 @@
|
||||||
|
|
||||||
<H2><A NAME="toc5">5.</A> <A HREF="Quakespasm.html#s5">Changes</A></H2>
|
<H2><A NAME="toc5">5.</A> <A HREF="Quakespasm.html#s5">Changes</A></H2>
|
||||||
<UL>
|
<UL>
|
||||||
<LI><A NAME="toc5.1">5.1</A> <A HREF="Quakespasm.html#ss5.1">Changes in 0.94.6</A>
|
<LI><A NAME="toc5.1">5.1</A> <A HREF="Quakespasm.html#ss5.1">Changes in 0.94.7</A>
|
||||||
<LI><A NAME="toc5.2">5.2</A> <A HREF="Quakespasm.html#ss5.2">Changes in 0.94.5</A>
|
<LI><A NAME="toc5.2">5.2</A> <A HREF="Quakespasm.html#ss5.2">Changes in 0.94.6</A>
|
||||||
<LI><A NAME="toc5.3">5.3</A> <A HREF="Quakespasm.html#ss5.3">Changes in 0.94.4</A>
|
<LI><A NAME="toc5.3">5.3</A> <A HREF="Quakespasm.html#ss5.3">Changes in 0.94.5</A>
|
||||||
<LI><A NAME="toc5.4">5.4</A> <A HREF="Quakespasm.html#ss5.4">Changes in 0.94.3</A>
|
<LI><A NAME="toc5.4">5.4</A> <A HREF="Quakespasm.html#ss5.4">Changes in 0.94.4</A>
|
||||||
<LI><A NAME="toc5.5">5.5</A> <A HREF="Quakespasm.html#ss5.5">Changes in 0.94.2</A>
|
<LI><A NAME="toc5.5">5.5</A> <A HREF="Quakespasm.html#ss5.5">Changes in 0.94.3</A>
|
||||||
<LI><A NAME="toc5.6">5.6</A> <A HREF="Quakespasm.html#ss5.6">Changes in 0.94.1</A>
|
<LI><A NAME="toc5.6">5.6</A> <A HREF="Quakespasm.html#ss5.6">Changes in 0.94.2</A>
|
||||||
<LI><A NAME="toc5.7">5.7</A> <A HREF="Quakespasm.html#ss5.7">Changes in 0.94.0</A>
|
<LI><A NAME="toc5.7">5.7</A> <A HREF="Quakespasm.html#ss5.7">Changes in 0.94.1</A>
|
||||||
<LI><A NAME="toc5.8">5.8</A> <A HREF="Quakespasm.html#ss5.8">Changes in 0.93.2</A>
|
<LI><A NAME="toc5.8">5.8</A> <A HREF="Quakespasm.html#ss5.8">Changes in 0.94.0</A>
|
||||||
<LI><A NAME="toc5.9">5.9</A> <A HREF="Quakespasm.html#ss5.9">Changes in 0.93.1</A>
|
<LI><A NAME="toc5.9">5.9</A> <A HREF="Quakespasm.html#ss5.9">Changes in 0.93.2</A>
|
||||||
<LI><A NAME="toc5.10">5.10</A> <A HREF="Quakespasm.html#ss5.10">Changes in 0.93.0</A>
|
<LI><A NAME="toc5.10">5.10</A> <A HREF="Quakespasm.html#ss5.10">Changes in 0.93.1</A>
|
||||||
<LI><A NAME="toc5.11">5.11</A> <A HREF="Quakespasm.html#ss5.11">Changes in 0.92.1</A>
|
<LI><A NAME="toc5.11">5.11</A> <A HREF="Quakespasm.html#ss5.11">Changes in 0.93.0</A>
|
||||||
<LI><A NAME="toc5.12">5.12</A> <A HREF="Quakespasm.html#ss5.12">Changes in 0.92.0</A>
|
<LI><A NAME="toc5.12">5.12</A> <A HREF="Quakespasm.html#ss5.12">Changes in 0.92.1</A>
|
||||||
<LI><A NAME="toc5.13">5.13</A> <A HREF="Quakespasm.html#ss5.13">Changes in 0.91.0</A>
|
<LI><A NAME="toc5.13">5.13</A> <A HREF="Quakespasm.html#ss5.13">Changes in 0.92.0</A>
|
||||||
<LI><A NAME="toc5.14">5.14</A> <A HREF="Quakespasm.html#ss5.14">Changes in 0.90.1</A>
|
<LI><A NAME="toc5.14">5.14</A> <A HREF="Quakespasm.html#ss5.14">Changes in 0.91.0</A>
|
||||||
<LI><A NAME="toc5.15">5.15</A> <A HREF="Quakespasm.html#ss5.15">Changes in 0.90.0</A>
|
<LI><A NAME="toc5.15">5.15</A> <A HREF="Quakespasm.html#ss5.15">Changes in 0.90.1</A>
|
||||||
<LI><A NAME="toc5.16">5.16</A> <A HREF="Quakespasm.html#ss5.16">Changes in 0.85.9</A>
|
<LI><A NAME="toc5.16">5.16</A> <A HREF="Quakespasm.html#ss5.16">Changes in 0.90.0</A>
|
||||||
<LI><A NAME="toc5.17">5.17</A> <A HREF="Quakespasm.html#ss5.17">Changes in 0.85.8</A>
|
<LI><A NAME="toc5.17">5.17</A> <A HREF="Quakespasm.html#ss5.17">Changes in 0.85.9</A>
|
||||||
<LI><A NAME="toc5.18">5.18</A> <A HREF="Quakespasm.html#ss5.18">Changes in 0.85.7</A>
|
<LI><A NAME="toc5.18">5.18</A> <A HREF="Quakespasm.html#ss5.18">Changes in 0.85.8</A>
|
||||||
<LI><A NAME="toc5.19">5.19</A> <A HREF="Quakespasm.html#ss5.19">Changes in 0.85.6</A>
|
<LI><A NAME="toc5.19">5.19</A> <A HREF="Quakespasm.html#ss5.19">Changes in 0.85.7</A>
|
||||||
<LI><A NAME="toc5.20">5.20</A> <A HREF="Quakespasm.html#ss5.20">Changes in 0.85.5</A>
|
<LI><A NAME="toc5.20">5.20</A> <A HREF="Quakespasm.html#ss5.20">Changes in 0.85.6</A>
|
||||||
<LI><A NAME="toc5.21">5.21</A> <A HREF="Quakespasm.html#ss5.21">Changes in 0.85.4</A>
|
<LI><A NAME="toc5.21">5.21</A> <A HREF="Quakespasm.html#ss5.21">Changes in 0.85.5</A>
|
||||||
<LI><A NAME="toc5.22">5.22</A> <A HREF="Quakespasm.html#ss5.22">Changes in 0.85.3</A>
|
<LI><A NAME="toc5.22">5.22</A> <A HREF="Quakespasm.html#ss5.22">Changes in 0.85.4</A>
|
||||||
<LI><A NAME="toc5.23">5.23</A> <A HREF="Quakespasm.html#ss5.23">Changes in 0.85.2</A>
|
<LI><A NAME="toc5.23">5.23</A> <A HREF="Quakespasm.html#ss5.23">Changes in 0.85.3</A>
|
||||||
<LI><A NAME="toc5.24">5.24</A> <A HREF="Quakespasm.html#ss5.24">Changes in 0.85.1</A>
|
<LI><A NAME="toc5.24">5.24</A> <A HREF="Quakespasm.html#ss5.24">Changes in 0.85.2</A>
|
||||||
|
<LI><A NAME="toc5.25">5.25</A> <A HREF="Quakespasm.html#ss5.25">Changes in 0.85.1</A>
|
||||||
</UL>
|
</UL>
|
||||||
<P>
|
<P>
|
||||||
<H2><A NAME="toc6">6.</A> <A HREF="Quakespasm.html#s6">Copyright </A></H2>
|
<H2><A NAME="toc6">6.</A> <A HREF="Quakespasm.html#s6">Copyright </A></H2>
|
||||||
|
@ -178,7 +179,7 @@ where DRIVER may be alsa, dsp, pulse, esd ...</LI>
|
||||||
Quakespasm can also be built with the cross-platform Codeblocks.<BR>
|
Quakespasm can also be built with the cross-platform Codeblocks.<BR>
|
||||||
Quakespasm's (optional) custom data is now stored in the file <B>quakespasm.pak</B>. This file should be placed alongside your quakespasm binary and <B>id1</B> directory.</P>
|
Quakespasm's (optional) custom data is now stored in the file <B>quakespasm.pak</B>. This file should be placed alongside your quakespasm binary and <B>id1</B> directory.</P>
|
||||||
|
|
||||||
<H2><A NAME="ss4.1">4.1</A> <A HREF="#toc4.1">Linux/Unix </A>
|
<H2><A NAME="ss4.1">4.1</A> <A HREF="#toc4.1">Linux/Unix</A>
|
||||||
</H2>
|
</H2>
|
||||||
<P>After extracting the source tarball, "cd Quake" and edit the Makefile for music options. </P>
|
<P>After extracting the source tarball, "cd Quake" and edit the Makefile for music options. </P>
|
||||||
<P><EM>Streaming music playback requires "libmad" or "libmpg123" for MP3, and "libogg" and "libvorbis" for OGG files.</EM></P>
|
<P><EM>Streaming music playback requires "libmad" or "libmpg123" for MP3, and "libogg" and "libvorbis" for OGG files.</EM></P>
|
||||||
|
@ -192,26 +193,37 @@ Compile time options include
|
||||||
</UL>
|
</UL>
|
||||||
</P>
|
</P>
|
||||||
|
|
||||||
<H2><A NAME="ss4.2">4.2</A> <A HREF="#toc4.2">Windows </A>
|
<H2><A NAME="ss4.2">4.2</A> <A HREF="#toc4.2">Windows</A>
|
||||||
</H2>
|
</H2>
|
||||||
<P>QuakeSpasm developers cross-compile windows binaries using
|
<P>QuakeSpasm developers cross-compile windows binaries using
|
||||||
<A HREF="http://mingw-w64.sf.net">MinGW-w64</A> and
|
<A HREF="http://mingw-w64.sf.net">MinGW-w64</A> and
|
||||||
<A HREF="https://mingw.osdn.io">MinGW</A>.</P>
|
<A HREF="https://mingw.osdn.io">MinGW</A>.
|
||||||
<P>The project can also be built using Microsoft Visual Studio 2005 and newer versions.</P>
|
The project can also be built using Microsoft Visual Studio 2005 and newer versions.</P>
|
||||||
|
|
||||||
<H2><A NAME="ss4.3">4.3</A> <A HREF="#toc4.3">Mac OS X </A>
|
<H2><A NAME="ss4.3">4.3</A> <A HREF="#toc4.3">Mac OS X</A>
|
||||||
</H2>
|
</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>A Quakespasm App (including program launcher and update framework) can be made using the <B>Xcode</B> template found in the MacOSX directory.
|
||||||
<P>Alternatively, have a look at <B>Makefile.darwin</B> for more instructions on building from a console.</P>
|
Alternatively, have a look at <B>Makefile.darwin</B> for more instructions on building from a console.</P>
|
||||||
|
|
||||||
<H2><A NAME="ss4.4">4.4</A> <A HREF="#toc4.4">Quake '2021 re-release' </A>
|
<H2><A NAME="ss4.4">4.4</A> <A HREF="#toc4.4">Quake '2021 re-release'</A>
|
||||||
</H2>
|
</H2>
|
||||||
<P>QuakeSpasm 0.94.0 has initial support for playing the 2021 re-release content: Copy the quakespasm binary to your rerelease installation and run quakespasm as you normally do.</P>
|
<P>QuakeSpasm 0.94 has support for playing the 2021 re-release content: Copy the quakespasm binary to your rerelease installation and run as you normally do.</P>
|
||||||
|
|
||||||
|
|
||||||
<H2><A NAME="s5">5.</A> <A HREF="#toc5">Changes</A></H2>
|
<H2><A NAME="s5">5.</A> <A HREF="#toc5">Changes</A></H2>
|
||||||
|
|
||||||
<H2><A NAME="ss5.1">5.1</A> <A HREF="#toc5.1">Changes in 0.94.6</A>
|
<H2><A NAME="ss5.1">5.1</A> <A HREF="#toc5.1">Changes in 0.94.7</A>
|
||||||
|
</H2>
|
||||||
|
<P>
|
||||||
|
<UL>
|
||||||
|
<LI> Fix console history buffer wrapping.</LI>
|
||||||
|
<LI> Fix wrong external texture use after vid_restart.</LI>
|
||||||
|
<LI> Update lodepng from mainstream git.</LI>
|
||||||
|
<LI> Miscellaneous source code cleanups.</LI>
|
||||||
|
</UL>
|
||||||
|
</P>
|
||||||
|
|
||||||
|
<H2><A NAME="ss5.2">5.2</A> <A HREF="#toc5.2">Changes in 0.94.6</A>
|
||||||
</H2>
|
</H2>
|
||||||
<P>
|
<P>
|
||||||
<UL>
|
<UL>
|
||||||
|
@ -224,7 +236,7 @@ Compile time options include
|
||||||
</UL>
|
</UL>
|
||||||
</P>
|
</P>
|
||||||
|
|
||||||
<H2><A NAME="ss5.2">5.2</A> <A HREF="#toc5.2">Changes in 0.94.5</A>
|
<H2><A NAME="ss5.3">5.3</A> <A HREF="#toc5.3">Changes in 0.94.5</A>
|
||||||
</H2>
|
</H2>
|
||||||
<P>
|
<P>
|
||||||
<UL>
|
<UL>
|
||||||
|
@ -237,7 +249,7 @@ Compile time options include
|
||||||
</UL>
|
</UL>
|
||||||
</P>
|
</P>
|
||||||
|
|
||||||
<H2><A NAME="ss5.3">5.3</A> <A HREF="#toc5.3">Changes in 0.94.4</A>
|
<H2><A NAME="ss5.4">5.4</A> <A HREF="#toc5.4">Changes in 0.94.4</A>
|
||||||
</H2>
|
</H2>
|
||||||
<P>
|
<P>
|
||||||
<UL>
|
<UL>
|
||||||
|
@ -259,7 +271,7 @@ Compile time options include
|
||||||
</UL>
|
</UL>
|
||||||
</P>
|
</P>
|
||||||
|
|
||||||
<H2><A NAME="ss5.4">5.4</A> <A HREF="#toc5.4">Changes in 0.94.3</A>
|
<H2><A NAME="ss5.5">5.5</A> <A HREF="#toc5.5">Changes in 0.94.3</A>
|
||||||
</H2>
|
</H2>
|
||||||
<P>
|
<P>
|
||||||
<UL>
|
<UL>
|
||||||
|
@ -269,7 +281,7 @@ Compile time options include
|
||||||
</UL>
|
</UL>
|
||||||
</P>
|
</P>
|
||||||
|
|
||||||
<H2><A NAME="ss5.5">5.5</A> <A HREF="#toc5.5">Changes in 0.94.2</A>
|
<H2><A NAME="ss5.6">5.6</A> <A HREF="#toc5.6">Changes in 0.94.2</A>
|
||||||
</H2>
|
</H2>
|
||||||
<P>
|
<P>
|
||||||
<UL>
|
<UL>
|
||||||
|
@ -280,7 +292,7 @@ Compile time options include
|
||||||
</UL>
|
</UL>
|
||||||
</P>
|
</P>
|
||||||
|
|
||||||
<H2><A NAME="ss5.6">5.6</A> <A HREF="#toc5.6">Changes in 0.94.1</A>
|
<H2><A NAME="ss5.7">5.7</A> <A HREF="#toc5.7">Changes in 0.94.1</A>
|
||||||
</H2>
|
</H2>
|
||||||
<P>
|
<P>
|
||||||
<UL>
|
<UL>
|
||||||
|
@ -288,7 +300,7 @@ Compile time options include
|
||||||
</UL>
|
</UL>
|
||||||
</P>
|
</P>
|
||||||
|
|
||||||
<H2><A NAME="ss5.7">5.7</A> <A HREF="#toc5.7">Changes in 0.94.0</A>
|
<H2><A NAME="ss5.8">5.8</A> <A HREF="#toc5.8">Changes in 0.94.0</A>
|
||||||
</H2>
|
</H2>
|
||||||
<P>
|
<P>
|
||||||
<UL>
|
<UL>
|
||||||
|
@ -313,7 +325,7 @@ Compile time options include
|
||||||
</UL>
|
</UL>
|
||||||
</P>
|
</P>
|
||||||
|
|
||||||
<H2><A NAME="ss5.8">5.8</A> <A HREF="#toc5.8">Changes in 0.93.2</A>
|
<H2><A NAME="ss5.9">5.9</A> <A HREF="#toc5.9">Changes in 0.93.2</A>
|
||||||
</H2>
|
</H2>
|
||||||
<P>
|
<P>
|
||||||
<UL>
|
<UL>
|
||||||
|
@ -326,7 +338,7 @@ Compile time options include
|
||||||
</UL>
|
</UL>
|
||||||
</P>
|
</P>
|
||||||
|
|
||||||
<H2><A NAME="ss5.9">5.9</A> <A HREF="#toc5.9">Changes in 0.93.1</A>
|
<H2><A NAME="ss5.10">5.10</A> <A HREF="#toc5.10">Changes in 0.93.1</A>
|
||||||
</H2>
|
</H2>
|
||||||
<P>
|
<P>
|
||||||
<UL>
|
<UL>
|
||||||
|
@ -340,7 +352,7 @@ Compile time options include
|
||||||
</UL>
|
</UL>
|
||||||
</P>
|
</P>
|
||||||
|
|
||||||
<H2><A NAME="ss5.10">5.10</A> <A HREF="#toc5.10">Changes in 0.93.0</A>
|
<H2><A NAME="ss5.11">5.11</A> <A HREF="#toc5.11">Changes in 0.93.0</A>
|
||||||
</H2>
|
</H2>
|
||||||
<P>
|
<P>
|
||||||
<UL>
|
<UL>
|
||||||
|
@ -383,7 +395,7 @@ quakespasm (cl_alwaysrun 1, cl_forwardspeed 200, cl_backspeed 200)
|
||||||
</UL>
|
</UL>
|
||||||
</P>
|
</P>
|
||||||
|
|
||||||
<H2><A NAME="ss5.11">5.11</A> <A HREF="#toc5.11">Changes in 0.92.1</A>
|
<H2><A NAME="ss5.12">5.12</A> <A HREF="#toc5.12">Changes in 0.92.1</A>
|
||||||
</H2>
|
</H2>
|
||||||
<P>
|
<P>
|
||||||
<UL>
|
<UL>
|
||||||
|
@ -393,7 +405,7 @@ quakespasm (cl_alwaysrun 1, cl_forwardspeed 200, cl_backspeed 200)
|
||||||
</UL>
|
</UL>
|
||||||
</P>
|
</P>
|
||||||
|
|
||||||
<H2><A NAME="ss5.12">5.12</A> <A HREF="#toc5.12">Changes in 0.92.0</A>
|
<H2><A NAME="ss5.13">5.13</A> <A HREF="#toc5.13">Changes in 0.92.0</A>
|
||||||
</H2>
|
</H2>
|
||||||
<P>
|
<P>
|
||||||
<UL>
|
<UL>
|
||||||
|
@ -412,7 +424,7 @@ quakespasm (cl_alwaysrun 1, cl_forwardspeed 200, cl_backspeed 200)
|
||||||
<LI> Updated some of the third-party libraries. Other fixes/clean-ups.</LI>
|
<LI> Updated some of the third-party libraries. Other fixes/clean-ups.</LI>
|
||||||
</UL>
|
</UL>
|
||||||
</P>
|
</P>
|
||||||
<H2><A NAME="ss5.13">5.13</A> <A HREF="#toc5.13">Changes in 0.91.0</A>
|
<H2><A NAME="ss5.14">5.14</A> <A HREF="#toc5.14">Changes in 0.91.0</A>
|
||||||
</H2>
|
</H2>
|
||||||
<H3>Bugfixes</H3>
|
<H3>Bugfixes</H3>
|
||||||
<P>
|
<P>
|
||||||
|
@ -462,7 +474,7 @@ quakespasm (cl_alwaysrun 1, cl_forwardspeed 200, cl_backspeed 200)
|
||||||
</UL>
|
</UL>
|
||||||
</P>
|
</P>
|
||||||
|
|
||||||
<H2><A NAME="ss5.14">5.14</A> <A HREF="#toc5.14">Changes in 0.90.1</A>
|
<H2><A NAME="ss5.15">5.15</A> <A HREF="#toc5.15">Changes in 0.90.1</A>
|
||||||
</H2>
|
</H2>
|
||||||
<H3>Bugfixes</H3>
|
<H3>Bugfixes</H3>
|
||||||
<P>
|
<P>
|
||||||
|
@ -512,7 +524,7 @@ quakespasm (cl_alwaysrun 1, cl_forwardspeed 200, cl_backspeed 200)
|
||||||
</UL>
|
</UL>
|
||||||
</P>
|
</P>
|
||||||
|
|
||||||
<H2><A NAME="ss5.15">5.15</A> <A HREF="#toc5.15">Changes in 0.90.0</A>
|
<H2><A NAME="ss5.16">5.16</A> <A HREF="#toc5.16">Changes in 0.90.0</A>
|
||||||
</H2>
|
</H2>
|
||||||
<P>
|
<P>
|
||||||
<UL>
|
<UL>
|
||||||
|
@ -558,7 +570,7 @@ quakespasm (cl_alwaysrun 1, cl_forwardspeed 200, cl_backspeed 200)
|
||||||
</UL>
|
</UL>
|
||||||
</P>
|
</P>
|
||||||
|
|
||||||
<H2><A NAME="ss5.16">5.16</A> <A HREF="#toc5.16">Changes in 0.85.9</A>
|
<H2><A NAME="ss5.17">5.17</A> <A HREF="#toc5.17">Changes in 0.85.9</A>
|
||||||
</H2>
|
</H2>
|
||||||
<P>
|
<P>
|
||||||
<UL>
|
<UL>
|
||||||
|
@ -582,7 +594,7 @@ quakespasm (cl_alwaysrun 1, cl_forwardspeed 200, cl_backspeed 200)
|
||||||
</UL>
|
</UL>
|
||||||
</P>
|
</P>
|
||||||
|
|
||||||
<H2><A NAME="ss5.17">5.17</A> <A HREF="#toc5.17">Changes in 0.85.8</A>
|
<H2><A NAME="ss5.18">5.18</A> <A HREF="#toc5.18">Changes in 0.85.8</A>
|
||||||
</H2>
|
</H2>
|
||||||
<P>
|
<P>
|
||||||
<UL>
|
<UL>
|
||||||
|
@ -607,7 +619,7 @@ quakespasm (cl_alwaysrun 1, cl_forwardspeed 200, cl_backspeed 200)
|
||||||
</UL>
|
</UL>
|
||||||
</P>
|
</P>
|
||||||
|
|
||||||
<H2><A NAME="ss5.18">5.18</A> <A HREF="#toc5.18">Changes in 0.85.7</A>
|
<H2><A NAME="ss5.19">5.19</A> <A HREF="#toc5.19">Changes in 0.85.7</A>
|
||||||
</H2>
|
</H2>
|
||||||
<P>
|
<P>
|
||||||
<UL>
|
<UL>
|
||||||
|
@ -625,7 +637,7 @@ quakespasm (cl_alwaysrun 1, cl_forwardspeed 200, cl_backspeed 200)
|
||||||
</UL>
|
</UL>
|
||||||
</P>
|
</P>
|
||||||
|
|
||||||
<H2><A NAME="ss5.19">5.19</A> <A HREF="#toc5.19">Changes in 0.85.6</A>
|
<H2><A NAME="ss5.20">5.20</A> <A HREF="#toc5.20">Changes in 0.85.6</A>
|
||||||
</H2>
|
</H2>
|
||||||
<P>
|
<P>
|
||||||
<UL>
|
<UL>
|
||||||
|
@ -636,7 +648,7 @@ quakespasm (cl_alwaysrun 1, cl_forwardspeed 200, cl_backspeed 200)
|
||||||
</UL>
|
</UL>
|
||||||
</P>
|
</P>
|
||||||
|
|
||||||
<H2><A NAME="ss5.20">5.20</A> <A HREF="#toc5.20">Changes in 0.85.5</A>
|
<H2><A NAME="ss5.21">5.21</A> <A HREF="#toc5.21">Changes in 0.85.5</A>
|
||||||
</H2>
|
</H2>
|
||||||
<P>
|
<P>
|
||||||
<UL>
|
<UL>
|
||||||
|
@ -655,7 +667,7 @@ quakespasm (cl_alwaysrun 1, cl_forwardspeed 200, cl_backspeed 200)
|
||||||
</UL>
|
</UL>
|
||||||
</P>
|
</P>
|
||||||
|
|
||||||
<H2><A NAME="ss5.21">5.21</A> <A HREF="#toc5.21">Changes in 0.85.4</A>
|
<H2><A NAME="ss5.22">5.22</A> <A HREF="#toc5.22">Changes in 0.85.4</A>
|
||||||
</H2>
|
</H2>
|
||||||
<P>
|
<P>
|
||||||
<UL>
|
<UL>
|
||||||
|
@ -673,7 +685,7 @@ quakespasm (cl_alwaysrun 1, cl_forwardspeed 200, cl_backspeed 200)
|
||||||
</UL>
|
</UL>
|
||||||
</P>
|
</P>
|
||||||
|
|
||||||
<H2><A NAME="ss5.22">5.22</A> <A HREF="#toc5.22">Changes in 0.85.3</A>
|
<H2><A NAME="ss5.23">5.23</A> <A HREF="#toc5.23">Changes in 0.85.3</A>
|
||||||
</H2>
|
</H2>
|
||||||
<P>
|
<P>
|
||||||
<UL>
|
<UL>
|
||||||
|
@ -695,7 +707,7 @@ quakespasm (cl_alwaysrun 1, cl_forwardspeed 200, cl_backspeed 200)
|
||||||
</UL>
|
</UL>
|
||||||
</P>
|
</P>
|
||||||
|
|
||||||
<H2><A NAME="ss5.23">5.23</A> <A HREF="#toc5.23">Changes in 0.85.2</A>
|
<H2><A NAME="ss5.24">5.24</A> <A HREF="#toc5.24">Changes in 0.85.2</A>
|
||||||
</H2>
|
</H2>
|
||||||
<P>
|
<P>
|
||||||
<UL>
|
<UL>
|
||||||
|
@ -713,7 +725,7 @@ quakespasm (cl_alwaysrun 1, cl_forwardspeed 200, cl_backspeed 200)
|
||||||
</UL>
|
</UL>
|
||||||
</P>
|
</P>
|
||||||
|
|
||||||
<H2><A NAME="ss5.24">5.24</A> <A HREF="#toc5.24">Changes in 0.85.1</A>
|
<H2><A NAME="ss5.25">5.25</A> <A HREF="#toc5.25">Changes in 0.85.1</A>
|
||||||
</H2>
|
</H2>
|
||||||
<P>
|
<P>
|
||||||
<UL>
|
<UL>
|
||||||
|
|
172
Quakespasm.txt
172
Quakespasm.txt
|
@ -1,68 +1,9 @@
|
||||||
QuakeSpasm
|
QuakeSpasm
|
||||||
|
|
||||||
____________________________________________________________
|
|
||||||
|
|
||||||
Table of Contents
|
|
||||||
|
|
||||||
1. About
|
|
||||||
2. Downloads
|
|
||||||
3. Hints
|
|
||||||
3.1 Music Playback
|
|
||||||
3.2 Controller Support
|
|
||||||
3.2.1 Cvars
|
|
||||||
3.2.2 Buttons
|
|
||||||
|
|
||||||
4. Compiling and Installation
|
|
||||||
4.1 Linux/Unix
|
|
||||||
4.2 Windows
|
|
||||||
4.3 Mac OS X
|
|
||||||
4.4 Quake '2021 re-release'
|
|
||||||
|
|
||||||
5. Changes
|
|
||||||
5.1 Changes in 0.94.6
|
|
||||||
5.2 Changes in 0.94.5
|
|
||||||
5.3 Changes in 0.94.4
|
|
||||||
5.4 Changes in 0.94.3
|
|
||||||
5.5 Changes in 0.94.2
|
|
||||||
5.6 Changes in 0.94.1
|
|
||||||
5.7 Changes in 0.94.0
|
|
||||||
5.8 Changes in 0.93.2
|
|
||||||
5.9 Changes in 0.93.1
|
|
||||||
5.10 Changes in 0.93.0
|
|
||||||
5.11 Changes in 0.92.1
|
|
||||||
5.12 Changes in 0.92.0
|
|
||||||
5.13 Changes in 0.91.0
|
|
||||||
5.13.1 Bugfixes
|
|
||||||
5.13.2 Visual improvements
|
|
||||||
5.13.3 Interface improvements
|
|
||||||
5.13.4 Code cleanup / Other
|
|
||||||
5.13.5 Raised limits
|
|
||||||
5.14 Changes in 0.90.1
|
|
||||||
5.14.1 Bugfixes
|
|
||||||
5.14.2 Performance
|
|
||||||
5.14.3 Visual improvements
|
|
||||||
5.14.4 Interface improvements
|
|
||||||
5.14.5 Code cleanup
|
|
||||||
5.15 Changes in 0.90.0
|
|
||||||
5.16 Changes in 0.85.9
|
|
||||||
5.17 Changes in 0.85.8
|
|
||||||
5.18 Changes in 0.85.7
|
|
||||||
5.19 Changes in 0.85.6
|
|
||||||
5.20 Changes in 0.85.5
|
|
||||||
5.21 Changes in 0.85.4
|
|
||||||
5.22 Changes in 0.85.3
|
|
||||||
5.23 Changes in 0.85.2
|
|
||||||
5.24 Changes in 0.85.1
|
|
||||||
|
|
||||||
6. Copyright
|
|
||||||
7. Contact
|
|
||||||
8. Links
|
|
||||||
|
|
||||||
|
|
||||||
______________________________________________________________________
|
______________________________________________________________________
|
||||||
|
|
||||||
|
|
||||||
Page last edited: June 2022.
|
Page last edited: July 2022.
|
||||||
|
|
||||||
|
|
||||||
1. About
|
1. About
|
||||||
|
@ -119,7 +60,8 @@
|
||||||
o Use "quakespasm -condebug" to save console log to "qconsole.log".
|
o Use "quakespasm -condebug" to save console log to "qconsole.log".
|
||||||
SDL2 builds no longer generate stdout.txt/stderr.txt.
|
SDL2 builds no longer generate stdout.txt/stderr.txt.
|
||||||
|
|
||||||
3.1. Music Playback
|
|
||||||
|
Music Playback:
|
||||||
|
|
||||||
Quakespasm can play various external music formats, including MP3, OGG
|
Quakespasm can play various external music formats, including MP3, OGG
|
||||||
and FLAC.
|
and FLAC.
|
||||||
|
@ -137,7 +79,8 @@
|
||||||
|
|
||||||
o See Quakespasm-Music.txt for more details.
|
o See Quakespasm-Music.txt for more details.
|
||||||
|
|
||||||
3.2. Controller Support
|
|
||||||
|
Controller Support:
|
||||||
|
|
||||||
The SDL2 variant of Quakespasm supports Xbox 360 style game
|
The SDL2 variant of Quakespasm supports Xbox 360 style game
|
||||||
controllers.
|
controllers.
|
||||||
|
@ -150,7 +93,7 @@
|
||||||
in your Quake directory, it is a community-maintained database that
|
in your Quake directory, it is a community-maintained database that
|
||||||
adds support for more controllers to SDL2.
|
adds support for more controllers to SDL2.
|
||||||
|
|
||||||
3.2.1. Cvars
|
Controller Support - Cvars:
|
||||||
|
|
||||||
o joy_deadzone - Fraction of the stick travel to be deadzone, between
|
o joy_deadzone - Fraction of the stick travel to be deadzone, between
|
||||||
0 and 1. Default 0.175.
|
0 and 1. Default 0.175.
|
||||||
|
@ -177,7 +120,7 @@
|
||||||
|
|
||||||
o joy_enable - Set to 0 to disable controller support. Default 1.
|
o joy_enable - Set to 0 to disable controller support. Default 1.
|
||||||
|
|
||||||
3.2.2. Buttons
|
Controller Support - Buttons:
|
||||||
|
|
||||||
Some of the controller buttons are hardcoded to allow navigating the
|
Some of the controller buttons are hardcoded to allow navigating the
|
||||||
menu:
|
menu:
|
||||||
|
@ -219,7 +162,7 @@
|
||||||
quakespasm.pak. This file should be placed alongside your quakespasm
|
quakespasm.pak. This file should be placed alongside your quakespasm
|
||||||
binary and id1 directory.
|
binary and id1 directory.
|
||||||
|
|
||||||
4.1. Linux/Unix
|
Compiling for Linux/Unix:
|
||||||
|
|
||||||
After extracting the source tarball, "cd Quake" and edit the Makefile
|
After extracting the source tarball, "cd Quake" and edit the Makefile
|
||||||
for music options.
|
for music options.
|
||||||
|
@ -239,15 +182,14 @@
|
||||||
|
|
||||||
o make USE_SDL2=1 to compile against SDL2 instead of SDL-1.2
|
o make USE_SDL2=1 to compile against SDL2 instead of SDL-1.2
|
||||||
|
|
||||||
4.2. Windows
|
Compiling for Windows:
|
||||||
|
|
||||||
QuakeSpasm developers cross-compile windows binaries using MinGW-w64
|
QuakeSpasm developers cross-compile windows binaries using MinGW-w64
|
||||||
<http://mingw-w64.sf.net> and MinGW <https://mingw.osdn.io>.
|
<http://mingw-w64.sf.net> and MinGW <https://mingw.osdn.io>. The
|
||||||
|
project can also be built using Microsoft Visual Studio 2005 and newer
|
||||||
|
versions.
|
||||||
|
|
||||||
The project can also be built using Microsoft Visual Studio 2005 and
|
Compiling for Mac OS X:
|
||||||
newer versions.
|
|
||||||
|
|
||||||
4.3. Mac OS X
|
|
||||||
|
|
||||||
A Quakespasm App (including program launcher and update framework) can
|
A Quakespasm App (including program launcher and update framework) can
|
||||||
be made using the Xcode template found in the MacOSX directory.
|
be made using the Xcode template found in the MacOSX directory.
|
||||||
|
@ -255,17 +197,28 @@
|
||||||
Alternatively, have a look at Makefile.darwin for more instructions on
|
Alternatively, have a look at Makefile.darwin for more instructions on
|
||||||
building from a console.
|
building from a console.
|
||||||
|
|
||||||
4.4. Quake '2021 re-release'
|
|
||||||
|
|
||||||
QuakeSpasm 0.94.0 has initial support for playing the 2021 re-release
|
Quake '2021 re-release':
|
||||||
content: Copy the quakespasm binary to your rerelease installation and
|
|
||||||
run quakespasm as you normally do.
|
QuakeSpasm 0.94 has support for playing the 2021 re-release content:
|
||||||
|
Copy the quakespasm binary to your rerelease installation and run as
|
||||||
|
you normally do.
|
||||||
|
|
||||||
|
|
||||||
5. Changes
|
5. Changes
|
||||||
|
|
||||||
|
Changes in 0.94.7:
|
||||||
|
|
||||||
5.1. Changes in 0.94.6
|
o Fix console history buffer wrapping.
|
||||||
|
|
||||||
|
o Fix wrong external texture use after vid_restart.
|
||||||
|
|
||||||
|
o Update lodepng from mainstream git.
|
||||||
|
|
||||||
|
o Miscellaneous source code cleanups.
|
||||||
|
|
||||||
|
|
||||||
|
Changes in 0.94.6:
|
||||||
|
|
||||||
o Server protocol size check fixes for sounds and particles.
|
o Server protocol size check fixes for sounds and particles.
|
||||||
|
|
||||||
|
@ -280,7 +233,7 @@
|
||||||
o Other small improvements elsewhere in the code.
|
o Other small improvements elsewhere in the code.
|
||||||
|
|
||||||
|
|
||||||
5.2. Changes in 0.94.5
|
Changes in 0.94.5:
|
||||||
|
|
||||||
o Compatibility with new SDL2 versioning scheme.
|
o Compatibility with new SDL2 versioning scheme.
|
||||||
|
|
||||||
|
@ -297,7 +250,7 @@
|
||||||
o Backported a few fixes to the bundled SDL2-2.0.22 version.
|
o Backported a few fixes to the bundled SDL2-2.0.22 version.
|
||||||
|
|
||||||
|
|
||||||
5.3. Changes in 0.94.4
|
Changes in 0.94.4:
|
||||||
|
|
||||||
o Fixed getting stuck with loading plaque upon attempting to load a
|
o Fixed getting stuck with loading plaque upon attempting to load a
|
||||||
bad save from the menu
|
bad save from the menu
|
||||||
|
@ -333,7 +286,7 @@
|
||||||
patches.
|
patches.
|
||||||
|
|
||||||
|
|
||||||
5.4. Changes in 0.94.3
|
Changes in 0.94.3:
|
||||||
|
|
||||||
o Handle sky textures with non-standard sizes and warn about them
|
o Handle sky textures with non-standard sizes and warn about them
|
||||||
(e.g. ad_tears)
|
(e.g. ad_tears)
|
||||||
|
@ -345,7 +298,7 @@
|
||||||
o Updated included SDL2 to latest version 2.0.18.
|
o Updated included SDL2 to latest version 2.0.18.
|
||||||
|
|
||||||
|
|
||||||
5.5. Changes in 0.94.2
|
Changes in 0.94.2:
|
||||||
|
|
||||||
o 2021 rerelease: Support for playing the latest update.
|
o 2021 rerelease: Support for playing the latest update.
|
||||||
|
|
||||||
|
@ -356,13 +309,13 @@
|
||||||
o 2021 rerelease: Look for QuakeEX.kpf under userdir, too.
|
o 2021 rerelease: Look for QuakeEX.kpf under userdir, too.
|
||||||
|
|
||||||
|
|
||||||
5.6. Changes in 0.94.1
|
Changes in 0.94.1:
|
||||||
|
|
||||||
o Fix lightmap issues after vkQuake surface mark/cull optimizations
|
o Fix lightmap issues after vkQuake surface mark/cull optimizations
|
||||||
merge (sf.net bug/50)
|
merge (sf.net bug/50)
|
||||||
|
|
||||||
|
|
||||||
5.7. Changes in 0.94.0
|
Changes in 0.94.0:
|
||||||
|
|
||||||
o Initial support for playing the 'Quake 2021 re-release' content
|
o Initial support for playing the 'Quake 2021 re-release' content
|
||||||
(thanks to Andrei Drexler for bulk of the work, Guillaume Plourde
|
(thanks to Andrei Drexler for bulk of the work, Guillaume Plourde
|
||||||
|
@ -411,7 +364,7 @@
|
||||||
o Source repository moved to git.
|
o Source repository moved to git.
|
||||||
|
|
||||||
|
|
||||||
5.8. Changes in 0.93.2
|
Changes in 0.93.2:
|
||||||
|
|
||||||
o Lightmaps are now dynamically allocated (from QSS), and
|
o Lightmaps are now dynamically allocated (from QSS), and
|
||||||
BLOCK_WIDTH/HEIGHT raised from 128 to 256.
|
BLOCK_WIDTH/HEIGHT raised from 128 to 256.
|
||||||
|
@ -431,7 +384,7 @@
|
||||||
o Update the third-party libraries. Other fixes/cleanups.
|
o Update the third-party libraries. Other fixes/cleanups.
|
||||||
|
|
||||||
|
|
||||||
5.9. Changes in 0.93.1
|
Changes in 0.93.1:
|
||||||
|
|
||||||
o Fixed a fog regression which was introduced in 0.93.0.
|
o Fixed a fog regression which was introduced in 0.93.0.
|
||||||
|
|
||||||
|
@ -449,7 +402,7 @@
|
||||||
o Update the third-party libraries. Other fixes/cleanups.
|
o Update the third-party libraries. Other fixes/cleanups.
|
||||||
|
|
||||||
|
|
||||||
5.10. Changes in 0.93.0
|
Changes in 0.93.0:
|
||||||
|
|
||||||
o Raise default "joy_deadzone_trigger" cvar to 0.2.
|
o Raise default "joy_deadzone_trigger" cvar to 0.2.
|
||||||
|
|
||||||
|
@ -534,7 +487,7 @@
|
||||||
o Update the third-party libraries.
|
o Update the third-party libraries.
|
||||||
|
|
||||||
|
|
||||||
5.11. Changes in 0.92.1
|
Changes in 0.92.1:
|
||||||
|
|
||||||
o Fixed large menu scale factors (was broken in 0.92.0).
|
o Fixed large menu scale factors (was broken in 0.92.0).
|
||||||
|
|
||||||
|
@ -543,7 +496,7 @@
|
||||||
o Updated some of the third-party libraries.
|
o Updated some of the third-party libraries.
|
||||||
|
|
||||||
|
|
||||||
5.12. Changes in 0.92.0
|
Changes in 0.92.0:
|
||||||
|
|
||||||
o SDL2 Game Controller support.
|
o SDL2 Game Controller support.
|
||||||
|
|
||||||
|
@ -580,9 +533,9 @@
|
||||||
o Updated some of the third-party libraries. Other fixes/clean-ups.
|
o Updated some of the third-party libraries. Other fixes/clean-ups.
|
||||||
|
|
||||||
|
|
||||||
5.13. Changes in 0.91.0
|
Changes in 0.91.0:
|
||||||
|
|
||||||
5.13.1. Bugfixes
|
Bugfixes:
|
||||||
|
|
||||||
o Fix unwanted fog mode change upon video restart.
|
o Fix unwanted fog mode change upon video restart.
|
||||||
|
|
||||||
|
@ -618,7 +571,7 @@
|
||||||
|
|
||||||
o Prevent a possible vulnerability in MSG_ReadString (old Q1/Q2 bug).
|
o Prevent a possible vulnerability in MSG_ReadString (old Q1/Q2 bug).
|
||||||
|
|
||||||
5.13.2. Visual improvements
|
Visual improvements:
|
||||||
|
|
||||||
o New cvars r_lavaalpha, r_slimealpha, r_telealpha for fine-tuning
|
o New cvars r_lavaalpha, r_slimealpha, r_telealpha for fine-tuning
|
||||||
specific liquid opacities (from DirectQ/RMQEngine, non-archived,
|
specific liquid opacities (from DirectQ/RMQEngine, non-archived,
|
||||||
|
@ -629,18 +582,18 @@
|
||||||
o GLSL gamma is now supported on older hardware without NPOT
|
o GLSL gamma is now supported on older hardware without NPOT
|
||||||
extension.
|
extension.
|
||||||
|
|
||||||
5.13.3. Interface improvements
|
Interface improvements:
|
||||||
|
|
||||||
o New r_pos command to show player position.
|
o New r_pos command to show player position.
|
||||||
|
|
||||||
o NaN detection in traceline with "developer 1" set now warns instead
|
o NaN detection in traceline with "developer 1" set now warns instead
|
||||||
of errors.
|
of errors.
|
||||||
|
|
||||||
5.13.4. Code cleanup / Other
|
Code cleanup / Other:
|
||||||
|
|
||||||
o Update third-party libraries.
|
o Update third-party libraries.
|
||||||
|
|
||||||
5.13.5. Raised limits
|
Raised limits:
|
||||||
|
|
||||||
o Default max_edicts 8192 (was 2048) and no longer saved to
|
o Default max_edicts 8192 (was 2048) and no longer saved to
|
||||||
config.cfg.
|
config.cfg.
|
||||||
|
@ -652,9 +605,9 @@
|
||||||
o Raised MAX_SFX to 1024 (was 512).
|
o Raised MAX_SFX to 1024 (was 512).
|
||||||
|
|
||||||
|
|
||||||
5.14. Changes in 0.90.1
|
Changes in 0.90.1:
|
||||||
|
|
||||||
5.14.1. Bugfixes
|
Bugfixes:
|
||||||
|
|
||||||
o Fix dynamic light artifact where changing lightmap are rendered one
|
o Fix dynamic light artifact where changing lightmap are rendered one
|
||||||
frame late (bug introduced in 0.90.0).
|
frame late (bug introduced in 0.90.0).
|
||||||
|
@ -677,13 +630,13 @@
|
||||||
|
|
||||||
o Fix crash on out-of-bounds skin number.
|
o Fix crash on out-of-bounds skin number.
|
||||||
|
|
||||||
5.14.2. Performance
|
Performance:
|
||||||
|
|
||||||
o Use multithreaded OpenGL on OS X for better performance.
|
o Use multithreaded OpenGL on OS X for better performance.
|
||||||
|
|
||||||
o New, faster mdl renderer using GLSL. Disable with "-noglslalias".
|
o New, faster mdl renderer using GLSL. Disable with "-noglslalias".
|
||||||
|
|
||||||
5.14.3. Visual improvements
|
Visual improvements:
|
||||||
|
|
||||||
o New gamma correction implementation using GLSL. Fixes all known
|
o New gamma correction implementation using GLSL. Fixes all known
|
||||||
gamma issues (affecting the full display, persisting after
|
gamma issues (affecting the full display, persisting after
|
||||||
|
@ -697,7 +650,7 @@
|
||||||
|
|
||||||
o r_noshadow_list cvar added (from MarkV.)
|
o r_noshadow_list cvar added (from MarkV.)
|
||||||
|
|
||||||
5.14.4. Interface improvements
|
Interface improvements:
|
||||||
|
|
||||||
o Support pausing demo playback with the "pause" command.
|
o Support pausing demo playback with the "pause" command.
|
||||||
|
|
||||||
|
@ -714,14 +667,14 @@
|
||||||
"trying to load ent", "bad chunk length", "meshing",
|
"trying to load ent", "bad chunk length", "meshing",
|
||||||
"PR_AlocStringSlots: realloc'ing"
|
"PR_AlocStringSlots: realloc'ing"
|
||||||
|
|
||||||
5.14.5. Code cleanup
|
Code cleanup:
|
||||||
|
|
||||||
o Clean up IDE project files to build on fresh systems.
|
o Clean up IDE project files to build on fresh systems.
|
||||||
|
|
||||||
o Update 3rd-party libraries.
|
o Update 3rd-party libraries.
|
||||||
|
|
||||||
|
|
||||||
5.15. Changes in 0.90.0
|
Changes in 0.90.0:
|
||||||
|
|
||||||
o Fix issues on Windows systems with DPI scaling.
|
o Fix issues on Windows systems with DPI scaling.
|
||||||
|
|
||||||
|
@ -829,7 +782,7 @@
|
||||||
o Other fixes and clean-ups.
|
o Other fixes and clean-ups.
|
||||||
|
|
||||||
|
|
||||||
5.16. Changes in 0.85.9
|
Changes in 0.85.9:
|
||||||
|
|
||||||
o Fixes for several undefined behaviors in C code (gcc-4.8 support.)
|
o Fixes for several undefined behaviors in C code (gcc-4.8 support.)
|
||||||
|
|
||||||
|
@ -876,7 +829,7 @@
|
||||||
o Several other minor fixes/cleanups.
|
o Several other minor fixes/cleanups.
|
||||||
|
|
||||||
|
|
||||||
5.17. Changes in 0.85.8
|
Changes in 0.85.8:
|
||||||
|
|
||||||
o Made Quake shareware 1.00 and 1.01 versions to be recognized
|
o Made Quake shareware 1.00 and 1.01 versions to be recognized
|
||||||
properly.
|
properly.
|
||||||
|
@ -923,7 +876,7 @@
|
||||||
o Miscellaneous source code cleanups.
|
o Miscellaneous source code cleanups.
|
||||||
|
|
||||||
|
|
||||||
5.18. Changes in 0.85.7
|
Changes in 0.85.7:
|
||||||
|
|
||||||
o Added support for cross-level demo playback
|
o Added support for cross-level demo playback
|
||||||
|
|
||||||
|
@ -949,7 +902,7 @@
|
||||||
o Several other small changes mostly invisible to the end-user
|
o Several other small changes mostly invisible to the end-user
|
||||||
|
|
||||||
|
|
||||||
5.19. Changes in 0.85.6
|
Changes in 0.85.6:
|
||||||
|
|
||||||
o More work for string buffer safety
|
o More work for string buffer safety
|
||||||
|
|
||||||
|
@ -962,7 +915,7 @@
|
||||||
o Minor SDL video fixes.
|
o Minor SDL video fixes.
|
||||||
|
|
||||||
|
|
||||||
5.20. Changes in 0.85.5
|
Changes in 0.85.5:
|
||||||
|
|
||||||
o SDL input driver updated adding native keymap and dead key support
|
o SDL input driver updated adding native keymap and dead key support
|
||||||
to the console
|
to the console
|
||||||
|
@ -993,7 +946,7 @@
|
||||||
o Several code updates from uHexen2 project, several code cleanups.
|
o Several code updates from uHexen2 project, several code cleanups.
|
||||||
|
|
||||||
|
|
||||||
5.21. Changes in 0.85.4
|
Changes in 0.85.4:
|
||||||
|
|
||||||
o Implement music (OGG, MP3, WAV) playback
|
o Implement music (OGG, MP3, WAV) playback
|
||||||
|
|
||||||
|
@ -1021,7 +974,7 @@
|
||||||
o Other minor sound and cdaudio updates
|
o Other minor sound and cdaudio updates
|
||||||
|
|
||||||
|
|
||||||
5.22. Changes in 0.85.3
|
Changes in 0.85.3:
|
||||||
|
|
||||||
o Fix the "-dedicated" option (thanks Oz) and add platform specific
|
o Fix the "-dedicated" option (thanks Oz) and add platform specific
|
||||||
networking code (default) rather than SDL_net
|
networking code (default) rather than SDL_net
|
||||||
|
@ -1058,7 +1011,7 @@
|
||||||
some other CD tweaks.
|
some other CD tweaks.
|
||||||
|
|
||||||
|
|
||||||
5.23. Changes in 0.85.2
|
Changes in 0.85.2:
|
||||||
|
|
||||||
o Replace the old "Screen size" slider with a "Scale" slider
|
o Replace the old "Screen size" slider with a "Scale" slider
|
||||||
|
|
||||||
|
@ -1086,7 +1039,7 @@
|
||||||
o Add OSX Makefile (tested?)
|
o Add OSX Makefile (tested?)
|
||||||
|
|
||||||
|
|
||||||
5.24. Changes in 0.85.1
|
Changes in 0.85.1:
|
||||||
|
|
||||||
o 64 bit CPU support
|
o 64 bit CPU support
|
||||||
|
|
||||||
|
@ -1159,4 +1112,3 @@
|
||||||
http://www.celephais.net/board/view_thread.php?id=60452
|
http://www.celephais.net/board/view_thread.php?id=60452
|
||||||
|
|
||||||
o Inside3D forums: http://forums.insideqc.com
|
o Inside3D forums: http://forums.insideqc.com
|
||||||
|
|
||||||
|
|
|
@ -1,2 +1,2 @@
|
||||||
#define SDL_REVISION "@a788189020ac220e3c44e1383e0a1621b3309f8f"
|
#define SDL_REVISION "@09aae5c0ddc04f28f89801b2ef14a63a4365b8d3"
|
||||||
#define SDL_REVISION_NUMBER 0
|
#define SDL_REVISION_NUMBER 0
|
||||||
|
|
Binary file not shown.
Binary file not shown.
Loading…
Reference in a new issue