diff --git a/quakespasm/Quake/gl_model.c b/quakespasm/Quake/gl_model.c index 1f3eb059..e2144f97 100644 --- a/quakespasm/Quake/gl_model.c +++ b/quakespasm/Quake/gl_model.c @@ -2292,6 +2292,7 @@ void *Mod_LoadAllSkins (int numskins, daliasskintype_t *pskintype) daliasskininterval_t *pinskinintervals; char fbr_mask_name[MAX_QPATH]; //johnfitz -- added for fullbright support src_offset_t offset; //johnfitz + unsigned int texflags = TEXPREF_PAD; skin = (byte *)(pskintype + 1); @@ -2300,6 +2301,9 @@ void *Mod_LoadAllSkins (int numskins, daliasskintype_t *pskintype) size = pheader->skinwidth * pheader->skinheight; + if (loadmodel->flags & MF_HOLEY) + texflags |= TEXPREF_ALPHA; + for (i=0 ; itype == ALIAS_SKIN_SINGLE) @@ -2317,15 +2321,15 @@ void *Mod_LoadAllSkins (int numskins, daliasskintype_t *pskintype) if (Mod_CheckFullbrights ((byte *)(pskintype+1), size)) { pheader->gltextures[i][0] = TexMgr_LoadImage (loadmodel, name, pheader->skinwidth, pheader->skinheight, - SRC_INDEXED, (byte *)(pskintype+1), loadmodel->name, offset, TEXPREF_PAD | TEXPREF_NOBRIGHT); + SRC_INDEXED, (byte *)(pskintype+1), loadmodel->name, offset, texflags | TEXPREF_NOBRIGHT); q_snprintf (fbr_mask_name, sizeof(fbr_mask_name), "%s:frame%i_glow", loadmodel->name, i); pheader->fbtextures[i][0] = TexMgr_LoadImage (loadmodel, fbr_mask_name, pheader->skinwidth, pheader->skinheight, - SRC_INDEXED, (byte *)(pskintype+1), loadmodel->name, offset, TEXPREF_PAD | TEXPREF_FULLBRIGHT); + SRC_INDEXED, (byte *)(pskintype+1), loadmodel->name, offset, texflags | TEXPREF_FULLBRIGHT); } else { pheader->gltextures[i][0] = TexMgr_LoadImage (loadmodel, name, pheader->skinwidth, pheader->skinheight, - SRC_INDEXED, (byte *)(pskintype+1), loadmodel->name, offset, TEXPREF_PAD); + SRC_INDEXED, (byte *)(pskintype+1), loadmodel->name, offset, texflags); pheader->fbtextures[i][0] = NULL; } @@ -2360,15 +2364,15 @@ void *Mod_LoadAllSkins (int numskins, daliasskintype_t *pskintype) if (Mod_CheckFullbrights ((byte *)(pskintype), size)) { pheader->gltextures[i][j&3] = TexMgr_LoadImage (loadmodel, name, pheader->skinwidth, pheader->skinheight, - SRC_INDEXED, (byte *)(pskintype), loadmodel->name, offset, TEXPREF_PAD | TEXPREF_NOBRIGHT); + SRC_INDEXED, (byte *)(pskintype), loadmodel->name, offset, texflags | TEXPREF_NOBRIGHT); q_snprintf (fbr_mask_name, sizeof(fbr_mask_name), "%s:frame%i_%i_glow", loadmodel->name, i,j); pheader->fbtextures[i][j&3] = TexMgr_LoadImage (loadmodel, fbr_mask_name, pheader->skinwidth, pheader->skinheight, - SRC_INDEXED, (byte *)(pskintype), loadmodel->name, offset, TEXPREF_PAD | TEXPREF_FULLBRIGHT); + SRC_INDEXED, (byte *)(pskintype), loadmodel->name, offset, texflags | TEXPREF_FULLBRIGHT); } else { pheader->gltextures[i][j&3] = TexMgr_LoadImage (loadmodel, name, pheader->skinwidth, pheader->skinheight, - SRC_INDEXED, (byte *)(pskintype), loadmodel->name, offset, TEXPREF_PAD); + SRC_INDEXED, (byte *)(pskintype), loadmodel->name, offset, texflags); pheader->fbtextures[i][j&3] = NULL; } //johnfitz @@ -2482,7 +2486,7 @@ void Mod_SetExtraFlags (qmodel_t *mod) if (!mod || !mod->name || mod->type != mod_alias) return; - mod->flags &= 0xFF; //only preserve first byte + mod->flags &= (0xFF | MF_HOLEY); //only preserve first byte, plus MF_HOLEY // nolerp flag if (nameInList(r_nolerp_list.string, mod->name)) diff --git a/quakespasm/Quake/gl_model.h b/quakespasm/Quake/gl_model.h index fba67cf9..2a224b04 100644 --- a/quakespasm/Quake/gl_model.h +++ b/quakespasm/Quake/gl_model.h @@ -398,6 +398,7 @@ typedef enum {mod_brush, mod_sprite, mod_alias} modtype_t; #define EF_ZOMGIB 32 // small blood trail #define EF_TRACER2 64 // orange split trail + rotate #define EF_TRACER3 128 // purple trail +#define MF_HOLEY (1u<<14) // MarkV/QSS -- make index 255 transparent on mdl's //johnfitz -- extra flags for rendering #define MOD_NOLERP 256 //don't lerp when animating diff --git a/quakespasm/Quake/r_alias.c b/quakespasm/Quake/r_alias.c index 9580b864..fbad0812 100644 --- a/quakespasm/Quake/r_alias.c +++ b/quakespasm/Quake/r_alias.c @@ -78,6 +78,7 @@ static GLuint texLoc; static GLuint fullbrightTexLoc; static GLuint useFullbrightTexLoc; static GLuint useOverbrightLoc; +static GLuint useAlphaTestLoc; #define pose1VertexAttrIndex 0 #define pose1NormalAttrIndex 1 @@ -170,9 +171,12 @@ void GLAlias_CreateShaders (void) "uniform sampler2D FullbrightTex;\n" "uniform bool UseFullbrightTex;\n" "uniform bool UseOverbright;\n" + "uniform bool UseAlphaTest;\n" "void main()\n" "{\n" " vec4 result = texture2D(Tex, gl_TexCoord[0].xy);\n" + " if (UseAlphaTest && (result.a < 0.666))\n" + " discard;\n" " result *= gl_Color;\n" " if (UseOverbright)\n" " result.rgb *= 2.0;\n" @@ -202,6 +206,7 @@ void GLAlias_CreateShaders (void) fullbrightTexLoc = GL_GetUniformLocation (&r_alias_program, "FullbrightTex"); useFullbrightTexLoc = GL_GetUniformLocation (&r_alias_program, "UseFullbrightTex"); useOverbrightLoc = GL_GetUniformLocation (&r_alias_program, "UseOverbright"); + useAlphaTestLoc = GL_GetUniformLocation (&r_alias_program, "UseAlphaTest"); } } @@ -258,6 +263,7 @@ void GL_DrawAliasFrame_GLSL (aliashdr_t *paliashdr, lerpdata_t lerpdata, gltextu GL_Uniform1iFunc (fullbrightTexLoc, 1); GL_Uniform1iFunc (useFullbrightTexLoc, (fb != NULL) ? 1 : 0); GL_Uniform1fFunc (useOverbrightLoc, overbright ? 1 : 0); + GL_Uniform1iFunc (useAlphaTestLoc, (currententity->model->flags & MF_HOLEY) ? 1 : 0); // set textures GL_SelectTexture (GL_TEXTURE0); @@ -621,6 +627,7 @@ void R_DrawAliasModel (entity_t *e) int i, anim; gltexture_t *tx, *fb; lerpdata_t lerpdata; + qboolean alphatest = !!(e->model->flags & MF_HOLEY); // // setup pose/lerp data -- do it first so we don't miss updates due to culling @@ -668,6 +675,8 @@ void R_DrawAliasModel (entity_t *e) glDepthMask(GL_FALSE); glEnable(GL_BLEND); } + else if (alphatest) + glEnable (GL_ALPHA_TEST); // // set up lighting @@ -880,6 +889,8 @@ cleanup: glShadeModel (GL_FLAT); glDepthMask(GL_TRUE); glDisable(GL_BLEND); + if (alphatest) + glDisable (GL_ALPHA_TEST); glColor3f(1,1,1); glPopMatrix (); }