Implement linedef alpha field (replaces specials 900-908)
This commit is contained in:
parent
3775e6447e
commit
cedfc02f19
|
@ -1818,37 +1818,10 @@ static void HWR_StoreWallRange(double startfrac, double endfrac)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// set alpha for transparent walls (new boom and legacy linedef types)
|
// set alpha for transparent walls
|
||||||
// ooops ! this do not work at all because render order we should render it in backtofront order
|
// ooops ! this do not work at all because render order we should render it in backtofront order
|
||||||
switch (gr_linedef->special)
|
switch (gr_linedef->special)
|
||||||
{
|
{
|
||||||
case 900:
|
|
||||||
blendmode = HWR_TranstableToAlpha(tr_trans10, &Surf);
|
|
||||||
break;
|
|
||||||
case 901:
|
|
||||||
blendmode = HWR_TranstableToAlpha(tr_trans20, &Surf);
|
|
||||||
break;
|
|
||||||
case 902:
|
|
||||||
blendmode = HWR_TranstableToAlpha(tr_trans30, &Surf);
|
|
||||||
break;
|
|
||||||
case 903:
|
|
||||||
blendmode = HWR_TranstableToAlpha(tr_trans40, &Surf);
|
|
||||||
break;
|
|
||||||
case 904:
|
|
||||||
blendmode = HWR_TranstableToAlpha(tr_trans50, &Surf);
|
|
||||||
break;
|
|
||||||
case 905:
|
|
||||||
blendmode = HWR_TranstableToAlpha(tr_trans60, &Surf);
|
|
||||||
break;
|
|
||||||
case 906:
|
|
||||||
blendmode = HWR_TranstableToAlpha(tr_trans70, &Surf);
|
|
||||||
break;
|
|
||||||
case 907:
|
|
||||||
blendmode = HWR_TranstableToAlpha(tr_trans80, &Surf);
|
|
||||||
break;
|
|
||||||
case 908:
|
|
||||||
blendmode = HWR_TranstableToAlpha(tr_trans90, &Surf);
|
|
||||||
break;
|
|
||||||
// Translucent
|
// Translucent
|
||||||
case 102:
|
case 102:
|
||||||
case 121:
|
case 121:
|
||||||
|
@ -1869,6 +1842,9 @@ static void HWR_StoreWallRange(double startfrac, double endfrac)
|
||||||
blendmode = PF_Translucent;
|
blendmode = PF_Translucent;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
if (gr_linedef->alpha > 0 && gr_linedef->alpha < FRACUNIT)
|
||||||
|
blendmode = HWR_TranstableToAlpha(R_GetLinedefTransTable(gr_linedef->alpha), &Surf);
|
||||||
|
else
|
||||||
blendmode = PF_Masked;
|
blendmode = PF_Masked;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -99,6 +99,7 @@ enum line_e {
|
||||||
line_sidenum,
|
line_sidenum,
|
||||||
line_frontside,
|
line_frontside,
|
||||||
line_backside,
|
line_backside,
|
||||||
|
line_alpha,
|
||||||
line_slopetype,
|
line_slopetype,
|
||||||
line_frontsector,
|
line_frontsector,
|
||||||
line_backsector,
|
line_backsector,
|
||||||
|
@ -122,6 +123,7 @@ static const char *const line_opt[] = {
|
||||||
"sidenum",
|
"sidenum",
|
||||||
"frontside",
|
"frontside",
|
||||||
"backside",
|
"backside",
|
||||||
|
"alpha",
|
||||||
"slopetype",
|
"slopetype",
|
||||||
"frontsector",
|
"frontsector",
|
||||||
"backsector",
|
"backsector",
|
||||||
|
@ -806,6 +808,9 @@ static int line_get(lua_State *L)
|
||||||
return 0;
|
return 0;
|
||||||
LUA_PushUserdata(L, &sides[line->sidenum[1]], META_SIDE);
|
LUA_PushUserdata(L, &sides[line->sidenum[1]], META_SIDE);
|
||||||
return 1;
|
return 1;
|
||||||
|
case line_alpha:
|
||||||
|
lua_pushfixed(L, line->alpha);
|
||||||
|
return 1;
|
||||||
case line_slopetype:
|
case line_slopetype:
|
||||||
switch(line->slopetype)
|
switch(line->slopetype)
|
||||||
{
|
{
|
||||||
|
|
|
@ -960,6 +960,8 @@ static void P_InitializeLinedef(line_t *ld)
|
||||||
ld->dx = v2->x - v1->x;
|
ld->dx = v2->x - v1->x;
|
||||||
ld->dy = v2->y - v1->y;
|
ld->dy = v2->y - v1->y;
|
||||||
|
|
||||||
|
ld->alpha = FRACUNIT;
|
||||||
|
|
||||||
ld->bbox[BOXLEFT] = min(v1->x, v2->x);
|
ld->bbox[BOXLEFT] = min(v1->x, v2->x);
|
||||||
ld->bbox[BOXRIGHT] = max(v1->x, v2->x);
|
ld->bbox[BOXRIGHT] = max(v1->x, v2->x);
|
||||||
ld->bbox[BOXBOTTOM] = min(v1->y, v2->y);
|
ld->bbox[BOXBOTTOM] = min(v1->y, v2->y);
|
||||||
|
@ -1461,6 +1463,8 @@ static void ParseTextmapLinedefParameter(UINT32 i, char *param, char *val)
|
||||||
lines[i].sidenum[0] = atol(val);
|
lines[i].sidenum[0] = atol(val);
|
||||||
else if (fastcmp(param, "sideback"))
|
else if (fastcmp(param, "sideback"))
|
||||||
lines[i].sidenum[1] = atol(val);
|
lines[i].sidenum[1] = atol(val);
|
||||||
|
else if (fastcmp(param, "alpha"))
|
||||||
|
lines[i].alpha = FLOAT_TO_FIXED(atof(val));
|
||||||
|
|
||||||
// Flags
|
// Flags
|
||||||
else if (fastcmp(param, "blocking") && fastcmp("true", val))
|
else if (fastcmp(param, "blocking") && fastcmp("true", val))
|
||||||
|
@ -2766,6 +2770,17 @@ static void P_ConvertBinaryMap(void)
|
||||||
lines[i].args[1] = lines[i].tag;
|
lines[i].args[1] = lines[i].tag;
|
||||||
lines[i].special = 720;
|
lines[i].special = 720;
|
||||||
break;
|
break;
|
||||||
|
case 900: //Translucent wall (10%)
|
||||||
|
case 901: //Translucent wall (20%)
|
||||||
|
case 902: //Translucent wall (30%)
|
||||||
|
case 903: //Translucent wall (40%)
|
||||||
|
case 904: //Translucent wall (50%)
|
||||||
|
case 905: //Translucent wall (60%)
|
||||||
|
case 906: //Translucent wall (70%)
|
||||||
|
case 907: //Translucent wall (80%)
|
||||||
|
case 908: //Translucent wall (90%)
|
||||||
|
lines[i].alpha = ((909 - lines[i].special) << FRACBITS)/10;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -423,6 +423,7 @@ typedef struct line_s
|
||||||
|
|
||||||
// Visual appearance: sidedefs.
|
// Visual appearance: sidedefs.
|
||||||
UINT16 sidenum[2]; // sidenum[1] will be 0xffff if one-sided
|
UINT16 sidenum[2]; // sidenum[1] will be 0xffff if one-sided
|
||||||
|
fixed_t alpha; // translucency
|
||||||
|
|
||||||
fixed_t bbox[4]; // bounding box for the extent of the linedef
|
fixed_t bbox[4]; // bounding box for the extent of the linedef
|
||||||
|
|
||||||
|
|
48
src/r_segs.c
48
src/r_segs.c
|
@ -286,6 +286,28 @@ static void R_DrawFlippedMaskedSegColumn(column_t *column)
|
||||||
R_DrawFlippedMaskedColumn(column, column2s_length);
|
R_DrawFlippedMaskedColumn(column, column2s_length);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
transnum_t R_GetLinedefTransTable(fixed_t alpha)
|
||||||
|
{
|
||||||
|
if (alpha < 9830)
|
||||||
|
return tr_trans90;
|
||||||
|
else if (alpha < 16384)
|
||||||
|
return tr_trans80;
|
||||||
|
else if (alpha < 22937)
|
||||||
|
return tr_trans70;
|
||||||
|
else if (alpha < 29491)
|
||||||
|
return tr_trans60;
|
||||||
|
else if (alpha < 36044)
|
||||||
|
return tr_trans50;
|
||||||
|
else if (alpha < 42598)
|
||||||
|
return tr_trans40;
|
||||||
|
else if (alpha < 49152)
|
||||||
|
return tr_trans30;
|
||||||
|
else if (alpha < 55705)
|
||||||
|
return tr_trans20;
|
||||||
|
else
|
||||||
|
return tr_trans10;
|
||||||
|
}
|
||||||
|
|
||||||
void R_RenderMaskedSegRange(drawseg_t *ds, INT32 x1, INT32 x2)
|
void R_RenderMaskedSegRange(drawseg_t *ds, INT32 x1, INT32 x2)
|
||||||
{
|
{
|
||||||
size_t pindex;
|
size_t pindex;
|
||||||
|
@ -314,31 +336,21 @@ void R_RenderMaskedSegRange(drawseg_t *ds, INT32 x1, INT32 x2)
|
||||||
texnum = R_GetTextureNum(curline->sidedef->midtexture);
|
texnum = R_GetTextureNum(curline->sidedef->midtexture);
|
||||||
windowbottom = windowtop = sprbotscreen = INT32_MAX;
|
windowbottom = windowtop = sprbotscreen = INT32_MAX;
|
||||||
|
|
||||||
// hack translucent linedef types (900-909 for transtables 1-9)
|
|
||||||
ldef = curline->linedef;
|
ldef = curline->linedef;
|
||||||
switch (ldef->special)
|
if (ldef->alpha > 0 && ldef->alpha < FRACUNIT)
|
||||||
{
|
{
|
||||||
case 900:
|
dc_transmap = transtables + ((R_GetLinedefTransTable(ldef->alpha) - 1) << FF_TRANSSHIFT);
|
||||||
case 901:
|
|
||||||
case 902:
|
|
||||||
case 903:
|
|
||||||
case 904:
|
|
||||||
case 905:
|
|
||||||
case 906:
|
|
||||||
case 907:
|
|
||||||
case 908:
|
|
||||||
dc_transmap = transtables + ((ldef->special-900)<<FF_TRANSSHIFT);
|
|
||||||
colfunc = colfuncs[COLDRAWFUNC_FUZZY];
|
colfunc = colfuncs[COLDRAWFUNC_FUZZY];
|
||||||
break;
|
|
||||||
case 909:
|
}
|
||||||
|
else if (ldef->special == 909)
|
||||||
|
{
|
||||||
colfunc = colfuncs[COLDRAWFUNC_FOG];
|
colfunc = colfuncs[COLDRAWFUNC_FOG];
|
||||||
windowtop = frontsector->ceilingheight;
|
windowtop = frontsector->ceilingheight;
|
||||||
windowbottom = frontsector->floorheight;
|
windowbottom = frontsector->floorheight;
|
||||||
break;
|
|
||||||
default:
|
|
||||||
colfunc = colfuncs[BASEDRAWFUNC];
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
colfunc = colfuncs[BASEDRAWFUNC];
|
||||||
|
|
||||||
if (curline->polyseg && curline->polyseg->translucency > 0)
|
if (curline->polyseg && curline->polyseg->translucency > 0)
|
||||||
{
|
{
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
#pragma interface
|
#pragma interface
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
transnum_t R_GetLinedefTransTable(fixed_t alpha);
|
||||||
void R_RenderMaskedSegRange(drawseg_t *ds, INT32 x1, INT32 x2);
|
void R_RenderMaskedSegRange(drawseg_t *ds, INT32 x1, INT32 x2);
|
||||||
void R_RenderThickSideRange(drawseg_t *ds, INT32 x1, INT32 x2, ffloor_t *pffloor);
|
void R_RenderThickSideRange(drawseg_t *ds, INT32 x1, INT32 x2, ffloor_t *pffloor);
|
||||||
void R_StoreWallRange(INT32 start, INT32 stop);
|
void R_StoreWallRange(INT32 start, INT32 stop);
|
||||||
|
|
Loading…
Reference in New Issue