This commit is contained in:
Rachael Alexanderson 2017-05-07 05:07:22 -04:00
commit 0941cda7cc
14 changed files with 334 additions and 67 deletions

View file

@ -52,6 +52,7 @@
#include "p_tags.h" #include "p_tags.h"
#include "r_state.h" #include "r_state.h"
#include "w_wad.h" #include "w_wad.h"
#include "textures.h"
#include "g_levellocals.h" #include "g_levellocals.h"
// MACROS ------------------------------------------------------------------ // MACROS ------------------------------------------------------------------
@ -80,13 +81,15 @@ enum
CP_SETSPECIAL, CP_SETSPECIAL,
CP_CLEARSPECIAL, CP_CLEARSPECIAL,
CP_SETACTIVATION, CP_SETACTIVATION,
CP_SECTORFLOOROFFSET, CP_SETSECTOROFFSET,
CP_SETSECTORSPECIAL, CP_SETSECTORSPECIAL,
CP_SETWALLYSCALE, CP_SETWALLYSCALE,
CP_SETWALLTEXTURE,
CP_SETTHINGZ, CP_SETTHINGZ,
CP_SETTAG, CP_SETTAG,
CP_SETTHINGFLAGS, CP_SETTHINGFLAGS,
CP_SETVERTEX, CP_SETVERTEX,
CP_SETTHINGSKILLS,
}; };
// EXTERNAL FUNCTION PROTOTYPES -------------------------------------------- // EXTERNAL FUNCTION PROTOTYPES --------------------------------------------
@ -166,8 +169,14 @@ static const char *const WallTiers[] =
"Top", "Mid", "Bot", NULL "Top", "Mid", "Bot", NULL
}; };
static const char *const SectorPlanes[] =
{
"floor", "ceil", NULL
};
static TArray<int> CompatParams; static TArray<int> CompatParams;
static int ii_compatparams; static int ii_compatparams;
static TArray<FString> TexNames;
// CODE -------------------------------------------------------------------- // CODE --------------------------------------------------------------------
@ -288,12 +297,14 @@ void ParseCompatibility()
sc.MustGetNumber(); sc.MustGetNumber();
CompatParams.Push(sc.Number); CompatParams.Push(sc.Number);
} }
else if (sc.Compare("sectorflooroffset")) else if (sc.Compare("setsectoroffset"))
{ {
if (flags.ExtCommandIndex == ~0u) flags.ExtCommandIndex = CompatParams.Size(); if (flags.ExtCommandIndex == ~0u) flags.ExtCommandIndex = CompatParams.Size();
CompatParams.Push(CP_SECTORFLOOROFFSET); CompatParams.Push(CP_SETSECTOROFFSET);
sc.MustGetNumber(); sc.MustGetNumber();
CompatParams.Push(sc.Number); CompatParams.Push(sc.Number);
sc.MustGetString();
CompatParams.Push(sc.MustMatchString(SectorPlanes));
sc.MustGetFloat(); sc.MustGetFloat();
CompatParams.Push(int(sc.Float*65536.)); CompatParams.Push(int(sc.Float*65536.));
} }
@ -319,6 +330,26 @@ void ParseCompatibility()
sc.MustGetFloat(); sc.MustGetFloat();
CompatParams.Push(int(sc.Float*65536.)); CompatParams.Push(int(sc.Float*65536.));
} }
else if (sc.Compare("setwalltexture"))
{
if (flags.ExtCommandIndex == ~0u) flags.ExtCommandIndex = CompatParams.Size();
CompatParams.Push(CP_SETWALLTEXTURE);
sc.MustGetNumber();
CompatParams.Push(sc.Number);
sc.MustGetString();
CompatParams.Push(sc.MustMatchString(LineSides));
sc.MustGetString();
CompatParams.Push(sc.MustMatchString(WallTiers));
sc.MustGetString();
const FString texName = sc.String;
const unsigned int texIndex = TexNames.Find(texName);
const unsigned int texCount = TexNames.Size();
if (texIndex == texCount)
{
TexNames.Push(texName);
}
CompatParams.Push(texIndex);
}
else if (sc.Compare("setthingz")) else if (sc.Compare("setthingz"))
{ {
if (flags.ExtCommandIndex == ~0u) flags.ExtCommandIndex = CompatParams.Size(); if (flags.ExtCommandIndex == ~0u) flags.ExtCommandIndex = CompatParams.Size();
@ -358,6 +389,15 @@ void ParseCompatibility()
CompatParams.Push(int(sc.Float * 256)); // do not use full fixed here so that it can eventually handle larger levels CompatParams.Push(int(sc.Float * 256)); // do not use full fixed here so that it can eventually handle larger levels
flags.CompatFlags[SLOT_BCOMPAT] |= BCOMPATF_REBUILDNODES; flags.CompatFlags[SLOT_BCOMPAT] |= BCOMPATF_REBUILDNODES;
} }
else if (sc.Compare("setthingskills"))
{
if (flags.ExtCommandIndex == ~0u) flags.ExtCommandIndex = CompatParams.Size();
CompatParams.Push(CP_SETTHINGSKILLS);
sc.MustGetNumber();
CompatParams.Push(sc.Number);
sc.MustGetNumber();
CompatParams.Push(sc.Number);
}
else else
{ {
sc.UnGet(); sc.UnGet();
@ -542,16 +582,19 @@ void SetCompatibilityParams()
i += 3; i += 3;
break; break;
} }
case CP_SECTORFLOOROFFSET: case CP_SETSECTOROFFSET:
{ {
if ((unsigned)CompatParams[i+1] < level.sectors.Size()) if ((unsigned)CompatParams[i+1] < level.sectors.Size())
{ {
sector_t *sec = &level.sectors[CompatParams[i+1]]; sector_t *sec = &level.sectors[CompatParams[i+1]];
const double delta = CompatParams[i + 2] / 65536.0; const double delta = CompatParams[i + 3] / 65536.0;
sec->floorplane.ChangeHeight(delta); secplane_t& plane = sector_t::floor == CompatParams[i + 2]
sec->ChangePlaneTexZ(sector_t::floor, delta); ? sec->floorplane
: sec->ceilingplane;
plane.ChangeHeight(delta);
sec->ChangePlaneTexZ(CompatParams[i + 2], delta);
} }
i += 3; i += 4;
break; break;
} }
case CP_SETSECTORSPECIAL: case CP_SETSECTORSPECIAL:
@ -577,6 +620,21 @@ void SetCompatibilityParams()
i += 5; i += 5;
break; break;
} }
case CP_SETWALLTEXTURE:
{
if ((unsigned)CompatParams[i + 1] < level.lines.Size())
{
side_t *side = level.lines[CompatParams[i + 1]].sidedef[CompatParams[i + 2]];
if (side != NULL)
{
assert(TexNames.Size() > (unsigned int)CompatParams[i + 4]);
const FTextureID texID = TexMan.GetTexture(TexNames[CompatParams[i + 4]], FTexture::TEX_Any);
side->SetTexture(CompatParams[i + 3], texID);
}
}
i += 5;
break;
}
case CP_SETTHINGZ: case CP_SETTHINGZ:
{ {
// When this is called, the things haven't been spawned yet so we can alter the position inside the MapThings array. // When this is called, the things haven't been spawned yet so we can alter the position inside the MapThings array.
@ -623,6 +681,15 @@ void SetCompatibilityParams()
i += 4; i += 4;
break; break;
} }
case CP_SETTHINGSKILLS:
{
if ((unsigned)CompatParams[i + 1] < MapThingsConverted.Size())
{
MapThingsConverted[CompatParams[i + 1]].SkillFilter = CompatParams[i + 2];
}
i += 3;
break;
}
} }
} }
} }

View file

@ -71,6 +71,10 @@
#include "swrenderer/scene/r_light.h" #include "swrenderer/scene/r_light.h"
#ifndef NO_SSE
#include <immintrin.h>
#endif
CVAR(Int, gl_showpacks, 0, 0) CVAR(Int, gl_showpacks, 0, 0)
#ifndef WIN32 // Defined in fb_d3d9 for Windows #ifndef WIN32 // Defined in fb_d3d9 for Windows
CVAR(Bool, vid_hwaalines, true, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) CVAR(Bool, vid_hwaalines, true, CVAR_ARCHIVE | CVAR_GLOBALCONFIG)
@ -2383,6 +2387,41 @@ bool OpenGLSWFrameBuffer::OpenGLPal::Update()
// See explanation in UploadPalette() for skipat rationale. // See explanation in UploadPalette() for skipat rationale.
skipat = MIN(numEntries, DoColorSkip ? 256 - 8 : 256); skipat = MIN(numEntries, DoColorSkip ? 256 - 8 : 256);
#ifndef NO_SSE
// Manual SSE vectorized version here to workaround a bug in GCC's auto-vectorizer
int sse_count = skipat / 4 * 4;
for (i = 0; i < sse_count; i += 4)
{
_mm_storeu_si128((__m128i*)(&buff[i]), _mm_loadu_si128((__m128i*)(&pal[i])));
}
switch (skipat - i)
{
// fall through is intentional
case 3: buff[i] = pal[i].d; i++;
case 2: buff[i] = pal[i].d; i++;
case 1: buff[i] = pal[i].d; i++;
default: i++;
}
sse_count = numEntries / 4 * 4;
__m128i alphamask = _mm_set1_epi32(0xff000000);
while (i < sse_count)
{
__m128i lastcolor = _mm_loadu_si128((__m128i*)(&pal[i - 1]));
__m128i color = _mm_loadu_si128((__m128i*)(&pal[i]));
_mm_storeu_si128((__m128i*)(&buff[i]), _mm_or_si128(_mm_and_si128(alphamask, color), _mm_andnot_si128(alphamask, lastcolor)));
i += 4;
}
switch (numEntries - i)
{
// fall through is intentional
case 3: buff[i] = ColorARGB(pal[i].a, pal[i - 1].r, pal[i - 1].g, pal[i - 1].b); i++;
case 2: buff[i] = ColorARGB(pal[i].a, pal[i - 1].r, pal[i - 1].g, pal[i - 1].b); i++;
case 1: buff[i] = ColorARGB(pal[i].a, pal[i - 1].r, pal[i - 1].g, pal[i - 1].b); i++;
default: break;
}
#else
for (i = 0; i < skipat; ++i) for (i = 0; i < skipat; ++i)
{ {
buff[i] = ColorARGB(pal[i].a, pal[i].r, pal[i].g, pal[i].b); buff[i] = ColorARGB(pal[i].a, pal[i].r, pal[i].g, pal[i].b);
@ -2391,6 +2430,7 @@ bool OpenGLSWFrameBuffer::OpenGLPal::Update()
{ {
buff[i] = ColorARGB(pal[i].a, pal[i - 1].r, pal[i - 1].g, pal[i - 1].b); buff[i] = ColorARGB(pal[i].a, pal[i - 1].r, pal[i - 1].g, pal[i - 1].b);
} }
#endif
if (numEntries > 1) if (numEntries > 1)
{ {
i = numEntries - 1; i = numEntries - 1;
@ -2544,7 +2584,7 @@ void OpenGLSWFrameBuffer::DoDim(PalEntry color, float amount, int x1, int y1, in
} }
if (In2D < 2) if (In2D < 2)
{ {
Super::Dim(color, amount, x1, y1, w, h); Super::DoDim(color, amount, x1, y1, w, h);
return; return;
} }
if (!InScene) if (!InScene)

View file

@ -69,6 +69,7 @@ PClass *DefaultListMenuClass;
PClass *DefaultOptionMenuClass; PClass *DefaultOptionMenuClass;
void I_BuildALDeviceList(FOptionValues *opt); void I_BuildALDeviceList(FOptionValues *opt);
void I_BuildALResamplersList(FOptionValues *opt);
DEFINE_GLOBAL_NAMED(OptionSettings, OptionMenuSettings) DEFINE_GLOBAL_NAMED(OptionSettings, OptionMenuSettings)
@ -1433,6 +1434,11 @@ void M_CreateMenus()
{ {
I_BuildALDeviceList(*opt); I_BuildALDeviceList(*opt);
} }
opt = OptionValues.CheckKey(NAME_Alresamplers);
if (opt != nullptr)
{
I_BuildALResamplersList(*opt);
}
} }
//============================================================================= //=============================================================================

View file

@ -713,6 +713,7 @@ xx(Crosshairs)
xx(Colorpickermenu) xx(Colorpickermenu)
xx(Mididevices) xx(Mididevices)
xx(Aldevices) xx(Aldevices)
xx(Alresamplers)
xx(CustomizeControls) xx(CustomizeControls)
xx(MessageOptions) xx(MessageOptions)
xx(AutomapOptions) xx(AutomapOptions)

View file

@ -82,15 +82,16 @@ bool RenderPolyWall::RenderLine(const TriMatrix &worldToClip, const PolyClipPlan
double frontfloorz1 = frontsector->floorplane.ZatPoint(line->v1); double frontfloorz1 = frontsector->floorplane.ZatPoint(line->v1);
double frontceilz2 = frontsector->ceilingplane.ZatPoint(line->v2); double frontceilz2 = frontsector->ceilingplane.ZatPoint(line->v2);
double frontfloorz2 = frontsector->floorplane.ZatPoint(line->v2); double frontfloorz2 = frontsector->floorplane.ZatPoint(line->v2);
double topTexZ = frontsector->GetPlaneTexZ(sector_t::ceiling);
double bottomTexZ = frontsector->GetPlaneTexZ(sector_t::floor);
if (line->backsector == nullptr) if (line->backsector == nullptr)
{ {
if (line->sidedef) if (line->sidedef)
{ {
wall.SetCoords(line->v1->fPos(), line->v2->fPos(), frontceilz1, frontfloorz1, frontceilz2, frontfloorz2); wall.SetCoords(line->v1->fPos(), line->v2->fPos(), frontceilz1, frontfloorz1, frontceilz2, frontfloorz2);
wall.TopZ = frontceilz1; wall.TopTexZ = topTexZ;
wall.BottomZ = frontfloorz1; wall.BottomTexZ = bottomTexZ;
wall.UnpeggedCeil = frontceilz1;
wall.Texpart = side_t::mid; wall.Texpart = side_t::mid;
wall.Polyportal = polyportal; wall.Polyportal = polyportal;
wall.Render(worldToClip, clipPlane, cull); wall.Render(worldToClip, clipPlane, cull);
@ -125,9 +126,8 @@ bool RenderPolyWall::RenderLine(const TriMatrix &worldToClip, const PolyClipPlan
if ((topceilz1 > topfloorz1 || topceilz2 > topfloorz2) && line->sidedef && !bothSkyCeiling) if ((topceilz1 > topfloorz1 || topceilz2 > topfloorz2) && line->sidedef && !bothSkyCeiling)
{ {
wall.SetCoords(line->v1->fPos(), line->v2->fPos(), topceilz1, topfloorz1, topceilz2, topfloorz2); wall.SetCoords(line->v1->fPos(), line->v2->fPos(), topceilz1, topfloorz1, topceilz2, topfloorz2);
wall.TopZ = topceilz1; wall.TopTexZ = topTexZ;
wall.BottomZ = topfloorz1; wall.BottomTexZ = MIN(topfloorz1, topfloorz2);
wall.UnpeggedCeil = topceilz1;
wall.Texpart = side_t::top; wall.Texpart = side_t::top;
wall.Render(worldToClip, clipPlane, cull); wall.Render(worldToClip, clipPlane, cull);
} }
@ -135,9 +135,10 @@ bool RenderPolyWall::RenderLine(const TriMatrix &worldToClip, const PolyClipPlan
if ((bottomfloorz1 < bottomceilz1 || bottomfloorz2 < bottomceilz2) && line->sidedef && !bothSkyFloor) if ((bottomfloorz1 < bottomceilz1 || bottomfloorz2 < bottomceilz2) && line->sidedef && !bothSkyFloor)
{ {
wall.SetCoords(line->v1->fPos(), line->v2->fPos(), bottomceilz1, bottomfloorz1, bottomceilz2, bottomfloorz2); wall.SetCoords(line->v1->fPos(), line->v2->fPos(), bottomceilz1, bottomfloorz1, bottomceilz2, bottomfloorz2);
wall.TopZ = bottomceilz1; wall.TopTexZ = MAX(bottomceilz1, bottomceilz2);
wall.BottomZ = bottomfloorz2; wall.BottomTexZ = bottomTexZ;
wall.UnpeggedCeil = topceilz1; wall.UnpeggedCeil1 = topceilz1;
wall.UnpeggedCeil2 = topceilz2;
wall.Texpart = side_t::bottom; wall.Texpart = side_t::bottom;
wall.Render(worldToClip, clipPlane, cull); wall.Render(worldToClip, clipPlane, cull);
} }
@ -145,9 +146,8 @@ bool RenderPolyWall::RenderLine(const TriMatrix &worldToClip, const PolyClipPlan
if (line->sidedef) if (line->sidedef)
{ {
wall.SetCoords(line->v1->fPos(), line->v2->fPos(), middleceilz1, middlefloorz1, middleceilz2, middlefloorz2); wall.SetCoords(line->v1->fPos(), line->v2->fPos(), middleceilz1, middlefloorz1, middleceilz2, middlefloorz2);
wall.TopZ = middleceilz1; wall.TopTexZ = MAX(middleceilz1, middleceilz2);
wall.BottomZ = middlefloorz1; wall.BottomTexZ = MIN(middlefloorz1, middlefloorz2);
wall.UnpeggedCeil = topceilz1;
wall.Texpart = side_t::mid; wall.Texpart = side_t::mid;
wall.Masked = true; wall.Masked = true;
@ -171,6 +171,8 @@ void RenderPolyWall::Render3DFloorLine(const TriMatrix &worldToClip, const PolyC
double frontfloorz1 = fakeFloor->bottom.plane->ZatPoint(line->v1); double frontfloorz1 = fakeFloor->bottom.plane->ZatPoint(line->v1);
double frontceilz2 = fakeFloor->top.plane->ZatPoint(line->v2); double frontceilz2 = fakeFloor->top.plane->ZatPoint(line->v2);
double frontfloorz2 = fakeFloor->bottom.plane->ZatPoint(line->v2); double frontfloorz2 = fakeFloor->bottom.plane->ZatPoint(line->v2);
double topTexZ = frontsector->GetPlaneTexZ(sector_t::ceiling);
double bottomTexZ = frontsector->GetPlaneTexZ(sector_t::floor);
RenderPolyWall wall; RenderPolyWall wall;
wall.LineSeg = line; wall.LineSeg = line;
@ -181,9 +183,10 @@ void RenderPolyWall::Render3DFloorLine(const TriMatrix &worldToClip, const PolyC
wall.SubsectorDepth = subsectorDepth; wall.SubsectorDepth = subsectorDepth;
wall.StencilValue = stencilValue; wall.StencilValue = stencilValue;
wall.SetCoords(line->v1->fPos(), line->v2->fPos(), frontceilz1, frontfloorz1, frontceilz2, frontfloorz2); wall.SetCoords(line->v1->fPos(), line->v2->fPos(), frontceilz1, frontfloorz1, frontceilz2, frontfloorz2);
wall.TopZ = frontceilz1; wall.TopTexZ = topTexZ;
wall.BottomZ = frontfloorz1; wall.BottomTexZ = bottomTexZ;
wall.UnpeggedCeil = frontceilz1; wall.UnpeggedCeil1 = frontceilz1;
wall.UnpeggedCeil2 = frontceilz2;
wall.Texpart = side_t::mid; wall.Texpart = side_t::mid;
wall.Render(worldToClip, clipPlane, cull); wall.Render(worldToClip, clipPlane, cull);
} }
@ -229,15 +232,17 @@ void RenderPolyWall::Render(const TriMatrix &worldToClip, const PolyClipPlane &c
if (tex) if (tex)
{ {
PolyWallTextureCoords texcoords(tex, LineSeg, Line, Side, Texpart, TopZ, BottomZ, UnpeggedCeil); PolyWallTextureCoordsU texcoordsU(tex, LineSeg, Line, Side, Texpart);
vertices[0].u = (float)texcoords.u1; PolyWallTextureCoordsV texcoordsVLeft(tex, Line, Side, Texpart, ceil1, floor1, UnpeggedCeil1, TopTexZ, BottomTexZ);
vertices[0].v = (float)texcoords.v1; PolyWallTextureCoordsV texcoordsVRght(tex, Line, Side, Texpart, ceil2, floor2, UnpeggedCeil2, TopTexZ, BottomTexZ);
vertices[1].u = (float)texcoords.u2; vertices[0].u = (float)texcoordsU.u1;
vertices[1].v = (float)texcoords.v1; vertices[0].v = (float)texcoordsVLeft.v1;
vertices[2].u = (float)texcoords.u2; vertices[1].u = (float)texcoordsU.u2;
vertices[2].v = (float)texcoords.v2; vertices[1].v = (float)texcoordsVRght.v1;
vertices[3].u = (float)texcoords.u1; vertices[2].u = (float)texcoordsU.u2;
vertices[3].v = (float)texcoords.v2; vertices[2].v = (float)texcoordsVRght.v2;
vertices[3].u = (float)texcoordsU.u1;
vertices[3].v = (float)texcoordsVLeft.v2;
} }
// Masked walls clamp to the 0-1 range (no texture repeat) // Masked walls clamp to the 0-1 range (no texture repeat)
@ -356,13 +361,7 @@ int RenderPolyWall::GetLightLevel()
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
PolyWallTextureCoords::PolyWallTextureCoords(FTexture *tex, const seg_t *lineseg, const line_t *line, const side_t *side, side_t::ETexpart texpart, double topz, double bottomz, double unpeggedceil) PolyWallTextureCoordsU::PolyWallTextureCoordsU(FTexture *tex, const seg_t *lineseg, const line_t *line, const side_t *side, side_t::ETexpart texpart)
{
CalcU(tex, lineseg, line, side, texpart);
CalcV(tex, line, side, texpart, topz, bottomz, unpeggedceil);
}
void PolyWallTextureCoords::CalcU(FTexture *tex, const seg_t *lineseg, const line_t *line, const side_t *side, side_t::ETexpart texpart)
{ {
double lineLength = side->TexelLength; double lineLength = side->TexelLength;
double lineStart = 0.0; double lineStart = 0.0;
@ -384,7 +383,9 @@ void PolyWallTextureCoords::CalcU(FTexture *tex, const seg_t *lineseg, const lin
u2 /= texWidth; u2 /= texWidth;
} }
void PolyWallTextureCoords::CalcV(FTexture *tex, const line_t *line, const side_t *side, side_t::ETexpart texpart, double topz, double bottomz, double unpeggedceil) /////////////////////////////////////////////////////////////////////////////
PolyWallTextureCoordsV::PolyWallTextureCoordsV(FTexture *tex, const line_t *line, const side_t *side, side_t::ETexpart texpart, double topz, double bottomz, double unpeggedceil, double topTexZ, double bottomTexZ)
{ {
double vscale = side->GetTextureYScale(texpart) * tex->Scale.Y; double vscale = side->GetTextureYScale(texpart) * tex->Scale.Y;
@ -396,22 +397,33 @@ void PolyWallTextureCoords::CalcV(FTexture *tex, const line_t *line, const side_
{ {
default: default:
case side_t::mid: case side_t::mid:
CalcVMidPart(tex, line, side, topz, bottomz, vscale, yoffset); CalcVMidPart(tex, line, side, topTexZ, bottomTexZ, vscale, yoffset);
break; break;
case side_t::top: case side_t::top:
CalcVTopPart(tex, line, side, topz, bottomz, vscale, yoffset); CalcVTopPart(tex, line, side, topTexZ, bottomTexZ, vscale, yoffset);
break; break;
case side_t::bottom: case side_t::bottom:
CalcVBottomPart(tex, line, side, topz, bottomz, unpeggedceil, vscale, yoffset); CalcVBottomPart(tex, line, side, topTexZ, bottomTexZ, unpeggedceil, vscale, yoffset);
break; break;
} }
int texHeight = tex->GetHeight(); int texHeight = tex->GetHeight();
v1 /= texHeight; v1 /= texHeight;
v2 /= texHeight; v2 /= texHeight;
double texZHeight = (bottomTexZ - topTexZ);
if (texZHeight > 0.0f || texZHeight < -0.0f)
{
double t1 = (topz - topTexZ) / texZHeight;
double t2 = (bottomz - topTexZ) / texZHeight;
double vorig1 = v1;
double vorig2 = v2;
v1 = vorig1 * (1.0f - t1) + vorig2 * t1;
v2 = vorig1 * (1.0f - t2) + vorig2 * t2;
}
} }
void PolyWallTextureCoords::CalcVTopPart(FTexture *tex, const line_t *line, const side_t *side, double topz, double bottomz, double vscale, double yoffset) void PolyWallTextureCoordsV::CalcVTopPart(FTexture *tex, const line_t *line, const side_t *side, double topz, double bottomz, double vscale, double yoffset)
{ {
bool pegged = (line->flags & ML_DONTPEGTOP) == 0; bool pegged = (line->flags & ML_DONTPEGTOP) == 0;
if (pegged) // bottom to top if (pegged) // bottom to top
@ -434,7 +446,7 @@ void PolyWallTextureCoords::CalcVTopPart(FTexture *tex, const line_t *line, cons
} }
} }
void PolyWallTextureCoords::CalcVMidPart(FTexture *tex, const line_t *line, const side_t *side, double topz, double bottomz, double vscale, double yoffset) void PolyWallTextureCoordsV::CalcVMidPart(FTexture *tex, const line_t *line, const side_t *side, double topz, double bottomz, double vscale, double yoffset)
{ {
bool pegged = (line->flags & ML_DONTPEGBOTTOM) == 0; bool pegged = (line->flags & ML_DONTPEGBOTTOM) == 0;
if (pegged) // top to bottom if (pegged) // top to bottom
@ -450,7 +462,7 @@ void PolyWallTextureCoords::CalcVMidPart(FTexture *tex, const line_t *line, cons
} }
} }
void PolyWallTextureCoords::CalcVBottomPart(FTexture *tex, const line_t *line, const side_t *side, double topz, double bottomz, double unpeggedceil, double vscale, double yoffset) void PolyWallTextureCoordsV::CalcVBottomPart(FTexture *tex, const line_t *line, const side_t *side, double topz, double bottomz, double unpeggedceil, double vscale, double yoffset)
{ {
bool pegged = (line->flags & ML_DONTPEGBOTTOM) == 0; bool pegged = (line->flags & ML_DONTPEGBOTTOM) == 0;
if (pegged) // top to bottom if (pegged) // top to bottom

View file

@ -48,9 +48,10 @@ public:
const line_t *Line = nullptr; const line_t *Line = nullptr;
const side_t *Side = nullptr; const side_t *Side = nullptr;
side_t::ETexpart Texpart = side_t::mid; side_t::ETexpart Texpart = side_t::mid;
double TopZ = 0.0; double TopTexZ = 0.0;
double BottomZ = 0.0; double BottomTexZ = 0.0;
double UnpeggedCeil = 0.0; double UnpeggedCeil1 = 0.0;
double UnpeggedCeil2 = 0.0;
FSWColormap *Colormap = nullptr; FSWColormap *Colormap = nullptr;
bool Masked = false; bool Masked = false;
uint32_t SubsectorDepth = 0; uint32_t SubsectorDepth = 0;
@ -63,18 +64,22 @@ private:
int GetLightLevel(); int GetLightLevel();
}; };
// Texture coordinates for a wall class PolyWallTextureCoordsU
class PolyWallTextureCoords
{ {
public: public:
PolyWallTextureCoords(FTexture *tex, const seg_t *lineseg, const line_t *line, const side_t *side, side_t::ETexpart texpart, double topz, double bottomz, double unpeggedceil); PolyWallTextureCoordsU(FTexture *tex, const seg_t *lineseg, const line_t *line, const side_t *side, side_t::ETexpart texpart);
double u1, u2; double u1, u2;
};
class PolyWallTextureCoordsV
{
public:
PolyWallTextureCoordsV(FTexture *tex, const line_t *line, const side_t *side, side_t::ETexpart texpart, double topz, double bottomz, double unpeggedceil, double topTexZ, double bottomTexZ);
double v1, v2; double v1, v2;
private: private:
void CalcU(FTexture *tex, const seg_t *lineseg, const line_t *line, const side_t *side, side_t::ETexpart texpart);
void CalcV(FTexture *tex, const line_t *line, const side_t *side, side_t::ETexpart texpart, double topz, double bottomz, double unpeggedceil);
void CalcVTopPart(FTexture *tex, const line_t *line, const side_t *side, double topz, double bottomz, double vscale, double yoffset); void CalcVTopPart(FTexture *tex, const line_t *line, const side_t *side, double topz, double bottomz, double vscale, double yoffset);
void CalcVMidPart(FTexture *tex, const line_t *line, const side_t *side, double topz, double bottomz, double vscale, double yoffset); void CalcVMidPart(FTexture *tex, const line_t *line, const side_t *side, double topz, double bottomz, double vscale, double yoffset);
void CalcVBottomPart(FTexture *tex, const line_t *line, const side_t *side, double topz, double bottomz, double unpeggedceil, double vscale, double yoffset); void CalcVBottomPart(FTexture *tex, const line_t *line, const side_t *side, double topz, double bottomz, double unpeggedceil, double vscale, double yoffset);

View file

@ -65,6 +65,7 @@ FModule OpenALModule{"OpenAL"};
CVAR (String, snd_aldevice, "Default", CVAR_ARCHIVE|CVAR_GLOBALCONFIG) CVAR (String, snd_aldevice, "Default", CVAR_ARCHIVE|CVAR_GLOBALCONFIG)
CVAR (Bool, snd_efx, true, CVAR_ARCHIVE|CVAR_GLOBALCONFIG) CVAR (Bool, snd_efx, true, CVAR_ARCHIVE|CVAR_GLOBALCONFIG)
CVAR (String, snd_alresampler, "Default", CVAR_ARCHIVE|CVAR_GLOBALCONFIG)
#ifdef _WIN32 #ifdef _WIN32
#define OPENALLIB "openal32.dll" #define OPENALLIB "openal32.dll"
@ -121,6 +122,32 @@ void I_BuildALDeviceList(FOptionValues *opt)
#endif #endif
} }
void I_BuildALResamplersList(FOptionValues *opt)
{
opt->mValues.Resize(1);
opt->mValues[0].TextValue = "Default";
opt->mValues[0].Text = "Default";
#ifndef NO_OPENAL
if (!IsOpenALPresent())
return;
if (!alcGetCurrentContext() || !alIsExtensionPresent("AL_SOFT_source_resampler"))
return;
LPALGETSTRINGISOFT alGetStringiSOFT = reinterpret_cast<LPALGETSTRINGISOFT>(alGetProcAddress("alGetStringiSOFT"));
ALint num_resamplers = alGetInteger(AL_NUM_RESAMPLERS_SOFT);
unsigned int idx = opt->mValues.Reserve(num_resamplers);
for(ALint i = 0;i < num_resamplers;++i)
{
const ALchar *name = alGetStringiSOFT(AL_RESAMPLER_NAME_SOFT, i);
opt->mValues[idx].TextValue = name;
opt->mValues[idx].Text = name;
++idx;
}
#endif
}
ReverbContainer *ForcedEnvironment; ReverbContainer *ForcedEnvironment;
@ -788,6 +815,7 @@ OpenALSoundRenderer::OpenALSoundRenderer()
AL.EXT_SOURCE_RADIUS = !!alIsExtensionPresent("AL_EXT_SOURCE_RADIUS"); AL.EXT_SOURCE_RADIUS = !!alIsExtensionPresent("AL_EXT_SOURCE_RADIUS");
AL.SOFT_deferred_updates = !!alIsExtensionPresent("AL_SOFT_deferred_updates"); AL.SOFT_deferred_updates = !!alIsExtensionPresent("AL_SOFT_deferred_updates");
AL.SOFT_loop_points = !!alIsExtensionPresent("AL_SOFT_loop_points"); AL.SOFT_loop_points = !!alIsExtensionPresent("AL_SOFT_loop_points");
AL.SOFT_source_resampler = !!alIsExtensionPresent("AL_SOFT_source_resampler");
alDopplerFactor(0.5f); alDopplerFactor(0.5f);
alSpeedOfSound(343.3f * 96.0f); alSpeedOfSound(343.3f * 96.0f);
@ -806,6 +834,9 @@ OpenALSoundRenderer::OpenALSoundRenderer()
alProcessUpdatesSOFT = _wrap_ProcessUpdatesSOFT; alProcessUpdatesSOFT = _wrap_ProcessUpdatesSOFT;
} }
if(AL.SOFT_source_resampler)
LOAD_FUNC(alGetStringiSOFT);
if(ALC.SOFT_pause_device) if(ALC.SOFT_pause_device)
{ {
LOAD_DEV_FUNC(Device, alcDevicePauseSOFT); LOAD_DEV_FUNC(Device, alcDevicePauseSOFT);
@ -958,6 +989,26 @@ OpenALSoundRenderer::OpenALSoundRenderer()
if(EnvSlot) if(EnvSlot)
Printf(" EFX enabled\n"); Printf(" EFX enabled\n");
if(AL.SOFT_source_resampler && strcmp(*snd_alresampler, "Default") != 0)
{
const ALint num_resamplers = alGetInteger(AL_NUM_RESAMPLERS_SOFT);
ALint ridx = alGetInteger(AL_DEFAULT_RESAMPLER_SOFT);
ALint i;
for(i = 0;i < num_resamplers;i++)
{
if(strcmp(alGetStringiSOFT(AL_RESAMPLER_NAME_SOFT, i), *snd_alresampler) == 0)
{
ridx = i;
break;
}
}
if(i == num_resamplers)
Printf(TEXTCOLOR_RED" Failed to find resampler " TEXTCOLOR_ORANGE"%s\n", *snd_alresampler);
else for(ALint src : Sources)
alSourcei(src, AL_SOURCE_RESAMPLER_SOFT, ridx);
}
} }
#undef LOAD_DEV_FUNC #undef LOAD_DEV_FUNC
#undef LOAD_FUNC #undef LOAD_FUNC

View file

@ -97,6 +97,17 @@ ALC_API ALCboolean ALC_APIENTRY alcResetDeviceSOFT(ALCdevice *device, const ALCi
#define AL_SOURCE_RADIUS 0x1031 #define AL_SOURCE_RADIUS 0x1031
#endif #endif
#ifndef AL_SOFT_source_resampler
#define AL_SOFT_source_resampler 1
#define AL_NUM_RESAMPLERS_SOFT 0x1210
#define AL_DEFAULT_RESAMPLER_SOFT 0x1211
#define AL_SOURCE_RESAMPLER_SOFT 0x1212
#define AL_RESAMPLER_NAME_SOFT 0x1213
typedef const ALchar* (AL_APIENTRY*LPALGETSTRINGISOFT)(ALenum pname, ALsizei index);
#ifdef AL_ALEXT_PROTOTYPES
AL_API const ALchar* AL_APIENTRY alGetStringiSOFT(ALenum pname, ALsizei index);
#endif
#endif
class OpenALSoundStream; class OpenALSoundStream;
@ -172,6 +183,7 @@ private:
bool EXT_SOURCE_RADIUS; bool EXT_SOURCE_RADIUS;
bool SOFT_deferred_updates; bool SOFT_deferred_updates;
bool SOFT_loop_points; bool SOFT_loop_points;
bool SOFT_source_resampler;
} AL; } AL;
// EFX Extension function pointer variables. Loaded after context creation // EFX Extension function pointer variables. Loaded after context creation
@ -217,6 +229,8 @@ private:
ALvoid (AL_APIENTRY*alDeferUpdatesSOFT)(void); ALvoid (AL_APIENTRY*alDeferUpdatesSOFT)(void);
ALvoid (AL_APIENTRY*alProcessUpdatesSOFT)(void); ALvoid (AL_APIENTRY*alProcessUpdatesSOFT)(void);
LPALGETSTRINGISOFT alGetStringiSOFT;
void (ALC_APIENTRY*alcDevicePauseSOFT)(ALCdevice *device); void (ALC_APIENTRY*alcDevicePauseSOFT)(ALCdevice *device);
void (ALC_APIENTRY*alcDeviceResumeSOFT)(ALCdevice *device); void (ALC_APIENTRY*alcDeviceResumeSOFT)(ALCdevice *device);

View file

@ -2671,7 +2671,7 @@ void D3DFB::DoDim (PalEntry color, float amount, int x1, int y1, int w, int h)
} }
if (In2D < 2) if (In2D < 2)
{ {
Super::Dim(color, amount, x1, y1, w, h); Super::DoDim(color, amount, x1, y1, w, h);
return; return;
} }
if (!InScene) if (!InScene)

View file

@ -2,25 +2,25 @@
{ {
// Slightly squash the pillars in the starting room with "stimpacks" // Slightly squash the pillars in the starting room with "stimpacks"
// floating on them so that they can be obtained. // floating on them so that they can be obtained.
sectorflooroffset 62 -8 setsectoroffset 62 floor -8
setwallyscale 286 front bot 1.090909 setwallyscale 286 front bot 1.090909
setwallyscale 287 front bot 1.090909 setwallyscale 287 front bot 1.090909
setwallyscale 288 front bot 1.090909 setwallyscale 288 front bot 1.090909
setwallyscale 289 front bot 1.090909 setwallyscale 289 front bot 1.090909
sectorflooroffset 63 -8 setsectoroffset 63 floor -8
setwallyscale 290 front bot 1.090909 setwallyscale 290 front bot 1.090909
setwallyscale 291 front bot 1.090909 setwallyscale 291 front bot 1.090909
setwallyscale 292 front bot 1.090909 setwallyscale 292 front bot 1.090909
setwallyscale 293 front bot 1.090909 setwallyscale 293 front bot 1.090909
sectorflooroffset 118 -8 setsectoroffset 118 floor -8
setwallyscale 710 front bot 1.090909 setwallyscale 710 front bot 1.090909
setwallyscale 711 front bot 1.090909 setwallyscale 711 front bot 1.090909
setwallyscale 712 front bot 1.090909 setwallyscale 712 front bot 1.090909
setwallyscale 713 front bot 1.090909 setwallyscale 713 front bot 1.090909
sectorflooroffset 119 -8 setsectoroffset 119 floor -8
setwallyscale 714 front bot 1.090909 setwallyscale 714 front bot 1.090909
setwallyscale 715 front bot 1.090909 setwallyscale 715 front bot 1.090909
setwallyscale 716 front bot 1.090909 setwallyscale 716 front bot 1.090909
@ -566,3 +566,63 @@ DC96228097DD004C40CCB1DB14A91EAA // unloved.pk3:unlovedmaps.wad map05
clipmidtex clipmidtex
} }
// Cosmetic fixes for Heretic: Shadow of the Serpent Riders
D94587625BA779644D58151A87897CF1 // e1m2
{
// Missing textures
setwalltexture 477 back top MOSSRCK1
setwalltexture 478 back top MOSSRCK1
setwalltexture 479 back top MOSSRCK1
setwalltexture 1057 front top MOSSRCK1
}
ADD0FAC41AFB0B3C9B9F3C0006F93805 // e1m3
{
// Broken door between the hallway that leads to a Torch
// and the passage that has a Bag of Holding at its end
setsectoroffset 86 floor -128
setsectoroffset 86 ceil -128
}
916318D8B06DAC2D83424B23E4B66531 // e1m4
{
// Wrong sector offsets
setsectoroffset 0 ceil 8
setsectoroffset 1 ceil 8
setsectoroffset 2 ceil 8
setsectoroffset 3 ceil 8
setsectoroffset 4 ceil 8
setsectoroffset 6 ceil 8
setsectoroffset 6 floor 8
setsectoroffset 17 ceil 8
// Yellow key door
setsectoroffset 284 floor -8
setsectoroffset 284 ceil -8
// Missing textures
setwalltexture 490 back bot GRSTNPB
setwalltexture 722 front bot WOODWL
setwalltexture 911 front bot WOODWL
setwalltexture 1296 front bot WOODWL
}
397A0E17A39542E4E8294E156FAB0502 // e2m2
{
// Missing green door statues on easy and hard difficulties
setthingskills 17 31
setthingskills 18 31
}
CA3773ED313E8899311F3DD0CA195A68 // e3m6
{
// Quartz flask outside of map
setthingskills 373 0
// Missing wall torch on hard difficulty
setthingskills 448 31
// Missing textures
setwalltexture 343 front top MOSSRCK1
setwalltexture 370 front top MOSSRCK1
}
5E3FCFDE78310BB89F92B1626A47D0AD // heretic.wad E4M7
{
// Missing textures
setwalltexture 1274 front top CSTLRCK
setwalltexture 1277 back top CSTLRCK
setwalltexture 1278 front top CSTLRCK
}

View file

@ -2137,6 +2137,7 @@ SNDMNU_MODREPLAYER = "Module replayer options";
OPENALMNU_TITLE = "OPENAL OPTIONS"; OPENALMNU_TITLE = "OPENAL OPTIONS";
OPENALMNU_PLAYBACKDEVICE = "Playback device"; OPENALMNU_PLAYBACKDEVICE = "Playback device";
OPENALMNU_ENABLEEFX = "Enable EFX"; OPENALMNU_ENABLEEFX = "Enable EFX";
OPENALMNU_RESAMPLER = "Resampler";
// Advanced Sound Options // Advanced Sound Options
ADVSNDMNU_TITLE = "ADVANCED SOUND OPTIONS"; ADVSNDMNU_TITLE = "ADVANCED SOUND OPTIONS";

View file

@ -1531,6 +1531,11 @@ OptionString ALDevices
// filled in by the sound code // filled in by the sound code
} }
OptionString ALResamplers
{
// filled in by the sound code
}
OptionString OutputFormats OptionString OutputFormats
{ {
"PCM-8", "$OPTSTR_PCM8BIT" "PCM-8", "$OPTSTR_PCM8BIT"
@ -1572,8 +1577,9 @@ OptionString SoundBackendsOpenALOnly
OptionMenu OpenALSoundItems OptionMenu OpenALSoundItems
{ {
Title "$OPENALMNU_TITLE" Title "$OPENALMNU_TITLE"
Option "$OPENALMNU_PLAYBACKDEVICE", "snd_aldevice", "ALDevices" Option "$OPENALMNU_PLAYBACKDEVICE", "snd_aldevice", "ALDevices"
Option "$OPENALMNU_ENABLEEFX", "snd_efx", "OnOff" Option "$OPENALMNU_ENABLEEFX", "snd_efx", "OnOff"
Option "$OPENALMNU_RESAMPLER", "snd_alresampler", "ALResamplers"
} }

View file

@ -812,9 +812,13 @@ class PlayerPawn : Actor native
side *= SideMove2; side *= SideMove2;
} }
if (!player.morphTics && Inv != NULL) if (!player.morphTics)
{ {
double factor = Inv.GetSpeedFactor (); double factor = 1.;
for(let it = Inv; it != null; it = it.Inv)
{
factor *= Inv.GetSpeedFactor ();
}
forward *= factor; forward *= factor;
side *= factor; side *= factor;
} }

View file

@ -28,7 +28,7 @@ class DoomStatusScreen : StatusScreen
cnt_items[0] = Plrs[me].sitems; cnt_items[0] = Plrs[me].sitems;
cnt_secret[0] = Plrs[me].ssecret; cnt_secret[0] = Plrs[me].ssecret;
cnt_time = Thinker.Tics2Seconds(Plrs[me].stime); cnt_time = Thinker.Tics2Seconds(Plrs[me].stime);
cnt_par = Thinker.Tics2Seconds(wbs.partime); cnt_par = wbs.partime / Thinker.TICRATE;
cnt_total_time = Thinker.Tics2Seconds(wbs.totaltime); cnt_total_time = Thinker.Tics2Seconds(wbs.totaltime);
} }
@ -100,7 +100,7 @@ class DoomStatusScreen : StatusScreen
if (!intermissioncounter || cnt_total_time >= tsec) if (!intermissioncounter || cnt_total_time >= tsec)
cnt_total_time = tsec; cnt_total_time = tsec;
int psec = Thinker.Tics2Seconds(wbs.partime); int psec = wbs.partime / Thinker.TICRATE;
if (!intermissioncounter || cnt_par >= psec) if (!intermissioncounter || cnt_par >= psec)
{ {
cnt_par = psec; cnt_par = psec;
@ -156,7 +156,7 @@ class DoomStatusScreen : StatusScreen
if (wbs.partime) if (wbs.partime)
{ {
screen.DrawTexture (Par, 160 + SP_TIMEX, SP_TIMEY, DTA_Clean, true); screen.DrawTexture (Par, true, 160 + SP_TIMEX, SP_TIMEY, DTA_Clean, true);
drawTime (320 - SP_TIMEX, SP_TIMEY, cnt_par); drawTime (320 - SP_TIMEX, SP_TIMEY, cnt_par);
} }
} }