mirror of
https://github.com/ZDoom/gzdoom-gles.git
synced 2024-11-11 07:12:16 +00:00
Remove usage of r_viewpoint and r_viewwindow globals from software renderer and poly renderer
This commit is contained in:
parent
b398c7458c
commit
5fdbbc4f9e
67 changed files with 883 additions and 845 deletions
|
@ -48,7 +48,7 @@ void PolyDrawArgs::SetTexture(FTexture *texture)
|
|||
{
|
||||
textureWidth = texture->GetWidth();
|
||||
textureHeight = texture->GetHeight();
|
||||
auto viewport = swrenderer::RenderViewport::Instance();
|
||||
auto viewport = PolyRenderer::Instance()->Thread.Viewport.get();
|
||||
if (viewport->RenderTarget->IsBgra())
|
||||
texturePixels = (const uint8_t *)texture->GetPixelsBgra();
|
||||
else
|
||||
|
@ -63,7 +63,7 @@ void PolyDrawArgs::SetTexture(FTexture *texture, uint32_t translationID, bool fo
|
|||
FRemapTable *table = TranslationToTable(translationID);
|
||||
if (table != nullptr && !table->Inactive)
|
||||
{
|
||||
if (swrenderer::RenderViewport::Instance()->RenderTarget->IsBgra())
|
||||
if (PolyRenderer::Instance()->Thread.Viewport->RenderTarget->IsBgra())
|
||||
translation = (uint8_t*)table->Palette;
|
||||
else
|
||||
translation = table->Remap;
|
||||
|
|
|
@ -132,24 +132,23 @@ TriMatrix TriMatrix::frustum(float left, float right, float bottom, float top, f
|
|||
return m;
|
||||
}
|
||||
|
||||
TriMatrix TriMatrix::worldToView()
|
||||
TriMatrix TriMatrix::worldToView(const FRenderViewpoint &viewpoint)
|
||||
{
|
||||
TriMatrix m = null();
|
||||
m.matrix[0 + 0 * 4] = (float)r_viewpoint.Sin;
|
||||
m.matrix[0 + 1 * 4] = (float)-r_viewpoint.Cos;
|
||||
m.matrix[0 + 0 * 4] = (float)viewpoint.Sin;
|
||||
m.matrix[0 + 1 * 4] = (float)-viewpoint.Cos;
|
||||
m.matrix[1 + 2 * 4] = 1.0f;
|
||||
m.matrix[2 + 0 * 4] = (float)-r_viewpoint.Cos;
|
||||
m.matrix[2 + 1 * 4] = (float)-r_viewpoint.Sin;
|
||||
m.matrix[2 + 0 * 4] = (float)-viewpoint.Cos;
|
||||
m.matrix[2 + 1 * 4] = (float)-viewpoint.Sin;
|
||||
m.matrix[3 + 3 * 4] = 1.0f;
|
||||
return m * translate((float)-r_viewpoint.Pos.X, (float)-r_viewpoint.Pos.Y, (float)-r_viewpoint.Pos.Z);
|
||||
return m * translate((float)-viewpoint.Pos.X, (float)-viewpoint.Pos.Y, (float)-viewpoint.Pos.Z);
|
||||
}
|
||||
|
||||
TriMatrix TriMatrix::viewToClip()
|
||||
TriMatrix TriMatrix::viewToClip(swrenderer::RenderViewport *viewport)
|
||||
{
|
||||
auto viewport = swrenderer::RenderViewport::Instance();
|
||||
float near = 5.0f;
|
||||
float far = 65536.0f;
|
||||
float width = (float)(r_viewwindow.FocalTangent * near);
|
||||
float width = (float)(viewport->viewwindow.FocalTangent * near);
|
||||
float top = (float)(viewport->CenterY / viewport->InvZtoScale * near);
|
||||
float bottom = (float)(top - viewheight / viewport->InvZtoScale * near);
|
||||
return frustum(-width, width, bottom, top, near, far);
|
||||
|
|
|
@ -24,6 +24,7 @@
|
|||
|
||||
struct TriVertex;
|
||||
struct ShadedTriVertex;
|
||||
namespace swrenderer { class RenderViewport; }
|
||||
|
||||
struct TriMatrix
|
||||
{
|
||||
|
@ -36,8 +37,8 @@ struct TriMatrix
|
|||
static TriMatrix perspective(float fovy, float aspect, float near, float far);
|
||||
static TriMatrix frustum(float left, float right, float bottom, float top, float near, float far);
|
||||
|
||||
static TriMatrix worldToView(); // Software renderer world to view space transform
|
||||
static TriMatrix viewToClip(); // Software renderer shearing projection
|
||||
static TriMatrix worldToView(const FRenderViewpoint &viewpoint); // Software renderer world to view space transform
|
||||
static TriMatrix viewToClip(swrenderer::RenderViewport *viewport); // Software renderer shearing projection
|
||||
|
||||
ShadedTriVertex operator*(TriVertex v) const;
|
||||
TriMatrix operator*(const TriMatrix &m) const;
|
||||
|
|
|
@ -57,7 +57,7 @@ void PolyRenderer::RenderView(player_t *player)
|
|||
{
|
||||
using namespace swrenderer;
|
||||
|
||||
auto viewport = RenderViewport::Instance();
|
||||
auto viewport = Thread.Viewport.get();
|
||||
|
||||
viewport->RenderTarget = screen;
|
||||
|
||||
|
@ -82,14 +82,14 @@ void PolyRenderer::RenderView(player_t *player)
|
|||
|
||||
void PolyRenderer::RenderViewToCanvas(AActor *actor, DCanvas *canvas, int x, int y, int width, int height, bool dontmaplines)
|
||||
{
|
||||
auto viewport = swrenderer::RenderViewport::Instance();
|
||||
auto viewport = Thread.Viewport.get();
|
||||
|
||||
const bool savedviewactive = viewactive;
|
||||
|
||||
viewwidth = width;
|
||||
viewport->RenderTarget = canvas;
|
||||
R_SetWindow(r_viewpoint, r_viewwindow, 12, width, height, height, true);
|
||||
viewport->SetViewport(width, height, r_viewwindow.WidescreenRatio);
|
||||
R_SetWindow(viewport->viewpoint, viewport->viewwindow, 12, width, height, height, true);
|
||||
viewport->SetViewport(width, height, viewport->viewwindow.WidescreenRatio);
|
||||
viewwindowx = x;
|
||||
viewwindowy = y;
|
||||
viewactive = true;
|
||||
|
@ -102,10 +102,10 @@ void PolyRenderer::RenderViewToCanvas(AActor *actor, DCanvas *canvas, int x, int
|
|||
canvas->Unlock();
|
||||
|
||||
viewport->RenderTarget = screen;
|
||||
R_ExecuteSetViewSize(r_viewpoint, r_viewwindow);
|
||||
R_ExecuteSetViewSize(viewport->viewpoint, viewport->viewwindow);
|
||||
float trueratio;
|
||||
ActiveRatio(width, height, &trueratio);
|
||||
viewport->SetViewport(width, height, r_viewwindow.WidescreenRatio);
|
||||
viewport->SetViewport(width, height, viewport->viewwindow.WidescreenRatio);
|
||||
viewactive = savedviewactive;
|
||||
}
|
||||
|
||||
|
@ -117,14 +117,14 @@ void PolyRenderer::RenderActorView(AActor *actor, bool dontmaplines)
|
|||
|
||||
P_FindParticleSubsectors();
|
||||
PO_LinkToSubsectors();
|
||||
R_SetupFrame(r_viewpoint, r_viewwindow, actor);
|
||||
swrenderer::CameraLight::Instance()->SetCamera(actor);
|
||||
swrenderer::RenderViewport::Instance()->SetupFreelook();
|
||||
R_SetupFrame(Thread.Viewport->viewpoint, Thread.Viewport->viewwindow, actor);
|
||||
swrenderer::CameraLight::Instance()->SetCamera(Thread.Viewport.get(), actor);
|
||||
Thread.Viewport->SetupFreelook();
|
||||
|
||||
ActorRenderFlags savedflags = r_viewpoint.camera->renderflags;
|
||||
ActorRenderFlags savedflags = Thread.Viewport->viewpoint.camera->renderflags;
|
||||
// Never draw the player unless in chasecam mode
|
||||
if (!r_viewpoint.showviewer)
|
||||
r_viewpoint.camera->renderflags |= RF_INVISIBLE;
|
||||
if (!Thread.Viewport->viewpoint.showviewer)
|
||||
Thread.Viewport->viewpoint.camera->renderflags |= RF_INVISIBLE;
|
||||
|
||||
ClearBuffers();
|
||||
SetSceneViewport();
|
||||
|
@ -135,7 +135,7 @@ void PolyRenderer::RenderActorView(AActor *actor, bool dontmaplines)
|
|||
MainPortal.RenderTranslucent(0);
|
||||
PlayerSprites.Render();
|
||||
|
||||
r_viewpoint.camera->renderflags = savedflags;
|
||||
Thread.Viewport->viewpoint.camera->renderflags = savedflags;
|
||||
interpolator.RestoreInterpolations ();
|
||||
|
||||
NetUpdate();
|
||||
|
@ -149,7 +149,7 @@ void PolyRenderer::RenderRemainingPlayerSprites()
|
|||
void PolyRenderer::ClearBuffers()
|
||||
{
|
||||
PolyVertexBuffer::Clear();
|
||||
auto viewport = swrenderer::RenderViewport::Instance();
|
||||
auto viewport = Thread.Viewport.get();
|
||||
PolyStencilBuffer::Instance()->Clear(viewport->RenderTarget->GetWidth(), viewport->RenderTarget->GetHeight(), 0);
|
||||
PolySubsectorGBuffer::Instance()->Resize(viewport->RenderTarget->GetPitch(), viewport->RenderTarget->GetHeight());
|
||||
NextStencilValue = 0;
|
||||
|
@ -161,7 +161,7 @@ void PolyRenderer::SetSceneViewport()
|
|||
{
|
||||
using namespace swrenderer;
|
||||
|
||||
auto viewport = RenderViewport::Instance();
|
||||
auto viewport = Thread.Viewport.get();
|
||||
|
||||
if (viewport->RenderTarget == screen) // Rendering to screen
|
||||
{
|
||||
|
@ -192,23 +192,25 @@ void PolyRenderer::SetupPerspectiveMatrix()
|
|||
|
||||
// Code provided courtesy of Graf Zahl. Now we just have to plug it into the viewmatrix code...
|
||||
// We have to scale the pitch to account for the pixel stretching, because the playsim doesn't know about this and treats it as 1:1.
|
||||
double radPitch = r_viewpoint.Angles.Pitch.Normalized180().Radians();
|
||||
const auto &viewpoint = Thread.Viewport->viewpoint;
|
||||
const auto &viewwindow = Thread.Viewport->viewwindow;
|
||||
double radPitch = viewpoint.Angles.Pitch.Normalized180().Radians();
|
||||
double angx = cos(radPitch);
|
||||
double angy = sin(radPitch) * glset.pixelstretch;
|
||||
double alen = sqrt(angx*angx + angy*angy);
|
||||
float adjustedPitch = (float)asin(angy / alen);
|
||||
float adjustedViewAngle = (float)(r_viewpoint.Angles.Yaw - 90).Radians();
|
||||
float adjustedViewAngle = (float)(viewpoint.Angles.Yaw - 90).Radians();
|
||||
|
||||
float ratio = r_viewwindow.WidescreenRatio;
|
||||
float fovratio = (r_viewwindow.WidescreenRatio >= 1.3f) ? 1.333333f : ratio;
|
||||
float fovy = (float)(2 * DAngle::ToDegrees(atan(tan(r_viewpoint.FieldOfView.Radians() / 2) / fovratio)).Degrees);
|
||||
float ratio = viewwindow.WidescreenRatio;
|
||||
float fovratio = (viewwindow.WidescreenRatio >= 1.3f) ? 1.333333f : ratio;
|
||||
float fovy = (float)(2 * DAngle::ToDegrees(atan(tan(viewpoint.FieldOfView.Radians() / 2) / fovratio)).Degrees);
|
||||
|
||||
TriMatrix worldToView =
|
||||
TriMatrix::rotate(adjustedPitch, 1.0f, 0.0f, 0.0f) *
|
||||
TriMatrix::rotate(adjustedViewAngle, 0.0f, -1.0f, 0.0f) *
|
||||
TriMatrix::scale(1.0f, glset.pixelstretch, 1.0f) *
|
||||
TriMatrix::swapYZ() *
|
||||
TriMatrix::translate((float)-r_viewpoint.Pos.X, (float)-r_viewpoint.Pos.Y, (float)-r_viewpoint.Pos.Z);
|
||||
TriMatrix::translate((float)-viewpoint.Pos.X, (float)-viewpoint.Pos.Y, (float)-viewpoint.Pos.Z);
|
||||
|
||||
WorldToClip = TriMatrix::perspective(fovy, ratio, 5.0f, 65535.0f) * worldToView;
|
||||
}
|
||||
|
|
|
@ -50,7 +50,7 @@ void PolyCull::CullNode(void *node)
|
|||
node_t *bsp = (node_t *)node;
|
||||
|
||||
// Decide which side the view point is on.
|
||||
int side = PointOnSide(r_viewpoint.Pos, bsp);
|
||||
int side = PointOnSide(PolyRenderer::Instance()->Thread.Viewport->viewpoint.Pos, bsp);
|
||||
|
||||
// Recursively divide front space (toward the viewer).
|
||||
CullNode(bsp->children[side]);
|
||||
|
@ -84,8 +84,8 @@ void PolyCull::CullSubsector(subsector_t *sub)
|
|||
if ((line->sidedef == nullptr || !(line->sidedef->Flags & WALLF_POLYOBJ)) && line->backsector == nullptr)
|
||||
{
|
||||
// Skip lines not facing viewer
|
||||
DVector2 pt1 = line->v1->fPos() - r_viewpoint.Pos;
|
||||
DVector2 pt2 = line->v2->fPos() - r_viewpoint.Pos;
|
||||
DVector2 pt1 = line->v1->fPos() - PolyRenderer::Instance()->Thread.Viewport->viewpoint.Pos;
|
||||
DVector2 pt2 = line->v2->fPos() - PolyRenderer::Instance()->Thread.Viewport->viewpoint.Pos;
|
||||
if (pt1.Y * (pt1.X - pt2.X) + pt1.X * (pt2.Y - pt1.Y) >= 0)
|
||||
continue;
|
||||
|
||||
|
@ -179,7 +179,7 @@ bool PolyCull::CheckBBox(float *bspcoord)
|
|||
{
|
||||
// Start using a quick frustum AABB test:
|
||||
|
||||
AxisAlignedBoundingBox aabb(Vec3f(bspcoord[BOXLEFT], bspcoord[BOXBOTTOM], (float)r_viewpoint.Pos.Z - 1000.0f), Vec3f(bspcoord[BOXRIGHT], bspcoord[BOXTOP], (float)r_viewpoint.Pos.Z + 1000.0f));
|
||||
AxisAlignedBoundingBox aabb(Vec3f(bspcoord[BOXLEFT], bspcoord[BOXBOTTOM], (float)PolyRenderer::Instance()->Thread.Viewport->viewpoint.Pos.Z - 1000.0f), Vec3f(bspcoord[BOXRIGHT], bspcoord[BOXTOP], (float)PolyRenderer::Instance()->Thread.Viewport->viewpoint.Pos.Z + 1000.0f));
|
||||
auto result = IntersectionTest::frustum_aabb(frustumPlanes, aabb);
|
||||
if (result == IntersectionTest::outside)
|
||||
return false;
|
||||
|
@ -266,14 +266,15 @@ LineSegmentRange PolyCull::GetSegmentRangeForLine(double x1, double y1, double x
|
|||
}
|
||||
|
||||
// Transform to 2D view space:
|
||||
x1 = x1 - r_viewpoint.Pos.X;
|
||||
y1 = y1 - r_viewpoint.Pos.Y;
|
||||
x2 = x2 - r_viewpoint.Pos.X;
|
||||
y2 = y2 - r_viewpoint.Pos.Y;
|
||||
double rx1 = x1 * r_viewpoint.Sin - y1 * r_viewpoint.Cos;
|
||||
double rx2 = x2 * r_viewpoint.Sin - y2 * r_viewpoint.Cos;
|
||||
double ry1 = x1 * r_viewpoint.Cos + y1 * r_viewpoint.Sin;
|
||||
double ry2 = x2 * r_viewpoint.Cos + y2 * r_viewpoint.Sin;
|
||||
const auto &viewpoint = PolyRenderer::Instance()->Thread.Viewport->viewpoint;
|
||||
x1 = x1 - viewpoint.Pos.X;
|
||||
y1 = y1 - viewpoint.Pos.Y;
|
||||
x2 = x2 - viewpoint.Pos.X;
|
||||
y2 = y2 - viewpoint.Pos.Y;
|
||||
double rx1 = x1 * viewpoint.Sin - y1 * viewpoint.Cos;
|
||||
double rx2 = x2 * viewpoint.Sin - y2 * viewpoint.Cos;
|
||||
double ry1 = x1 * viewpoint.Cos + y1 * viewpoint.Sin;
|
||||
double ry2 = x2 * viewpoint.Cos + y2 * viewpoint.Sin;
|
||||
|
||||
// Is it potentially visible when looking straight up or down?
|
||||
if (!(ry1 < updownnear && ry2 < updownnear) && !(ry1 > znear && ry2 > znear) &&
|
||||
|
|
|
@ -107,7 +107,7 @@ void RenderPolyDecal::Render(const TriMatrix &worldToClip, const Vec4f &clipPlan
|
|||
return;
|
||||
|
||||
bool foggy = false;
|
||||
int actualextralight = foggy ? 0 : r_viewpoint.extralight << 4;
|
||||
int actualextralight = foggy ? 0 : PolyRenderer::Instance()->Thread.Viewport->viewpoint.extralight << 4;
|
||||
|
||||
std::pair<float, float> offsets[4] =
|
||||
{
|
||||
|
@ -151,7 +151,7 @@ void RenderPolyDecal::Render(const TriMatrix &worldToClip, const Vec4f &clipPlan
|
|||
}
|
||||
args.uniforms.subsectorDepth = subsectorDepth;
|
||||
|
||||
if (swrenderer::RenderViewport::Instance()->RenderTarget->IsBgra())
|
||||
if (PolyRenderer::Instance()->Thread.Viewport->RenderTarget->IsBgra())
|
||||
{
|
||||
args.uniforms.color = 0xff000000 | decal->AlphaColor;
|
||||
}
|
||||
|
|
|
@ -35,10 +35,12 @@ void RenderPolyParticle::Render(const TriMatrix &worldToClip, const Vec4f &clipP
|
|||
double psize = particle->size / 8.0;
|
||||
double zpos = pos.Z;
|
||||
|
||||
const auto &viewpoint = PolyRenderer::Instance()->Thread.Viewport->viewpoint;
|
||||
|
||||
DVector2 points[2] =
|
||||
{
|
||||
{ pos.X - r_viewpoint.Sin * psize, pos.Y + r_viewpoint.Cos * psize },
|
||||
{ pos.X + r_viewpoint.Sin * psize, pos.Y - r_viewpoint.Cos * psize }
|
||||
{ pos.X - viewpoint.Sin * psize, pos.Y + viewpoint.Cos * psize },
|
||||
{ pos.X + viewpoint.Sin * psize, pos.Y - viewpoint.Cos * psize }
|
||||
};
|
||||
|
||||
TriVertex *vertices = PolyVertexBuffer::GetVertices(4);
|
||||
|
@ -46,7 +48,7 @@ void RenderPolyParticle::Render(const TriMatrix &worldToClip, const Vec4f &clipP
|
|||
return;
|
||||
|
||||
bool foggy = false;
|
||||
int actualextralight = foggy ? 0 : r_viewpoint.extralight << 4;
|
||||
int actualextralight = foggy ? 0 : viewpoint.extralight << 4;
|
||||
|
||||
std::pair<float, float> offsets[4] =
|
||||
{
|
||||
|
@ -90,7 +92,7 @@ void RenderPolyParticle::Render(const TriMatrix &worldToClip, const Vec4f &clipP
|
|||
|
||||
uint32_t alpha = (uint32_t)clamp(particle->alpha * 255.0f + 0.5f, 0.0f, 255.0f);
|
||||
|
||||
if (swrenderer::RenderViewport::Instance()->RenderTarget->IsBgra())
|
||||
if (PolyRenderer::Instance()->Thread.Viewport->RenderTarget->IsBgra())
|
||||
{
|
||||
args.uniforms.color = (alpha << 24) | (particle->color & 0xffffff);
|
||||
}
|
||||
|
|
|
@ -39,6 +39,8 @@ void RenderPolyPlane::RenderPlanes(const TriMatrix &worldToClip, const Vec4f &cl
|
|||
|
||||
if (r_3dfloors)
|
||||
{
|
||||
const auto &viewpoint = PolyRenderer::Instance()->Thread.Viewport->viewpoint;
|
||||
|
||||
auto frontsector = sub->sector;
|
||||
auto &ffloors = frontsector->e->XFloor.ffloors;
|
||||
|
||||
|
@ -57,7 +59,7 @@ void RenderPolyPlane::RenderPlanes(const TriMatrix &worldToClip, const Vec4f &cl
|
|||
//fakeFloor->alpha
|
||||
|
||||
double fakeHeight = fakeFloor->top.plane->ZatPoint(frontsector->centerspot);
|
||||
if (fakeHeight < r_viewpoint.Pos.Z && fakeHeight > frontsector->floorplane.ZatPoint(frontsector->centerspot))
|
||||
if (fakeHeight < viewpoint.Pos.Z && fakeHeight > frontsector->floorplane.ZatPoint(frontsector->centerspot))
|
||||
{
|
||||
plane.Render3DFloor(worldToClip, clipPlane, sub, subsectorDepth, stencilValue, false, fakeFloor);
|
||||
}
|
||||
|
@ -78,7 +80,7 @@ void RenderPolyPlane::RenderPlanes(const TriMatrix &worldToClip, const Vec4f &cl
|
|||
//fakeFloor->alpha
|
||||
|
||||
double fakeHeight = fakeFloor->bottom.plane->ZatPoint(frontsector->centerspot);
|
||||
if (fakeHeight > r_viewpoint.Pos.Z && fakeHeight < frontsector->ceilingplane.ZatPoint(frontsector->centerspot))
|
||||
if (fakeHeight > viewpoint.Pos.Z && fakeHeight < frontsector->ceilingplane.ZatPoint(frontsector->centerspot))
|
||||
{
|
||||
plane.Render3DFloor(worldToClip, clipPlane, sub, subsectorDepth, stencilValue, true, fakeFloor);
|
||||
}
|
||||
|
@ -154,6 +156,7 @@ void RenderPolyPlane::Render3DFloor(const TriMatrix &worldToClip, const Vec4f &c
|
|||
|
||||
void RenderPolyPlane::Render(const TriMatrix &worldToClip, const Vec4f &clipPlane, PolyCull &cull, subsector_t *sub, uint32_t subsectorDepth, uint32_t stencilValue, bool ceiling, double skyHeight, std::vector<std::unique_ptr<PolyDrawSectorPortal>> §orPortals)
|
||||
{
|
||||
const auto &viewpoint = PolyRenderer::Instance()->Thread.Viewport->viewpoint;
|
||||
std::vector<PolyPortalSegment> portalSegments;
|
||||
FSectorPortal *portal = nullptr;// sub->sector->ValidatePortal(ceiling ? sector_t::ceiling : sector_t::floor);
|
||||
bool foggy = false;
|
||||
|
@ -187,8 +190,8 @@ void RenderPolyPlane::Render(const TriMatrix &worldToClip, const Vec4f &clipPlan
|
|||
{
|
||||
seg_t *line = &sub->firstline[i];
|
||||
|
||||
DVector2 pt1 = line->v1->fPos() - r_viewpoint.Pos;
|
||||
DVector2 pt2 = line->v2->fPos() - r_viewpoint.Pos;
|
||||
DVector2 pt1 = line->v1->fPos() - viewpoint.Pos;
|
||||
DVector2 pt2 = line->v2->fPos() - viewpoint.Pos;
|
||||
if (pt1.Y * (pt1.X - pt2.X) + pt1.X * (pt2.Y - pt1.Y) >= 0)
|
||||
inside = false;
|
||||
|
||||
|
@ -218,7 +221,7 @@ void RenderPolyPlane::Render(const TriMatrix &worldToClip, const Vec4f &clipPlan
|
|||
else if(polyportal->PortalPlane == Vec4f(0.0f) || Vec4f::dot(polyportal->PortalPlane, Vec4f((float)v.X, (float)v.Y, 0.0f, 1.0f)) > 0.0f)
|
||||
{
|
||||
DVector2 planePos = v;
|
||||
DVector2 planeNormal = v - r_viewpoint.Pos;
|
||||
DVector2 planeNormal = v - viewpoint.Pos;
|
||||
planeNormal.MakeUnit();
|
||||
double planeD = -(planeNormal | (planePos + planeNormal * 0.001));
|
||||
polyportal->PortalPlane = Vec4f((float)planeNormal.X, (float)planeNormal.Y, 0.0f, (float)planeD);
|
||||
|
@ -238,7 +241,7 @@ void RenderPolyPlane::Render(const TriMatrix &worldToClip, const Vec4f &clipPlan
|
|||
{
|
||||
// Floor and ceiling texture needs to be swapped sometimes? Why?? :(
|
||||
|
||||
if (r_viewpoint.Pos.Z < fakesector->floorplane.Zat0()) // In water
|
||||
if (viewpoint.Pos.Z < fakesector->floorplane.Zat0()) // In water
|
||||
{
|
||||
if (ceiling)
|
||||
{
|
||||
|
@ -254,7 +257,7 @@ void RenderPolyPlane::Render(const TriMatrix &worldToClip, const Vec4f &clipPlan
|
|||
ccw = true;
|
||||
}
|
||||
}
|
||||
else if (r_viewpoint.Pos.Z >= fakesector->ceilingplane.Zat0() && !fakeflooronly) // In ceiling water
|
||||
else if (viewpoint.Pos.Z >= fakesector->ceilingplane.Zat0() && !fakeflooronly) // In ceiling water
|
||||
{
|
||||
if (ceiling)
|
||||
{
|
||||
|
|
|
@ -42,19 +42,21 @@ void RenderPolyPlayerSprites::Render()
|
|||
// This code cannot be moved directly to RenderRemainingSprites because the engine
|
||||
// draws the canvas textures between this call and the final call to RenderRemainingSprites..
|
||||
|
||||
const auto &viewpoint = PolyRenderer::Instance()->Thread.Viewport->viewpoint;
|
||||
|
||||
if (!r_drawplayersprites ||
|
||||
!r_viewpoint.camera ||
|
||||
!r_viewpoint.camera->player ||
|
||||
!viewpoint.camera ||
|
||||
!viewpoint.camera->player ||
|
||||
(players[consoleplayer].cheats & CF_CHASECAM) ||
|
||||
(r_deathcamera && r_viewpoint.camera->health <= 0))
|
||||
(r_deathcamera && viewpoint.camera->health <= 0))
|
||||
return;
|
||||
|
||||
float bobx, boby;
|
||||
P_BobWeapon(r_viewpoint.camera->player, &bobx, &boby, r_viewpoint.TicFrac);
|
||||
P_BobWeapon(viewpoint.camera->player, &bobx, &boby, viewpoint.TicFrac);
|
||||
|
||||
// Interpolate the main weapon layer once so as to be able to add it to other layers.
|
||||
double wx, wy;
|
||||
DPSprite *weapon = r_viewpoint.camera->player->FindPSprite(PSP_WEAPON);
|
||||
DPSprite *weapon = viewpoint.camera->player->FindPSprite(PSP_WEAPON);
|
||||
if (weapon)
|
||||
{
|
||||
if (weapon->firstTic)
|
||||
|
@ -64,8 +66,8 @@ void RenderPolyPlayerSprites::Render()
|
|||
}
|
||||
else
|
||||
{
|
||||
wx = weapon->oldx + (weapon->x - weapon->oldx) * r_viewpoint.TicFrac;
|
||||
wy = weapon->oldy + (weapon->y - weapon->oldy) * r_viewpoint.TicFrac;
|
||||
wx = weapon->oldx + (weapon->x - weapon->oldx) * viewpoint.TicFrac;
|
||||
wy = weapon->oldy + (weapon->y - weapon->oldy) * viewpoint.TicFrac;
|
||||
}
|
||||
}
|
||||
else
|
||||
|
@ -74,7 +76,7 @@ void RenderPolyPlayerSprites::Render()
|
|||
wy = 0;
|
||||
}
|
||||
|
||||
for (DPSprite *sprite = r_viewpoint.camera->player->psprites; sprite != nullptr; sprite = sprite->GetNext())
|
||||
for (DPSprite *sprite = viewpoint.camera->player->psprites; sprite != nullptr; sprite = sprite->GetNext())
|
||||
{
|
||||
// [RH] Don't draw the targeter's crosshair if the player already has a crosshair set.
|
||||
// It's possible this psprite's caller is now null but the layer itself hasn't been destroyed
|
||||
|
@ -82,7 +84,7 @@ void RenderPolyPlayerSprites::Render()
|
|||
// In this case let's simply not draw it to avoid crashing.
|
||||
if ((sprite->GetID() != PSP_TARGETCENTER || CrosshairImage == nullptr) && sprite->GetCaller() != nullptr)
|
||||
{
|
||||
RenderSprite(sprite, r_viewpoint.camera, bobx, boby, wx, wy, r_viewpoint.TicFrac);
|
||||
RenderSprite(sprite, viewpoint.camera, bobx, boby, wx, wy, viewpoint.TicFrac);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -141,9 +143,10 @@ void RenderPolyPlayerSprites::RenderSprite(DPSprite *sprite, AActor *owner, floa
|
|||
sy += wy;
|
||||
}
|
||||
|
||||
auto viewport = swrenderer::RenderViewport::Instance();
|
||||
auto viewport = PolyRenderer::Instance()->Thread.Viewport.get();
|
||||
const auto &viewpoint = viewport->viewpoint;
|
||||
|
||||
double pspritexscale = r_viewwindow.centerxwide / 160.0;
|
||||
double pspritexscale = PolyRenderer::Instance()->Thread.Viewport->viewwindow.centerxwide / 160.0;
|
||||
double pspriteyscale = pspritexscale * viewport->YaspectMul;
|
||||
double pspritexiscale = 1 / pspritexscale;
|
||||
|
||||
|
@ -167,7 +170,7 @@ void RenderPolyPlayerSprites::RenderSprite(DPSprite *sprite, AActor *owner, floa
|
|||
double texturemid = (BaseYCenter - sy) * tex->Scale.Y + tex->TopOffset;
|
||||
|
||||
// Adjust PSprite for fullscreen views
|
||||
if (r_viewpoint.camera->player && (viewport->RenderTarget != screen || viewheight == viewport->RenderTarget->GetHeight() || (viewport->RenderTarget->GetWidth() > (BaseXCenter * 2) && !st_scale)))
|
||||
if (viewpoint.camera->player && (viewport->RenderTarget != screen || viewheight == viewport->RenderTarget->GetHeight() || (viewport->RenderTarget->GetWidth() > (BaseXCenter * 2) && !st_scale)))
|
||||
{
|
||||
AWeapon *weapon = dyn_cast<AWeapon>(sprite->GetCaller());
|
||||
if (weapon != nullptr && weapon->YAdjust != 0)
|
||||
|
@ -186,7 +189,7 @@ void RenderPolyPlayerSprites::RenderSprite(DPSprite *sprite, AActor *owner, floa
|
|||
// Move the weapon down for 1280x1024.
|
||||
if (sprite->GetID() < PSP_TARGETCENTER)
|
||||
{
|
||||
texturemid -= AspectPspriteOffset(r_viewwindow.WidescreenRatio);
|
||||
texturemid -= AspectPspriteOffset(PolyRenderer::Instance()->Thread.Viewport->viewwindow.WidescreenRatio);
|
||||
}
|
||||
|
||||
int clipped_x1 = MAX(x1, 0);
|
||||
|
@ -212,7 +215,7 @@ void RenderPolyPlayerSprites::RenderSprite(DPSprite *sprite, AActor *owner, floa
|
|||
|
||||
bool noaccel = false;
|
||||
|
||||
FDynamicColormap *basecolormap = r_viewpoint.sector->ColorMap;
|
||||
FDynamicColormap *basecolormap = viewpoint.sector->ColorMap;
|
||||
FDynamicColormap *colormap_to_use = basecolormap;
|
||||
|
||||
int ColormapNum = 0;
|
||||
|
@ -222,7 +225,7 @@ void RenderPolyPlayerSprites::RenderSprite(DPSprite *sprite, AActor *owner, floa
|
|||
RenderStyle = STYLE_Normal;
|
||||
|
||||
bool foggy = false;
|
||||
int actualextralight = foggy ? 0 : r_viewpoint.extralight << 4;
|
||||
int actualextralight = foggy ? 0 : viewpoint.extralight << 4;
|
||||
int spriteshade = swrenderer::LightVisibility::LightLevelToShade(owner->Sector->lightlevel + actualextralight, foggy);
|
||||
double minz = double((2048 * 4) / double(1 << 20));
|
||||
ColormapNum = GETPALOOKUP(swrenderer::LightVisibility::Instance()->SpriteGlobVis(foggy) / minz, spriteshade);
|
||||
|
@ -287,14 +290,14 @@ void RenderPolyPlayerSprites::RenderSprite(DPSprite *sprite, AActor *owner, floa
|
|||
}
|
||||
*/
|
||||
|
||||
if (r_viewpoint.camera->Inventory != nullptr)
|
||||
if (viewpoint.camera->Inventory != nullptr)
|
||||
{
|
||||
visstyle_t visstyle;
|
||||
visstyle.Alpha = Alpha;
|
||||
visstyle.RenderStyle = STYLE_Count;
|
||||
visstyle.Invert = false;
|
||||
|
||||
r_viewpoint.camera->Inventory->AlterWeaponSprite(&visstyle);
|
||||
viewpoint.camera->Inventory->AlterWeaponSprite(&visstyle);
|
||||
|
||||
Alpha = visstyle.Alpha;
|
||||
|
||||
|
@ -345,7 +348,7 @@ void RenderPolyPlayerSprites::RenderSprite(DPSprite *sprite, AActor *owner, floa
|
|||
|
||||
// Check for hardware-assisted 2D. If it's available, and this sprite is not
|
||||
// fuzzy, don't draw it until after the switch to 2D mode.
|
||||
if (!noaccel && swrenderer::RenderViewport::Instance()->RenderTarget == screen && (DFrameBuffer *)screen->Accel2D)
|
||||
if (!noaccel && PolyRenderer::Instance()->Thread.Viewport->RenderTarget == screen && (DFrameBuffer *)screen->Accel2D)
|
||||
{
|
||||
FRenderStyle style = RenderStyle;
|
||||
style.CheckFuzz();
|
||||
|
|
|
@ -47,21 +47,23 @@ void PolyDrawSectorPortal::Render(int portalDepth)
|
|||
SaveGlobals();
|
||||
|
||||
// To do: get this information from PolyRenderer instead of duplicating the code..
|
||||
double radPitch = r_viewpoint.Angles.Pitch.Normalized180().Radians();
|
||||
const auto &viewpoint = PolyRenderer::Instance()->Thread.Viewport->viewpoint;
|
||||
const auto &viewwindow = PolyRenderer::Instance()->Thread.Viewport->viewwindow;
|
||||
double radPitch = viewpoint.Angles.Pitch.Normalized180().Radians();
|
||||
double angx = cos(radPitch);
|
||||
double angy = sin(radPitch) * glset.pixelstretch;
|
||||
double alen = sqrt(angx*angx + angy*angy);
|
||||
float adjustedPitch = (float)asin(angy / alen);
|
||||
float adjustedViewAngle = (float)(r_viewpoint.Angles.Yaw - 90).Radians();
|
||||
float ratio = r_viewwindow.WidescreenRatio;
|
||||
float fovratio = (r_viewwindow.WidescreenRatio >= 1.3f) ? 1.333333f : ratio;
|
||||
float fovy = (float)(2 * DAngle::ToDegrees(atan(tan(r_viewpoint.FieldOfView.Radians() / 2) / fovratio)).Degrees);
|
||||
float adjustedViewAngle = (float)(viewpoint.Angles.Yaw - 90).Radians();
|
||||
float ratio = viewwindow.WidescreenRatio;
|
||||
float fovratio = (viewwindow.WidescreenRatio >= 1.3f) ? 1.333333f : ratio;
|
||||
float fovy = (float)(2 * DAngle::ToDegrees(atan(tan(viewpoint.FieldOfView.Radians() / 2) / fovratio)).Degrees);
|
||||
TriMatrix worldToView =
|
||||
TriMatrix::rotate(adjustedPitch, 1.0f, 0.0f, 0.0f) *
|
||||
TriMatrix::rotate(adjustedViewAngle, 0.0f, -1.0f, 0.0f) *
|
||||
TriMatrix::scale(1.0f, glset.pixelstretch, 1.0f) *
|
||||
TriMatrix::swapYZ() *
|
||||
TriMatrix::translate((float)-r_viewpoint.Pos.X, (float)-r_viewpoint.Pos.Y, (float)-r_viewpoint.Pos.Z);
|
||||
TriMatrix::translate((float)-viewpoint.Pos.X, (float)-viewpoint.Pos.Y, (float)-viewpoint.Pos.Z);
|
||||
TriMatrix worldToClip = TriMatrix::perspective(fovy, ratio, 5.0f, 65535.0f) * worldToView;
|
||||
|
||||
RenderPortal.SetViewpoint(worldToClip, PortalPlane, StencilValue);
|
||||
|
@ -85,33 +87,36 @@ void PolyDrawSectorPortal::RenderTranslucent(int portalDepth)
|
|||
|
||||
void PolyDrawSectorPortal::SaveGlobals()
|
||||
{
|
||||
savedextralight = r_viewpoint.extralight;
|
||||
savedpos = r_viewpoint.Pos;
|
||||
savedangles = r_viewpoint.Angles;
|
||||
auto &viewpoint = PolyRenderer::Instance()->Thread.Viewport->viewpoint;
|
||||
const auto &viewwindow = PolyRenderer::Instance()->Thread.Viewport->viewwindow;
|
||||
|
||||
savedextralight = viewpoint.extralight;
|
||||
savedpos = viewpoint.Pos;
|
||||
savedangles = viewpoint.Angles;
|
||||
savedvisibility = swrenderer::LightVisibility::Instance()->GetVisibility();
|
||||
savedcamera = r_viewpoint.camera;
|
||||
savedsector = r_viewpoint.sector;
|
||||
savedcamera = viewpoint.camera;
|
||||
savedsector = viewpoint.sector;
|
||||
|
||||
if (Portal->mType == PORTS_SKYVIEWPOINT)
|
||||
{
|
||||
// Don't let gun flashes brighten the sky box
|
||||
AActor *sky = Portal->mSkybox;
|
||||
r_viewpoint.extralight = 0;
|
||||
swrenderer::LightVisibility::Instance()->SetVisibility(sky->args[0] * 0.25f);
|
||||
r_viewpoint.Pos = sky->InterpolatedPosition(r_viewpoint.TicFrac);
|
||||
r_viewpoint.Angles.Yaw = savedangles.Yaw + (sky->PrevAngles.Yaw + deltaangle(sky->PrevAngles.Yaw, sky->Angles.Yaw) * r_viewpoint.TicFrac);
|
||||
viewpoint.extralight = 0;
|
||||
swrenderer::LightVisibility::Instance()->SetVisibility(PolyRenderer::Instance()->Thread.Viewport.get(), sky->args[0] * 0.25f);
|
||||
viewpoint.Pos = sky->InterpolatedPosition(viewpoint.TicFrac);
|
||||
viewpoint.Angles.Yaw = savedangles.Yaw + (sky->PrevAngles.Yaw + deltaangle(sky->PrevAngles.Yaw, sky->Angles.Yaw) * viewpoint.TicFrac);
|
||||
}
|
||||
else //if (Portal->mType == PORTS_STACKEDSECTORTHING || Portal->mType == PORTS_PORTAL || Portal->mType == PORTS_LINKEDPORTAL)
|
||||
{
|
||||
//extralight = pl->extralight;
|
||||
//swrenderer::R_SetVisibility(pl->visibility);
|
||||
r_viewpoint.Pos.X += Portal->mDisplacement.X;
|
||||
r_viewpoint.Pos.Y += Portal->mDisplacement.Y;
|
||||
viewpoint.Pos.X += Portal->mDisplacement.X;
|
||||
viewpoint.Pos.Y += Portal->mDisplacement.Y;
|
||||
}
|
||||
|
||||
r_viewpoint.camera = nullptr;
|
||||
r_viewpoint.sector = Portal->mDestination;
|
||||
R_SetViewAngle(r_viewpoint, r_viewwindow);
|
||||
viewpoint.camera = nullptr;
|
||||
viewpoint.sector = Portal->mDestination;
|
||||
R_SetViewAngle(viewpoint, viewwindow);
|
||||
|
||||
Portal->mFlags |= PORTSF_INSKYBOX;
|
||||
if (Portal->mPartner > 0) level.sectorPortals[Portal->mPartner].mFlags |= PORTSF_INSKYBOX;
|
||||
|
@ -122,13 +127,16 @@ void PolyDrawSectorPortal::RestoreGlobals()
|
|||
Portal->mFlags &= ~PORTSF_INSKYBOX;
|
||||
if (Portal->mPartner > 0) level.sectorPortals[Portal->mPartner].mFlags &= ~PORTSF_INSKYBOX;
|
||||
|
||||
r_viewpoint.camera = savedcamera;
|
||||
r_viewpoint.sector = savedsector;
|
||||
r_viewpoint.Pos = savedpos;
|
||||
swrenderer::LightVisibility::Instance()->SetVisibility(savedvisibility);
|
||||
r_viewpoint.extralight = savedextralight;
|
||||
r_viewpoint.Angles = savedangles;
|
||||
R_SetViewAngle(r_viewpoint, r_viewwindow);
|
||||
auto &viewpoint = PolyRenderer::Instance()->Thread.Viewport->viewpoint;
|
||||
const auto &viewwindow = PolyRenderer::Instance()->Thread.Viewport->viewwindow;
|
||||
|
||||
viewpoint.camera = savedcamera;
|
||||
viewpoint.sector = savedsector;
|
||||
viewpoint.Pos = savedpos;
|
||||
swrenderer::LightVisibility::Instance()->SetVisibility(PolyRenderer::Instance()->Thread.Viewport.get(), savedvisibility);
|
||||
viewpoint.extralight = savedextralight;
|
||||
viewpoint.Angles = savedangles;
|
||||
R_SetViewAngle(viewpoint, viewwindow);
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
@ -148,21 +156,23 @@ void PolyDrawLinePortal::Render(int portalDepth)
|
|||
SaveGlobals();
|
||||
|
||||
// To do: get this information from PolyRenderer instead of duplicating the code..
|
||||
double radPitch = r_viewpoint.Angles.Pitch.Normalized180().Radians();
|
||||
const auto &viewpoint = PolyRenderer::Instance()->Thread.Viewport->viewpoint;
|
||||
const auto &viewwindow = PolyRenderer::Instance()->Thread.Viewport->viewwindow;
|
||||
double radPitch = viewpoint.Angles.Pitch.Normalized180().Radians();
|
||||
double angx = cos(radPitch);
|
||||
double angy = sin(radPitch) * glset.pixelstretch;
|
||||
double alen = sqrt(angx*angx + angy*angy);
|
||||
float adjustedPitch = (float)asin(angy / alen);
|
||||
float adjustedViewAngle = (float)(r_viewpoint.Angles.Yaw - 90).Radians();
|
||||
float ratio = r_viewwindow.WidescreenRatio;
|
||||
float fovratio = (r_viewwindow.WidescreenRatio >= 1.3f) ? 1.333333f : ratio;
|
||||
float fovy = (float)(2 * DAngle::ToDegrees(atan(tan(r_viewpoint.FieldOfView.Radians() / 2) / fovratio)).Degrees);
|
||||
float adjustedViewAngle = (float)(viewpoint.Angles.Yaw - 90).Radians();
|
||||
float ratio = viewwindow.WidescreenRatio;
|
||||
float fovratio = (viewwindow.WidescreenRatio >= 1.3f) ? 1.333333f : ratio;
|
||||
float fovy = (float)(2 * DAngle::ToDegrees(atan(tan(viewpoint.FieldOfView.Radians() / 2) / fovratio)).Degrees);
|
||||
TriMatrix worldToView =
|
||||
TriMatrix::rotate(adjustedPitch, 1.0f, 0.0f, 0.0f) *
|
||||
TriMatrix::rotate(adjustedViewAngle, 0.0f, -1.0f, 0.0f) *
|
||||
TriMatrix::scale(1.0f, glset.pixelstretch, 1.0f) *
|
||||
TriMatrix::swapYZ() *
|
||||
TriMatrix::translate((float)-r_viewpoint.Pos.X, (float)-r_viewpoint.Pos.Y, (float)-r_viewpoint.Pos.Z);
|
||||
TriMatrix::translate((float)-viewpoint.Pos.X, (float)-viewpoint.Pos.Y, (float)-viewpoint.Pos.Z);
|
||||
if (Mirror)
|
||||
worldToView = TriMatrix::scale(-1.0f, 1.0f, 1.0f) * worldToView;
|
||||
TriMatrix worldToClip = TriMatrix::perspective(fovy, ratio, 5.0f, 65535.0f) * worldToView;
|
||||
|
@ -191,30 +201,33 @@ void PolyDrawLinePortal::RenderTranslucent(int portalDepth)
|
|||
|
||||
void PolyDrawLinePortal::SaveGlobals()
|
||||
{
|
||||
savedextralight = r_viewpoint.extralight;
|
||||
savedpos = r_viewpoint.Pos;
|
||||
savedangles = r_viewpoint.Angles;
|
||||
savedcamera = r_viewpoint.camera;
|
||||
savedsector = r_viewpoint.sector;
|
||||
savedinvisibility = r_viewpoint.camera ? (r_viewpoint.camera->renderflags & RF_INVISIBLE) == RF_INVISIBLE : false;
|
||||
savedViewPath[0] = r_viewpoint.Path[0];
|
||||
savedViewPath[1] = r_viewpoint.Path[1];
|
||||
auto &viewpoint = PolyRenderer::Instance()->Thread.Viewport->viewpoint;
|
||||
const auto &viewwindow = PolyRenderer::Instance()->Thread.Viewport->viewwindow;
|
||||
|
||||
savedextralight = viewpoint.extralight;
|
||||
savedpos = viewpoint.Pos;
|
||||
savedangles = viewpoint.Angles;
|
||||
savedcamera = viewpoint.camera;
|
||||
savedsector = viewpoint.sector;
|
||||
savedinvisibility = viewpoint.camera ? (viewpoint.camera->renderflags & RF_INVISIBLE) == RF_INVISIBLE : false;
|
||||
savedViewPath[0] = viewpoint.Path[0];
|
||||
savedViewPath[1] = viewpoint.Path[1];
|
||||
|
||||
if (Mirror)
|
||||
{
|
||||
DAngle startang = r_viewpoint.Angles.Yaw;
|
||||
DVector3 startpos = r_viewpoint.Pos;
|
||||
DAngle startang = viewpoint.Angles.Yaw;
|
||||
DVector3 startpos = viewpoint.Pos;
|
||||
|
||||
vertex_t *v1 = Mirror->v1;
|
||||
|
||||
// Reflect the current view behind the mirror.
|
||||
if (Mirror->Delta().X == 0)
|
||||
{ // vertical mirror
|
||||
r_viewpoint.Pos.X = v1->fX() - startpos.X + v1->fX();
|
||||
viewpoint.Pos.X = v1->fX() - startpos.X + v1->fX();
|
||||
}
|
||||
else if (Mirror->Delta().Y == 0)
|
||||
{ // horizontal mirror
|
||||
r_viewpoint.Pos.Y = v1->fY() - startpos.Y + v1->fY();
|
||||
viewpoint.Pos.Y = v1->fY() - startpos.Y + v1->fY();
|
||||
}
|
||||
else
|
||||
{ // any mirror
|
||||
|
@ -230,36 +243,36 @@ void PolyDrawLinePortal::SaveGlobals()
|
|||
// the above two cases catch len == 0
|
||||
double r = ((x - x1)*dx + (y - y1)*dy) / (dx*dx + dy*dy);
|
||||
|
||||
r_viewpoint.Pos.X = (x1 + r * dx) * 2 - x;
|
||||
r_viewpoint.Pos.Y = (y1 + r * dy) * 2 - y;
|
||||
viewpoint.Pos.X = (x1 + r * dx) * 2 - x;
|
||||
viewpoint.Pos.Y = (y1 + r * dy) * 2 - y;
|
||||
}
|
||||
r_viewpoint.Angles.Yaw = Mirror->Delta().Angle() * 2 - startang;
|
||||
viewpoint.Angles.Yaw = Mirror->Delta().Angle() * 2 - startang;
|
||||
|
||||
if (r_viewpoint.camera)
|
||||
r_viewpoint.camera->renderflags &= ~RF_INVISIBLE;
|
||||
if (viewpoint.camera)
|
||||
viewpoint.camera->renderflags &= ~RF_INVISIBLE;
|
||||
}
|
||||
else
|
||||
{
|
||||
auto src = Portal->mOrigin;
|
||||
auto dst = Portal->mDestination;
|
||||
|
||||
P_TranslatePortalXY(src, r_viewpoint.Pos.X, r_viewpoint.Pos.Y);
|
||||
P_TranslatePortalZ(src, r_viewpoint.Pos.Z);
|
||||
P_TranslatePortalAngle(src, r_viewpoint.Angles.Yaw);
|
||||
P_TranslatePortalXY(src, r_viewpoint.Path[0].X, r_viewpoint.Path[0].Y);
|
||||
P_TranslatePortalXY(src, r_viewpoint.Path[1].X, r_viewpoint.Path[1].Y);
|
||||
P_TranslatePortalXY(src, viewpoint.Pos.X, viewpoint.Pos.Y);
|
||||
P_TranslatePortalZ(src, viewpoint.Pos.Z);
|
||||
P_TranslatePortalAngle(src, viewpoint.Angles.Yaw);
|
||||
P_TranslatePortalXY(src, viewpoint.Path[0].X, viewpoint.Path[0].Y);
|
||||
P_TranslatePortalXY(src, viewpoint.Path[1].X, viewpoint.Path[1].Y);
|
||||
|
||||
if (!r_viewpoint.showviewer && r_viewpoint.camera && P_PointOnLineSidePrecise(r_viewpoint.Path[0], dst) != P_PointOnLineSidePrecise(r_viewpoint.Path[1], dst))
|
||||
if (!viewpoint.showviewer && viewpoint.camera && P_PointOnLineSidePrecise(viewpoint.Path[0], dst) != P_PointOnLineSidePrecise(viewpoint.Path[1], dst))
|
||||
{
|
||||
double distp = (r_viewpoint.Path[0] - r_viewpoint.Path[1]).Length();
|
||||
double distp = (viewpoint.Path[0] - viewpoint.Path[1]).Length();
|
||||
if (distp > EQUAL_EPSILON)
|
||||
{
|
||||
double dist1 = (r_viewpoint.Pos - r_viewpoint.Path[0]).Length();
|
||||
double dist2 = (r_viewpoint.Pos - r_viewpoint.Path[1]).Length();
|
||||
double dist1 = (viewpoint.Pos - viewpoint.Path[0]).Length();
|
||||
double dist2 = (viewpoint.Pos - viewpoint.Path[1]).Length();
|
||||
|
||||
if (dist1 + dist2 < distp + 1)
|
||||
{
|
||||
r_viewpoint.camera->renderflags |= RF_INVISIBLE;
|
||||
viewpoint.camera->renderflags |= RF_INVISIBLE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -267,7 +280,7 @@ void PolyDrawLinePortal::SaveGlobals()
|
|||
|
||||
//camera = nullptr;
|
||||
//viewsector = R_PointInSubsector(ViewPos)->sector;
|
||||
R_SetViewAngle(r_viewpoint, r_viewwindow);
|
||||
R_SetViewAngle(viewpoint, viewwindow);
|
||||
|
||||
if (Mirror)
|
||||
PolyTriangleDrawer::toggle_mirror();
|
||||
|
@ -275,21 +288,23 @@ void PolyDrawLinePortal::SaveGlobals()
|
|||
|
||||
void PolyDrawLinePortal::RestoreGlobals()
|
||||
{
|
||||
if (r_viewpoint.camera)
|
||||
auto &viewpoint = PolyRenderer::Instance()->Thread.Viewport->viewpoint;
|
||||
const auto &viewwindow = PolyRenderer::Instance()->Thread.Viewport->viewwindow;
|
||||
if (viewpoint.camera)
|
||||
{
|
||||
if (savedinvisibility)
|
||||
r_viewpoint.camera->renderflags |= RF_INVISIBLE;
|
||||
viewpoint.camera->renderflags |= RF_INVISIBLE;
|
||||
else
|
||||
r_viewpoint.camera->renderflags &= ~RF_INVISIBLE;
|
||||
viewpoint.camera->renderflags &= ~RF_INVISIBLE;
|
||||
}
|
||||
r_viewpoint.camera = savedcamera;
|
||||
r_viewpoint.sector = savedsector;
|
||||
r_viewpoint.Pos = savedpos;
|
||||
r_viewpoint.extralight = savedextralight;
|
||||
r_viewpoint.Angles = savedangles;
|
||||
r_viewpoint.Path[0] = savedViewPath[0];
|
||||
r_viewpoint.Path[1] = savedViewPath[1];
|
||||
R_SetViewAngle(r_viewpoint, r_viewwindow);
|
||||
viewpoint.camera = savedcamera;
|
||||
viewpoint.sector = savedsector;
|
||||
viewpoint.Pos = savedpos;
|
||||
viewpoint.extralight = savedextralight;
|
||||
viewpoint.Angles = savedangles;
|
||||
viewpoint.Path[0] = savedViewPath[0];
|
||||
viewpoint.Path[1] = savedViewPath[1];
|
||||
R_SetViewAngle(viewpoint, viewwindow);
|
||||
|
||||
if (Mirror)
|
||||
PolyTriangleDrawer::toggle_mirror();
|
||||
|
|
|
@ -186,9 +186,11 @@ void RenderPolyScene::RenderSprite(AActor *thing, double sortDistance, DVector2
|
|||
|
||||
void RenderPolyScene::RenderLine(subsector_t *sub, seg_t *line, sector_t *frontsector, uint32_t subsectorDepth)
|
||||
{
|
||||
const auto &viewpoint = PolyRenderer::Instance()->Thread.Viewport->viewpoint;
|
||||
|
||||
// Reject lines not facing viewer
|
||||
DVector2 pt1 = line->v1->fPos() - r_viewpoint.Pos;
|
||||
DVector2 pt2 = line->v2->fPos() - r_viewpoint.Pos;
|
||||
DVector2 pt1 = line->v1->fPos() - viewpoint.Pos;
|
||||
DVector2 pt2 = line->v2->fPos() - viewpoint.Pos;
|
||||
if (pt1.Y * (pt1.X - pt2.X) + pt1.X * (pt2.Y - pt1.Y) >= 0)
|
||||
return;
|
||||
|
||||
|
@ -328,6 +330,7 @@ void RenderPolyScene::RenderTranslucent(int portalDepth)
|
|||
}
|
||||
}
|
||||
|
||||
const auto &viewpoint = PolyRenderer::Instance()->Thread.Viewport->viewpoint;
|
||||
for (sector_t *sector : SeenSectors)
|
||||
{
|
||||
for (AActor *thing = sector->thinglist; thing != nullptr; thing = thing->snext)
|
||||
|
@ -335,7 +338,7 @@ void RenderPolyScene::RenderTranslucent(int portalDepth)
|
|||
DVector2 left, right;
|
||||
if (!RenderPolySprite::GetLine(thing, left, right))
|
||||
continue;
|
||||
double distanceSquared = (thing->Pos() - r_viewpoint.Pos).LengthSquared();
|
||||
double distanceSquared = (thing->Pos() - viewpoint.Pos).LengthSquared();
|
||||
RenderSprite(thing, distanceSquared, left, right);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -50,7 +50,8 @@ void PolySkyDome::Render(const TriMatrix &worldToClip)
|
|||
if (level.flags & LEVEL_DOUBLESKY)
|
||||
backskytex = TexMan(sky2tex, true);
|
||||
|
||||
TriMatrix objectToWorld = TriMatrix::translate((float)r_viewpoint.Pos.X, (float)r_viewpoint.Pos.Y, (float)r_viewpoint.Pos.Z);
|
||||
const auto &viewpoint = PolyRenderer::Instance()->Thread.Viewport->viewpoint;
|
||||
TriMatrix objectToWorld = TriMatrix::translate((float)viewpoint.Pos.X, (float)viewpoint.Pos.Y, (float)viewpoint.Pos.Z);
|
||||
objectToClip = worldToClip * objectToWorld;
|
||||
|
||||
int rc = mRows + 1;
|
||||
|
@ -95,7 +96,7 @@ void PolySkyDome::RenderRow(PolyDrawArgs &args, int row, uint32_t capcolor)
|
|||
void PolySkyDome::RenderCapColorRow(PolyDrawArgs &args, FTexture *skytex, int row, bool bottomCap)
|
||||
{
|
||||
uint32_t solid = skytex->GetSkyCapColor(bottomCap);
|
||||
if (!swrenderer::RenderViewport::Instance()->RenderTarget->IsBgra())
|
||||
if (!PolyRenderer::Instance()->Thread.Viewport->RenderTarget->IsBgra())
|
||||
solid = RGB32k.RGB[(RPART(solid) >> 3)][(GPART(solid) >> 3)][(BPART(solid) >> 3)];
|
||||
|
||||
args.vinput = &mVertices[mPrimStart[row]];
|
||||
|
|
|
@ -38,7 +38,8 @@ bool RenderPolySprite::GetLine(AActor *thing, DVector2 &left, DVector2 &right)
|
|||
if (IsThingCulled(thing))
|
||||
return false;
|
||||
|
||||
DVector3 pos = thing->InterpolatedPosition(r_viewpoint.TicFrac);
|
||||
const auto &viewpoint = PolyRenderer::Instance()->Thread.Viewport->viewpoint;
|
||||
DVector3 pos = thing->InterpolatedPosition(viewpoint.TicFrac);
|
||||
|
||||
bool flipTextureX = false;
|
||||
FTexture *tex = GetSpriteTexture(thing, flipTextureX);
|
||||
|
@ -59,8 +60,8 @@ bool RenderPolySprite::GetLine(AActor *thing, DVector2 &left, DVector2 &right)
|
|||
|
||||
pos.X += spriteHalfWidth;
|
||||
|
||||
left = DVector2(pos.X - r_viewpoint.Sin * spriteHalfWidth, pos.Y + r_viewpoint.Cos * spriteHalfWidth);
|
||||
right = DVector2(pos.X + r_viewpoint.Sin * spriteHalfWidth, pos.Y - r_viewpoint.Cos * spriteHalfWidth);
|
||||
left = DVector2(pos.X - viewpoint.Sin * spriteHalfWidth, pos.Y + viewpoint.Cos * spriteHalfWidth);
|
||||
right = DVector2(pos.X + viewpoint.Sin * spriteHalfWidth, pos.Y - viewpoint.Cos * spriteHalfWidth);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -70,8 +71,9 @@ void RenderPolySprite::Render(const TriMatrix &worldToClip, const Vec4f &clipPla
|
|||
if (!GetLine(thing, line[0], line[1]))
|
||||
return;
|
||||
|
||||
DVector3 pos = thing->InterpolatedPosition(r_viewpoint.TicFrac);
|
||||
pos.Z += thing->GetBobOffset(r_viewpoint.TicFrac);
|
||||
const auto &viewpoint = PolyRenderer::Instance()->Thread.Viewport->viewpoint;
|
||||
DVector3 pos = thing->InterpolatedPosition(viewpoint.TicFrac);
|
||||
pos.Z += thing->GetBobOffset(viewpoint.TicFrac);
|
||||
|
||||
bool flipTextureX = false;
|
||||
FTexture *tex = GetSpriteTexture(thing, flipTextureX);
|
||||
|
@ -105,7 +107,7 @@ void RenderPolySprite::Render(const TriMatrix &worldToClip, const Vec4f &clipPla
|
|||
return;
|
||||
|
||||
bool foggy = false;
|
||||
int actualextralight = foggy ? 0 : r_viewpoint.extralight << 4;
|
||||
int actualextralight = foggy ? 0 : viewpoint.extralight << 4;
|
||||
|
||||
std::pair<float, float> offsets[4] =
|
||||
{
|
||||
|
@ -250,7 +252,7 @@ void RenderPolySprite::Render(const TriMatrix &worldToClip, const Vec4f &clipPla
|
|||
args.SetTexture(tex, thing->Translation, true);
|
||||
}
|
||||
|
||||
if (!swrenderer::RenderViewport::Instance()->RenderTarget->IsBgra())
|
||||
if (!PolyRenderer::Instance()->Thread.Viewport->RenderTarget->IsBgra())
|
||||
{
|
||||
uint32_t r = (args.uniforms.color >> 16) & 0xff;
|
||||
uint32_t g = (args.uniforms.color >> 8) & 0xff;
|
||||
|
@ -273,7 +275,7 @@ bool RenderPolySprite::IsThingCulled(AActor *thing)
|
|||
FIntCVar *cvar = thing->GetClass()->distancecheck;
|
||||
if (cvar != nullptr && *cvar >= 0)
|
||||
{
|
||||
double dist = (thing->Pos() - r_viewpoint.Pos).LengthSquared();
|
||||
double dist = (thing->Pos() - PolyRenderer::Instance()->Thread.Viewport->viewpoint.Pos).LengthSquared();
|
||||
double check = (double)**cvar;
|
||||
if (dist >= check * check)
|
||||
return true;
|
||||
|
@ -372,6 +374,7 @@ visstyle_t RenderPolySprite::GetSpriteVisStyle(AActor *thing, double z)
|
|||
|
||||
FTexture *RenderPolySprite::GetSpriteTexture(AActor *thing, /*out*/ bool &flipX)
|
||||
{
|
||||
const auto &viewpoint = PolyRenderer::Instance()->Thread.Viewport->viewpoint;
|
||||
flipX = false;
|
||||
if (thing->picnum.isValid())
|
||||
{
|
||||
|
@ -385,9 +388,9 @@ FTexture *RenderPolySprite::GetSpriteTexture(AActor *thing, /*out*/ bool &flipX)
|
|||
{
|
||||
// choose a different rotation based on player view
|
||||
spriteframe_t *sprframe = &SpriteFrames[tex->Rotations];
|
||||
DVector3 pos = thing->InterpolatedPosition(r_viewpoint.TicFrac);
|
||||
pos.Z += thing->GetBobOffset(r_viewpoint.TicFrac);
|
||||
DAngle ang = (pos - r_viewpoint.Pos).Angle();
|
||||
DVector3 pos = thing->InterpolatedPosition(viewpoint.TicFrac);
|
||||
pos.Z += thing->GetBobOffset(viewpoint.TicFrac);
|
||||
DAngle ang = (pos - viewpoint.Pos).Angle();
|
||||
angle_t rot;
|
||||
if (sprframe->Texture[0] == sprframe->Texture[1])
|
||||
{
|
||||
|
@ -420,9 +423,9 @@ FTexture *RenderPolySprite::GetSpriteTexture(AActor *thing, /*out*/ bool &flipX)
|
|||
//picnum = SpriteFrames[sprdef->spriteframes + thing->frame].Texture[0];
|
||||
// choose a different rotation based on player view
|
||||
spriteframe_t *sprframe = &SpriteFrames[sprdef->spriteframes + thing->frame];
|
||||
DVector3 pos = thing->InterpolatedPosition(r_viewpoint.TicFrac);
|
||||
pos.Z += thing->GetBobOffset(r_viewpoint.TicFrac);
|
||||
DAngle ang = (pos - r_viewpoint.Pos).Angle();
|
||||
DVector3 pos = thing->InterpolatedPosition(viewpoint.TicFrac);
|
||||
pos.Z += thing->GetBobOffset(viewpoint.TicFrac);
|
||||
DAngle ang = (pos - viewpoint.Pos).Angle();
|
||||
angle_t rot;
|
||||
if (sprframe->Texture[0] == sprframe->Texture[1])
|
||||
{
|
||||
|
|
|
@ -362,7 +362,7 @@ int RenderPolyWall::GetLightLevel()
|
|||
else
|
||||
{
|
||||
bool foggy = false;
|
||||
int actualextralight = foggy ? 0 : r_viewpoint.extralight << 4;
|
||||
int actualextralight = foggy ? 0 : PolyRenderer::Instance()->Thread.Viewport->viewpoint.extralight << 4;
|
||||
return clamp(Side->GetLightLevel(foggy, LineSeg->frontsector->lightlevel) + actualextralight, 0, 255);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -34,8 +34,9 @@ void RenderPolyWallSprite::Render(const TriMatrix &worldToClip, const Vec4f &cli
|
|||
if (RenderPolySprite::IsThingCulled(thing))
|
||||
return;
|
||||
|
||||
DVector3 pos = thing->InterpolatedPosition(r_viewpoint.TicFrac);
|
||||
pos.Z += thing->GetBobOffset(r_viewpoint.TicFrac);
|
||||
const auto &viewpoint = PolyRenderer::Instance()->Thread.Viewport->viewpoint;
|
||||
DVector3 pos = thing->InterpolatedPosition(viewpoint.TicFrac);
|
||||
pos.Z += thing->GetBobOffset(viewpoint.TicFrac);
|
||||
|
||||
bool flipTextureX = false;
|
||||
FTexture *tex = RenderPolySprite::GetSpriteTexture(thing, flipTextureX);
|
||||
|
@ -73,7 +74,7 @@ void RenderPolyWallSprite::Render(const TriMatrix &worldToClip, const Vec4f &cli
|
|||
return;
|
||||
|
||||
bool foggy = false;
|
||||
int actualextralight = foggy ? 0 : r_viewpoint.extralight << 4;
|
||||
int actualextralight = foggy ? 0 : viewpoint.extralight << 4;
|
||||
|
||||
std::pair<float, float> offsets[4] =
|
||||
{
|
||||
|
|
|
@ -62,6 +62,8 @@ struct FRenderer
|
|||
virtual void CleanLevelData() {}
|
||||
virtual bool RequireGLNodes() { return false; }
|
||||
|
||||
virtual double GetVisibility() { return 8.f; }
|
||||
virtual void SetVisibility(double vis) { }
|
||||
|
||||
};
|
||||
|
||||
|
|
|
@ -84,9 +84,9 @@ namespace swrenderer
|
|||
virtual void DrawSpanAddClamp(const SpanDrawerArgs &args) = 0;
|
||||
virtual void DrawSpanMaskedAddClamp(const SpanDrawerArgs &args) = 0;
|
||||
virtual void FillSpan(const SpanDrawerArgs &args) = 0;
|
||||
virtual void DrawTiltedSpan(const SpanDrawerArgs &args, int y, int x1, int x2, const FVector3 &plane_sz, const FVector3 &plane_su, const FVector3 &plane_sv, bool plane_shade, int planeshade, float planelightfloat, fixed_t pviewx, fixed_t pviewy, FDynamicColormap *basecolormap) = 0;
|
||||
virtual void DrawColoredSpan(const SpanDrawerArgs &args, int y, int x1, int x2) = 0;
|
||||
virtual void DrawFogBoundaryLine(const SpanDrawerArgs &args, int y, int x1, int x2) = 0;
|
||||
virtual void DrawTiltedSpan(const SpanDrawerArgs &args, const FVector3 &plane_sz, const FVector3 &plane_su, const FVector3 &plane_sv, bool plane_shade, int planeshade, float planelightfloat, fixed_t pviewx, fixed_t pviewy, FDynamicColormap *basecolormap) = 0;
|
||||
virtual void DrawColoredSpan(const SpanDrawerArgs &args) = 0;
|
||||
virtual void DrawFogBoundaryLine(const SpanDrawerArgs &args) = 0;
|
||||
|
||||
DrawerCommandQueuePtr Queue;
|
||||
};
|
||||
|
|
|
@ -157,12 +157,12 @@ namespace swrenderer
|
|||
{
|
||||
uint32_t fracstep = args.TextureVStep();
|
||||
uint32_t frac = args.TextureVPos();
|
||||
uint8_t *colormap = args.Colormap();
|
||||
uint8_t *colormap = args.Colormap(args.Viewport());
|
||||
int count = args.Count();
|
||||
const uint8_t *source = args.TexturePixels();
|
||||
uint8_t *dest = args.Dest();
|
||||
int bits = args.TextureFracBits();
|
||||
int pitch = RenderViewport::Instance()->RenderTarget->GetPitch();
|
||||
int pitch = args.Viewport()->RenderTarget->GetPitch();
|
||||
DrawerLight *dynlights = args.dc_lights;
|
||||
int num_dynlights = args.dc_num_lights;
|
||||
float viewpos_z = args.dc_viewpos.Z;
|
||||
|
@ -208,12 +208,12 @@ namespace swrenderer
|
|||
{
|
||||
uint32_t fracstep = args.TextureVStep();
|
||||
uint32_t frac = args.TextureVPos();
|
||||
uint8_t *colormap = args.Colormap();
|
||||
uint8_t *colormap = args.Colormap(args.Viewport());
|
||||
int count = args.Count();
|
||||
const uint8_t *source = args.TexturePixels();
|
||||
uint8_t *dest = args.Dest();
|
||||
int bits = args.TextureFracBits();
|
||||
int pitch = RenderViewport::Instance()->RenderTarget->GetPitch();
|
||||
int pitch = args.Viewport()->RenderTarget->GetPitch();
|
||||
DrawerLight *dynlights = args.dc_lights;
|
||||
int num_dynlights = args.dc_num_lights;
|
||||
float viewpos_z = args.dc_viewpos.Z;
|
||||
|
@ -267,12 +267,12 @@ namespace swrenderer
|
|||
{
|
||||
uint32_t fracstep = args.TextureVStep();
|
||||
uint32_t frac = args.TextureVPos();
|
||||
uint8_t *colormap = args.Colormap();
|
||||
uint8_t *colormap = args.Colormap(args.Viewport());
|
||||
int count = args.Count();
|
||||
const uint8_t *source = args.TexturePixels();
|
||||
uint8_t *dest = args.Dest();
|
||||
int bits = args.TextureFracBits();
|
||||
int pitch = RenderViewport::Instance()->RenderTarget->GetPitch();
|
||||
int pitch = args.Viewport()->RenderTarget->GetPitch();
|
||||
|
||||
uint32_t *fg2rgb = args.SrcBlend();
|
||||
uint32_t *bg2rgb = args.DestBlend();
|
||||
|
@ -329,12 +329,12 @@ namespace swrenderer
|
|||
{
|
||||
uint32_t fracstep = args.TextureVStep();
|
||||
uint32_t frac = args.TextureVPos();
|
||||
uint8_t *colormap = args.Colormap();
|
||||
uint8_t *colormap = args.Colormap(args.Viewport());
|
||||
int count = args.Count();
|
||||
const uint8_t *source = args.TexturePixels();
|
||||
uint8_t *dest = args.Dest();
|
||||
int bits = args.TextureFracBits();
|
||||
int pitch = RenderViewport::Instance()->RenderTarget->GetPitch();
|
||||
int pitch = args.Viewport()->RenderTarget->GetPitch();
|
||||
DrawerLight *dynlights = args.dc_lights;
|
||||
int num_dynlights = args.dc_num_lights;
|
||||
float viewpos_z = args.dc_viewpos.Z;
|
||||
|
@ -403,12 +403,12 @@ namespace swrenderer
|
|||
{
|
||||
uint32_t fracstep = args.TextureVStep();
|
||||
uint32_t frac = args.TextureVPos();
|
||||
uint8_t *colormap = args.Colormap();
|
||||
uint8_t *colormap = args.Colormap(args.Viewport());
|
||||
int count = args.Count();
|
||||
const uint8_t *source = args.TexturePixels();
|
||||
uint8_t *dest = args.Dest();
|
||||
int bits = args.TextureFracBits();
|
||||
int pitch = RenderViewport::Instance()->RenderTarget->GetPitch();
|
||||
int pitch = args.Viewport()->RenderTarget->GetPitch();
|
||||
DrawerLight *dynlights = args.dc_lights;
|
||||
int num_dynlights = args.dc_num_lights;
|
||||
float viewpos_z = args.dc_viewpos.Z;
|
||||
|
@ -476,12 +476,12 @@ namespace swrenderer
|
|||
{
|
||||
uint32_t fracstep = args.TextureVStep();
|
||||
uint32_t frac = args.TextureVPos();
|
||||
uint8_t *colormap = args.Colormap();
|
||||
uint8_t *colormap = args.Colormap(args.Viewport());
|
||||
int count = args.Count();
|
||||
const uint8_t *source = args.TexturePixels();
|
||||
uint8_t *dest = args.Dest();
|
||||
int bits = args.TextureFracBits();
|
||||
int pitch = RenderViewport::Instance()->RenderTarget->GetPitch();
|
||||
int pitch = args.Viewport()->RenderTarget->GetPitch();
|
||||
DrawerLight *dynlights = args.dc_lights;
|
||||
int num_dynlights = args.dc_num_lights;
|
||||
float viewpos_z = args.dc_viewpos.Z;
|
||||
|
@ -555,7 +555,7 @@ namespace swrenderer
|
|||
{
|
||||
uint8_t *dest = args.Dest();
|
||||
int count = args.Count();
|
||||
int pitch = RenderViewport::Instance()->RenderTarget->GetPitch();
|
||||
int pitch = args.Viewport()->RenderTarget->GetPitch();
|
||||
const uint8_t *source0 = args.FrontTexturePixels();
|
||||
int textureheight0 = args.FrontTextureHeight();
|
||||
|
||||
|
@ -689,7 +689,7 @@ namespace swrenderer
|
|||
{
|
||||
uint8_t *dest = args.Dest();
|
||||
int count = args.Count();
|
||||
int pitch = RenderViewport::Instance()->RenderTarget->GetPitch();
|
||||
int pitch = args.Viewport()->RenderTarget->GetPitch();
|
||||
const uint8_t *source0 = args.FrontTexturePixels();
|
||||
const uint8_t *source1 = args.BackTexturePixels();
|
||||
int textureheight0 = args.FrontTextureHeight();
|
||||
|
@ -887,7 +887,7 @@ namespace swrenderer
|
|||
if (count <= 0)
|
||||
return;
|
||||
|
||||
int pitch = RenderViewport::Instance()->RenderTarget->GetPitch();
|
||||
int pitch = args.Viewport()->RenderTarget->GetPitch();
|
||||
dest = thread->dest_for_thread(args.DestY(), pitch, dest);
|
||||
frac += fracstep * thread->skipped_by_thread(args.DestY());
|
||||
fracstep *= thread->num_cores;
|
||||
|
@ -895,7 +895,7 @@ namespace swrenderer
|
|||
|
||||
// [RH] Get local copies of these variables so that the compiler
|
||||
// has a better chance of optimizing this well.
|
||||
const uint8_t *colormap = args.Colormap();
|
||||
const uint8_t *colormap = args.Colormap(args.Viewport());
|
||||
const uint8_t *source = args.TexturePixels();
|
||||
|
||||
uint32_t dynlight = args.DynamicLight();
|
||||
|
@ -948,7 +948,7 @@ namespace swrenderer
|
|||
if (count <= 0)
|
||||
return;
|
||||
|
||||
int pitch = RenderViewport::Instance()->RenderTarget->GetPitch();
|
||||
int pitch = args.Viewport()->RenderTarget->GetPitch();
|
||||
dest = thread->dest_for_thread(args.DestY(), pitch, dest);
|
||||
pitch *= thread->num_cores;
|
||||
|
||||
|
@ -972,7 +972,7 @@ namespace swrenderer
|
|||
|
||||
bg2rgb = args.DestBlend();
|
||||
fg = args.SrcColorIndex();
|
||||
int pitch = RenderViewport::Instance()->RenderTarget->GetPitch();
|
||||
int pitch = args.Viewport()->RenderTarget->GetPitch();
|
||||
|
||||
count = thread->count_for_thread(args.DestY(), count);
|
||||
if (count <= 0)
|
||||
|
@ -1025,7 +1025,7 @@ namespace swrenderer
|
|||
|
||||
bg2rgb = args.DestBlend();
|
||||
fg = args.SrcColorIndex();
|
||||
int pitch = RenderViewport::Instance()->RenderTarget->GetPitch();
|
||||
int pitch = args.Viewport()->RenderTarget->GetPitch();
|
||||
|
||||
count = thread->count_for_thread(args.DestY(), count);
|
||||
if (count <= 0)
|
||||
|
@ -1082,7 +1082,7 @@ namespace swrenderer
|
|||
uint32_t *bg2rgb = args.DestBlend();
|
||||
uint32_t fg = args.SrcColorIndex();
|
||||
|
||||
int pitch = RenderViewport::Instance()->RenderTarget->GetPitch();
|
||||
int pitch = args.Viewport()->RenderTarget->GetPitch();
|
||||
|
||||
count = thread->count_for_thread(args.DestY(), count);
|
||||
if (count <= 0)
|
||||
|
@ -1142,7 +1142,7 @@ namespace swrenderer
|
|||
uint32_t *bg2rgb = args.DestBlend();
|
||||
uint32_t fg = args.SrcColorIndex();
|
||||
|
||||
int pitch = RenderViewport::Instance()->RenderTarget->GetPitch();
|
||||
int pitch = args.Viewport()->RenderTarget->GetPitch();
|
||||
|
||||
count = thread->count_for_thread(args.DestY(), count);
|
||||
if (count <= 0)
|
||||
|
@ -1206,7 +1206,7 @@ namespace swrenderer
|
|||
if (count <= 0)
|
||||
return;
|
||||
|
||||
int pitch = RenderViewport::Instance()->RenderTarget->GetPitch();
|
||||
int pitch = args.Viewport()->RenderTarget->GetPitch();
|
||||
dest = thread->dest_for_thread(args.DestY(), pitch, dest);
|
||||
frac += fracstep * thread->skipped_by_thread(args.DestY());
|
||||
fracstep *= thread->num_cores;
|
||||
|
@ -1214,7 +1214,7 @@ namespace swrenderer
|
|||
|
||||
uint32_t *fg2rgb = args.SrcBlend();
|
||||
uint32_t *bg2rgb = args.DestBlend();
|
||||
const uint8_t *colormap = args.Colormap();
|
||||
const uint8_t *colormap = args.Colormap(args.Viewport());
|
||||
const uint8_t *source = args.TexturePixels();
|
||||
const PalEntry *palette = GPalette.BaseColors;
|
||||
|
||||
|
@ -1270,14 +1270,14 @@ namespace swrenderer
|
|||
if (count <= 0)
|
||||
return;
|
||||
|
||||
int pitch = RenderViewport::Instance()->RenderTarget->GetPitch();
|
||||
int pitch = args.Viewport()->RenderTarget->GetPitch();
|
||||
dest = thread->dest_for_thread(args.DestY(), pitch, dest);
|
||||
frac += fracstep * thread->skipped_by_thread(args.DestY());
|
||||
fracstep *= thread->num_cores;
|
||||
pitch *= thread->num_cores;
|
||||
|
||||
// [RH] Local copies of global vars to improve compiler optimizations
|
||||
const uint8_t *colormap = args.Colormap();
|
||||
const uint8_t *colormap = args.Colormap(args.Viewport());
|
||||
const uint8_t *translation = args.TranslationMap();
|
||||
const uint8_t *source = args.TexturePixels();
|
||||
|
||||
|
@ -1307,7 +1307,7 @@ namespace swrenderer
|
|||
if (count <= 0)
|
||||
return;
|
||||
|
||||
int pitch = RenderViewport::Instance()->RenderTarget->GetPitch();
|
||||
int pitch = args.Viewport()->RenderTarget->GetPitch();
|
||||
dest = thread->dest_for_thread(args.DestY(), pitch, dest);
|
||||
frac += fracstep * thread->skipped_by_thread(args.DestY());
|
||||
fracstep *= thread->num_cores;
|
||||
|
@ -1316,7 +1316,7 @@ namespace swrenderer
|
|||
uint32_t *fg2rgb = args.SrcBlend();
|
||||
uint32_t *bg2rgb = args.DestBlend();
|
||||
const uint8_t *translation = args.TranslationMap();
|
||||
const uint8_t *colormap = args.Colormap();
|
||||
const uint8_t *colormap = args.Colormap(args.Viewport());
|
||||
const uint8_t *source = args.TexturePixels();
|
||||
|
||||
const PalEntry *palette = GPalette.BaseColors;
|
||||
|
@ -1370,14 +1370,14 @@ namespace swrenderer
|
|||
if (count <= 0)
|
||||
return;
|
||||
|
||||
int pitch = RenderViewport::Instance()->RenderTarget->GetPitch();
|
||||
int pitch = args.Viewport()->RenderTarget->GetPitch();
|
||||
dest = thread->dest_for_thread(args.DestY(), pitch, dest);
|
||||
frac += fracstep * thread->skipped_by_thread(args.DestY());
|
||||
fracstep *= thread->num_cores;
|
||||
pitch *= thread->num_cores;
|
||||
|
||||
const uint8_t *source = args.TexturePixels();
|
||||
const uint8_t *colormap = args.Colormap();
|
||||
const uint8_t *colormap = args.Colormap(args.Viewport());
|
||||
uint32_t *fgstart = &Col2RGB8[0][args.SolidColor()];
|
||||
const PalEntry *palette = GPalette.BaseColors;
|
||||
|
||||
|
@ -1429,13 +1429,13 @@ namespace swrenderer
|
|||
if (count <= 0)
|
||||
return;
|
||||
|
||||
int pitch = RenderViewport::Instance()->RenderTarget->GetPitch();
|
||||
int pitch = args.Viewport()->RenderTarget->GetPitch();
|
||||
dest = thread->dest_for_thread(args.DestY(), pitch, dest);
|
||||
frac += fracstep * thread->skipped_by_thread(args.DestY());
|
||||
fracstep *= thread->num_cores;
|
||||
pitch *= thread->num_cores;
|
||||
|
||||
const uint8_t *colormap = args.Colormap();
|
||||
const uint8_t *colormap = args.Colormap(args.Viewport());
|
||||
const uint8_t *source = args.TexturePixels();
|
||||
uint32_t *fg2rgb = args.SrcBlend();
|
||||
uint32_t *bg2rgb = args.DestBlend();
|
||||
|
@ -1493,14 +1493,14 @@ namespace swrenderer
|
|||
if (count <= 0)
|
||||
return;
|
||||
|
||||
int pitch = RenderViewport::Instance()->RenderTarget->GetPitch();
|
||||
int pitch = args.Viewport()->RenderTarget->GetPitch();
|
||||
dest = thread->dest_for_thread(args.DestY(), pitch, dest);
|
||||
frac += fracstep * thread->skipped_by_thread(args.DestY());
|
||||
fracstep *= thread->num_cores;
|
||||
pitch *= thread->num_cores;
|
||||
|
||||
const uint8_t *translation = args.TranslationMap();
|
||||
const uint8_t *colormap = args.Colormap();
|
||||
const uint8_t *colormap = args.Colormap(args.Viewport());
|
||||
const uint8_t *source = args.TexturePixels();
|
||||
uint32_t *fg2rgb = args.SrcBlend();
|
||||
uint32_t *bg2rgb = args.DestBlend();
|
||||
|
@ -1558,13 +1558,13 @@ namespace swrenderer
|
|||
if (count <= 0)
|
||||
return;
|
||||
|
||||
int pitch = RenderViewport::Instance()->RenderTarget->GetPitch();
|
||||
int pitch = args.Viewport()->RenderTarget->GetPitch();
|
||||
dest = thread->dest_for_thread(args.DestY(), pitch, dest);
|
||||
frac += fracstep * thread->skipped_by_thread(args.DestY());
|
||||
fracstep *= thread->num_cores;
|
||||
pitch *= thread->num_cores;
|
||||
|
||||
const uint8_t *colormap = args.Colormap();
|
||||
const uint8_t *colormap = args.Colormap(args.Viewport());
|
||||
const uint8_t *source = args.TexturePixels();
|
||||
uint32_t *fg2rgb = args.SrcBlend();
|
||||
uint32_t *bg2rgb = args.DestBlend();
|
||||
|
@ -1621,14 +1621,14 @@ namespace swrenderer
|
|||
if (count <= 0)
|
||||
return;
|
||||
|
||||
int pitch = RenderViewport::Instance()->RenderTarget->GetPitch();
|
||||
int pitch = args.Viewport()->RenderTarget->GetPitch();
|
||||
dest = thread->dest_for_thread(args.DestY(), pitch, dest);
|
||||
frac += fracstep * thread->skipped_by_thread(args.DestY());
|
||||
fracstep *= thread->num_cores;
|
||||
pitch *= thread->num_cores;
|
||||
|
||||
const uint8_t *translation = args.TranslationMap();
|
||||
const uint8_t *colormap = args.Colormap();
|
||||
const uint8_t *colormap = args.Colormap(args.Viewport());
|
||||
const uint8_t *source = args.TexturePixels();
|
||||
uint32_t *fg2rgb = args.SrcBlend();
|
||||
uint32_t *bg2rgb = args.DestBlend();
|
||||
|
@ -1685,13 +1685,13 @@ namespace swrenderer
|
|||
if (count <= 0)
|
||||
return;
|
||||
|
||||
int pitch = RenderViewport::Instance()->RenderTarget->GetPitch();
|
||||
int pitch = args.Viewport()->RenderTarget->GetPitch();
|
||||
dest = thread->dest_for_thread(args.DestY(), pitch, dest);
|
||||
frac += fracstep * thread->skipped_by_thread(args.DestY());
|
||||
fracstep *= thread->num_cores;
|
||||
pitch *= thread->num_cores;
|
||||
|
||||
const uint8_t *colormap = args.Colormap();
|
||||
const uint8_t *colormap = args.Colormap(args.Viewport());
|
||||
const uint8_t *source = args.TexturePixels();
|
||||
uint32_t *fg2rgb = args.SrcBlend();
|
||||
uint32_t *bg2rgb = args.DestBlend();
|
||||
|
@ -1748,14 +1748,14 @@ namespace swrenderer
|
|||
if (count <= 0)
|
||||
return;
|
||||
|
||||
int pitch = RenderViewport::Instance()->RenderTarget->GetPitch();
|
||||
int pitch = args.Viewport()->RenderTarget->GetPitch();
|
||||
dest = thread->dest_for_thread(args.DestY(), pitch, dest);
|
||||
frac += fracstep * thread->skipped_by_thread(args.DestY());
|
||||
fracstep *= thread->num_cores;
|
||||
pitch *= thread->num_cores;
|
||||
|
||||
const uint8_t *translation = args.TranslationMap();
|
||||
const uint8_t *colormap = args.Colormap();
|
||||
const uint8_t *colormap = args.Colormap(args.Viewport());
|
||||
const uint8_t *source = args.TexturePixels();
|
||||
uint32_t *fg2rgb = args.SrcBlend();
|
||||
uint32_t *bg2rgb = args.DestBlend();
|
||||
|
@ -1802,7 +1802,8 @@ namespace swrenderer
|
|||
_yl = args.FuzzY1();
|
||||
_yh = args.FuzzY2();
|
||||
_x = args.FuzzX();
|
||||
_destorg = RenderViewport::Instance()->GetDest(0, 0);
|
||||
_destorg = args.Viewport()->GetDest(0, 0);
|
||||
_pitch = args.Viewport()->RenderTarget->GetPitch();
|
||||
_fuzzpos = fuzzpos;
|
||||
_fuzzviewheight = fuzzviewheight;
|
||||
}
|
||||
|
@ -1820,7 +1821,7 @@ namespace swrenderer
|
|||
|
||||
uint8_t *map = &NormalLight.Maps[6 * 256];
|
||||
|
||||
int pitch = RenderViewport::Instance()->RenderTarget->GetPitch();
|
||||
int pitch = _pitch;
|
||||
uint8_t *dest = thread->dest_for_thread(yl, pitch, yl * pitch + _x + _destorg);
|
||||
|
||||
pitch = pitch * thread->num_cores;
|
||||
|
@ -1887,13 +1888,13 @@ namespace swrenderer
|
|||
PalSpanCommand::PalSpanCommand(const SpanDrawerArgs &args)
|
||||
{
|
||||
_source = args.TexturePixels();
|
||||
_colormap = args.Colormap();
|
||||
_colormap = args.Colormap(args.Viewport());
|
||||
_xfrac = args.TextureUPos();
|
||||
_yfrac = args.TextureVPos();
|
||||
_y = args.DestY();
|
||||
_x1 = args.DestX1();
|
||||
_x2 = args.DestX2();
|
||||
_dest = RenderViewport::Instance()->GetDest(_x1, _y);
|
||||
_dest = args.Viewport()->GetDest(_x1, _y);
|
||||
_xstep = args.TextureUStep();
|
||||
_ystep = args.TextureVStep();
|
||||
_xbits = args.TextureWidthBits();
|
||||
|
@ -2662,11 +2663,15 @@ namespace swrenderer
|
|||
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
|
||||
DrawTiltedSpanPalCommand::DrawTiltedSpanPalCommand(const SpanDrawerArgs &args, int y, int x1, int x2, const FVector3 &plane_sz, const FVector3 &plane_su, const FVector3 &plane_sv, bool plane_shade, int planeshade, float planelightfloat, fixed_t pviewx, fixed_t pviewy, FDynamicColormap *basecolormap)
|
||||
: y(y), x1(x1), x2(x2), plane_sz(plane_sz), plane_su(plane_su), plane_sv(plane_sv), plane_shade(plane_shade), planeshade(planeshade), planelightfloat(planelightfloat), pviewx(pviewx), pviewy(pviewy)
|
||||
DrawTiltedSpanPalCommand::DrawTiltedSpanPalCommand(const SpanDrawerArgs &args, const FVector3 &plane_sz, const FVector3 &plane_su, const FVector3 &plane_sv, bool plane_shade, int planeshade, float planelightfloat, fixed_t pviewx, fixed_t pviewy, FDynamicColormap *basecolormap)
|
||||
: plane_sz(plane_sz), plane_su(plane_su), plane_sv(plane_sv), plane_shade(plane_shade), planeshade(planeshade), planelightfloat(planelightfloat), pviewx(pviewx), pviewy(pviewy)
|
||||
{
|
||||
_colormap = args.Colormap();
|
||||
_dest = RenderViewport::Instance()->GetDest(x1, y);
|
||||
y = args.DestY();
|
||||
x1 = args.DestX1();
|
||||
x2 = args.DestX2();
|
||||
viewport = args.Viewport();
|
||||
_colormap = args.Colormap(args.Viewport());
|
||||
_dest = args.Viewport()->GetDest(x1, y);
|
||||
_ybits = args.TextureHeightBits();
|
||||
_xbits = args.TextureWidthBits();
|
||||
_source = args.TexturePixels();
|
||||
|
@ -2686,7 +2691,7 @@ namespace swrenderer
|
|||
uint32_t u, v;
|
||||
int i;
|
||||
|
||||
iz = plane_sz[2] + plane_sz[1] * (r_viewwindow.centery - y) + plane_sz[0] * (x1 - r_viewwindow.centerx);
|
||||
iz = plane_sz[2] + plane_sz[1] * (viewport->viewwindow.centery - y) + plane_sz[0] * (x1 - viewport->viewwindow.centerx);
|
||||
|
||||
// Lighting is simple. It's just linear interpolation from start to end
|
||||
if (plane_shade)
|
||||
|
@ -2703,8 +2708,8 @@ namespace swrenderer
|
|||
}
|
||||
}
|
||||
|
||||
uz = plane_su[2] + plane_su[1] * (r_viewwindow.centery - y) + plane_su[0] * (x1 - r_viewwindow.centerx);
|
||||
vz = plane_sv[2] + plane_sv[1] * (r_viewwindow.centery - y) + plane_sv[0] * (x1 - r_viewwindow.centerx);
|
||||
uz = plane_su[2] + plane_su[1] * (viewport->viewwindow.centery - y) + plane_su[0] * (x1 - viewport->viewwindow.centerx);
|
||||
vz = plane_sv[2] + plane_sv[1] * (viewport->viewwindow.centery - y) + plane_sv[0] * (x1 - viewport->viewwindow.centerx);
|
||||
|
||||
fb = _dest;
|
||||
|
||||
|
@ -2838,10 +2843,13 @@ namespace swrenderer
|
|||
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
|
||||
DrawColoredSpanPalCommand::DrawColoredSpanPalCommand(const SpanDrawerArgs &args, int y, int x1, int x2) : PalSpanCommand(args), y(y), x1(x1), x2(x2)
|
||||
DrawColoredSpanPalCommand::DrawColoredSpanPalCommand(const SpanDrawerArgs &args) : PalSpanCommand(args)
|
||||
{
|
||||
y = args.DestY();
|
||||
x1 = args.DestX1();
|
||||
x2 = args.DestX2();
|
||||
color = args.SolidColor();
|
||||
dest = RenderViewport::Instance()->GetDest(x1, y);
|
||||
dest = args.Viewport()->GetDest(x1, y);
|
||||
}
|
||||
|
||||
void DrawColoredSpanPalCommand::Execute(DrawerThread *thread)
|
||||
|
@ -2854,10 +2862,13 @@ namespace swrenderer
|
|||
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
|
||||
DrawFogBoundaryLinePalCommand::DrawFogBoundaryLinePalCommand(const SpanDrawerArgs &args, int y, int x1, int x2) : PalSpanCommand(args), y(y), x1(x1), x2(x2)
|
||||
DrawFogBoundaryLinePalCommand::DrawFogBoundaryLinePalCommand(const SpanDrawerArgs &args) : PalSpanCommand(args)
|
||||
{
|
||||
_colormap = args.Colormap();
|
||||
_dest = RenderViewport::Instance()->GetDest(0, y);
|
||||
y = args.DestY();
|
||||
x1 = args.DestX1();
|
||||
x2 = args.DestX2();
|
||||
_colormap = args.Colormap(args.Viewport());
|
||||
_dest = args.Viewport()->GetDest(0, y);
|
||||
}
|
||||
|
||||
void DrawFogBoundaryLinePalCommand::Execute(DrawerThread *thread)
|
||||
|
|
|
@ -84,6 +84,7 @@ namespace swrenderer
|
|||
int _yh;
|
||||
int _x;
|
||||
uint8_t *_destorg;
|
||||
int _pitch;
|
||||
int _fuzzpos;
|
||||
int _fuzzviewheight;
|
||||
};
|
||||
|
@ -131,7 +132,7 @@ namespace swrenderer
|
|||
class DrawTiltedSpanPalCommand : public DrawerCommand
|
||||
{
|
||||
public:
|
||||
DrawTiltedSpanPalCommand(const SpanDrawerArgs &args, int y, int x1, int x2, const FVector3 &plane_sz, const FVector3 &plane_su, const FVector3 &plane_sv, bool plane_shade, int planeshade, float planelightfloat, fixed_t pviewx, fixed_t pviewy, FDynamicColormap *basecolormap);
|
||||
DrawTiltedSpanPalCommand(const SpanDrawerArgs &args, const FVector3 &plane_sz, const FVector3 &plane_su, const FVector3 &plane_sv, bool plane_shade, int planeshade, float planelightfloat, fixed_t pviewx, fixed_t pviewy, FDynamicColormap *basecolormap);
|
||||
void Execute(DrawerThread *thread) override;
|
||||
FString DebugInfo() override { return "DrawTiltedSpanPalCommand"; }
|
||||
|
||||
|
@ -156,12 +157,13 @@ namespace swrenderer
|
|||
int _xbits;
|
||||
const uint8_t *_source;
|
||||
uint8_t *basecolormapdata;
|
||||
RenderViewport *viewport;
|
||||
};
|
||||
|
||||
class DrawColoredSpanPalCommand : public PalSpanCommand
|
||||
{
|
||||
public:
|
||||
DrawColoredSpanPalCommand(const SpanDrawerArgs &args, int y, int x1, int x2);
|
||||
DrawColoredSpanPalCommand(const SpanDrawerArgs &args);
|
||||
void Execute(DrawerThread *thread) override;
|
||||
FString DebugInfo() override { return "DrawColoredSpanPalCommand"; }
|
||||
|
||||
|
@ -176,7 +178,7 @@ namespace swrenderer
|
|||
class DrawFogBoundaryLinePalCommand : public PalSpanCommand
|
||||
{
|
||||
public:
|
||||
DrawFogBoundaryLinePalCommand(const SpanDrawerArgs &args, int y, int x1, int x2);
|
||||
DrawFogBoundaryLinePalCommand(const SpanDrawerArgs &args);
|
||||
void Execute(DrawerThread *thread) override;
|
||||
|
||||
private:
|
||||
|
@ -248,12 +250,12 @@ namespace swrenderer
|
|||
void DrawSpanMaskedAddClamp(const SpanDrawerArgs &args) override { Queue->Push<DrawSpanMaskedAddClampPalCommand>(args); }
|
||||
void FillSpan(const SpanDrawerArgs &args) override { Queue->Push<FillSpanPalCommand>(args); }
|
||||
|
||||
void DrawTiltedSpan(const SpanDrawerArgs &args, int y, int x1, int x2, const FVector3 &plane_sz, const FVector3 &plane_su, const FVector3 &plane_sv, bool plane_shade, int planeshade, float planelightfloat, fixed_t pviewx, fixed_t pviewy, FDynamicColormap *basecolormap) override
|
||||
void DrawTiltedSpan(const SpanDrawerArgs &args, const FVector3 &plane_sz, const FVector3 &plane_su, const FVector3 &plane_sv, bool plane_shade, int planeshade, float planelightfloat, fixed_t pviewx, fixed_t pviewy, FDynamicColormap *basecolormap) override
|
||||
{
|
||||
Queue->Push<DrawTiltedSpanPalCommand>(args, y, x1, x2, plane_sz, plane_su, plane_sv, plane_shade, planeshade, planelightfloat, pviewx, pviewy, basecolormap);
|
||||
Queue->Push<DrawTiltedSpanPalCommand>(args, plane_sz, plane_su, plane_sv, plane_shade, planeshade, planelightfloat, pviewx, pviewy, basecolormap);
|
||||
}
|
||||
|
||||
void DrawColoredSpan(const SpanDrawerArgs &args, int y, int x1, int x2) override { Queue->Push<DrawColoredSpanPalCommand>(args, y, x1, x2); }
|
||||
void DrawFogBoundaryLine(const SpanDrawerArgs &args, int y, int x1, int x2) override { Queue->Push<DrawFogBoundaryLinePalCommand>(args, y, x1, x2); }
|
||||
void DrawColoredSpan(const SpanDrawerArgs &args) override { Queue->Push<DrawColoredSpanPalCommand>(args); }
|
||||
void DrawFogBoundaryLine(const SpanDrawerArgs &args) override { Queue->Push<DrawFogBoundaryLinePalCommand>(args); }
|
||||
};
|
||||
}
|
||||
|
|
|
@ -233,8 +233,8 @@ namespace swrenderer
|
|||
_x = drawerargs.FuzzX();
|
||||
_yl = drawerargs.FuzzY1();
|
||||
_yh = drawerargs.FuzzY2();
|
||||
_destorg = RenderViewport::Instance()->GetDest(0, 0);
|
||||
_pitch = RenderViewport::Instance()->RenderTarget->GetPitch();
|
||||
_destorg = drawerargs.Viewport()->GetDest(0, 0);
|
||||
_pitch = drawerargs.Viewport()->RenderTarget->GetPitch();
|
||||
_fuzzpos = fuzzpos;
|
||||
_fuzzviewheight = fuzzviewheight;
|
||||
}
|
||||
|
@ -341,7 +341,7 @@ namespace swrenderer
|
|||
_x1 = drawerargs.DestX1();
|
||||
_x2 = drawerargs.DestX2();
|
||||
_y = drawerargs.DestY();
|
||||
_dest = RenderViewport::Instance()->GetDest(_x1, _y);
|
||||
_dest = drawerargs.Viewport()->GetDest(_x1, _y);
|
||||
_light = drawerargs.Light();
|
||||
_color = drawerargs.SolidColor();
|
||||
}
|
||||
|
@ -366,13 +366,12 @@ namespace swrenderer
|
|||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
DrawFogBoundaryLineRGBACommand::DrawFogBoundaryLineRGBACommand(const SpanDrawerArgs &drawerargs, int y, int x, int x2)
|
||||
DrawFogBoundaryLineRGBACommand::DrawFogBoundaryLineRGBACommand(const SpanDrawerArgs &drawerargs)
|
||||
{
|
||||
_y = y;
|
||||
_x = x;
|
||||
_x2 = x2;
|
||||
|
||||
_line = RenderViewport::Instance()->GetDest(0, y);
|
||||
_y = drawerargs.DestY();
|
||||
_x = drawerargs.DestX1();
|
||||
_x2 = drawerargs.DestX2();
|
||||
_line = drawerargs.Viewport()->GetDest(0, _y);
|
||||
_light = drawerargs.Light();
|
||||
_shade_constants = drawerargs.ColormapConstants();
|
||||
}
|
||||
|
@ -434,12 +433,12 @@ namespace swrenderer
|
|||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
DrawTiltedSpanRGBACommand::DrawTiltedSpanRGBACommand(const SpanDrawerArgs &drawerargs, int y, int x1, int x2, const FVector3 &plane_sz, const FVector3 &plane_su, const FVector3 &plane_sv, bool plane_shade, int planeshade, float planelightfloat, fixed_t pviewx, fixed_t pviewy)
|
||||
DrawTiltedSpanRGBACommand::DrawTiltedSpanRGBACommand(const SpanDrawerArgs &drawerargs, const FVector3 &plane_sz, const FVector3 &plane_su, const FVector3 &plane_sv, bool plane_shade, int planeshade, float planelightfloat, fixed_t pviewx, fixed_t pviewy)
|
||||
{
|
||||
_x1 = x1;
|
||||
_x2 = x2;
|
||||
_y = y;
|
||||
_dest = RenderViewport::Instance()->GetDest(_x1, _y);
|
||||
_x1 = drawerargs.DestX1();
|
||||
_x2 = drawerargs.DestX2();
|
||||
_y = drawerargs.DestY();
|
||||
_dest = drawerargs.Viewport()->GetDest(_x1, _y);
|
||||
_light = drawerargs.Light();
|
||||
_shade_constants = drawerargs.ColormapConstants();
|
||||
_plane_sz = plane_sz;
|
||||
|
@ -453,6 +452,7 @@ namespace swrenderer
|
|||
_source = (const uint32_t*)drawerargs.TexturePixels();
|
||||
_xbits = drawerargs.TextureWidthBits();
|
||||
_ybits = drawerargs.TextureHeightBits();
|
||||
viewport = drawerargs.Viewport();
|
||||
}
|
||||
|
||||
void DrawTiltedSpanRGBACommand::Execute(DrawerThread *thread)
|
||||
|
@ -474,7 +474,7 @@ namespace swrenderer
|
|||
int count = _x2 - _x1 + 1;
|
||||
|
||||
// Depth (Z) change across the span
|
||||
double iz = _plane_sz[2] + _plane_sz[1] * (r_viewwindow.centery - _y) + _plane_sz[0] * (_x1 - r_viewwindow.centerx);
|
||||
double iz = _plane_sz[2] + _plane_sz[1] * (viewport->viewwindow.centery - _y) + _plane_sz[0] * (_x1 - viewport->viewwindow.centerx);
|
||||
|
||||
// Light change across the span
|
||||
fixed_t lightstart = _light;
|
||||
|
@ -491,8 +491,8 @@ namespace swrenderer
|
|||
fixed_t steplight = (lightend - lightstart) / count;
|
||||
|
||||
// Texture coordinates
|
||||
double uz = _plane_su[2] + _plane_su[1] * (r_viewwindow.centery - _y) + _plane_su[0] * (_x1 - r_viewwindow.centerx);
|
||||
double vz = _plane_sv[2] + _plane_sv[1] * (r_viewwindow.centery - _y) + _plane_sv[0] * (_x1 - r_viewwindow.centerx);
|
||||
double uz = _plane_su[2] + _plane_su[1] * (viewport->viewwindow.centery - _y) + _plane_su[0] * (_x1 - viewport->viewwindow.centerx);
|
||||
double vz = _plane_sv[2] + _plane_sv[1] * (viewport->viewwindow.centery - _y) + _plane_sv[0] * (_x1 - viewport->viewwindow.centerx);
|
||||
double startz = 1.f / iz;
|
||||
double startu = uz*startz;
|
||||
double startv = vz*startz;
|
||||
|
@ -568,13 +568,12 @@ namespace swrenderer
|
|||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
DrawColoredSpanRGBACommand::DrawColoredSpanRGBACommand(const SpanDrawerArgs &drawerargs, int y, int x1, int x2)
|
||||
DrawColoredSpanRGBACommand::DrawColoredSpanRGBACommand(const SpanDrawerArgs &drawerargs)
|
||||
{
|
||||
_y = y;
|
||||
_x1 = x1;
|
||||
_x2 = x2;
|
||||
|
||||
_dest = RenderViewport::Instance()->GetDest(_x1, _y);
|
||||
_y = drawerargs.DestY();
|
||||
_x1 = drawerargs.DestX1();
|
||||
_x2 = drawerargs.DestX2();
|
||||
_dest = drawerargs.Viewport()->GetDest(_x1, _y);
|
||||
_light = drawerargs.Light();
|
||||
_color = drawerargs.SolidColor();
|
||||
}
|
||||
|
@ -603,67 +602,6 @@ namespace swrenderer
|
|||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
FillTransColumnRGBACommand::FillTransColumnRGBACommand(const DrawerArgs &drawerargs, int x, int y1, int y2, int color, int a)
|
||||
{
|
||||
_x = x;
|
||||
_y1 = y1;
|
||||
_y2 = y2;
|
||||
_color = color;
|
||||
_a = a;
|
||||
|
||||
_destorg = RenderViewport::Instance()->GetDest(0, 0);
|
||||
_pitch = RenderViewport::Instance()->RenderTarget->GetPitch();
|
||||
}
|
||||
|
||||
void FillTransColumnRGBACommand::Execute(DrawerThread *thread)
|
||||
{
|
||||
int x = _x;
|
||||
int y1 = _y1;
|
||||
int y2 = _y2;
|
||||
int color = _color;
|
||||
int a = _a;
|
||||
|
||||
int ycount = thread->count_for_thread(y1, y2 - y1 + 1);
|
||||
if (ycount <= 0)
|
||||
return;
|
||||
|
||||
uint32_t fg = GPalette.BaseColors[color].d;
|
||||
uint32_t fg_red = (fg >> 16) & 0xff;
|
||||
uint32_t fg_green = (fg >> 8) & 0xff;
|
||||
uint32_t fg_blue = fg & 0xff;
|
||||
|
||||
uint32_t alpha = a + 1;
|
||||
uint32_t inv_alpha = 256 - alpha;
|
||||
|
||||
fg_red *= alpha;
|
||||
fg_green *= alpha;
|
||||
fg_blue *= alpha;
|
||||
|
||||
int spacing = _pitch * thread->num_cores;
|
||||
uint32_t *dest = thread->dest_for_thread(y1, _pitch, _pitch * y1 + x + (uint32_t*)_destorg);
|
||||
|
||||
for (int y = 0; y < ycount; y++)
|
||||
{
|
||||
uint32_t bg_red = (*dest >> 16) & 0xff;
|
||||
uint32_t bg_green = (*dest >> 8) & 0xff;
|
||||
uint32_t bg_blue = (*dest) & 0xff;
|
||||
|
||||
uint32_t red = (fg_red + bg_red * inv_alpha) / 256;
|
||||
uint32_t green = (fg_green + bg_green * inv_alpha) / 256;
|
||||
uint32_t blue = (fg_blue + bg_blue * inv_alpha) / 256;
|
||||
|
||||
*dest = 0xff000000 | (red << 16) | (green << 8) | blue;
|
||||
dest += spacing;
|
||||
}
|
||||
}
|
||||
|
||||
FString FillTransColumnRGBACommand::DebugInfo()
|
||||
{
|
||||
return "FillTransColumn";
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
ApplySpecialColormapRGBACommand::ApplySpecialColormapRGBACommand(FSpecialColormap *colormap, DFrameBuffer *screen)
|
||||
{
|
||||
buffer = screen->GetBuffer();
|
||||
|
|
|
@ -115,7 +115,7 @@ namespace swrenderer
|
|||
ShadeConstants _shade_constants;
|
||||
|
||||
public:
|
||||
DrawFogBoundaryLineRGBACommand(const SpanDrawerArgs &drawerargs, int y, int x, int x2);
|
||||
DrawFogBoundaryLineRGBACommand(const SpanDrawerArgs &drawerargs);
|
||||
void Execute(DrawerThread *thread) override;
|
||||
FString DebugInfo() override;
|
||||
};
|
||||
|
@ -139,9 +139,10 @@ namespace swrenderer
|
|||
int _xbits;
|
||||
int _ybits;
|
||||
const uint32_t * RESTRICT _source;
|
||||
RenderViewport *viewport;
|
||||
|
||||
public:
|
||||
DrawTiltedSpanRGBACommand(const SpanDrawerArgs &drawerargs, int y, int x1, int x2, const FVector3 &plane_sz, const FVector3 &plane_su, const FVector3 &plane_sv, bool plane_shade, int planeshade, float planelightfloat, fixed_t pviewx, fixed_t pviewy);
|
||||
DrawTiltedSpanRGBACommand(const SpanDrawerArgs &drawerargs, const FVector3 &plane_sz, const FVector3 &plane_su, const FVector3 &plane_sv, bool plane_shade, int planeshade, float planelightfloat, fixed_t pviewx, fixed_t pviewy);
|
||||
void Execute(DrawerThread *thread) override;
|
||||
FString DebugInfo() override;
|
||||
};
|
||||
|
@ -156,29 +157,12 @@ namespace swrenderer
|
|||
int _color;
|
||||
|
||||
public:
|
||||
DrawColoredSpanRGBACommand(const SpanDrawerArgs &drawerargs, int y, int x1, int x2);
|
||||
DrawColoredSpanRGBACommand(const SpanDrawerArgs &drawerargs);
|
||||
|
||||
void Execute(DrawerThread *thread) override;
|
||||
FString DebugInfo() override;
|
||||
};
|
||||
|
||||
class FillTransColumnRGBACommand : public DrawerCommand
|
||||
{
|
||||
int _x;
|
||||
int _y1;
|
||||
int _y2;
|
||||
int _color;
|
||||
int _a;
|
||||
uint8_t * RESTRICT _destorg;
|
||||
int _pitch;
|
||||
fixed_t _light;
|
||||
|
||||
public:
|
||||
FillTransColumnRGBACommand(const DrawerArgs &drawerargs, int x, int y1, int y2, int color, int a);
|
||||
void Execute(DrawerThread *thread) override;
|
||||
FString DebugInfo() override;
|
||||
};
|
||||
|
||||
class ApplySpecialColormapRGBACommand : public DrawerCommand
|
||||
{
|
||||
uint8_t *buffer;
|
||||
|
@ -273,13 +257,13 @@ namespace swrenderer
|
|||
void DrawSpanMaskedAddClamp(const SpanDrawerArgs &args) override;
|
||||
void FillSpan(const SpanDrawerArgs &args) override { Queue->Push<FillSpanRGBACommand>(args); }
|
||||
|
||||
void DrawTiltedSpan(const SpanDrawerArgs &args, int y, int x1, int x2, const FVector3 &plane_sz, const FVector3 &plane_su, const FVector3 &plane_sv, bool plane_shade, int planeshade, float planelightfloat, fixed_t pviewx, fixed_t pviewy, FDynamicColormap *basecolormap) override
|
||||
void DrawTiltedSpan(const SpanDrawerArgs &args, const FVector3 &plane_sz, const FVector3 &plane_su, const FVector3 &plane_sv, bool plane_shade, int planeshade, float planelightfloat, fixed_t pviewx, fixed_t pviewy, FDynamicColormap *basecolormap) override
|
||||
{
|
||||
Queue->Push<DrawTiltedSpanRGBACommand>(args, y, x1, x2, plane_sz, plane_su, plane_sv, plane_shade, planeshade, planelightfloat, pviewx, pviewy);
|
||||
Queue->Push<DrawTiltedSpanRGBACommand>(args, plane_sz, plane_su, plane_sv, plane_shade, planeshade, planelightfloat, pviewx, pviewy);
|
||||
}
|
||||
|
||||
void DrawColoredSpan(const SpanDrawerArgs &args, int y, int x1, int x2) override { Queue->Push<DrawColoredSpanRGBACommand>(args, y, x1, x2); }
|
||||
void DrawFogBoundaryLine(const SpanDrawerArgs &args, int y, int x1, int x2) override { Queue->Push<DrawFogBoundaryLineRGBACommand>(args, y, x1, x2); }
|
||||
void DrawColoredSpan(const SpanDrawerArgs &args) override { Queue->Push<DrawColoredSpanRGBACommand>(args); }
|
||||
void DrawFogBoundaryLine(const SpanDrawerArgs &args) override { Queue->Push<DrawFogBoundaryLineRGBACommand>(args); }
|
||||
};
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
|
|
@ -39,7 +39,7 @@ namespace swrenderer
|
|||
{
|
||||
uint32_t *dest = (uint32_t *)args.Dest();
|
||||
int count = args.Count();
|
||||
int pitch = RenderViewport::Instance()->RenderTarget->GetPitch();
|
||||
int pitch = args.Viewport()->RenderTarget->GetPitch();
|
||||
const uint32_t *source0 = (const uint32_t *)args.FrontTexturePixels();
|
||||
int textureheight0 = args.FrontTextureHeight();
|
||||
|
||||
|
@ -169,7 +169,7 @@ namespace swrenderer
|
|||
{
|
||||
uint32_t *dest = (uint32_t *)args.Dest();
|
||||
int count = args.Count();
|
||||
int pitch = RenderViewport::Instance()->RenderTarget->GetPitch();
|
||||
int pitch = args.Viewport()->RenderTarget->GetPitch();
|
||||
const uint32_t *source0 = (const uint32_t *)args.FrontTexturePixels();
|
||||
const uint32_t *source1 = (const uint32_t *)args.BackTexturePixels();
|
||||
int textureheight0 = args.FrontTextureHeight();
|
||||
|
|
|
@ -188,8 +188,8 @@ namespace swrenderer
|
|||
__m128 step_viewpos_x = _mm_set1_ps(stepvpx * 2.0f);
|
||||
|
||||
int count = args.DestX2() - args.DestX1() + 1;
|
||||
int pitch = RenderViewport::Instance()->RenderTarget->GetPitch();
|
||||
uint32_t *dest = (uint32_t*)RenderViewport::Instance()->GetDest(args.DestX1(), args.DestY());
|
||||
int pitch = args.Viewport()->RenderTarget->GetPitch();
|
||||
uint32_t *dest = (uint32_t*)args.Viewport()->GetDest(args.DestX1(), args.DestY());
|
||||
|
||||
if (FilterModeT::Mode == (int)FilterModes::Linear)
|
||||
{
|
||||
|
|
|
@ -113,7 +113,7 @@ namespace swrenderer
|
|||
{
|
||||
source = (const uint32_t*)args.TexturePixels();
|
||||
source2 = nullptr;
|
||||
colormap = args.Colormap();
|
||||
colormap = args.Colormap(args.Viewport());
|
||||
translation = (const uint32_t*)args.TranslationMap();
|
||||
}
|
||||
else
|
||||
|
@ -162,7 +162,7 @@ namespace swrenderer
|
|||
}
|
||||
|
||||
int count = args.Count();
|
||||
int pitch = RenderViewport::Instance()->RenderTarget->GetPitch();
|
||||
int pitch = args.Viewport()->RenderTarget->GetPitch();
|
||||
uint32_t fracstep = args.TextureVStep();
|
||||
uint32_t frac = args.TextureVPos();
|
||||
uint32_t texturefracx = args.TextureUPos();
|
||||
|
|
|
@ -112,7 +112,7 @@ namespace swrenderer
|
|||
}
|
||||
|
||||
int count = args.Count();
|
||||
int pitch = RenderViewport::Instance()->RenderTarget->GetPitch();
|
||||
int pitch = args.Viewport()->RenderTarget->GetPitch();
|
||||
uint32_t fracstep = args.TextureVStep();
|
||||
uint32_t frac = args.TextureVPos();
|
||||
uint32_t texturefracx = args.TextureUPos();
|
||||
|
|
|
@ -73,8 +73,8 @@ namespace swrenderer
|
|||
basecolormap = colormap;
|
||||
mLineSegment = line;
|
||||
|
||||
DVector2 pt1 = line->v1->fPos() - r_viewpoint.Pos;
|
||||
DVector2 pt2 = line->v2->fPos() - r_viewpoint.Pos;
|
||||
DVector2 pt1 = line->v1->fPos() - Thread->Viewport->viewpoint.Pos;
|
||||
DVector2 pt2 = line->v2->fPos() - Thread->Viewport->viewpoint.Pos;
|
||||
|
||||
// Reject lines not facing viewer
|
||||
if (pt1.Y * (pt1.X - pt2.X) + pt1.X * (pt2.Y - pt1.Y) >= 0)
|
||||
|
@ -98,7 +98,7 @@ namespace swrenderer
|
|||
|
||||
// reject lines that aren't seen from the portal (if any)
|
||||
// [ZZ] 10.01.2016: lines inside a skybox shouldn't be clipped, although this imposes some limitations on portals in skyboxes.
|
||||
if (!renderportal->CurrentPortalInSkybox && renderportal->CurrentPortal && P_ClipLineToPortal(line->linedef, renderportal->CurrentPortal->dst, r_viewpoint.Pos))
|
||||
if (!renderportal->CurrentPortalInSkybox && renderportal->CurrentPortal && P_ClipLineToPortal(line->linedef, renderportal->CurrentPortal->dst, Thread->Viewport->viewpoint.Pos))
|
||||
return;
|
||||
|
||||
vertex_t *v1 = line->linedef->v1;
|
||||
|
@ -114,7 +114,7 @@ namespace swrenderer
|
|||
{
|
||||
swapvalues(v1, v2);
|
||||
}
|
||||
WallT.InitFromLine(Thread, v1->fPos() - r_viewpoint.Pos, v2->fPos() - r_viewpoint.Pos);
|
||||
WallT.InitFromLine(Thread, v1->fPos() - Thread->Viewport->viewpoint.Pos, v2->fPos() - Thread->Viewport->viewpoint.Pos);
|
||||
}
|
||||
|
||||
mFrontCeilingZ1 = mFrontSector->ceilingplane.ZatPoint(line->v1);
|
||||
|
@ -363,13 +363,13 @@ namespace swrenderer
|
|||
draw_segment->silhouette = 0;
|
||||
|
||||
if (mFrontFloorZ1 > mBackFloorZ1 || mFrontFloorZ2 > mBackFloorZ2 ||
|
||||
mBackSector->floorplane.PointOnSide(r_viewpoint.Pos) < 0)
|
||||
mBackSector->floorplane.PointOnSide(Thread->Viewport->viewpoint.Pos) < 0)
|
||||
{
|
||||
draw_segment->silhouette = SIL_BOTTOM;
|
||||
}
|
||||
|
||||
if (mFrontCeilingZ1 < mBackCeilingZ1 || mFrontCeilingZ2 < mBackCeilingZ2 ||
|
||||
mBackSector->ceilingplane.PointOnSide(r_viewpoint.Pos) < 0)
|
||||
mBackSector->ceilingplane.PointOnSide(Thread->Viewport->viewpoint.Pos) < 0)
|
||||
{
|
||||
draw_segment->silhouette |= SIL_TOP;
|
||||
}
|
||||
|
@ -496,7 +496,7 @@ namespace swrenderer
|
|||
}
|
||||
else
|
||||
{
|
||||
draw_segment->shade = LightVisibility::LightLevelToShade(mLineSegment->sidedef->GetLightLevel(foggy, mLineSegment->frontsector->lightlevel) + LightVisibility::ActualExtraLight(foggy), foggy);
|
||||
draw_segment->shade = LightVisibility::LightLevelToShade(mLineSegment->sidedef->GetLightLevel(foggy, mLineSegment->frontsector->lightlevel) + LightVisibility::ActualExtraLight(foggy, Thread->Viewport.get()), foggy);
|
||||
}
|
||||
|
||||
if (draw_segment->bFogBoundary || draw_segment->maskedtexturecol != nullptr)
|
||||
|
@ -564,7 +564,7 @@ namespace swrenderer
|
|||
// deep water check
|
||||
if (mFrontSector->GetHeightSec() == nullptr)
|
||||
{
|
||||
int planeside = mFrontSector->floorplane.PointOnSide(r_viewpoint.Pos);
|
||||
int planeside = mFrontSector->floorplane.PointOnSide(Thread->Viewport->viewpoint.Pos);
|
||||
if (mFrontSector->floorplane.fC() < 0) // 3D floors have the floor backwards
|
||||
planeside = -planeside;
|
||||
if (planeside <= 0) // above view plane
|
||||
|
@ -621,7 +621,7 @@ namespace swrenderer
|
|||
// deep water check
|
||||
if (mFrontSector->GetHeightSec() == nullptr && mFrontSector->GetTexture(sector_t::ceiling) != skyflatnum)
|
||||
{
|
||||
int planeside = mFrontSector->ceilingplane.PointOnSide(r_viewpoint.Pos);
|
||||
int planeside = mFrontSector->ceilingplane.PointOnSide(Thread->Viewport->viewpoint.Pos);
|
||||
if (mFrontSector->ceilingplane.fC() > 0) // 3D floors have the ceiling backwards
|
||||
planeside = -planeside;
|
||||
if (planeside <= 0) // below view plane
|
||||
|
@ -706,25 +706,25 @@ namespace swrenderer
|
|||
if (mFrontCeilingZ1 > mBackCeilingZ1 || mFrontCeilingZ2 > mBackCeilingZ2)
|
||||
{
|
||||
rw_havehigh = true;
|
||||
wallupper.Project(mBackSector->ceilingplane, &WallC, mLineSegment, renderportal->MirrorFlags & RF_XFLIP);
|
||||
wallupper.Project(Thread->Viewport.get(), mBackSector->ceilingplane, &WallC, mLineSegment, renderportal->MirrorFlags & RF_XFLIP);
|
||||
}
|
||||
if (mFrontFloorZ1 < mBackFloorZ1 || mFrontFloorZ2 < mBackFloorZ2)
|
||||
{
|
||||
rw_havelow = true;
|
||||
walllower.Project(mBackSector->floorplane, &WallC, mLineSegment, renderportal->MirrorFlags & RF_XFLIP);
|
||||
walllower.Project(Thread->Viewport.get(), mBackSector->floorplane, &WallC, mLineSegment, renderportal->MirrorFlags & RF_XFLIP);
|
||||
}
|
||||
}
|
||||
|
||||
if (mLineSegment->linedef->special == Line_Horizon)
|
||||
{
|
||||
// Be aware: Line_Horizon does not work properly with sloped planes
|
||||
fillshort(walltop.ScreenY + WallC.sx1, WallC.sx2 - WallC.sx1, r_viewwindow.centery);
|
||||
fillshort(wallbottom.ScreenY + WallC.sx1, WallC.sx2 - WallC.sx1, r_viewwindow.centery);
|
||||
fillshort(walltop.ScreenY + WallC.sx1, WallC.sx2 - WallC.sx1, Thread->Viewport->viewwindow.centery);
|
||||
fillshort(wallbottom.ScreenY + WallC.sx1, WallC.sx2 - WallC.sx1, Thread->Viewport->viewwindow.centery);
|
||||
}
|
||||
else
|
||||
{
|
||||
mCeilingClipped = walltop.Project(mFrontSector->ceilingplane, &WallC, mLineSegment, renderportal->MirrorFlags & RF_XFLIP);
|
||||
mFloorClipped = wallbottom.Project(mFrontSector->floorplane, &WallC, mLineSegment, renderportal->MirrorFlags & RF_XFLIP);
|
||||
mCeilingClipped = walltop.Project(Thread->Viewport.get(), mFrontSector->ceilingplane, &WallC, mLineSegment, renderportal->MirrorFlags & RF_XFLIP);
|
||||
mFloorClipped = wallbottom.Project(Thread->Viewport.get(), mFrontSector->floorplane, &WallC, mLineSegment, renderportal->MirrorFlags & RF_XFLIP);
|
||||
}
|
||||
|
||||
side_t *sidedef = mLineSegment->sidedef;
|
||||
|
@ -758,7 +758,7 @@ namespace swrenderer
|
|||
// wall but nothing to draw for it.
|
||||
// Recalculate walltop so that the wall is clipped by the back sector's
|
||||
// ceiling instead of the front sector's ceiling.
|
||||
walltop.Project(mBackSector->ceilingplane, &WallC, mLineSegment, Thread->Portal->MirrorFlags & RF_XFLIP);
|
||||
walltop.Project(Thread->Viewport.get(), mBackSector->ceilingplane, &WallC, mLineSegment, Thread->Portal->MirrorFlags & RF_XFLIP);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -776,12 +776,12 @@ namespace swrenderer
|
|||
mBottomPart.Texture ? (mBottomPart.Texture->Scale.X * sidedef->GetTextureXScale(side_t::bottom)) :
|
||||
1.;
|
||||
|
||||
walltexcoords.Project(sidedef->TexelLength * lwallscale, WallC.sx1, WallC.sx2, WallT);
|
||||
walltexcoords.Project(Thread->Viewport.get(), sidedef->TexelLength * lwallscale, WallC.sx1, WallC.sx2, WallT);
|
||||
|
||||
CameraLight *cameraLight = CameraLight::Instance();
|
||||
if (cameraLight->FixedColormap() == nullptr && cameraLight->FixedLightLevel() < 0)
|
||||
{
|
||||
wallshade = LightVisibility::LightLevelToShade(mLineSegment->sidedef->GetLightLevel(foggy, mFrontSector->lightlevel) + LightVisibility::ActualExtraLight(foggy), foggy);
|
||||
wallshade = LightVisibility::LightLevelToShade(mLineSegment->sidedef->GetLightLevel(foggy, mFrontSector->lightlevel) + LightVisibility::ActualExtraLight(foggy, Thread->Viewport.get()), foggy);
|
||||
double GlobVis = LightVisibility::Instance()->WallGlobVis(foggy);
|
||||
rw_lightleft = float(GlobVis / WallC.sz1);
|
||||
rw_lightstep = float((GlobVis / WallC.sz2 - rw_lightleft) / (WallC.sx2 - WallC.sx1));
|
||||
|
@ -819,7 +819,7 @@ namespace swrenderer
|
|||
{ // normal orientation
|
||||
if (linedef->flags & ML_DONTPEGTOP)
|
||||
{ // top of texture at top
|
||||
mTopPart.TextureMid = (mFrontSector->GetPlaneTexZ(sector_t::ceiling) - r_viewpoint.Pos.Z) * yrepeat;
|
||||
mTopPart.TextureMid = (mFrontSector->GetPlaneTexZ(sector_t::ceiling) - Thread->Viewport->viewpoint.Pos.Z) * yrepeat;
|
||||
if (rowoffset < 0 && mTopPart.Texture != NULL)
|
||||
{
|
||||
rowoffset += mTopPart.Texture->GetHeight();
|
||||
|
@ -827,7 +827,7 @@ namespace swrenderer
|
|||
}
|
||||
else
|
||||
{ // bottom of texture at bottom
|
||||
mTopPart.TextureMid = (mBackSector->GetPlaneTexZ(sector_t::ceiling) - r_viewpoint.Pos.Z) * yrepeat + mTopPart.Texture->GetHeight();
|
||||
mTopPart.TextureMid = (mBackSector->GetPlaneTexZ(sector_t::ceiling) - Thread->Viewport->viewpoint.Pos.Z) * yrepeat + mTopPart.Texture->GetHeight();
|
||||
}
|
||||
}
|
||||
else
|
||||
|
@ -835,11 +835,11 @@ namespace swrenderer
|
|||
rowoffset = -rowoffset;
|
||||
if (linedef->flags & ML_DONTPEGTOP)
|
||||
{ // bottom of texture at top
|
||||
mTopPart.TextureMid = (mFrontSector->GetPlaneTexZ(sector_t::ceiling) - r_viewpoint.Pos.Z) * yrepeat + mTopPart.Texture->GetHeight();
|
||||
mTopPart.TextureMid = (mFrontSector->GetPlaneTexZ(sector_t::ceiling) - Thread->Viewport->viewpoint.Pos.Z) * yrepeat + mTopPart.Texture->GetHeight();
|
||||
}
|
||||
else
|
||||
{ // top of texture at bottom
|
||||
mTopPart.TextureMid = (mBackSector->GetPlaneTexZ(sector_t::ceiling) - r_viewpoint.Pos.Z) * yrepeat;
|
||||
mTopPart.TextureMid = (mBackSector->GetPlaneTexZ(sector_t::ceiling) - Thread->Viewport->viewpoint.Pos.Z) * yrepeat;
|
||||
}
|
||||
}
|
||||
if (mTopPart.Texture->bWorldPanning)
|
||||
|
@ -875,11 +875,11 @@ namespace swrenderer
|
|||
{ // normal orientation
|
||||
if (linedef->flags & ML_DONTPEGBOTTOM)
|
||||
{ // bottom of texture at bottom
|
||||
mMiddlePart.TextureMid = (mFrontSector->GetPlaneTexZ(sector_t::floor) - r_viewpoint.Pos.Z) * yrepeat + mMiddlePart.Texture->GetHeight();
|
||||
mMiddlePart.TextureMid = (mFrontSector->GetPlaneTexZ(sector_t::floor) - Thread->Viewport->viewpoint.Pos.Z) * yrepeat + mMiddlePart.Texture->GetHeight();
|
||||
}
|
||||
else
|
||||
{ // top of texture at top
|
||||
mMiddlePart.TextureMid = (mFrontSector->GetPlaneTexZ(sector_t::ceiling) - r_viewpoint.Pos.Z) * yrepeat;
|
||||
mMiddlePart.TextureMid = (mFrontSector->GetPlaneTexZ(sector_t::ceiling) - Thread->Viewport->viewpoint.Pos.Z) * yrepeat;
|
||||
if (rowoffset < 0 && mMiddlePart.Texture != NULL)
|
||||
{
|
||||
rowoffset += mMiddlePart.Texture->GetHeight();
|
||||
|
@ -891,11 +891,11 @@ namespace swrenderer
|
|||
rowoffset = -rowoffset;
|
||||
if (linedef->flags & ML_DONTPEGBOTTOM)
|
||||
{ // top of texture at bottom
|
||||
mMiddlePart.TextureMid = (mFrontSector->GetPlaneTexZ(sector_t::floor) - r_viewpoint.Pos.Z) * yrepeat;
|
||||
mMiddlePart.TextureMid = (mFrontSector->GetPlaneTexZ(sector_t::floor) - Thread->Viewport->viewpoint.Pos.Z) * yrepeat;
|
||||
}
|
||||
else
|
||||
{ // bottom of texture at top
|
||||
mMiddlePart.TextureMid = (mFrontSector->GetPlaneTexZ(sector_t::ceiling) - r_viewpoint.Pos.Z) * yrepeat + mMiddlePart.Texture->GetHeight();
|
||||
mMiddlePart.TextureMid = (mFrontSector->GetPlaneTexZ(sector_t::ceiling) - Thread->Viewport->viewpoint.Pos.Z) * yrepeat + mMiddlePart.Texture->GetHeight();
|
||||
}
|
||||
}
|
||||
if (mMiddlePart.Texture->bWorldPanning)
|
||||
|
@ -940,11 +940,11 @@ namespace swrenderer
|
|||
{ // normal orientation
|
||||
if (linedef->flags & ML_DONTPEGBOTTOM)
|
||||
{ // bottom of texture at bottom
|
||||
mBottomPart.TextureMid = (frontlowertop - r_viewpoint.Pos.Z) * yrepeat;
|
||||
mBottomPart.TextureMid = (frontlowertop - Thread->Viewport->viewpoint.Pos.Z) * yrepeat;
|
||||
}
|
||||
else
|
||||
{ // top of texture at top
|
||||
mBottomPart.TextureMid = (mBackSector->GetPlaneTexZ(sector_t::floor) - r_viewpoint.Pos.Z) * yrepeat;
|
||||
mBottomPart.TextureMid = (mBackSector->GetPlaneTexZ(sector_t::floor) - Thread->Viewport->viewpoint.Pos.Z) * yrepeat;
|
||||
if (rowoffset < 0 && mBottomPart.Texture != NULL)
|
||||
{
|
||||
rowoffset += mBottomPart.Texture->GetHeight();
|
||||
|
@ -956,11 +956,11 @@ namespace swrenderer
|
|||
rowoffset = -rowoffset;
|
||||
if (linedef->flags & ML_DONTPEGBOTTOM)
|
||||
{ // top of texture at bottom
|
||||
mBottomPart.TextureMid = (frontlowertop - r_viewpoint.Pos.Z) * yrepeat;
|
||||
mBottomPart.TextureMid = (frontlowertop - Thread->Viewport->viewpoint.Pos.Z) * yrepeat;
|
||||
}
|
||||
else
|
||||
{ // bottom of texture at top
|
||||
mBottomPart.TextureMid = (mBackSector->GetPlaneTexZ(sector_t::floor) - r_viewpoint.Pos.Z) * yrepeat + mBottomPart.Texture->GetHeight();
|
||||
mBottomPart.TextureMid = (mBackSector->GetPlaneTexZ(sector_t::floor) - Thread->Viewport->viewpoint.Pos.Z) * yrepeat + mBottomPart.Texture->GetHeight();
|
||||
}
|
||||
}
|
||||
if (mBottomPart.Texture->bWorldPanning)
|
||||
|
@ -1134,7 +1134,7 @@ namespace swrenderer
|
|||
double yscale = rw_pic->Scale.Y * mTopPart.TextureScaleV;
|
||||
if (xscale != lwallscale)
|
||||
{
|
||||
walltexcoords.ProjectPos(mLineSegment->sidedef->TexelLength*xscale, WallC.sx1, WallC.sx2, WallT);
|
||||
walltexcoords.ProjectPos(Thread->Viewport.get(), mLineSegment->sidedef->TexelLength*xscale, WallC.sx1, WallC.sx2, WallT);
|
||||
lwallscale = xscale;
|
||||
}
|
||||
fixed_t offset;
|
||||
|
@ -1181,7 +1181,7 @@ namespace swrenderer
|
|||
double yscale = rw_pic->Scale.Y * mMiddlePart.TextureScaleV;
|
||||
if (xscale != lwallscale)
|
||||
{
|
||||
walltexcoords.ProjectPos(mLineSegment->sidedef->TexelLength*xscale, WallC.sx1, WallC.sx2, WallT);
|
||||
walltexcoords.ProjectPos(Thread->Viewport.get(), mLineSegment->sidedef->TexelLength*xscale, WallC.sx1, WallC.sx2, WallT);
|
||||
lwallscale = xscale;
|
||||
}
|
||||
fixed_t offset;
|
||||
|
@ -1229,7 +1229,7 @@ namespace swrenderer
|
|||
double yscale = rw_pic->Scale.Y * mBottomPart.TextureScaleV;
|
||||
if (xscale != lwallscale)
|
||||
{
|
||||
walltexcoords.ProjectPos(mLineSegment->sidedef->TexelLength*xscale, WallC.sx1, WallC.sx2, WallT);
|
||||
walltexcoords.ProjectPos(Thread->Viewport.get(), mLineSegment->sidedef->TexelLength*xscale, WallC.sx1, WallC.sx2, WallT);
|
||||
lwallscale = xscale;
|
||||
}
|
||||
fixed_t offset;
|
||||
|
@ -1271,14 +1271,14 @@ namespace swrenderer
|
|||
// Transform and clip coordinates. Returns true if it was clipped away
|
||||
bool FWallCoords::Init(RenderThread *thread, const DVector2 &pt1, const DVector2 &pt2, double too_close)
|
||||
{
|
||||
tleft.X = float(pt1.X * r_viewpoint.Sin - pt1.Y * r_viewpoint.Cos);
|
||||
tright.X = float(pt2.X * r_viewpoint.Sin - pt2.Y * r_viewpoint.Cos);
|
||||
|
||||
tleft.Y = float(pt1.X * r_viewpoint.TanCos + pt1.Y * r_viewpoint.TanSin);
|
||||
tright.Y = float(pt2.X * r_viewpoint.TanCos + pt2.Y * r_viewpoint.TanSin);
|
||||
|
||||
auto viewport = thread->Viewport.get();
|
||||
RenderPortal *renderportal = thread->Portal.get();
|
||||
auto viewport = RenderViewport::Instance();
|
||||
|
||||
tleft.X = float(pt1.X * viewport->viewpoint.Sin - pt1.Y * viewport->viewpoint.Cos);
|
||||
tright.X = float(pt2.X * viewport->viewpoint.Sin - pt2.Y * viewport->viewpoint.Cos);
|
||||
|
||||
tleft.Y = float(pt1.X * viewport->viewpoint.TanCos + pt1.Y * viewport->viewpoint.TanSin);
|
||||
tright.Y = float(pt2.X * viewport->viewpoint.TanCos + pt2.Y * viewport->viewpoint.TanSin);
|
||||
|
||||
if (renderportal->MirrorFlags & RF_XFLIP)
|
||||
{
|
||||
|
@ -1342,9 +1342,9 @@ namespace swrenderer
|
|||
{
|
||||
swapvalues(left, right);
|
||||
}
|
||||
UoverZorg = left->X * r_viewwindow.centerx;
|
||||
UoverZorg = left->X * thread->Viewport->viewwindow.centerx;
|
||||
UoverZstep = -left->Y;
|
||||
InvZorg = (left->X - right->X) * r_viewwindow.centerx;
|
||||
InvZorg = (left->X - right->X) * thread->Viewport->viewwindow.centerx;
|
||||
InvZstep = right->Y - left->Y;
|
||||
}
|
||||
|
||||
|
@ -1352,10 +1352,12 @@ namespace swrenderer
|
|||
{
|
||||
// Coordinates should have already had viewx,viewy subtracted
|
||||
|
||||
double fullx1 = left.X * r_viewpoint.Sin - left.Y * r_viewpoint.Cos;
|
||||
double fullx2 = right.X * r_viewpoint.Sin - right.Y * r_viewpoint.Cos;
|
||||
double fully1 = left.X * r_viewpoint.TanCos + left.Y * r_viewpoint.TanSin;
|
||||
double fully2 = right.X * r_viewpoint.TanCos + right.Y * r_viewpoint.TanSin;
|
||||
auto viewport = thread->Viewport.get();
|
||||
|
||||
double fullx1 = left.X * viewport->viewpoint.Sin - left.Y * viewport->viewpoint.Cos;
|
||||
double fullx2 = right.X * viewport->viewpoint.Sin - right.Y * viewport->viewpoint.Cos;
|
||||
double fully1 = left.X * viewport->viewpoint.TanCos + left.Y * viewport->viewpoint.TanSin;
|
||||
double fully2 = right.X * viewport->viewpoint.TanCos + right.Y * viewport->viewpoint.TanSin;
|
||||
|
||||
RenderPortal *renderportal = thread->Portal.get();
|
||||
|
||||
|
@ -1365,9 +1367,9 @@ namespace swrenderer
|
|||
fullx2 = -fullx2;
|
||||
}
|
||||
|
||||
UoverZorg = float(fullx1 * r_viewwindow.centerx);
|
||||
UoverZorg = float(fullx1 * viewport->viewwindow.centerx);
|
||||
UoverZstep = float(-fully1);
|
||||
InvZorg = float((fullx1 - fullx2) * r_viewwindow.centerx);
|
||||
InvZorg = float((fullx1 - fullx2) * viewport->viewwindow.centerx);
|
||||
InvZstep = float(fully2 - fully1);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -56,7 +56,7 @@ namespace swrenderer
|
|||
|
||||
void RenderDrawSegment::Render(DrawSegment *ds, int x1, int x2)
|
||||
{
|
||||
auto viewport = RenderViewport::Instance();
|
||||
auto viewport = Thread->Viewport.get();
|
||||
RenderFogBoundary renderfog;
|
||||
float *MaskedSWall = nullptr, MaskedScaleY = 0, rw_scalestep = 0;
|
||||
fixed_t *maskedtexturecol = nullptr;
|
||||
|
@ -83,7 +83,7 @@ namespace swrenderer
|
|||
|
||||
SpriteDrawerArgs columndrawerargs;
|
||||
FDynamicColormap *patchstylecolormap = nullptr;
|
||||
bool visible = columndrawerargs.SetStyle(LegacyRenderStyles[additive ? STYLE_Add : STYLE_Translucent], alpha, 0, 0, patchstylecolormap);
|
||||
bool visible = columndrawerargs.SetStyle(viewport, LegacyRenderStyles[additive ? STYLE_Add : STYLE_Translucent], alpha, 0, 0, patchstylecolormap);
|
||||
|
||||
if (!visible && !ds->bFogBoundary && !ds->bFakeBoundary)
|
||||
{
|
||||
|
@ -118,7 +118,7 @@ namespace swrenderer
|
|||
{
|
||||
if (!(clip3d->fake3D & FAKE3D_CLIPTOP))
|
||||
{
|
||||
clip3d->sclipTop = sec->ceilingplane.ZatPoint(r_viewpoint.Pos);
|
||||
clip3d->sclipTop = sec->ceilingplane.ZatPoint(Thread->Viewport->viewpoint.Pos);
|
||||
}
|
||||
for (i = frontsector->e->XFloor.lightlist.Size() - 1; i >= 0; i--)
|
||||
{
|
||||
|
@ -127,7 +127,7 @@ namespace swrenderer
|
|||
lightlist_t *lit = &frontsector->e->XFloor.lightlist[i];
|
||||
basecolormap = lit->extra_colormap;
|
||||
bool foggy = (level.fadeto || basecolormap->Fade || (level.flags & LEVEL_HASFADETABLE)); // [RH] set foggy flag
|
||||
wallshade = LightVisibility::LightLevelToShade(curline->sidedef->GetLightLevel(ds->foggy, *lit->p_lightlevel, lit->lightsource != nullptr) + LightVisibility::ActualExtraLight(ds->foggy), foggy);
|
||||
wallshade = LightVisibility::LightLevelToShade(curline->sidedef->GetLightLevel(ds->foggy, *lit->p_lightlevel, lit->lightsource != nullptr) + LightVisibility::ActualExtraLight(ds->foggy, viewport), foggy);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -202,7 +202,7 @@ namespace swrenderer
|
|||
{
|
||||
// rowoffset is added before the multiply so that the masked texture will
|
||||
// still be positioned in world units rather than texels.
|
||||
texturemid += rowoffset - r_viewpoint.Pos.Z;
|
||||
texturemid += rowoffset - Thread->Viewport->viewpoint.Pos.Z;
|
||||
textop = texturemid;
|
||||
texturemid *= MaskedScaleY;
|
||||
}
|
||||
|
@ -210,8 +210,8 @@ namespace swrenderer
|
|||
{
|
||||
// rowoffset is added outside the multiply so that it positions the texture
|
||||
// by texels instead of world units.
|
||||
textop = texturemid + rowoffset / MaskedScaleY - r_viewpoint.Pos.Z;
|
||||
texturemid = (texturemid - r_viewpoint.Pos.Z) * MaskedScaleY + rowoffset;
|
||||
textop = texturemid + rowoffset / MaskedScaleY - Thread->Viewport->viewpoint.Pos.Z;
|
||||
texturemid = (texturemid - Thread->Viewport->viewpoint.Pos.Z) * MaskedScaleY + rowoffset;
|
||||
}
|
||||
if (sprflipvert)
|
||||
{
|
||||
|
@ -230,12 +230,12 @@ namespace swrenderer
|
|||
goto clearfog;
|
||||
}
|
||||
|
||||
if ((clip3d->fake3D & FAKE3D_CLIPBOTTOM) && textop < clip3d->sclipBottom - r_viewpoint.Pos.Z)
|
||||
if ((clip3d->fake3D & FAKE3D_CLIPBOTTOM) && textop < clip3d->sclipBottom - Thread->Viewport->viewpoint.Pos.Z)
|
||||
{
|
||||
notrelevant = true;
|
||||
goto clearfog;
|
||||
}
|
||||
if ((clip3d->fake3D & FAKE3D_CLIPTOP) && textop - texheight > clip3d->sclipTop - r_viewpoint.Pos.Z)
|
||||
if ((clip3d->fake3D & FAKE3D_CLIPTOP) && textop - texheight > clip3d->sclipTop - Thread->Viewport->viewpoint.Pos.Z)
|
||||
{
|
||||
notrelevant = true;
|
||||
goto clearfog;
|
||||
|
@ -248,19 +248,19 @@ namespace swrenderer
|
|||
|
||||
if (clip3d->fake3D & FAKE3D_CLIPTOP)
|
||||
{
|
||||
wallupper.Project(textop < clip3d->sclipTop - r_viewpoint.Pos.Z ? textop : clip3d->sclipTop - r_viewpoint.Pos.Z, &WallC);
|
||||
wallupper.Project(Thread->Viewport.get(), textop < clip3d->sclipTop - Thread->Viewport->viewpoint.Pos.Z ? textop : clip3d->sclipTop - Thread->Viewport->viewpoint.Pos.Z, &WallC);
|
||||
}
|
||||
else
|
||||
{
|
||||
wallupper.Project(textop, &WallC);
|
||||
wallupper.Project(Thread->Viewport.get(), textop, &WallC);
|
||||
}
|
||||
if (clip3d->fake3D & FAKE3D_CLIPBOTTOM)
|
||||
{
|
||||
walllower.Project(textop - texheight > clip3d->sclipBottom - r_viewpoint.Pos.Z ? textop - texheight : clip3d->sclipBottom - r_viewpoint.Pos.Z, &WallC);
|
||||
walllower.Project(Thread->Viewport.get(), textop - texheight > clip3d->sclipBottom - Thread->Viewport->viewpoint.Pos.Z ? textop - texheight : clip3d->sclipBottom - Thread->Viewport->viewpoint.Pos.Z, &WallC);
|
||||
}
|
||||
else
|
||||
{
|
||||
walllower.Project(textop - texheight, &WallC);
|
||||
walllower.Project(Thread->Viewport.get(), textop - texheight, &WallC);
|
||||
}
|
||||
|
||||
for (i = x1; i < x2; i++)
|
||||
|
@ -319,13 +319,13 @@ namespace swrenderer
|
|||
{
|
||||
// rowoffset is added before the multiply so that the masked texture will
|
||||
// still be positioned in world units rather than texels.
|
||||
texturemid = (texturemid - r_viewpoint.Pos.Z + rowoffset) * MaskedScaleY;
|
||||
texturemid = (texturemid - Thread->Viewport->viewpoint.Pos.Z + rowoffset) * MaskedScaleY;
|
||||
}
|
||||
else
|
||||
{
|
||||
// rowoffset is added outside the multiply so that it positions the texture
|
||||
// by texels instead of world units.
|
||||
texturemid = (texturemid - r_viewpoint.Pos.Z) * MaskedScaleY + rowoffset;
|
||||
texturemid = (texturemid - Thread->Viewport->viewpoint.Pos.Z) * MaskedScaleY + rowoffset;
|
||||
}
|
||||
|
||||
WallC.sz1 = ds->sz1;
|
||||
|
@ -347,7 +347,7 @@ namespace swrenderer
|
|||
|
||||
if (clip3d->fake3D & FAKE3D_CLIPTOP)
|
||||
{
|
||||
wallupper.Project(clip3d->sclipTop - r_viewpoint.Pos.Z, &WallC);
|
||||
wallupper.Project(Thread->Viewport.get(), clip3d->sclipTop - Thread->Viewport->viewpoint.Pos.Z, &WallC);
|
||||
for (i = x1; i < x2; i++)
|
||||
{
|
||||
if (wallupper.ScreenY[i] < mceilingclip[i])
|
||||
|
@ -357,7 +357,7 @@ namespace swrenderer
|
|||
}
|
||||
if (clip3d->fake3D & FAKE3D_CLIPBOTTOM)
|
||||
{
|
||||
walllower.Project(clip3d->sclipBottom - r_viewpoint.Pos.Z, &WallC);
|
||||
walllower.Project(Thread->Viewport.get(), clip3d->sclipBottom - Thread->Viewport->viewpoint.Pos.Z, &WallC);
|
||||
for (i = x1; i < x2; i++)
|
||||
{
|
||||
if (walllower.ScreenY[i] > mfloorclip[i])
|
||||
|
@ -450,7 +450,7 @@ namespace swrenderer
|
|||
{
|
||||
rowoffset += rw_pic->GetHeight();
|
||||
}
|
||||
double texturemid = (planez - r_viewpoint.Pos.Z) * yscale;
|
||||
double texturemid = (planez - Thread->Viewport->viewpoint.Pos.Z) * yscale;
|
||||
if (rw_pic->bWorldPanning)
|
||||
{
|
||||
// rowoffset is added before the multiply so that the masked texture will
|
||||
|
@ -483,8 +483,8 @@ namespace swrenderer
|
|||
WallT = ds->tmapvals;
|
||||
|
||||
Clip3DFloors *clip3d = Thread->Clip3D.get();
|
||||
wallupper.Project(clip3d->sclipTop - r_viewpoint.Pos.Z, &WallC);
|
||||
walllower.Project(clip3d->sclipBottom - r_viewpoint.Pos.Z, &WallC);
|
||||
wallupper.Project(Thread->Viewport.get(), clip3d->sclipTop - Thread->Viewport->viewpoint.Pos.Z, &WallC);
|
||||
walllower.Project(Thread->Viewport.get(), clip3d->sclipBottom - Thread->Viewport->viewpoint.Pos.Z, &WallC);
|
||||
|
||||
for (i = x1; i < x2; i++)
|
||||
{
|
||||
|
@ -498,7 +498,7 @@ namespace swrenderer
|
|||
}
|
||||
|
||||
ProjectedWallTexcoords walltexcoords;
|
||||
walltexcoords.ProjectPos(curline->sidedef->TexelLength*xscale, ds->sx1, ds->sx2, WallT);
|
||||
walltexcoords.ProjectPos(Thread->Viewport.get(), curline->sidedef->TexelLength*xscale, ds->sx1, ds->sx2, WallT);
|
||||
|
||||
double top, bot;
|
||||
GetMaskedWallTopBottom(ds, top, bot);
|
||||
|
@ -704,7 +704,7 @@ namespace swrenderer
|
|||
lightlist_t *lit = &backsector->e->XFloor.lightlist[j];
|
||||
basecolormap = lit->extra_colormap;
|
||||
bool foggy = (level.fadeto || basecolormap->Fade || (level.flags & LEVEL_HASFADETABLE)); // [RH] set foggy flag
|
||||
wallshade = LightVisibility::LightLevelToShade(curline->sidedef->GetLightLevel(ds->foggy, *lit->p_lightlevel, lit->lightsource != nullptr) + LightVisibility::ActualExtraLight(ds->foggy), foggy);
|
||||
wallshade = LightVisibility::LightLevelToShade(curline->sidedef->GetLightLevel(ds->foggy, *lit->p_lightlevel, lit->lightsource != nullptr) + LightVisibility::ActualExtraLight(ds->foggy, Thread->Viewport.get()), foggy);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -718,7 +718,7 @@ namespace swrenderer
|
|||
lightlist_t *lit = &frontsector->e->XFloor.lightlist[j];
|
||||
basecolormap = lit->extra_colormap;
|
||||
bool foggy = (level.fadeto || basecolormap->Fade || (level.flags & LEVEL_HASFADETABLE)); // [RH] set foggy flag
|
||||
wallshade = LightVisibility::LightLevelToShade(curline->sidedef->GetLightLevel(ds->foggy, *lit->p_lightlevel, lit->lightsource != nullptr) + LightVisibility::ActualExtraLight(ds->foggy), foggy);
|
||||
wallshade = LightVisibility::LightLevelToShade(curline->sidedef->GetLightLevel(ds->foggy, *lit->p_lightlevel, lit->lightsource != nullptr) + LightVisibility::ActualExtraLight(ds->foggy, Thread->Viewport.get()), foggy);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -881,7 +881,7 @@ namespace swrenderer
|
|||
lightlist_t *lit = &backsector->e->XFloor.lightlist[j];
|
||||
basecolormap = lit->extra_colormap;
|
||||
bool foggy = (level.fadeto || basecolormap->Fade || (level.flags & LEVEL_HASFADETABLE)); // [RH] set foggy flag
|
||||
wallshade = LightVisibility::LightLevelToShade(curline->sidedef->GetLightLevel(ds->foggy, *lit->p_lightlevel, lit->lightsource != nullptr) + LightVisibility::ActualExtraLight(ds->foggy), foggy);
|
||||
wallshade = LightVisibility::LightLevelToShade(curline->sidedef->GetLightLevel(ds->foggy, *lit->p_lightlevel, lit->lightsource != nullptr) + LightVisibility::ActualExtraLight(ds->foggy, Thread->Viewport.get()), foggy);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -895,7 +895,7 @@ namespace swrenderer
|
|||
lightlist_t *lit = &frontsector->e->XFloor.lightlist[j];
|
||||
basecolormap = lit->extra_colormap;
|
||||
bool foggy = (level.fadeto || basecolormap->Fade || (level.flags & LEVEL_HASFADETABLE)); // [RH] set foggy flag
|
||||
wallshade = LightVisibility::LightLevelToShade(curline->sidedef->GetLightLevel(ds->foggy, *lit->p_lightlevel, lit->lightsource != nullptr) + LightVisibility::ActualExtraLight(ds->foggy), foggy);
|
||||
wallshade = LightVisibility::LightLevelToShade(curline->sidedef->GetLightLevel(ds->foggy, *lit->p_lightlevel, lit->lightsource != nullptr) + LightVisibility::ActualExtraLight(ds->foggy, Thread->Viewport.get()), foggy);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -923,13 +923,13 @@ namespace swrenderer
|
|||
|
||||
RenderPortal *renderportal = Thread->Portal.get();
|
||||
|
||||
most.Project(curline->frontsector->ceilingplane, &WallC, curline, renderportal->MirrorFlags & RF_XFLIP);
|
||||
most.Project(Thread->Viewport.get(), curline->frontsector->ceilingplane, &WallC, curline, renderportal->MirrorFlags & RF_XFLIP);
|
||||
for (int i = x1; i < x2; ++i)
|
||||
{
|
||||
if (wallupper.ScreenY[i] < most.ScreenY[i])
|
||||
wallupper.ScreenY[i] = most.ScreenY[i];
|
||||
}
|
||||
most.Project(curline->frontsector->floorplane, &WallC, curline, renderportal->MirrorFlags & RF_XFLIP);
|
||||
most.Project(Thread->Viewport.get(), curline->frontsector->floorplane, &WallC, curline, renderportal->MirrorFlags & RF_XFLIP);
|
||||
for (int i = x1; i < x2; ++i)
|
||||
{
|
||||
if (walllower.ScreenY[i] > most.ScreenY[i])
|
||||
|
|
|
@ -44,10 +44,8 @@
|
|||
|
||||
namespace swrenderer
|
||||
{
|
||||
WallSampler::WallSampler(int y1, double texturemid, float swal, double yrepeat, fixed_t xoffset, double xmagnitude, FTexture *texture)
|
||||
WallSampler::WallSampler(RenderViewport *viewport, int y1, double texturemid, float swal, double yrepeat, fixed_t xoffset, double xmagnitude, FTexture *texture)
|
||||
{
|
||||
auto viewport = RenderViewport::Instance();
|
||||
|
||||
xoffset += FLOAT2FIXED(xmagnitude * 0.5);
|
||||
|
||||
if (!viewport->RenderTarget->IsBgra())
|
||||
|
@ -175,7 +173,7 @@ namespace swrenderer
|
|||
{
|
||||
if (r_dynlights && light_list)
|
||||
{
|
||||
auto viewport = RenderViewport::Instance();
|
||||
auto viewport = Thread->Viewport.get();
|
||||
|
||||
// Find column position in view space
|
||||
float w1 = 1.0f / WallC.sz1;
|
||||
|
@ -207,12 +205,12 @@ namespace swrenderer
|
|||
{
|
||||
if (!(cur_node->lightsource->flags2&MF2_DORMANT))
|
||||
{
|
||||
double lightX = cur_node->lightsource->X() - r_viewpoint.Pos.X;
|
||||
double lightY = cur_node->lightsource->Y() - r_viewpoint.Pos.Y;
|
||||
double lightZ = cur_node->lightsource->Z() - r_viewpoint.Pos.Z;
|
||||
double lightX = cur_node->lightsource->X() - Thread->Viewport->viewpoint.Pos.X;
|
||||
double lightY = cur_node->lightsource->Y() - Thread->Viewport->viewpoint.Pos.Y;
|
||||
double lightZ = cur_node->lightsource->Z() - Thread->Viewport->viewpoint.Pos.Z;
|
||||
|
||||
float lx = (float)(lightX * r_viewpoint.Sin - lightY * r_viewpoint.Cos) - drawerargs.dc_viewpos.X;
|
||||
float ly = (float)(lightX * r_viewpoint.TanCos + lightY * r_viewpoint.TanSin) - drawerargs.dc_viewpos.Y;
|
||||
float lx = (float)(lightX * Thread->Viewport->viewpoint.Sin - lightY * Thread->Viewport->viewpoint.Cos) - drawerargs.dc_viewpos.X;
|
||||
float ly = (float)(lightX * Thread->Viewport->viewpoint.TanCos + lightY * Thread->Viewport->viewpoint.TanSin) - drawerargs.dc_viewpos.Y;
|
||||
float lz = (float)lightZ;
|
||||
|
||||
// Precalculate the constant part of the dot here so the drawer doesn't have to.
|
||||
|
@ -245,13 +243,13 @@ namespace swrenderer
|
|||
drawerargs.dc_num_lights = 0;
|
||||
}
|
||||
|
||||
if (RenderViewport::Instance()->RenderTarget->IsBgra())
|
||||
if (Thread->Viewport->RenderTarget->IsBgra())
|
||||
{
|
||||
int count = y2 - y1;
|
||||
|
||||
drawerargs.SetTexture(sampler.source, sampler.source2, sampler.height);
|
||||
drawerargs.SetTextureUPos(sampler.texturefracx);
|
||||
drawerargs.SetDest(x, y1);
|
||||
drawerargs.SetDest(Thread->Viewport.get(), x, y1);
|
||||
drawerargs.SetCount(count);
|
||||
drawerargs.SetTextureVStep(sampler.uv_step);
|
||||
drawerargs.SetTextureVPos(sampler.uv_pos);
|
||||
|
@ -269,7 +267,7 @@ namespace swrenderer
|
|||
|
||||
drawerargs.SetTexture(sampler.source, sampler.source2, sampler.height);
|
||||
drawerargs.SetTextureUPos(sampler.texturefracx);
|
||||
drawerargs.SetDest(x, y1);
|
||||
drawerargs.SetDest(Thread->Viewport.get(), x, y1);
|
||||
drawerargs.SetCount(count);
|
||||
drawerargs.SetTextureVStep(sampler.uv_step);
|
||||
drawerargs.SetTextureVPos(sampler.uv_pos);
|
||||
|
@ -294,7 +292,7 @@ namespace swrenderer
|
|||
|
||||
drawerargs.SetTexture(sampler.source, sampler.source2, sampler.height);
|
||||
drawerargs.SetTextureUPos(sampler.texturefracx);
|
||||
drawerargs.SetDest(x, y1);
|
||||
drawerargs.SetDest(Thread->Viewport.get(), x, y1);
|
||||
drawerargs.SetCount(count);
|
||||
drawerargs.SetTextureVStep(sampler.uv_step);
|
||||
drawerargs.SetTextureVPos(uv_pos);
|
||||
|
@ -325,7 +323,7 @@ namespace swrenderer
|
|||
texturemid = 0;
|
||||
}
|
||||
|
||||
drawerargs.SetTextureFracBits(RenderViewport::Instance()->RenderTarget->IsBgra() ? FRACBITS : fracbits);
|
||||
drawerargs.SetTextureFracBits(Thread->Viewport->RenderTarget->IsBgra() ? FRACBITS : fracbits);
|
||||
|
||||
CameraLight *cameraLight = CameraLight::Instance();
|
||||
bool fixed = (cameraLight->FixedColormap() != NULL || cameraLight->FixedLightLevel() >= 0);
|
||||
|
@ -357,7 +355,7 @@ namespace swrenderer
|
|||
|
||||
if (x + 1 < x2) xmagnitude = fabs(FIXED2DBL(lwal[x + 1]) - FIXED2DBL(lwal[x]));
|
||||
|
||||
WallSampler sampler(y1, texturemid, swal[x], yrepeat, lwal[x] + xoffset, xmagnitude, rw_pic);
|
||||
WallSampler sampler(Thread->Viewport.get(), y1, texturemid, swal[x], yrepeat, lwal[x] + xoffset, xmagnitude, rw_pic);
|
||||
Draw1Column(x, y1, y2, sampler);
|
||||
}
|
||||
|
||||
|
@ -387,7 +385,7 @@ namespace swrenderer
|
|||
// kg3D - fake floors instead of zdoom light list
|
||||
for (unsigned int i = 0; i < frontsector->e->XFloor.lightlist.Size(); i++)
|
||||
{
|
||||
ProjectedWallCull j = most3.Project(frontsector->e->XFloor.lightlist[i].plane, &WallC, curline, renderportal->MirrorFlags & RF_XFLIP);
|
||||
ProjectedWallCull j = most3.Project(Thread->Viewport.get(), frontsector->e->XFloor.lightlist[i].plane, &WallC, curline, renderportal->MirrorFlags & RF_XFLIP);
|
||||
if (j != ProjectedWallCull::OutsideAbove)
|
||||
{
|
||||
for (int j = x1; j < x2; ++j)
|
||||
|
@ -401,7 +399,7 @@ namespace swrenderer
|
|||
|
||||
lightlist_t *lit = &frontsector->e->XFloor.lightlist[i];
|
||||
basecolormap = lit->extra_colormap;
|
||||
wallshade = LightVisibility::LightLevelToShade(curline->sidedef->GetLightLevel(foggy, *lit->p_lightlevel, lit->lightsource != NULL) + LightVisibility::ActualExtraLight(foggy), foggy);
|
||||
wallshade = LightVisibility::LightLevelToShade(curline->sidedef->GetLightLevel(foggy, *lit->p_lightlevel, lit->lightsource != NULL) + LightVisibility::ActualExtraLight(foggy, Thread->Viewport.get()), foggy);
|
||||
}
|
||||
|
||||
ProcessNormalWall(up, dwal, texturemid, swal, lwal);
|
||||
|
@ -446,17 +444,17 @@ namespace swrenderer
|
|||
|
||||
if (yrepeat >= 0)
|
||||
{ // normal orientation: draw strips from top to bottom
|
||||
partition = top - fmod(top - texturemid / yrepeat - r_viewpoint.Pos.Z, scaledtexheight);
|
||||
partition = top - fmod(top - texturemid / yrepeat - Thread->Viewport->viewpoint.Pos.Z, scaledtexheight);
|
||||
if (partition == top)
|
||||
{
|
||||
partition -= scaledtexheight;
|
||||
}
|
||||
const short *up = uwal;
|
||||
short *down = most1.ScreenY;
|
||||
texturemid = (partition - r_viewpoint.Pos.Z) * yrepeat + texheight;
|
||||
texturemid = (partition - Thread->Viewport->viewpoint.Pos.Z) * yrepeat + texheight;
|
||||
while (partition > bot)
|
||||
{
|
||||
ProjectedWallCull j = most3.Project(partition - r_viewpoint.Pos.Z, &WallC);
|
||||
ProjectedWallCull j = most3.Project(Thread->Viewport.get(), partition - Thread->Viewport->viewpoint.Pos.Z, &WallC);
|
||||
if (j != ProjectedWallCull::OutsideAbove)
|
||||
{
|
||||
for (int j = x1; j < x2; ++j)
|
||||
|
@ -474,13 +472,13 @@ namespace swrenderer
|
|||
}
|
||||
else
|
||||
{ // upside down: draw strips from bottom to top
|
||||
partition = bot - fmod(bot - texturemid / yrepeat - r_viewpoint.Pos.Z, scaledtexheight);
|
||||
partition = bot - fmod(bot - texturemid / yrepeat - Thread->Viewport->viewpoint.Pos.Z, scaledtexheight);
|
||||
short *up = most1.ScreenY;
|
||||
const short *down = dwal;
|
||||
texturemid = (partition - r_viewpoint.Pos.Z) * yrepeat + texheight;
|
||||
texturemid = (partition - Thread->Viewport->viewpoint.Pos.Z) * yrepeat + texheight;
|
||||
while (partition < top)
|
||||
{
|
||||
ProjectedWallCull j = most3.Project(partition - r_viewpoint.Pos.Z, &WallC);
|
||||
ProjectedWallCull j = most3.Project(Thread->Viewport.get(), partition - Thread->Viewport->viewpoint.Pos.Z, &WallC);
|
||||
if (j != ProjectedWallCull::OutsideBelow)
|
||||
{
|
||||
for (int j = x1; j < x2; ++j)
|
||||
|
|
|
@ -94,7 +94,7 @@ namespace swrenderer
|
|||
struct WallSampler
|
||||
{
|
||||
WallSampler() { }
|
||||
WallSampler(int y1, double texturemid, float swal, double yrepeat, fixed_t xoffset, double xmagnitude, FTexture *texture);
|
||||
WallSampler(RenderViewport *viewport, int y1, double texturemid, float swal, double yrepeat, fixed_t xoffset, double xmagnitude, FTexture *texture);
|
||||
|
||||
uint32_t uv_pos;
|
||||
uint32_t uv_step;
|
||||
|
|
|
@ -27,15 +27,13 @@
|
|||
|
||||
namespace swrenderer
|
||||
{
|
||||
ProjectedWallCull ProjectedWallLine::Project(double z, const FWallCoords *wallc)
|
||||
ProjectedWallCull ProjectedWallLine::Project(RenderViewport *viewport, double z, const FWallCoords *wallc)
|
||||
{
|
||||
return Project(z, z, wallc);
|
||||
return Project(viewport, z, z, wallc);
|
||||
}
|
||||
|
||||
ProjectedWallCull ProjectedWallLine::Project(double z1, double z2, const FWallCoords *wallc)
|
||||
ProjectedWallCull ProjectedWallLine::Project(RenderViewport *viewport, double z1, double z2, const FWallCoords *wallc)
|
||||
{
|
||||
auto viewport = RenderViewport::Instance();
|
||||
|
||||
float y1 = (float)(viewport->CenterY - z1 * viewport->InvZtoScale / wallc->sz1);
|
||||
float y2 = (float)(viewport->CenterY - z2 * viewport->InvZtoScale / wallc->sz2);
|
||||
|
||||
|
@ -76,11 +74,11 @@ namespace swrenderer
|
|||
return ProjectedWallCull::Visible;
|
||||
}
|
||||
|
||||
ProjectedWallCull ProjectedWallLine::Project(const secplane_t &plane, const FWallCoords *wallc, seg_t *curline, bool xflip)
|
||||
ProjectedWallCull ProjectedWallLine::Project(RenderViewport *viewport, const secplane_t &plane, const FWallCoords *wallc, seg_t *curline, bool xflip)
|
||||
{
|
||||
if (!plane.isSlope())
|
||||
{
|
||||
return Project(plane.Zat0() - r_viewpoint.Pos.Z, wallc);
|
||||
return Project(viewport, plane.Zat0() - viewport->viewpoint.Pos.Z, wallc);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -96,7 +94,7 @@ namespace swrenderer
|
|||
x -= frac * (x - curline->v1->fX());
|
||||
y -= frac * (y - curline->v1->fY());
|
||||
}
|
||||
z1 = plane.ZatPoint(x, y) - r_viewpoint.Pos.Z;
|
||||
z1 = plane.ZatPoint(x, y) - viewport->viewpoint.Pos.Z;
|
||||
|
||||
if (wallc->sx2 > wallc->sx1 + 1)
|
||||
{
|
||||
|
@ -108,7 +106,7 @@ namespace swrenderer
|
|||
x += frac * (curline->v2->fX() - x);
|
||||
y += frac * (curline->v2->fY() - y);
|
||||
}
|
||||
z2 = plane.ZatPoint(x, y) - r_viewpoint.Pos.Z;
|
||||
z2 = plane.ZatPoint(x, y) - viewport->viewpoint.Pos.Z;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -125,7 +123,7 @@ namespace swrenderer
|
|||
x += frac * (curline->v2->fX() - x);
|
||||
y += frac * (curline->v2->fY() - y);
|
||||
}
|
||||
z1 = plane.ZatPoint(x, y) - r_viewpoint.Pos.Z;
|
||||
z1 = plane.ZatPoint(x, y) - viewport->viewpoint.Pos.Z;
|
||||
|
||||
if (wallc->sx2 > wallc->sx1 + 1)
|
||||
{
|
||||
|
@ -137,7 +135,7 @@ namespace swrenderer
|
|||
x -= frac * (x - curline->v1->fX());
|
||||
y -= frac * (y - curline->v1->fY());
|
||||
}
|
||||
z2 = plane.ZatPoint(x, y) - r_viewpoint.Pos.Z;
|
||||
z2 = plane.ZatPoint(x, y) - viewport->viewpoint.Pos.Z;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -145,16 +143,14 @@ namespace swrenderer
|
|||
}
|
||||
}
|
||||
|
||||
return Project(z1, z2, wallc);
|
||||
return Project(viewport, z1, z2, wallc);
|
||||
}
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void ProjectedWallTexcoords::Project(double walxrepeat, int x1, int x2, const FWallTmapVals &WallT)
|
||||
void ProjectedWallTexcoords::Project(RenderViewport *viewport, double walxrepeat, int x1, int x2, const FWallTmapVals &WallT)
|
||||
{
|
||||
auto viewport = RenderViewport::Instance();
|
||||
|
||||
float uOverZ = WallT.UoverZorg + WallT.UoverZstep * (float)(x1 + 0.5 - viewport->CenterX);
|
||||
float invZ = WallT.InvZorg + WallT.InvZstep * (float)(x1 + 0.5 - viewport->CenterX);
|
||||
float uGradient = WallT.UoverZstep;
|
||||
|
@ -191,10 +187,8 @@ namespace swrenderer
|
|||
}
|
||||
}
|
||||
|
||||
void ProjectedWallTexcoords::ProjectPos(double walxrepeat, int x1, int x2, const FWallTmapVals &WallT)
|
||||
void ProjectedWallTexcoords::ProjectPos(RenderViewport *viewport, double walxrepeat, int x1, int x2, const FWallTmapVals &WallT)
|
||||
{
|
||||
auto viewport = RenderViewport::Instance();
|
||||
|
||||
float uOverZ = WallT.UoverZorg + WallT.UoverZstep * (float)(x1 + 0.5 - viewport->CenterX);
|
||||
float invZ = WallT.InvZorg + WallT.InvZstep * (float)(x1 + 0.5 - viewport->CenterX);
|
||||
float uGradient = WallT.UoverZstep;
|
||||
|
|
|
@ -20,9 +20,9 @@ namespace swrenderer
|
|||
public:
|
||||
short ScreenY[MAXWIDTH];
|
||||
|
||||
ProjectedWallCull Project(double z1, double z2, const FWallCoords *wallc);
|
||||
ProjectedWallCull Project(const secplane_t &plane, const FWallCoords *wallc, seg_t *line, bool xflip);
|
||||
ProjectedWallCull Project(double z, const FWallCoords *wallc);
|
||||
ProjectedWallCull Project(RenderViewport *viewport, double z1, double z2, const FWallCoords *wallc);
|
||||
ProjectedWallCull Project(RenderViewport *viewport, const secplane_t &plane, const FWallCoords *wallc, seg_t *line, bool xflip);
|
||||
ProjectedWallCull Project(RenderViewport *viewport, double z, const FWallCoords *wallc);
|
||||
};
|
||||
|
||||
class ProjectedWallTexcoords
|
||||
|
@ -31,7 +31,7 @@ namespace swrenderer
|
|||
float VStep[MAXWIDTH]; // swall
|
||||
fixed_t UPos[MAXWIDTH]; // lwall
|
||||
|
||||
void Project(double walxrepeat, int x1, int x2, const FWallTmapVals &WallT);
|
||||
void ProjectPos(double walxrepeat, int x1, int x2, const FWallTmapVals &WallT);
|
||||
void Project(RenderViewport *viewport, double walxrepeat, int x1, int x2, const FWallTmapVals &WallT);
|
||||
void ProjectPos(RenderViewport *viewport, double walxrepeat, int x1, int x2, const FWallTmapVals &WallT);
|
||||
};
|
||||
}
|
||||
|
|
|
@ -59,7 +59,7 @@ namespace swrenderer
|
|||
}
|
||||
|
||||
drawerargs.SetSolidColor(3);
|
||||
drawerargs.SetTexture(texture);
|
||||
drawerargs.SetTexture(Thread->Viewport.get(), texture);
|
||||
|
||||
double planeang = (pl->xform.Angle + pl->xform.baseAngle).Radians();
|
||||
double xstep, ystep, leftxfrac, leftyfrac, rightxfrac, rightyfrac;
|
||||
|
@ -68,22 +68,22 @@ namespace swrenderer
|
|||
if (planeang != 0)
|
||||
{
|
||||
double cosine = cos(planeang), sine = sin(planeang);
|
||||
pviewx = pl->xform.xOffs + r_viewpoint.Pos.X * cosine - r_viewpoint.Pos.Y * sine;
|
||||
pviewy = pl->xform.yOffs + pl->xform.baseyOffs - r_viewpoint.Pos.X * sine - r_viewpoint.Pos.Y * cosine;
|
||||
pviewx = pl->xform.xOffs + Thread->Viewport->viewpoint.Pos.X * cosine - Thread->Viewport->viewpoint.Pos.Y * sine;
|
||||
pviewy = pl->xform.yOffs + pl->xform.baseyOffs - Thread->Viewport->viewpoint.Pos.X * sine - Thread->Viewport->viewpoint.Pos.Y * cosine;
|
||||
}
|
||||
else
|
||||
{
|
||||
pviewx = pl->xform.xOffs + r_viewpoint.Pos.X;
|
||||
pviewy = pl->xform.yOffs - r_viewpoint.Pos.Y;
|
||||
pviewx = pl->xform.xOffs + Thread->Viewport->viewpoint.Pos.X;
|
||||
pviewy = pl->xform.yOffs - Thread->Viewport->viewpoint.Pos.Y;
|
||||
}
|
||||
|
||||
pviewx = _xscale * pviewx;
|
||||
pviewy = _yscale * pviewy;
|
||||
|
||||
// left to right mapping
|
||||
planeang += (r_viewpoint.Angles.Yaw - 90).Radians();
|
||||
planeang += (Thread->Viewport->viewpoint.Angles.Yaw - 90).Radians();
|
||||
|
||||
auto viewport = RenderViewport::Instance();
|
||||
auto viewport = Thread->Viewport.get();
|
||||
|
||||
// Scale will be unit scale at FocalLengthX (normally SCREENWIDTH/2) distance
|
||||
xstep = cos(planeang) / viewport->FocalLengthX;
|
||||
|
@ -113,7 +113,7 @@ namespace swrenderer
|
|||
|
||||
minx = pl->left;
|
||||
|
||||
planeheight = fabs(pl->height.Zat0() - r_viewpoint.Pos.Z);
|
||||
planeheight = fabs(pl->height.Zat0() - Thread->Viewport->viewpoint.Pos.Z);
|
||||
|
||||
basecolormap = colormap;
|
||||
|
||||
|
@ -155,7 +155,7 @@ namespace swrenderer
|
|||
}
|
||||
#endif
|
||||
|
||||
auto viewport = RenderViewport::Instance();
|
||||
auto viewport = Thread->Viewport.get();
|
||||
|
||||
double curxfrac = basexfrac + xstepscale * (x1 + 0.5 - minx);
|
||||
double curyfrac = baseyfrac + ystepscale * (x1 + 0.5 - minx);
|
||||
|
@ -231,12 +231,12 @@ namespace swrenderer
|
|||
cur_node = light_list;
|
||||
while (cur_node)
|
||||
{
|
||||
double lightX = cur_node->lightsource->X() - r_viewpoint.Pos.X;
|
||||
double lightY = cur_node->lightsource->Y() - r_viewpoint.Pos.Y;
|
||||
double lightZ = cur_node->lightsource->Z() - r_viewpoint.Pos.Z;
|
||||
double lightX = cur_node->lightsource->X() - Thread->Viewport->viewpoint.Pos.X;
|
||||
double lightY = cur_node->lightsource->Y() - Thread->Viewport->viewpoint.Pos.Y;
|
||||
double lightZ = cur_node->lightsource->Z() - Thread->Viewport->viewpoint.Pos.Z;
|
||||
|
||||
float lx = (float)(lightX * r_viewpoint.Sin - lightY * r_viewpoint.Cos);
|
||||
float ly = (float)(lightX * r_viewpoint.TanCos + lightY * r_viewpoint.TanSin) - drawerargs.dc_viewpos.Y;
|
||||
float lx = (float)(lightX * Thread->Viewport->viewpoint.Sin - lightY * Thread->Viewport->viewpoint.Cos);
|
||||
float ly = (float)(lightX * Thread->Viewport->viewpoint.TanCos + lightY * Thread->Viewport->viewpoint.TanSin) - drawerargs.dc_viewpos.Y;
|
||||
float lz = (float)lightZ - drawerargs.dc_viewpos.Z;
|
||||
|
||||
// Precalculate the constant part of the dot here so the drawer doesn't have to.
|
||||
|
@ -268,7 +268,7 @@ namespace swrenderer
|
|||
drawerargs.dc_num_lights = 0;
|
||||
}
|
||||
|
||||
drawerargs.SetDestY(y);
|
||||
drawerargs.SetDestY(viewport, y);
|
||||
drawerargs.SetDestX1(x1);
|
||||
drawerargs.SetDestX2(x2);
|
||||
|
||||
|
|
|
@ -70,7 +70,7 @@ namespace swrenderer
|
|||
}
|
||||
sky2tex = sky2texture;
|
||||
skymid = skytexturemid;
|
||||
skyangle = r_viewpoint.Angles.Yaw.BAMs();
|
||||
skyangle = Thread->Viewport->viewpoint.Angles.Yaw.BAMs();
|
||||
|
||||
if (pl->picnum == skyflatnum)
|
||||
{
|
||||
|
@ -169,7 +169,7 @@ namespace swrenderer
|
|||
void RenderSkyPlane::DrawSkyColumnStripe(int start_x, int y1, int y2, double scale, double texturemid, double yrepeat)
|
||||
{
|
||||
RenderPortal *renderportal = Thread->Portal.get();
|
||||
auto viewport = RenderViewport::Instance();
|
||||
auto viewport = Thread->Viewport.get();
|
||||
|
||||
uint32_t height = frontskytex->GetHeight();
|
||||
|
||||
|
@ -188,7 +188,7 @@ namespace swrenderer
|
|||
|
||||
if (r_linearsky)
|
||||
{
|
||||
angle_t xangle = (angle_t)((0.5 - x / (double)viewwidth) * r_viewwindow.FocalTangent * ANGLE_90);
|
||||
angle_t xangle = (angle_t)((0.5 - x / (double)viewwidth) * viewport->viewwindow.FocalTangent * ANGLE_90);
|
||||
ang = (skyangle + xangle) ^ skyflip;
|
||||
}
|
||||
else
|
||||
|
@ -198,11 +198,11 @@ namespace swrenderer
|
|||
angle1 = (uint32_t)((UMulScale16(ang, frontcyl) + frontpos) >> FRACBITS);
|
||||
angle2 = (uint32_t)((UMulScale16(ang, backcyl) + backpos) >> FRACBITS);
|
||||
|
||||
drawerargs.SetFrontTexture(frontskytex, angle1);
|
||||
drawerargs.SetBackTexture(backskytex, angle2);
|
||||
drawerargs.SetFrontTexture(viewport, frontskytex, angle1);
|
||||
drawerargs.SetBackTexture(viewport, backskytex, angle2);
|
||||
drawerargs.SetTextureVStep(uv_step);
|
||||
drawerargs.SetTextureVPos(uv_pos);
|
||||
drawerargs.SetDest(start_x, y1);
|
||||
drawerargs.SetDest(viewport, start_x, y1);
|
||||
drawerargs.SetCount(y2 - y1);
|
||||
drawerargs.SetFadeSky(r_skymode == 2 && !(level.flags & LEVEL_FORCETILEDSKY));
|
||||
drawerargs.SetSolidTop(frontskytex->GetSkyCapColor(false));
|
||||
|
@ -223,7 +223,7 @@ namespace swrenderer
|
|||
}
|
||||
else
|
||||
{
|
||||
auto viewport = RenderViewport::Instance();
|
||||
auto viewport = Thread->Viewport.get();
|
||||
double yrepeat = frontskytex->Scale.Y;
|
||||
double scale = frontskytex->Scale.Y * skyscale;
|
||||
double iscale = 1 / scale;
|
||||
|
|
|
@ -77,16 +77,16 @@ namespace swrenderer
|
|||
return;
|
||||
}
|
||||
|
||||
auto viewport = RenderViewport::Instance();
|
||||
auto viewport = Thread->Viewport.get();
|
||||
|
||||
drawerargs.SetSolidColor(3);
|
||||
drawerargs.SetTexture(texture);
|
||||
drawerargs.SetTexture(Thread->Viewport.get(), texture);
|
||||
|
||||
lxscale = _xscale * ifloatpow2[drawerargs.TextureWidthBits()];
|
||||
lyscale = _yscale * ifloatpow2[drawerargs.TextureHeightBits()];
|
||||
xscale = 64.f / lxscale;
|
||||
yscale = 64.f / lyscale;
|
||||
zeroheight = pl->height.ZatPoint(r_viewpoint.Pos);
|
||||
zeroheight = pl->height.ZatPoint(Thread->Viewport->viewpoint.Pos);
|
||||
|
||||
pviewx = xs_ToFixed(32 - drawerargs.TextureWidthBits(), pl->xform.xOffs * pl->xform.xScale);
|
||||
pviewy = xs_ToFixed(32 - drawerargs.TextureHeightBits(), pl->xform.yOffs * pl->xform.yScale);
|
||||
|
@ -95,11 +95,11 @@ namespace swrenderer
|
|||
// p is the texture origin in view space
|
||||
// Don't add in the offsets at this stage, because doing so can result in
|
||||
// errors if the flat is rotated.
|
||||
ang = M_PI * 3 / 2 - r_viewpoint.Angles.Yaw.Radians();
|
||||
ang = M_PI * 3 / 2 - Thread->Viewport->viewpoint.Angles.Yaw.Radians();
|
||||
cosine = cos(ang), sine = sin(ang);
|
||||
p[0] = r_viewpoint.Pos.X * cosine - r_viewpoint.Pos.Y * sine;
|
||||
p[2] = r_viewpoint.Pos.X * sine + r_viewpoint.Pos.Y * cosine;
|
||||
p[1] = pl->height.ZatPoint(0.0, 0.0) - r_viewpoint.Pos.Z;
|
||||
p[0] = Thread->Viewport->viewpoint.Pos.X * cosine - Thread->Viewport->viewpoint.Pos.Y * sine;
|
||||
p[2] = Thread->Viewport->viewpoint.Pos.X * sine + Thread->Viewport->viewpoint.Pos.Y * cosine;
|
||||
p[1] = pl->height.ZatPoint(0.0, 0.0) - Thread->Viewport->viewpoint.Pos.Z;
|
||||
|
||||
// m is the v direction vector in view space
|
||||
ang = ang - M_PI / 2 - planeang;
|
||||
|
@ -126,8 +126,8 @@ namespace swrenderer
|
|||
// how much you slope the surface. Use the commented-out code above instead to keep
|
||||
// the textures a constant size across the surface's plane instead.
|
||||
cosine = cos(planeang), sine = sin(planeang);
|
||||
m[1] = pl->height.ZatPoint(r_viewpoint.Pos.X + yscale * sine, r_viewpoint.Pos.Y + yscale * cosine) - zeroheight;
|
||||
n[1] = -(pl->height.ZatPoint(r_viewpoint.Pos.X - xscale * cosine, r_viewpoint.Pos.Y + xscale * sine) - zeroheight);
|
||||
m[1] = pl->height.ZatPoint(Thread->Viewport->viewpoint.Pos.X + yscale * sine, Thread->Viewport->viewpoint.Pos.Y + yscale * cosine) - zeroheight;
|
||||
n[1] = -(pl->height.ZatPoint(Thread->Viewport->viewpoint.Pos.X - xscale * cosine, Thread->Viewport->viewpoint.Pos.Y + xscale * sine) - zeroheight);
|
||||
|
||||
plane_su = p ^ m;
|
||||
plane_sv = p ^ n;
|
||||
|
@ -157,7 +157,7 @@ namespace swrenderer
|
|||
basecolormap = colormap;
|
||||
bool foggy = level.fadeto || basecolormap->Fade || (level.flags & LEVEL_HASFADETABLE);;
|
||||
|
||||
planelightfloat = (LightVisibility::Instance()->SlopePlaneGlobVis(foggy) * lxscale * lyscale) / (fabs(pl->height.ZatPoint(r_viewpoint.Pos) - r_viewpoint.Pos.Z)) / 65536.f;
|
||||
planelightfloat = (LightVisibility::Instance()->SlopePlaneGlobVis(foggy) * lxscale * lyscale) / (fabs(pl->height.ZatPoint(Thread->Viewport->viewpoint.Pos) - Thread->Viewport->viewpoint.Pos.Z)) / 65536.f;
|
||||
|
||||
if (pl->height.fC() > 0)
|
||||
planelightfloat = -planelightfloat;
|
||||
|
|
|
@ -191,7 +191,7 @@ namespace swrenderer
|
|||
renderportal->CurrentPortalUniq == check->CurrentPortalUniq &&
|
||||
renderportal->MirrorFlags == check->MirrorFlags &&
|
||||
Thread->Clip3D->CurrentSkybox == check->CurrentSkybox &&
|
||||
r_viewpoint.Pos == check->viewpos
|
||||
Thread->Viewport->viewpoint.Pos == check->viewpos
|
||||
)
|
||||
{
|
||||
return check;
|
||||
|
@ -350,8 +350,8 @@ namespace swrenderer
|
|||
VisiblePlane *pl;
|
||||
int i;
|
||||
|
||||
DVector3 oViewPos = r_viewpoint.Pos;
|
||||
DAngle oViewAngle = r_viewpoint.Angles.Yaw;
|
||||
DVector3 oViewPos = Thread->Viewport->viewpoint.Pos;
|
||||
DAngle oViewAngle = Thread->Viewport->viewpoint.Angles.Yaw;
|
||||
|
||||
RenderPortal *renderportal = Thread->Portal.get();
|
||||
|
||||
|
@ -364,15 +364,15 @@ namespace swrenderer
|
|||
|
||||
if (pl->sky < 0 && pl->height.Zat0() == height)
|
||||
{
|
||||
r_viewpoint.Pos = pl->viewpos;
|
||||
r_viewpoint.Angles.Yaw = pl->viewangle;
|
||||
Thread->Viewport->viewpoint.Pos = pl->viewpos;
|
||||
Thread->Viewport->viewpoint.Angles.Yaw = pl->viewangle;
|
||||
renderportal->MirrorFlags = pl->MirrorFlags;
|
||||
|
||||
pl->Render(Thread, pl->sky & 0x7FFFFFFF, pl->Additive, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
r_viewpoint.Pos = oViewPos;
|
||||
r_viewpoint.Angles.Yaw = oViewAngle;
|
||||
Thread->Viewport->viewpoint.Pos = oViewPos;
|
||||
Thread->Viewport->viewpoint.Angles.Yaw = oViewAngle;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -61,6 +61,7 @@ namespace swrenderer
|
|||
Scene = scene;
|
||||
MainThread = mainThread;
|
||||
FrameMemory = std::make_unique<RenderMemory>();
|
||||
Viewport = std::make_unique<RenderViewport>();
|
||||
DrawQueue = std::make_shared<DrawerCommandQueue>(this);
|
||||
OpaquePass = std::make_unique<RenderOpaquePass>(this);
|
||||
TranslucentPass = std::make_unique<RenderTranslucentPass>(this);
|
||||
|
@ -79,9 +80,9 @@ namespace swrenderer
|
|||
{
|
||||
}
|
||||
|
||||
SWPixelFormatDrawers *RenderThread::Drawers()
|
||||
SWPixelFormatDrawers *RenderThread::Drawers(RenderViewport *viewport)
|
||||
{
|
||||
if (RenderViewport::Instance()->RenderTarget->IsBgra())
|
||||
if (viewport->RenderTarget->IsBgra())
|
||||
return tc_drawers.get();
|
||||
else
|
||||
return pal_drawers.get();
|
||||
|
|
|
@ -36,11 +36,13 @@ namespace swrenderer
|
|||
class RenderTranslucentPass;
|
||||
class RenderPlayerSprites;
|
||||
class RenderScene;
|
||||
class RenderViewport;
|
||||
class Clip3DFloors;
|
||||
class VisiblePlaneList;
|
||||
class DrawSegmentList;
|
||||
class RenderClipSegment;
|
||||
class RenderMemory;
|
||||
class RenderViewport;
|
||||
class SWPixelFormatDrawers;
|
||||
class SWTruecolorDrawers;
|
||||
class SWPalDrawers;
|
||||
|
@ -66,6 +68,7 @@ namespace swrenderer
|
|||
std::unique_ptr<VisiblePlaneList> PlaneList;
|
||||
std::unique_ptr<DrawSegmentList> DrawSegments;
|
||||
std::unique_ptr<RenderClipSegment> ClipSegments;
|
||||
std::unique_ptr<RenderViewport> Viewport;
|
||||
DrawerCommandQueuePtr DrawQueue;
|
||||
|
||||
std::thread thread;
|
||||
|
@ -74,7 +77,7 @@ namespace swrenderer
|
|||
short clipbot[MAXWIDTH];
|
||||
short cliptop[MAXWIDTH];
|
||||
|
||||
SWPixelFormatDrawers *Drawers();
|
||||
SWPixelFormatDrawers *Drawers(RenderViewport *viewport);
|
||||
|
||||
private:
|
||||
std::unique_ptr<SWTruecolorDrawers> tc_drawers;
|
||||
|
|
|
@ -52,7 +52,10 @@ void SWCanvas::DrawTexture(DCanvas *canvas, FTexture *img, DrawParms &parms)
|
|||
{
|
||||
static short bottomclipper[MAXWIDTH], topclipper[MAXWIDTH];
|
||||
|
||||
auto viewport = RenderViewport::Instance();
|
||||
static RenderThread thread(nullptr);
|
||||
thread.DrawQueue->ThreadedRender = false;
|
||||
|
||||
auto viewport = thread.Viewport.get();
|
||||
viewport->RenderTarget = canvas;
|
||||
viewport->RenderTarget->Lock(true);
|
||||
|
||||
|
@ -100,7 +103,7 @@ void SWCanvas::DrawTexture(DCanvas *canvas, FTexture *img, DrawParms &parms)
|
|||
|
||||
drawerargs.SetTranslationMap(translation);
|
||||
drawerargs.SetLight(basecolormap, 0.0f, shade);
|
||||
bool visible = drawerargs.SetStyle(parms.style, parms.Alpha, -1, parms.fillcolor, basecolormap);
|
||||
bool visible = drawerargs.SetStyle(viewport, parms.style, parms.Alpha, -1, parms.fillcolor, basecolormap);
|
||||
|
||||
double x0 = parms.x - parms.left * parms.destwidth / parms.texwidth;
|
||||
double y0 = parms.y - parms.top * parms.destheight / parms.texheight;
|
||||
|
@ -184,8 +187,6 @@ void SWCanvas::DrawTexture(DCanvas *canvas, FTexture *img, DrawParms &parms)
|
|||
int x2_i = int(x2);
|
||||
fixed_t xiscale_i = FLOAT2FIXED(xiscale);
|
||||
|
||||
static RenderThread thread(nullptr);
|
||||
thread.DrawQueue->ThreadedRender = false;
|
||||
while (x < x2_i)
|
||||
{
|
||||
drawerargs.DrawMaskedColumn(&thread, x, iscale, img, frac, spryscale, sprtopscreen, sprflipvert, mfloorclip, mceilingclip, !parms.masked);
|
||||
|
@ -256,7 +257,10 @@ void SWCanvas::FillSimplePoly(DCanvas *canvas, FTexture *tex, FVector2 *points,
|
|||
return;
|
||||
}
|
||||
|
||||
auto viewport = RenderViewport::Instance();
|
||||
static RenderThread thread(nullptr);
|
||||
thread.DrawQueue->ThreadedRender = false;
|
||||
|
||||
auto viewport = thread.Viewport.get();
|
||||
viewport->RenderTarget = canvas;
|
||||
|
||||
viewport->RenderTarget->Lock(true);
|
||||
|
@ -270,7 +274,7 @@ void SWCanvas::FillSimplePoly(DCanvas *canvas, FTexture *tex, FVector2 *points,
|
|||
|
||||
// Setup constant texture mapping parameters.
|
||||
SpanDrawerArgs drawerargs;
|
||||
drawerargs.SetTexture(tex);
|
||||
drawerargs.SetTexture(viewport, tex);
|
||||
if (colormap)
|
||||
drawerargs.SetLight(colormap, 0, clamp(shade >> FRACBITS, 0, NUMCOLORMAPS - 1));
|
||||
else
|
||||
|
@ -330,9 +334,6 @@ void SWCanvas::FillSimplePoly(DCanvas *canvas, FTexture *tex, FVector2 *points,
|
|||
pt2++; if (pt2 > npoints) pt2 = 0;
|
||||
} while (pt1 != botpt);
|
||||
|
||||
static RenderThread thread(nullptr);
|
||||
thread.DrawQueue->ThreadedRender = false;
|
||||
|
||||
// Travel down the left edge and fill it in.
|
||||
pt1 = toppt;
|
||||
pt2 = toppt - 1; if (pt2 < 0) pt2 = npoints;
|
||||
|
@ -364,7 +365,7 @@ void SWCanvas::FillSimplePoly(DCanvas *canvas, FTexture *tex, FVector2 *points,
|
|||
#if 0
|
||||
memset(this->Buffer + y * this->Pitch + x1, (int)tex, x2 - x1);
|
||||
#else
|
||||
drawerargs.SetDestY(y);
|
||||
drawerargs.SetDestY(viewport, y);
|
||||
drawerargs.SetDestX1(x1);
|
||||
drawerargs.SetDestX2(x2 - 1);
|
||||
|
||||
|
|
|
@ -175,9 +175,21 @@ void FSoftwareRenderer::Precache(uint8_t *texhitlist, TMap<PClassActor*, bool> &
|
|||
void FSoftwareRenderer::RenderView(player_t *player)
|
||||
{
|
||||
if (r_polyrenderer)
|
||||
{
|
||||
PolyRenderer::Instance()->Thread.Viewport->viewpoint = r_viewpoint;
|
||||
PolyRenderer::Instance()->Thread.Viewport->viewwindow = r_viewwindow;
|
||||
PolyRenderer::Instance()->RenderView(player);
|
||||
r_viewpoint = PolyRenderer::Instance()->Thread.Viewport->viewpoint;
|
||||
r_viewwindow = PolyRenderer::Instance()->Thread.Viewport->viewwindow;
|
||||
}
|
||||
else
|
||||
{
|
||||
mScene.MainThread()->Viewport->viewpoint = r_viewpoint;
|
||||
mScene.MainThread()->Viewport->viewwindow = r_viewwindow;
|
||||
mScene.RenderView(player);
|
||||
r_viewpoint = mScene.MainThread()->Viewport->viewpoint;
|
||||
r_viewwindow = mScene.MainThread()->Viewport->viewwindow;
|
||||
}
|
||||
|
||||
FCanvasTextureInfo::UpdateAll();
|
||||
}
|
||||
|
@ -200,9 +212,21 @@ void FSoftwareRenderer::WriteSavePic (player_t *player, FileWriter *file, int wi
|
|||
pic->ObjectFlags |= OF_Fixed;
|
||||
pic->Lock ();
|
||||
if (r_polyrenderer)
|
||||
{
|
||||
PolyRenderer::Instance()->Thread.Viewport->viewpoint = r_viewpoint;
|
||||
PolyRenderer::Instance()->Thread.Viewport->viewwindow = r_viewwindow;
|
||||
PolyRenderer::Instance()->RenderViewToCanvas(player->mo, pic, 0, 0, width, height, true);
|
||||
r_viewpoint = PolyRenderer::Instance()->Thread.Viewport->viewpoint;
|
||||
r_viewwindow = PolyRenderer::Instance()->Thread.Viewport->viewwindow;
|
||||
}
|
||||
else
|
||||
mScene.RenderViewToCanvas (player->mo, pic, 0, 0, width, height);
|
||||
{
|
||||
mScene.MainThread()->Viewport->viewpoint = r_viewpoint;
|
||||
mScene.MainThread()->Viewport->viewwindow = r_viewwindow;
|
||||
mScene.RenderViewToCanvas(player->mo, pic, 0, 0, width, height);
|
||||
r_viewpoint = mScene.MainThread()->Viewport->viewpoint;
|
||||
r_viewwindow = mScene.MainThread()->Viewport->viewwindow;
|
||||
}
|
||||
screen->GetFlashedPalette (palette);
|
||||
M_CreatePNG (file, pic->GetBuffer(), palette, SS_PAL, width, height, pic->GetPitch());
|
||||
pic->Unlock ();
|
||||
|
@ -215,11 +239,19 @@ void FSoftwareRenderer::DrawRemainingPlayerSprites()
|
|||
{
|
||||
if (!r_polyrenderer)
|
||||
{
|
||||
mScene.MainThread()->Viewport->viewpoint = r_viewpoint;
|
||||
mScene.MainThread()->Viewport->viewwindow = r_viewwindow;
|
||||
mScene.MainThread()->PlayerSprites->RenderRemaining();
|
||||
r_viewpoint = mScene.MainThread()->Viewport->viewpoint;
|
||||
r_viewwindow = mScene.MainThread()->Viewport->viewwindow;
|
||||
}
|
||||
else
|
||||
{
|
||||
PolyRenderer::Instance()->Thread.Viewport->viewpoint = r_viewpoint;
|
||||
PolyRenderer::Instance()->Thread.Viewport->viewwindow = r_viewwindow;
|
||||
PolyRenderer::Instance()->RenderRemainingPlayerSprites();
|
||||
r_viewpoint = PolyRenderer::Instance()->Thread.Viewport->viewpoint;
|
||||
r_viewwindow = PolyRenderer::Instance()->Thread.Viewport->viewwindow;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -247,7 +279,11 @@ void FSoftwareRenderer::SetClearColor(int color)
|
|||
|
||||
void FSoftwareRenderer::RenderTextureView (FCanvasTexture *tex, AActor *viewpoint, int fov)
|
||||
{
|
||||
auto viewport = RenderViewport::Instance();
|
||||
auto viewport = r_polyrenderer ? PolyRenderer::Instance()->Thread.Viewport.get() : mScene.MainThread()->Viewport.get();
|
||||
|
||||
// Grab global state shared with rest of zdoom
|
||||
viewport->viewpoint = r_viewpoint;
|
||||
viewport->viewwindow = r_viewwindow;
|
||||
|
||||
uint8_t *Pixels = viewport->RenderTarget->IsBgra() ? (uint8_t*)tex->GetPixelsBgra() : (uint8_t*)tex->GetPixels();
|
||||
DSimpleCanvas *Canvas = viewport->RenderTarget->IsBgra() ? tex->GetCanvasBgra() : tex->GetCanvas();
|
||||
|
@ -256,15 +292,15 @@ void FSoftwareRenderer::RenderTextureView (FCanvasTexture *tex, AActor *viewpoin
|
|||
// These get clobbered by rendering to a camera texture but they need to be preserved so the final rendering can be done with the correct palette.
|
||||
CameraLight savedCameraLight = *CameraLight::Instance();
|
||||
|
||||
DAngle savedfov = r_viewpoint.FieldOfView;
|
||||
R_SetFOV (r_viewpoint, (double)fov);
|
||||
DAngle savedfov = viewport->viewpoint.FieldOfView;
|
||||
R_SetFOV (viewport->viewpoint, (double)fov);
|
||||
|
||||
if (r_polyrenderer)
|
||||
PolyRenderer::Instance()->RenderViewToCanvas(viewpoint, Canvas, 0, 0, tex->GetWidth(), tex->GetHeight(), tex->bFirstUpdate);
|
||||
else
|
||||
mScene.RenderViewToCanvas(viewpoint, Canvas, 0, 0, tex->GetWidth(), tex->GetHeight(), tex->bFirstUpdate);
|
||||
|
||||
R_SetFOV (r_viewpoint, savedfov);
|
||||
R_SetFOV (viewport->viewpoint, savedfov);
|
||||
|
||||
if (Canvas->IsBgra())
|
||||
{
|
||||
|
@ -315,6 +351,10 @@ void FSoftwareRenderer::RenderTextureView (FCanvasTexture *tex, AActor *viewpoin
|
|||
tex->SetUpdated();
|
||||
|
||||
*CameraLight::Instance() = savedCameraLight;
|
||||
|
||||
// Sync state back to zdoom
|
||||
r_viewpoint = viewport->viewpoint;
|
||||
r_viewwindow = viewport->viewwindow;
|
||||
}
|
||||
|
||||
sector_t *FSoftwareRenderer::FakeFlat(sector_t *sec, sector_t *tempsec, int *floorlightlevel, int *ceilinglightlevel)
|
||||
|
@ -336,3 +376,13 @@ void FSoftwareRenderer::CleanLevelData()
|
|||
{
|
||||
gl_CleanLevelData();
|
||||
}
|
||||
|
||||
double FSoftwareRenderer::GetVisibility()
|
||||
{
|
||||
return LightVisibility::Instance()->GetVisibility();
|
||||
}
|
||||
|
||||
void FSoftwareRenderer::SetVisibility(double vis)
|
||||
{
|
||||
LightVisibility::Instance()->SetVisibility(mScene.MainThread()->Viewport.get(), vis);
|
||||
}
|
||||
|
|
|
@ -40,6 +40,9 @@ struct FSoftwareRenderer : public FRenderer
|
|||
void PreprocessLevel() override;
|
||||
void CleanLevelData() override;
|
||||
|
||||
double GetVisibility() override;
|
||||
void SetVisibility(double vis) override;
|
||||
|
||||
private:
|
||||
void PrecacheTexture(FTexture *tex, int cache);
|
||||
|
||||
|
|
|
@ -68,7 +68,7 @@ namespace swrenderer
|
|||
HeightLevel *near;
|
||||
HeightLevel *curr;
|
||||
|
||||
double height = add->ZatPoint(r_viewpoint.Pos);
|
||||
double height = add->ZatPoint(Thread->Viewport->viewpoint.Pos);
|
||||
if (height >= sec->CenterCeiling()) return;
|
||||
if (height <= sec->CenterFloor()) return;
|
||||
|
||||
|
|
|
@ -45,9 +45,9 @@ namespace swrenderer
|
|||
return &instance;
|
||||
}
|
||||
|
||||
void CameraLight::SetCamera(AActor *actor)
|
||||
void CameraLight::SetCamera(RenderViewport *viewport, AActor *actor)
|
||||
{
|
||||
AActor *camera = r_viewpoint.camera;
|
||||
AActor *camera = viewport->viewpoint.camera;
|
||||
player_t *player = actor->player;
|
||||
if (camera && camera->player != nullptr)
|
||||
player = camera->player;
|
||||
|
@ -61,7 +61,6 @@ namespace swrenderer
|
|||
if (player->fixedcolormap >= 0 && player->fixedcolormap < (int)SpecialColormaps.Size())
|
||||
{
|
||||
realfixedcolormap = &SpecialColormaps[player->fixedcolormap];
|
||||
auto viewport = RenderViewport::Instance();
|
||||
if (viewport->RenderTarget == screen && (viewport->RenderTarget->IsBgra() || ((DFrameBuffer *)screen->Accel2D && r_shadercolormaps)))
|
||||
{
|
||||
// Render everything fullbright. The copy to video memory will
|
||||
|
@ -85,10 +84,10 @@ namespace swrenderer
|
|||
}
|
||||
}
|
||||
// [RH] Inverse light for shooting the Sigil
|
||||
if (fixedcolormap == nullptr && r_viewpoint.extralight == INT_MIN)
|
||||
if (fixedcolormap == nullptr && viewport->viewpoint.extralight == INT_MIN)
|
||||
{
|
||||
fixedcolormap = &SpecialColormaps[INVERSECOLORMAP];
|
||||
r_viewpoint.extralight = 0;
|
||||
viewport->viewpoint.extralight = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -101,15 +100,14 @@ namespace swrenderer
|
|||
}
|
||||
|
||||
// Changes how rapidly things get dark with distance
|
||||
void LightVisibility::SetVisibility(double vis)
|
||||
void LightVisibility::SetVisibility(RenderViewport *viewport, double vis)
|
||||
{
|
||||
// Allow negative visibilities, just for novelty's sake
|
||||
vis = clamp(vis, -204.7, 204.7); // (205 and larger do not work in 5:4 aspect ratio)
|
||||
|
||||
CurrentVisibility = vis;
|
||||
|
||||
auto viewport = RenderViewport::Instance();
|
||||
if (r_viewwindow.FocalTangent == 0 || viewport->FocalLengthY == 0)
|
||||
if (viewport->viewwindow.FocalTangent == 0 || viewport->FocalLengthY == 0)
|
||||
{ // If r_visibility is called before the renderer is all set up, don't
|
||||
// divide by zero. This will be called again later, and the proper
|
||||
// values can be initialized then.
|
||||
|
@ -118,7 +116,7 @@ namespace swrenderer
|
|||
|
||||
BaseVisibility = vis;
|
||||
|
||||
MaxVisForWall = (viewport->InvZtoScale * (SCREENWIDTH*r_Yaspect) / (viewwidth*SCREENHEIGHT * r_viewwindow.FocalTangent));
|
||||
MaxVisForWall = (viewport->InvZtoScale * (SCREENWIDTH*r_Yaspect) / (viewwidth*SCREENHEIGHT * viewport->viewwindow.FocalTangent));
|
||||
MaxVisForWall = 32767.0 / MaxVisForWall;
|
||||
MaxVisForFloor = 32767.0 / (viewheight >> 2) * viewport->FocalLengthY / 160;
|
||||
|
||||
|
@ -130,8 +128,8 @@ namespace swrenderer
|
|||
else
|
||||
WallVisibility = BaseVisibility;
|
||||
|
||||
WallVisibility = (viewport->InvZtoScale * SCREENWIDTH*AspectBaseHeight(r_viewwindow.WidescreenRatio) /
|
||||
(viewwidth*SCREENHEIGHT * 3)) * (WallVisibility * r_viewwindow.FocalTangent);
|
||||
WallVisibility = (viewport->InvZtoScale * SCREENWIDTH*AspectBaseHeight(viewport->viewwindow.WidescreenRatio) /
|
||||
(viewwidth*SCREENHEIGHT * 3)) * (WallVisibility * viewport->viewwindow.FocalTangent);
|
||||
|
||||
// Prevent overflow on floors/ceilings. Note that the calculation of
|
||||
// MaxVisForFloor means that planes less than two units from the player's
|
||||
|
@ -146,7 +144,7 @@ namespace swrenderer
|
|||
|
||||
FloorVisibility = 160.0 * FloorVisibility / viewport->FocalLengthY;
|
||||
|
||||
TiltVisibility = float(vis * r_viewwindow.FocalTangent * (16.f * 320.f) / viewwidth);
|
||||
TiltVisibility = float(vis * viewport->viewwindow.FocalTangent * (16.f * 320.f) / viewwidth);
|
||||
|
||||
NoLightFade = glset.nolightfade;
|
||||
}
|
||||
|
@ -174,11 +172,11 @@ namespace swrenderer
|
|||
{
|
||||
if (argv.argc() < 2)
|
||||
{
|
||||
Printf("Visibility is %g\n", LightVisibility::Instance()->GetVisibility());
|
||||
Printf("Visibility is %g\n", Renderer->GetVisibility());
|
||||
}
|
||||
else if (!netgame)
|
||||
{
|
||||
LightVisibility::Instance()->SetVisibility(atof(argv[1]));
|
||||
Renderer->SetVisibility(atof(argv[1]));
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
@ -57,7 +57,7 @@ namespace swrenderer
|
|||
|
||||
fixed_t FixedLightLevelShade() const { return (FixedLightLevel() >> COLORMAPSHIFT) << FRACBITS; }
|
||||
|
||||
void SetCamera(AActor *actor);
|
||||
void SetCamera(RenderViewport *viewport, AActor *actor);
|
||||
void ClearShaderColormap() { realfixedcolormap = nullptr; }
|
||||
|
||||
private:
|
||||
|
@ -71,7 +71,7 @@ namespace swrenderer
|
|||
public:
|
||||
static LightVisibility *Instance();
|
||||
|
||||
void SetVisibility(double visibility);
|
||||
void SetVisibility(RenderViewport *viewport, double visibility);
|
||||
double GetVisibility() const { return CurrentVisibility; }
|
||||
|
||||
double WallGlobVis(bool foggy) const { return (NoLightFade && !foggy) ? 0.0f : WallVisibility; }
|
||||
|
@ -84,10 +84,10 @@ namespace swrenderer
|
|||
double WallVis(double screenZ, bool foggy) const { return WallGlobVis(foggy) / screenZ; }
|
||||
double SpriteVis(double screenZ, bool foggy) const { return SpriteGlobVis(foggy) / screenZ; }
|
||||
double ParticleVis(double screenZ, bool foggy) const { return ParticleGlobVis(foggy) / screenZ; }
|
||||
double FlatPlaneVis(int screenY, double planeZ, bool foggy) const { return FlatPlaneGlobVis(foggy) / fabs(planeZ - r_viewpoint.Pos.Z) * fabs(RenderViewport::Instance()->CenterY - screenY); }
|
||||
double FlatPlaneVis(int screenY, double planeZ, bool foggy, RenderViewport *viewport) const { return FlatPlaneGlobVis(foggy) / fabs(planeZ - viewport->viewpoint.Pos.Z) * fabs(viewport->CenterY - screenY); }
|
||||
|
||||
static fixed_t LightLevelToShade(int lightlevel, bool foggy);
|
||||
static int ActualExtraLight(bool fog) { return fog ? 0 : r_viewpoint.extralight << 4; }
|
||||
static int ActualExtraLight(bool fog, RenderViewport *viewport) { return fog ? 0 : viewport->viewpoint.extralight << 4; }
|
||||
|
||||
private:
|
||||
double BaseVisibility = 0.0;
|
||||
|
|
|
@ -98,9 +98,9 @@ namespace swrenderer
|
|||
const sector_t *s = sec->GetHeightSec();
|
||||
if (s != nullptr)
|
||||
{
|
||||
sector_t *heightsec = r_viewpoint.sector->heightsec;
|
||||
sector_t *heightsec = Thread->Viewport->viewpoint.sector->heightsec;
|
||||
bool underwater = r_fakingunderwater ||
|
||||
(heightsec && heightsec->floorplane.PointOnSide(r_viewpoint.Pos) <= 0);
|
||||
(heightsec && heightsec->floorplane.PointOnSide(Thread->Viewport->viewpoint.Pos) <= 0);
|
||||
bool doorunderwater = false;
|
||||
int diffTex = (s->MoreFlags & SECF_CLIPFAKEPLANES);
|
||||
|
||||
|
@ -159,8 +159,8 @@ namespace swrenderer
|
|||
}
|
||||
}
|
||||
|
||||
double refceilz = s->ceilingplane.ZatPoint(r_viewpoint.Pos);
|
||||
double orgceilz = sec->ceilingplane.ZatPoint(r_viewpoint.Pos);
|
||||
double refceilz = s->ceilingplane.ZatPoint(Thread->Viewport->viewpoint.Pos);
|
||||
double orgceilz = sec->ceilingplane.ZatPoint(Thread->Viewport->viewpoint.Pos);
|
||||
|
||||
#if 1
|
||||
// [RH] Allow viewing underwater areas through doors/windows that
|
||||
|
@ -234,7 +234,7 @@ namespace swrenderer
|
|||
}
|
||||
FakeSide = WaterFakeSide::BelowFloor;
|
||||
}
|
||||
else if (heightsec && heightsec->ceilingplane.PointOnSide(r_viewpoint.Pos) <= 0 &&
|
||||
else if (heightsec && heightsec->ceilingplane.PointOnSide(Thread->Viewport->viewpoint.Pos) <= 0 &&
|
||||
orgceilz > refceilz && !(s->MoreFlags & SECF_FAKEFLOORONLY))
|
||||
{ // Above-ceiling hack
|
||||
tempsec->ceilingplane = s->ceilingplane;
|
||||
|
@ -307,16 +307,16 @@ namespace swrenderer
|
|||
|
||||
// Find the corners of the box
|
||||
// that define the edges from current viewpoint.
|
||||
if (r_viewpoint.Pos.X <= bspcoord[BOXLEFT])
|
||||
if (Thread->Viewport->viewpoint.Pos.X <= bspcoord[BOXLEFT])
|
||||
boxx = 0;
|
||||
else if (r_viewpoint.Pos.X < bspcoord[BOXRIGHT])
|
||||
else if (Thread->Viewport->viewpoint.Pos.X < bspcoord[BOXRIGHT])
|
||||
boxx = 1;
|
||||
else
|
||||
boxx = 2;
|
||||
|
||||
if (r_viewpoint.Pos.Y >= bspcoord[BOXTOP])
|
||||
if (Thread->Viewport->viewpoint.Pos.Y >= bspcoord[BOXTOP])
|
||||
boxy = 0;
|
||||
else if (r_viewpoint.Pos.Y > bspcoord[BOXBOTTOM])
|
||||
else if (Thread->Viewport->viewpoint.Pos.Y > bspcoord[BOXBOTTOM])
|
||||
boxy = 1;
|
||||
else
|
||||
boxy = 2;
|
||||
|
@ -325,10 +325,10 @@ namespace swrenderer
|
|||
if (boxpos == 5)
|
||||
return true;
|
||||
|
||||
x1 = bspcoord[checkcoord[boxpos][0]] - r_viewpoint.Pos.X;
|
||||
y1 = bspcoord[checkcoord[boxpos][1]] - r_viewpoint.Pos.Y;
|
||||
x2 = bspcoord[checkcoord[boxpos][2]] - r_viewpoint.Pos.X;
|
||||
y2 = bspcoord[checkcoord[boxpos][3]] - r_viewpoint.Pos.Y;
|
||||
x1 = bspcoord[checkcoord[boxpos][0]] - Thread->Viewport->viewpoint.Pos.X;
|
||||
y1 = bspcoord[checkcoord[boxpos][1]] - Thread->Viewport->viewpoint.Pos.Y;
|
||||
x2 = bspcoord[checkcoord[boxpos][2]] - Thread->Viewport->viewpoint.Pos.X;
|
||||
y2 = bspcoord[checkcoord[boxpos][3]] - Thread->Viewport->viewpoint.Pos.Y;
|
||||
|
||||
// check clip list for an open space
|
||||
|
||||
|
@ -336,10 +336,10 @@ namespace swrenderer
|
|||
if (y1 * (x1 - x2) + x1 * (y2 - y1) >= -EQUAL_EPSILON)
|
||||
return true;
|
||||
|
||||
rx1 = x1 * r_viewpoint.Sin - y1 * r_viewpoint.Cos;
|
||||
rx2 = x2 * r_viewpoint.Sin - y2 * r_viewpoint.Cos;
|
||||
ry1 = x1 * r_viewpoint.TanCos + y1 * r_viewpoint.TanSin;
|
||||
ry2 = x2 * r_viewpoint.TanCos + y2 * r_viewpoint.TanSin;
|
||||
rx1 = x1 * Thread->Viewport->viewpoint.Sin - y1 * Thread->Viewport->viewpoint.Cos;
|
||||
rx2 = x2 * Thread->Viewport->viewpoint.Sin - y2 * Thread->Viewport->viewpoint.Cos;
|
||||
ry1 = x1 * Thread->Viewport->viewpoint.TanCos + y1 * Thread->Viewport->viewpoint.TanSin;
|
||||
ry2 = x2 * Thread->Viewport->viewpoint.TanCos + y2 * Thread->Viewport->viewpoint.TanSin;
|
||||
|
||||
if (Thread->Portal->MirrorFlags & RF_XFLIP)
|
||||
{
|
||||
|
@ -349,7 +349,7 @@ namespace swrenderer
|
|||
swapvalues(ry1, ry2);
|
||||
}
|
||||
|
||||
auto viewport = RenderViewport::Instance();
|
||||
auto viewport = Thread->Viewport.get();
|
||||
|
||||
if (rx1 >= -ry1)
|
||||
{
|
||||
|
@ -501,7 +501,7 @@ namespace swrenderer
|
|||
|
||||
portal = frontsector->ValidatePortal(sector_t::ceiling);
|
||||
|
||||
VisiblePlane *ceilingplane = frontsector->ceilingplane.PointOnSide(r_viewpoint.Pos) > 0 ||
|
||||
VisiblePlane *ceilingplane = frontsector->ceilingplane.PointOnSide(Thread->Viewport->viewpoint.Pos) > 0 ||
|
||||
frontsector->GetTexture(sector_t::ceiling) == skyflatnum ||
|
||||
portal != nullptr ||
|
||||
(frontsector->heightsec &&
|
||||
|
@ -509,7 +509,7 @@ namespace swrenderer
|
|||
frontsector->heightsec->GetTexture(sector_t::floor) == skyflatnum) ?
|
||||
Thread->PlaneList->FindPlane(frontsector->ceilingplane, // killough 3/8/98
|
||||
frontsector->GetTexture(sector_t::ceiling),
|
||||
ceilinglightlevel + LightVisibility::ActualExtraLight(foggy), // killough 4/11/98
|
||||
ceilinglightlevel + LightVisibility::ActualExtraLight(foggy, Thread->Viewport.get()), // killough 4/11/98
|
||||
frontsector->GetAlpha(sector_t::ceiling),
|
||||
!!(frontsector->GetFlags(sector_t::ceiling) & PLANEF_ADDITIVE),
|
||||
frontsector->planes[sector_t::ceiling].xform,
|
||||
|
@ -542,7 +542,7 @@ namespace swrenderer
|
|||
// killough 10/98: add support for skies transferred from sidedefs
|
||||
portal = frontsector->ValidatePortal(sector_t::floor);
|
||||
|
||||
VisiblePlane *floorplane = frontsector->floorplane.PointOnSide(r_viewpoint.Pos) > 0 || // killough 3/7/98
|
||||
VisiblePlane *floorplane = frontsector->floorplane.PointOnSide(Thread->Viewport->viewpoint.Pos) > 0 || // killough 3/7/98
|
||||
frontsector->GetTexture(sector_t::floor) == skyflatnum ||
|
||||
portal != nullptr ||
|
||||
(frontsector->heightsec &&
|
||||
|
@ -550,7 +550,7 @@ namespace swrenderer
|
|||
frontsector->heightsec->GetTexture(sector_t::ceiling) == skyflatnum) ?
|
||||
Thread->PlaneList->FindPlane(frontsector->floorplane,
|
||||
frontsector->GetTexture(sector_t::floor),
|
||||
floorlightlevel + LightVisibility::ActualExtraLight(foggy), // killough 3/16/98
|
||||
floorlightlevel + LightVisibility::ActualExtraLight(foggy, Thread->Viewport.get()), // killough 3/16/98
|
||||
frontsector->GetAlpha(sector_t::floor),
|
||||
!!(frontsector->GetFlags(sector_t::floor) & PLANEF_ADDITIVE),
|
||||
frontsector->planes[sector_t::floor].xform,
|
||||
|
@ -591,7 +591,7 @@ namespace swrenderer
|
|||
clip3d->NewClip();
|
||||
}
|
||||
double fakeHeight = clip3d->fakeFloor->fakeFloor->top.plane->ZatPoint(frontsector->centerspot);
|
||||
if (fakeHeight < r_viewpoint.Pos.Z &&
|
||||
if (fakeHeight < Thread->Viewport->viewpoint.Pos.Z &&
|
||||
fakeHeight > frontsector->floorplane.ZatPoint(frontsector->centerspot))
|
||||
{
|
||||
clip3d->fake3D = FAKE3D_FAKEFLOOR;
|
||||
|
@ -616,7 +616,7 @@ namespace swrenderer
|
|||
ceilingplane = nullptr;
|
||||
floorplane = Thread->PlaneList->FindPlane(frontsector->floorplane,
|
||||
frontsector->GetTexture(sector_t::floor),
|
||||
floorlightlevel + LightVisibility::ActualExtraLight(foggy), // killough 3/16/98
|
||||
floorlightlevel + LightVisibility::ActualExtraLight(foggy, Thread->Viewport.get()), // killough 3/16/98
|
||||
frontsector->GetAlpha(sector_t::floor),
|
||||
!!(clip3d->fakeFloor->fakeFloor->flags & FF_ADDITIVETRANS),
|
||||
frontsector->planes[position].xform,
|
||||
|
@ -654,7 +654,7 @@ namespace swrenderer
|
|||
clip3d->NewClip();
|
||||
}
|
||||
double fakeHeight = clip3d->fakeFloor->fakeFloor->bottom.plane->ZatPoint(frontsector->centerspot);
|
||||
if (fakeHeight > r_viewpoint.Pos.Z &&
|
||||
if (fakeHeight > Thread->Viewport->viewpoint.Pos.Z &&
|
||||
fakeHeight < frontsector->ceilingplane.ZatPoint(frontsector->centerspot))
|
||||
{
|
||||
clip3d->fake3D = FAKE3D_FAKECEILING;
|
||||
|
@ -682,7 +682,7 @@ namespace swrenderer
|
|||
floorplane = nullptr;
|
||||
ceilingplane = Thread->PlaneList->FindPlane(frontsector->ceilingplane, // killough 3/8/98
|
||||
frontsector->GetTexture(sector_t::ceiling),
|
||||
ceilinglightlevel + LightVisibility::ActualExtraLight(foggy), // killough 4/11/98
|
||||
ceilinglightlevel + LightVisibility::ActualExtraLight(foggy, Thread->Viewport.get()), // killough 4/11/98
|
||||
frontsector->GetAlpha(sector_t::ceiling),
|
||||
!!(clip3d->fakeFloor->fakeFloor->flags & FF_ADDITIVETRANS),
|
||||
frontsector->planes[position].xform,
|
||||
|
@ -717,7 +717,7 @@ namespace swrenderer
|
|||
// [RH] Add particles
|
||||
if ((unsigned int)(sub - subsectors) < (unsigned int)numsubsectors)
|
||||
{ // Only do it for the main BSP.
|
||||
int shade = LightVisibility::LightLevelToShade((floorlightlevel + ceilinglightlevel) / 2 + LightVisibility::ActualExtraLight(foggy), foggy);
|
||||
int shade = LightVisibility::LightLevelToShade((floorlightlevel + ceilinglightlevel) / 2 + LightVisibility::ActualExtraLight(foggy, Thread->Viewport.get()), foggy);
|
||||
for (int i = ParticlesInSubsec[(unsigned int)(sub - subsectors)]; i != NO_PARTICLE; i = Particles[i].snext)
|
||||
{
|
||||
RenderParticle::Project(Thread, Particles + i, subsectors[sub - subsectors].sector, shade, FakeSide, foggy);
|
||||
|
@ -798,7 +798,7 @@ namespace swrenderer
|
|||
node_t *bsp = (node_t *)node;
|
||||
|
||||
// Decide which side the view point is on.
|
||||
int side = R_PointOnSide(r_viewpoint.Pos, bsp);
|
||||
int side = R_PointOnSide(Thread->Viewport->viewpoint.Pos, bsp);
|
||||
|
||||
// Recursively divide front space (toward the viewer).
|
||||
RenderBSPNode(bsp->children[side]);
|
||||
|
@ -815,10 +815,9 @@ namespace swrenderer
|
|||
|
||||
void RenderOpaquePass::ClearClip()
|
||||
{
|
||||
auto viewport = RenderViewport::Instance();
|
||||
// clip ceiling to console bottom
|
||||
fillshort(floorclip, viewwidth, viewheight);
|
||||
fillshort(ceilingclip, viewwidth, !screen->Accel2D && ConBottom > viewwindowy && !viewport->RenderingToCanvas() ? (ConBottom - viewwindowy) : 0);
|
||||
fillshort(ceilingclip, viewwidth, !screen->Accel2D && ConBottom > viewwindowy && !Thread->Viewport->RenderingToCanvas() ? (ConBottom - viewwindowy) : 0);
|
||||
}
|
||||
|
||||
void RenderOpaquePass::AddSprites(sector_t *sec, int lightlevel, WaterFakeSide fakeside, bool foggy, FDynamicColormap *basecolormap)
|
||||
|
@ -834,7 +833,7 @@ namespace swrenderer
|
|||
//sec->validcount = validcount;
|
||||
SeenSpriteSectors.insert(sec);
|
||||
|
||||
int spriteshade = LightVisibility::LightLevelToShade(lightlevel + LightVisibility::ActualExtraLight(foggy), foggy);
|
||||
int spriteshade = LightVisibility::LightLevelToShade(lightlevel + LightVisibility::ActualExtraLight(foggy, Thread->Viewport.get()), foggy);
|
||||
|
||||
// Handle all things in sector.
|
||||
for (auto p = sec->touching_renderthings; p != nullptr; p = p->m_snext)
|
||||
|
@ -848,7 +847,7 @@ namespace swrenderer
|
|||
FIntCVar *cvar = thing->GetClass()->distancecheck;
|
||||
if (cvar != nullptr && *cvar >= 0)
|
||||
{
|
||||
double dist = (thing->Pos() - r_viewpoint.Pos).LengthSquared();
|
||||
double dist = (thing->Pos() - Thread->Viewport->viewpoint.Pos).LengthSquared();
|
||||
double check = (double)**cvar;
|
||||
if (dist >= check * check)
|
||||
{
|
||||
|
@ -886,7 +885,7 @@ namespace swrenderer
|
|||
if (sec->sectornum != thing->Sector->sectornum) // compare sectornums to account for R_FakeFlat copies.
|
||||
{
|
||||
int lightlevel = thing->Sector->GetTexture(sector_t::ceiling) == skyflatnum ? thing->Sector->GetCeilingLight() : thing->Sector->GetFloorLight();
|
||||
thingShade = LightVisibility::LightLevelToShade(lightlevel + LightVisibility::ActualExtraLight(foggy), foggy);
|
||||
thingShade = LightVisibility::LightLevelToShade(lightlevel + LightVisibility::ActualExtraLight(foggy, Thread->Viewport.get()), foggy);
|
||||
thingColormap = thing->Sector->ColorMap;
|
||||
}
|
||||
|
||||
|
@ -930,8 +929,8 @@ namespace swrenderer
|
|||
|
||||
bool RenderOpaquePass::GetThingSprite(AActor *thing, ThingSprite &sprite)
|
||||
{
|
||||
sprite.pos = thing->InterpolatedPosition(r_viewpoint.TicFrac);
|
||||
sprite.pos.Z += thing->GetBobOffset(r_viewpoint.TicFrac);
|
||||
sprite.pos = thing->InterpolatedPosition(Thread->Viewport->viewpoint.TicFrac);
|
||||
sprite.pos.Z += thing->GetBobOffset(Thread->Viewport->viewpoint.TicFrac);
|
||||
|
||||
sprite.spritenum = thing->sprite;
|
||||
sprite.tex = nullptr;
|
||||
|
@ -958,7 +957,7 @@ namespace swrenderer
|
|||
{
|
||||
// choose a different rotation based on player view
|
||||
spriteframe_t *sprframe = &SpriteFrames[sprite.tex->Rotations];
|
||||
DAngle ang = (sprite.pos - r_viewpoint.Pos).Angle();
|
||||
DAngle ang = (sprite.pos - Thread->Viewport->viewpoint.Pos).Angle();
|
||||
angle_t rot;
|
||||
if (sprframe->Texture[0] == sprframe->Texture[1])
|
||||
{
|
||||
|
@ -1001,7 +1000,7 @@ namespace swrenderer
|
|||
//picnum = SpriteFrames[sprdef->spriteframes + thing->frame].Texture[0];
|
||||
// choose a different rotation based on player view
|
||||
spriteframe_t *sprframe = &SpriteFrames[sprdef->spriteframes + thing->frame];
|
||||
DAngle ang = (sprite.pos - r_viewpoint.Pos).Angle();
|
||||
DAngle ang = (sprite.pos - Thread->Viewport->viewpoint.Pos).Angle();
|
||||
angle_t rot;
|
||||
if (sprframe->Texture[0] == sprframe->Texture[1])
|
||||
{
|
||||
|
|
|
@ -79,7 +79,7 @@ namespace swrenderer
|
|||
void AddSprites(sector_t *sec, int lightlevel, WaterFakeSide fakeside, bool foggy, FDynamicColormap *basecolormap);
|
||||
|
||||
bool IsPotentiallyVisible(AActor *thing);
|
||||
static bool GetThingSprite(AActor *thing, ThingSprite &sprite);
|
||||
bool GetThingSprite(AActor *thing, ThingSprite &sprite);
|
||||
|
||||
subsector_t *InSubsector = nullptr;
|
||||
sector_t *frontsector = nullptr;
|
||||
|
|
|
@ -101,12 +101,12 @@ namespace swrenderer
|
|||
Thread->Clip3D->EnterSkybox();
|
||||
CurrentPortalInSkybox = true;
|
||||
|
||||
int savedextralight = r_viewpoint.extralight;
|
||||
DVector3 savedpos = r_viewpoint.Pos;
|
||||
DRotator savedangles = r_viewpoint.Angles;
|
||||
int savedextralight = Thread->Viewport->viewpoint.extralight;
|
||||
DVector3 savedpos = Thread->Viewport->viewpoint.Pos;
|
||||
DRotator savedangles = Thread->Viewport->viewpoint.Angles;
|
||||
double savedvisibility = LightVisibility::Instance()->GetVisibility();
|
||||
AActor *savedcamera = r_viewpoint.camera;
|
||||
sector_t *savedsector = r_viewpoint.sector;
|
||||
AActor *savedcamera = Thread->Viewport->viewpoint.camera;
|
||||
sector_t *savedsector = Thread->Viewport->viewpoint.sector;
|
||||
|
||||
for (VisiblePlane *pl = planes->PopFirstPortalPlane(); pl != nullptr; pl = planes->PopFirstPortalPlane())
|
||||
{
|
||||
|
@ -125,11 +125,11 @@ namespace swrenderer
|
|||
{
|
||||
// Don't let gun flashes brighten the sky box
|
||||
AActor *sky = port->mSkybox;
|
||||
r_viewpoint.extralight = 0;
|
||||
LightVisibility::Instance()->SetVisibility(sky->args[0] * 0.25f);
|
||||
Thread->Viewport->viewpoint.extralight = 0;
|
||||
LightVisibility::Instance()->SetVisibility(Thread->Viewport.get(), sky->args[0] * 0.25f);
|
||||
|
||||
r_viewpoint.Pos = sky->InterpolatedPosition(r_viewpoint.TicFrac);
|
||||
r_viewpoint.Angles.Yaw = savedangles.Yaw + (sky->PrevAngles.Yaw + deltaangle(sky->PrevAngles.Yaw, sky->Angles.Yaw) * r_viewpoint.TicFrac);
|
||||
Thread->Viewport->viewpoint.Pos = sky->InterpolatedPosition(Thread->Viewport->viewpoint.TicFrac);
|
||||
Thread->Viewport->viewpoint.Angles.Yaw = savedangles.Yaw + (sky->PrevAngles.Yaw + deltaangle(sky->PrevAngles.Yaw, sky->Angles.Yaw) * Thread->Viewport->viewpoint.TicFrac);
|
||||
|
||||
CopyStackedViewParameters();
|
||||
break;
|
||||
|
@ -138,12 +138,12 @@ namespace swrenderer
|
|||
case PORTS_STACKEDSECTORTHING:
|
||||
case PORTS_PORTAL:
|
||||
case PORTS_LINKEDPORTAL:
|
||||
r_viewpoint.extralight = pl->extralight;
|
||||
LightVisibility::Instance()->SetVisibility(pl->visibility);
|
||||
r_viewpoint.Pos.X = pl->viewpos.X + port->mDisplacement.X;
|
||||
r_viewpoint.Pos.Y = pl->viewpos.Y + port->mDisplacement.Y;
|
||||
r_viewpoint.Pos.Z = pl->viewpos.Z;
|
||||
r_viewpoint.Angles.Yaw = pl->viewangle;
|
||||
Thread->Viewport->viewpoint.extralight = pl->extralight;
|
||||
LightVisibility::Instance()->SetVisibility(Thread->Viewport.get(), pl->visibility);
|
||||
Thread->Viewport->viewpoint.Pos.X = pl->viewpos.X + port->mDisplacement.X;
|
||||
Thread->Viewport->viewpoint.Pos.Y = pl->viewpos.Y + port->mDisplacement.Y;
|
||||
Thread->Viewport->viewpoint.Pos.Z = pl->viewpos.Z;
|
||||
Thread->Viewport->viewpoint.Angles.Yaw = pl->viewangle;
|
||||
break;
|
||||
|
||||
case PORTS_HORIZON:
|
||||
|
@ -158,10 +158,10 @@ namespace swrenderer
|
|||
|
||||
port->mFlags |= PORTSF_INSKYBOX;
|
||||
if (port->mPartner > 0) level.sectorPortals[port->mPartner].mFlags |= PORTSF_INSKYBOX;
|
||||
r_viewpoint.camera = nullptr;
|
||||
r_viewpoint.sector = port->mDestination;
|
||||
assert(r_viewpoint.sector != nullptr);
|
||||
R_SetViewAngle(r_viewpoint, r_viewwindow);
|
||||
Thread->Viewport->viewpoint.camera = nullptr;
|
||||
Thread->Viewport->viewpoint.sector = port->mDestination;
|
||||
assert(viewsector != nullptr);
|
||||
R_SetViewAngle(Thread->Viewport->viewpoint, Thread->Viewport->viewwindow);
|
||||
Thread->OpaquePass->ClearSeenSprites();
|
||||
Thread->Clip3D->ClearFakeFloors();
|
||||
|
||||
|
@ -188,7 +188,7 @@ namespace swrenderer
|
|||
|
||||
drawseglist->PushPortal();
|
||||
Thread->SpriteList->PushPortal();
|
||||
viewposStack.Push(r_viewpoint.Pos);
|
||||
viewposStack.Push(Thread->Viewport->viewpoint.Pos);
|
||||
visplaneStack.Push(pl);
|
||||
|
||||
// Create a drawseg to clip sprites to the sky plane
|
||||
|
@ -227,7 +227,7 @@ namespace swrenderer
|
|||
while (viewposStack.Size() > 0)
|
||||
{
|
||||
// Masked textures and planes need the view coordinates restored for proper positioning.
|
||||
viewposStack.Pop(r_viewpoint.Pos);
|
||||
viewposStack.Pop(Thread->Viewport->viewpoint.Pos);
|
||||
|
||||
Thread->TranslucentPass->Render();
|
||||
|
||||
|
@ -242,13 +242,13 @@ namespace swrenderer
|
|||
drawseglist->PopPortal();
|
||||
}
|
||||
|
||||
r_viewpoint.camera = savedcamera;
|
||||
r_viewpoint.sector = savedsector;
|
||||
r_viewpoint.Pos = savedpos;
|
||||
LightVisibility::Instance()->SetVisibility(savedvisibility);
|
||||
r_viewpoint.extralight = savedextralight;
|
||||
r_viewpoint.Angles = savedangles;
|
||||
R_SetViewAngle(r_viewpoint, r_viewwindow);
|
||||
Thread->Viewport->viewpoint.camera = savedcamera;
|
||||
Thread->Viewport->viewpoint.sector = savedsector;
|
||||
Thread->Viewport->viewpoint.Pos = savedpos;
|
||||
LightVisibility::Instance()->SetVisibility(Thread->Viewport.get(), savedvisibility);
|
||||
Thread->Viewport->viewpoint.extralight = savedextralight;
|
||||
Thread->Viewport->viewpoint.Angles = savedangles;
|
||||
R_SetViewAngle(Thread->Viewport->viewpoint, Thread->Viewport->viewwindow);
|
||||
|
||||
CurrentPortalInSkybox = false;
|
||||
Thread->Clip3D->LeaveSkybox();
|
||||
|
@ -274,7 +274,8 @@ namespace swrenderer
|
|||
|
||||
void RenderPortal::RenderLinePortal(PortalDrawseg* pds, int depth)
|
||||
{
|
||||
auto viewport = RenderViewport::Instance();
|
||||
auto viewport = Thread->Viewport.get();
|
||||
auto &viewpoint = viewport->viewpoint;
|
||||
|
||||
// [ZZ] check depth. fill portal with black if it's exceeding the visual recursion limit, and continue like nothing happened.
|
||||
if (depth >= r_portal_recursions)
|
||||
|
@ -318,12 +319,12 @@ namespace swrenderer
|
|||
return;
|
||||
}
|
||||
|
||||
DAngle startang = r_viewpoint.Angles.Yaw;
|
||||
DVector3 startpos = r_viewpoint.Pos;
|
||||
DVector3 savedpath[2] = { r_viewpoint.Path[0], r_viewpoint.Path[1] };
|
||||
ActorRenderFlags savedvisibility = r_viewpoint.camera ? r_viewpoint.camera->renderflags & RF_INVISIBLE : ActorRenderFlags::FromInt(0);
|
||||
DAngle startang = viewpoint.Angles.Yaw;
|
||||
DVector3 startpos = viewpoint.Pos;
|
||||
DVector3 savedpath[2] = { viewpoint.Path[0], viewpoint.Path[1] };
|
||||
ActorRenderFlags savedvisibility = viewpoint.camera ? viewpoint.camera->renderflags & RF_INVISIBLE : ActorRenderFlags::FromInt(0);
|
||||
|
||||
r_viewpoint.camera->renderflags &= ~RF_INVISIBLE;
|
||||
viewpoint.camera->renderflags &= ~RF_INVISIBLE;
|
||||
|
||||
CurrentPortalUniq++;
|
||||
|
||||
|
@ -337,11 +338,11 @@ namespace swrenderer
|
|||
// Reflect the current view behind the mirror.
|
||||
if (pds->src->Delta().X == 0)
|
||||
{ // vertical mirror
|
||||
r_viewpoint.Pos.X = v1->fX() - startpos.X + v1->fX();
|
||||
viewpoint.Pos.X = v1->fX() - startpos.X + v1->fX();
|
||||
}
|
||||
else if (pds->src->Delta().Y == 0)
|
||||
{ // horizontal mirror
|
||||
r_viewpoint.Pos.Y = v1->fY() - startpos.Y + v1->fY();
|
||||
viewpoint.Pos.Y = v1->fY() - startpos.Y + v1->fY();
|
||||
}
|
||||
else
|
||||
{ // any mirror
|
||||
|
@ -357,40 +358,40 @@ namespace swrenderer
|
|||
// the above two cases catch len == 0
|
||||
double r = ((x - x1)*dx + (y - y1)*dy) / (dx*dx + dy*dy);
|
||||
|
||||
r_viewpoint.Pos.X = (x1 + r * dx) * 2 - x;
|
||||
r_viewpoint.Pos.Y = (y1 + r * dy) * 2 - y;
|
||||
viewpoint.Pos.X = (x1 + r * dx) * 2 - x;
|
||||
viewpoint.Pos.Y = (y1 + r * dy) * 2 - y;
|
||||
}
|
||||
r_viewpoint.Angles.Yaw = pds->src->Delta().Angle() * 2 - startang;
|
||||
viewpoint.Angles.Yaw = pds->src->Delta().Angle() * 2 - startang;
|
||||
}
|
||||
else
|
||||
{
|
||||
P_TranslatePortalXY(pds->src, r_viewpoint.Pos.X, r_viewpoint.Pos.Y);
|
||||
P_TranslatePortalZ(pds->src, r_viewpoint.Pos.Z);
|
||||
P_TranslatePortalAngle(pds->src, r_viewpoint.Angles.Yaw);
|
||||
P_TranslatePortalXY(pds->src, r_viewpoint.Path[0].X, r_viewpoint.Path[0].Y);
|
||||
P_TranslatePortalXY(pds->src, r_viewpoint.Path[1].X, r_viewpoint.Path[1].Y);
|
||||
P_TranslatePortalXY(pds->src, viewpoint.Pos.X, viewpoint.Pos.Y);
|
||||
P_TranslatePortalZ(pds->src, viewpoint.Pos.Z);
|
||||
P_TranslatePortalAngle(pds->src, viewpoint.Angles.Yaw);
|
||||
P_TranslatePortalXY(pds->src, viewpoint.Path[0].X, viewpoint.Path[0].Y);
|
||||
P_TranslatePortalXY(pds->src, viewpoint.Path[1].X, viewpoint.Path[1].Y);
|
||||
|
||||
if (!r_viewpoint.showviewer && r_viewpoint.camera && P_PointOnLineSidePrecise(r_viewpoint.Path[0], pds->dst) != P_PointOnLineSidePrecise(r_viewpoint.Path[1], pds->dst))
|
||||
if (!viewpoint.showviewer && viewpoint.camera && P_PointOnLineSidePrecise(viewpoint.Path[0], pds->dst) != P_PointOnLineSidePrecise(viewpoint.Path[1], pds->dst))
|
||||
{
|
||||
double distp = (r_viewpoint.Path[0] - r_viewpoint.Path[1]).Length();
|
||||
double distp = (viewpoint.Path[0] - viewpoint.Path[1]).Length();
|
||||
if (distp > EQUAL_EPSILON)
|
||||
{
|
||||
double dist1 = (r_viewpoint.Pos - r_viewpoint.Path[0]).Length();
|
||||
double dist2 = (r_viewpoint.Pos - r_viewpoint.Path[1]).Length();
|
||||
double dist1 = (viewpoint.Pos - viewpoint.Path[0]).Length();
|
||||
double dist2 = (viewpoint.Pos - viewpoint.Path[1]).Length();
|
||||
|
||||
if (dist1 + dist2 < distp + 1)
|
||||
{
|
||||
r_viewpoint.camera->renderflags |= RF_INVISIBLE;
|
||||
viewpoint.camera->renderflags |= RF_INVISIBLE;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
r_viewpoint.Sin = r_viewpoint.Angles.Yaw.Sin();
|
||||
r_viewpoint.Cos = r_viewpoint.Angles.Yaw.Cos();
|
||||
viewpoint.Sin = viewpoint.Angles.Yaw.Sin();
|
||||
viewpoint.Cos = viewpoint.Angles.Yaw.Cos();
|
||||
|
||||
r_viewpoint.TanSin = r_viewwindow.FocalTangent * r_viewpoint.Sin;
|
||||
r_viewpoint.TanCos = r_viewwindow.FocalTangent * r_viewpoint.Cos;
|
||||
viewpoint.TanSin = Thread->Viewport->viewwindow.FocalTangent * viewpoint.Sin;
|
||||
viewpoint.TanCos = Thread->Viewport->viewwindow.FocalTangent * viewpoint.Cos;
|
||||
|
||||
CopyStackedViewParameters();
|
||||
|
||||
|
@ -425,14 +426,14 @@ namespace swrenderer
|
|||
|
||||
Thread->OpaquePass->RenderScene();
|
||||
Thread->Clip3D->ResetClip(); // reset clips (floor/ceiling)
|
||||
if (!savedvisibility && r_viewpoint.camera) r_viewpoint.camera->renderflags &= ~RF_INVISIBLE;
|
||||
if (!savedvisibility && viewpoint.camera) viewpoint.camera->renderflags &= ~RF_INVISIBLE;
|
||||
|
||||
PlaneCycles.Clock();
|
||||
Thread->PlaneList->Render();
|
||||
RenderPlanePortals();
|
||||
PlaneCycles.Unclock();
|
||||
|
||||
double vzp = r_viewpoint.Pos.Z;
|
||||
double vzp = viewpoint.Pos.Z;
|
||||
|
||||
int prevuniq = CurrentPortalUniq;
|
||||
// depth check is in another place right now
|
||||
|
@ -463,10 +464,10 @@ namespace swrenderer
|
|||
|
||||
CurrentPortal = prevpds;
|
||||
MirrorFlags = prevmf;
|
||||
r_viewpoint.Angles.Yaw = startang;
|
||||
r_viewpoint.Pos = startpos;
|
||||
r_viewpoint.Path[0] = savedpath[0];
|
||||
r_viewpoint.Path[1] = savedpath[1];
|
||||
viewpoint.Angles.Yaw = startang;
|
||||
viewpoint.Pos = startpos;
|
||||
viewpoint.Path[0] = savedpath[0];
|
||||
viewpoint.Path[1] = savedpath[1];
|
||||
}
|
||||
|
||||
void RenderPortal::RenderLinePortalHighlight(PortalDrawseg* pds)
|
||||
|
@ -474,7 +475,7 @@ namespace swrenderer
|
|||
// [ZZ] NO OVERFLOW CHECKS HERE
|
||||
// I believe it won't break. if it does, blame me. :(
|
||||
|
||||
auto viewport = RenderViewport::Instance();
|
||||
auto viewport = Thread->Viewport.get();
|
||||
|
||||
if (viewport->RenderTarget->IsBgra()) // Assuming this is just a debug function
|
||||
return;
|
||||
|
@ -513,9 +514,9 @@ namespace swrenderer
|
|||
|
||||
void RenderPortal::CopyStackedViewParameters()
|
||||
{
|
||||
stacked_viewpos = r_viewpoint.Pos;
|
||||
stacked_angle = r_viewpoint.Angles;
|
||||
stacked_extralight = r_viewpoint.extralight;
|
||||
stacked_viewpos = Thread->Viewport->viewpoint.Pos;
|
||||
stacked_angle = Thread->Viewport->viewpoint.Angles;
|
||||
stacked_extralight = Thread->Viewport->viewpoint.extralight;
|
||||
stacked_visibility = LightVisibility::Instance()->GetVisibility();
|
||||
}
|
||||
|
||||
|
|
|
@ -76,7 +76,7 @@ namespace swrenderer
|
|||
|
||||
void RenderScene::RenderView(player_t *player)
|
||||
{
|
||||
auto viewport = RenderViewport::Instance();
|
||||
auto viewport = MainThread()->Viewport.get();
|
||||
viewport->RenderTarget = screen;
|
||||
|
||||
int width = SCREENWIDTH;
|
||||
|
@ -132,9 +132,9 @@ namespace swrenderer
|
|||
MaskedCycles.Reset();
|
||||
WallScanCycles.Reset();
|
||||
|
||||
R_SetupFrame(r_viewpoint, r_viewwindow, actor);
|
||||
CameraLight::Instance()->SetCamera(actor);
|
||||
RenderViewport::Instance()->SetupFreelook();
|
||||
R_SetupFrame(MainThread()->Viewport->viewpoint, MainThread()->Viewport->viewwindow, actor);
|
||||
CameraLight::Instance()->SetCamera(MainThread()->Viewport.get(), actor);
|
||||
MainThread()->Viewport->SetupFreelook();
|
||||
|
||||
NetUpdate();
|
||||
|
||||
|
@ -143,23 +143,23 @@ namespace swrenderer
|
|||
// [RH] Setup particles for this frame
|
||||
P_FindParticleSubsectors();
|
||||
|
||||
ActorRenderFlags savedflags = r_viewpoint.camera->renderflags;
|
||||
ActorRenderFlags savedflags = MainThread()->Viewport->viewpoint.camera->renderflags;
|
||||
// Never draw the player unless in chasecam mode
|
||||
if (!r_viewpoint.showviewer)
|
||||
if (!MainThread()->Viewport->viewpoint.showviewer)
|
||||
{
|
||||
r_viewpoint.camera->renderflags |= RF_INVISIBLE;
|
||||
MainThread()->Viewport->viewpoint.camera->renderflags |= RF_INVISIBLE;
|
||||
}
|
||||
|
||||
RenderThreadSlices();
|
||||
MainThread()->PlayerSprites->Render();
|
||||
RenderDrawQueues();
|
||||
|
||||
r_viewpoint.camera->renderflags = savedflags;
|
||||
MainThread()->Viewport->viewpoint.camera->renderflags = savedflags;
|
||||
interpolator.RestoreInterpolations();
|
||||
|
||||
// If we don't want shadered colormaps, NULL it now so that the
|
||||
// copy to the screen does not use a special colormap shader.
|
||||
if (!r_shadercolormaps && !RenderViewport::Instance()->RenderTarget->IsBgra())
|
||||
if (!r_shadercolormaps && !MainThread()->Viewport->RenderTarget->IsBgra())
|
||||
{
|
||||
CameraLight::Instance()->ClearShaderColormap();
|
||||
}
|
||||
|
@ -184,6 +184,7 @@ namespace swrenderer
|
|||
std::unique_lock<std::mutex> start_lock(start_mutex);
|
||||
for (int i = 0; i < numThreads; i++)
|
||||
{
|
||||
*Threads[i]->Viewport = *MainThread()->Viewport;
|
||||
Threads[i]->X1 = viewwidth * i / numThreads;
|
||||
Threads[i]->X2 = viewwidth * (i + 1) / numThreads;
|
||||
}
|
||||
|
@ -321,24 +322,24 @@ namespace swrenderer
|
|||
|
||||
void RenderScene::RenderViewToCanvas(AActor *actor, DCanvas *canvas, int x, int y, int width, int height, bool dontmaplines)
|
||||
{
|
||||
auto viewport = RenderViewport::Instance();
|
||||
auto viewport = MainThread()->Viewport.get();
|
||||
|
||||
const bool savedviewactive = viewactive;
|
||||
|
||||
viewwidth = width;
|
||||
viewport->RenderTarget = canvas;
|
||||
|
||||
R_SetWindow(r_viewpoint, r_viewwindow, 12, width, height, height, true);
|
||||
R_SetWindow(MainThread()->Viewport->viewpoint, MainThread()->Viewport->viewwindow, 12, width, height, height, true);
|
||||
viewwindowx = x;
|
||||
viewwindowy = y;
|
||||
viewactive = true;
|
||||
viewport->SetViewport(width, height, r_viewwindow.WidescreenRatio);
|
||||
viewport->SetViewport(width, height, MainThread()->Viewport->viewwindow.WidescreenRatio);
|
||||
|
||||
RenderActorView(actor, dontmaplines);
|
||||
|
||||
viewport->RenderTarget = screen;
|
||||
|
||||
R_ExecuteSetViewSize(r_viewpoint, r_viewwindow);
|
||||
R_ExecuteSetViewSize(MainThread()->Viewport->viewpoint, MainThread()->Viewport->viewwindow);
|
||||
float trueratio;
|
||||
ActiveRatio(width, height, &trueratio);
|
||||
screen->Lock(true);
|
||||
|
@ -350,7 +351,7 @@ namespace swrenderer
|
|||
|
||||
void RenderScene::ScreenResized()
|
||||
{
|
||||
auto viewport = RenderViewport::Instance();
|
||||
auto viewport = MainThread()->Viewport.get();
|
||||
viewport->RenderTarget = screen;
|
||||
int width = SCREENWIDTH;
|
||||
int height = SCREENHEIGHT;
|
||||
|
|
|
@ -175,7 +175,7 @@ namespace swrenderer
|
|||
else
|
||||
{ // kg3D - correct sorting
|
||||
// ceilings
|
||||
for (HeightLevel *hl = clip3d->height_cur; hl != nullptr && hl->height >= r_viewpoint.Pos.Z; hl = hl->prev)
|
||||
for (HeightLevel *hl = clip3d->height_cur; hl != nullptr && hl->height >= Thread->Viewport->viewpoint.Pos.Z; hl = hl->prev)
|
||||
{
|
||||
if (hl->next)
|
||||
{
|
||||
|
@ -195,7 +195,7 @@ namespace swrenderer
|
|||
clip3d->fake3D = FAKE3D_DOWN2UP | FAKE3D_CLIPTOP;
|
||||
clip3d->sclipTop = clip3d->height_top->height;
|
||||
DrawMaskedSingle(true);
|
||||
for (HeightLevel *hl = clip3d->height_top; hl != nullptr && hl->height < r_viewpoint.Pos.Z; hl = hl->next)
|
||||
for (HeightLevel *hl = clip3d->height_top; hl != nullptr && hl->height < Thread->Viewport->viewpoint.Pos.Z; hl = hl->next)
|
||||
{
|
||||
Thread->PlaneList->RenderHeight(hl->height);
|
||||
if (hl->next)
|
||||
|
|
|
@ -144,8 +144,8 @@ namespace swrenderer
|
|||
DVector2 angvec = (curline->v2->fPos() - curline->v1->fPos()).Unit();
|
||||
float maskedScaleY;
|
||||
|
||||
decal_left = decal_pos - edge_left * angvec - r_viewpoint.Pos;
|
||||
decal_right = decal_pos + edge_right * angvec - r_viewpoint.Pos;
|
||||
decal_left = decal_pos - edge_left * angvec - thread->Viewport->viewpoint.Pos;
|
||||
decal_right = decal_pos + edge_right * angvec - thread->Viewport->viewpoint.Pos;
|
||||
|
||||
CameraLight *cameraLight;
|
||||
double texturemid;
|
||||
|
@ -222,7 +222,7 @@ namespace swrenderer
|
|||
}
|
||||
|
||||
yscale = decal->ScaleY;
|
||||
texturemid = WallSpriteTile->TopOffset + (zpos - r_viewpoint.Pos.Z) / yscale;
|
||||
texturemid = WallSpriteTile->TopOffset + (zpos - thread->Viewport->viewpoint.Pos.Z) / yscale;
|
||||
|
||||
// Clip sprite to drawseg
|
||||
x1 = MAX<int>(clipper->x1, x1);
|
||||
|
@ -233,7 +233,7 @@ namespace swrenderer
|
|||
}
|
||||
|
||||
ProjectedWallTexcoords walltexcoords;
|
||||
walltexcoords.Project(WallSpriteTile->GetWidth(), x1, x2, WallT);
|
||||
walltexcoords.Project(thread->Viewport.get(), WallSpriteTile->GetWidth(), x1, x2, WallT);
|
||||
|
||||
if (flipx)
|
||||
{
|
||||
|
@ -291,7 +291,7 @@ namespace swrenderer
|
|||
else
|
||||
calclighting = true;
|
||||
|
||||
bool visible = drawerargs.SetStyle(decal->RenderStyle, (float)decal->Alpha, decal->Translation, decal->AlphaColor, basecolormap);
|
||||
bool visible = drawerargs.SetStyle(thread->Viewport.get(), decal->RenderStyle, (float)decal->Alpha, decal->Translation, decal->AlphaColor, basecolormap);
|
||||
|
||||
// R_SetPatchStyle can modify basecolormap.
|
||||
if (rereadcolormap)
|
||||
|
@ -323,7 +323,7 @@ namespace swrenderer
|
|||
|
||||
void RenderDecal::DrawColumn(RenderThread *thread, SpriteDrawerArgs &drawerargs, int x, FTexture *WallSpriteTile, const ProjectedWallTexcoords &walltexcoords, double texturemid, float maskedScaleY, bool sprflipvert, const short *mfloorclip, const short *mceilingclip)
|
||||
{
|
||||
auto viewport = RenderViewport::Instance();
|
||||
auto viewport = thread->Viewport.get();
|
||||
|
||||
float iscale = walltexcoords.VStep[x] * maskedScaleY;
|
||||
double spryscale = 1 / iscale;
|
||||
|
|
|
@ -77,16 +77,16 @@ namespace swrenderer
|
|||
return;
|
||||
|
||||
// transform the origin point
|
||||
tr_x = particle->Pos.X - r_viewpoint.Pos.X;
|
||||
tr_y = particle->Pos.Y - r_viewpoint.Pos.Y;
|
||||
tr_x = particle->Pos.X - thread->Viewport->viewpoint.Pos.X;
|
||||
tr_y = particle->Pos.Y - thread->Viewport->viewpoint.Pos.Y;
|
||||
|
||||
tz = tr_x * r_viewpoint.TanCos + tr_y * r_viewpoint.TanSin;
|
||||
tz = tr_x * thread->Viewport->viewpoint.TanCos + tr_y * thread->Viewport->viewpoint.TanSin;
|
||||
|
||||
// particle is behind view plane?
|
||||
if (tz < MINZ)
|
||||
return;
|
||||
|
||||
tx = tr_x * r_viewpoint.Sin - tr_y * r_viewpoint.Cos;
|
||||
tx = tr_x * thread->Viewport->viewpoint.Sin - tr_y * thread->Viewport->viewpoint.Cos;
|
||||
|
||||
// Flip for mirrors
|
||||
if (renderportal->MirrorFlags & RF_XFLIP)
|
||||
|
@ -99,21 +99,21 @@ namespace swrenderer
|
|||
return;
|
||||
|
||||
tiz = 1 / tz;
|
||||
xscale = r_viewwindow.centerx * tiz;
|
||||
xscale = thread->Viewport->viewwindow.centerx * tiz;
|
||||
|
||||
// calculate edges of the shape
|
||||
double psize = particle->size / 8.0;
|
||||
|
||||
x1 = MAX<int>(renderportal->WindowLeft, r_viewwindow.centerx + xs_RoundToInt((tx - psize) * xscale));
|
||||
x2 = MIN<int>(renderportal->WindowRight, r_viewwindow.centerx + xs_RoundToInt((tx + psize) * xscale));
|
||||
x1 = MAX<int>(renderportal->WindowLeft, thread->Viewport->viewwindow.centerx + xs_RoundToInt((tx - psize) * xscale));
|
||||
x2 = MIN<int>(renderportal->WindowRight, thread->Viewport->viewwindow.centerx + xs_RoundToInt((tx + psize) * xscale));
|
||||
|
||||
if (x1 >= x2)
|
||||
return;
|
||||
|
||||
auto viewport = RenderViewport::Instance();
|
||||
auto viewport = thread->Viewport.get();
|
||||
|
||||
yscale = xscale; // YaspectMul is not needed for particles as they should always be square
|
||||
ty = particle->Pos.Z - r_viewpoint.Pos.Z;
|
||||
ty = particle->Pos.Z - viewport->viewpoint.Pos.Z;
|
||||
y1 = xs_RoundToInt(viewport->CenterY - (ty + psize) * yscale);
|
||||
y2 = xs_RoundToInt(viewport->CenterY - (ty - psize) * yscale);
|
||||
|
||||
|
@ -231,7 +231,7 @@ namespace swrenderer
|
|||
fixed_t fglevel = ((vis->renderflags + 1) << 8) & ~0x3ff;
|
||||
uint32_t alpha = fglevel * 256 / FRACUNIT;
|
||||
|
||||
auto viewport = RenderViewport::Instance();
|
||||
auto viewport = thread->Viewport.get();
|
||||
|
||||
spacing = viewport->RenderTarget->GetPitch();
|
||||
|
||||
|
|
|
@ -82,37 +82,37 @@ namespace swrenderer
|
|||
F3DFloor *rover;
|
||||
|
||||
if (!r_drawplayersprites ||
|
||||
!r_viewpoint.camera ||
|
||||
!r_viewpoint.camera->player ||
|
||||
!Thread->Viewport->viewpoint.camera ||
|
||||
!Thread->Viewport->viewpoint.camera->player ||
|
||||
(players[consoleplayer].cheats & CF_CHASECAM) ||
|
||||
(r_deathcamera && r_viewpoint.camera->health <= 0))
|
||||
(r_deathcamera && Thread->Viewport->viewpoint.camera->health <= 0))
|
||||
return;
|
||||
|
||||
FDynamicColormap *basecolormap;
|
||||
CameraLight *cameraLight = CameraLight::Instance();
|
||||
if (cameraLight->FixedLightLevel() < 0 && r_viewpoint.sector->e && r_viewpoint.sector->e->XFloor.lightlist.Size())
|
||||
if (cameraLight->FixedLightLevel() < 0 && Thread->Viewport->viewpoint.sector->e && Thread->Viewport->viewpoint.sector->e->XFloor.lightlist.Size())
|
||||
{
|
||||
for (i = r_viewpoint.sector->e->XFloor.lightlist.Size() - 1; i >= 0; i--)
|
||||
for (i = Thread->Viewport->viewpoint.sector->e->XFloor.lightlist.Size() - 1; i >= 0; i--)
|
||||
{
|
||||
if (r_viewpoint.Pos.Z <= r_viewpoint.sector->e->XFloor.lightlist[i].plane.Zat0())
|
||||
if (Thread->Viewport->viewpoint.Pos.Z <= Thread->Viewport->viewpoint.sector->e->XFloor.lightlist[i].plane.Zat0())
|
||||
{
|
||||
rover = r_viewpoint.sector->e->XFloor.lightlist[i].caster;
|
||||
rover = Thread->Viewport->viewpoint.sector->e->XFloor.lightlist[i].caster;
|
||||
if (rover)
|
||||
{
|
||||
if (rover->flags & FF_DOUBLESHADOW && r_viewpoint.Pos.Z <= rover->bottom.plane->Zat0())
|
||||
if (rover->flags & FF_DOUBLESHADOW && Thread->Viewport->viewpoint.Pos.Z <= rover->bottom.plane->Zat0())
|
||||
break;
|
||||
sec = rover->model;
|
||||
if (rover->flags & FF_FADEWALLS)
|
||||
basecolormap = sec->ColorMap;
|
||||
else
|
||||
basecolormap = r_viewpoint.sector->e->XFloor.lightlist[i].extra_colormap;
|
||||
basecolormap = Thread->Viewport->viewpoint.sector->e->XFloor.lightlist[i].extra_colormap;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!sec)
|
||||
{
|
||||
sec = r_viewpoint.sector;
|
||||
sec = Thread->Viewport->viewpoint.sector;
|
||||
basecolormap = sec->ColorMap;
|
||||
}
|
||||
floorlight = ceilinglight = sec->lightlevel;
|
||||
|
@ -120,7 +120,7 @@ namespace swrenderer
|
|||
else
|
||||
{ // This used to use camera->Sector but due to interpolation that can be incorrect
|
||||
// when the interpolated viewpoint is in a different sector than the camera.
|
||||
sec = Thread->OpaquePass->FakeFlat(r_viewpoint.sector, &tempsec, &floorlight, &ceilinglight, nullptr, 0, 0, 0, 0);
|
||||
sec = Thread->OpaquePass->FakeFlat(Thread->Viewport->viewpoint.sector, &tempsec, &floorlight, &ceilinglight, nullptr, 0, 0, 0, 0);
|
||||
|
||||
// [RH] set basecolormap
|
||||
basecolormap = sec->ColorMap;
|
||||
|
@ -130,12 +130,12 @@ namespace swrenderer
|
|||
bool foggy = (level.fadeto || basecolormap->Fade || (level.flags & LEVEL_HASFADETABLE));
|
||||
|
||||
// get light level
|
||||
lightnum = ((floorlight + ceilinglight) >> 1) + LightVisibility::ActualExtraLight(foggy);
|
||||
lightnum = ((floorlight + ceilinglight) >> 1) + LightVisibility::ActualExtraLight(foggy, Thread->Viewport.get());
|
||||
int spriteshade = LightVisibility::LightLevelToShade(lightnum, foggy) - 24 * FRACUNIT;
|
||||
|
||||
if (r_viewpoint.camera->player != NULL)
|
||||
if (Thread->Viewport->viewpoint.camera->player != NULL)
|
||||
{
|
||||
auto viewport = RenderViewport::Instance();
|
||||
auto viewport = Thread->Viewport.get();
|
||||
|
||||
double centerhack = viewport->CenterY;
|
||||
double wx, wy;
|
||||
|
@ -143,10 +143,10 @@ namespace swrenderer
|
|||
|
||||
viewport->CenterY = viewheight / 2;
|
||||
|
||||
P_BobWeapon(r_viewpoint.camera->player, &bobx, &boby, r_viewpoint.TicFrac);
|
||||
P_BobWeapon(viewport->viewpoint.camera->player, &bobx, &boby, viewport->viewpoint.TicFrac);
|
||||
|
||||
// Interpolate the main weapon layer once so as to be able to add it to other layers.
|
||||
if ((weapon = r_viewpoint.camera->player->FindPSprite(PSP_WEAPON)) != nullptr)
|
||||
if ((weapon = viewport->viewpoint.camera->player->FindPSprite(PSP_WEAPON)) != nullptr)
|
||||
{
|
||||
if (weapon->firstTic)
|
||||
{
|
||||
|
@ -155,8 +155,8 @@ namespace swrenderer
|
|||
}
|
||||
else
|
||||
{
|
||||
wx = weapon->oldx + (weapon->x - weapon->oldx) * r_viewpoint.TicFrac;
|
||||
wy = weapon->oldy + (weapon->y - weapon->oldy) * r_viewpoint.TicFrac;
|
||||
wx = weapon->oldx + (weapon->x - weapon->oldx) * viewport->viewpoint.TicFrac;
|
||||
wy = weapon->oldy + (weapon->y - weapon->oldy) * viewport->viewpoint.TicFrac;
|
||||
}
|
||||
}
|
||||
else
|
||||
|
@ -166,7 +166,7 @@ namespace swrenderer
|
|||
}
|
||||
|
||||
// add all active psprites
|
||||
psp = r_viewpoint.camera->player->psprites;
|
||||
psp = viewport->viewpoint.camera->player->psprites;
|
||||
while (psp)
|
||||
{
|
||||
// [RH] Don't draw the targeter's crosshair if the player already has a crosshair set.
|
||||
|
@ -176,7 +176,7 @@ namespace swrenderer
|
|||
|
||||
if ((psp->GetID() != PSP_TARGETCENTER || CrosshairImage == nullptr) && psp->GetCaller() != nullptr)
|
||||
{
|
||||
RenderSprite(psp, r_viewpoint.camera, bobx, boby, wx, wy, r_viewpoint.TicFrac, spriteshade, basecolormap, foggy);
|
||||
RenderSprite(psp, viewport->viewpoint.camera, bobx, boby, wx, wy, viewport->viewpoint.TicFrac, spriteshade, basecolormap, foggy);
|
||||
}
|
||||
|
||||
psp = psp->GetNext();
|
||||
|
@ -243,9 +243,9 @@ namespace swrenderer
|
|||
sy += wy;
|
||||
}
|
||||
|
||||
auto viewport = RenderViewport::Instance();
|
||||
auto viewport = Thread->Viewport.get();
|
||||
|
||||
double pspritexscale = r_viewwindow.centerxwide / 160.0;
|
||||
double pspritexscale = viewport->viewwindow.centerxwide / 160.0;
|
||||
double pspriteyscale = pspritexscale * viewport->YaspectMul;
|
||||
double pspritexiscale = 1 / pspritexscale;
|
||||
|
||||
|
@ -273,7 +273,7 @@ namespace swrenderer
|
|||
|
||||
vis.texturemid = (BASEYCENTER - sy) * tex->Scale.Y + tex->TopOffset;
|
||||
|
||||
if (r_viewpoint.camera->player && (viewport->RenderTarget != screen ||
|
||||
if (Thread->Viewport->viewpoint.camera->player && (viewport->RenderTarget != screen ||
|
||||
viewheight == viewport->RenderTarget->GetHeight() ||
|
||||
(viewport->RenderTarget->GetWidth() > (BASEXCENTER * 2) && !st_scale)))
|
||||
{ // Adjust PSprite for fullscreen views
|
||||
|
@ -292,7 +292,7 @@ namespace swrenderer
|
|||
}
|
||||
if (pspr->GetID() < PSP_TARGETCENTER)
|
||||
{ // Move the weapon down for 1280x1024.
|
||||
vis.texturemid -= AspectPspriteOffset(r_viewwindow.WidescreenRatio);
|
||||
vis.texturemid -= AspectPspriteOffset(viewport->viewwindow.WidescreenRatio);
|
||||
}
|
||||
vis.x1 = x1 < 0 ? 0 : x1;
|
||||
vis.x2 = x2 >= viewwidth ? viewwidth : x2;
|
||||
|
@ -447,14 +447,14 @@ namespace swrenderer
|
|||
|
||||
colormap_to_use = (FDynamicColormap*)vis.Light.BaseColormap;
|
||||
|
||||
if (r_viewpoint.camera->Inventory != nullptr)
|
||||
if (Thread->Viewport->viewpoint.camera->Inventory != nullptr)
|
||||
{
|
||||
visstyle_t visstyle;
|
||||
visstyle.Alpha = vis.Alpha;
|
||||
visstyle.RenderStyle = STYLE_Count;
|
||||
visstyle.Invert = false;
|
||||
|
||||
r_viewpoint.camera->Inventory->AlterWeaponSprite(&visstyle);
|
||||
Thread->Viewport->viewpoint.camera->Inventory->AlterWeaponSprite(&visstyle);
|
||||
|
||||
vis.Alpha = visstyle.Alpha;
|
||||
|
||||
|
@ -599,7 +599,7 @@ namespace swrenderer
|
|||
|
||||
FDynamicColormap *basecolormap = static_cast<FDynamicColormap*>(Light.BaseColormap);
|
||||
|
||||
bool visible = drawerargs.SetStyle(RenderStyle, Alpha, Translation, FillColor, basecolormap, Light.ColormapNum << FRACBITS);
|
||||
bool visible = drawerargs.SetStyle(thread->Viewport.get(), RenderStyle, Alpha, Translation, FillColor, basecolormap, Light.ColormapNum << FRACBITS);
|
||||
if (!visible)
|
||||
return;
|
||||
|
||||
|
@ -607,7 +607,7 @@ namespace swrenderer
|
|||
bool sprflipvert = false;
|
||||
fixed_t iscale = FLOAT2FIXED(1 / yscale);
|
||||
|
||||
auto viewport = RenderViewport::Instance();
|
||||
auto viewport = thread->Viewport.get();
|
||||
|
||||
double sprtopscreen;
|
||||
if (renderflags & RF_YFLIP)
|
||||
|
|
|
@ -66,16 +66,16 @@ namespace swrenderer
|
|||
void RenderSprite::Project(RenderThread *thread, AActor *thing, const DVector3 &pos, FTexture *tex, const DVector2 &spriteScale, int renderflags, WaterFakeSide fakeside, F3DFloor *fakefloor, F3DFloor *fakeceiling, sector_t *current_sector, int spriteshade, bool foggy, FDynamicColormap *basecolormap)
|
||||
{
|
||||
// transform the origin point
|
||||
double tr_x = pos.X - r_viewpoint.Pos.X;
|
||||
double tr_y = pos.Y - r_viewpoint.Pos.Y;
|
||||
double tr_x = pos.X - thread->Viewport->viewpoint.Pos.X;
|
||||
double tr_y = pos.Y - thread->Viewport->viewpoint.Pos.Y;
|
||||
|
||||
double tz = tr_x * r_viewpoint.TanCos + tr_y * r_viewpoint.TanSin;
|
||||
double tz = tr_x * thread->Viewport->viewpoint.TanCos + tr_y * thread->Viewport->viewpoint.TanSin;
|
||||
|
||||
// thing is behind view plane?
|
||||
if (tz < MINZ)
|
||||
return;
|
||||
|
||||
double tx = tr_x * r_viewpoint.Sin - tr_y * r_viewpoint.Cos;
|
||||
double tx = tr_x * thread->Viewport->viewpoint.Sin - tr_y * thread->Viewport->viewpoint.Cos;
|
||||
|
||||
// [RH] Flip for mirrors
|
||||
RenderPortal *renderportal = thread->Portal.get();
|
||||
|
@ -124,12 +124,12 @@ namespace swrenderer
|
|||
}
|
||||
}
|
||||
|
||||
auto viewport = RenderViewport::Instance();
|
||||
auto viewport = thread->Viewport.get();
|
||||
|
||||
double xscale = viewport->CenterX / tz;
|
||||
|
||||
// [RH] Reject sprites that are off the top or bottom of the screen
|
||||
if (viewport->globaluclip * tz > r_viewpoint.Pos.Z - gzb || viewport->globaldclip * tz < r_viewpoint.Pos.Z - gzt)
|
||||
if (viewport->globaluclip * tz > viewport->viewpoint.Pos.Z - gzb || viewport->globaldclip * tz < viewport->viewpoint.Pos.Z - gzt)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
@ -142,14 +142,14 @@ namespace swrenderer
|
|||
|
||||
tx -= ((renderflags & RF_XFLIP) ? (tex->GetWidth() - tex->LeftOffset - 1) : tex->LeftOffset) * thingxscalemul;
|
||||
double dtx1 = tx * xscale;
|
||||
int x1 = r_viewwindow.centerx + xs_RoundToInt(dtx1);
|
||||
int x1 = viewport->viewwindow.centerx + xs_RoundToInt(dtx1);
|
||||
|
||||
// off the right side?
|
||||
if (x1 >= renderportal->WindowRight)
|
||||
return;
|
||||
|
||||
tx += tex->GetWidth() * thingxscalemul;
|
||||
int x2 = r_viewwindow.centerx + xs_RoundToInt(tx * xscale);
|
||||
int x2 = viewport->viewwindow.centerx + xs_RoundToInt(tx * xscale);
|
||||
|
||||
// off the left side or too small?
|
||||
if ((x2 < renderportal->WindowLeft || x2 <= x1))
|
||||
|
@ -168,7 +168,7 @@ namespace swrenderer
|
|||
vis->yscale = float(viewport->InvZtoScale * yscale / tz);
|
||||
vis->idepth = float(1 / tz);
|
||||
vis->floorclip = thing->Floorclip / yscale;
|
||||
vis->texturemid = tex->TopOffset - (r_viewpoint.Pos.Z - pos.Z + thing->Floorclip) / yscale;
|
||||
vis->texturemid = tex->TopOffset - (viewport->viewpoint.Pos.Z - pos.Z + thing->Floorclip) / yscale;
|
||||
vis->x1 = x1 < renderportal->WindowLeft ? renderportal->WindowLeft : x1;
|
||||
vis->x2 = x2 > renderportal->WindowRight ? renderportal->WindowRight : x2;
|
||||
//vis->Angle = thing->Angles.Yaw;
|
||||
|
@ -184,7 +184,7 @@ namespace swrenderer
|
|||
vis->xiscale = iscale;
|
||||
}
|
||||
|
||||
vis->startfrac += (fixed_t)(vis->xiscale * (vis->x1 - r_viewwindow.centerx + 0.5 - dtx1));
|
||||
vis->startfrac += (fixed_t)(vis->xiscale * (vis->x1 - viewport->viewwindow.centerx + 0.5 - dtx1));
|
||||
|
||||
// killough 3/27/98: save sector for special clipping later
|
||||
vis->heightsec = heightsec;
|
||||
|
@ -194,8 +194,8 @@ namespace swrenderer
|
|||
vis->gpos = { (float)pos.X, (float)pos.Y, (float)pos.Z };
|
||||
vis->gzb = (float)gzb; // [RH] use gzb, not thing->z
|
||||
vis->gzt = (float)gzt; // killough 3/27/98
|
||||
vis->deltax = float(pos.X - r_viewpoint.Pos.X);
|
||||
vis->deltay = float(pos.Y - r_viewpoint.Pos.Y);
|
||||
vis->deltax = float(pos.X - viewport->viewpoint.Pos.X);
|
||||
vis->deltay = float(pos.Y - viewport->viewpoint.Pos.Y);
|
||||
vis->renderflags = renderflags;
|
||||
if (thing->flags5 & MF5_BRIGHT)
|
||||
vis->renderflags |= RF_FULLBRIGHT; // kg3D
|
||||
|
@ -308,7 +308,7 @@ namespace swrenderer
|
|||
|
||||
FDynamicColormap *basecolormap = static_cast<FDynamicColormap*>(vis->Light.BaseColormap);
|
||||
|
||||
bool visible = drawerargs.SetStyle(vis->RenderStyle, vis->Alpha, vis->Translation, vis->FillColor, basecolormap, vis->Light.ColormapNum << FRACBITS);
|
||||
bool visible = drawerargs.SetStyle(thread->Viewport.get(), vis->RenderStyle, vis->Alpha, vis->Translation, vis->FillColor, basecolormap, vis->Light.ColormapNum << FRACBITS);
|
||||
|
||||
if (visible)
|
||||
{
|
||||
|
@ -320,7 +320,7 @@ namespace swrenderer
|
|||
xiscale = vis->xiscale;
|
||||
double texturemid = vis->texturemid;
|
||||
|
||||
auto viewport = RenderViewport::Instance();
|
||||
auto viewport = thread->Viewport.get();
|
||||
|
||||
if (vis->renderflags & RF_YFLIP)
|
||||
{
|
||||
|
|
|
@ -95,7 +95,7 @@ namespace swrenderer
|
|||
{
|
||||
if (!(clip3d->fake3D & FAKE3D_CLIPTOP))
|
||||
{
|
||||
clip3d->sclipTop = spr->sector->ceilingplane.ZatPoint(r_viewpoint.Pos);
|
||||
clip3d->sclipTop = spr->sector->ceilingplane.ZatPoint(thread->Viewport->viewpoint.Pos);
|
||||
}
|
||||
sector_t *sec = nullptr;
|
||||
FDynamicColormap *mybasecolormap = nullptr;
|
||||
|
@ -138,7 +138,7 @@ namespace swrenderer
|
|||
bool isFullBright = !foggy && (renderflags & RF_FULLBRIGHT);
|
||||
bool fadeToBlack = spr->RenderStyle == LegacyRenderStyles[STYLE_Add] && mybasecolormap->Fade != 0;
|
||||
|
||||
int spriteshade = LightVisibility::LightLevelToShade(sec->lightlevel + LightVisibility::ActualExtraLight(spr->foggy), foggy);
|
||||
int spriteshade = LightVisibility::LightLevelToShade(sec->lightlevel + LightVisibility::ActualExtraLight(spr->foggy, thread->Viewport.get()), foggy);
|
||||
|
||||
Light.SetColormap(LightVisibility::Instance()->SpriteGlobVis(foggy) / MAX(MINZ, (double)spr->depth), spriteshade, mybasecolormap, isFullBright, invertcolormap, fadeToBlack);
|
||||
}
|
||||
|
@ -154,7 +154,7 @@ namespace swrenderer
|
|||
// Clip the sprite against deep water and/or fake ceilings.
|
||||
// [RH] rewrote this to be based on which part of the sector is really visible
|
||||
|
||||
auto viewport = RenderViewport::Instance();
|
||||
auto viewport = thread->Viewport.get();
|
||||
|
||||
double scale = viewport->InvZtoScale * spr->idepth;
|
||||
double hzb = -DBL_MAX, hzt = DBL_MAX;
|
||||
|
@ -169,7 +169,7 @@ namespace swrenderer
|
|||
if (spr->FakeFlatStat != WaterFakeSide::AboveCeiling)
|
||||
{
|
||||
double hz = spr->heightsec->floorplane.ZatPoint(spr->gpos);
|
||||
int h = xs_RoundToInt(viewport->CenterY - (hz - r_viewpoint.Pos.Z) * scale);
|
||||
int h = xs_RoundToInt(viewport->CenterY - (hz - viewport->viewpoint.Pos.Z) * scale);
|
||||
|
||||
if (spr->FakeFlatStat == WaterFakeSide::BelowFloor)
|
||||
{ // seen below floor: clip top
|
||||
|
@ -191,7 +191,7 @@ namespace swrenderer
|
|||
if (spr->FakeFlatStat != WaterFakeSide::BelowFloor && !(spr->heightsec->MoreFlags & SECF_FAKEFLOORONLY))
|
||||
{
|
||||
double hz = spr->heightsec->ceilingplane.ZatPoint(spr->gpos);
|
||||
int h = xs_RoundToInt(viewport->CenterY - (hz - r_viewpoint.Pos.Z) * scale);
|
||||
int h = xs_RoundToInt(viewport->CenterY - (hz - viewport->viewpoint.Pos.Z) * scale);
|
||||
|
||||
if (spr->FakeFlatStat == WaterFakeSide::AboveCeiling)
|
||||
{ // seen above ceiling: clip bottom
|
||||
|
@ -230,12 +230,12 @@ namespace swrenderer
|
|||
if (spr->fakefloor)
|
||||
{
|
||||
double floorz = spr->fakefloor->top.plane->Zat0();
|
||||
if (r_viewpoint.Pos.Z > floorz && floorz == clip3d->sclipBottom)
|
||||
if (viewport->viewpoint.Pos.Z > floorz && floorz == clip3d->sclipBottom)
|
||||
{
|
||||
hz = spr->fakefloor->bottom.plane->Zat0();
|
||||
}
|
||||
}
|
||||
int h = xs_RoundToInt(viewport->CenterY - (hz - r_viewpoint.Pos.Z) * scale);
|
||||
int h = xs_RoundToInt(viewport->CenterY - (hz - viewport->viewpoint.Pos.Z) * scale);
|
||||
if (h < botclip)
|
||||
{
|
||||
botclip = MAX<short>(0, h);
|
||||
|
@ -251,12 +251,12 @@ namespace swrenderer
|
|||
if (spr->fakeceiling != nullptr)
|
||||
{
|
||||
double ceilingZ = spr->fakeceiling->bottom.plane->Zat0();
|
||||
if (r_viewpoint.Pos.Z < ceilingZ && ceilingZ == clip3d->sclipTop)
|
||||
if (viewport->viewpoint.Pos.Z < ceilingZ && ceilingZ == clip3d->sclipTop)
|
||||
{
|
||||
hz = spr->fakeceiling->top.plane->Zat0();
|
||||
}
|
||||
}
|
||||
int h = xs_RoundToInt(viewport->CenterY - (hz - r_viewpoint.Pos.Z) * scale);
|
||||
int h = xs_RoundToInt(viewport->CenterY - (hz - viewport->viewpoint.Pos.Z) * scale);
|
||||
if (h > topclip)
|
||||
{
|
||||
topclip = short(MIN(h, viewheight));
|
||||
|
|
|
@ -45,11 +45,11 @@ namespace swrenderer
|
|||
void RenderVoxel::Project(RenderThread *thread, AActor *thing, DVector3 pos, FVoxelDef *voxel, const DVector2 &spriteScale, int renderflags, WaterFakeSide fakeside, F3DFloor *fakefloor, F3DFloor *fakeceiling, sector_t *current_sector, int spriteshade, bool foggy, FDynamicColormap *basecolormap)
|
||||
{
|
||||
// transform the origin point
|
||||
double tr_x = pos.X - r_viewpoint.Pos.X;
|
||||
double tr_y = pos.Y - r_viewpoint.Pos.Y;
|
||||
double tr_x = pos.X - thread->Viewport->viewpoint.Pos.X;
|
||||
double tr_y = pos.Y - thread->Viewport->viewpoint.Pos.Y;
|
||||
|
||||
double tz = tr_x * r_viewpoint.TanCos + tr_y * r_viewpoint.TanSin;
|
||||
double tx = tr_x * r_viewpoint.Sin - tr_y * r_viewpoint.Cos;
|
||||
double tz = tr_x * thread->Viewport->viewpoint.TanCos + tr_y * thread->Viewport->viewpoint.TanSin;
|
||||
double tx = tr_x * thread->Viewport->viewpoint.Sin - tr_y * thread->Viewport->viewpoint.Cos;
|
||||
|
||||
// [RH] Flip for mirrors
|
||||
RenderPortal *renderportal = thread->Portal.get();
|
||||
|
@ -121,8 +121,8 @@ namespace swrenderer
|
|||
vis->Angle -= ang;
|
||||
}
|
||||
|
||||
vis->pa.vpos = { (float)r_viewpoint.Pos.X, (float)r_viewpoint.Pos.Y, (float)r_viewpoint.Pos.Z };
|
||||
vis->pa.vang = FAngle((float)r_viewpoint.Angles.Yaw.Degrees);
|
||||
vis->pa.vpos = { (float)thread->Viewport->viewpoint.Pos.X, (float)thread->Viewport->viewpoint.Pos.Y, (float)thread->Viewport->viewpoint.Pos.Z };
|
||||
vis->pa.vang = FAngle((float)thread->Viewport->viewpoint.Angles.Yaw.Degrees);
|
||||
|
||||
// killough 3/27/98: save sector for special clipping later
|
||||
vis->heightsec = heightsec;
|
||||
|
@ -132,8 +132,8 @@ namespace swrenderer
|
|||
vis->gpos = { (float)pos.X, (float)pos.Y, (float)pos.Z };
|
||||
vis->gzb = (float)gzb; // [RH] use gzb, not thing->z
|
||||
vis->gzt = (float)gzt; // killough 3/27/98
|
||||
vis->deltax = float(pos.X - r_viewpoint.Pos.X);
|
||||
vis->deltay = float(pos.Y - r_viewpoint.Pos.Y);
|
||||
vis->deltax = float(pos.X - thread->Viewport->viewpoint.Pos.X);
|
||||
vis->deltay = float(pos.Y - thread->Viewport->viewpoint.Pos.Y);
|
||||
vis->renderflags = renderflags;
|
||||
if (thing->flags5 & MF5_BRIGHT)
|
||||
vis->renderflags |= RF_FULLBRIGHT; // kg3D
|
||||
|
@ -178,13 +178,13 @@ namespace swrenderer
|
|||
void RenderVoxel::Render(RenderThread *thread, short *cliptop, short *clipbottom, int minZ, int maxZ)
|
||||
{
|
||||
auto spr = this;
|
||||
auto viewport = RenderViewport::Instance();
|
||||
auto viewport = thread->Viewport.get();
|
||||
|
||||
SpriteDrawerArgs drawerargs;
|
||||
drawerargs.SetLight(spr->Light.BaseColormap, 0, spr->Light.ColormapNum << FRACBITS);
|
||||
|
||||
FDynamicColormap *basecolormap = (FDynamicColormap*)spr->Light.BaseColormap;
|
||||
bool visible = drawerargs.SetStyle(spr->RenderStyle, spr->Alpha, spr->Translation, spr->FillColor, basecolormap);
|
||||
bool visible = drawerargs.SetStyle(viewport, spr->RenderStyle, spr->Alpha, spr->Translation, spr->FillColor, basecolormap);
|
||||
if (!visible)
|
||||
return;
|
||||
|
||||
|
@ -265,11 +265,11 @@ namespace swrenderer
|
|||
FVoxelMipLevel *mip;
|
||||
int z1a[64], z2a[64], yplc[64];
|
||||
|
||||
auto viewport = RenderViewport::Instance();
|
||||
auto viewport = thread->Viewport.get();
|
||||
|
||||
const int nytooclose = r_viewwindow.centerxwide * 2100, nytoofar = 32768*32768 - 1048576;
|
||||
const int xdimenscale = FLOAT2FIXED(r_viewwindow.centerxwide * viewport->YaspectMul / 160);
|
||||
const double centerxwide_f = r_viewwindow.centerxwide;
|
||||
const int nytooclose = viewport->viewwindow.centerxwide * 2100, nytoofar = 32768*32768 - 1048576;
|
||||
const int xdimenscale = FLOAT2FIXED(viewport->viewwindow.centerxwide * viewport->YaspectMul / 160);
|
||||
const double centerxwide_f = viewport->viewwindow.centerxwide;
|
||||
const double centerxwidebig_f = centerxwide_f * 65536*65536*8;
|
||||
|
||||
// Convert to Build's coordinate system.
|
||||
|
@ -315,8 +315,8 @@ namespace swrenderer
|
|||
daxscale <<= (k+8); dayscale <<= (k+8);
|
||||
dazscale = FixedDiv(dayscale, FLOAT2FIXED(viewport->BaseYaspectMul));
|
||||
daxscale = fixed_t(daxscale / viewport->YaspectMul);
|
||||
daxscale = Scale(daxscale, xdimenscale, r_viewwindow.centerxwide << 9);
|
||||
dayscale = Scale(dayscale, FixedMul(xdimenscale, viewport->viewingrangerecip), r_viewwindow.centerxwide << 9);
|
||||
daxscale = Scale(daxscale, xdimenscale, viewport->viewwindow.centerxwide << 9);
|
||||
dayscale = Scale(dayscale, FixedMul(xdimenscale, viewport->viewingrangerecip), viewport->viewwindow.centerxwide << 9);
|
||||
|
||||
daxscalerecip = (1<<30) / daxscale;
|
||||
dayscalerecip = (1<<30) / dayscale;
|
||||
|
@ -432,9 +432,9 @@ namespace swrenderer
|
|||
voxend = (kvxslab_t *)(slabxoffs + xyoffs[y+1]);
|
||||
if (voxptr >= voxend) continue;
|
||||
|
||||
lx = xs_RoundToInt(nx * centerxwide_f / (ny + y1)) + r_viewwindow.centerx;
|
||||
lx = xs_RoundToInt(nx * centerxwide_f / (ny + y1)) + viewport->viewwindow.centerx;
|
||||
if (lx < 0) lx = 0;
|
||||
rx = xs_RoundToInt((nx + nxoff) * centerxwide_f / (ny + y2)) + r_viewwindow.centerx;
|
||||
rx = xs_RoundToInt((nx + nxoff) * centerxwide_f / (ny + y2)) + viewport->viewwindow.centerx;
|
||||
if (rx > viewwidth) rx = viewwidth;
|
||||
if (rx <= lx) continue;
|
||||
|
||||
|
@ -475,20 +475,20 @@ namespace swrenderer
|
|||
if (k < 0)
|
||||
{
|
||||
if ((voxptr->backfacecull & oand32) == 0) continue;
|
||||
z2 = MulScale32(l2, k) + r_viewwindow.centery; /* Below slab */
|
||||
z2 = MulScale32(l2, k) + viewport->viewwindow.centery; /* Below slab */
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((voxptr->backfacecull & oand) == 0) continue; /* Middle of slab */
|
||||
z2 = MulScale32(l1, k) + r_viewwindow.centery;
|
||||
z2 = MulScale32(l1, k) + viewport->viewwindow.centery;
|
||||
}
|
||||
z1 = MulScale32(l1, j) + r_viewwindow.centery;
|
||||
z1 = MulScale32(l1, j) + viewport->viewwindow.centery;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((voxptr->backfacecull & oand16) == 0) continue;
|
||||
z1 = MulScale32(l2, j) + r_viewwindow.centery; /* Above slab */
|
||||
z2 = MulScale32(l1, j + (zleng << 15)) + r_viewwindow.centery;
|
||||
z1 = MulScale32(l2, j) + viewport->viewwindow.centery; /* Above slab */
|
||||
z2 = MulScale32(l1, j + (zleng << 15)) + viewport->viewwindow.centery;
|
||||
}
|
||||
|
||||
if (z2 <= z1) continue;
|
||||
|
@ -560,7 +560,7 @@ namespace swrenderer
|
|||
|
||||
for (int x = xxl; x < xxr; ++x)
|
||||
{
|
||||
drawerargs.SetDest(lxt + x, z1);
|
||||
drawerargs.SetDest(viewport, lxt + x, z1);
|
||||
drawerargs.SetCount(z2 - z1);
|
||||
drawerargs.DrawVoxelColumn(thread, yplc[xxl], yinc, columnColors, zleng);
|
||||
}
|
||||
|
|
|
@ -82,8 +82,8 @@ namespace swrenderer
|
|||
x1 *= scale.X;
|
||||
x2 *= scale.X;
|
||||
|
||||
left.X = pos.X - x1 * angcos - r_viewpoint.Pos.X;
|
||||
left.Y = pos.Y - x1 * angsin - r_viewpoint.Pos.Y;
|
||||
left.X = pos.X - x1 * angcos - thread->Viewport->viewpoint.Pos.X;
|
||||
left.Y = pos.Y - x1 * angsin - thread->Viewport->viewpoint.Pos.Y;
|
||||
right.X = left.X + x2 * angcos;
|
||||
right.Y = right.Y + x2 * angsin;
|
||||
|
||||
|
@ -98,7 +98,7 @@ namespace swrenderer
|
|||
|
||||
// Sprite sorting should probably treat these as walls, not sprites,
|
||||
// but right now, I just want to get them drawing.
|
||||
tz = (pos.X - r_viewpoint.Pos.X) * r_viewpoint.TanCos + (pos.Y - r_viewpoint.Pos.Y) * r_viewpoint.TanSin;
|
||||
tz = (pos.X - thread->Viewport->viewpoint.Pos.X) * thread->Viewport->viewpoint.TanCos + (pos.Y - thread->Viewport->viewpoint.Pos.Y) * thread->Viewport->viewpoint.TanSin;
|
||||
|
||||
int scaled_to = pic->GetScaledTopOffset();
|
||||
int scaled_bo = scaled_to - pic->GetScaledHeight();
|
||||
|
@ -117,8 +117,8 @@ namespace swrenderer
|
|||
vis->gpos = { (float)pos.X, (float)pos.Y, (float)pos.Z };
|
||||
vis->gzb = (float)gzb;
|
||||
vis->gzt = (float)gzt;
|
||||
vis->deltax = float(pos.X - r_viewpoint.Pos.X);
|
||||
vis->deltay = float(pos.Y - r_viewpoint.Pos.Y);
|
||||
vis->deltax = float(pos.X - thread->Viewport->viewpoint.Pos.X);
|
||||
vis->deltay = float(pos.Y - thread->Viewport->viewpoint.Pos.Y);
|
||||
vis->renderflags = renderflags;
|
||||
if (thing->flags5 & MF5_BRIGHT) vis->renderflags |= RF_FULLBRIGHT; // kg3D
|
||||
vis->RenderStyle = thing->RenderStyle;
|
||||
|
@ -155,10 +155,10 @@ namespace swrenderer
|
|||
WallT.InitFromWallCoords(thread, &spr->wallc);
|
||||
|
||||
ProjectedWallTexcoords walltexcoords;
|
||||
walltexcoords.Project(spr->pic->GetWidth() << FRACBITS, x1, x2, WallT);
|
||||
walltexcoords.Project(thread->Viewport.get(), spr->pic->GetWidth() << FRACBITS, x1, x2, WallT);
|
||||
|
||||
iyscale = 1 / spr->yscale;
|
||||
double texturemid = (spr->gzt - r_viewpoint.Pos.Z) * iyscale;
|
||||
double texturemid = (spr->gzt - thread->Viewport->viewpoint.Pos.Z) * iyscale;
|
||||
if (spr->renderflags & RF_XFLIP)
|
||||
{
|
||||
int right = (spr->pic->GetWidth() << FRACBITS) - 1;
|
||||
|
@ -182,7 +182,7 @@ namespace swrenderer
|
|||
|
||||
SpriteDrawerArgs drawerargs;
|
||||
|
||||
int shade = LightVisibility::LightLevelToShade(spr->sector->lightlevel + LightVisibility::ActualExtraLight(spr->foggy), spr->foggy);
|
||||
int shade = LightVisibility::LightLevelToShade(spr->sector->lightlevel + LightVisibility::ActualExtraLight(spr->foggy, thread->Viewport.get()), spr->foggy);
|
||||
double GlobVis = LightVisibility::Instance()->WallGlobVis(foggy);
|
||||
float lightleft = float(GlobVis / spr->wallc.sz1);
|
||||
float lightstep = float((GlobVis / spr->wallc.sz2 - lightleft) / (spr->wallc.sx2 - spr->wallc.sx1));
|
||||
|
@ -216,7 +216,7 @@ namespace swrenderer
|
|||
|
||||
FDynamicColormap *basecolormap = static_cast<FDynamicColormap*>(spr->Light.BaseColormap);
|
||||
|
||||
bool visible = drawerargs.SetStyle(spr->RenderStyle, spr->Alpha, spr->Translation, spr->FillColor, basecolormap);
|
||||
bool visible = drawerargs.SetStyle(thread->Viewport.get(), spr->RenderStyle, spr->Alpha, spr->Translation, spr->FillColor, basecolormap);
|
||||
|
||||
// R_SetPatchStyle can modify basecolormap.
|
||||
if (rereadcolormap)
|
||||
|
@ -248,7 +248,7 @@ namespace swrenderer
|
|||
|
||||
void RenderWallSprite::DrawColumn(RenderThread *thread, SpriteDrawerArgs &drawerargs, int x, FTexture *WallSpriteTile, const ProjectedWallTexcoords &walltexcoords, double texturemid, float maskedScaleY, bool sprflipvert, const short *mfloorclip, const short *mceilingclip)
|
||||
{
|
||||
auto viewport = RenderViewport::Instance();
|
||||
auto viewport = thread->Viewport.get();
|
||||
|
||||
float iscale = walltexcoords.VStep[x] * maskedScaleY;
|
||||
double spryscale = 1 / iscale;
|
||||
|
|
|
@ -28,11 +28,11 @@ namespace swrenderer
|
|||
mTranslation = translation;
|
||||
}
|
||||
|
||||
uint8_t *DrawerArgs::Colormap() const
|
||||
uint8_t *DrawerArgs::Colormap(RenderViewport *viewport) const
|
||||
{
|
||||
if (mBaseColormap)
|
||||
{
|
||||
if (RenderViewport::Instance()->RenderTarget->IsBgra())
|
||||
if (viewport->RenderTarget->IsBgra())
|
||||
return mBaseColormap->Maps;
|
||||
else
|
||||
return mBaseColormap->Maps + (GETPALOOKUP(mLight, mShade) << COLORMAPSHIFT);
|
||||
|
|
|
@ -33,7 +33,7 @@ namespace swrenderer
|
|||
void SetLight(FSWColormap *base_colormap, float light, int shade);
|
||||
void SetTranslationMap(lighttable_t *translation);
|
||||
|
||||
uint8_t *Colormap() const;
|
||||
uint8_t *Colormap(RenderViewport *viewport) const;
|
||||
uint8_t *TranslationMap() const { return mTranslation; }
|
||||
|
||||
ShadeConstants ColormapConstants() const;
|
||||
|
|
|
@ -19,24 +19,24 @@ namespace swrenderer
|
|||
{
|
||||
void SkyDrawerArgs::DrawSingleSkyColumn(RenderThread *thread)
|
||||
{
|
||||
thread->Drawers()->DrawSingleSkyColumn(*this);
|
||||
thread->Drawers(dc_viewport)->DrawSingleSkyColumn(*this);
|
||||
}
|
||||
|
||||
void SkyDrawerArgs::DrawDoubleSkyColumn(RenderThread *thread)
|
||||
{
|
||||
thread->Drawers()->DrawDoubleSkyColumn(*this);
|
||||
thread->Drawers(dc_viewport)->DrawDoubleSkyColumn(*this);
|
||||
}
|
||||
|
||||
void SkyDrawerArgs::SetDest(int x, int y)
|
||||
void SkyDrawerArgs::SetDest(RenderViewport *viewport, int x, int y)
|
||||
{
|
||||
auto viewport = RenderViewport::Instance();
|
||||
dc_dest = viewport->GetDest(x, y);
|
||||
dc_dest_y = y;
|
||||
dc_viewport = viewport;
|
||||
}
|
||||
|
||||
void SkyDrawerArgs::SetFrontTexture(FTexture *texture, uint32_t column)
|
||||
void SkyDrawerArgs::SetFrontTexture(RenderViewport *viewport, FTexture *texture, uint32_t column)
|
||||
{
|
||||
if (RenderViewport::Instance()->RenderTarget->IsBgra())
|
||||
if (viewport->RenderTarget->IsBgra())
|
||||
{
|
||||
dc_source = (const uint8_t *)texture->GetColumnBgra(column, nullptr);
|
||||
dc_sourceheight = texture->GetHeight();
|
||||
|
@ -48,14 +48,14 @@ namespace swrenderer
|
|||
}
|
||||
}
|
||||
|
||||
void SkyDrawerArgs::SetBackTexture(FTexture *texture, uint32_t column)
|
||||
void SkyDrawerArgs::SetBackTexture(RenderViewport *viewport, FTexture *texture, uint32_t column)
|
||||
{
|
||||
if (texture == nullptr)
|
||||
{
|
||||
dc_source2 = nullptr;
|
||||
dc_sourceheight2 = 1;
|
||||
}
|
||||
else if (RenderViewport::Instance()->RenderTarget->IsBgra())
|
||||
else if (viewport->RenderTarget->IsBgra())
|
||||
{
|
||||
dc_source2 = (const uint8_t *)texture->GetColumnBgra(column, nullptr);
|
||||
dc_sourceheight2 = texture->GetHeight();
|
||||
|
|
|
@ -13,10 +13,10 @@ namespace swrenderer
|
|||
class SkyDrawerArgs : public DrawerArgs
|
||||
{
|
||||
public:
|
||||
void SetDest(int x, int y);
|
||||
void SetDest(RenderViewport *viewport, int x, int y);
|
||||
void SetCount(int count) { dc_count = count; }
|
||||
void SetFrontTexture(FTexture *texture, uint32_t column);
|
||||
void SetBackTexture(FTexture *texture, uint32_t column);
|
||||
void SetFrontTexture(RenderViewport *viewport, FTexture *texture, uint32_t column);
|
||||
void SetBackTexture(RenderViewport *viewport, FTexture *texture, uint32_t column);
|
||||
void SetTextureVPos(uint32_t texturefrac) { dc_texturefrac = texturefrac; }
|
||||
void SetTextureVStep(uint32_t iscale) { dc_iscale = iscale; }
|
||||
void SetSolidTop(uint32_t color) { solid_top = color; }
|
||||
|
@ -39,6 +39,8 @@ namespace swrenderer
|
|||
int FrontTextureHeight() const { return dc_sourceheight; }
|
||||
int BackTextureHeight() const { return dc_sourceheight2; }
|
||||
|
||||
RenderViewport *Viewport() const { return dc_viewport; }
|
||||
|
||||
void DrawSingleSkyColumn(RenderThread *thread);
|
||||
void DrawDoubleSkyColumn(RenderThread *thread);
|
||||
|
||||
|
@ -55,5 +57,6 @@ namespace swrenderer
|
|||
uint32_t solid_top;
|
||||
uint32_t solid_bottom;
|
||||
bool fadeSky;
|
||||
RenderViewport *dc_viewport = nullptr;
|
||||
};
|
||||
}
|
||||
|
|
|
@ -22,7 +22,7 @@ namespace swrenderer
|
|||
spanfunc = &SWPixelFormatDrawers::DrawSpan;
|
||||
}
|
||||
|
||||
void SpanDrawerArgs::SetTexture(FTexture *tex)
|
||||
void SpanDrawerArgs::SetTexture(RenderViewport *viewport, FTexture *tex)
|
||||
{
|
||||
tex->GetWidth();
|
||||
ds_xbits = tex->WidthBits;
|
||||
|
@ -36,7 +36,6 @@ namespace swrenderer
|
|||
ds_ybits--;
|
||||
}
|
||||
|
||||
auto viewport = RenderViewport::Instance();
|
||||
ds_source = viewport->RenderTarget->IsBgra() ? (const uint8_t*)tex->GetPixelsBgra() : tex->GetPixels();
|
||||
ds_source_mipmapped = tex->Mipmapped() && tex->GetWidth() > 1 && tex->GetHeight() > 1;
|
||||
}
|
||||
|
@ -99,21 +98,30 @@ namespace swrenderer
|
|||
|
||||
void SpanDrawerArgs::DrawSpan(RenderThread *thread)
|
||||
{
|
||||
(thread->Drawers()->*spanfunc)(*this);
|
||||
(thread->Drawers(ds_viewport)->*spanfunc)(*this);
|
||||
}
|
||||
|
||||
void SpanDrawerArgs::DrawTiltedSpan(RenderThread *thread, int y, int x1, int x2, const FVector3 &plane_sz, const FVector3 &plane_su, const FVector3 &plane_sv, bool plane_shade, int planeshade, float planelightfloat, fixed_t pviewx, fixed_t pviewy, FDynamicColormap *basecolormap)
|
||||
{
|
||||
thread->Drawers()->DrawTiltedSpan(*this, y, x1, x2, plane_sz, plane_su, plane_sv, plane_shade, planeshade, planelightfloat, pviewx, pviewy, basecolormap);
|
||||
SetDestY(thread->Viewport.get(), y);
|
||||
SetDestX1(x1);
|
||||
SetDestX2(x2);
|
||||
thread->Drawers(ds_viewport)->DrawTiltedSpan(*this, plane_sz, plane_su, plane_sv, plane_shade, planeshade, planelightfloat, pviewx, pviewy, basecolormap);
|
||||
}
|
||||
|
||||
void SpanDrawerArgs::DrawFogBoundaryLine(RenderThread *thread, int y, int x1, int x2)
|
||||
{
|
||||
thread->Drawers()->DrawFogBoundaryLine(*this, y, x1, x2);
|
||||
SetDestY(thread->Viewport.get(), y);
|
||||
SetDestX1(x1);
|
||||
SetDestX2(x2);
|
||||
thread->Drawers(ds_viewport)->DrawFogBoundaryLine(*this);
|
||||
}
|
||||
|
||||
void SpanDrawerArgs::DrawColoredSpan(RenderThread *thread, int y, int x1, int x2)
|
||||
{
|
||||
thread->Drawers()->DrawColoredSpan(*this, y, x1, x2);
|
||||
SetDestY(thread->Viewport.get(), y);
|
||||
SetDestX1(x1);
|
||||
SetDestX2(x2);
|
||||
thread->Drawers(ds_viewport)->DrawColoredSpan(*this);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -16,10 +16,10 @@ namespace swrenderer
|
|||
SpanDrawerArgs();
|
||||
|
||||
void SetStyle(bool masked, bool additive, fixed_t alpha);
|
||||
void SetDestY(int y) { ds_y = y; }
|
||||
void SetDestY(RenderViewport *viewport, int y) { ds_viewport = viewport; ds_y = y; }
|
||||
void SetDestX1(int x) { ds_x1 = x; }
|
||||
void SetDestX2(int x) { ds_x2 = x; }
|
||||
void SetTexture(FTexture *tex);
|
||||
void SetTexture(RenderViewport *viewport, FTexture *tex);
|
||||
void SetTextureLOD(double lod) { ds_lod = lod; }
|
||||
void SetTextureUPos(dsfixed_t xfrac) { ds_xfrac = xfrac; }
|
||||
void SetTextureVPos(dsfixed_t yfrac) { ds_yfrac = yfrac; }
|
||||
|
@ -49,6 +49,7 @@ namespace swrenderer
|
|||
const uint8_t *TexturePixels() const { return ds_source; }
|
||||
bool MipmappedTexture() const { return ds_source_mipmapped; }
|
||||
double TextureLOD() const { return ds_lod; }
|
||||
RenderViewport *Viewport() const { return ds_viewport; }
|
||||
|
||||
FVector3 dc_normal;
|
||||
FVector3 dc_viewpos;
|
||||
|
@ -77,5 +78,6 @@ namespace swrenderer
|
|||
fixed_t dc_destalpha;
|
||||
int ds_color = 0;
|
||||
double ds_lod;
|
||||
RenderViewport *ds_viewport = nullptr;
|
||||
};
|
||||
}
|
||||
|
|
|
@ -48,7 +48,7 @@ namespace swrenderer
|
|||
if (x < thread->X1 || x >= thread->X2)
|
||||
return;
|
||||
|
||||
auto viewport = RenderViewport::Instance();
|
||||
auto viewport = thread->Viewport.get();
|
||||
|
||||
// Handle the linear filtered version in a different function to reduce chances of merge conflicts from zdoom.
|
||||
if (viewport->RenderTarget->IsBgra() && !drawer_needs_pal_input) // To do: add support to R_DrawColumnHoriz_rgba
|
||||
|
@ -57,6 +57,7 @@ namespace swrenderer
|
|||
return;
|
||||
}
|
||||
|
||||
dc_viewport = viewport;
|
||||
dc_x = x;
|
||||
dc_iscale = iscale;
|
||||
dc_textureheight = tex->GetHeight();
|
||||
|
@ -108,7 +109,7 @@ namespace swrenderer
|
|||
dc_texturefrac = FLOAT2FIXED((dc_yl + 0.5 - sprtopscreen) / spryscale);
|
||||
dc_source = column;
|
||||
dc_source2 = nullptr;
|
||||
SetDest(dc_x, dc_yl);
|
||||
SetDest(viewport, dc_x, dc_yl);
|
||||
dc_count = dc_yh - dc_yl + 1;
|
||||
|
||||
fixed_t maxfrac = ((top + length) << FRACBITS) - 1;
|
||||
|
@ -119,7 +120,7 @@ namespace swrenderer
|
|||
else if (dc_iscale < 0)
|
||||
dc_count = MIN(dc_count, (dc_texturefrac - dc_iscale) / (-dc_iscale));
|
||||
|
||||
(thread->Drawers()->*colfunc)(*this);
|
||||
(thread->Drawers(dc_viewport)->*colfunc)(*this);
|
||||
}
|
||||
span++;
|
||||
}
|
||||
|
@ -127,6 +128,7 @@ namespace swrenderer
|
|||
|
||||
void SpriteDrawerArgs::DrawMaskedColumnBgra(RenderThread *thread, int x, fixed_t iscale, FTexture *tex, fixed_t col, double spryscale, double sprtopscreen, bool sprflipvert, const short *mfloorclip, const short *mceilingclip, bool unmasked)
|
||||
{
|
||||
dc_viewport = thread->Viewport.get();
|
||||
dc_x = x;
|
||||
dc_iscale = iscale;
|
||||
|
||||
|
@ -228,13 +230,13 @@ namespace swrenderer
|
|||
|
||||
if (dc_yl <= dc_yh)
|
||||
{
|
||||
SetDest(dc_x, dc_yl);
|
||||
SetDest(dc_viewport, dc_x, dc_yl);
|
||||
dc_count = dc_yh - dc_yl + 1;
|
||||
|
||||
double v = ((dc_yl + 0.5 - sprtopscreen) / spryscale) / tex->GetHeight();
|
||||
dc_texturefrac = (uint32_t)(v * (1 << 30));
|
||||
|
||||
(thread->Drawers()->*colfunc)(*this);
|
||||
(thread->Drawers(dc_viewport)->*colfunc)(*this);
|
||||
}
|
||||
span++;
|
||||
}
|
||||
|
@ -376,7 +378,7 @@ namespace swrenderer
|
|||
}
|
||||
}
|
||||
|
||||
bool SpriteDrawerArgs::SetStyle(FRenderStyle style, fixed_t alpha, int translation, uint32_t color, FDynamicColormap *&basecolormap, fixed_t shadedlightshade)
|
||||
bool SpriteDrawerArgs::SetStyle(RenderViewport *viewport, FRenderStyle style, fixed_t alpha, int translation, uint32_t color, FDynamicColormap *&basecolormap, fixed_t shadedlightshade)
|
||||
{
|
||||
fixed_t fglevel, bglevel;
|
||||
|
||||
|
@ -408,8 +410,6 @@ namespace swrenderer
|
|||
alpha = clamp<fixed_t>(alpha, 0, OPAQUE);
|
||||
}
|
||||
|
||||
auto viewport = RenderViewport::Instance();
|
||||
|
||||
if (translation != -1)
|
||||
{
|
||||
SetTranslationMap(nullptr);
|
||||
|
@ -483,19 +483,19 @@ namespace swrenderer
|
|||
return SpriteDrawerArgs::SetBlendFunc(style.BlendOp, fglevel, bglevel, style.Flags);
|
||||
}
|
||||
|
||||
bool SpriteDrawerArgs::SetStyle(FRenderStyle style, float alpha, int translation, uint32_t color, FDynamicColormap *&basecolormap, fixed_t shadedlightshade)
|
||||
bool SpriteDrawerArgs::SetStyle(RenderViewport *viewport, FRenderStyle style, float alpha, int translation, uint32_t color, FDynamicColormap *&basecolormap, fixed_t shadedlightshade)
|
||||
{
|
||||
return SetStyle(style, FLOAT2FIXED(alpha), translation, color, basecolormap, shadedlightshade);
|
||||
return SetStyle(viewport, style, FLOAT2FIXED(alpha), translation, color, basecolormap, shadedlightshade);
|
||||
}
|
||||
|
||||
void SpriteDrawerArgs::FillColumn(RenderThread *thread)
|
||||
{
|
||||
thread->Drawers()->FillColumn(*this);
|
||||
thread->Drawers(dc_viewport)->FillColumn(*this);
|
||||
}
|
||||
|
||||
void SpriteDrawerArgs::DrawVoxelColumn(RenderThread *thread, fixed_t vPos, fixed_t vStep, const uint8_t *voxels, int voxelsCount)
|
||||
{
|
||||
if (RenderViewport::Instance()->RenderTarget->IsBgra())
|
||||
if (dc_viewport->RenderTarget->IsBgra())
|
||||
{
|
||||
double v = vPos / (double)voxelsCount / FRACUNIT;
|
||||
double vstep = vStep / (double)voxelsCount / FRACUNIT;
|
||||
|
@ -512,13 +512,13 @@ namespace swrenderer
|
|||
dc_source = voxels;
|
||||
dc_source2 = 0;
|
||||
dc_textureheight = voxelsCount;
|
||||
(thread->Drawers()->*colfunc)(*this);
|
||||
(thread->Drawers(dc_viewport)->*colfunc)(*this);
|
||||
}
|
||||
|
||||
void SpriteDrawerArgs::SetDest(int x, int y)
|
||||
void SpriteDrawerArgs::SetDest(RenderViewport *viewport, int x, int y)
|
||||
{
|
||||
auto viewport = RenderViewport::Instance();
|
||||
dc_dest = viewport->GetDest(x, y);
|
||||
dc_dest_y = y;
|
||||
dc_viewport = viewport;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -15,9 +15,9 @@ namespace swrenderer
|
|||
public:
|
||||
SpriteDrawerArgs();
|
||||
|
||||
bool SetStyle(FRenderStyle style, fixed_t alpha, int translation, uint32_t color, FDynamicColormap *&basecolormap, fixed_t shadedlightshade = 0);
|
||||
bool SetStyle(FRenderStyle style, float alpha, int translation, uint32_t color, FDynamicColormap *&basecolormap, fixed_t shadedlightshade = 0);
|
||||
void SetDest(int x, int y);
|
||||
bool SetStyle(RenderViewport *viewport, FRenderStyle style, fixed_t alpha, int translation, uint32_t color, FDynamicColormap *&basecolormap, fixed_t shadedlightshade = 0);
|
||||
bool SetStyle(RenderViewport *viewport, FRenderStyle style, float alpha, int translation, uint32_t color, FDynamicColormap *&basecolormap, fixed_t shadedlightshade = 0);
|
||||
void SetDest(RenderViewport *viewport, int x, int y);
|
||||
void SetCount(int count) { dc_count = count; }
|
||||
void SetSolidColor(int color) { dc_color = color; }
|
||||
void SetDynamicLight(uint32_t color) { dynlightcolor = color; }
|
||||
|
@ -54,6 +54,7 @@ namespace swrenderer
|
|||
uint32_t DynamicLight() const { return dynlightcolor; }
|
||||
|
||||
bool DrawerNeedsPalInput() const { return drawer_needs_pal_input; }
|
||||
RenderViewport *Viewport() const { return dc_viewport; }
|
||||
|
||||
private:
|
||||
bool SetBlendFunc(int op, fixed_t fglevel, fixed_t bglevel, int flags);
|
||||
|
@ -90,5 +91,7 @@ namespace swrenderer
|
|||
|
||||
typedef void(SWPixelFormatDrawers::*SpriteDrawerFunc)(const SpriteDrawerArgs &args);
|
||||
SpriteDrawerFunc colfunc;
|
||||
|
||||
RenderViewport *dc_viewport = nullptr;
|
||||
};
|
||||
}
|
||||
|
|
|
@ -40,12 +40,6 @@ CVAR(String, r_viewsize, "", CVAR_NOSET)
|
|||
|
||||
namespace swrenderer
|
||||
{
|
||||
RenderViewport *RenderViewport::Instance()
|
||||
{
|
||||
static RenderViewport instance;
|
||||
return &instance;
|
||||
}
|
||||
|
||||
RenderViewport::RenderViewport()
|
||||
{
|
||||
}
|
||||
|
@ -70,8 +64,8 @@ namespace swrenderer
|
|||
|
||||
fuzzviewheight = viewheight - 2; // Maximum row the fuzzer can draw to
|
||||
|
||||
CenterX = r_viewwindow.centerx;
|
||||
CenterY = r_viewwindow.centery;
|
||||
CenterX = viewwindow.centerx;
|
||||
CenterY = viewwindow.centery;
|
||||
|
||||
virtwidth = virtwidth2 = fullWidth;
|
||||
virtheight = virtheight2 = fullHeight;
|
||||
|
@ -85,13 +79,13 @@ namespace swrenderer
|
|||
virtwidth2 = virtwidth2 * AspectMultiplier(trueratio) / 48;
|
||||
}
|
||||
|
||||
if (AspectTallerThanWide(r_viewwindow.WidescreenRatio))
|
||||
if (AspectTallerThanWide(viewwindow.WidescreenRatio))
|
||||
{
|
||||
virtheight = virtheight * AspectMultiplier(r_viewwindow.WidescreenRatio) / 48;
|
||||
virtheight = virtheight * AspectMultiplier(viewwindow.WidescreenRatio) / 48;
|
||||
}
|
||||
else
|
||||
{
|
||||
virtwidth = virtwidth * AspectMultiplier(r_viewwindow.WidescreenRatio) / 48;
|
||||
virtwidth = virtwidth * AspectMultiplier(viewwindow.WidescreenRatio) / 48;
|
||||
}
|
||||
|
||||
BaseYaspectMul = 320.0 * virtheight2 / (r_Yaspect * virtwidth2);
|
||||
|
@ -108,7 +102,7 @@ namespace swrenderer
|
|||
|
||||
// Reset r_*Visibility vars
|
||||
LightVisibility *visibility = LightVisibility::Instance();
|
||||
visibility->SetVisibility(visibility->GetVisibility());
|
||||
visibility->SetVisibility(this, visibility->GetVisibility());
|
||||
|
||||
SetupBuffer();
|
||||
}
|
||||
|
@ -117,9 +111,9 @@ namespace swrenderer
|
|||
{
|
||||
double dy;
|
||||
|
||||
if (r_viewpoint.camera != NULL)
|
||||
if (viewpoint.camera != NULL)
|
||||
{
|
||||
dy = FocalLengthY * (-r_viewpoint.Angles.Pitch).Tan();
|
||||
dy = FocalLengthY * (-viewpoint.Angles.Pitch).Tan();
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -127,7 +121,7 @@ namespace swrenderer
|
|||
}
|
||||
|
||||
CenterY = (viewheight / 2.0) + dy;
|
||||
r_viewwindow.centery = xs_ToInt(CenterY);
|
||||
viewwindow.centery = xs_ToInt(CenterY);
|
||||
globaluclip = -CenterY / InvZtoScale;
|
||||
globaldclip = (viewheight - CenterY) / InvZtoScale;
|
||||
}
|
||||
|
@ -153,23 +147,23 @@ namespace swrenderer
|
|||
int i;
|
||||
|
||||
// Calc focallength so FieldOfView angles cover viewwidth.
|
||||
FocalLengthX = CenterX / r_viewwindow.FocalTangent;
|
||||
FocalLengthX = CenterX / viewwindow.FocalTangent;
|
||||
FocalLengthY = FocalLengthX * YaspectMul;
|
||||
|
||||
// This is 1/FocalTangent before the widescreen extension of FOV.
|
||||
viewingrangerecip = FLOAT2FIXED(1. / tan(r_viewpoint.FieldOfView.Radians() / 2));
|
||||
viewingrangerecip = FLOAT2FIXED(1. / tan(viewpoint.FieldOfView.Radians() / 2));
|
||||
|
||||
// Now generate xtoviewangle for sky texture mapping.
|
||||
// [RH] Do not generate viewangletox, because texture mapping is no
|
||||
// longer done with trig, so it's not needed.
|
||||
const double slopestep = r_viewwindow.FocalTangent / r_viewwindow.centerx;
|
||||
const double slopestep = viewwindow.FocalTangent / viewwindow.centerx;
|
||||
double slope;
|
||||
|
||||
for (i = r_viewwindow.centerx, slope = 0; i <= viewwidth; i++, slope += slopestep)
|
||||
for (i = viewwindow.centerx, slope = 0; i <= viewwidth; i++, slope += slopestep)
|
||||
{
|
||||
xtoviewangle[i] = angle_t((2 * M_PI - atan(slope)) * (ANGLE_180 / M_PI));
|
||||
}
|
||||
for (i = 0; i < r_viewwindow.centerx; i++)
|
||||
for (i = 0; i < viewwindow.centerx; i++)
|
||||
{
|
||||
xtoviewangle[i] = 0 - xtoviewangle[viewwidth - i - 1];
|
||||
}
|
||||
|
@ -177,23 +171,23 @@ namespace swrenderer
|
|||
|
||||
DVector2 RenderViewport::PointWorldToView(const DVector2 &worldPos) const
|
||||
{
|
||||
double translatedX = worldPos.X - r_viewpoint.Pos.X;
|
||||
double translatedY = worldPos.Y - r_viewpoint.Pos.Y;
|
||||
double translatedX = worldPos.X - viewpoint.Pos.X;
|
||||
double translatedY = worldPos.Y - viewpoint.Pos.Y;
|
||||
return {
|
||||
translatedX * r_viewpoint.Sin - translatedY * r_viewpoint.Cos,
|
||||
translatedX * r_viewpoint.TanCos + translatedY * r_viewpoint.TanSin
|
||||
translatedX * viewpoint.Sin - translatedY * viewpoint.Cos,
|
||||
translatedX * viewpoint.TanCos + translatedY * viewpoint.TanSin
|
||||
};
|
||||
}
|
||||
|
||||
DVector3 RenderViewport::PointWorldToView(const DVector3 &worldPos) const
|
||||
{
|
||||
double translatedX = worldPos.X - r_viewpoint.Pos.X;
|
||||
double translatedY = worldPos.Y - r_viewpoint.Pos.Y;
|
||||
double translatedZ = worldPos.Z - r_viewpoint.Pos.Z;
|
||||
double translatedX = worldPos.X - viewpoint.Pos.X;
|
||||
double translatedY = worldPos.Y - viewpoint.Pos.Y;
|
||||
double translatedZ = worldPos.Z - viewpoint.Pos.Z;
|
||||
return {
|
||||
translatedX * r_viewpoint.Sin - translatedY * r_viewpoint.Cos,
|
||||
translatedX * viewpoint.Sin - translatedY * viewpoint.Cos,
|
||||
translatedZ,
|
||||
translatedX * r_viewpoint.TanCos + translatedY * r_viewpoint.TanSin
|
||||
translatedX * viewpoint.TanCos + translatedY * viewpoint.TanSin
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -22,8 +22,6 @@ namespace swrenderer
|
|||
class RenderViewport
|
||||
{
|
||||
public:
|
||||
static RenderViewport *Instance();
|
||||
|
||||
RenderViewport();
|
||||
~RenderViewport();
|
||||
|
||||
|
@ -32,6 +30,9 @@ namespace swrenderer
|
|||
|
||||
DCanvas *RenderTarget = nullptr;
|
||||
|
||||
FViewWindow viewwindow;
|
||||
FRenderViewpoint viewpoint;
|
||||
|
||||
double FocalLengthX = 0.0;
|
||||
double FocalLengthY = 0.0;
|
||||
double InvZtoScale = 0.0;
|
||||
|
|
|
@ -17,16 +17,16 @@
|
|||
|
||||
namespace swrenderer
|
||||
{
|
||||
void WallDrawerArgs::SetDest(int x, int y)
|
||||
void WallDrawerArgs::SetDest(RenderViewport *viewport, int x, int y)
|
||||
{
|
||||
auto viewport = RenderViewport::Instance();
|
||||
dc_viewport = viewport;
|
||||
dc_dest = viewport->GetDest(x, y);
|
||||
dc_dest_y = y;
|
||||
}
|
||||
|
||||
void WallDrawerArgs::DrawColumn(RenderThread *thread)
|
||||
{
|
||||
(thread->Drawers()->*wallfunc)(*this);
|
||||
(thread->Drawers(dc_viewport)->*wallfunc)(*this);
|
||||
}
|
||||
|
||||
void WallDrawerArgs::SetStyle(bool masked, bool additive, fixed_t alpha)
|
||||
|
|
|
@ -9,12 +9,13 @@ struct FLightNode;
|
|||
namespace swrenderer
|
||||
{
|
||||
class RenderThread;
|
||||
class RenderViewport;
|
||||
|
||||
class WallDrawerArgs : public DrawerArgs
|
||||
{
|
||||
public:
|
||||
void SetStyle(bool masked, bool additive, fixed_t alpha);
|
||||
void SetDest(int x, int y);
|
||||
void SetDest(RenderViewport *viewport, int x, int y);
|
||||
void SetCount(int count) { dc_count = count; }
|
||||
void SetTexture(const uint8_t *pixels, const uint8_t *pixels2, int height)
|
||||
{
|
||||
|
@ -56,6 +57,8 @@ namespace swrenderer
|
|||
DrawerLight *dc_lights = nullptr;
|
||||
int dc_num_lights = 0;
|
||||
|
||||
RenderViewport *Viewport() const { return dc_viewport; }
|
||||
|
||||
private:
|
||||
uint8_t *dc_dest = nullptr;
|
||||
int dc_dest_y = 0;
|
||||
|
@ -76,5 +79,7 @@ namespace swrenderer
|
|||
|
||||
typedef void(SWPixelFormatDrawers::*WallDrawerFunc)(const WallDrawerArgs &args);
|
||||
WallDrawerFunc wallfunc = nullptr;
|
||||
|
||||
RenderViewport *dc_viewport = nullptr;
|
||||
};
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue