r_alias: add MF_HOLEY (0x4000) model flag, from QSS.

(MarkV compatible).
For more info see: http://celephais.net/board/view_thread.php?id=61351&start=1&end=1

git-svn-id: svn+ssh://svn.code.sf.net/p/quakespasm/code/trunk@1463 af15c1b1-3010-417e-b628-4374ebc0bcbd
This commit is contained in:
ewasylishen 2017-08-04 19:45:11 +00:00
parent 53186a2d12
commit 95bdd1fadf
3 changed files with 23 additions and 7 deletions

View file

@ -2292,6 +2292,7 @@ void *Mod_LoadAllSkins (int numskins, daliasskintype_t *pskintype)
daliasskininterval_t *pinskinintervals; daliasskininterval_t *pinskinintervals;
char fbr_mask_name[MAX_QPATH]; //johnfitz -- added for fullbright support char fbr_mask_name[MAX_QPATH]; //johnfitz -- added for fullbright support
src_offset_t offset; //johnfitz src_offset_t offset; //johnfitz
unsigned int texflags = TEXPREF_PAD;
skin = (byte *)(pskintype + 1); skin = (byte *)(pskintype + 1);
@ -2300,6 +2301,9 @@ void *Mod_LoadAllSkins (int numskins, daliasskintype_t *pskintype)
size = pheader->skinwidth * pheader->skinheight; size = pheader->skinwidth * pheader->skinheight;
if (loadmodel->flags & MF_HOLEY)
texflags |= TEXPREF_ALPHA;
for (i=0 ; i<numskins ; i++) for (i=0 ; i<numskins ; i++)
{ {
if (pskintype->type == ALIAS_SKIN_SINGLE) if (pskintype->type == ALIAS_SKIN_SINGLE)
@ -2317,15 +2321,15 @@ void *Mod_LoadAllSkins (int numskins, daliasskintype_t *pskintype)
if (Mod_CheckFullbrights ((byte *)(pskintype+1), size)) if (Mod_CheckFullbrights ((byte *)(pskintype+1), size))
{ {
pheader->gltextures[i][0] = TexMgr_LoadImage (loadmodel, name, pheader->skinwidth, pheader->skinheight, 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); 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, 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 else
{ {
pheader->gltextures[i][0] = TexMgr_LoadImage (loadmodel, name, pheader->skinwidth, pheader->skinheight, 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; pheader->fbtextures[i][0] = NULL;
} }
@ -2360,15 +2364,15 @@ void *Mod_LoadAllSkins (int numskins, daliasskintype_t *pskintype)
if (Mod_CheckFullbrights ((byte *)(pskintype), size)) if (Mod_CheckFullbrights ((byte *)(pskintype), size))
{ {
pheader->gltextures[i][j&3] = TexMgr_LoadImage (loadmodel, name, pheader->skinwidth, pheader->skinheight, 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); 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, 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 else
{ {
pheader->gltextures[i][j&3] = TexMgr_LoadImage (loadmodel, name, pheader->skinwidth, pheader->skinheight, 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; pheader->fbtextures[i][j&3] = NULL;
} }
//johnfitz //johnfitz
@ -2482,7 +2486,7 @@ void Mod_SetExtraFlags (qmodel_t *mod)
if (!mod || !mod->name || mod->type != mod_alias) if (!mod || !mod->name || mod->type != mod_alias)
return; return;
mod->flags &= 0xFF; //only preserve first byte mod->flags &= (0xFF | MF_HOLEY); //only preserve first byte, plus MF_HOLEY
// nolerp flag // nolerp flag
if (nameInList(r_nolerp_list.string, mod->name)) if (nameInList(r_nolerp_list.string, mod->name))

View file

@ -398,6 +398,7 @@ typedef enum {mod_brush, mod_sprite, mod_alias} modtype_t;
#define EF_ZOMGIB 32 // small blood trail #define EF_ZOMGIB 32 // small blood trail
#define EF_TRACER2 64 // orange split trail + rotate #define EF_TRACER2 64 // orange split trail + rotate
#define EF_TRACER3 128 // purple trail #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 //johnfitz -- extra flags for rendering
#define MOD_NOLERP 256 //don't lerp when animating #define MOD_NOLERP 256 //don't lerp when animating

View file

@ -78,6 +78,7 @@ static GLuint texLoc;
static GLuint fullbrightTexLoc; static GLuint fullbrightTexLoc;
static GLuint useFullbrightTexLoc; static GLuint useFullbrightTexLoc;
static GLuint useOverbrightLoc; static GLuint useOverbrightLoc;
static GLuint useAlphaTestLoc;
#define pose1VertexAttrIndex 0 #define pose1VertexAttrIndex 0
#define pose1NormalAttrIndex 1 #define pose1NormalAttrIndex 1
@ -170,9 +171,12 @@ void GLAlias_CreateShaders (void)
"uniform sampler2D FullbrightTex;\n" "uniform sampler2D FullbrightTex;\n"
"uniform bool UseFullbrightTex;\n" "uniform bool UseFullbrightTex;\n"
"uniform bool UseOverbright;\n" "uniform bool UseOverbright;\n"
"uniform bool UseAlphaTest;\n"
"void main()\n" "void main()\n"
"{\n" "{\n"
" vec4 result = texture2D(Tex, gl_TexCoord[0].xy);\n" " vec4 result = texture2D(Tex, gl_TexCoord[0].xy);\n"
" if (UseAlphaTest && (result.a < 0.666))\n"
" discard;\n"
" result *= gl_Color;\n" " result *= gl_Color;\n"
" if (UseOverbright)\n" " if (UseOverbright)\n"
" result.rgb *= 2.0;\n" " result.rgb *= 2.0;\n"
@ -202,6 +206,7 @@ void GLAlias_CreateShaders (void)
fullbrightTexLoc = GL_GetUniformLocation (&r_alias_program, "FullbrightTex"); fullbrightTexLoc = GL_GetUniformLocation (&r_alias_program, "FullbrightTex");
useFullbrightTexLoc = GL_GetUniformLocation (&r_alias_program, "UseFullbrightTex"); useFullbrightTexLoc = GL_GetUniformLocation (&r_alias_program, "UseFullbrightTex");
useOverbrightLoc = GL_GetUniformLocation (&r_alias_program, "UseOverbright"); 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 (fullbrightTexLoc, 1);
GL_Uniform1iFunc (useFullbrightTexLoc, (fb != NULL) ? 1 : 0); GL_Uniform1iFunc (useFullbrightTexLoc, (fb != NULL) ? 1 : 0);
GL_Uniform1fFunc (useOverbrightLoc, overbright ? 1 : 0); GL_Uniform1fFunc (useOverbrightLoc, overbright ? 1 : 0);
GL_Uniform1iFunc (useAlphaTestLoc, (currententity->model->flags & MF_HOLEY) ? 1 : 0);
// set textures // set textures
GL_SelectTexture (GL_TEXTURE0); GL_SelectTexture (GL_TEXTURE0);
@ -621,6 +627,7 @@ void R_DrawAliasModel (entity_t *e)
int i, anim; int i, anim;
gltexture_t *tx, *fb; gltexture_t *tx, *fb;
lerpdata_t lerpdata; 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 // 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); glDepthMask(GL_FALSE);
glEnable(GL_BLEND); glEnable(GL_BLEND);
} }
else if (alphatest)
glEnable (GL_ALPHA_TEST);
// //
// set up lighting // set up lighting
@ -880,6 +889,8 @@ cleanup:
glShadeModel (GL_FLAT); glShadeModel (GL_FLAT);
glDepthMask(GL_TRUE); glDepthMask(GL_TRUE);
glDisable(GL_BLEND); glDisable(GL_BLEND);
if (alphatest)
glDisable (GL_ALPHA_TEST);
glColor3f(1,1,1); glColor3f(1,1,1);
glPopMatrix (); glPopMatrix ();
} }