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;
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 ; i<numskins ; i++)
{
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))
{
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))

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

View file

@ -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 ();
}