diff --git a/engine/client/cl_ents.c b/engine/client/cl_ents.c index e1d832abb..9e8dcbda3 100644 --- a/engine/client/cl_ents.c +++ b/engine/client/cl_ents.c @@ -3387,16 +3387,14 @@ void CL_LinkStaticEntities(void *pvs) if (pvs && !cl.worldmodel->funcs.EdictInFatPVS(cl.worldmodel, &stat->pvscache, pvs)) continue; + // emit particles for statics (we don't need to cheat check statics) if (stat->state.u.q1.emiteffectnum) P_EmitEffect (stat->ent.origin, stat->ent.axis, MDLF_EMITFORWARDS, CL_TranslateParticleFromServer(stat->state.u.q1.emiteffectnum), &(stat->emit)); - else if (clmodel && clmodel->particleeffect >= 0 && gl_part_flame.ival) + else if (clmodel) { - // TODO: this is ugly.. assumes ent is in static entities, and subtracts - // pointer math to get an index to use in cl_static emit - // there needs to be a cleaner method for this - P_EmitEffect(stat->ent.origin, stat->ent.axis, clmodel->engineflags, clmodel->particleeffect, &stat->emit); - + if (clmodel->particleeffect >= 0 && gl_part_flame.ival) + P_EmitEffect(stat->ent.origin, stat->ent.axis, clmodel->engineflags, clmodel->particleeffect, &stat->emit); if ((!r_drawflame.ival) && (clmodel->engineflags & MDLF_FLAME)) continue; } diff --git a/engine/client/cl_screen.c b/engine/client/cl_screen.c index 0d115ea54..19e6e1f97 100644 --- a/engine/client/cl_screen.c +++ b/engine/client/cl_screen.c @@ -2695,7 +2695,7 @@ static void SCR_ScreenShot_VR_f(void) COM_DefaultExtension (filename, scr_sshot_type.string, sizeof(filename)); ext = COM_GetFileExtension(filename, NULL); - stereo = !strcasecmp(ext, ".pns") || !strcasecmp(ext, ".jns"); + stereo = !Q_strcasecmp(ext, ".pns") || !Q_strcasecmp(ext, ".jns"); diff --git a/engine/client/image.c b/engine/client/image.c index 26e0b3568..e68750523 100644 --- a/engine/client/image.c +++ b/engine/client/image.c @@ -914,6 +914,7 @@ qboolean WriteTGA(char *filename, enum fs_relative fsroot, const qbyte *fte_rest #define png_const_structp png_structp #define png_const_bytep png_bytep #define png_const_unknown_chunkp png_unknown_chunkp + #define png_const_textp png_textp #endif #if PNG_LIBPNG_VER < 10600 #define png_inforp png_infop diff --git a/engine/client/m_options.c b/engine/client/m_options.c index 41edf5f41..693011faf 100644 --- a/engine/client/m_options.c +++ b/engine/client/m_options.c @@ -3457,8 +3457,11 @@ static void M_ModelViewerDraw(int x, int y, struct menucustom_s *c, struct menu_ "end: skin-=1\n" "pgup: frame+=1\n" "pgdn: frame-=1\n" - "mins: %g %g %g, maxs: %g %g %g\n", ent.model->mins[0], ent.model->mins[1], ent.model->mins[2], ent.model->maxs[0], ent.model->maxs[1], ent.model->maxs[2]) - , CON_WHITEMASK, CPRINT_TALIGN|CPRINT_LALIGN, font_default, fs); + "mins: %g %g %g, maxs: %g %g %g\n" + "flags: %#x %#x\n", + ent.model->mins[0], ent.model->mins[1], ent.model->mins[2], ent.model->maxs[0], ent.model->maxs[1], ent.model->maxs[2], + ent.model->flags, ent.model->engineflags), + CON_WHITEMASK, CPRINT_TALIGN|CPRINT_LALIGN, font_default, fs); break; case MV_COLLISION: if (!ent.model) diff --git a/engine/common/pr_bgcmd.c b/engine/common/pr_bgcmd.c index fd7a68d85..a418649f3 100644 --- a/engine/common/pr_bgcmd.c +++ b/engine/common/pr_bgcmd.c @@ -2373,7 +2373,7 @@ void QCBUILTIN PF_fwrite (pubprogfuncs_t *prinst, struct globalvars_s *pr_global return; } - G_INT(OFS_PARM1) = PF_fwrite_internal (prinst, fnum, prinst->stringtable + ptr, size); + G_INT(OFS_RETURN) = PF_fwrite_internal (prinst, fnum, prinst->stringtable + ptr, size); } void QCBUILTIN PF_fread (pubprogfuncs_t *prinst, struct globalvars_s *pr_globals) { @@ -2386,7 +2386,7 @@ void QCBUILTIN PF_fread (pubprogfuncs_t *prinst, struct globalvars_s *pr_globals return; } - G_INT(OFS_PARM1) = PF_fread_internal (prinst, fnum, prinst->stringtable + ptr, size); + G_INT(OFS_RETURN) = PF_fread_internal (prinst, fnum, prinst->stringtable + ptr, size); } void QCBUILTIN PF_fseek (pubprogfuncs_t *prinst, struct globalvars_s *pr_globals) { diff --git a/engine/d3d/d3d11_backend.c b/engine/d3d/d3d11_backend.c index c66992c9a..d6e9596fe 100644 --- a/engine/d3d/d3d11_backend.c +++ b/engine/d3d/d3d11_backend.c @@ -1957,9 +1957,11 @@ static void BE_RenderMeshProgram(program_t *p, shaderpass_t *pass, unsigned int pp = p->permu[perm]; if (!pp) { - pp = Shader_LoadPermutation(p, perm); + p->permu[perm] = pp = Shader_LoadPermutation(p, perm); if (!pp) - pp = p->permu[perm=0]; + { //failed? copy from 0 so we don't keep re-failing + pp = p->permu[perm] = p->permu[0]; + } } BE_ApplyUniforms(p, pp); diff --git a/engine/d3d/d3d11_shader.c b/engine/d3d/d3d11_shader.c index 1f8bf4585..50fc37c24 100644 --- a/engine/d3d/d3d11_shader.c +++ b/engine/d3d/d3d11_shader.c @@ -212,11 +212,15 @@ void D3D11Shader_DeleteProg(program_t *prog) ID3D11VertexShader *vert; unsigned int permu, l; struct programpermu_s *pp; - for (permu = 0; permu < countof(prog->permu); permu++) + for (permu = countof(prog->permu); permu-- > 0; ) { pp = prog->permu[permu]; if (!pp) continue; + prog->permu[permu] = NULL; + if (pp == prog->permu[0] && permu) + continue; //entry 0 (only) can get copied to avoid constant recompile failures (0 is always precompiled) + vert = pp->h.hlsl.vert; frag = pp->h.hlsl.frag; if (vert) @@ -229,6 +233,7 @@ void D3D11Shader_DeleteProg(program_t *prog) if (layout) ID3D11InputLayout_Release(layout); } + Z_Free(pp); } } diff --git a/engine/d3d/d3d8_backend.c b/engine/d3d/d3d8_backend.c index 5c3e9dc98..893aaec83 100644 --- a/engine/d3d/d3d8_backend.c +++ b/engine/d3d/d3d8_backend.c @@ -2669,6 +2669,8 @@ static void BE_UploadLightmaps(qboolean force) if (!TEXLOADED(lm->lightmap_texture)) lm->lightmap_texture = Image_CreateTexture("***lightmap***", NULL, (r_lightmap_nearest.ival?IF_NEAREST:IF_LINEAR)|IF_NOMIPMAP); tex = lm->lightmap_texture->ptr; + if (lm->fmt != PTI_BGRA8) + continue; //erk! if (!tex) { IDirect3DDevice8_CreateTexture(pD3DDev8, lm->width, lm->height, 1, 0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &tex); @@ -2687,7 +2689,7 @@ static void BE_UploadLightmaps(qboolean force) IDirect3DTexture8_LockRect(tex, 0, &lock, &rect, 0); for (r = 0, w = theRect->r-theRect->l; r < lightmap[i]->rectchange.b-lightmap[i]->rectchange.t; r++) { - memcpy((char*)lock.pBits + r*lock.Pitch, lightmap[i]->lightmaps+(theRect->l+((r+theRect->t)*lm->width))*lightmap_bytes, w*lightmap_bytes); + memcpy((char*)lock.pBits + r*lock.Pitch, lightmap[i]->lightmaps+(theRect->l+((r+theRect->t)*lm->width))*4, w*4); } IDirect3DTexture8_UnlockRect(tex, 0); theRect->l = lm->width; diff --git a/engine/d3d/d3d_backend.c b/engine/d3d/d3d_backend.c index 2ab14947f..b98bab43c 100644 --- a/engine/d3d/d3d_backend.c +++ b/engine/d3d/d3d_backend.c @@ -179,7 +179,7 @@ typedef struct float m_model[16]; unsigned int lastpasscount; vbo_t *batchvbo; - program_t *curprog; + struct programpermu_s *curperm; shader_t *shader_rtlight; IDirect3DTexture9 *curtex[MAX_TMUS]; @@ -1932,9 +1932,9 @@ static void BE_ApplyUniforms(program_t *prog, struct programpermu_s *perm) vec4_t param4; int h; int i; - if (shaderstate.curprog != prog) + if (shaderstate.curperm != perm) { - shaderstate.curprog = prog; + shaderstate.curperm = perm; IDirect3DDevice9_SetVertexShader(pD3DDev9, perm->h.hlsl.vert); IDirect3DDevice9_SetPixelShader(pD3DDev9, perm->h.hlsl.frag); } @@ -2120,10 +2120,7 @@ static unsigned int BE_DrawMeshChain_SetupProgram(program_t *p) perm |= PERMUTATION_FOG; #ifdef NONSKELETALMODELS if (shaderstate.batchvbo && shaderstate.batchvbo->coord2.d3d.buff) - { perm |= PERMUTATION_FRAMEBLEND; - vdec |= D3D_VDEC_POS2; - } #endif // if (p->permu[perm|PERMUTATION_DELUXE].h.loaded && TEXVALID(shaderstate.curtexnums->bump) && shaderstate.curbatch->lightmap[0] >= 0 && lightmap[shaderstate.curbatch->lightmap[0]]->hasdeluxe) // perm |= PERMUTATION_DELUXE; @@ -2138,10 +2135,13 @@ static unsigned int BE_DrawMeshChain_SetupProgram(program_t *p) pp = p->permu[perm]; if (!pp) { - pp = p->permu[perm] = Shader_LoadPermutation(p, perm); + p->permu[perm] = pp = Shader_LoadPermutation(p, perm); if (!pp) - pp = p->permu[perm=0]; + { //failed? copy from 0 so we don't keep re-failing + pp = p->permu[perm] = p->permu[0]; + } } + perm = pp->permutation; if (perm & PERMUTATION_FRAMEBLEND) vdec |= D3D_VDEC_POS2; @@ -2232,9 +2232,9 @@ static qboolean BE_DrawMeshChain_SetupPass(shaderpass_t *pass, unsigned int vert } else { - if (shaderstate.curprog) + if (shaderstate.curperm) { - shaderstate.curprog = NULL; + shaderstate.curperm = NULL; IDirect3DDevice9_SetVertexShader(pD3DDev9, NULL); IDirect3DDevice9_SetPixelShader(pD3DDev9, NULL); } @@ -2340,12 +2340,9 @@ static void BE_RenderMeshProgram(shader_t *s, unsigned int vertbase, unsigned in perm |= PERMUTATION_FOG; #ifdef NONSKELETALMODELS if (shaderstate.batchvbo && shaderstate.batchvbo->coord2.d3d.buff) - { perm |= PERMUTATION_FRAMEBLEND; - vdec |= D3D_VDEC_POS2; - } #endif -// if (p->permu[perm|PERMUTATION_DELUXE].h.loaded && TEXVALID(shaderstate.curtexnums->bump) && shaderstate.curbatch->lightmap[0] >= 0 && lightmap[shaderstate.curbatch->lightmap[0]]->hasdeluxe) +// if (TEXVALID(shaderstate.curtexnums->bump) && shaderstate.curbatch->lightmap[0] >= 0 && lightmap[shaderstate.curbatch->lightmap[0]]->hasdeluxe) // perm |= PERMUTATION_DELUXE; #if MAXRLIGHTMAPS > 1 if (shaderstate.curbatch && shaderstate.curbatch->lightmap[1] >= 0) @@ -2358,10 +2355,13 @@ static void BE_RenderMeshProgram(shader_t *s, unsigned int vertbase, unsigned in pp = p->permu[perm]; if (!pp) { - pp = Shader_LoadPermutation(p, perm); + p->permu[perm] = pp = Shader_LoadPermutation(p, perm); if (!pp) - pp = p->permu[perm=0]; + { //failed? copy from 0 so we don't keep re-failing + pp = p->permu[perm] = p->permu[0]; + } } + perm = pp->permutation; if (perm & PERMUTATION_FRAMEBLEND) vdec |= D3D_VDEC_POS2; diff --git a/engine/d3d/d3d_shader.c b/engine/d3d/d3d_shader.c index 01226fb31..2e5e083c9 100644 --- a/engine/d3d/d3d_shader.c +++ b/engine/d3d/d3d_shader.c @@ -515,11 +515,14 @@ void D3D9Shader_DeleteProg(program_t *prog) { unsigned int permu; struct programpermu_s *pp; - for (permu = 0; permu < countof(prog->permu); permu++) + for (permu = countof(prog->permu); permu-- > 0; ) { pp = prog->permu[permu]; if (!pp) continue; + prog->permu[permu] = NULL; + if (pp == prog->permu[0] && permu) + continue; //entry 0 (only) can get copied to avoid constant recompile failures (0 is always precompiled) if (pp->h.hlsl.vert) { IDirect3DVertexShader9 *vs = pp->h.hlsl.vert; @@ -546,6 +549,7 @@ void D3D9Shader_DeleteProg(program_t *prog) } pp->numparms = 0; BZ_Free(pp->parm); + Z_Free(pp); } } diff --git a/engine/d3d/vid_d3d8.c b/engine/d3d/vid_d3d8.c index 65edcf04d..d30da5e1d 100644 --- a/engine/d3d/vid_d3d8.c +++ b/engine/d3d/vid_d3d8.c @@ -1162,7 +1162,7 @@ static qboolean (D3D8_SCR_UpdateScreen) (void) if (uimenu != 1) { if (r_worldentity.model && cls.state == ca_active) - V_RenderView (); + V_RenderView (nohud); else { noworld = true; diff --git a/engine/gl/gl_alias.c b/engine/gl/gl_alias.c index 3f8db6438..811dba067 100644 --- a/engine/gl/gl_alias.c +++ b/engine/gl/gl_alias.c @@ -2830,7 +2830,7 @@ void BE_GenModelBatches(batch_t **batches, const dlight_t *dl, unsigned int bemo { if (gl_part_flame.value) { - if (ent->model->engineflags & MDLF_EMITREPLACE) + if (emodel->engineflags & MDLF_EMITREPLACE) continue; } } diff --git a/engine/gl/gl_backend.c b/engine/gl/gl_backend.c index d4efb5d3d..d6f4c4d0c 100644 --- a/engine/gl/gl_backend.c +++ b/engine/gl/gl_backend.c @@ -3810,7 +3810,9 @@ static void BE_RenderMeshProgram(const shader_t *shader, const shaderpass_t *pas { p->permu[perm] = permu = Shader_LoadPermutation(p, perm); if (!permu) - return; + { //failed? copy from 0 so we don't keep re-failing + permu = p->permu[perm] = p->permu[0]; + } } GL_SelectProgram(permu->h.glsl.handle); diff --git a/engine/gl/gl_shader.c b/engine/gl/gl_shader.c index a6ba66bda..45e35e993 100644 --- a/engine/gl/gl_shader.c +++ b/engine/gl/gl_shader.c @@ -1718,6 +1718,7 @@ void Shader_UnloadProg(program_t *prog) Z_Free(prog->name); Z_Free(prog->preshade); Z_Free(prog->shadertext); + Z_Free(prog->cvardata); Z_Free(prog); } @@ -1789,6 +1790,8 @@ static void Shader_LoadGeneric(sgeneric_t *g, int qrtype) g->prog.preshade = NULL; Z_Free(g->prog.shadertext); g->prog.shadertext = NULL; + Z_Free(g->prog.cvardata); + g->prog.cvardata = NULL; if (file) { diff --git a/engine/gl/gl_vidcommon.c b/engine/gl/gl_vidcommon.c index 81404a46f..352c84c3d 100644 --- a/engine/gl/gl_vidcommon.c +++ b/engine/gl/gl_vidcommon.c @@ -2652,17 +2652,23 @@ static void GLSlang_DeleteProg(program_t *prog) { unsigned int permu; struct programpermu_s *pp; - for (permu = 0; permu < countof(prog->permu); permu++) + for (permu = countof(prog->permu); permu-- > 0; ) { pp = prog->permu[permu]; if (pp) { + prog->permu[permu] = NULL; + if (pp == prog->permu[0] && permu) + continue; //entry 0 (only) can get copied to avoid constant recompile failures (0 is always precompiled) + qglDeleteProgramObject_(pp->h.glsl.handle); pp->h.glsl.handle = 0; BZ_Free(pp->parm); pp->parm = NULL; pp->numparms = 0; + + Z_Free(pp); } } } diff --git a/engine/gl/shader.h b/engine/gl/shader.h index 3ed883ff7..80ecee957 100644 --- a/engine/gl/shader.h +++ b/engine/gl/shader.h @@ -481,6 +481,7 @@ typedef struct { struct programpermu_s { +#if defined(GLQUAKE) || defined(D3DQUAKE) union programhandle_u { #ifdef GLQUAKE @@ -509,6 +510,7 @@ struct programpermu_s } hlsl; #endif } h; +#endif unsigned int permutation; unsigned int attrmask; unsigned int texmask; //'standard' textures that are in use diff --git a/engine/server/sv_ccmds.c b/engine/server/sv_ccmds.c index 88ac665ce..735ccb096 100644 --- a/engine/server/sv_ccmds.c +++ b/engine/server/sv_ccmds.c @@ -2982,7 +2982,7 @@ void SV_PrecacheList_f(void) for (i = 0; i < MAX_PRECACHE_MODELS; i++) { if (sv.strings.model_precache[i]) - Con_Printf("model %u: %s\n", i, sv.strings.model_precache[i]); + Con_Printf("model %u: ^[%s\\modelviewer\\%s^]\n", i, sv.strings.model_precache[i], sv.strings.model_precache[i]); } } if (!*group || !strncmp(group, "sound", 5)) diff --git a/engine/sw/sw_rast.c b/engine/sw/sw_rast.c index 0c2e90c74..fb7a09155 100644 --- a/engine/sw/sw_rast.c +++ b/engine/sw/sw_rast.c @@ -999,7 +999,7 @@ qboolean SW_SCR_UpdateScreen(void) if (cls.state == ca_active) { if (!CSQC_DrawView()) - V_RenderView (); + V_RenderView (false); R2D_BrightenScreen(); } diff --git a/engine/vk/vkrenderer.h b/engine/vk/vkrenderer.h index cbdbc3192..43820bc90 100644 --- a/engine/vk/vkrenderer.h +++ b/engine/vk/vkrenderer.h @@ -28,7 +28,7 @@ #endif #define VK_NO_PROTOTYPES -#include +#include <../vulkan/vulkan.h> #if defined(_MSC_VER) && !defined(UINT64_MAX) #define UINT64_MAX _UI64_MAX