mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2026-02-23 14:01:14 +00:00
Merge remote-tracking branch 'origin/master' into paper-items-i-hate-my-life
This commit is contained in:
commit
81b8abed53
21 changed files with 466 additions and 294 deletions
|
|
@ -1116,7 +1116,7 @@ static void IdentifyVersion(void)
|
|||
}
|
||||
|
||||
MUSICTEST("sounds.wad")
|
||||
MUSICTEST("music.wad")
|
||||
MUSICTEST("music.pk3")
|
||||
|
||||
#undef MUSICTEST
|
||||
|
||||
|
|
|
|||
|
|
@ -11158,6 +11158,8 @@ struct {
|
|||
{"FF_TRANS70",FF_TRANS70},
|
||||
{"FF_TRANS80",FF_TRANS80},
|
||||
{"FF_TRANS90",FF_TRANS90},
|
||||
{"FF_TRANSADD",FF_TRANSADD},
|
||||
{"FF_TRANSSUB",FF_TRANSSUB},
|
||||
// compatibility
|
||||
// Transparency for SOCs is pre-shifted
|
||||
{"TR_TRANS10",tr_trans10<<FF_TRANSSHIFT},
|
||||
|
|
@ -11169,6 +11171,8 @@ struct {
|
|||
{"TR_TRANS70",tr_trans70<<FF_TRANSSHIFT},
|
||||
{"TR_TRANS80",tr_trans80<<FF_TRANSSHIFT},
|
||||
{"TR_TRANS90",tr_trans90<<FF_TRANSSHIFT},
|
||||
{"TR_TRANSADD",tr_transadd<<FF_TRANSSHIFT},
|
||||
{"TR_TRANSSUB",tr_transsub<<FF_TRANSSHIFT},
|
||||
// Transparency for Lua is not, unless capitalized as above.
|
||||
{"tr_trans10",tr_trans10},
|
||||
{"tr_trans20",tr_trans20},
|
||||
|
|
@ -11180,6 +11184,9 @@ struct {
|
|||
{"tr_trans80",tr_trans80},
|
||||
{"tr_trans90",tr_trans90},
|
||||
{"NUMTRANSMAPS",NUMTRANSMAPS},
|
||||
{"tr_transadd",tr_transadd},
|
||||
{"tr_transsub",tr_transsub},
|
||||
{"NUMEFFECTMAPS",NUMEFFECTMAPS},
|
||||
|
||||
// Type of levels
|
||||
{"TOL_RACE",TOL_RACE},
|
||||
|
|
@ -11688,6 +11695,8 @@ struct {
|
|||
{"MFD_TRANS70",MFD_TRANS70},
|
||||
{"MFD_TRANS80",MFD_TRANS80},
|
||||
{"MFD_TRANS90",MFD_TRANS90},
|
||||
{"MFD_TRANSADD",MFD_TRANSADD},
|
||||
{"MFD_TRANSSUB",MFD_TRANSSUB},
|
||||
{"MFD_TRANSMASK",MFD_TRANSMASK},
|
||||
{"MFD_FULLBRIGHT",MFD_FULLBRIGHT},
|
||||
{"MFD_SEMIBRIGHT",MFD_SEMIBRIGHT},
|
||||
|
|
|
|||
|
|
@ -107,8 +107,10 @@ static angle_t gl_xtoviewangle[MAXVIDWIDTH+1];
|
|||
|
||||
// base values set at SetViewSize
|
||||
static float gl_basecentery;
|
||||
static float gl_basecenterx;
|
||||
|
||||
float gl_baseviewwindowy, gl_basewindowcentery;
|
||||
float gl_baseviewwindowx, gl_basewindowcenterx;
|
||||
float gl_viewwidth, gl_viewheight; // viewport clipping boundaries (screen coords)
|
||||
float gl_viewwindowx;
|
||||
|
||||
|
|
@ -557,7 +559,7 @@ static void HWR_RenderPlane(subsector_t *subsector, extrasubsector_t *xsub, bool
|
|||
|
||||
HWR_Lighting(&Surf, lightlevel, planecolormap);
|
||||
|
||||
if (PolyFlags & (PF_Translucent|PF_Fog))
|
||||
if (PolyFlags & (PF_Translucent|PF_Additive|PF_Substractive|PF_Fog))
|
||||
{
|
||||
Surf.PolyColor.s.alpha = (UINT8)alpha;
|
||||
PolyFlags |= PF_Modulated;
|
||||
|
|
@ -787,6 +789,8 @@ FBITFIELD HWR_TranstableToAlpha(INT32 transtablenum, FSurfaceInfo *pSurf)
|
|||
case tr_trans70 : pSurf->PolyColor.s.alpha = 0x4c;return PF_Translucent;
|
||||
case tr_trans80 : pSurf->PolyColor.s.alpha = 0x33;return PF_Translucent;
|
||||
case tr_trans90 : pSurf->PolyColor.s.alpha = 0x19;return PF_Translucent;
|
||||
case tr_transadd : pSurf->PolyColor.s.alpha = 0xFF;return PF_Additive;
|
||||
case tr_transsub : pSurf->PolyColor.s.alpha = 0xFF;return PF_Substractive;
|
||||
}
|
||||
return PF_Translucent;
|
||||
}
|
||||
|
|
@ -854,7 +858,7 @@ static float HWR_ClipViewSegment(INT32 x, polyvertex_t *v1, polyvertex_t *v2)
|
|||
//
|
||||
// HWR_SplitWall
|
||||
//
|
||||
static void HWR_SplitWall(sector_t *sector, FOutVector *wallVerts, INT32 texnum, FSurfaceInfo* Surf, INT32 cutflag, ffloor_t *pfloor)
|
||||
static void HWR_SplitWall(sector_t *sector, FOutVector *wallVerts, INT32 texnum, FSurfaceInfo* Surf, INT32 cutflag, ffloor_t *pfloor, FBITFIELD blendmode)
|
||||
{
|
||||
/* SoM: split up and light walls according to the
|
||||
lightlist. This may also include leaving out parts
|
||||
|
|
@ -991,12 +995,12 @@ static void HWR_SplitWall(sector_t *sector, FOutVector *wallVerts, INT32 texnum,
|
|||
wallVerts[0].y = bot;
|
||||
wallVerts[1].y = endbot;
|
||||
|
||||
if (cutflag & FF_FOG)
|
||||
HWR_AddTransparentWall(wallVerts, Surf, texnum, PF_Fog|PF_NoTexture, true, lightnum, colormap);
|
||||
else if (cutflag & FF_TRANSLUCENT)
|
||||
HWR_AddTransparentWall(wallVerts, Surf, texnum, PF_Translucent, false, lightnum, colormap);
|
||||
if (blendmode & PF_Fog)
|
||||
HWR_AddTransparentWall(wallVerts, Surf, texnum, blendmode, true, lightnum, colormap);
|
||||
else if (blendmode & (PF_Translucent|PF_Additive|PF_Substractive|PF_Environment))
|
||||
HWR_AddTransparentWall(wallVerts, Surf, texnum, blendmode, false, lightnum, colormap);
|
||||
else
|
||||
HWR_ProjectWall(wallVerts, Surf, PF_Masked, lightnum, colormap);
|
||||
HWR_ProjectWall(wallVerts, Surf, blendmode, lightnum, colormap);
|
||||
|
||||
top = bot;
|
||||
endtop = endbot;
|
||||
|
|
@ -1020,12 +1024,12 @@ static void HWR_SplitWall(sector_t *sector, FOutVector *wallVerts, INT32 texnum,
|
|||
wallVerts[0].y = bot;
|
||||
wallVerts[1].y = endbot;
|
||||
|
||||
if (cutflag & FF_FOG)
|
||||
HWR_AddTransparentWall(wallVerts, Surf, texnum, PF_Fog|PF_NoTexture, true, lightnum, colormap);
|
||||
else if (cutflag & FF_TRANSLUCENT)
|
||||
HWR_AddTransparentWall(wallVerts, Surf, texnum, PF_Translucent, false, lightnum, colormap);
|
||||
if (blendmode & PF_Fog)
|
||||
HWR_AddTransparentWall(wallVerts, Surf, texnum, blendmode, true, lightnum, colormap);
|
||||
else if (blendmode & (PF_Translucent|PF_Additive|PF_Substractive|PF_Environment))
|
||||
HWR_AddTransparentWall(wallVerts, Surf, texnum, blendmode, false, lightnum, colormap);
|
||||
else
|
||||
HWR_ProjectWall(wallVerts, Surf, PF_Masked, lightnum, colormap);
|
||||
HWR_ProjectWall(wallVerts, Surf, blendmode, lightnum, colormap);
|
||||
}
|
||||
|
||||
// HWR_DrawSkyWall
|
||||
|
|
@ -1205,12 +1209,19 @@ static void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom
|
|||
wallVerts[2].y = FIXED_TO_FLOAT(worldtopslope);
|
||||
wallVerts[1].y = FIXED_TO_FLOAT(worldhighslope);
|
||||
|
||||
if (gl_frontsector->numlights)
|
||||
HWR_SplitWall(gl_frontsector, wallVerts, gl_toptexture, &Surf, FF_CUTLEVEL, NULL);
|
||||
else if (grTex->mipmap.flags & TF_TRANSPARENT)
|
||||
HWR_AddTransparentWall(wallVerts, &Surf, gl_toptexture, PF_Environment, false, lightnum, colormap);
|
||||
else
|
||||
HWR_ProjectWall(wallVerts, &Surf, PF_Masked, lightnum, colormap);
|
||||
{
|
||||
FBITFIELD blendmode = PF_Masked;
|
||||
|
||||
if (grTex->mipmap.flags & TF_TRANSPARENT)
|
||||
blendmode = PF_Environment;
|
||||
|
||||
if (gl_frontsector->numlights)
|
||||
HWR_SplitWall(gl_frontsector, wallVerts, gl_toptexture, &Surf, FF_CUTLEVEL, NULL, blendmode);
|
||||
else if (grTex->mipmap.flags & TF_TRANSPARENT)
|
||||
HWR_AddTransparentWall(wallVerts, &Surf, gl_toptexture, blendmode, false, lightnum, colormap);
|
||||
else
|
||||
HWR_ProjectWall(wallVerts, &Surf, blendmode, lightnum, colormap);
|
||||
}
|
||||
}
|
||||
|
||||
// check BOTTOM TEXTURE
|
||||
|
|
@ -1271,12 +1282,19 @@ static void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom
|
|||
wallVerts[2].y = FIXED_TO_FLOAT(worldlowslope);
|
||||
wallVerts[1].y = FIXED_TO_FLOAT(worldbottomslope);
|
||||
|
||||
if (gl_frontsector->numlights)
|
||||
HWR_SplitWall(gl_frontsector, wallVerts, gl_bottomtexture, &Surf, FF_CUTLEVEL, NULL);
|
||||
else if (grTex->mipmap.flags & TF_TRANSPARENT)
|
||||
HWR_AddTransparentWall(wallVerts, &Surf, gl_bottomtexture, PF_Environment, false, lightnum, colormap);
|
||||
else
|
||||
HWR_ProjectWall(wallVerts, &Surf, PF_Masked, lightnum, colormap);
|
||||
{
|
||||
FBITFIELD blendmode = PF_Masked;
|
||||
|
||||
if (grTex->mipmap.flags & TF_TRANSPARENT)
|
||||
blendmode = PF_Environment;
|
||||
|
||||
if (gl_frontsector->numlights)
|
||||
HWR_SplitWall(gl_frontsector, wallVerts, gl_bottomtexture, &Surf, FF_CUTLEVEL, NULL, blendmode);
|
||||
else if (grTex->mipmap.flags & TF_TRANSPARENT)
|
||||
HWR_AddTransparentWall(wallVerts, &Surf, gl_bottomtexture, blendmode, false, lightnum, colormap);
|
||||
else
|
||||
HWR_ProjectWall(wallVerts, &Surf, blendmode, lightnum, colormap);
|
||||
}
|
||||
}
|
||||
gl_midtexture = R_GetTextureNum(gl_sidedef->midtexture);
|
||||
if (gl_midtexture)
|
||||
|
|
@ -1470,16 +1488,19 @@ static void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom
|
|||
blendmode = PF_Translucent;
|
||||
break;
|
||||
default:
|
||||
if (gl_linedef->alpha >= 0 && gl_linedef->alpha < FRACUNIT)
|
||||
blendmode = HWR_TranstableToAlpha(R_GetLinedefTransTable(gl_linedef->alpha), &Surf);
|
||||
{
|
||||
transnum_t transtable = R_GetLinedefTransTable(gl_linedef);
|
||||
if (transtable != NUMEFFECTMAPS)
|
||||
blendmode = HWR_TranstableToAlpha(transtable, &Surf);
|
||||
else
|
||||
blendmode = PF_Masked;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (gl_curline->polyseg && gl_curline->polyseg->translucency > 0)
|
||||
{
|
||||
if (gl_curline->polyseg->translucency >= NUMTRANSMAPS) // wall not drawn
|
||||
if (gl_curline->polyseg->translucency >= NUMEFFECTMAPS) // wall not drawn
|
||||
{
|
||||
Surf.PolyColor.s.alpha = 0x00; // This shouldn't draw anything regardless of blendmode
|
||||
blendmode = PF_Masked;
|
||||
|
|
@ -1491,10 +1512,10 @@ static void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom
|
|||
if (gl_frontsector->numlights)
|
||||
{
|
||||
if (!(blendmode & PF_Masked))
|
||||
HWR_SplitWall(gl_frontsector, wallVerts, gl_midtexture, &Surf, FF_TRANSLUCENT, NULL);
|
||||
HWR_SplitWall(gl_frontsector, wallVerts, gl_midtexture, &Surf, FF_TRANSLUCENT, NULL, blendmode);
|
||||
else
|
||||
{
|
||||
HWR_SplitWall(gl_frontsector, wallVerts, gl_midtexture, &Surf, FF_CUTLEVEL, NULL);
|
||||
HWR_SplitWall(gl_frontsector, wallVerts, gl_midtexture, &Surf, FF_CUTLEVEL, NULL, blendmode);
|
||||
}
|
||||
}
|
||||
else if (!(blendmode & PF_Masked))
|
||||
|
|
@ -1575,15 +1596,21 @@ static void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom
|
|||
wallVerts[2].y = FIXED_TO_FLOAT(worldtopslope);
|
||||
wallVerts[1].y = FIXED_TO_FLOAT(worldbottomslope);
|
||||
|
||||
// I don't think that solid walls can use translucent linedef types...
|
||||
if (gl_frontsector->numlights)
|
||||
HWR_SplitWall(gl_frontsector, wallVerts, gl_midtexture, &Surf, FF_CUTLEVEL, NULL);
|
||||
else
|
||||
{
|
||||
FBITFIELD blendmode = PF_Masked;
|
||||
if (grTex->mipmap.flags & TF_TRANSPARENT)
|
||||
HWR_AddTransparentWall(wallVerts, &Surf, gl_midtexture, PF_Environment, false, lightnum, colormap);
|
||||
blendmode = PF_Environment;
|
||||
|
||||
// I don't think that solid walls can use translucent linedef types...
|
||||
if (gl_frontsector->numlights)
|
||||
HWR_SplitWall(gl_frontsector, wallVerts, gl_midtexture, &Surf, FF_CUTLEVEL, NULL, blendmode);
|
||||
else
|
||||
HWR_ProjectWall(wallVerts, &Surf, PF_Masked, lightnum, colormap);
|
||||
{
|
||||
if (grTex->mipmap.flags & TF_TRANSPARENT)
|
||||
HWR_AddTransparentWall(wallVerts, &Surf, gl_midtexture, blendmode, false, lightnum, colormap);
|
||||
else
|
||||
HWR_ProjectWall(wallVerts, &Surf, blendmode, lightnum, colormap);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1728,7 +1755,7 @@ static void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom
|
|||
Surf.PolyColor.s.alpha = HWR_FogBlockAlpha(rover->master->frontsector->lightlevel, rover->master->frontsector->extra_colormap);
|
||||
|
||||
if (gl_frontsector->numlights)
|
||||
HWR_SplitWall(gl_frontsector, wallVerts, 0, &Surf, rover->flags, rover);
|
||||
HWR_SplitWall(gl_frontsector, wallVerts, 0, &Surf, rover->flags, rover, blendmode);
|
||||
else
|
||||
HWR_AddTransparentWall(wallVerts, &Surf, 0, blendmode, true, lightnum, colormap);
|
||||
}
|
||||
|
|
@ -1736,14 +1763,21 @@ static void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom
|
|||
{
|
||||
FBITFIELD blendmode = PF_Masked;
|
||||
|
||||
if (rover->flags & FF_TRANSLUCENT && rover->alpha < 256)
|
||||
if (rover->flags & FF_TRANSLUCENT)
|
||||
{
|
||||
blendmode = PF_Translucent;
|
||||
Surf.PolyColor.s.alpha = (UINT8)rover->alpha-1 > 255 ? 255 : rover->alpha-1;
|
||||
if (rover->alpha < 256)
|
||||
{
|
||||
blendmode = PF_Translucent;
|
||||
Surf.PolyColor.s.alpha = (UINT8)(rover->alpha-1 > 255 ? 255 : rover->alpha-1);
|
||||
}
|
||||
else if (rover->alpha == FFLOOR_ALPHA_SPECIAL_ADDITIVE)
|
||||
blendmode = PF_Additive;
|
||||
else if (rover->alpha == FFLOOR_ALPHA_SPECIAL_SUBTRACTIVE)
|
||||
blendmode = PF_Substractive;
|
||||
}
|
||||
|
||||
if (gl_frontsector->numlights)
|
||||
HWR_SplitWall(gl_frontsector, wallVerts, texnum, &Surf, rover->flags, rover);
|
||||
HWR_SplitWall(gl_frontsector, wallVerts, texnum, &Surf, rover->flags, rover, blendmode);
|
||||
else
|
||||
{
|
||||
if (blendmode != PF_Masked)
|
||||
|
|
@ -1828,7 +1862,7 @@ static void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom
|
|||
Surf.PolyColor.s.alpha = HWR_FogBlockAlpha(rover->master->frontsector->lightlevel, rover->master->frontsector->extra_colormap);
|
||||
|
||||
if (gl_backsector->numlights)
|
||||
HWR_SplitWall(gl_backsector, wallVerts, 0, &Surf, rover->flags, rover);
|
||||
HWR_SplitWall(gl_backsector, wallVerts, 0, &Surf, rover->flags, rover, blendmode);
|
||||
else
|
||||
HWR_AddTransparentWall(wallVerts, &Surf, 0, blendmode, true, lightnum, colormap);
|
||||
}
|
||||
|
|
@ -1836,14 +1870,21 @@ static void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom
|
|||
{
|
||||
FBITFIELD blendmode = PF_Masked;
|
||||
|
||||
if (rover->flags & FF_TRANSLUCENT && rover->alpha < 256)
|
||||
if (rover->flags & FF_TRANSLUCENT)
|
||||
{
|
||||
blendmode = PF_Translucent;
|
||||
Surf.PolyColor.s.alpha = (UINT8)rover->alpha-1 > 255 ? 255 : rover->alpha-1;
|
||||
if (rover->alpha < 256)
|
||||
{
|
||||
blendmode = PF_Translucent;
|
||||
Surf.PolyColor.s.alpha = (UINT8)(rover->alpha-1 > 255 ? 255 : rover->alpha-1);
|
||||
}
|
||||
else if (rover->alpha == FFLOOR_ALPHA_SPECIAL_ADDITIVE)
|
||||
blendmode = PF_Additive;
|
||||
else if (rover->alpha == FFLOOR_ALPHA_SPECIAL_SUBTRACTIVE)
|
||||
blendmode = PF_Substractive;
|
||||
}
|
||||
|
||||
if (gl_backsector->numlights)
|
||||
HWR_SplitWall(gl_backsector, wallVerts, texnum, &Surf, rover->flags, rover);
|
||||
HWR_SplitWall(gl_backsector, wallVerts, texnum, &Surf, rover->flags, rover, blendmode);
|
||||
else
|
||||
{
|
||||
if (blendmode != PF_Masked)
|
||||
|
|
@ -2863,7 +2904,7 @@ static void HWR_AddPolyObjectPlanes(void)
|
|||
if (!(po_ptrs[i]->flags & POF_RENDERPLANES)) // Only render planes when you should
|
||||
continue;
|
||||
|
||||
if (po_ptrs[i]->translucency >= NUMTRANSMAPS)
|
||||
if (po_ptrs[i]->translucency >= NUMEFFECTMAPS)
|
||||
continue;
|
||||
|
||||
if (polyobjsector->floorheight <= gl_frontsector->ceilingheight
|
||||
|
|
@ -3104,8 +3145,16 @@ static void HWR_Subsector(size_t num)
|
|||
alpha, rover->master->frontsector, PF_Fog|PF_NoTexture,
|
||||
true, rover->master->frontsector->extra_colormap);
|
||||
}
|
||||
else if (rover->flags & FF_TRANSLUCENT && rover->alpha < 256) // SoM: Flags are more efficient
|
||||
else if (rover->flags & FF_TRANSLUCENT
|
||||
&& (rover->alpha < 256
|
||||
|| rover->alpha == FFLOOR_ALPHA_SPECIAL_ADDITIVE || rover->alpha == FFLOOR_ALPHA_SPECIAL_SUBTRACTIVE)) // SoM: Flags are more efficient
|
||||
{
|
||||
FBITFIELD blendmode = PF_Translucent;
|
||||
if (rover->alpha == FFLOOR_ALPHA_SPECIAL_ADDITIVE)
|
||||
blendmode = PF_Additive;
|
||||
else if (rover->alpha == FFLOOR_ALPHA_SPECIAL_SUBTRACTIVE)
|
||||
blendmode = PF_Substractive;
|
||||
|
||||
light = R_GetPlaneLight(gl_frontsector, centerHeight, dup_viewz < cullHeight ? true : false);
|
||||
|
||||
HWR_AddTransparentFloor(&levelflats[*rover->bottompic],
|
||||
|
|
@ -3113,7 +3162,7 @@ static void HWR_Subsector(size_t num)
|
|||
false,
|
||||
*rover->bottomheight,
|
||||
*gl_frontsector->lightlist[light].lightlevel,
|
||||
rover->alpha-1 > 255 ? 255 : rover->alpha-1, rover->master->frontsector, (rover->flags & FF_RIPPLE ? PF_Ripple : 0)|PF_Translucent,
|
||||
rover->alpha-1 > 255 ? 255 : rover->alpha-1, rover->master->frontsector, (rover->flags & FF_RIPPLE ? PF_Ripple : 0)|blendmode,
|
||||
false, *gl_frontsector->lightlist[light].extra_colormap);
|
||||
}
|
||||
else
|
||||
|
|
@ -3149,8 +3198,16 @@ static void HWR_Subsector(size_t num)
|
|||
alpha, rover->master->frontsector, PF_Fog|PF_NoTexture,
|
||||
true, rover->master->frontsector->extra_colormap);
|
||||
}
|
||||
else if (rover->flags & FF_TRANSLUCENT && rover->alpha < 256)
|
||||
else if (rover->flags & FF_TRANSLUCENT
|
||||
&& (rover->alpha < 256
|
||||
|| rover->alpha == FFLOOR_ALPHA_SPECIAL_ADDITIVE || rover->alpha == FFLOOR_ALPHA_SPECIAL_SUBTRACTIVE)) // SoM: Flags are more efficient
|
||||
{
|
||||
FBITFIELD blendmode = PF_Translucent;
|
||||
if (rover->alpha == FFLOOR_ALPHA_SPECIAL_ADDITIVE)
|
||||
blendmode = PF_Additive;
|
||||
else if (rover->alpha == FFLOOR_ALPHA_SPECIAL_SUBTRACTIVE)
|
||||
blendmode = PF_Substractive;
|
||||
|
||||
light = R_GetPlaneLight(gl_frontsector, centerHeight, dup_viewz < cullHeight ? true : false);
|
||||
|
||||
HWR_AddTransparentFloor(&levelflats[*rover->toppic],
|
||||
|
|
@ -3158,7 +3215,7 @@ static void HWR_Subsector(size_t num)
|
|||
true,
|
||||
*rover->topheight,
|
||||
*gl_frontsector->lightlist[light].lightlevel,
|
||||
rover->alpha-1 > 255 ? 255 : rover->alpha-1, rover->master->frontsector, (rover->flags & FF_RIPPLE ? PF_Ripple : 0)|PF_Translucent,
|
||||
rover->alpha-1 > 255 ? 255 : rover->alpha-1, rover->master->frontsector, (rover->flags & FF_RIPPLE ? PF_Ripple : 0)|blendmode,
|
||||
false, *gl_frontsector->lightlist[light].extra_colormap);
|
||||
}
|
||||
else
|
||||
|
|
@ -5597,21 +5654,14 @@ void HWR_SetViewSize(void)
|
|||
}
|
||||
}
|
||||
|
||||
gl_centerx = gl_viewwidth / 2;
|
||||
gl_basecentery = gl_viewheight / 2; //note: this is (gl_centerx * gl_viewheight / gl_viewwidth)
|
||||
gl_basecenterx = gl_viewwidth / 2;
|
||||
gl_basecentery = gl_viewheight / 2;
|
||||
|
||||
gl_viewwindowx = (vid.width - gl_viewwidth) / 2;
|
||||
gl_windowcenterx = (float)(vid.width / 2);
|
||||
if (fabsf(gl_viewwidth - vid.width) < 1.0E-36f)
|
||||
{
|
||||
gl_baseviewwindowy = 0;
|
||||
gl_basewindowcentery = gl_viewheight / 2; // window top left corner at 0,0
|
||||
}
|
||||
else
|
||||
{
|
||||
gl_baseviewwindowy = (vid.height-gl_viewheight) / 2;
|
||||
gl_basewindowcentery = (float)(vid.height / 2);
|
||||
}
|
||||
gl_baseviewwindowx = 0;
|
||||
gl_basewindowcenterx = gl_viewwidth / 2;
|
||||
|
||||
gl_baseviewwindowy = 0;
|
||||
gl_basewindowcentery = gl_viewheight / 2;
|
||||
|
||||
gl_pspritexscale = gl_viewwidth / BASEVIDWIDTH;
|
||||
gl_pspriteyscale = ((vid.height*gl_pspritexscale*BASEVIDWIDTH)/BASEVIDHEIGHT)/vid.width;
|
||||
|
|
@ -5619,6 +5669,32 @@ void HWR_SetViewSize(void)
|
|||
HWD.pfnFlushScreenTextures();
|
||||
}
|
||||
|
||||
// -------------------+
|
||||
// HWR_ShiftViewPort : offset viewport according to current split
|
||||
// -------------------+
|
||||
static void HWR_ShiftViewPort(void)
|
||||
{
|
||||
gl_centerx = gl_basecenterx;
|
||||
gl_viewwindowx = gl_baseviewwindowx;
|
||||
gl_windowcenterx = gl_basewindowcenterx;
|
||||
|
||||
gl_centery = gl_basecentery;
|
||||
gl_viewwindowy = gl_baseviewwindowy;
|
||||
gl_windowcentery = gl_basewindowcentery;
|
||||
|
||||
if (viewssnum > ( r_splitscreen > 1 ))
|
||||
{
|
||||
gl_viewwindowy += gl_viewheight;
|
||||
gl_windowcentery += gl_viewheight;
|
||||
}
|
||||
|
||||
if (r_splitscreen > 1 && viewssnum & 1)
|
||||
{
|
||||
gl_viewwindowx += gl_viewwidth;
|
||||
gl_windowcenterx += gl_viewwidth;
|
||||
}
|
||||
}
|
||||
|
||||
// Set view aiming, for the sky dome, the skybox,
|
||||
// and the normal view, all with a single function.
|
||||
static void HWR_SetTransformAiming(FTransform *trans, player_t *player, boolean skybox)
|
||||
|
|
@ -5670,14 +5746,7 @@ void HWR_RenderSkyboxView(player_t *player)
|
|||
dup_viewangle = viewangle;
|
||||
|
||||
// set window position
|
||||
gl_centery = gl_basecentery;
|
||||
gl_viewwindowy = gl_baseviewwindowy;
|
||||
gl_windowcentery = gl_basewindowcentery;
|
||||
if (viewssnum == 1)
|
||||
{
|
||||
gl_viewwindowy += (vid.height/2);
|
||||
gl_windowcentery += (vid.height/2);
|
||||
}
|
||||
HWR_ShiftViewPort();
|
||||
|
||||
// check for new console commands.
|
||||
NetUpdate();
|
||||
|
|
@ -5878,14 +5947,7 @@ void HWR_RenderPlayerView(void)
|
|||
dup_viewangle = viewangle;
|
||||
|
||||
// set window position
|
||||
gl_centery = gl_basecentery;
|
||||
gl_viewwindowy = gl_baseviewwindowy;
|
||||
gl_windowcentery = gl_basewindowcentery;
|
||||
if (viewssnum == 1)
|
||||
{
|
||||
gl_viewwindowy += (vid.height/2);
|
||||
gl_windowcentery += (vid.height/2);
|
||||
}
|
||||
HWR_ShiftViewPort();
|
||||
|
||||
// check for new console commands.
|
||||
NetUpdate();
|
||||
|
|
|
|||
|
|
@ -419,7 +419,6 @@ static void md2_loadTexture(md2_t *model)
|
|||
}
|
||||
|
||||
HWD.pfnSetTexture(grpatch->mipmap);
|
||||
HWR_UnlockCachedPatch(grpatch);
|
||||
}
|
||||
|
||||
// -----------------+
|
||||
|
|
@ -470,7 +469,6 @@ static void md2_loadBlendTexture(md2_t *model)
|
|||
}
|
||||
|
||||
HWD.pfnSetTexture(grpatch->mipmap); // We do need to do this so that it can be cleared and knows to recreate it when necessary
|
||||
HWR_UnlockCachedPatch(grpatch);
|
||||
|
||||
Z_Free(filename);
|
||||
}
|
||||
|
|
@ -609,9 +607,6 @@ void HWR_AddPlayerModel(int skin) // For skins that were added after startup
|
|||
}
|
||||
}
|
||||
|
||||
// Check for any MD2s that match the names of sprite names!
|
||||
while (fscanf(f, "%19s %31s %f %f", name, filename, &scale, &offset) == 4)
|
||||
|
||||
// length of the player model prefix
|
||||
prefixlen = strlen(PLAYERMODELPREFIX);
|
||||
|
||||
|
|
@ -703,10 +698,12 @@ static void HWR_CreateBlendedTexture(GLPatch_t *gpatch, GLPatch_t *blendgpatch,
|
|||
UINT16 w = gpatch->width, h = gpatch->height;
|
||||
UINT32 size = w*h;
|
||||
RGBA_t *image, *blendimage, *cur, blendcolor;
|
||||
UINT16 translation[16]; // First the color index
|
||||
UINT8 translation[16]; // First the color index
|
||||
UINT8 cutoff[16]; // Brightness cutoff before using the next color
|
||||
UINT8 translen = 0;
|
||||
UINT8 i;
|
||||
UINT8 colorbrightnesses[16];
|
||||
UINT8 color_match_lookup[256]; // optimization attempt
|
||||
|
||||
blendcolor = V_GetColor(0); // initialize
|
||||
memset(translation, 0, sizeof(translation));
|
||||
|
|
@ -742,6 +739,7 @@ static void HWR_CreateBlendedTexture(GLPatch_t *gpatch, GLPatch_t *blendgpatch,
|
|||
if (color != SKINCOLOR_NONE && color < numskincolors)
|
||||
{
|
||||
UINT8 numdupes = 1;
|
||||
UINT8 prevdupes = numdupes;
|
||||
|
||||
translation[translen] = skincolors[color].ramp[0];
|
||||
cutoff[translen] = 255;
|
||||
|
|
@ -756,18 +754,56 @@ static void HWR_CreateBlendedTexture(GLPatch_t *gpatch, GLPatch_t *blendgpatch,
|
|||
|
||||
if (translen > 0)
|
||||
{
|
||||
cutoff[translen] = cutoff[translen-1] - (256 / (16 / numdupes));
|
||||
INT16 newcutoff = cutoff[translen-1] - (255 / (16 / prevdupes));
|
||||
|
||||
if (newcutoff < 0)
|
||||
newcutoff = 0;
|
||||
|
||||
cutoff[translen] = (UINT8)newcutoff;
|
||||
}
|
||||
|
||||
prevdupes = numdupes;
|
||||
numdupes = 1;
|
||||
translen++;
|
||||
|
||||
translation[translen] = (UINT16)skincolors[color].ramp[i];
|
||||
translation[translen] = (UINT8)skincolors[color].ramp[i];
|
||||
}
|
||||
|
||||
translen++;
|
||||
}
|
||||
|
||||
if (skinnum == TC_RAINBOW && translen > 0)
|
||||
{
|
||||
UINT16 b;
|
||||
INT32 compare;
|
||||
|
||||
for (i = 0; i < translen; i++) // moved from inside the loop to here
|
||||
{
|
||||
RGBA_t tempc = V_GetColor(translation[i]);
|
||||
colorbrightnesses[i] = K_ColorRelativeLuminance(tempc.s.red, tempc.s.green, tempc.s.blue); // store brightnesses for comparison
|
||||
}
|
||||
// generate lookup table for color brightness matching
|
||||
for (b = 0; b < 256; b++)
|
||||
{
|
||||
UINT16 brightdif = 256;
|
||||
|
||||
color_match_lookup[i] = 0;
|
||||
for (i = 0; i < translen; i++)
|
||||
{
|
||||
if (b > colorbrightnesses[i]) // don't allow greater matches (because calculating a makeshift gradient for this is already a huge mess as is)
|
||||
continue;
|
||||
|
||||
compare = abs((INT16)(colorbrightnesses[i]) - (INT16)(b));
|
||||
|
||||
if (compare < brightdif)
|
||||
{
|
||||
brightdif = (UINT16)compare;
|
||||
color_match_lookup[b] = i; // best matching color that's equal brightness or darker
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
while (size--)
|
||||
{
|
||||
if (skinnum == TC_BOSS)
|
||||
|
|
@ -839,7 +875,7 @@ static void HWR_CreateBlendedTexture(GLPatch_t *gpatch, GLPatch_t *blendgpatch,
|
|||
else
|
||||
{
|
||||
// All settings that use skincolors!
|
||||
UINT8 brightness;
|
||||
UINT16 brightness;
|
||||
|
||||
if (translen <= 0)
|
||||
{
|
||||
|
|
@ -857,8 +893,11 @@ static void HWR_CreateBlendedTexture(GLPatch_t *gpatch, GLPatch_t *blendgpatch,
|
|||
}
|
||||
else
|
||||
{
|
||||
UINT8 imagebright = K_ColorRelativeLuminance(image->s.red, image->s.green, image->s.blue);
|
||||
UINT8 blendbright = K_ColorRelativeLuminance(blendimage->s.red, blendimage->s.green, blendimage->s.blue);
|
||||
UINT16 imagebright, blendbright;
|
||||
|
||||
imagebright = K_ColorRelativeLuminance(image->s.red, image->s.green, image->s.blue);
|
||||
blendbright = K_ColorRelativeLuminance(blendimage->s.red, blendimage->s.green, blendimage->s.blue);
|
||||
|
||||
// slightly dumb average between the blend image color and base image colour, usually one or the other will be fully opaque anyway
|
||||
brightness = (imagebright*(255-blendimage->s.alpha))/255 + (blendbright*blendimage->s.alpha)/255;
|
||||
}
|
||||
|
|
@ -887,9 +926,8 @@ static void HWR_CreateBlendedTexture(GLPatch_t *gpatch, GLPatch_t *blendgpatch,
|
|||
// Ensue horrible mess.
|
||||
if (skinnum == TC_RAINBOW)
|
||||
{
|
||||
UINT16 brightdif = 256;
|
||||
UINT8 colorbrightnesses[16];
|
||||
INT32 compare, m, d;
|
||||
//UINT16 brightdif = 256;
|
||||
INT32 /*compare,*/ m, d;
|
||||
|
||||
// Ignore pure white & pitch black
|
||||
if (brightness > 253 || brightness < 2)
|
||||
|
|
@ -903,13 +941,7 @@ static void HWR_CreateBlendedTexture(GLPatch_t *gpatch, GLPatch_t *blendgpatch,
|
|||
mul = 0;
|
||||
mulmax = 1;
|
||||
|
||||
for (i = 0; i < translen; i++)
|
||||
{
|
||||
RGBA_t tempc = V_GetColor(translation[i]);
|
||||
colorbrightnesses[i] = K_ColorRelativeLuminance(tempc.s.red, tempc.s.green, tempc.s.blue); // store brightnesses for comparison
|
||||
}
|
||||
|
||||
for (i = 0; i < translen; i++)
|
||||
/*for (i = 0; i < translen; i++)
|
||||
{
|
||||
if (brightness > colorbrightnesses[i]) // don't allow greater matches (because calculating a makeshift gradient for this is already a huge mess as is)
|
||||
continue;
|
||||
|
|
@ -921,19 +953,13 @@ static void HWR_CreateBlendedTexture(GLPatch_t *gpatch, GLPatch_t *blendgpatch,
|
|||
brightdif = (UINT16)compare;
|
||||
firsti = i; // best matching color that's equal brightness or darker
|
||||
}
|
||||
}
|
||||
}*/
|
||||
firsti = color_match_lookup[brightness];
|
||||
|
||||
secondi = firsti+1; // next color in line
|
||||
if (secondi >= translen)
|
||||
{
|
||||
m = (INT16)brightness; // - 0;
|
||||
d = (INT16)colorbrightnesses[firsti]; // - 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
m = (INT16)brightness - (INT16)colorbrightnesses[secondi];
|
||||
d = (INT16)colorbrightnesses[firsti] - (INT16)colorbrightnesses[secondi];
|
||||
}
|
||||
|
||||
m = (INT16)brightness - (INT16)colorbrightnesses[secondi];
|
||||
d = (INT16)colorbrightnesses[firsti] - (INT16)colorbrightnesses[secondi];
|
||||
|
||||
if (m >= d)
|
||||
m = d-1;
|
||||
|
|
@ -960,29 +986,15 @@ static void HWR_CreateBlendedTexture(GLPatch_t *gpatch, GLPatch_t *blendgpatch,
|
|||
|
||||
secondi = firsti+1;
|
||||
|
||||
mulmax = cutoff[firsti];
|
||||
if (secondi < translen)
|
||||
mulmax -= cutoff[secondi];
|
||||
|
||||
mulmax = cutoff[firsti] - cutoff[secondi];
|
||||
mul = cutoff[firsti] - brightness;
|
||||
}
|
||||
|
||||
blendcolor = V_GetColor(translation[firsti]);
|
||||
|
||||
if (secondi >= translen)
|
||||
mul = 0;
|
||||
|
||||
if (mul > 0) // If it's 0, then we only need the first color.
|
||||
{
|
||||
#if 0
|
||||
if (secondi >= translen)
|
||||
{
|
||||
// blend to black
|
||||
nextcolor = V_GetColor(31);
|
||||
}
|
||||
else
|
||||
#endif
|
||||
nextcolor = V_GetColor(translation[secondi]);
|
||||
nextcolor = V_GetColor(translation[secondi]);
|
||||
|
||||
// Find difference between points
|
||||
r = (INT32)(nextcolor.s.red - blendcolor.s.red);
|
||||
|
|
@ -1004,10 +1016,14 @@ static void HWR_CreateBlendedTexture(GLPatch_t *gpatch, GLPatch_t *blendgpatch,
|
|||
if (skinnum == TC_RAINBOW)
|
||||
{
|
||||
UINT32 tempcolor;
|
||||
UINT8 colorbright = K_ColorRelativeLuminance(blendcolor.s.red, blendcolor.s.green, blendcolor.s.blue);
|
||||
UINT16 colorbright;
|
||||
|
||||
colorbright = K_ColorRelativeLuminance(blendcolor.s.red, blendcolor.s.green, blendcolor.s.blue);
|
||||
|
||||
if (colorbright == 0)
|
||||
{
|
||||
colorbright = 1; // no dividing by 0 please
|
||||
}
|
||||
|
||||
tempcolor = (brightness * blendcolor.s.red) / colorbright;
|
||||
tempcolor = min(255, tempcolor);
|
||||
|
|
|
|||
|
|
@ -2848,7 +2848,7 @@ EXPORT void HWRAPI(SetTransform) (FTransform *stransform)
|
|||
pglRotatef(stransform->angley+270.0f, 0.0f, 1.0f, 0.0f);
|
||||
pglTranslatef(-stransform->x, -stransform->z, -stransform->y);
|
||||
|
||||
special_splitscreen = stransform->splitscreen;
|
||||
special_splitscreen = (stransform->splitscreen == 1);
|
||||
shearing = stransform->shearing;
|
||||
}
|
||||
else
|
||||
|
|
|
|||
14
src/info.c
14
src/info.c
|
|
@ -2262,9 +2262,9 @@ state_t states[NUMSTATES] =
|
|||
{SPR_CHAN, 0, -1, {NULL}, 0, 0, S_NULL}, // S_CEZCHAIN
|
||||
|
||||
// Flame
|
||||
{SPR_FLAM, FF_FULLBRIGHT|FF_ANIMATE, 3*8, {A_FlameParticle}, 7, 3, S_FLAME}, // S_FLAME
|
||||
{SPR_FLAM, FF_FULLBRIGHT|FF_ANIMATE|8, TICRATE, {NULL}, 3, 3, S_NULL}, // S_FLAMEPARTICLE
|
||||
{SPR_FLAM, FF_FULLBRIGHT|FF_ANIMATE, -1, {NULL}, 7, 3, S_NULL}, // S_FLAMEREST
|
||||
{SPR_FLAM, FF_FULLBRIGHT|FF_ANIMATE|FF_TRANSADD, 3*8, {A_FlameParticle}, 7, 3, S_FLAME}, // S_FLAME
|
||||
{SPR_FLAM, FF_FULLBRIGHT|FF_ANIMATE|FF_TRANSADD|8, TICRATE, {NULL}, 3, 3, S_NULL}, // S_FLAMEPARTICLE
|
||||
{SPR_FLAM, FF_FULLBRIGHT|FF_ANIMATE|FF_TRANSADD, -1, {NULL}, 7, 3, S_NULL}, // S_FLAMEREST
|
||||
|
||||
// Eggman statue
|
||||
{SPR_ESTA, 0, -1, {NULL}, 0, 0, S_NULL}, // S_EGGSTATUE1
|
||||
|
|
@ -4414,10 +4414,10 @@ state_t states[NUMSTATES] =
|
|||
|
||||
{SPR_AUDI, 4|FF_ANIMATE, -1, {NULL}, 1, 17, S_NULL}, // S_AUDIENCE_CHAO_LOSE
|
||||
|
||||
{SPR_FLAM, 0, 3, {NULL}, 0, 0, S_FLAYM2}, // S_FLAYM1,
|
||||
{SPR_FLAM, 1, 3, {NULL}, 0, 0, S_FLAYM3}, // S_FLAYM2,
|
||||
{SPR_FLAM, 2, 3, {NULL}, 0, 0, S_FLAYM4}, // S_FLAYM3,
|
||||
{SPR_FLAM, 3, 3, {NULL}, 0, 0, S_FLAYM1}, // S_FLAYM4,
|
||||
{SPR_FLAM, FF_FULLBRIGHT|FF_TRANSADD|0, 3, {NULL}, 0, 0, S_FLAYM2}, // S_FLAYM1,
|
||||
{SPR_FLAM, FF_FULLBRIGHT|FF_TRANSADD|1, 3, {NULL}, 0, 0, S_FLAYM3}, // S_FLAYM2,
|
||||
{SPR_FLAM, FF_FULLBRIGHT|FF_TRANSADD|2, 3, {NULL}, 0, 0, S_FLAYM4}, // S_FLAYM3,
|
||||
{SPR_FLAM, FF_FULLBRIGHT|FF_TRANSADD|3, 3, {NULL}, 0, 0, S_FLAYM1}, // S_FLAYM4,
|
||||
|
||||
{SPR_DECO, 0, -1, {NULL}, 0, 0, S_NULL}, // S_DEVIL,
|
||||
{SPR_DECO, 1, -1, {NULL}, 0, 0, S_NULL}, // S_ANGEL,
|
||||
|
|
|
|||
|
|
@ -2557,14 +2557,14 @@ boolean P_TryMove(mobj_t *thing, fixed_t x, fixed_t y, boolean allowdropoff)
|
|||
// If the floor difference is MAXSTEPMOVE or less, and the sector isn't Section1:14, ALWAYS
|
||||
// step down! Formerly required a Section1:13 sector for the full MAXSTEPMOVE, but no more.
|
||||
|
||||
if (thingtop == thing->ceilingz && tmceilingz > thingtop && thing->ceilingdrop <= maxstep)
|
||||
if (thingtop == thing->ceilingz && tmceilingz > thingtop && tmceilingz - thingtop <= maxstep)
|
||||
{
|
||||
thing->z = (thing->ceilingz = tmceilingz) - thing->height;
|
||||
thing->ceilingrover = tmceilingrover;
|
||||
thing->eflags |= MFE_JUSTSTEPPEDDOWN;
|
||||
thing->ceilingdrop = 0;
|
||||
}
|
||||
else if (thing->z == thing->floorz && tmfloorz < thing->z && thing->floordrop <= maxstep)
|
||||
else if (thing->z == thing->floorz && tmfloorz < thing->z && thing->z - tmfloorz <= maxstep)
|
||||
{
|
||||
thing->z = thing->floorz = tmfloorz;
|
||||
thing->floorrover = tmfloorrover;
|
||||
|
|
|
|||
|
|
@ -268,6 +268,8 @@ typedef enum
|
|||
MFD_TRANS70 = 0x0070,
|
||||
MFD_TRANS80 = 0x0080,
|
||||
MFD_TRANS90 = 0x0090,
|
||||
MFD_TRANSADD = 0x00A0,
|
||||
MFD_TRANSSUB = 0x00B0,
|
||||
MFD_TRANSMASK = 0x00F0,
|
||||
// Brightness override flags
|
||||
MFD_FULLBRIGHT = 0x0100,
|
||||
|
|
|
|||
|
|
@ -212,7 +212,7 @@ static void Polyobj_GetInfo(polyobj_t *po, line_t *line)
|
|||
if (po->parent == po->id) // do not allow a self-reference
|
||||
po->parent = -1;
|
||||
|
||||
po->translucency = max(min(line->args[2], NUMTRANSMAPS), 0);
|
||||
po->translucency = max(min(line->args[2], NUMEFFECTMAPS), 0);
|
||||
|
||||
po->flags = POF_SOLID|POF_TESTHEIGHT|POF_RENDERSIDES|POF_RENDERPLANES;
|
||||
|
||||
|
|
@ -2563,7 +2563,7 @@ void T_PolyObjFade(polyfade_t *th)
|
|||
{
|
||||
if (po->translucency >= NUMTRANSMAPS)
|
||||
// HACK: OpenGL renders fully opaque when >= NUMTRANSMAPS
|
||||
po->translucency = NUMTRANSMAPS-1;
|
||||
po->translucency = tr_trans90;
|
||||
|
||||
po->flags |= (po->spawnflags & POF_RENDERALL);
|
||||
|
||||
|
|
|
|||
|
|
@ -59,6 +59,8 @@
|
|||
#define FF_TRANS70 (tr_trans70<<FF_TRANSSHIFT)
|
||||
#define FF_TRANS80 (tr_trans80<<FF_TRANSSHIFT)
|
||||
#define FF_TRANS90 (tr_trans90<<FF_TRANSSHIFT)
|
||||
#define FF_TRANSADD (tr_transadd<<FF_TRANSSHIFT)
|
||||
#define FF_TRANSSUB (tr_transsub<<FF_TRANSSHIFT)
|
||||
|
||||
/// \brief Frame flags: frame always appears full bright (mutually exclusive with below, currently takes priority)
|
||||
#define FF_FULLBRIGHT 0x00100000
|
||||
|
|
@ -99,7 +101,10 @@ typedef enum
|
|||
tr_trans70,
|
||||
tr_trans80,
|
||||
tr_trans90,
|
||||
NUMTRANSMAPS
|
||||
NUMTRANSMAPS,
|
||||
tr_transadd = NUMTRANSMAPS,
|
||||
tr_transsub,
|
||||
NUMEFFECTMAPS,
|
||||
} transnum_t;
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -1213,7 +1213,7 @@ static void PolyTranslucency(line_t *line)
|
|||
else
|
||||
po->translucency = value;
|
||||
|
||||
po->translucency = max(min(po->translucency, NUMTRANSMAPS), 0);
|
||||
po->translucency = max(min(po->translucency, NUMEFFECTMAPS), 0);
|
||||
}
|
||||
|
||||
// Makes a polyobject translucency fade and applies tangibility
|
||||
|
|
|
|||
|
|
@ -478,7 +478,7 @@ void P_ResetPlayer(player_t *player)
|
|||
player->powers[pw_carry] = CR_NONE;
|
||||
player->onconveyor = 0;
|
||||
|
||||
player->kartstuff[k_drift] = player->kartstuff[k_driftcharge] = 0;
|
||||
//player->kartstuff[k_drift] = player->kartstuff[k_driftcharge] = 0;
|
||||
player->kartstuff[k_pogospring] = 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -152,6 +152,9 @@ typedef enum
|
|||
FF_GOOWATER = FF_SHATTERBOTTOM, ///< Used with ::FF_SWIMMABLE. Makes thick bouncey goop.
|
||||
} ffloortype_e;
|
||||
|
||||
#define FFLOOR_ALPHA_SPECIAL_ADDITIVE (901)
|
||||
#define FFLOOR_ALPHA_SPECIAL_SUBTRACTIVE (902)
|
||||
|
||||
typedef struct ffloor_s
|
||||
{
|
||||
fixed_t *topheight;
|
||||
|
|
|
|||
|
|
@ -81,7 +81,7 @@ UINT8 *dc_source;
|
|||
// -----------------------
|
||||
// translucency stuff here
|
||||
// -----------------------
|
||||
#define NUMTRANSTABLES 9 // how many translucency tables are used
|
||||
#define NUMTRANSTABLES 11 // how many translucency tables are used
|
||||
|
||||
UINT8 *transtables; // translucency tables
|
||||
|
||||
|
|
@ -172,6 +172,8 @@ void R_InitTranslationTables(void)
|
|||
W_ReadLump(W_GetNumForName("TRANS70"), transtables+0x60000);
|
||||
W_ReadLump(W_GetNumForName("TRANS80"), transtables+0x70000);
|
||||
W_ReadLump(W_GetNumForName("TRANS90"), transtables+0x80000);
|
||||
W_ReadLump(W_GetNumForName("TRANSADD"),transtables+0x90000);
|
||||
W_ReadLump(W_GetNumForName("TRANSSUB"),transtables+0xA0000);
|
||||
}
|
||||
|
||||
/** \brief Retrieves a translation colormap from the cache.
|
||||
|
|
|
|||
|
|
@ -780,7 +780,7 @@ void R_DrawSinglePlane(visplane_t *pl)
|
|||
if (pl->polyobj)
|
||||
{
|
||||
// Hacked up support for alpha value in software mode Tails 09-24-2002 (sidenote: ported to polys 10-15-2014, there was no time travel involved -Red)
|
||||
if (pl->polyobj->translucency >= 10)
|
||||
if (pl->polyobj->translucency >= NUMEFFECTMAPS)
|
||||
return; // Don't even draw it
|
||||
else if (pl->polyobj->translucency > 0)
|
||||
{
|
||||
|
|
@ -841,6 +841,10 @@ void R_DrawSinglePlane(visplane_t *pl)
|
|||
ds_transmap = transtables + ((tr_trans20-1)<<FF_TRANSSHIFT);
|
||||
else if (pl->ffloor->alpha < 243)
|
||||
ds_transmap = transtables + ((tr_trans10-1)<<FF_TRANSSHIFT);
|
||||
else if (pl->ffloor->alpha == FFLOOR_ALPHA_SPECIAL_ADDITIVE)
|
||||
ds_transmap = transtables + ((tr_transadd-1)<<FF_TRANSSHIFT);
|
||||
else if (pl->ffloor->alpha == FFLOOR_ALPHA_SPECIAL_SUBTRACTIVE)
|
||||
ds_transmap = transtables + ((tr_transsub-1)<<FF_TRANSSHIFT);
|
||||
else // Opaque, but allow transparent flat pixels
|
||||
spanfunctype = SPANDRAWFUNC_SPLAT;
|
||||
|
||||
|
|
|
|||
30
src/r_segs.c
30
src/r_segs.c
|
|
@ -279,9 +279,23 @@ static void R_Render2sidedMultiPatchColumn(column_t *column)
|
|||
}
|
||||
}
|
||||
|
||||
transnum_t R_GetLinedefTransTable(fixed_t alpha)
|
||||
transnum_t R_GetLinedefTransTable(line_t *ldef)
|
||||
{
|
||||
return (20*(FRACUNIT - alpha - 1) + FRACUNIT) >> (FRACBITS+1);
|
||||
transnum_t transnum = NUMEFFECTMAPS; // Send back NUMEFFECTMAPS for none
|
||||
fixed_t alpha = ldef->alpha;
|
||||
if (alpha > 0 && alpha < FRACUNIT)
|
||||
transnum = (20*(FRACUNIT - alpha - 1) + FRACUNIT) >> (FRACBITS+1);
|
||||
else
|
||||
{
|
||||
switch (ldef->special)
|
||||
{
|
||||
case 910: transnum = tr_transadd; break;
|
||||
case 911: transnum = tr_transsub; break;
|
||||
default: transnum = NUMEFFECTMAPS; break;
|
||||
}
|
||||
}
|
||||
|
||||
return transnum;
|
||||
}
|
||||
|
||||
void R_RenderMaskedSegRange(drawseg_t *ds, INT32 x1, INT32 x2)
|
||||
|
|
@ -298,6 +312,7 @@ void R_RenderMaskedSegRange(drawseg_t *ds, INT32 x1, INT32 x2)
|
|||
INT32 times, repeats;
|
||||
INT64 overflow_test;
|
||||
INT32 range;
|
||||
transnum_t transtable = NUMEFFECTMAPS;
|
||||
|
||||
// Calculate light table.
|
||||
// Use different light tables
|
||||
|
|
@ -314,9 +329,10 @@ void R_RenderMaskedSegRange(drawseg_t *ds, INT32 x1, INT32 x2)
|
|||
if (!ldef->alpha)
|
||||
return;
|
||||
|
||||
if (ldef->alpha > 0 && ldef->alpha < FRACUNIT)
|
||||
transtable = R_GetLinedefTransTable(ldef);
|
||||
if (transtable != NUMEFFECTMAPS)
|
||||
{
|
||||
dc_transmap = transtables + ((R_GetLinedefTransTable(ldef->alpha) - 1) << FF_TRANSSHIFT);
|
||||
dc_transmap = transtables + ((transtable - 1) << FF_TRANSSHIFT);
|
||||
colfunc = colfuncs[COLDRAWFUNC_FUZZY];
|
||||
|
||||
}
|
||||
|
|
@ -331,7 +347,7 @@ void R_RenderMaskedSegRange(drawseg_t *ds, INT32 x1, INT32 x2)
|
|||
|
||||
if (curline->polyseg && curline->polyseg->translucency > 0)
|
||||
{
|
||||
if (curline->polyseg->translucency >= NUMTRANSMAPS)
|
||||
if (curline->polyseg->translucency >= NUMEFFECTMAPS)
|
||||
return;
|
||||
|
||||
dc_transmap = transtables + ((curline->polyseg->translucency-1)<<FF_TRANSSHIFT);
|
||||
|
|
@ -781,6 +797,10 @@ void R_RenderThickSideRange(drawseg_t *ds, INT32 x1, INT32 x2, ffloor_t *pfloor)
|
|||
dc_transmap = transtables + ((tr_trans20-1)<<FF_TRANSSHIFT);
|
||||
else if (pfloor->alpha < 243)
|
||||
dc_transmap = transtables + ((tr_trans10-1)<<FF_TRANSSHIFT);
|
||||
else if (pfloor->alpha == FFLOOR_ALPHA_SPECIAL_ADDITIVE)
|
||||
dc_transmap = transtables + ((tr_transadd-1)<<FF_TRANSSHIFT);
|
||||
else if (pfloor->alpha == FFLOOR_ALPHA_SPECIAL_SUBTRACTIVE)
|
||||
dc_transmap = transtables + ((tr_transsub-1)<<FF_TRANSSHIFT);
|
||||
else
|
||||
fuzzy = false; // Opaque
|
||||
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@
|
|||
#pragma interface
|
||||
#endif
|
||||
|
||||
transnum_t R_GetLinedefTransTable(fixed_t alpha);
|
||||
transnum_t R_GetLinedefTransTable(line_t *line);
|
||||
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_StoreWallRange(INT32 start, INT32 stop);
|
||||
|
|
|
|||
313
src/s_sound.c
313
src/s_sound.c
|
|
@ -1598,172 +1598,219 @@ static tic_t pause_starttic;
|
|||
/// Music Definitions
|
||||
/// ------------------------
|
||||
|
||||
enum
|
||||
{
|
||||
MUSICDEF_20,
|
||||
};
|
||||
|
||||
musicdef_t *musicdefstart = NULL;
|
||||
struct cursongcredit cursongcredit; // Currently displayed song credit info
|
||||
int musicdef_volume;
|
||||
|
||||
//
|
||||
// search for music definition in wad
|
||||
//
|
||||
static UINT16 W_CheckForMusicDefInPwad(UINT16 wadid)
|
||||
{
|
||||
UINT16 i;
|
||||
lumpinfo_t *lump_p;
|
||||
static boolean
|
||||
MusicDefError
|
||||
(
|
||||
alerttype_t level,
|
||||
const char * description,
|
||||
const char * field,
|
||||
lumpnum_t lumpnum,
|
||||
int line
|
||||
){
|
||||
const wadfile_t * wad = wadfiles[WADFILENUM (lumpnum)];
|
||||
const lumpinfo_t * lump = &wad->lumpinfo[LUMPNUM (lumpnum)];
|
||||
|
||||
lump_p = wadfiles[wadid]->lumpinfo;
|
||||
for (i = 0; i < wadfiles[wadid]->numlumps; i++, lump_p++)
|
||||
if (memcmp(lump_p->name, "MUSICDEF", 8) == 0)
|
||||
return i;
|
||||
CONS_Alert(level,
|
||||
va("%%s|%%s: %s (line %%d)\n", description),
|
||||
wad->filename,
|
||||
lump->fullname,
|
||||
field,
|
||||
line
|
||||
);
|
||||
|
||||
return INT16_MAX; // not found
|
||||
return false;
|
||||
}
|
||||
|
||||
void S_LoadMusicDefs(UINT16 wadnum)
|
||||
{
|
||||
UINT16 lump;
|
||||
char *buf;
|
||||
char *buf2;
|
||||
char *stoken;
|
||||
static boolean
|
||||
ReadMusicDefFields
|
||||
(
|
||||
lumpnum_t lumpnum,
|
||||
int line,
|
||||
char * stoken,
|
||||
musicdef_t ** defp
|
||||
){
|
||||
musicdef_t *def;
|
||||
|
||||
char *value;
|
||||
size_t size;
|
||||
musicdef_t *def, *prev;
|
||||
UINT16 line = 1; // for better error msgs
|
||||
char *textline;
|
||||
|
||||
lump = W_CheckForMusicDefInPwad(wadnum);
|
||||
if (lump == INT16_MAX)
|
||||
return;
|
||||
|
||||
buf = W_CacheLumpNumPwad(wadnum, lump, PU_CACHE);
|
||||
size = W_LumpLengthPwad(wadnum, lump);
|
||||
|
||||
// for strtok
|
||||
buf2 = malloc(size+1);
|
||||
if (!buf2)
|
||||
I_Error("S_LoadMusicDefs: No more free memory\n");
|
||||
M_Memcpy(buf2,buf,size);
|
||||
buf2[size] = '\0';
|
||||
|
||||
def = prev = NULL;
|
||||
|
||||
stoken = strtok (buf2, "\r\n ");
|
||||
// Find music def
|
||||
while (stoken)
|
||||
if (!stricmp(stoken, "lump"))
|
||||
{
|
||||
/*if ((stoken[0] == '/' && stoken[1] == '/')
|
||||
|| (stoken[0] == '#')) // skip comments
|
||||
value = strtok(NULL, " ");
|
||||
if (!value)
|
||||
{
|
||||
stoken = strtok(NULL, "\r\n"); // skip end of line
|
||||
if (def)
|
||||
stoken = strtok(NULL, "\r\n= ");
|
||||
else
|
||||
stoken = strtok(NULL, "\r\n ");
|
||||
line++;
|
||||
}
|
||||
else*/ if (!stricmp(stoken, "lump"))
|
||||
{
|
||||
value = strtok(NULL, "\r\n ");
|
||||
|
||||
if (!value)
|
||||
{
|
||||
CONS_Alert(CONS_WARNING, "MUSICDEF: Lump '%s' is missing name. (file %s, line %d)\n", stoken, wadfiles[wadnum]->filename, line);
|
||||
stoken = strtok(NULL, "\r\n"); // skip end of line
|
||||
goto skip_lump;
|
||||
}
|
||||
|
||||
// No existing musicdefs
|
||||
if (!musicdefstart)
|
||||
{
|
||||
musicdefstart = Z_Calloc(sizeof (musicdef_t), PU_STATIC, NULL);
|
||||
STRBUFCPY(musicdefstart->name, value);
|
||||
strlwr(musicdefstart->name);
|
||||
def = musicdefstart;
|
||||
//CONS_Printf("S_LoadMusicDefs: Initialized musicdef w/ song '%s'\n", def->name);
|
||||
}
|
||||
else
|
||||
{
|
||||
def = musicdefstart;
|
||||
|
||||
// Search if this is a replacement
|
||||
//CONS_Printf("S_LoadMusicDefs: Searching for song replacement...\n");
|
||||
while (def)
|
||||
{
|
||||
if (!stricmp(def->name, value))
|
||||
{
|
||||
//CONS_Printf("S_LoadMusicDefs: Found song replacement '%s'\n", def->name);
|
||||
break;
|
||||
}
|
||||
|
||||
prev = def;
|
||||
def = def->next;
|
||||
}
|
||||
|
||||
// Nothing found, add to the end.
|
||||
if (!def)
|
||||
{
|
||||
def = Z_Calloc(sizeof (musicdef_t), PU_STATIC, NULL);
|
||||
STRBUFCPY(def->name, value);
|
||||
strlwr(def->name);
|
||||
if (prev != NULL)
|
||||
prev->next = def;
|
||||
//CONS_Printf("S_LoadMusicDefs: Added song '%s'\n", def->name);
|
||||
}
|
||||
}
|
||||
|
||||
def->volume = DEFAULT_MUSICDEF_VOLUME;
|
||||
|
||||
skip_lump:
|
||||
stoken = strtok(NULL, "\r\n ");
|
||||
line++;
|
||||
return MusicDefError(CONS_WARNING,
|
||||
"Field '%'s is missing name.",
|
||||
stoken, lumpnum, line);
|
||||
}
|
||||
else
|
||||
{
|
||||
value = strtok(NULL, "\r\n= ");
|
||||
musicdef_t **tail = &musicdefstart;
|
||||
|
||||
if (!value)
|
||||
// Search if this is a replacement
|
||||
while (*tail)
|
||||
{
|
||||
CONS_Alert(CONS_WARNING, "MUSICDEF: Field '%s' is missing value. (file %s, line %d)\n", stoken, wadfiles[wadnum]->filename, line);
|
||||
stoken = strtok(NULL, "\r\n"); // skip end of line
|
||||
goto skip_field;
|
||||
if (!stricmp((*tail)->name, value))
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
tail = &(*tail)->next;
|
||||
}
|
||||
|
||||
// Nothing found, add to the end.
|
||||
if (!(*tail))
|
||||
{
|
||||
def = Z_Calloc(sizeof (musicdef_t), PU_STATIC, NULL);
|
||||
|
||||
STRBUFCPY(def->name, value);
|
||||
strlwr(def->name);
|
||||
def->volume = DEFAULT_MUSICDEF_VOLUME;
|
||||
|
||||
(*tail) = def;
|
||||
}
|
||||
|
||||
(*defp) = (*tail);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
value = strtok(NULL, "");
|
||||
|
||||
if (value)
|
||||
{
|
||||
// Find the equals sign.
|
||||
value = strchr(value, '=');
|
||||
}
|
||||
|
||||
if (!value)
|
||||
{
|
||||
return MusicDefError(CONS_WARNING,
|
||||
"Field '%s' is missing value.",
|
||||
stoken, lumpnum, line);
|
||||
}
|
||||
else
|
||||
{
|
||||
def = (*defp);
|
||||
|
||||
if (!def)
|
||||
{
|
||||
CONS_Alert(CONS_ERROR, "MUSICDEF: No music definition before field '%s'. (file %s, line %d)\n", stoken, wadfiles[wadnum]->filename, line);
|
||||
free(buf2);
|
||||
return;
|
||||
return MusicDefError(CONS_ERROR,
|
||||
"No music definition before field '%s'.",
|
||||
stoken, lumpnum, line);
|
||||
}
|
||||
|
||||
// Skip the equals sign.
|
||||
value++;
|
||||
|
||||
// Now skip funny whitespace.
|
||||
value += strspn(value, "\t ");
|
||||
|
||||
textline = value;
|
||||
|
||||
/* based ignored lumps */
|
||||
if (!stricmp(stoken, "usage")) {
|
||||
#if 0 // Ignore for now
|
||||
STRBUFCPY(def->usage, value);
|
||||
for (value = def->usage; *value; value++)
|
||||
if (*value == '_') *value = ' '; // turn _ into spaces.
|
||||
//CONS_Printf("S_LoadMusicDefs: Set usage to '%s'\n", def->usage);
|
||||
STRBUFCPY(def->usage, textline);
|
||||
#endif
|
||||
} else if (!stricmp(stoken, "source")) {
|
||||
STRBUFCPY(def->source, value);
|
||||
for (value = def->source; *value; value++)
|
||||
if (*value == '_') *value = ' '; // turn _ into spaces.
|
||||
//CONS_Printf("S_LoadMusicDefs: Set source to '%s'\n", def->source);
|
||||
STRBUFCPY(def->source, textline);
|
||||
} else if (!stricmp(stoken, "volume")) {
|
||||
def->volume = atoi(value);
|
||||
def->volume = atoi(textline);
|
||||
} else {
|
||||
CONS_Alert(CONS_WARNING, "MUSICDEF: Invalid field '%s'. (file %s, line %d)\n", stoken, wadfiles[wadnum]->filename, line);
|
||||
MusicDefError(CONS_WARNING,
|
||||
"Unknown field '%s'.",
|
||||
stoken, lumpnum, line);
|
||||
}
|
||||
|
||||
skip_field:
|
||||
stoken = strtok(NULL, "\r\n= ");
|
||||
line++;
|
||||
}
|
||||
}
|
||||
|
||||
free(buf2);
|
||||
return;
|
||||
return true;
|
||||
}
|
||||
|
||||
static void S_LoadMusicDefLump(lumpnum_t lumpnum)
|
||||
{
|
||||
char *lump;
|
||||
char *musdeftext;
|
||||
size_t size;
|
||||
|
||||
char *lf;
|
||||
char *stoken;
|
||||
|
||||
size_t nlf;
|
||||
size_t ncr;
|
||||
|
||||
musicdef_t *def = NULL;
|
||||
int line = 1; // for better error msgs
|
||||
|
||||
lump = W_CacheLumpNum(lumpnum, PU_CACHE);
|
||||
size = W_LumpLength(lumpnum);
|
||||
|
||||
// Null-terminated MUSICDEF lump.
|
||||
musdeftext = malloc(size+1);
|
||||
if (!musdeftext)
|
||||
I_Error("S_LoadMusicDefs: No more free memory for the parser\n");
|
||||
M_Memcpy(musdeftext, lump, size);
|
||||
musdeftext[size] = '\0';
|
||||
|
||||
// Find music def
|
||||
stoken = musdeftext;
|
||||
for (;;)
|
||||
{
|
||||
lf = strpbrk(stoken, "\r\n");
|
||||
if (lf)
|
||||
{
|
||||
if (*lf == '\n')
|
||||
nlf = 1;
|
||||
else
|
||||
nlf = 0;
|
||||
*lf++ = '\0';/* now we can delimit to here */
|
||||
}
|
||||
|
||||
stoken = strtok(stoken, " ");
|
||||
if (stoken)
|
||||
{
|
||||
if (! ReadMusicDefFields(lumpnum, line, stoken, &def))
|
||||
break;
|
||||
}
|
||||
|
||||
if (lf)
|
||||
{
|
||||
do
|
||||
{
|
||||
line += nlf;
|
||||
ncr = strspn(lf, "\r");/* skip CR */
|
||||
lf += ncr;
|
||||
nlf = strspn(lf, "\n");
|
||||
lf += nlf;
|
||||
}
|
||||
while (nlf || ncr) ;
|
||||
|
||||
stoken = lf;/* now the next nonempty line */
|
||||
}
|
||||
else
|
||||
break;/* EOF */
|
||||
}
|
||||
|
||||
free(musdeftext);
|
||||
}
|
||||
|
||||
void S_LoadMusicDefs(UINT16 wad)
|
||||
{
|
||||
const lumpnum_t wadnum = wad << 16;
|
||||
|
||||
UINT16 lump = 0;
|
||||
|
||||
while (( lump = W_CheckNumForNamePwad("MUSICDEF", wad, lump) ) != INT16_MAX)
|
||||
{
|
||||
S_LoadMusicDefLump(wadnum | lump);
|
||||
|
||||
lump++;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
|
|
|
|||
|
|
@ -118,13 +118,16 @@ anchor_height
|
|||
const mapthing_t * a,
|
||||
const sector_t * s
|
||||
){
|
||||
const fixed_t x = a->x << FRACBITS;
|
||||
const fixed_t y = a->y << FRACBITS;
|
||||
|
||||
if (a->options & MTF_OBJECTFLIP)
|
||||
{
|
||||
return ( s->ceilingheight >> FRACBITS ) - a->z;
|
||||
return ( P_GetSectorCeilingZAt(s, x, y) >> FRACBITS ) - a->z;
|
||||
}
|
||||
else
|
||||
{
|
||||
return ( s->floorheight >> FRACBITS ) + a->z;
|
||||
return ( P_GetSectorFloorZAt(s, x, y) >> FRACBITS ) + a->z;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -144,13 +147,13 @@ set_anchor
|
|||
|
||||
fixed_t closeness;
|
||||
|
||||
a->z = anchor_height(a, sub->sector);
|
||||
|
||||
v = nearest_point(&closeness, a, sub->sector);
|
||||
|
||||
a->x = ( v->x >> FRACBITS );
|
||||
a->y = ( v->y >> FRACBITS );
|
||||
|
||||
a->z = anchor_height(a, sub->sector);
|
||||
|
||||
list->anchors [list->count] = a;
|
||||
list->points [list->count] = v;
|
||||
list->closeness[list->count] = closeness;
|
||||
|
|
|
|||
|
|
@ -62,7 +62,7 @@ enum
|
|||
PU_CACHE_UNLOCKED = 101, // Note: unused
|
||||
PU_HWRCACHE_UNLOCKED = 102, // 'unlocked' PU_HWRCACHE memory:
|
||||
// 'second-level' cache for graphics
|
||||
// stored in hardware format and downloaded as needed
|
||||
// stored in hardware format and downloaded as needed
|
||||
PU_HWRPATCHINFO_UNLOCKED = 103, // 'unlocked' PU_HWRPATCHINFO memory
|
||||
PU_HWRMODELTEXTURE_UNLOCKED = 104, // 'unlocked' PU_HWRMODELTEXTURE memory
|
||||
};
|
||||
|
|
|
|||
|
|
@ -54,9 +54,8 @@ main (int ac, char **av)
|
|||
if (( var = strtok(buf, " =") ))
|
||||
{
|
||||
if (!(
|
||||
strcasecmp(var, "TITLE") &&
|
||||
strcasecmp(var, "ALTTITLE") &&
|
||||
strcasecmp(var, "AUTHORS")
|
||||
strcasecmp(var, "USAGE") &&
|
||||
strcasecmp(var, "SOURCE")
|
||||
)){
|
||||
if (( val = strtok(0, "") ))
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue