diff --git a/engine/client/cl_main.c b/engine/client/cl_main.c index 62d8fd9e5..f425a3714 100644 --- a/engine/client/cl_main.c +++ b/engine/client/cl_main.c @@ -4805,7 +4805,9 @@ void CL_StartCinematicOrMenu(void) if (!cls.state && !m_state && cl_demoreel.ival) CL_NextDemo(); if (!cls.state && !m_state) - M_ToggleMenu_f(); + //if we're (now) meant to be using csqc for menus, make sure that its running. + if (!CSQC_UnconnectedInit()) + M_ToggleMenu_f(); } //Con_ForceActiveNow(); } diff --git a/engine/client/r_surf.c b/engine/client/r_surf.c index f87cabf9d..51a6016a9 100644 --- a/engine/client/r_surf.c +++ b/engine/client/r_surf.c @@ -2490,6 +2490,7 @@ void Surf_LightmapMode(void) lightmap_bgra = false; if (gl_config.gles) { + //rgb is a supported format, where bgr or rgbx are not. lightmap_bytes = 3; lightmap_bgra = false; } @@ -2724,9 +2725,9 @@ void Surf_BuildModelLightmaps (model_t *m) dst = lightmap[newfirst+i]->lightmaps; 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) { @@ -2736,7 +2737,7 @@ void Surf_BuildModelLightmaps (model_t *m) 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) { @@ -2746,6 +2747,24 @@ void Surf_BuildModelLightmaps (model_t *m) 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]; + } + } } } } diff --git a/engine/client/snd_al.c b/engine/client/snd_al.c index abf17bddb..f4c8f0d6b 100644 --- a/engine/client/snd_al.c +++ b/engine/client/snd_al.c @@ -633,18 +633,31 @@ static void OpenAL_ChannelUpdate(soundcardinfo_t *sc, channel_t *chan, unsigned palSourcei(src, AL_SOURCE_RELATIVE, AL_FALSE); // palSourcef(src, AL_ROLLOFF_FACTOR, s_al_rolloff_factor.value*chan->dist_mult); } - switch(s_al_distancemodel.ival) + + //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) { - default: - palSourcef(src, AL_ROLLOFF_FACTOR, s_al_reference_distance.value); - palSourcef(src, AL_REFERENCE_DISTANCE, 1); - palSourcef(src, AL_MAX_DISTANCE, 1/chan->dist_mult); //clamp to the maximum distance you'd normally be allowed to hear... this is probably going to be annoying. - break; - case 2: //linear, mimic quake. - palSourcef(src, AL_ROLLOFF_FACTOR, 1); + palSourcef(src, AL_ROLLOFF_FACTOR, 0); palSourcef(src, AL_REFERENCE_DISTANCE, 0); - palSourcef(src, AL_MAX_DISTANCE, 1/chan->dist_mult); - break; + palSourcef(src, AL_MAX_DISTANCE, 1); //doesn't matter, so long as its not a nan + } + else + { + switch(s_al_distancemodel.ival) + { + default: + palSourcef(src, AL_ROLLOFF_FACTOR, s_al_reference_distance.value); + palSourcef(src, AL_REFERENCE_DISTANCE, 1); + palSourcef(src, AL_MAX_DISTANCE, 1/chan->dist_mult); //clamp to the maximum distance you'd normally be allowed to hear... this is probably going to be annoying. + break; + case 2: //linear, mimic quake. + palSourcef(src, AL_ROLLOFF_FACTOR, 1); + palSourcef(src, AL_REFERENCE_DISTANCE, 0); + palSourcef(src, AL_MAX_DISTANCE, 1/chan->dist_mult); + break; + } } /*and start it up again*/ diff --git a/engine/common/bothdefs.h b/engine/common/bothdefs.h index 8d8c226cc..8f3a5a065 100644 --- a/engine/common/bothdefs.h +++ b/engine/common/bothdefs.h @@ -325,8 +325,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #undef Q2SERVER //requires a dll anyway. #undef Q3CLIENT #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 Q3BSPS //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 PSET_SCRIPT //bss+size #define GLSLONLY //pointless having the junk #define GLESONLY //should reduce the conditions a little diff --git a/engine/common/fs.c b/engine/common/fs.c index 36a94e8a4..88870a7d6 100644 --- a/engine/common/fs.c +++ b/engine/common/fs.c @@ -424,7 +424,10 @@ static qboolean FS_Manifest_ParseTokens(ftemanifest_t *man) man->package[i].crcknown = crcknown; man->package[i].crc = crc; 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 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++) @@ -4374,7 +4377,7 @@ void COM_InitFilesystem (void) //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); -#ifdef AVAIL_ZLIB +#if 1//def AVAIL_ZLIB extern searchpathfuncs_t *(QDECL FSZIP_LoadArchive) (vfsfile_t *packhandle, const char *desc); #endif 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); #endif 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, "pk4", FSZIP_LoadArchive, true); FS_RegisterFileSystemType(NULL, "apk", FSZIP_LoadArchive, false); diff --git a/engine/common/fs_zip.c b/engine/common/fs_zip.c index 4308e25f1..98b88a480 100644 --- a/engine/common/fs_zip.c +++ b/engine/common/fs_zip.c @@ -225,7 +225,7 @@ vfsfile_t *FS_DecompressGZip(vfsfile_t *infile, vfsfile_t *outfile) return temp; } - +#endif @@ -425,6 +425,7 @@ static int QDECL FSZIP_GeneratePureCRC(searchpathfuncs_t *handle, int seed, int return result; } +#ifdef AVAIL_ZLIB struct decompressstate { 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->cstart = st->cofs = start; st->cend = start + csize; + st->usize = usize; st->strm.data_type = Z_UNKNOWN; st->source = source; qinflateInit2(&st->strm, -MAX_WBITS); @@ -516,7 +518,74 @@ void FSZIP_Decompress_Destroy(struct decompressstate *st) qinflateEnd(&st->strm); 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 { vfsfile_t funcs; @@ -567,35 +636,9 @@ static qboolean QDECL VFSZIP_Seek (struct vfsfile_s *file, qofs_t pos) //This is *really* inefficient if (vfsz->decompress) { //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; - qofs_t upos = 0, usize = vfsz->length; - qofs_t chunk; - struct decompressstate *nc; - qbyte buffer[16384]; - - vfsz->defer = FS_OpenTemp(); + vfsz->defer = FSZIP_Decompress_ToTempFile(vfsz->decompress); 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 false; } @@ -1468,5 +1511,3 @@ struct archivedeltafuncs_s *FSZIP_OpenDeltaZip(qdownload_t *dl) } #endif -#endif - diff --git a/engine/gl/gl_rsurf.c b/engine/gl/gl_rsurf.c index aaa787062..b482405a4 100644 --- a/engine/gl/gl_rsurf.c +++ b/engine/gl/gl_rsurf.c @@ -562,6 +562,10 @@ void GLBE_UploadAllLightmaps(void) lightmap[i]->lightmaps); break; } + //for completeness. + lm->lightmap_texture->width = lm->width; + lm->lightmap_texture->height = lm->height; + lm->lightmap_texture->status = TEX_LOADED; } } diff --git a/engine/gl/gl_shader.c b/engine/gl/gl_shader.c index e54f43228..3e8a70333 100644 --- a/engine/gl/gl_shader.c +++ b/engine/gl/gl_shader.c @@ -3496,6 +3496,8 @@ void Shader_Programify (shader_t *s) pass = &s->passes[i]; if (pass->rgbgen == RGB_GEN_LIGHTING_DIFFUSE) modellighting = pass; + else if (pass->rgbgen == RGB_GEN_ENTITY) + modellighting = pass; else if (pass->texgen == T_GEN_LIGHTMAP && pass->tcgen == TC_GEN_LIGHTMAP) lightmap = pass; } @@ -3523,15 +3525,6 @@ void Shader_Programify (shader_t *s) s->numpasses = 0; 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) { 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_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) diff --git a/engine/gl/gl_vidcommon.c b/engine/gl/gl_vidcommon.c index 20ebafe36..5acc0210a 100644 --- a/engine/gl/gl_vidcommon.c +++ b/engine/gl/gl_vidcommon.c @@ -1486,6 +1486,14 @@ static GLhandleARB GLSlang_CreateShader (const char *name, int ver, const char * length[strings] = strlen(prstrings[strings]); strings++; } + if (ver >= 140) + { + prstrings[strings] = + "#define varying in\n" + ; + length[strings] = strlen(prstrings[strings]); + strings++; + } break; case GL_TESS_CONTROL_SHADER_ARB: 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]); strings++; } - if (ver < 140) - { - prstrings[strings] = - "#define in attribute\n" - "#define out varying\n" - ; - } - else + if (ver >= 140) { prstrings[strings] = "#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) { prstrings[strings] = - "in vec3 v_position1;\n" + "attribute vec3 v_position1;\n" "#ifdef FRAMEBLEND\n" - "in vec3 v_position2;\n" + "attribute vec3 v_position2;\n" "uniform vec2 e_vblend;\n" "#define v_position ((v_position1*e_vblend.x)+(v_position2*e_vblend.y))\n" "#else\n" @@ -1551,7 +1552,7 @@ static GLhandleARB GLSlang_CreateShader (const char *name, int ver, const char * { prstrings[strings] = "#ifdef FRAMEBLEND\n" - "in vec3 v_position2;\n" + "attribute vec3 v_position2;\n" "uniform vec2 e_vblend;\n" "#define v_position (gl_Vertex.xyz*e_vblend.x+v_position2*e_vblend.y)\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) 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; + } if (!precompilerconstants) precompilerconstants = &nullconstants; diff --git a/fteqtv/source.c b/fteqtv/source.c index 40734e83d..3f5b1b5db 100644 --- a/fteqtv/source.c +++ b/fteqtv/source.c @@ -312,7 +312,7 @@ void Net_TCPListen(cluster_t *cluster, int port, qboolean ipv6) { printf("socket bind error %i (%s)\n", qerrno, strerror(qerrno)); closesocket(sock); - return INVALID_SOCKET; + return; } listen(sock, 2); //don't listen for too many clients.