fix some glsl issues.

fix gles+q3bsp black lightmaps bug.
enable q3bsp support in webgl port.
enable uncompressed pk3 support even if zlib isn't available.


git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@4800 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
Spoike 2014-12-09 14:39:54 +00:00
parent 0256c19270
commit f118bccc6a
10 changed files with 158 additions and 71 deletions

View file

@ -4805,6 +4805,8 @@ void CL_StartCinematicOrMenu(void)
if (!cls.state && !m_state && cl_demoreel.ival) if (!cls.state && !m_state && cl_demoreel.ival)
CL_NextDemo(); CL_NextDemo();
if (!cls.state && !m_state) if (!cls.state && !m_state)
//if we're (now) meant to be using csqc for menus, make sure that its running.
if (!CSQC_UnconnectedInit())
M_ToggleMenu_f(); M_ToggleMenu_f();
} }
//Con_ForceActiveNow(); //Con_ForceActiveNow();

View file

@ -2490,6 +2490,7 @@ void Surf_LightmapMode(void)
lightmap_bgra = false; lightmap_bgra = false;
if (gl_config.gles) if (gl_config.gles)
{ {
//rgb is a supported format, where bgr or rgbx are not.
lightmap_bytes = 3; lightmap_bytes = 3;
lightmap_bgra = false; lightmap_bgra = false;
} }
@ -2724,9 +2725,9 @@ void Surf_BuildModelLightmaps (model_t *m)
dst = lightmap[newfirst+i]->lightmaps; dst = lightmap[newfirst+i]->lightmaps;
src = m->lightdata + i*m->lightmaps.width*m->lightmaps.height*3; src = m->lightdata + i*m->lightmaps.width*m->lightmaps.height*3;
if (lightmap_bytes == 4 && m->lightdata) if (m->lightdata)
{ {
if (lightmap_bgra) if (lightmap_bgra && lightmap_bytes == 4)
{ {
for (j = 0; j < m->lightmaps.width*m->lightmaps.height; j++, dst += 4, src += 3) for (j = 0; j < m->lightmaps.width*m->lightmaps.height; j++, dst += 4, src += 3)
{ {
@ -2736,7 +2737,7 @@ void Surf_BuildModelLightmaps (model_t *m)
dst[3] = 255; dst[3] = 255;
} }
} }
else else if (!lightmap_bgra && lightmap_bytes == 4)
{ {
for (j = 0; j < m->lightmaps.width*m->lightmaps.height; j++, dst += 4, src += 3) for (j = 0; j < m->lightmaps.width*m->lightmaps.height; j++, dst += 4, src += 3)
{ {
@ -2746,6 +2747,24 @@ void Surf_BuildModelLightmaps (model_t *m)
dst[3] = 255; dst[3] = 255;
} }
} }
else if (lightmap_bgra && lightmap_bytes == 3)
{
for (j = 0; j < m->lightmaps.width*m->lightmaps.height; j++, dst += 3, src += 3)
{
dst[0] = src[2];
dst[1] = src[1];
dst[2] = src[0];
}
}
else if (!lightmap_bgra && lightmap_bytes == 3)
{
for (j = 0; j < m->lightmaps.width*m->lightmaps.height; j++, dst += 3, src += 3)
{
dst[0] = src[0];
dst[1] = src[1];
dst[2] = src[2];
}
}
} }
} }
} }

View file

@ -633,6 +633,18 @@ static void OpenAL_ChannelUpdate(soundcardinfo_t *sc, channel_t *chan, unsigned
palSourcei(src, AL_SOURCE_RELATIVE, AL_FALSE); palSourcei(src, AL_SOURCE_RELATIVE, AL_FALSE);
// palSourcef(src, AL_ROLLOFF_FACTOR, s_al_rolloff_factor.value*chan->dist_mult); // palSourcef(src, AL_ROLLOFF_FACTOR, s_al_rolloff_factor.value*chan->dist_mult);
} }
//this is disgustingly shit.
//logically we want to set the distance divisor to 1 and the rolloff factor to dist_mult.
//but openal clamps in an annoying order (probably to keep things signed in hardware) and webaudio refuses infinity, so we need to special case no attenuation to get around the issue
if (chan->dist_mult < 0.000001)
{
palSourcef(src, AL_ROLLOFF_FACTOR, 0);
palSourcef(src, AL_REFERENCE_DISTANCE, 0);
palSourcef(src, AL_MAX_DISTANCE, 1); //doesn't matter, so long as its not a nan
}
else
{
switch(s_al_distancemodel.ival) switch(s_al_distancemodel.ival)
{ {
default: default:
@ -646,6 +658,7 @@ static void OpenAL_ChannelUpdate(soundcardinfo_t *sc, channel_t *chan, unsigned
palSourcef(src, AL_MAX_DISTANCE, 1/chan->dist_mult); palSourcef(src, AL_MAX_DISTANCE, 1/chan->dist_mult);
break; break;
} }
}
/*and start it up again*/ /*and start it up again*/
palSourcePlay(src); palSourcePlay(src);

View file

@ -325,8 +325,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#undef Q2SERVER //requires a dll anyway. #undef Q2SERVER //requires a dll anyway.
#undef Q3CLIENT #undef Q3CLIENT
#undef Q3SERVER //trying to trim memory use #undef Q3SERVER //trying to trim memory use
#undef Q2BSPS //emscripten can't cope with bss, leading to increased download time. too lazy to fix. // #undef Q2BSPS //emscripten can't cope with bss, leading to increased download time. too lazy to fix.
#undef Q3BSPS //emscripten can't cope with bss, leading to increased download time. too lazy to fix. // #undef Q3BSPS //emscripten can't cope with bss, leading to increased download time. too lazy to fix.
// #undef PSET_SCRIPT //bss+size // #undef PSET_SCRIPT //bss+size
#define GLSLONLY //pointless having the junk #define GLSLONLY //pointless having the junk
#define GLESONLY //should reduce the conditions a little #define GLESONLY //should reduce the conditions a little

View file

@ -424,7 +424,10 @@ static qboolean FS_Manifest_ParseTokens(ftemanifest_t *man)
man->package[i].crcknown = crcknown; man->package[i].crcknown = crcknown;
man->package[i].crc = crc; man->package[i].crc = crc;
if (!Q_strcasecmp(fname, "archivedpackage")) if (!Q_strcasecmp(fname, "archivedpackage"))
man->package[i].extractname = Z_StrDup(Cmd_Argv(arg++)); {
char *extr = Cmd_Argv(arg++);
man->package[i].extractname = Z_StrDup(extr);
}
else else
man->package[i].extractname = NULL; man->package[i].extractname = NULL;
for (j = 0; arg+j < Cmd_Argc() && j < sizeof(man->package[i].mirrors) / sizeof(man->package[i].mirrors[0]); j++) for (j = 0; arg+j < Cmd_Argc() && j < sizeof(man->package[i].mirrors) / sizeof(man->package[i].mirrors[0]); j++)
@ -4374,7 +4377,7 @@ void COM_InitFilesystem (void)
//this is at the bottom of the file to ensure these globals are not used elsewhere //this is at the bottom of the file to ensure these globals are not used elsewhere
extern searchpathfuncs_t *(QDECL VFSOS_OpenPath) (vfsfile_t *file, const char *desc); extern searchpathfuncs_t *(QDECL VFSOS_OpenPath) (vfsfile_t *file, const char *desc);
#ifdef AVAIL_ZLIB #if 1//def AVAIL_ZLIB
extern searchpathfuncs_t *(QDECL FSZIP_LoadArchive) (vfsfile_t *packhandle, const char *desc); extern searchpathfuncs_t *(QDECL FSZIP_LoadArchive) (vfsfile_t *packhandle, const char *desc);
#endif #endif
extern searchpathfuncs_t *(QDECL FSPAK_LoadArchive) (vfsfile_t *packhandle, const char *desc); extern searchpathfuncs_t *(QDECL FSPAK_LoadArchive) (vfsfile_t *packhandle, const char *desc);
@ -4389,7 +4392,7 @@ void FS_RegisterDefaultFileSystems(void)
FS_RegisterFileSystemType(NULL, "PAK", FSPAK_LoadArchive, true); FS_RegisterFileSystemType(NULL, "PAK", FSPAK_LoadArchive, true);
#endif #endif
FS_RegisterFileSystemType(NULL, "pk3dir", VFSOS_OpenPath, true); FS_RegisterFileSystemType(NULL, "pk3dir", VFSOS_OpenPath, true);
#ifdef AVAIL_ZLIB #if 1//def AVAIL_ZLIB
FS_RegisterFileSystemType(NULL, "pk3", FSZIP_LoadArchive, true); FS_RegisterFileSystemType(NULL, "pk3", FSZIP_LoadArchive, true);
FS_RegisterFileSystemType(NULL, "pk4", FSZIP_LoadArchive, true); FS_RegisterFileSystemType(NULL, "pk4", FSZIP_LoadArchive, true);
FS_RegisterFileSystemType(NULL, "apk", FSZIP_LoadArchive, false); FS_RegisterFileSystemType(NULL, "apk", FSZIP_LoadArchive, false);

View file

@ -225,7 +225,7 @@ vfsfile_t *FS_DecompressGZip(vfsfile_t *infile, vfsfile_t *outfile)
return temp; return temp;
} }
#endif
@ -425,6 +425,7 @@ static int QDECL FSZIP_GeneratePureCRC(searchpathfuncs_t *handle, int seed, int
return result; return result;
} }
#ifdef AVAIL_ZLIB
struct decompressstate struct decompressstate
{ {
zipfile_t *source; zipfile_t *source;
@ -447,6 +448,7 @@ struct decompressstate *FSZIP_Decompress_Init(zipfile_t *source, qofs_t start, q
st = Z_Malloc(sizeof(*st)); st = Z_Malloc(sizeof(*st));
st->cstart = st->cofs = start; st->cstart = st->cofs = start;
st->cend = start + csize; st->cend = start + csize;
st->usize = usize;
st->strm.data_type = Z_UNKNOWN; st->strm.data_type = Z_UNKNOWN;
st->source = source; st->source = source;
qinflateInit2(&st->strm, -MAX_WBITS); qinflateInit2(&st->strm, -MAX_WBITS);
@ -516,7 +518,74 @@ void FSZIP_Decompress_Destroy(struct decompressstate *st)
qinflateEnd(&st->strm); qinflateEnd(&st->strm);
Z_Free(st); Z_Free(st);
} }
vfsfile_t *FSZIP_Decompress_ToTempFile(struct decompressstate *decompress)
{ //if they're going to seek on a file in a zip, let's just copy it out
qofs_t cstart = decompress->cstart, csize = decompress->cend - cstart;
qofs_t upos = 0, usize = decompress->usize;
qofs_t chunk;
struct decompressstate *nc;
qbyte buffer[16384];
vfsfile_t *defer;
zipfile_t *source = decompress->source;
defer = FS_OpenTemp();
if (defer)
{
FSZIP_Decompress_Destroy(decompress);
decompress = NULL;
nc = FSZIP_Decompress_Init(source, cstart, csize, usize);
while (upos < usize)
{
chunk = usize - upos;
if (chunk > sizeof(buffer))
chunk = sizeof(buffer);
if (!FSZIP_Decompress_Read(nc, buffer, chunk))
break;
if (VFS_WRITE(defer, buffer, chunk) != chunk)
break;
upos += chunk;
}
FSZIP_Decompress_Destroy(nc);
return defer;
}
return NULL;
}
#else
struct decompressstate
{
// zipfile_t *source;
// qofs_t cstart; //position of start of data
// qofs_t cofs; //current read offset
// qofs_t cend; //compressed data ends at this point.
// qofs_t usize; //data remaining. refuse to read more bytes than this.
// unsigned char inbuffer[16384];
// unsigned char outbuffer[16384];
// unsigned int readoffset;
};
struct decompressstate *FSZIP_Decompress_Init(zipfile_t *source, qofs_t start, qofs_t csize, qofs_t usize)
{
return NULL;
}
qofs_t FSZIP_Decompress_Read(struct decompressstate *st, qbyte *buffer, qofs_t bytes)
{
return 0;
}
void FSZIP_Decompress_Destroy(struct decompressstate *st)
{
}
vfsfile_t *FSZIP_Decompress_ToTempFile(struct decompressstate *decompress)
{
return NULL;
}
#endif
//an open vfsfile_t
typedef struct { typedef struct {
vfsfile_t funcs; vfsfile_t funcs;
@ -567,35 +636,9 @@ static qboolean QDECL VFSZIP_Seek (struct vfsfile_s *file, qofs_t pos)
//This is *really* inefficient //This is *really* inefficient
if (vfsz->decompress) if (vfsz->decompress)
{ //if they're going to seek on a file in a zip, let's just copy it out { //if they're going to seek on a file in a zip, let's just copy it out
qofs_t cstart = vfsz->decompress->cstart, csize = vfsz->decompress->cend - cstart; vfsz->defer = FSZIP_Decompress_ToTempFile(vfsz->decompress);
qofs_t upos = 0, usize = vfsz->length;
qofs_t chunk;
struct decompressstate *nc;
qbyte buffer[16384];
vfsz->defer = FS_OpenTemp();
if (vfsz->defer) if (vfsz->defer)
{
FSZIP_Decompress_Destroy(vfsz->decompress);
vfsz->decompress = NULL;
nc = FSZIP_Decompress_Init(vfsz->parent, cstart, csize, usize);
while (upos < usize)
{
chunk = usize - upos;
if (chunk > sizeof(buffer))
chunk = sizeof(buffer);
if (!FSZIP_Decompress_Read(nc, buffer, chunk))
break;
if (VFS_WRITE(vfsz->defer, buffer, chunk) != chunk)
break;
upos += chunk;
}
FSZIP_Decompress_Destroy(nc);
return VFS_SEEK(vfsz->defer, pos); return VFS_SEEK(vfsz->defer, pos);
}
return false; return false;
} }
@ -1468,5 +1511,3 @@ struct archivedeltafuncs_s *FSZIP_OpenDeltaZip(qdownload_t *dl)
} }
#endif #endif
#endif

View file

@ -562,6 +562,10 @@ void GLBE_UploadAllLightmaps(void)
lightmap[i]->lightmaps); lightmap[i]->lightmaps);
break; break;
} }
//for completeness.
lm->lightmap_texture->width = lm->width;
lm->lightmap_texture->height = lm->height;
lm->lightmap_texture->status = TEX_LOADED;
} }
} }

View file

@ -3496,6 +3496,8 @@ void Shader_Programify (shader_t *s)
pass = &s->passes[i]; pass = &s->passes[i];
if (pass->rgbgen == RGB_GEN_LIGHTING_DIFFUSE) if (pass->rgbgen == RGB_GEN_LIGHTING_DIFFUSE)
modellighting = pass; modellighting = pass;
else if (pass->rgbgen == RGB_GEN_ENTITY)
modellighting = pass;
else if (pass->texgen == T_GEN_LIGHTMAP && pass->tcgen == TC_GEN_LIGHTMAP) else if (pass->texgen == T_GEN_LIGHTMAP && pass->tcgen == TC_GEN_LIGHTMAP)
lightmap = pass; lightmap = pass;
} }
@ -3523,15 +3525,6 @@ void Shader_Programify (shader_t *s)
s->numpasses = 0; s->numpasses = 0;
s->passes[s->numpasses++].texgen = T_GEN_DIFFUSE; s->passes[s->numpasses++].texgen = T_GEN_DIFFUSE;
if (lightmap)
{
s->passes[s->numpasses++].texgen = T_GEN_LIGHTMAP;
s->passes[s->numpasses++].texgen = T_GEN_NORMALMAP;
s->passes[s->numpasses++].texgen = T_GEN_DELUXMAP;
s->passes[s->numpasses++].texgen = T_GEN_FULLBRIGHT;
s->passes[s->numpasses++].texgen = T_GEN_SPECULAR;
}
if (modellighting) if (modellighting)
{ {
s->passes[s->numpasses++].texgen = T_GEN_LOWEROVERLAY; s->passes[s->numpasses++].texgen = T_GEN_LOWEROVERLAY;
@ -3540,6 +3533,14 @@ void Shader_Programify (shader_t *s)
s->passes[s->numpasses++].texgen = T_GEN_NORMALMAP; s->passes[s->numpasses++].texgen = T_GEN_NORMALMAP;
s->passes[s->numpasses++].texgen = T_GEN_SPECULAR; s->passes[s->numpasses++].texgen = T_GEN_SPECULAR;
} }
else if (lightmap)
{
s->passes[s->numpasses++].texgen = T_GEN_LIGHTMAP;
s->passes[s->numpasses++].texgen = T_GEN_NORMALMAP;
s->passes[s->numpasses++].texgen = T_GEN_DELUXMAP;
s->passes[s->numpasses++].texgen = T_GEN_FULLBRIGHT;
s->passes[s->numpasses++].texgen = T_GEN_SPECULAR;
}
} }
void Shader_Finish (shader_t *s) void Shader_Finish (shader_t *s)

View file

@ -1486,6 +1486,14 @@ static GLhandleARB GLSlang_CreateShader (const char *name, int ver, const char *
length[strings] = strlen(prstrings[strings]); length[strings] = strlen(prstrings[strings]);
strings++; strings++;
} }
if (ver >= 140)
{
prstrings[strings] =
"#define varying in\n"
;
length[strings] = strlen(prstrings[strings]);
strings++;
}
break; break;
case GL_TESS_CONTROL_SHADER_ARB: case GL_TESS_CONTROL_SHADER_ARB:
prstrings[strings] = "#define TESS_CONTROL_SHADER\n"; prstrings[strings] = "#define TESS_CONTROL_SHADER\n";
@ -1513,14 +1521,7 @@ static GLhandleARB GLSlang_CreateShader (const char *name, int ver, const char *
length[strings] = strlen(prstrings[strings]); length[strings] = strlen(prstrings[strings]);
strings++; strings++;
} }
if (ver < 140) if (ver >= 140)
{
prstrings[strings] =
"#define in attribute\n"
"#define out varying\n"
;
}
else
{ {
prstrings[strings] = prstrings[strings] =
"#define attribute in\n" "#define attribute in\n"
@ -1532,9 +1533,9 @@ static GLhandleARB GLSlang_CreateShader (const char *name, int ver, const char *
if (gl_config.nofixedfunc || ver >= 140) if (gl_config.nofixedfunc || ver >= 140)
{ {
prstrings[strings] = prstrings[strings] =
"in vec3 v_position1;\n" "attribute vec3 v_position1;\n"
"#ifdef FRAMEBLEND\n" "#ifdef FRAMEBLEND\n"
"in vec3 v_position2;\n" "attribute vec3 v_position2;\n"
"uniform vec2 e_vblend;\n" "uniform vec2 e_vblend;\n"
"#define v_position ((v_position1*e_vblend.x)+(v_position2*e_vblend.y))\n" "#define v_position ((v_position1*e_vblend.x)+(v_position2*e_vblend.y))\n"
"#else\n" "#else\n"
@ -1551,7 +1552,7 @@ static GLhandleARB GLSlang_CreateShader (const char *name, int ver, const char *
{ {
prstrings[strings] = prstrings[strings] =
"#ifdef FRAMEBLEND\n" "#ifdef FRAMEBLEND\n"
"in vec3 v_position2;\n" "attribute vec3 v_position2;\n"
"uniform vec2 e_vblend;\n" "uniform vec2 e_vblend;\n"
"#define v_position (gl_Vertex.xyz*e_vblend.x+v_position2*e_vblend.y)\n" "#define v_position (gl_Vertex.xyz*e_vblend.x+v_position2*e_vblend.y)\n"
"uniform mat4 m_modelviewprojection;\n" "uniform mat4 m_modelviewprojection;\n"
@ -1777,8 +1778,11 @@ union programhandle_u GLSlang_CreateProgram(const char *name, int ver, const cha
if (!gl_config.arb_shader_objects) if (!gl_config.arb_shader_objects)
return ret; return ret;
if ((cont || frag) && !qglPatchParameteriARB) if ((cont || eval) && !qglPatchParameteriARB)
{
Con_Printf("GLSlang_CreateProgram: %s requires tesselation support, but your gl drivers do not appear to support this\n", name);
return ret; return ret;
}
if (!precompilerconstants) if (!precompilerconstants)
precompilerconstants = &nullconstants; precompilerconstants = &nullconstants;

View file

@ -312,7 +312,7 @@ void Net_TCPListen(cluster_t *cluster, int port, qboolean ipv6)
{ {
printf("socket bind error %i (%s)\n", qerrno, strerror(qerrno)); printf("socket bind error %i (%s)\n", qerrno, strerror(qerrno));
closesocket(sock); closesocket(sock);
return INVALID_SOCKET; return;
} }
listen(sock, 2); //don't listen for too many clients. listen(sock, 2); //don't listen for too many clients.