1
0
Fork 0
forked from fte/fteqw

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
This commit is contained in:
Spoike 2021-05-09 13:01:15 +00:00
parent ff4b88dd45
commit 2538e37e28
12 changed files with 113 additions and 107 deletions

View file

@ -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 = R_RegisterShader("tiprawimgcube", 0, "{\nprogram postproc_equirectangular\n{\nmap \"$cube:$reflectcube\"\n}\n}");
pic->defaulttextures->reflectcube = img; 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 else
{ {
pic = R2D_SafeCachePic("tiprawimg"); 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 = R_RegisterShader("tiprawimgcube", 0, "{\nprogram postproc_equirectangular\n{\nmap \"$cube:$reflectcube\"\n}\n}");
shader->defaulttextures->reflectcube = img; 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) else if ((img->flags&IF_TEXTYPEMASK) == IF_TEXTYPE_2D)
{ {
shader = R2D_SafeCachePic("tiprawimg"); shader = R2D_SafeCachePic("tiprawimg");

View file

@ -294,7 +294,7 @@ typedef struct texid_s texid_tf;
struct pendingtextureinfo struct pendingtextureinfo
{ {
enum enum imgtype_e
{ {
//formats are all w*h*d (where depth has limitations according to type) //formats are all w*h*d (where depth has limitations according to type)
PTI_2D, //w*h*1 - depth MUST be 1 PTI_2D, //w*h*1 - depth MUST be 1
@ -376,17 +376,17 @@ typedef struct
typedef struct texnums_s { typedef struct texnums_s {
char mapname[MAX_QPATH]; //the 'official' name of the diffusemap. used to generate filenames for other textures. 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 base; //2d, regular diffuse texture. may have alpha if surface is transparent.
texid_t bump; //normalmap. height values packed in alpha. texid_t bump; //2d, normalmap. height values packed in alpha.
texid_t specular; //specular lighting values. alpha contains exponent multiplier texid_t specular; //2d, 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 upperoverlay; //2d, 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 loweroverlay; //2d, 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 paletted; //2d, 8bit paletted data, just because. only red is used.
texid_t fullbright; //emissive texture. alpha should be 1. texid_t fullbright; //2d, emissive texture. alpha should be 1.
texid_t reflectcube; //for fake reflections texid_t reflectcube; //cube, for fake reflections
texid_t reflectmask; //defines how reflective it is (for cubemap reflections) texid_t reflectmask; //2d, defines how reflective it is (for cubemap reflections)
texid_t displacement; //alternative to bump.a, eg R16[F] for offsetmapping or tessellation texid_t displacement; //2d, alternative to bump.a, eg R16[F] for offsetmapping or tessellation
texid_t occlusion; //occlusion map... 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... //the material's pushconstants. vulkan guarentees only 128 bytes. so 8 vec4s. note that lmscales should want 4 of them...
/*struct /*struct

View file

@ -1065,8 +1065,6 @@ static void SelectPassTexture(unsigned int tu, const shaderpass_t *pass)
case T_GEN_ANIMMAP: case T_GEN_ANIMMAP:
BindTexture(tu, pass->anim_frames[(int)(pass->anim_fps * shaderstate.curtime) % pass->anim_numframes]); BindTexture(tu, pass->anim_frames[(int)(pass->anim_fps * shaderstate.curtime) % pass->anim_numframes]);
break; break;
case T_GEN_3DMAP:
case T_GEN_CUBEMAP:
case T_GEN_SINGLEMAP: case T_GEN_SINGLEMAP:
BindTexture(tu, pass->anim_frames[0]); BindTexture(tu, pass->anim_frames[0]);
break; break;

View file

@ -503,7 +503,7 @@ void GL_MTBind(int tmu, int target, texid_t texnum)
} }
#if 0//def GLSLONLY #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; int glnum = texnum?texnum->num:0;
if (shaderstate.currenttextures[tmu] != glnum) if (shaderstate.currenttextures[tmu] != glnum)
@ -513,9 +513,18 @@ void GL_LazyBind(int tmu, int target, texid_t texnum)
} }
} }
#else #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 #ifndef FORCESTATE
if (shaderstate.currenttextures[tmu] != glnum) if (shaderstate.currenttextures[tmu] != glnum)
#endif #endif
@ -1097,7 +1106,7 @@ qboolean GLBE_BeginShadowMap(int id, int w, int h, uploadfmt_t encoding, int *re
while(shaderstate.lastpasstmus>0) while(shaderstate.lastpasstmus>0)
{ {
GL_LazyBind(--shaderstate.lastpasstmus, 0, r_nulltex); GL_LazyBind(--shaderstate.lastpasstmus, r_nulltex);
} }
shaderstate.shaderbits &= ~SBITS_MISC_DEPTHWRITE; shaderstate.shaderbits &= ~SBITS_MISC_DEPTHWRITE;
@ -1246,8 +1255,7 @@ static void Shader_BindTextureForPass(int tmu, const shaderpass_t *pass)
t = shaderstate.curbatch->envmap; t = shaderstate.curbatch->envmap;
else else
t = shaderstate.tex_reflectcube; t = shaderstate.tex_reflectcube;
GL_LazyBind(tmu, GL_TEXTURE_CUBE_MAP_ARB, t); break;
return;
case T_GEN_REFLECTMASK: case T_GEN_REFLECTMASK:
if (shaderstate.curtexnums && TEXLOADED(shaderstate.curtexnums->reflectmask)) if (shaderstate.curtexnums && TEXLOADED(shaderstate.curtexnums->reflectmask))
t = shaderstate.curtexnums->reflectmask; t = shaderstate.curtexnums->reflectmask;
@ -1273,21 +1281,11 @@ static void Shader_BindTextureForPass(int tmu, const shaderpass_t *pass)
break; break;
case T_GEN_LIGHTCUBEMAP: case T_GEN_LIGHTCUBEMAP:
GL_LazyBind(tmu, GL_TEXTURE_CUBE_MAP_ARB, shaderstate.lightcubemap); t = shaderstate.lightcubemap;
return; break;
case T_GEN_CUBEMAP:
t = pass->anim_frames[0];
GL_LazyBind(tmu, GL_TEXTURE_CUBE_MAP_ARB, t);
return;
case T_GEN_SOURCECUBE: case T_GEN_SOURCECUBE:
t = scenepp_postproc_cube; t = scenepp_postproc_cube;
GL_LazyBind(tmu, GL_TEXTURE_CUBE_MAP_ARB, t); break;
return;
case T_GEN_3DMAP:
t = pass->anim_frames[0];
GL_LazyBind(tmu, GL_TEXTURE_3D, t);
return;
#ifdef HAVE_MEDIA_DECODER #ifdef HAVE_MEDIA_DECODER
case T_GEN_VIDEOMAP: 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]; t = shaderstate.tex_gbuf[pass->texgen-T_GEN_GBUFFER0];
break; break;
} }
GL_LazyBind(tmu, GL_TEXTURE_2D, t); GL_LazyBind(tmu, t);
} }
/*========================================== matrix functions =====================================*/ /*========================================== matrix functions =====================================*/
@ -1534,7 +1532,7 @@ void GLBE_Shutdown(void)
GL_SelectEBO(0); GL_SelectEBO(0);
for (u = 0; u < countof(shaderstate.currenttextures); u++) for (u = 0; u < countof(shaderstate.currenttextures); u++)
GL_LazyBind(u, 0, r_nulltex); GL_LazyBind(u, r_nulltex);
GL_SelectTexture(0); GL_SelectTexture(0);
} }
@ -3326,7 +3324,7 @@ static void DrawPass(const shaderpass_t *pass)
/*make sure no textures linger*/ /*make sure no textures linger*/
for (k = tmu; k < shaderstate.lastpasstmus; k++) for (k = tmu; k < shaderstate.lastpasstmus; k++)
{ {
GL_LazyBind(k, 0, r_nulltex); GL_LazyBind(k, r_nulltex);
} }
shaderstate.lastpasstmus = tmu; shaderstate.lastpasstmus = tmu;
@ -3336,7 +3334,7 @@ static void DrawPass(const shaderpass_t *pass)
tmu = 0; tmu = 0;
/*bind the light texture*/ /*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*/ /*set up the colourmod for this style's lighting*/
shaderstate.pendingcolourvbo = 0; shaderstate.pendingcolourvbo = 0;
@ -3366,7 +3364,7 @@ static void DrawPass(const shaderpass_t *pass)
{ {
for (k = tmu; k < shaderstate.lastpasstmus; k++) for (k = tmu; k < shaderstate.lastpasstmus; k++)
{ {
GL_LazyBind(k, 0, r_nulltex); GL_LazyBind(k, r_nulltex);
} }
shaderstate.lastpasstmus = tmu; shaderstate.lastpasstmus = tmu;
BE_EnableShaderAttributes(attr, 0); BE_EnableShaderAttributes(attr, 0);
@ -3386,7 +3384,7 @@ static void DrawPass(const shaderpass_t *pass)
for (i = tmu; i < shaderstate.lastpasstmus; i++) for (i = tmu; i < shaderstate.lastpasstmus; i++)
{ {
GL_LazyBind(i, 0, r_nulltex); GL_LazyBind(i, r_nulltex);
} }
shaderstate.lastpasstmus = tmu; shaderstate.lastpasstmus = tmu;
BE_EnableShaderAttributes(attr, 0); BE_EnableShaderAttributes(attr, 0);
@ -3948,16 +3946,16 @@ static void BE_RenderMeshProgram(const shader_t *shader, const shaderpass_t *pas
#if MAXRLIGHTMAPS > 1 #if MAXRLIGHTMAPS > 1
if (perm & PERMUTATION_LIGHTSTYLES) 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++, 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++, 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++, 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++, (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++, (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[3]>=0&&lightmap[shaderstate.curbatch->lightmap[3]]->hasdeluxe)?lightmap[shaderstate.curbatch->lightmap[3]+1]->lightmap_texture:missing_texture_normal);
} }
#endif #endif
while (shaderstate.lastpasstmus > i) while (shaderstate.lastpasstmus > i)
GL_LazyBind(--shaderstate.lastpasstmus, 0, r_nulltex); GL_LazyBind(--shaderstate.lastpasstmus, r_nulltex);
shaderstate.lastpasstmus = i; shaderstate.lastpasstmus = i;
BE_EnableShaderAttributes(permu->attrmask, shaderstate.sourcevbo->vao); 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!*/ /*BEM_DEPTHONLY does support mesh writing, but its not the only way its used... FIXME!*/
while(shaderstate.lastpasstmus>0) 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) //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 //disable all tmus
while(shaderstate.lastpasstmus>0) while(shaderstate.lastpasstmus>0)
{ {
GL_LazyBind(--shaderstate.lastpasstmus, 0, r_nulltex); GL_LazyBind(--shaderstate.lastpasstmus, r_nulltex);
} }
#ifndef GLSLONLY #ifndef GLSLONLY
if (!gl_config_nofixedfunc) if (!gl_config_nofixedfunc)
@ -4123,9 +4121,9 @@ void GLBE_SelectMode(backendmode_t mode)
case BEM_FOG: case BEM_FOG:
while(shaderstate.lastpasstmus>0) 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; shaderstate.lastpasstmus = 1;
Vector4Set(shaderstate.pendingcolourflat, 1, 1, 1, 1); Vector4Set(shaderstate.pendingcolourflat, 1, 1, 1, 1);
@ -4379,7 +4377,7 @@ static void BE_LegacyLighting(void)
shaderstate.normalisationcubemap = GenerateNormalisationCubeMap(); shaderstate.normalisationcubemap = GenerateNormalisationCubeMap();
//tmu0: normalmap+replace+regular tex coords //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); BE_SetPassBlendMode(tmu, PBM_REPLACE);
shaderstate.pendingtexcoordparts[tmu] = 2; shaderstate.pendingtexcoordparts[tmu] = 2;
shaderstate.pendingtexcoordvbo[tmu] = shaderstate.sourcevbo->texcoord.gl.vbo; shaderstate.pendingtexcoordvbo[tmu] = shaderstate.sourcevbo->texcoord.gl.vbo;
@ -4388,7 +4386,7 @@ static void BE_LegacyLighting(void)
tmu++; tmu++;
//tmu1: normalizationcubemap+dot3+lightdir //tmu1: normalizationcubemap+dot3+lightdir
GL_LazyBind(tmu, GL_TEXTURE_CUBE_MAP_ARB, shaderstate.normalisationcubemap); GL_LazyBind(tmu, shaderstate.normalisationcubemap);
BE_SetPassBlendMode(tmu, PBM_DOTPRODUCT); BE_SetPassBlendMode(tmu, PBM_DOTPRODUCT);
shaderstate.pendingtexcoordparts[tmu] = 3; shaderstate.pendingtexcoordparts[tmu] = 3;
shaderstate.pendingtexcoordvbo[tmu] = 0; shaderstate.pendingtexcoordvbo[tmu] = 0;
@ -4397,7 +4395,7 @@ static void BE_LegacyLighting(void)
tmu++; tmu++;
//tmu2: $diffuse+multiply+regular tex coords //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); BE_SetPassBlendMode(tmu, PBM_MODULATE);
shaderstate.pendingtexcoordparts[tmu] = 2; shaderstate.pendingtexcoordparts[tmu] = 2;
shaderstate.pendingtexcoordvbo[tmu] = shaderstate.sourcevbo->texcoord.gl.vbo; shaderstate.pendingtexcoordvbo[tmu] = shaderstate.sourcevbo->texcoord.gl.vbo;
@ -4406,7 +4404,7 @@ static void BE_LegacyLighting(void)
tmu++; tmu++;
//tmu3: $any+multiply-by-colour+notc //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); BE_SetPassBlendMode(tmu, PBM_MODULATE_PREV_COLOUR);
shaderstate.pendingtexcoordparts[tmu] = 0; shaderstate.pendingtexcoordparts[tmu] = 0;
shaderstate.pendingtexcoordvbo[tmu] = 0; shaderstate.pendingtexcoordvbo[tmu] = 0;
@ -4417,7 +4415,7 @@ static void BE_LegacyLighting(void)
for (i = tmu; i < shaderstate.lastpasstmus; i++) for (i = tmu; i < shaderstate.lastpasstmus; i++)
{ {
GL_LazyBind(i, 0, r_nulltex); GL_LazyBind(i, r_nulltex);
} }
shaderstate.lastpasstmus = tmu; shaderstate.lastpasstmus = tmu;
} }
@ -4427,14 +4425,14 @@ static void BE_LegacyLighting(void)
//tmu0: $diffuse+multiply+regular tex coords //tmu0: $diffuse+multiply+regular tex coords
//multiplies by vertex colours //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); BE_SetPassBlendMode(0, PBM_MODULATE);
shaderstate.pendingtexcoordvbo[0] = shaderstate.sourcevbo->texcoord.gl.vbo; shaderstate.pendingtexcoordvbo[0] = shaderstate.sourcevbo->texcoord.gl.vbo;
shaderstate.pendingtexcoordpointer[0] = shaderstate.sourcevbo->texcoord.gl.addr; shaderstate.pendingtexcoordpointer[0] = shaderstate.sourcevbo->texcoord.gl.addr;
for (i = 1; i < shaderstate.lastpasstmus; i++) for (i = 1; i < shaderstate.lastpasstmus; i++)
{ {
GL_LazyBind(i, 0, r_nulltex); GL_LazyBind(i, r_nulltex);
} }
shaderstate.lastpasstmus = 1; shaderstate.lastpasstmus = 1;
} }
@ -4646,7 +4644,7 @@ static void DrawMeshes(void)
Vector4Set(shaderstate.pendingcolourflat, 1, 1, 1, 1); Vector4Set(shaderstate.pendingcolourflat, 1, 1, 1, 1);
while(shaderstate.lastpasstmus>0) 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)); 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); Vector4Set(shaderstate.pendingcolourflat, 0, 0, 0, 1);
while(shaderstate.lastpasstmus>0) while(shaderstate.lastpasstmus>0)
{ {
GL_LazyBind(--shaderstate.lastpasstmus, 0, r_nulltex); GL_LazyBind(--shaderstate.lastpasstmus, r_nulltex);
} }
BE_SetPassBlendMode(0, PBM_REPLACE); BE_SetPassBlendMode(0, PBM_REPLACE);
@ -4843,9 +4841,9 @@ static void DrawMeshes(void)
while(shaderstate.lastpasstmus>1) 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; shaderstate.lastpasstmus = 1;
Vector4Scale(shaderstate.curbatch->fog->shader->fog_color, (1/255.0), shaderstate.pendingcolourflat); 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) while(shaderstate.lastpasstmus>0)
{ {
GL_LazyBind(--shaderstate.lastpasstmus, 0, r_nulltex); GL_LazyBind(--shaderstate.lastpasstmus, r_nulltex);
} }
#ifdef RTLIGHTS #ifdef RTLIGHTS
Sh_Reset(); Sh_Reset();

View file

@ -630,7 +630,7 @@ void Mod_Init (qboolean initial)
Cmd_AddCommand("version_modelformats", Mod_PrintFormats_f); Cmd_AddCommand("version_modelformats", Mod_PrintFormats_f);
#ifndef SERVERONLY #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_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_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."); Cmd_AddCommandD("mod_bspx_strip", Mod_BSPX_Strip_f, "Strips a named extension lump from a bsp file.");

View file

@ -3081,22 +3081,7 @@ static void Shaderpass_Map (parsestate_t *ps, const char **ptr)
flags = Shader_SetImageFlags (ps, pass, &token, 0); flags = Shader_SetImageFlags (ps, pass, &token, 0);
if (!Shaderpass_MapGen(ps, pass, token)) if (!Shaderpass_MapGen(ps, pass, token))
{ {
switch((flags & IF_TEXTYPEMASK) >> IF_TEXTYPESHIFT)
{
case PTI_2D:
pass->texgen = T_GEN_SINGLEMAP; 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;
}
if (pass->tcgen == TC_GEN_UNSPECIFIED) if (pass->tcgen == TC_GEN_UNSPECIFIED)
pass->tcgen = TC_GEN_BASE; pass->tcgen = TC_GEN_BASE;
if (!*shader->defaulttextures->mapname && *token != '$' && 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) if (pass->tcgen == TC_GEN_UNSPECIFIED)
pass->tcgen = TC_GEN_BASE; pass->tcgen = TC_GEN_BASE;
pass->anim_frames[0] = Shader_FindImage (ps, token, flags); pass->anim_frames[0] = Shader_FindImage (ps, token, flags);
switch((flags & IF_TEXTYPEMASK) >> IF_TEXTYPESHIFT)
{
default:
case PTI_2D:
pass->texgen = T_GEN_SINGLEMAP; pass->texgen = T_GEN_SINGLEMAP;
break;
case PTI_3D:
pass->texgen = T_GEN_3DMAP;
break;
case PTI_CUBE:
pass->texgen = T_GEN_CUBEMAP;
break;
}
if (!TEXVALID(pass->anim_frames[0])) 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) if (pass->tcgen == TC_GEN_UNSPECIFIED)
pass->tcgen = TC_GEN_SKYBOX; pass->tcgen = TC_GEN_SKYBOX;
pass->texgen = T_GEN_CUBEMAP;
pass->anim_frames[0] = Shader_FindImage(ps, token, IF_TEXTYPE_CUBE); pass->anim_frames[0] = Shader_FindImage(ps, token, IF_TEXTYPE_CUBE);
pass->texgen = T_GEN_SINGLEMAP;
if (!TEXVALID(pass->anim_frames[0])) 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 #ifdef HAVE_MEDIA_DECODER
case T_GEN_VIDEOMAP: Shader_DecomposeSubPassMap(o, s, "videomap", Media_UpdateForShader(p->cin)); break; case T_GEN_VIDEOMAP: Shader_DecomposeSubPassMap(o, s, "videomap", Media_UpdateForShader(p->cin)); break;
#endif #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_LIGHTMAP: sprintf(o, "map $lightmap "); break;
case T_GEN_DELUXMAP: sprintf(o, "map $deluxemap "); break; case T_GEN_DELUXMAP: sprintf(o, "map $deluxemap "); break;
case T_GEN_SHADOWMAP: sprintf(o, "map $shadowmap "); break; case T_GEN_SHADOWMAP: sprintf(o, "map $shadowmap "); break;

View file

@ -323,7 +323,6 @@ void Sh_PurgeShadowMeshes(void);
#ifdef GLQUAKE #ifdef GLQUAKE
void R_TranslatePlayerSkin (int playernum); 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_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_CullFace(unsigned int sflags);
void GL_TexEnv(GLenum mode); void GL_TexEnv(GLenum mode);

View file

@ -289,8 +289,6 @@ typedef struct shaderpass_s {
#ifdef HAVE_MEDIA_DECODER #ifdef HAVE_MEDIA_DECODER
T_GEN_VIDEOMAP, //use the media playback as an image source, updating each frame for which it is visible T_GEN_VIDEOMAP, //use the media playback as an image source, updating each frame for which it is visible
#endif #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 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 #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

View file

@ -17,6 +17,7 @@ char shaders[][64] =
"crepuscular_sky", "crepuscular_sky",
"depthonly", "depthonly",
"default2d", "default2d",
"default2danim",
"defaultadditivesprite", "defaultadditivesprite",
"defaultskin", "defaultskin",
"defaultsky", "defaultsky",

View file

@ -1,5 +1,5 @@
!!ver 100-450 !!ver 100-450
!!samps 1 !!samps img=0
//this shader is present for support for gles/gl3core contexts //this shader is present for support for gles/gl3core contexts
//it is single-texture-with-vertex-colours, and doesn't do anything special. //it is single-texture-with-vertex-colours, and doesn't do anything special.
@ -26,7 +26,7 @@ void main ()
#ifdef PREMUL #ifdef PREMUL
f.rgb *= f.a; f.rgb *= f.a;
#endif #endif
f *= texture2D(s_t0, tc); f *= texture2D(s_img, tc);
gl_FragColor = f; gl_FragColor = f;
} }
#endif #endif

View file

@ -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

View file

@ -1674,11 +1674,8 @@ void VKBE_Shutdown(void)
static texid_t SelectPassTexture(const shaderpass_t *pass) static texid_t SelectPassTexture(const shaderpass_t *pass)
{ {
switch(pass->texgen) safeswitch(pass->texgen)
{ {
#ifndef _DEBUG
default:
#endif
case T_GEN_DIFFUSE: case T_GEN_DIFFUSE:
return shaderstate.curtexnums->base; return shaderstate.curtexnums->base;
case T_GEN_NORMALMAP: case T_GEN_NORMALMAP:
@ -1715,8 +1712,6 @@ static texid_t SelectPassTexture(const shaderpass_t *pass)
case T_GEN_ANIMMAP: case T_GEN_ANIMMAP:
return pass->anim_frames[(int)(pass->anim_fps * shaderstate.curtime) % pass->anim_numframes]; 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: case T_GEN_SINGLEMAP:
return pass->anim_frames[0]; return pass->anim_frames[0];
case T_GEN_DELUXMAP: case T_GEN_DELUXMAP:
@ -1782,6 +1777,7 @@ static texid_t SelectPassTexture(const shaderpass_t *pass)
case T_GEN_GBUFFER5: case T_GEN_GBUFFER5:
case T_GEN_GBUFFER6: case T_GEN_GBUFFER6:
case T_GEN_GBUFFER7: case T_GEN_GBUFFER7:
safedefault:
return r_nulltex; return r_nulltex;
} }
return r_nulltex; return r_nulltex;