From 2538e37e28ba8e593ebe20355024befda97bfdf8 Mon Sep 17 00:00:00 2001 From: Spoike Date: Sun, 9 May 2021 13:01:15 +0000 Subject: [PATCH] Add a preview for 2d array textures. Bind gl textures according to texture type rather than hardcoded assumptions, making it more consistent with the other rendering APIs. git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@5839 fc73d0e0-1445-4013-8a0c-d673dee63da5 --- engine/client/console.c | 10 +++ engine/client/merged.h | 24 +++---- engine/d3d/d3d11_backend.c | 2 - engine/gl/gl_backend.c | 94 +++++++++++++------------- engine/gl/gl_model.c | 2 +- engine/gl/gl_shader.c | 36 +--------- engine/gl/glquake.h | 1 - engine/gl/shader.h | 2 - engine/shaders/generatebuiltinsl.c | 1 + engine/shaders/glsl/default2d.glsl | 4 +- engine/shaders/glsl/default2danim.glsl | 36 ++++++++++ engine/vk/vk_backend.c | 8 +-- 12 files changed, 113 insertions(+), 107 deletions(-) create mode 100644 engine/shaders/glsl/default2danim.glsl diff --git a/engine/client/console.c b/engine/client/console.c index 96564b934..889a358b4 100644 --- a/engine/client/console.c +++ b/engine/client/console.c @@ -2262,6 +2262,11 @@ static int Con_DrawConsoleLines(console_t *con, conline_t *l, float displayscrol pic = R_RegisterShader("tiprawimgcube", 0, "{\nprogram postproc_equirectangular\n{\nmap \"$cube:$reflectcube\"\n}\n}"); pic->defaulttextures->reflectcube = img; } + else if (img && (img->flags & IF_TEXTYPEMASK)==IF_TEXTYPE_2D_ARRAY) + { + pic = R_RegisterShader("tiprawimgarray", 0, "{\nprogram default2danim\n{\nmap \"$2darray:$diffuse\"\n}\n}"); + pic->defaulttextures->base = img; + } else { pic = R2D_SafeCachePic("tiprawimg"); @@ -2827,6 +2832,11 @@ static void Con_DrawMouseOver(console_t *mouseconsole) shader = R_RegisterShader("tiprawimgcube", 0, "{\nprogram postproc_equirectangular\n{\nmap \"$cube:$reflectcube\"\n}\n}"); shader->defaulttextures->reflectcube = img; } + else if ((img->flags & IF_TEXTYPEMASK)==IF_TEXTYPE_2D_ARRAY) + { + shader = R_RegisterShader("tiprawimgarray", 0, "{\nprogram default2danim\n{\nmap \"$2darray:$diffuse\"\n}\n}"); + shader->defaulttextures->base = img; + } else if ((img->flags&IF_TEXTYPEMASK) == IF_TEXTYPE_2D) { shader = R2D_SafeCachePic("tiprawimg"); diff --git a/engine/client/merged.h b/engine/client/merged.h index 0b422a0cf..2f44ecddd 100644 --- a/engine/client/merged.h +++ b/engine/client/merged.h @@ -294,7 +294,7 @@ typedef struct texid_s texid_tf; struct pendingtextureinfo { - enum + enum imgtype_e { //formats are all w*h*d (where depth has limitations according to type) PTI_2D, //w*h*1 - depth MUST be 1 @@ -376,17 +376,17 @@ typedef struct typedef struct texnums_s { char mapname[MAX_QPATH]; //the 'official' name of the diffusemap. used to generate filenames for other textures. - texid_t base; //regular diffuse texture. may have alpha if surface is transparent. - texid_t bump; //normalmap. height values packed in alpha. - texid_t specular; //specular lighting values. alpha contains exponent multiplier - texid_t upperoverlay; //diffuse texture for the upper body(shirt colour). no alpha channel. added to base.rgb. ideally an l8 texture - texid_t loweroverlay; //diffuse texture for the lower body(trouser colour). no alpha channel. added to base.rgb. ideally an l8 texture - texid_t paletted; //8bit paletted data, just because. - texid_t fullbright; //emissive texture. alpha should be 1. - texid_t reflectcube; //for fake reflections - texid_t reflectmask; //defines how reflective it is (for cubemap reflections) - texid_t displacement; //alternative to bump.a, eg R16[F] for offsetmapping or tessellation - texid_t occlusion; //occlusion map... + texid_t base; //2d, regular diffuse texture. may have alpha if surface is transparent. + texid_t bump; //2d, normalmap. height values packed in alpha. + texid_t specular; //2d, specular lighting values. alpha contains exponent multiplier + texid_t upperoverlay; //2d, diffuse texture for the upper body(shirt colour). no alpha channel. added to base.rgb. ideally an l8 texture + texid_t loweroverlay; //2d, diffuse texture for the lower body(trouser colour). no alpha channel. added to base.rgb. ideally an l8 texture + texid_t paletted; //2d, 8bit paletted data, just because. only red is used. + texid_t fullbright; //2d, emissive texture. alpha should be 1. + texid_t reflectcube; //cube, for fake reflections + texid_t reflectmask; //2d, defines how reflective it is (for cubemap reflections) + texid_t displacement; //2d, alternative to bump.a, eg R16[F] for offsetmapping or tessellation + texid_t occlusion; //2d, occlusion map... only red is used. //the material's pushconstants. vulkan guarentees only 128 bytes. so 8 vec4s. note that lmscales should want 4 of them... /*struct diff --git a/engine/d3d/d3d11_backend.c b/engine/d3d/d3d11_backend.c index 499c82608..db75e0d7b 100644 --- a/engine/d3d/d3d11_backend.c +++ b/engine/d3d/d3d11_backend.c @@ -1065,8 +1065,6 @@ static void SelectPassTexture(unsigned int tu, const shaderpass_t *pass) case T_GEN_ANIMMAP: BindTexture(tu, pass->anim_frames[(int)(pass->anim_fps * shaderstate.curtime) % pass->anim_numframes]); break; - case T_GEN_3DMAP: - case T_GEN_CUBEMAP: case T_GEN_SINGLEMAP: BindTexture(tu, pass->anim_frames[0]); break; diff --git a/engine/gl/gl_backend.c b/engine/gl/gl_backend.c index dc9a2193d..a560b9379 100644 --- a/engine/gl/gl_backend.c +++ b/engine/gl/gl_backend.c @@ -503,7 +503,7 @@ void GL_MTBind(int tmu, int target, texid_t texnum) } #if 0//def GLSLONLY -void GL_LazyBind(int tmu, int target, texid_t texnum) +static void GL_LazyBind(int tmu, texid_t texnum) { int glnum = texnum?texnum->num:0; if (shaderstate.currenttextures[tmu] != glnum) @@ -513,9 +513,18 @@ void GL_LazyBind(int tmu, int target, texid_t texnum) } } #else -void GL_LazyBind(int tmu, int target, texid_t texnum) +static void GL_LazyBind(int tmu, texid_t texnum) { - int glnum = texnum?texnum->num:0; + int glnum; + GLenum target; + if (texnum) + { + static GLenum imgtab[] = {GL_TEXTURE_2D, GL_TEXTURE_3D, GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_2D_ARRAY, GL_TEXTURE_CUBE_MAP_ARRAY_ARB}; + glnum = texnum->num, target = imgtab[(enum imgtype_e)((texnum->flags & IF_TEXTYPEMASK)>>IF_TEXTYPESHIFT)]; + } + else + glnum = 0, target = 0; + #ifndef FORCESTATE if (shaderstate.currenttextures[tmu] != glnum) #endif @@ -1097,7 +1106,7 @@ qboolean GLBE_BeginShadowMap(int id, int w, int h, uploadfmt_t encoding, int *re while(shaderstate.lastpasstmus>0) { - GL_LazyBind(--shaderstate.lastpasstmus, 0, r_nulltex); + GL_LazyBind(--shaderstate.lastpasstmus, r_nulltex); } shaderstate.shaderbits &= ~SBITS_MISC_DEPTHWRITE; @@ -1246,8 +1255,7 @@ static void Shader_BindTextureForPass(int tmu, const shaderpass_t *pass) t = shaderstate.curbatch->envmap; else t = shaderstate.tex_reflectcube; - GL_LazyBind(tmu, GL_TEXTURE_CUBE_MAP_ARB, t); - return; + break; case T_GEN_REFLECTMASK: if (shaderstate.curtexnums && TEXLOADED(shaderstate.curtexnums->reflectmask)) t = shaderstate.curtexnums->reflectmask; @@ -1273,21 +1281,11 @@ static void Shader_BindTextureForPass(int tmu, const shaderpass_t *pass) break; case T_GEN_LIGHTCUBEMAP: - GL_LazyBind(tmu, GL_TEXTURE_CUBE_MAP_ARB, shaderstate.lightcubemap); - return; - case T_GEN_CUBEMAP: - t = pass->anim_frames[0]; - GL_LazyBind(tmu, GL_TEXTURE_CUBE_MAP_ARB, t); - return; + t = shaderstate.lightcubemap; + break; case T_GEN_SOURCECUBE: t = scenepp_postproc_cube; - GL_LazyBind(tmu, GL_TEXTURE_CUBE_MAP_ARB, t); - return; - - case T_GEN_3DMAP: - t = pass->anim_frames[0]; - GL_LazyBind(tmu, GL_TEXTURE_3D, t); - return; + break; #ifdef HAVE_MEDIA_DECODER case T_GEN_VIDEOMAP: @@ -1328,7 +1326,7 @@ static void Shader_BindTextureForPass(int tmu, const shaderpass_t *pass) t = shaderstate.tex_gbuf[pass->texgen-T_GEN_GBUFFER0]; break; } - GL_LazyBind(tmu, GL_TEXTURE_2D, t); + GL_LazyBind(tmu, t); } /*========================================== matrix functions =====================================*/ @@ -1534,7 +1532,7 @@ void GLBE_Shutdown(void) GL_SelectEBO(0); for (u = 0; u < countof(shaderstate.currenttextures); u++) - GL_LazyBind(u, 0, r_nulltex); + GL_LazyBind(u, r_nulltex); GL_SelectTexture(0); } @@ -3326,7 +3324,7 @@ static void DrawPass(const shaderpass_t *pass) /*make sure no textures linger*/ for (k = tmu; k < shaderstate.lastpasstmus; k++) { - GL_LazyBind(k, 0, r_nulltex); + GL_LazyBind(k, r_nulltex); } shaderstate.lastpasstmus = tmu; @@ -3336,7 +3334,7 @@ static void DrawPass(const shaderpass_t *pass) tmu = 0; /*bind the light texture*/ - GL_LazyBind(tmu, GL_TEXTURE_2D, lightmap[shaderstate.curbatch->lightmap[j]]->lightmap_texture); + GL_LazyBind(tmu, lightmap[shaderstate.curbatch->lightmap[j]]->lightmap_texture); /*set up the colourmod for this style's lighting*/ shaderstate.pendingcolourvbo = 0; @@ -3366,7 +3364,7 @@ static void DrawPass(const shaderpass_t *pass) { for (k = tmu; k < shaderstate.lastpasstmus; k++) { - GL_LazyBind(k, 0, r_nulltex); + GL_LazyBind(k, r_nulltex); } shaderstate.lastpasstmus = tmu; BE_EnableShaderAttributes(attr, 0); @@ -3386,7 +3384,7 @@ static void DrawPass(const shaderpass_t *pass) for (i = tmu; i < shaderstate.lastpasstmus; i++) { - GL_LazyBind(i, 0, r_nulltex); + GL_LazyBind(i, r_nulltex); } shaderstate.lastpasstmus = tmu; BE_EnableShaderAttributes(attr, 0); @@ -3948,16 +3946,16 @@ static void BE_RenderMeshProgram(const shader_t *shader, const shaderpass_t *pas #if MAXRLIGHTMAPS > 1 if (perm & PERMUTATION_LIGHTSTYLES) { - GL_LazyBind(i++, GL_TEXTURE_2D, shaderstate.curbatch->lightmap[1]>=0?lightmap[shaderstate.curbatch->lightmap[1]]->lightmap_texture:r_nulltex); - GL_LazyBind(i++, GL_TEXTURE_2D, shaderstate.curbatch->lightmap[2]>=0?lightmap[shaderstate.curbatch->lightmap[2]]->lightmap_texture:r_nulltex); - GL_LazyBind(i++, GL_TEXTURE_2D, shaderstate.curbatch->lightmap[3]>=0?lightmap[shaderstate.curbatch->lightmap[3]]->lightmap_texture:r_nulltex); - GL_LazyBind(i++, GL_TEXTURE_2D, (shaderstate.curbatch->lightmap[1]>=0&&lightmap[shaderstate.curbatch->lightmap[1]]->hasdeluxe)?lightmap[shaderstate.curbatch->lightmap[1]+1]->lightmap_texture:missing_texture_normal); - GL_LazyBind(i++, GL_TEXTURE_2D, (shaderstate.curbatch->lightmap[2]>=0&&lightmap[shaderstate.curbatch->lightmap[2]]->hasdeluxe)?lightmap[shaderstate.curbatch->lightmap[2]+1]->lightmap_texture:missing_texture_normal); - GL_LazyBind(i++, GL_TEXTURE_2D, (shaderstate.curbatch->lightmap[3]>=0&&lightmap[shaderstate.curbatch->lightmap[3]]->hasdeluxe)?lightmap[shaderstate.curbatch->lightmap[3]+1]->lightmap_texture:missing_texture_normal); + GL_LazyBind(i++, shaderstate.curbatch->lightmap[1]>=0?lightmap[shaderstate.curbatch->lightmap[1]]->lightmap_texture:r_nulltex); + GL_LazyBind(i++, shaderstate.curbatch->lightmap[2]>=0?lightmap[shaderstate.curbatch->lightmap[2]]->lightmap_texture:r_nulltex); + GL_LazyBind(i++, shaderstate.curbatch->lightmap[3]>=0?lightmap[shaderstate.curbatch->lightmap[3]]->lightmap_texture:r_nulltex); + GL_LazyBind(i++, (shaderstate.curbatch->lightmap[1]>=0&&lightmap[shaderstate.curbatch->lightmap[1]]->hasdeluxe)?lightmap[shaderstate.curbatch->lightmap[1]+1]->lightmap_texture:missing_texture_normal); + GL_LazyBind(i++, (shaderstate.curbatch->lightmap[2]>=0&&lightmap[shaderstate.curbatch->lightmap[2]]->hasdeluxe)?lightmap[shaderstate.curbatch->lightmap[2]+1]->lightmap_texture:missing_texture_normal); + GL_LazyBind(i++, (shaderstate.curbatch->lightmap[3]>=0&&lightmap[shaderstate.curbatch->lightmap[3]]->hasdeluxe)?lightmap[shaderstate.curbatch->lightmap[3]+1]->lightmap_texture:missing_texture_normal); } #endif while (shaderstate.lastpasstmus > i) - GL_LazyBind(--shaderstate.lastpasstmus, 0, r_nulltex); + GL_LazyBind(--shaderstate.lastpasstmus, r_nulltex); shaderstate.lastpasstmus = i; BE_EnableShaderAttributes(permu->attrmask, shaderstate.sourcevbo->vao); @@ -4045,7 +4043,7 @@ void GLBE_SelectMode(backendmode_t mode) /*BEM_DEPTHONLY does support mesh writing, but its not the only way its used... FIXME!*/ while(shaderstate.lastpasstmus>0) { - GL_LazyBind(--shaderstate.lastpasstmus, 0, r_nulltex); + GL_LazyBind(--shaderstate.lastpasstmus, r_nulltex); } //we don't write or blend anything (maybe alpha test... but mneh) @@ -4075,7 +4073,7 @@ void GLBE_SelectMode(backendmode_t mode) //disable all tmus while(shaderstate.lastpasstmus>0) { - GL_LazyBind(--shaderstate.lastpasstmus, 0, r_nulltex); + GL_LazyBind(--shaderstate.lastpasstmus, r_nulltex); } #ifndef GLSLONLY if (!gl_config_nofixedfunc) @@ -4123,9 +4121,9 @@ void GLBE_SelectMode(backendmode_t mode) case BEM_FOG: while(shaderstate.lastpasstmus>0) { - GL_LazyBind(--shaderstate.lastpasstmus, 0, r_nulltex); + GL_LazyBind(--shaderstate.lastpasstmus, r_nulltex); } - GL_LazyBind(0, GL_TEXTURE_2D, shaderstate.fogtexture); + GL_LazyBind(0, shaderstate.fogtexture); shaderstate.lastpasstmus = 1; Vector4Set(shaderstate.pendingcolourflat, 1, 1, 1, 1); @@ -4379,7 +4377,7 @@ static void BE_LegacyLighting(void) shaderstate.normalisationcubemap = GenerateNormalisationCubeMap(); //tmu0: normalmap+replace+regular tex coords - GL_LazyBind(tmu, GL_TEXTURE_2D, shaderstate.curtexnums->bump); + GL_LazyBind(tmu, shaderstate.curtexnums->bump); BE_SetPassBlendMode(tmu, PBM_REPLACE); shaderstate.pendingtexcoordparts[tmu] = 2; shaderstate.pendingtexcoordvbo[tmu] = shaderstate.sourcevbo->texcoord.gl.vbo; @@ -4388,7 +4386,7 @@ static void BE_LegacyLighting(void) tmu++; //tmu1: normalizationcubemap+dot3+lightdir - GL_LazyBind(tmu, GL_TEXTURE_CUBE_MAP_ARB, shaderstate.normalisationcubemap); + GL_LazyBind(tmu, shaderstate.normalisationcubemap); BE_SetPassBlendMode(tmu, PBM_DOTPRODUCT); shaderstate.pendingtexcoordparts[tmu] = 3; shaderstate.pendingtexcoordvbo[tmu] = 0; @@ -4397,7 +4395,7 @@ static void BE_LegacyLighting(void) tmu++; //tmu2: $diffuse+multiply+regular tex coords - GL_LazyBind(tmu, GL_TEXTURE_2D, shaderstate.curtexnums->base); //texture not used, its just to make sure the code leaves it enabled. + GL_LazyBind(tmu, shaderstate.curtexnums->base); //texture not used, its just to make sure the code leaves it enabled. BE_SetPassBlendMode(tmu, PBM_MODULATE); shaderstate.pendingtexcoordparts[tmu] = 2; shaderstate.pendingtexcoordvbo[tmu] = shaderstate.sourcevbo->texcoord.gl.vbo; @@ -4406,7 +4404,7 @@ static void BE_LegacyLighting(void) tmu++; //tmu3: $any+multiply-by-colour+notc - GL_LazyBind(tmu, GL_TEXTURE_2D, shaderstate.curtexnums->base); //texture not used, its just to make sure the code leaves it enabled. + GL_LazyBind(tmu, shaderstate.curtexnums->base); //texture not used, its just to make sure the code leaves it enabled. BE_SetPassBlendMode(tmu, PBM_MODULATE_PREV_COLOUR); shaderstate.pendingtexcoordparts[tmu] = 0; shaderstate.pendingtexcoordvbo[tmu] = 0; @@ -4417,7 +4415,7 @@ static void BE_LegacyLighting(void) for (i = tmu; i < shaderstate.lastpasstmus; i++) { - GL_LazyBind(i, 0, r_nulltex); + GL_LazyBind(i, r_nulltex); } shaderstate.lastpasstmus = tmu; } @@ -4427,14 +4425,14 @@ static void BE_LegacyLighting(void) //tmu0: $diffuse+multiply+regular tex coords //multiplies by vertex colours - GL_LazyBind(0, GL_TEXTURE_2D, shaderstate.curtexnums->base); //texture not used, its just to make sure the code leaves it enabled. + GL_LazyBind(0, shaderstate.curtexnums->base); //texture not used, its just to make sure the code leaves it enabled. BE_SetPassBlendMode(0, PBM_MODULATE); shaderstate.pendingtexcoordvbo[0] = shaderstate.sourcevbo->texcoord.gl.vbo; shaderstate.pendingtexcoordpointer[0] = shaderstate.sourcevbo->texcoord.gl.addr; for (i = 1; i < shaderstate.lastpasstmus; i++) { - GL_LazyBind(i, 0, r_nulltex); + GL_LazyBind(i, r_nulltex); } shaderstate.lastpasstmus = 1; } @@ -4646,7 +4644,7 @@ static void DrawMeshes(void) Vector4Set(shaderstate.pendingcolourflat, 1, 1, 1, 1); while(shaderstate.lastpasstmus>0) { - GL_LazyBind(--shaderstate.lastpasstmus, 0, r_nulltex); + GL_LazyBind(--shaderstate.lastpasstmus, r_nulltex); } BE_SendPassBlendDepthMask((shaderstate.curshader->passes[0].shaderbits & ~SBITS_BLEND_BITS) | SBITS_SRCBLEND_SRC_ALPHA | SBITS_DSTBLEND_ONE_MINUS_SRC_ALPHA | ((r_wireframe.ival == 1)?SBITS_MISC_NODEPTHTEST:0)); @@ -4690,7 +4688,7 @@ static void DrawMeshes(void) Vector4Set(shaderstate.pendingcolourflat, 0, 0, 0, 1); while(shaderstate.lastpasstmus>0) { - GL_LazyBind(--shaderstate.lastpasstmus, 0, r_nulltex); + GL_LazyBind(--shaderstate.lastpasstmus, r_nulltex); } BE_SetPassBlendMode(0, PBM_REPLACE); @@ -4843,9 +4841,9 @@ static void DrawMeshes(void) while(shaderstate.lastpasstmus>1) { - GL_LazyBind(--shaderstate.lastpasstmus, 0, r_nulltex); + GL_LazyBind(--shaderstate.lastpasstmus, r_nulltex); } - GL_LazyBind(0, GL_TEXTURE_2D, shaderstate.fogtexture); + GL_LazyBind(0, shaderstate.fogtexture); shaderstate.lastpasstmus = 1; Vector4Scale(shaderstate.curbatch->fog->shader->fog_color, (1/255.0), shaderstate.pendingcolourflat); @@ -6285,7 +6283,7 @@ void GLBE_DrawWorld (batch_t **worldbatches) while(shaderstate.lastpasstmus>0) { - GL_LazyBind(--shaderstate.lastpasstmus, 0, r_nulltex); + GL_LazyBind(--shaderstate.lastpasstmus, r_nulltex); } #ifdef RTLIGHTS Sh_Reset(); diff --git a/engine/gl/gl_model.c b/engine/gl/gl_model.c index 921f40976..9de92405d 100644 --- a/engine/gl/gl_model.c +++ b/engine/gl/gl_model.c @@ -630,7 +630,7 @@ void Mod_Init (qboolean initial) Cmd_AddCommand("version_modelformats", Mod_PrintFormats_f); #ifndef SERVERONLY - Cmd_AddCommandD("mod_findcubemaps", Mod_FindCubemaps_f, "Scans the entities of a map to find reflection envmap sites and determines the nearest one to each surface."); + Cmd_AddCommandD("mod_findcubemaps", Mod_FindCubemaps_f, "Scans the entities of a map to find reflection env_cubemap sites and determines the nearest one to each surface."); Cmd_AddCommandD("mod_realign", Mod_Realign_f, "Reads the named bsp and writes it back out with only alignment changes."); Cmd_AddCommandD("mod_bspx_list", Mod_BSPX_List_f, "Lists all lumps (and their sizes) in the specified bsp."); Cmd_AddCommandD("mod_bspx_strip", Mod_BSPX_Strip_f, "Strips a named extension lump from a bsp file."); diff --git a/engine/gl/gl_shader.c b/engine/gl/gl_shader.c index bf1f79d4c..b8707c9ae 100644 --- a/engine/gl/gl_shader.c +++ b/engine/gl/gl_shader.c @@ -3081,22 +3081,7 @@ static void Shaderpass_Map (parsestate_t *ps, const char **ptr) flags = Shader_SetImageFlags (ps, pass, &token, 0); if (!Shaderpass_MapGen(ps, pass, token)) { - switch((flags & IF_TEXTYPEMASK) >> IF_TEXTYPESHIFT) - { - case PTI_2D: - pass->texgen = T_GEN_SINGLEMAP; - break; - case PTI_3D: - pass->texgen = T_GEN_3DMAP; - break; - case PTI_CUBE: - pass->texgen = T_GEN_CUBEMAP; - break; - default: - pass->texgen = T_GEN_SINGLEMAP; - break; - } - + pass->texgen = T_GEN_SINGLEMAP; if (pass->tcgen == TC_GEN_UNSPECIFIED) pass->tcgen = TC_GEN_BASE; if (!*shader->defaulttextures->mapname && *token != '$' && pass->tcgen == TC_GEN_BASE) @@ -3186,20 +3171,7 @@ static void Shaderpass_ClampMap (parsestate_t *ps, const char **ptr) if (pass->tcgen == TC_GEN_UNSPECIFIED) pass->tcgen = TC_GEN_BASE; pass->anim_frames[0] = Shader_FindImage (ps, token, flags); - - switch((flags & IF_TEXTYPEMASK) >> IF_TEXTYPESHIFT) - { - default: - case PTI_2D: - pass->texgen = T_GEN_SINGLEMAP; - break; - case PTI_3D: - pass->texgen = T_GEN_3DMAP; - break; - case PTI_CUBE: - pass->texgen = T_GEN_CUBEMAP; - break; - } + pass->texgen = T_GEN_SINGLEMAP; if (!TEXVALID(pass->anim_frames[0])) { @@ -3921,8 +3893,8 @@ static void Shaderpass_CubeMap(parsestate_t *ps, const char **ptr) if (pass->tcgen == TC_GEN_UNSPECIFIED) pass->tcgen = TC_GEN_SKYBOX; - pass->texgen = T_GEN_CUBEMAP; pass->anim_frames[0] = Shader_FindImage(ps, token, IF_TEXTYPE_CUBE); + pass->texgen = T_GEN_SINGLEMAP; if (!TEXVALID(pass->anim_frames[0])) { @@ -7700,8 +7672,6 @@ static char *Shader_DecomposeSubPass(char *o, shader_t *s, shaderpass_t *p, qboo #ifdef HAVE_MEDIA_DECODER case T_GEN_VIDEOMAP: Shader_DecomposeSubPassMap(o, s, "videomap", Media_UpdateForShader(p->cin)); break; #endif - case T_GEN_CUBEMAP: Shader_DecomposeSubPassMap(o, s, "map $cubemap", p->anim_frames[0]); break; - case T_GEN_3DMAP: Shader_DecomposeSubPassMap(o, s, "map $3dmap", p->anim_frames[0]); break; case T_GEN_LIGHTMAP: sprintf(o, "map $lightmap "); break; case T_GEN_DELUXMAP: sprintf(o, "map $deluxemap "); break; case T_GEN_SHADOWMAP: sprintf(o, "map $shadowmap "); break; diff --git a/engine/gl/glquake.h b/engine/gl/glquake.h index ac0110a59..61aa3a01d 100644 --- a/engine/gl/glquake.h +++ b/engine/gl/glquake.h @@ -323,7 +323,6 @@ void Sh_PurgeShadowMeshes(void); #ifdef GLQUAKE void R_TranslatePlayerSkin (int playernum); void GL_MTBind(int tmu, int target, texid_t texnum); /*use this if you're going to change the texture object (ensures glActiveTexture(tmu))*/ -void GL_LazyBind(int tmu, int target, texid_t texnum); /*use this if you don't care about the active tmu, only that it is bound on that tmu (does not guarentee glActiveTexture) (ie: no glTexImage etc)*/ void GL_CullFace(unsigned int sflags); void GL_TexEnv(GLenum mode); diff --git a/engine/gl/shader.h b/engine/gl/shader.h index e36317ce4..2326a9286 100644 --- a/engine/gl/shader.h +++ b/engine/gl/shader.h @@ -289,8 +289,6 @@ typedef struct shaderpass_s { #ifdef HAVE_MEDIA_DECODER T_GEN_VIDEOMAP, //use the media playback as an image source, updating each frame for which it is visible #endif - T_GEN_CUBEMAP, //use a cubemap instead, otherwise like T_GEN_SINGLEMAP - T_GEN_3DMAP, //use a 3d texture instead, otherwise T_GEN_SINGLEMAP. #define GBUFFER_COUNT 8 #define T_GEN_GBUFFERCASE T_GEN_GBUFFER0:case T_GEN_GBUFFER1:case T_GEN_GBUFFER2:case T_GEN_GBUFFER3:case T_GEN_GBUFFER4:case T_GEN_GBUFFER5:case T_GEN_GBUFFER6:case T_GEN_GBUFFER7 diff --git a/engine/shaders/generatebuiltinsl.c b/engine/shaders/generatebuiltinsl.c index e8bba4e10..b24e495b6 100644 --- a/engine/shaders/generatebuiltinsl.c +++ b/engine/shaders/generatebuiltinsl.c @@ -17,6 +17,7 @@ char shaders[][64] = "crepuscular_sky", "depthonly", "default2d", + "default2danim", "defaultadditivesprite", "defaultskin", "defaultsky", diff --git a/engine/shaders/glsl/default2d.glsl b/engine/shaders/glsl/default2d.glsl index ad5afd308..b22d364d7 100644 --- a/engine/shaders/glsl/default2d.glsl +++ b/engine/shaders/glsl/default2d.glsl @@ -1,5 +1,5 @@ !!ver 100-450 -!!samps 1 +!!samps img=0 //this shader is present for support for gles/gl3core contexts //it is single-texture-with-vertex-colours, and doesn't do anything special. @@ -26,7 +26,7 @@ void main () #ifdef PREMUL f.rgb *= f.a; #endif - f *= texture2D(s_t0, tc); + f *= texture2D(s_img, tc); gl_FragColor = f; } #endif diff --git a/engine/shaders/glsl/default2danim.glsl b/engine/shaders/glsl/default2danim.glsl new file mode 100644 index 000000000..284e2828c --- /dev/null +++ b/engine/shaders/glsl/default2danim.glsl @@ -0,0 +1,36 @@ +!!ver 300-450 +!!samps anim:2DArray=0 + +#include "sys/defs.h" + +//this shader is present for support for gles/gl3core contexts +//it is single-texture-with-vertex-colours, and doesn't do anything special. +//beware that a few things use this, including apparently fonts and bloom rescaling. +//its really not meant to do anything special. + +varying vec2 tc; +varying vec4 vc; + +#ifdef VERTEX_SHADER +void main () +{ + tc = v_texcoord; + vc = v_colour; + gl_Position = ftetransform(); +} +#endif +#ifdef FRAGMENT_SHADER +void main () +{ + //figure out which frame to use. + ivec3 sz = textureSize(s_anim, 0); + float layer = mod(e_time*10, sz.z-1); + + vec4 f = vc; +#ifdef PREMUL + f.rgb *= f.a; +#endif + f *= texture(s_anim, vec3(tc, layer)); + gl_FragColor = f; +} +#endif diff --git a/engine/vk/vk_backend.c b/engine/vk/vk_backend.c index 6c7ba3804..0432157cb 100644 --- a/engine/vk/vk_backend.c +++ b/engine/vk/vk_backend.c @@ -1674,11 +1674,8 @@ void VKBE_Shutdown(void) static texid_t SelectPassTexture(const shaderpass_t *pass) { - switch(pass->texgen) + safeswitch(pass->texgen) { -#ifndef _DEBUG - default: -#endif case T_GEN_DIFFUSE: return shaderstate.curtexnums->base; case T_GEN_NORMALMAP: @@ -1715,8 +1712,6 @@ static texid_t SelectPassTexture(const shaderpass_t *pass) case T_GEN_ANIMMAP: return pass->anim_frames[(int)(pass->anim_fps * shaderstate.curtime) % pass->anim_numframes]; - case T_GEN_3DMAP: - case T_GEN_CUBEMAP: case T_GEN_SINGLEMAP: return pass->anim_frames[0]; case T_GEN_DELUXMAP: @@ -1782,6 +1777,7 @@ static texid_t SelectPassTexture(const shaderpass_t *pass) case T_GEN_GBUFFER5: case T_GEN_GBUFFER6: case T_GEN_GBUFFER7: + safedefault: return r_nulltex; } return r_nulltex;