mirror of
https://github.com/Shpoike/Quakespasm.git
synced 2025-02-24 13:01:46 +00:00
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:
parent
53186a2d12
commit
95bdd1fadf
3 changed files with 23 additions and 7 deletions
|
@ -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))
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 ();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue