From 2363b05216031af5be2fa2636097e09f4cefee39 Mon Sep 17 00:00:00 2001 From: Spoike Date: Tue, 22 Jun 2021 14:40:53 +0000 Subject: [PATCH] If texture names can have map-specific prefixes, shaders must also. git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@5912 fc73d0e0-1445-4013-8a0c-d673dee63da5 --- engine/client/cl_plugin.inc | 2 +- engine/client/cl_ui.c | 2 +- engine/client/clq2_ents.c | 2 +- engine/client/console.c | 4 ++-- engine/client/m_mp3.c | 4 ++-- engine/client/p_script.c | 2 +- engine/client/pr_clcmd.c | 2 +- engine/client/pr_csqc.c | 2 +- engine/client/pr_menu.c | 4 ++-- engine/client/r_2d.c | 4 ++-- engine/client/r_surf.c | 2 +- engine/common/com_mesh.c | 2 +- engine/common/common.c | 2 ++ engine/common/q1bsp.c | 6 ++--- engine/gl/gl_alias.c | 12 +++++----- engine/gl/gl_backend.c | 2 +- engine/gl/gl_heightmap.c | 8 +++---- engine/gl/gl_hlmdl.c | 2 +- engine/gl/gl_model.c | 22 +++++++++--------- engine/gl/gl_rmain.c | 2 +- engine/gl/gl_shader.c | 45 ++++++++++++++++++++----------------- engine/gl/shader.h | 11 ++++----- engine/vk/vk_init.c | 2 +- 23 files changed, 77 insertions(+), 69 deletions(-) diff --git a/engine/client/cl_plugin.inc b/engine/client/cl_plugin.inc index ad3583235..927592023 100644 --- a/engine/client/cl_plugin.inc +++ b/engine/client/cl_plugin.inc @@ -1038,7 +1038,7 @@ static qboolean QDECL Plug_Con_SetConsoleString(const char *conname, const char if (con->backshader) R_UnloadShader(con->backshader); if (qrenderer != QR_NONE) - con->backshader = R_RegisterCustom(va("consolevid_%s", con->name), SUF_NONE, Shader_DefaultCinematic, value); + con->backshader = R_RegisterCustom(NULL, va("consolevid_%s", con->name), SUF_NONE, Shader_DefaultCinematic, value); else con->backshader = NULL; } diff --git a/engine/client/cl_ui.c b/engine/client/cl_ui.c index 578727a66..995dc3ef5 100644 --- a/engine/client/cl_ui.c +++ b/engine/client/cl_ui.c @@ -746,7 +746,7 @@ int UI_Cin_Play(const char *name, int x, int y, int w, int h, unsigned int flags break; //this slot is usable } - mediashader = R_RegisterCustom(name, SUF_NONE, Shader_DefaultCinematic, va("video/%s", name)); + mediashader = R_RegisterCustom(NULL, name, SUF_NONE, Shader_DefaultCinematic, va("video/%s", name)); if (!mediashader) return -1; //wtf? cin = R_ShaderGetCinematic(mediashader); diff --git a/engine/client/clq2_ents.c b/engine/client/clq2_ents.c index bd31714c1..af1ebd2e8 100644 --- a/engine/client/clq2_ents.c +++ b/engine/client/clq2_ents.c @@ -2121,7 +2121,7 @@ static void CLQ2_AddPacketEntities (q2frame_t *frame) ent.shaderRGBAf[0] = (!!(renderfx & Q2RF_SHELL_RED)); ent.shaderRGBAf[1] = (!!(renderfx & Q2RF_SHELL_GREEN)); ent.shaderRGBAf[2] = (!!(renderfx & Q2RF_SHELL_BLUE)); - ent.forcedshader = R_RegisterCustom("q2/shell", SUF_NONE, Shader_DefaultSkinShell, NULL); + ent.forcedshader = R_RegisterCustom(NULL, "q2/shell", SUF_NONE, Shader_DefaultSkinShell, NULL); ent.fatness = 2; V_AddEntity (&ent); ent.fatness = 0; diff --git a/engine/client/console.c b/engine/client/console.c index a5162c724..53ff3340e 100644 --- a/engine/client/console.c +++ b/engine/client/console.c @@ -2296,7 +2296,7 @@ static int Con_DrawConsoleLines(console_t *con, conline_t *l, float displayscrol { char *fl = Info_ValueForKey(linkinfo, "imgtype"); if (*fl) - pic = R_RegisterCustom(imgname, atoi(fl), NULL, NULL); + pic = R_RegisterCustom(NULL, imgname, atoi(fl), NULL, NULL); else pic = R_RegisterPic(imgname, NULL); if (pic) @@ -2844,7 +2844,7 @@ static void Con_DrawMouseOver(console_t *mouseconsole) { char *fl = Info_ValueForKey(info, "tipimgtype"); if (*fl) - shader = R_RegisterCustom(key, atoi(fl), NULL, NULL); + shader = R_RegisterCustom(NULL, key, atoi(fl), NULL, NULL); else shader = R2D_SafeCachePic(key); } diff --git a/engine/client/m_mp3.c b/engine/client/m_mp3.c index 50f398903..e321ca33e 100644 --- a/engine/client/m_mp3.c +++ b/engine/client/m_mp3.c @@ -2583,7 +2583,7 @@ static qboolean Media_BeginNextFilm(void) return false; } - videoshader = R_RegisterCustom(sname, SUF_NONE, Shader_DefaultCinematic, p->name); + videoshader = R_RegisterCustom(NULL, sname, SUF_NONE, Shader_DefaultCinematic, p->name); cin = R_ShaderGetCinematic(videoshader); if (cin) @@ -2885,7 +2885,7 @@ void Media_PlayVideoWindowed_f (void) console_t *con; if (!qrenderer) return; - s = R_RegisterCustom(va("consolevid_%s", videomap), SUF_NONE, Shader_DefaultCinematic, videomap); + s = R_RegisterCustom(NULL, va("consolevid_%s", videomap), SUF_NONE, Shader_DefaultCinematic, videomap); if (!R_ShaderGetCinematic(s)) { R_UnloadShader(s); diff --git a/engine/client/p_script.c b/engine/client/p_script.c index fe9fcf274..284de9281 100644 --- a/engine/client/p_script.c +++ b/engine/client/p_script.c @@ -719,7 +719,7 @@ static void P_LoadTexture(part_type_t *ptype, qboolean warn) case BM_RTSMOKE: bmpostfix = "#RTSMOKE"; break; } /*try and load the shader, fail if we would need to generate one*/ - ptype->looks.shader = R_RegisterCustom(va("%s%s", ptype->texname, bmpostfix), SUF_NONE, NULL, NULL); + ptype->looks.shader = R_RegisterCustom(NULL, va("%s%s", ptype->texname, bmpostfix), SUF_NONE, NULL, NULL); } else ptype->looks.shader = NULL; diff --git a/engine/client/pr_clcmd.c b/engine/client/pr_clcmd.c index 51d630798..238df2ab3 100644 --- a/engine/client/pr_clcmd.c +++ b/engine/client/pr_clcmd.c @@ -910,7 +910,7 @@ void QCBUILTIN PF_shaderforname (pubprogfuncs_t *prinst, struct globalvars_s *pr if (*defaultbody) shad = R_RegisterShader(str, SUF_NONE, defaultbody); else - shad = R_RegisterSkin(str, NULL); + shad = R_RegisterSkin(NULL, str); if (shad) G_FLOAT(OFS_RETURN) = shad->id+1; else diff --git a/engine/client/pr_csqc.c b/engine/client/pr_csqc.c index 841119c9a..310d0f3e1 100644 --- a/engine/client/pr_csqc.c +++ b/engine/client/pr_csqc.c @@ -1589,7 +1589,7 @@ static shader_t *PR_R_PolygonShader(const char *shadername, qboolean twod) else if (twod) shader = R_RegisterPic(shadername, NULL); else - shader = R_RegisterCustom(shadername, 0, Shader_PolygonShader, NULL); + shader = R_RegisterCustom(NULL, shadername, 0, Shader_PolygonShader, NULL); return shader; } diff --git a/engine/client/pr_menu.c b/engine/client/pr_menu.c index 47e6fa799..a231969ff 100644 --- a/engine/client/pr_menu.c +++ b/engine/client/pr_menu.c @@ -803,7 +803,7 @@ void QCBUILTIN PF_CL_is_cached_pic (pubprogfuncs_t *prinst, struct globalvars_s { const char *str; str = PR_GetStringOfs(prinst, OFS_PARM0); - G_FLOAT(OFS_RETURN) = !!R_RegisterCustom(str, SUF_2D, NULL, NULL); + G_FLOAT(OFS_RETURN) = !!R_RegisterCustom(NULL, str, SUF_2D, NULL, NULL); } void QCBUILTIN PF_CL_precache_pic (pubprogfuncs_t *prinst, struct globalvars_s *pr_globals) @@ -1231,7 +1231,7 @@ void QCBUILTIN PF_SubConGetSet (pubprogfuncs_t *prinst, struct globalvars_s *pr_ Q_strncpyz(con->backimage, "", sizeof(con->backimage)); if (con->backshader) R_UnloadShader(con->backshader); - con->backshader = R_RegisterCustom(va("consolevid_%s", con->name), SUF_NONE, Shader_DefaultCinematic, value); + con->backshader = R_RegisterCustom(NULL, va("consolevid_%s", con->name), SUF_NONE, Shader_DefaultCinematic, value); } } } diff --git a/engine/client/r_2d.c b/engine/client/r_2d.c index 51bb17199..0f1e2f2a7 100644 --- a/engine/client/r_2d.c +++ b/engine/client/r_2d.c @@ -464,7 +464,7 @@ mpic_t *R2D_SafePicFromWad (const char *name) shader_t *s; if (!qrenderer) return NULL; - s = R_RegisterCustom (va("gfx/%s", name), SUF_2D, Shader_Default2D, "wad"); + s = R_RegisterCustom (NULL, va("gfx/%s", name), SUF_2D, Shader_Default2D, "wad"); return s; } @@ -1032,7 +1032,7 @@ void QDECL R2D_Conback_Callback(struct cvar_s *var, char *oldvalue) if (!R_GetShaderSizes(conback, NULL, NULL, true)) { - conback = R_RegisterCustom("console", SUF_2D, NULL, NULL); //quake3 + conback = R_RegisterCustom(NULL, "console", SUF_2D, NULL, NULL); //quake3 if (!R_GetShaderSizes(conback, NULL, NULL, true)) { #ifdef HEXEN2 diff --git a/engine/client/r_surf.c b/engine/client/r_surf.c index 3a99f164d..5495ca8c8 100644 --- a/engine/client/r_surf.c +++ b/engine/client/r_surf.c @@ -3150,7 +3150,7 @@ void R_GeneratedWorldEBO(void *ctx, void *data, size_t a_, size_t b_) //while we could figure out this info, there would be a lot of vertexes that are not referenced, which would be horrendously slow. if (b->shader->flags & SHADER_SKY) continue; - b->shader = R_RegisterShader_Vertex("unsupported"); + b->shader = R_RegisterShader_Vertex(mod, "unsupported"); } m->numvertexes = webostate->batches[i].b.vbo->vertcount; diff --git a/engine/common/com_mesh.c b/engine/common/com_mesh.c index 19709a24e..404843a25 100644 --- a/engine/common/com_mesh.c +++ b/engine/common/com_mesh.c @@ -3301,7 +3301,7 @@ void Mod_LoadAliasShaders(model_t *mod) if ((ai->csurface.flags & 0x80) || dpcompat_skinfiles.ival) //nodraw f->shader = R_RegisterShader(f->shadername, SUF_NONE, "{\nsurfaceparm nodraw\nsurfaceparm nodlight\nsurfaceparm nomarks\nsurfaceparm noshadows\n}\n"); else - f->shader = R_RegisterSkin(f->shadername, mod->name); + f->shader = R_RegisterSkin(mod, f->shadername); } else f->shader = R_RegisterShader(f->shadername, SUF_NONE, f->defaultshader); diff --git a/engine/common/common.c b/engine/common/common.c index eb2d29289..37bf2c34d 100644 --- a/engine/common/common.c +++ b/engine/common/common.c @@ -2090,6 +2090,8 @@ float MSG_ReadCoord (void) coorddata c = {{0}}; if (net_message.prim.coordtype == COORDTYPE_UNDEFINED) net_message.prim.coordtype = COORDTYPE_FIXED_13_3; + if ((net_message.prim.coordtype&COORDTYPE_SIZE_MASK)>sizeof(c)) + return 0; MSG_ReadData(c.b, net_message.prim.coordtype&COORDTYPE_SIZE_MASK); return MSG_FromCoord(c, net_message.prim.coordtype); } diff --git a/engine/common/q1bsp.c b/engine/common/q1bsp.c index 5affd501c..fae36a6b3 100644 --- a/engine/common/q1bsp.c +++ b/engine/common/q1bsp.c @@ -2276,13 +2276,13 @@ bspx_header_t *BSPX_Setup(model_t *mod, char *filebase, size_t filelen, lump_t * if (h->lumps[i].fileofs + h->lumps[i].filelen > filelen) return NULL; //some sort of corruption/truncation. - if (offs < lumps->fileofs + lumps->filelen) - offs = lumps->fileofs + lumps->filelen; + if (offs < h->lumps[i].fileofs + h->lumps[i].filelen) + offs = h->lumps[i].fileofs + h->lumps[i].filelen; } } } - if (offs < filelen && !mod->archive && mod_loadmappackages.ival) + if (offs < filelen && mod && !mod->archive && mod_loadmappackages.ival) { //we have some sort of trailing junk... is it a zip?... vfsfile_t *f = VFSPIPE_Open(1,true); if (f) diff --git a/engine/gl/gl_alias.c b/engine/gl/gl_alias.c index 8da8b1264..41ef0e799 100644 --- a/engine/gl/gl_alias.c +++ b/engine/gl/gl_alias.c @@ -295,7 +295,7 @@ skinid_t Mod_ReadSkinFile(const char *skinname, const char *skintext) Q_strncpyz(skin->mappings[skin->nummappings].surface, com_token, sizeof(skin->mappings[skin->nummappings].surface)); skintext = COM_ParseToken(skintext, NULL); Q_strncpyz(shadername, com_token, sizeof(shadername)); - skin->mappings[skin->nummappings].shader = R_RegisterSkin(shadername, skin->skinname); + skin->mappings[skin->nummappings].shader = R_RegisterSkin(NULL, shadername); R_BuildDefaultTexnums(NULL, skin->mappings[skin->nummappings].shader, 0); skin->mappings[skin->nummappings].texnums = *skin->mappings[skin->nummappings].shader->defaulttextures; skin->mappings[skin->nummappings].needsfree = false; @@ -317,7 +317,7 @@ skinid_t Mod_ReadSkinFile(const char *skinname, const char *skintext) Q_strncpyz(skin->mappings[skin->nummappings].surface, com_token, sizeof(skin->mappings[skin->nummappings].surface)); skintext = COM_ParseToken(skintext, NULL); Q_strncpyz(shadername, com_token, sizeof(shadername)); - skin->mappings[skin->nummappings].shader = R_RegisterSkin(shadername, skin->skinname); + skin->mappings[skin->nummappings].shader = R_RegisterSkin(NULL, shadername); R_BuildDefaultTexnums(NULL, skin->mappings[skin->nummappings].shader, 0); skin->mappings[skin->nummappings].texnums = *skin->mappings[skin->nummappings].shader->defaulttextures; @@ -396,7 +396,7 @@ skinid_t Mod_ReadSkinFile(const char *skinname, const char *skintext) Q_strncpyz(skin->mappings[skin->nummappings].surface, com_token, sizeof(skin->mappings[skin->nummappings].surface)); skintext = COM_ParseToken(skintext+1, NULL); Q_strncpyz(shadername, com_token, sizeof(shadername)); - skin->mappings[skin->nummappings].shader = R_RegisterCustom (shadername, 0, Shader_DefaultSkin, NULL); + skin->mappings[skin->nummappings].shader = R_RegisterCustom (NULL, shadername, 0, Shader_DefaultSkin, NULL); R_BuildDefaultTexnums(NULL, skin->mappings[skin->nummappings].shader, 0); skin->mappings[skin->nummappings].texnums = *skin->mappings[skin->nummappings].shader->defaulttextures; skin->mappings[skin->nummappings].needsfree = false; @@ -661,7 +661,7 @@ static shader_t *GL_ChooseSkin(galiasinfo_t *inf, model_t *model, int surfnum, e if (inf->numskins < e->skinnum && e->skinnum >= r_globalskin_first.ival && e->skinnum < r_globalskin_first.ival+r_globalskin_count.ival) { shader_t *s; - s = R_RegisterSkin(va("gfx/skin%d.lmp", e->skinnum), NULL); + s = R_RegisterSkin(NULL, va("gfx/skin%d.lmp", e->skinnum)); if (s) { if (!TEXVALID(s->defaulttextures->base)) @@ -813,7 +813,7 @@ static shader_t *GL_ChooseSkin(galiasinfo_t *inf, model_t *model, int surfnum, e { *forcedtex = &cm->texnum; if (!shader) - shader = R_RegisterSkin(skinname, NULL); + shader = R_RegisterSkin(model, skinname); return shader; } } @@ -847,7 +847,7 @@ static shader_t *GL_ChooseSkin(galiasinfo_t *inf, model_t *model, int surfnum, e //q2 has no surfaces in its player models, so don't crash from that //note that q2 should also always have a custom skin set. its not our problem (here) if it doesn't. if (!shader) - shader = R_RegisterSkin(skinname, NULL); + shader = R_RegisterSkin(model, skinname); cm->texnum.bump = shader->defaulttextures->bump; //can't colour bumpmapping if (plskin) diff --git a/engine/gl/gl_backend.c b/engine/gl/gl_backend.c index a560b9379..4af1bd568 100644 --- a/engine/gl/gl_backend.c +++ b/engine/gl/gl_backend.c @@ -4203,7 +4203,7 @@ static qboolean GLBE_RegisterLightShader(int mode) ); shaderstate.inited_shader_light[mode] = true; - shaderstate.shader_light[mode] = R_RegisterCustom(name, SUF_NONE, Shader_LightPass, NULL); + shaderstate.shader_light[mode] = R_RegisterCustom(NULL, name, SUF_NONE, Shader_LightPass, NULL); } if (shaderstate.shader_light[mode]) diff --git a/engine/gl/gl_heightmap.c b/engine/gl/gl_heightmap.c index 7fe5d5b6d..049d8e976 100644 --- a/engine/gl/gl_heightmap.c +++ b/engine/gl/gl_heightmap.c @@ -159,7 +159,7 @@ static void QDECL Terr_LoadSectionTextures(hmsection_t *s) } for (w = s->water; w; w = w->next) { - w->shader = R_RegisterCustom (w->shadername, SUF_NONE, Shader_DefaultWaterShader, NULL); + w->shader = R_RegisterCustom (NULL, w->shadername, SUF_NONE, Shader_DefaultWaterShader, NULL); R_BuildDefaultTexnums(NULL, w->shader, IF_WORLDTEX); //this might get expensive. hideously so. } #endif @@ -5505,7 +5505,7 @@ void Terr_FinishTerrain(model_t *mod) { if (*hm->skyname) { - hm->skyshader = R_RegisterCustom(va("skybox_%s", hm->skyname), SUF_NONE, Shader_DefaultSkybox, NULL); + hm->skyshader = R_RegisterCustom(mod, va("skybox_%s", hm->skyname), SUF_NONE, Shader_DefaultSkybox, NULL); if (!hm->skyshader->skydome) hm->skyshader = NULL; } @@ -5930,13 +5930,13 @@ void Terr_Brush_Draw(heightmap_t *hm, batch_t **batches, entity_t *e) const miptex_t *tx = NULL; #endif - bt->shader = R_RegisterCustom (va("textures/%s", bt->shadername), SUF_LIGHTMAP, NULL, NULL); + bt->shader = R_RegisterCustom (NULL, va("textures/%s", bt->shadername), SUF_LIGHTMAP, NULL, NULL); if (!bt->shader) { if (!Q_strcasecmp(bt->shadername, "clip") || !Q_strcasecmp(bt->shadername, "hint") || !Q_strcasecmp(bt->shadername, "skip")) bt->shader = R_RegisterShader(bt->shadername, SUF_LIGHTMAP, "{\nsurfaceparm nodraw\n}"); else - bt->shader = R_RegisterCustom (bt->shadername, SUF_LIGHTMAP, Shader_DefaultBSPQ1, NULL); + bt->shader = R_RegisterCustom (NULL, bt->shadername, SUF_LIGHTMAP, Shader_DefaultBSPQ1, NULL); // bt->shader = R_RegisterShader_Lightmap(bt->shadername); } diff --git a/engine/gl/gl_hlmdl.c b/engine/gl/gl_hlmdl.c index ccb7fa14b..82dd59755 100644 --- a/engine/gl/gl_hlmdl.c +++ b/engine/gl/gl_hlmdl.c @@ -1592,7 +1592,7 @@ void R_HalfLife_GenerateBatches(entity_t *rent, batch_t **batches) if (s->defaultshadertext) s->shader = R_RegisterShader(s->name, SUF_NONE, s->defaultshadertext); else - s->shader = R_RegisterSkin(s->name, rent->model->name); + s->shader = R_RegisterSkin(rent->model, s->name); // R_BuildDefaultTexnums(&s->defaulttex, s->shader, 0); } diff --git a/engine/gl/gl_model.c b/engine/gl/gl_model.c index 12157689e..ab0ff6736 100644 --- a/engine/gl/gl_model.c +++ b/engine/gl/gl_model.c @@ -1439,7 +1439,7 @@ static const char *Mod_RemapBuggyTexture(const char *name, const qbyte *data, un return NULL; } -static void Mod_FinishTexture(texture_t *tx, const char *loadname, qboolean safetoloadfromwads) +static void Mod_FinishTexture(model_t *mod, texture_t *tx, const char *loadname, qboolean safetoloadfromwads) { extern cvar_t gl_shadeq1_name; char altname[MAX_QPATH]; @@ -1470,7 +1470,7 @@ static void Mod_FinishTexture(texture_t *tx, const char *loadname, qboolean safe shadername = altname; } - tx->shader = R_RegisterCustom (shadername, SUF_LIGHTMAP, Shader_DefaultBSPQ1, NULL); + tx->shader = R_RegisterCustom (mod, shadername, SUF_LIGHTMAP, Shader_DefaultBSPQ1, NULL); if (!tx->srcdata && !safetoloadfromwads) return; @@ -1523,7 +1523,7 @@ void Mod_NowLoadExternal(model_t *loadmodel) if (tx->srcdata) continue; - Mod_FinishTexture(tx, loadname, true); + Mod_FinishTexture(loadmodel, tx, loadname, true); } #endif } @@ -5073,7 +5073,7 @@ void ModBrush_LoadGLStuff(void *ctx, void *data, size_t a, size_t b) { //submodels share textures, so only do this if 'a' is 0 (inline index, 0 = world). for (a = 0; a < mod->numfogs; a++) { - mod->fogs[a].shader = R_RegisterShader_Lightmap(mod->fogs[a].shadername); + mod->fogs[a].shader = R_RegisterShader_Lightmap(mod, mod->fogs[a].shadername); R_BuildDefaultTexnums(NULL, mod->fogs[a].shader, IF_WORLDTEX); if (!mod->fogs[a].shader->fog_dist) { @@ -5090,10 +5090,10 @@ void ModBrush_LoadGLStuff(void *ctx, void *data, size_t a, size_t b) { for(a = 0; a < mod->numtexinfo; a++) { - mod->textures[a]->shader = R_RegisterShader_Lightmap(va("%s#BUMPMODELSPACE", mod->textures[a]->name)); + mod->textures[a]->shader = R_RegisterShader_Lightmap(mod, va("%s#BUMPMODELSPACE", mod->textures[a]->name)); R_BuildDefaultTexnums(NULL, mod->textures[a]->shader, IF_WORLDTEX); - mod->textures[a+mod->numtexinfo]->shader = R_RegisterShader_Vertex (va("%s#VERTEXLIT", mod->textures[a+mod->numtexinfo]->name)); + mod->textures[a+mod->numtexinfo]->shader = R_RegisterShader_Vertex (mod, va("%s#VERTEXLIT", mod->textures[a+mod->numtexinfo]->name)); R_BuildDefaultTexnums(NULL, mod->textures[a+mod->numtexinfo]->shader, IF_WORLDTEX); } } @@ -5101,14 +5101,14 @@ void ModBrush_LoadGLStuff(void *ctx, void *data, size_t a, size_t b) { for(a = 0; a < mod->numtexinfo; a++) { - mod->textures[a]->shader = R_RegisterShader_Lightmap(mod->textures[a]->name); + mod->textures[a]->shader = R_RegisterShader_Lightmap(mod, mod->textures[a]->name); R_BuildDefaultTexnums(NULL, mod->textures[a]->shader, IF_WORLDTEX); - mod->textures[a+mod->numtexinfo]->shader = R_RegisterShader_Vertex (va("%s#VERTEXLIT", mod->textures[a+mod->numtexinfo]->name)); + mod->textures[a+mod->numtexinfo]->shader = R_RegisterShader_Vertex (mod, va("%s#VERTEXLIT", mod->textures[a+mod->numtexinfo]->name)); R_BuildDefaultTexnums(NULL, mod->textures[a+mod->numtexinfo]->shader, IF_WORLDTEX); } } - mod->textures[2*mod->numtexinfo]->shader = R_RegisterShader_Flare("noshader"); + mod->textures[2*mod->numtexinfo]->shader = R_RegisterShader_Flare(mod, "noshader"); } else #endif @@ -5119,7 +5119,7 @@ void ModBrush_LoadGLStuff(void *ctx, void *data, size_t a, size_t b) for(a = 0; a < mod->numtextures; a++) { unsigned int maps = 0; - mod->textures[a]->shader = R_RegisterCustom (mod->textures[a]->name, SUF_LIGHTMAP, Shader_DefaultBSPQ2, NULL); + mod->textures[a]->shader = R_RegisterCustom (mod, mod->textures[a]->name, SUF_LIGHTMAP, Shader_DefaultBSPQ2, NULL); maps |= SHADER_HASPALETTED; maps |= SHADER_HASDIFFUSE; @@ -5141,7 +5141,7 @@ void ModBrush_LoadGLStuff(void *ctx, void *data, size_t a, size_t b) if (!strncmp(loadname, "b_", 2)) Q_strncpyz(loadname, "bmodels", sizeof(loadname)); for(a = 0; a < mod->numtextures; a++) - Mod_FinishTexture(mod->textures[a], loadname, false); + Mod_FinishTexture(mod, mod->textures[a], loadname, false); } } Mod_Batches_Build(mod, data); diff --git a/engine/gl/gl_rmain.c b/engine/gl/gl_rmain.c index 1a87cdd40..3f1d5e5f3 100644 --- a/engine/gl/gl_rmain.c +++ b/engine/gl/gl_rmain.c @@ -2074,7 +2074,7 @@ void GLR_RenderView (void) if (r_fxaa.ival) r_refdef.flags |= RDF_ANTIALIAS; if (*r_postprocshader.string) - custompostproc = R_RegisterCustom(r_postprocshader.string, SUF_NONE, NULL, NULL); + custompostproc = R_RegisterCustom(NULL, r_postprocshader.string, SUF_NONE, NULL, NULL); else if (!r_graphics.ival) custompostproc = R_RegisterShader("postproc_ascii", 0, "{\n" diff --git a/engine/gl/gl_shader.c b/engine/gl/gl_shader.c index bb791ffb8..a48480f8e 100644 --- a/engine/gl/gl_shader.c +++ b/engine/gl/gl_shader.c @@ -2787,12 +2787,12 @@ static void Shader_BEMode(parsestate_t *ps, const char **ptr) "" #endif ); - shader->bemoverrides[mode] = R_RegisterCustom(subname, shader->usageflags|(embed?SUR_FORCEFALLBACK:0), embed?Shader_DefaultScript:NULL, embed); + shader->bemoverrides[mode] = R_RegisterCustom(shader->model, subname, shader->usageflags|(embed?SUR_FORCEFALLBACK:0), embed?Shader_DefaultScript:NULL, embed); } } else { - shader->bemoverrides[mode] = R_RegisterCustom(tokencopy, shader->usageflags|(embed?SUR_FORCEFALLBACK:0), embed?Shader_DefaultScript:NULL, embed); + shader->bemoverrides[mode] = R_RegisterCustom(shader->model, tokencopy, shader->usageflags|(embed?SUR_FORCEFALLBACK:0), embed?Shader_DefaultScript:NULL, embed); } if (embed) BZ_Free(embed); @@ -4363,6 +4363,7 @@ void Shader_Reset(shader_t *s) float dtrate = s->defaulttextures_fps; //FIXME! int w = s->width; int h = s->height; + model_t *mod = s->model; unsigned int uf = s->usageflags; Q_strncpyz(name, s->name, sizeof(name)); s->genargs = NULL; @@ -4375,6 +4376,7 @@ void Shader_Reset(shader_t *s) s->id = id; s->width = w; s->height = h; + s->model = mod; s->defaulttextures = dt; s->numdefaulttextures = dtcount; s->defaulttextures_fps = dtrate; @@ -7339,7 +7341,7 @@ void R_UnloadShader(shader_t *shader) if (--shader->uses == 0) Shader_Free(shader); } -static shader_t *R_LoadShader (const char *name, unsigned int usageflags, shader_gen_t *defaultgen, const char *genargs) +static shader_t *R_LoadShader (model_t *mod, const char *name, unsigned int usageflags, shader_gen_t *defaultgen, const char *genargs) { int i, f = -1; char cleanname[MAX_QPATH]; @@ -7357,6 +7359,7 @@ static shader_t *R_LoadShader (const char *name, unsigned int usageflags, shader s = Hash_Get(&shader_active_hash, cleanname); while (s) { + if (!mod || s->model == mod) //make sure the same texture can be used as either a lightmap or vertexlit shader //if it has an explicit shader overriding it then that still takes precidence. we might just have multiple copies of it. //q3 has a separate (internal) shader for every lightmap. @@ -7432,6 +7435,7 @@ static shader_t *R_LoadShader (const char *name, unsigned int usageflags, shader memset(s->defaulttextures, 0, sizeof(*s->defaulttextures)); s->numdefaulttextures = 0; Q_strncpyz(s->name, cleanname, sizeof(s->name)); + s->model = mod; s->usageflags = usageflags; s->generator = defaultgen; s->width = 0; @@ -7904,11 +7908,11 @@ char *Shader_GetShaderBody(shader_t *s, char *fname, size_t fnamesize) void Shader_ShowShader_f(void) { char *sourcename = Cmd_Argv(1); - shader_t *o = R_LoadShader(sourcename, SUF_NONE, NULL, NULL); + shader_t *o = R_LoadShader(NULL, sourcename, SUF_NONE, NULL, NULL); if (!o) - o = R_LoadShader(sourcename, SUF_LIGHTMAP, NULL, NULL); + o = R_LoadShader(NULL, sourcename, SUF_LIGHTMAP, NULL, NULL); if (!o) - o = R_LoadShader(sourcename, SUF_2D, NULL, NULL); + o = R_LoadShader(NULL, sourcename, SUF_2D, NULL, NULL); if (o) { char fname[256]; @@ -8144,7 +8148,7 @@ void R_RemapShader(const char *sourcename, const char *destname, float timeoffse { if (!strncmp(o->name, cleansrcname, l) && (!o->name[l] || o->name[l]=='#')) { - n = R_LoadShader (va("%s%s", destname, o->name+l), o->usageflags, NULL, NULL); + n = R_LoadShader (o->model, va("%s%s", destname, o->name+l), o->usageflags, NULL, NULL); if (!n) { //if it isn't actually available on disk then don't care about usageflags, just find ANY that's already loaded. // check the hash first @@ -8305,31 +8309,31 @@ int R_GetShaderSizes(shader_t *shader, int *width, int *height, qboolean blockti shader_t *R_RegisterPic (const char *name, const char *subdirs) { shader_t *shader; - shader = R_LoadShader (name, SUF_2D, Shader_Default2D, subdirs); + shader = R_LoadShader (NULL, name, SUF_2D, Shader_Default2D, subdirs); return shader; } shader_t *QDECL R_RegisterShader (const char *name, unsigned int usageflags, const char *shaderscript) { - return R_LoadShader (name, usageflags, Shader_DefaultScript, shaderscript); + return R_LoadShader (NULL, name, usageflags, Shader_DefaultScript, shaderscript); } -shader_t *R_RegisterShader_Lightmap (const char *name) +shader_t *R_RegisterShader_Lightmap (model_t *mod, const char *name) { - return R_LoadShader (name, SUF_LIGHTMAP, Shader_DefaultBSPLM, NULL); + return R_LoadShader (mod, name, SUF_LIGHTMAP, Shader_DefaultBSPLM, NULL); } -shader_t *R_RegisterShader_Vertex (const char *name) +shader_t *R_RegisterShader_Vertex (model_t *mod, const char *name) { - return R_LoadShader (name, 0, Shader_DefaultBSPVertex, NULL); + return R_LoadShader (mod, name, 0, Shader_DefaultBSPVertex, NULL); } -shader_t *R_RegisterShader_Flare (const char *name) +shader_t *R_RegisterShader_Flare (model_t *mod, const char *name) { - return R_LoadShader (name, 0, Shader_DefaultBSPFlare, NULL); + return R_LoadShader (mod, name, 0, Shader_DefaultBSPFlare, NULL); } -shader_t *QDECL R_RegisterSkin (const char *shadername, const char *modname) +shader_t *QDECL R_RegisterSkin (model_t *mod, const char *shadername) { char newsname[MAX_QPATH]; shader_t *shader; @@ -8339,8 +8343,9 @@ shader_t *QDECL R_RegisterSkin (const char *shadername, const char *modname) #endif newsname[0] = 0; - if (modname && !strchr(shadername, '/') && *shadername) + if (mod && !strchr(shadername, '/') && *shadername) { + char *modname = mod->name; char *b = COM_SkipPath(modname); if (b != modname && b-modname + strlen(shadername)+1 < sizeof(newsname)) { @@ -8356,11 +8361,11 @@ shader_t *QDECL R_RegisterSkin (const char *shadername, const char *modname) } else Q_strncpyz(newsname, "models", sizeof(newsname)); - shader = R_LoadShader (shadername, 0, Shader_DefaultSkin, newsname); + shader = R_LoadShader (mod, shadername, 0, Shader_DefaultSkin, newsname); return shader; } -shader_t *R_RegisterCustom (const char *name, unsigned int usageflags, shader_gen_t *defaultgen, const void *args) +shader_t *R_RegisterCustom (model_t *mod, const char *name, unsigned int usageflags, shader_gen_t *defaultgen, const void *args) { - return R_LoadShader (name, usageflags, defaultgen, args); + return R_LoadShader (mod, name, usageflags, defaultgen, args); } #endif //SERVERONLY diff --git a/engine/gl/shader.h b/engine/gl/shader.h index 2326a9286..3875f1a27 100644 --- a/engine/gl/shader.h +++ b/engine/gl/shader.h @@ -600,6 +600,7 @@ enum struct shader_s { char name[MAX_QPATH]; + struct model_s *model; enum { SUF_NONE = 0, SUF_LIGHTMAP = 1<<0, //$lightmap passes are valid. otherwise collapsed to an rgbgen @@ -720,11 +721,11 @@ void R_UnloadShader(shader_t *shader); int R_GetShaderSizes(shader_t *shader, int *width, int *height, qboolean blocktillloaded); shader_t *R_RegisterPic (const char *name, const char *subdirs); shader_t *QDECL R_RegisterShader (const char *name, unsigned int usageflags, const char *shaderscript); -shader_t *R_RegisterShader_Lightmap (const char *name); -shader_t *R_RegisterShader_Vertex (const char *name); -shader_t *R_RegisterShader_Flare (const char *name); -shader_t *QDECL R_RegisterSkin (const char *shadername, const char *modname); -shader_t *R_RegisterCustom (const char *name, unsigned int usageflags, shader_gen_t *defaultgen, const void *args); +shader_t *R_RegisterShader_Lightmap (model_t *mod, const char *name); +shader_t *R_RegisterShader_Vertex (model_t *mod, const char *name); +shader_t *R_RegisterShader_Flare (model_t *mod, const char *name); +shader_t *QDECL R_RegisterSkin (model_t *mod, const char *shadername); +shader_t *R_RegisterCustom (model_t *mod, const char *name, unsigned int usageflags, shader_gen_t *defaultgen, const void *args); //once loaded, most shaders should have one of the following two calls used upon it void QDECL R_BuildDefaultTexnums(texnums_t *tn, shader_t *shader, unsigned int imageflags); void QDECL R_BuildLegacyTexnums(shader_t *shader, const char *fallbackname, const char *subpath, unsigned int loadflags, unsigned int imageflags, uploadfmt_t basefmt, size_t width, size_t height, qbyte *mipdata, qbyte *palette); diff --git a/engine/vk/vk_init.c b/engine/vk/vk_init.c index 901a951b6..a72e8ddae 100644 --- a/engine/vk/vk_init.c +++ b/engine/vk/vk_init.c @@ -2756,7 +2756,7 @@ void VK_R_RenderView (void) { if (*r_postprocshader.string) { - custompostproc = R_RegisterCustom(r_postprocshader.string, SUF_NONE, NULL, NULL); + custompostproc = R_RegisterCustom(NULL, r_postprocshader.string, SUF_NONE, NULL, NULL); if (custompostproc) r_refdef.flags |= RDF_CUSTOMPOSTPROC; }