mirror of
https://github.com/ZDoom/qzdoom.git
synced 2024-11-28 15:02:01 +00:00
Move frame memory allocator into RenderThread
This commit is contained in:
parent
627a388d57
commit
45f623faf4
17 changed files with 49 additions and 44 deletions
|
@ -335,7 +335,7 @@ namespace swrenderer
|
||||||
|
|
||||||
RenderPortal *renderportal = Thread->Portal.get();
|
RenderPortal *renderportal = Thread->Portal.get();
|
||||||
|
|
||||||
DrawSegment *draw_segment = RenderMemory::NewObject<DrawSegment>();
|
DrawSegment *draw_segment = Thread->FrameMemory->NewObject<DrawSegment>();
|
||||||
Thread->DrawSegments->Push(draw_segment);
|
Thread->DrawSegments->Push(draw_segment);
|
||||||
|
|
||||||
draw_segment->CurrentPortalUniq = renderportal->CurrentPortalUniq;
|
draw_segment->CurrentPortalUniq = renderportal->CurrentPortalUniq;
|
||||||
|
@ -373,8 +373,8 @@ namespace swrenderer
|
||||||
}
|
}
|
||||||
else if (backsector == NULL)
|
else if (backsector == NULL)
|
||||||
{
|
{
|
||||||
draw_segment->sprtopclip = RenderMemory::AllocMemory<short>(stop - start);
|
draw_segment->sprtopclip = Thread->FrameMemory->AllocMemory<short>(stop - start);
|
||||||
draw_segment->sprbottomclip = RenderMemory::AllocMemory<short>(stop - start);
|
draw_segment->sprbottomclip = Thread->FrameMemory->AllocMemory<short>(stop - start);
|
||||||
fillshort(draw_segment->sprtopclip, stop - start, viewheight);
|
fillshort(draw_segment->sprtopclip, stop - start, viewheight);
|
||||||
memset(draw_segment->sprbottomclip, -1, (stop - start) * sizeof(short));
|
memset(draw_segment->sprbottomclip, -1, (stop - start) * sizeof(short));
|
||||||
draw_segment->silhouette = SIL_BOTH;
|
draw_segment->silhouette = SIL_BOTH;
|
||||||
|
@ -407,13 +407,13 @@ namespace swrenderer
|
||||||
{
|
{
|
||||||
if (doorclosed || (rw_backcz1 <= rw_frontfz1 && rw_backcz2 <= rw_frontfz2))
|
if (doorclosed || (rw_backcz1 <= rw_frontfz1 && rw_backcz2 <= rw_frontfz2))
|
||||||
{
|
{
|
||||||
draw_segment->sprbottomclip = RenderMemory::AllocMemory<short>(stop - start);
|
draw_segment->sprbottomclip = Thread->FrameMemory->AllocMemory<short>(stop - start);
|
||||||
memset(draw_segment->sprbottomclip, -1, (stop - start) * sizeof(short));
|
memset(draw_segment->sprbottomclip, -1, (stop - start) * sizeof(short));
|
||||||
draw_segment->silhouette |= SIL_BOTTOM;
|
draw_segment->silhouette |= SIL_BOTTOM;
|
||||||
}
|
}
|
||||||
if (doorclosed || (rw_backfz1 >= rw_frontcz1 && rw_backfz2 >= rw_frontcz2))
|
if (doorclosed || (rw_backfz1 >= rw_frontcz1 && rw_backfz2 >= rw_frontcz2))
|
||||||
{ // killough 1/17/98, 2/8/98
|
{ // killough 1/17/98, 2/8/98
|
||||||
draw_segment->sprtopclip = RenderMemory::AllocMemory<short>(stop - start);
|
draw_segment->sprtopclip = Thread->FrameMemory->AllocMemory<short>(stop - start);
|
||||||
fillshort(draw_segment->sprtopclip, stop - start, viewheight);
|
fillshort(draw_segment->sprtopclip, stop - start, viewheight);
|
||||||
draw_segment->silhouette |= SIL_TOP;
|
draw_segment->silhouette |= SIL_TOP;
|
||||||
}
|
}
|
||||||
|
@ -453,7 +453,7 @@ namespace swrenderer
|
||||||
maskedtexture = true;
|
maskedtexture = true;
|
||||||
|
|
||||||
// kg3D - backup for mid and fake walls
|
// kg3D - backup for mid and fake walls
|
||||||
draw_segment->bkup = RenderMemory::AllocMemory<short>(stop - start);
|
draw_segment->bkup = Thread->FrameMemory->AllocMemory<short>(stop - start);
|
||||||
memcpy(draw_segment->bkup, &Thread->OpaquePass->ceilingclip[start], sizeof(short)*(stop - start));
|
memcpy(draw_segment->bkup, &Thread->OpaquePass->ceilingclip[start], sizeof(short)*(stop - start));
|
||||||
|
|
||||||
draw_segment->bFogBoundary = IsFogBoundary(frontsector, backsector);
|
draw_segment->bFogBoundary = IsFogBoundary(frontsector, backsector);
|
||||||
|
@ -462,8 +462,8 @@ namespace swrenderer
|
||||||
if (sidedef->GetTexture(side_t::mid).isValid())
|
if (sidedef->GetTexture(side_t::mid).isValid())
|
||||||
draw_segment->bFakeBoundary |= 4; // it is also mid texture
|
draw_segment->bFakeBoundary |= 4; // it is also mid texture
|
||||||
|
|
||||||
draw_segment->maskedtexturecol = RenderMemory::AllocMemory<fixed_t>(stop - start);
|
draw_segment->maskedtexturecol = Thread->FrameMemory->AllocMemory<fixed_t>(stop - start);
|
||||||
draw_segment->swall = RenderMemory::AllocMemory<float>(stop - start);
|
draw_segment->swall = Thread->FrameMemory->AllocMemory<float>(stop - start);
|
||||||
|
|
||||||
lwal = draw_segment->maskedtexturecol;
|
lwal = draw_segment->maskedtexturecol;
|
||||||
swal = draw_segment->swall;
|
swal = draw_segment->swall;
|
||||||
|
@ -563,13 +563,13 @@ namespace swrenderer
|
||||||
// save sprite clipping info
|
// save sprite clipping info
|
||||||
if (((draw_segment->silhouette & SIL_TOP) || maskedtexture) && draw_segment->sprtopclip == nullptr)
|
if (((draw_segment->silhouette & SIL_TOP) || maskedtexture) && draw_segment->sprtopclip == nullptr)
|
||||||
{
|
{
|
||||||
draw_segment->sprtopclip = RenderMemory::AllocMemory<short>(stop - start);
|
draw_segment->sprtopclip = Thread->FrameMemory->AllocMemory<short>(stop - start);
|
||||||
memcpy(draw_segment->sprtopclip, &Thread->OpaquePass->ceilingclip[start], sizeof(short)*(stop - start));
|
memcpy(draw_segment->sprtopclip, &Thread->OpaquePass->ceilingclip[start], sizeof(short)*(stop - start));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (((draw_segment->silhouette & SIL_BOTTOM) || maskedtexture) && draw_segment->sprbottomclip == nullptr)
|
if (((draw_segment->silhouette & SIL_BOTTOM) || maskedtexture) && draw_segment->sprbottomclip == nullptr)
|
||||||
{
|
{
|
||||||
draw_segment->sprbottomclip = RenderMemory::AllocMemory<short>(stop - start);
|
draw_segment->sprbottomclip = Thread->FrameMemory->AllocMemory<short>(stop - start);
|
||||||
memcpy(draw_segment->sprbottomclip, &Thread->OpaquePass->floorclip[start], sizeof(short)*(stop - start));
|
memcpy(draw_segment->sprbottomclip, &Thread->OpaquePass->floorclip[start], sizeof(short)*(stop - start));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
#include "g_level.h"
|
#include "g_level.h"
|
||||||
#include "gl/dynlights/gl_dynlight.h"
|
#include "gl/dynlights/gl_dynlight.h"
|
||||||
#include "swrenderer/r_memory.h"
|
#include "swrenderer/r_memory.h"
|
||||||
|
#include "swrenderer/r_renderthread.h"
|
||||||
#include "swrenderer/scene/r_opaque_pass.h"
|
#include "swrenderer/scene/r_opaque_pass.h"
|
||||||
#include "swrenderer/scene/r_3dfloors.h"
|
#include "swrenderer/scene/r_3dfloors.h"
|
||||||
#include "swrenderer/scene/r_portal.h"
|
#include "swrenderer/scene/r_portal.h"
|
||||||
|
@ -43,19 +44,19 @@ CVAR(Bool, tilt, false, 0);
|
||||||
|
|
||||||
namespace swrenderer
|
namespace swrenderer
|
||||||
{
|
{
|
||||||
VisiblePlane::VisiblePlane()
|
VisiblePlane::VisiblePlane(RenderThread *thread)
|
||||||
{
|
{
|
||||||
picnum.SetNull();
|
picnum.SetNull();
|
||||||
height.set(0.0, 0.0, 1.0, 0.0);
|
height.set(0.0, 0.0, 1.0, 0.0);
|
||||||
|
|
||||||
bottom = RenderMemory::AllocMemory<uint16_t>(viewwidth);
|
bottom = thread->FrameMemory->AllocMemory<uint16_t>(viewwidth);
|
||||||
top = RenderMemory::AllocMemory<uint16_t>(viewwidth);
|
top = thread->FrameMemory->AllocMemory<uint16_t>(viewwidth);
|
||||||
|
|
||||||
fillshort(bottom, viewwidth, 0);
|
fillshort(bottom, viewwidth, 0);
|
||||||
fillshort(top, viewwidth, 0x7fff);
|
fillshort(top, viewwidth, 0x7fff);
|
||||||
}
|
}
|
||||||
|
|
||||||
void VisiblePlane::AddLights(FLightNode *node)
|
void VisiblePlane::AddLights(RenderThread *thread, FLightNode *node)
|
||||||
{
|
{
|
||||||
if (!r_dynlights)
|
if (!r_dynlights)
|
||||||
return;
|
return;
|
||||||
|
@ -77,7 +78,7 @@ namespace swrenderer
|
||||||
}
|
}
|
||||||
if (!found)
|
if (!found)
|
||||||
{
|
{
|
||||||
VisiblePlaneLight *newlight = RenderMemory::NewObject<VisiblePlaneLight>();
|
VisiblePlaneLight *newlight = thread->FrameMemory->NewObject<VisiblePlaneLight>();
|
||||||
newlight->next = lights;
|
newlight->next = lights;
|
||||||
newlight->lightsource = node->lightsource;
|
newlight->lightsource = node->lightsource;
|
||||||
lights = newlight;
|
lights = newlight;
|
||||||
|
|
|
@ -35,9 +35,9 @@ namespace swrenderer
|
||||||
|
|
||||||
struct VisiblePlane
|
struct VisiblePlane
|
||||||
{
|
{
|
||||||
VisiblePlane();
|
VisiblePlane(RenderThread *thread);
|
||||||
|
|
||||||
void AddLights(FLightNode *node);
|
void AddLights(RenderThread *thread, FLightNode *node);
|
||||||
void Render(RenderThread *thread, fixed_t alpha, bool additive, bool masked);
|
void Render(RenderThread *thread, fixed_t alpha, bool additive, bool masked);
|
||||||
|
|
||||||
VisiblePlane *next = nullptr; // Next visplane in hash chain -- killough
|
VisiblePlane *next = nullptr; // Next visplane in hash chain -- killough
|
||||||
|
|
|
@ -58,7 +58,7 @@ namespace swrenderer
|
||||||
|
|
||||||
VisiblePlane *VisiblePlaneList::Add(unsigned hash)
|
VisiblePlane *VisiblePlaneList::Add(unsigned hash)
|
||||||
{
|
{
|
||||||
VisiblePlane *newplane = RenderMemory::NewObject<VisiblePlane>();
|
VisiblePlane *newplane = Thread->FrameMemory->NewObject<VisiblePlane>(Thread);
|
||||||
newplane->next = visplanes[hash];
|
newplane->next = visplanes[hash];
|
||||||
visplanes[hash] = newplane;
|
visplanes[hash] = newplane;
|
||||||
return newplane;
|
return newplane;
|
||||||
|
|
|
@ -68,7 +68,4 @@ namespace swrenderer
|
||||||
FreeBlocks.push_back(std::move(block));
|
FreeBlocks.push_back(std::move(block));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<std::unique_ptr<RenderMemory::MemoryBlock>> RenderMemory::UsedBlocks;
|
|
||||||
std::vector<std::unique_ptr<RenderMemory::MemoryBlock>> RenderMemory::FreeBlocks;
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,23 +21,23 @@ namespace swrenderer
|
||||||
class RenderMemory
|
class RenderMemory
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
static void Clear();
|
void Clear();
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
static T *AllocMemory(int size = 1)
|
T *AllocMemory(int size = 1)
|
||||||
{
|
{
|
||||||
return (T*)AllocBytes(sizeof(T) * size);
|
return (T*)AllocBytes(sizeof(T) * size);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T, typename... Types>
|
template<typename T, typename... Types>
|
||||||
static T *NewObject(Types &&... args)
|
T *NewObject(Types &&... args)
|
||||||
{
|
{
|
||||||
void *ptr = AllocBytes(sizeof(T));
|
void *ptr = AllocBytes(sizeof(T));
|
||||||
return new (ptr)T(std::forward<Types>(args)...);
|
return new (ptr)T(std::forward<Types>(args)...);
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static void *AllocBytes(int size);
|
void *AllocBytes(int size);
|
||||||
|
|
||||||
enum { BlockSize = 1024 * 1024 };
|
enum { BlockSize = 1024 * 1024 };
|
||||||
|
|
||||||
|
@ -52,7 +52,7 @@ namespace swrenderer
|
||||||
uint8_t *Data;
|
uint8_t *Data;
|
||||||
uint32_t Position;
|
uint32_t Position;
|
||||||
};
|
};
|
||||||
static std::vector<std::unique_ptr<MemoryBlock>> UsedBlocks;
|
std::vector<std::unique_ptr<MemoryBlock>> UsedBlocks;
|
||||||
static std::vector<std::unique_ptr<MemoryBlock>> FreeBlocks;
|
std::vector<std::unique_ptr<MemoryBlock>> FreeBlocks;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,11 +47,13 @@
|
||||||
#include "swrenderer/plane/r_visibleplanelist.h"
|
#include "swrenderer/plane/r_visibleplanelist.h"
|
||||||
#include "swrenderer/segments/r_drawsegment.h"
|
#include "swrenderer/segments/r_drawsegment.h"
|
||||||
#include "swrenderer/segments/r_clipsegment.h"
|
#include "swrenderer/segments/r_clipsegment.h"
|
||||||
|
#include "r_memory.h"
|
||||||
|
|
||||||
namespace swrenderer
|
namespace swrenderer
|
||||||
{
|
{
|
||||||
RenderThread::RenderThread()
|
RenderThread::RenderThread()
|
||||||
{
|
{
|
||||||
|
FrameMemory = std::make_unique<RenderMemory>();
|
||||||
OpaquePass = std::make_unique<RenderOpaquePass>(this);
|
OpaquePass = std::make_unique<RenderOpaquePass>(this);
|
||||||
TranslucentPass = std::make_unique<RenderTranslucentPass>(this);
|
TranslucentPass = std::make_unique<RenderTranslucentPass>(this);
|
||||||
SpriteList = std::make_unique<VisibleSpriteList>();
|
SpriteList = std::make_unique<VisibleSpriteList>();
|
||||||
|
|
|
@ -36,6 +36,7 @@ namespace swrenderer
|
||||||
class VisiblePlaneList;
|
class VisiblePlaneList;
|
||||||
class DrawSegmentList;
|
class DrawSegmentList;
|
||||||
class RenderClipSegment;
|
class RenderClipSegment;
|
||||||
|
class RenderMemory;
|
||||||
|
|
||||||
class RenderThread
|
class RenderThread
|
||||||
{
|
{
|
||||||
|
@ -43,6 +44,7 @@ namespace swrenderer
|
||||||
RenderThread();
|
RenderThread();
|
||||||
~RenderThread();
|
~RenderThread();
|
||||||
|
|
||||||
|
std::unique_ptr<RenderMemory> FrameMemory;
|
||||||
std::unique_ptr<RenderOpaquePass> OpaquePass;
|
std::unique_ptr<RenderOpaquePass> OpaquePass;
|
||||||
std::unique_ptr<RenderTranslucentPass> TranslucentPass;
|
std::unique_ptr<RenderTranslucentPass> TranslucentPass;
|
||||||
std::unique_ptr<VisibleSpriteList> SpriteList;
|
std::unique_ptr<VisibleSpriteList> SpriteList;
|
||||||
|
|
|
@ -519,7 +519,7 @@ namespace swrenderer
|
||||||
) : nullptr;
|
) : nullptr;
|
||||||
|
|
||||||
if (ceilingplane)
|
if (ceilingplane)
|
||||||
ceilingplane->AddLights(frontsector->lighthead);
|
ceilingplane->AddLights(Thread, frontsector->lighthead);
|
||||||
|
|
||||||
if (cameraLight->FixedLightLevel() < 0 && frontsector->e && frontsector->e->XFloor.lightlist.Size())
|
if (cameraLight->FixedLightLevel() < 0 && frontsector->e && frontsector->e->XFloor.lightlist.Size())
|
||||||
{
|
{
|
||||||
|
@ -560,7 +560,7 @@ namespace swrenderer
|
||||||
) : nullptr;
|
) : nullptr;
|
||||||
|
|
||||||
if (floorplane)
|
if (floorplane)
|
||||||
floorplane->AddLights(frontsector->lighthead);
|
floorplane->AddLights(Thread, frontsector->lighthead);
|
||||||
|
|
||||||
// kg3D - fake planes rendering
|
// kg3D - fake planes rendering
|
||||||
if (r_3dfloors && frontsector->e && frontsector->e->XFloor.ffloors.Size())
|
if (r_3dfloors && frontsector->e && frontsector->e->XFloor.ffloors.Size())
|
||||||
|
@ -625,7 +625,7 @@ namespace swrenderer
|
||||||
basecolormap);
|
basecolormap);
|
||||||
|
|
||||||
if (floorplane)
|
if (floorplane)
|
||||||
floorplane->AddLights(frontsector->lighthead);
|
floorplane->AddLights(Thread, frontsector->lighthead);
|
||||||
|
|
||||||
FakeDrawLoop(sub, floorplane, ceilingplane, foggy, basecolormap);
|
FakeDrawLoop(sub, floorplane, ceilingplane, foggy, basecolormap);
|
||||||
clip3d->fake3D = 0;
|
clip3d->fake3D = 0;
|
||||||
|
@ -691,7 +691,7 @@ namespace swrenderer
|
||||||
basecolormap);
|
basecolormap);
|
||||||
|
|
||||||
if (ceilingplane)
|
if (ceilingplane)
|
||||||
ceilingplane->AddLights(frontsector->lighthead);
|
ceilingplane->AddLights(Thread, frontsector->lighthead);
|
||||||
|
|
||||||
FakeDrawLoop(sub, floorplane, ceilingplane, foggy, basecolormap);
|
FakeDrawLoop(sub, floorplane, ceilingplane, foggy, basecolormap);
|
||||||
clip3d->fake3D = 0;
|
clip3d->fake3D = 0;
|
||||||
|
|
|
@ -186,7 +186,7 @@ namespace swrenderer
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create a drawseg to clip sprites to the sky plane
|
// Create a drawseg to clip sprites to the sky plane
|
||||||
DrawSegment *draw_segment = RenderMemory::NewObject<DrawSegment>();
|
DrawSegment *draw_segment = Thread->FrameMemory->NewObject<DrawSegment>();
|
||||||
draw_segment->CurrentPortalUniq = CurrentPortalUniq;
|
draw_segment->CurrentPortalUniq = CurrentPortalUniq;
|
||||||
draw_segment->siz1 = INT_MAX;
|
draw_segment->siz1 = INT_MAX;
|
||||||
draw_segment->siz2 = INT_MAX;
|
draw_segment->siz2 = INT_MAX;
|
||||||
|
@ -195,8 +195,8 @@ namespace swrenderer
|
||||||
draw_segment->x1 = pl->left;
|
draw_segment->x1 = pl->left;
|
||||||
draw_segment->x2 = pl->right;
|
draw_segment->x2 = pl->right;
|
||||||
draw_segment->silhouette = SIL_BOTH;
|
draw_segment->silhouette = SIL_BOTH;
|
||||||
draw_segment->sprbottomclip = RenderMemory::AllocMemory<short>(pl->right - pl->left);
|
draw_segment->sprbottomclip = Thread->FrameMemory->AllocMemory<short>(pl->right - pl->left);
|
||||||
draw_segment->sprtopclip = RenderMemory::AllocMemory<short>(pl->right - pl->left);
|
draw_segment->sprtopclip = Thread->FrameMemory->AllocMemory<short>(pl->right - pl->left);
|
||||||
draw_segment->maskedtexturecol = nullptr;
|
draw_segment->maskedtexturecol = nullptr;
|
||||||
draw_segment->swall = nullptr;
|
draw_segment->swall = nullptr;
|
||||||
draw_segment->bFogBoundary = false;
|
draw_segment->bFogBoundary = false;
|
||||||
|
@ -526,7 +526,7 @@ namespace swrenderer
|
||||||
|
|
||||||
void RenderPortal::AddLinePortal(line_t *linedef, int x1, int x2, const short *topclip, const short *bottomclip)
|
void RenderPortal::AddLinePortal(line_t *linedef, int x1, int x2, const short *topclip, const short *bottomclip)
|
||||||
{
|
{
|
||||||
WallPortals.Push(RenderMemory::NewObject<PortalDrawseg>(linedef, x1, x2, topclip, bottomclip));
|
WallPortals.Push(Thread->FrameMemory->NewObject<PortalDrawseg>(Thread, linedef, x1, x2, topclip, bottomclip));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -113,7 +113,7 @@ namespace swrenderer
|
||||||
MaskedCycles.Reset();
|
MaskedCycles.Reset();
|
||||||
WallScanCycles.Reset();
|
WallScanCycles.Reset();
|
||||||
|
|
||||||
RenderMemory::Clear();
|
Thread->FrameMemory->Clear();
|
||||||
|
|
||||||
Clip3DFloors *clip3d = Thread->Clip3DFloors.get();
|
Clip3DFloors *clip3d = Thread->Clip3DFloors.get();
|
||||||
clip3d->Cleanup();
|
clip3d->Cleanup();
|
||||||
|
|
|
@ -32,17 +32,18 @@
|
||||||
#include "r_data/colormaps.h"
|
#include "r_data/colormaps.h"
|
||||||
#include "swrenderer/segments/r_portalsegment.h"
|
#include "swrenderer/segments/r_portalsegment.h"
|
||||||
#include "swrenderer/r_memory.h"
|
#include "swrenderer/r_memory.h"
|
||||||
|
#include "swrenderer/r_renderthread.h"
|
||||||
|
|
||||||
namespace swrenderer
|
namespace swrenderer
|
||||||
{
|
{
|
||||||
PortalDrawseg::PortalDrawseg(line_t *linedef, int x1, int x2, const short *topclip, const short *bottomclip) : x1(x1), x2(x2)
|
PortalDrawseg::PortalDrawseg(RenderThread *thread, line_t *linedef, int x1, int x2, const short *topclip, const short *bottomclip) : x1(x1), x2(x2)
|
||||||
{
|
{
|
||||||
src = linedef;
|
src = linedef;
|
||||||
dst = linedef->special == Line_Mirror ? linedef : linedef->getPortalDestination();
|
dst = linedef->special == Line_Mirror ? linedef : linedef->getPortalDestination();
|
||||||
len = x2 - x1;
|
len = x2 - x1;
|
||||||
|
|
||||||
ceilingclip = RenderMemory::AllocMemory<short>(len);
|
ceilingclip = thread->FrameMemory->AllocMemory<short>(len);
|
||||||
floorclip = RenderMemory::AllocMemory<short>(len);
|
floorclip = thread->FrameMemory->AllocMemory<short>(len);
|
||||||
memcpy(ceilingclip, topclip, len * sizeof(short));
|
memcpy(ceilingclip, topclip, len * sizeof(short));
|
||||||
memcpy(floorclip, bottomclip, len * sizeof(short));
|
memcpy(floorclip, bottomclip, len * sizeof(short));
|
||||||
|
|
||||||
|
|
|
@ -15,10 +15,12 @@
|
||||||
|
|
||||||
namespace swrenderer
|
namespace swrenderer
|
||||||
{
|
{
|
||||||
|
class RenderThread;
|
||||||
|
|
||||||
/* portal structure, this is used in r_ code in order to store drawsegs with portals (and mirrors) */
|
/* portal structure, this is used in r_ code in order to store drawsegs with portals (and mirrors) */
|
||||||
struct PortalDrawseg
|
struct PortalDrawseg
|
||||||
{
|
{
|
||||||
PortalDrawseg(line_t *linedef, int x1, int x2, const short *topclip, const short *bottomclip);
|
PortalDrawseg(RenderThread *thread, line_t *linedef, int x1, int x2, const short *topclip, const short *bottomclip);
|
||||||
|
|
||||||
line_t* src = nullptr; // source line (the one drawn) this doesn't change over render loops
|
line_t* src = nullptr; // source line (the one drawn) this doesn't change over render loops
|
||||||
line_t* dst = nullptr; // destination line (the one that the portal is linked with, equals 'src' for mirrors)
|
line_t* dst = nullptr; // destination line (the one that the portal is linked with, equals 'src' for mirrors)
|
||||||
|
|
|
@ -182,7 +182,7 @@ namespace swrenderer
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// store information in a vissprite
|
// store information in a vissprite
|
||||||
RenderParticle *vis = RenderMemory::NewObject<RenderParticle>();
|
RenderParticle *vis = thread->FrameMemory->NewObject<RenderParticle>();
|
||||||
|
|
||||||
vis->CurrentPortalUniq = renderportal->CurrentPortalUniq;
|
vis->CurrentPortalUniq = renderportal->CurrentPortalUniq;
|
||||||
vis->heightsec = heightsec;
|
vis->heightsec = heightsec;
|
||||||
|
|
|
@ -159,7 +159,7 @@ namespace swrenderer
|
||||||
double yscale = spriteScale.Y / tex->Scale.Y;
|
double yscale = spriteScale.Y / tex->Scale.Y;
|
||||||
|
|
||||||
// store information in a vissprite
|
// store information in a vissprite
|
||||||
RenderSprite *vis = RenderMemory::NewObject<RenderSprite>();
|
RenderSprite *vis = thread->FrameMemory->NewObject<RenderSprite>();
|
||||||
|
|
||||||
vis->CurrentPortalUniq = renderportal->CurrentPortalUniq;
|
vis->CurrentPortalUniq = renderportal->CurrentPortalUniq;
|
||||||
vis->xscale = FLOAT2FIXED(xscale);
|
vis->xscale = FLOAT2FIXED(xscale);
|
||||||
|
|
|
@ -107,7 +107,7 @@ namespace swrenderer
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
RenderVoxel *vis = RenderMemory::NewObject<RenderVoxel>();
|
RenderVoxel *vis = thread->FrameMemory->NewObject<RenderVoxel>();
|
||||||
|
|
||||||
vis->CurrentPortalUniq = renderportal->CurrentPortalUniq;
|
vis->CurrentPortalUniq = renderportal->CurrentPortalUniq;
|
||||||
vis->xscale = FLOAT2FIXED(xscale);
|
vis->xscale = FLOAT2FIXED(xscale);
|
||||||
|
|
|
@ -105,7 +105,7 @@ namespace swrenderer
|
||||||
gzt = pos.Z + scale.Y * scaled_to;
|
gzt = pos.Z + scale.Y * scaled_to;
|
||||||
gzb = pos.Z + scale.Y * scaled_bo;
|
gzb = pos.Z + scale.Y * scaled_bo;
|
||||||
|
|
||||||
RenderWallSprite *vis = RenderMemory::NewObject<RenderWallSprite>();
|
RenderWallSprite *vis = thread->FrameMemory->NewObject<RenderWallSprite>();
|
||||||
vis->CurrentPortalUniq = renderportal->CurrentPortalUniq;
|
vis->CurrentPortalUniq = renderportal->CurrentPortalUniq;
|
||||||
vis->x1 = wallc.sx1 < renderportal->WindowLeft ? renderportal->WindowLeft : wallc.sx1;
|
vis->x1 = wallc.sx1 < renderportal->WindowLeft ? renderportal->WindowLeft : wallc.sx1;
|
||||||
vis->x2 = wallc.sx2 >= renderportal->WindowRight ? renderportal->WindowRight : wallc.sx2;
|
vis->x2 = wallc.sx2 >= renderportal->WindowRight ? renderportal->WindowRight : wallc.sx2;
|
||||||
|
|
Loading…
Reference in a new issue