- move r_utility globals into r_viewpoint and r_viewwindow

- change r_utility functions to only work on FRenderViewpoint and FViewWindow
This commit is contained in:
Magnus Norddahl 2017-03-11 23:28:07 +01:00
parent 28aba3469d
commit 0c9014b984
75 changed files with 817 additions and 839 deletions

View file

@ -1959,13 +1959,13 @@ void AM_drawSubsectors()
double secx; double secx;
double secy; double secy;
double seczb, seczt; double seczb, seczt;
double cmpz = ViewPos.Z; double cmpz = r_viewpoint.Pos.Z;
if (players[consoleplayer].camera && sec == players[consoleplayer].camera->Sector) if (players[consoleplayer].camera && sec == players[consoleplayer].camera->Sector)
{ {
// For the actual camera sector use the current viewpoint as reference. // For the actual camera sector use the current viewpoint as reference.
secx = ViewPos.X; secx = r_viewpoint.Pos.X;
secy = ViewPos.Y; secy = r_viewpoint.Pos.Y;
} }
else else
{ {

View file

@ -111,6 +111,7 @@
#include "fragglescript/t_fs.h" #include "fragglescript/t_fs.h"
#include "g_levellocals.h" #include "g_levellocals.h"
#include "events.h" #include "events.h"
#include "r_utility.h"
EXTERN_CVAR(Bool, hud_althud) EXTERN_CVAR(Bool, hud_althud)
void DrawHUD(); void DrawHUD();
@ -124,7 +125,6 @@ void DrawHUD();
extern void ReadStatistics(); extern void ReadStatistics();
extern void M_RestoreMode (); extern void M_RestoreMode ();
extern void M_SetDefaultMode (); extern void M_SetDefaultMode ();
extern void R_ExecuteSetViewSize ();
extern void G_NewInit (); extern void G_NewInit ();
extern void SetupPlayerClasses (); extern void SetupPlayerClasses ();
extern void HUD_InitHud(); extern void HUD_InitHud();
@ -670,7 +670,7 @@ void D_Display ()
if (viewactive) if (viewactive)
{ {
R_SetFOV (players[consoleplayer].camera && players[consoleplayer].camera->player ? R_SetFOV (r_viewpoint, players[consoleplayer].camera && players[consoleplayer].camera->player ?
players[consoleplayer].camera->player->FOV : 90.f); players[consoleplayer].camera->player->FOV : 90.f);
} }
@ -700,7 +700,7 @@ void D_Display ()
// change the view size if needed // change the view size if needed
if (setsizeneeded && StatusBar != NULL) if (setsizeneeded && StatusBar != NULL)
{ {
R_ExecuteSetViewSize (); R_ExecuteSetViewSize (r_viewpoint, r_viewwindow);
} }
setmodeneeded = false; setmodeneeded = false;

View file

@ -776,12 +776,12 @@ void DStaticEventHandler::WorldTick()
static FRenderEvent E_SetupRenderEvent() static FRenderEvent E_SetupRenderEvent()
{ {
FRenderEvent e; FRenderEvent e;
e.ViewPos = ::ViewPos; e.ViewPos = r_viewpoint.Pos;
e.ViewAngle = ::ViewAngle; e.ViewAngle = r_viewpoint.Angles.Yaw;
e.ViewPitch = ::ViewPitch; e.ViewPitch = r_viewpoint.Angles.Pitch;
e.ViewRoll = ::ViewRoll; e.ViewRoll = r_viewpoint.Angles.Roll;
e.FracTic = ::r_TicFracF; e.FracTic = r_viewpoint.TicFrac;
e.Camera = ::camera; e.Camera = r_viewpoint.camera;
return e; return e;
} }

View file

@ -233,7 +233,7 @@ FString shotfile;
AActor* bodyque[BODYQUESIZE]; AActor* bodyque[BODYQUESIZE];
int bodyqueslot; int bodyqueslot;
void R_ExecuteSetViewSize (void); void R_ExecuteSetViewSize (FViewWindow &viewwindow);
FString savename; FString savename;
FString BackupSaveName; FString BackupSaveName;

View file

@ -159,7 +159,7 @@ void DEarthquake::Tick ()
double DEarthquake::GetModWave(double waveMultiplier) const double DEarthquake::GetModWave(double waveMultiplier) const
{ {
double time = m_Countdown - r_TicFracF; double time = m_Countdown - r_viewpoint.TicFrac;
return g_sin(waveMultiplier * time * (M_PI * 2 / TICRATE)); return g_sin(waveMultiplier * time * (M_PI * 2 / TICRATE));
} }

View file

@ -1101,13 +1101,13 @@ void DrawHUD()
} }
else else
{ {
if (AspectTallerThanWide(WidescreenRatio)) if (AspectTallerThanWide(r_viewwindow.WidescreenRatio))
{ {
hudheight = hudwidth * 30 / AspectMultiplier(WidescreenRatio); // BaseRatioSizes is inverted for this mode hudheight = hudwidth * 30 / AspectMultiplier(r_viewwindow.WidescreenRatio); // BaseRatioSizes is inverted for this mode
} }
else else
{ {
hudheight = hudwidth * 30 / (48*48/AspectMultiplier(WidescreenRatio)); hudheight = hudwidth * 30 / (48*48/AspectMultiplier(r_viewwindow.WidescreenRatio));
} }
} }
} }

View file

@ -611,7 +611,7 @@ void DBaseStatusBar::DrawCrosshair ()
ST_LoadCrosshair(); ST_LoadCrosshair();
// Don't draw the crosshair if there is none // Don't draw the crosshair if there is none
if (CrosshairImage == NULL || gamestate == GS_TITLELEVEL || camera->health <= 0) if (CrosshairImage == NULL || gamestate == GS_TITLELEVEL || r_viewpoint.camera->health <= 0)
{ {
return; return;
} }

View file

@ -557,7 +557,7 @@ private:
int bars = (CurrentPop == POP_Status) ? imgINVPOP : imgINVPOP2; int bars = (CurrentPop == POP_Status) ? imgINVPOP : imgINVPOP2;
int back = (CurrentPop == POP_Status) ? imgINVPBAK : imgINVPBAK2; int back = (CurrentPop == POP_Status) ? imgINVPBAK : imgINVPBAK2;
// Extrapolate the height of the popscreen for smoother movement // Extrapolate the height of the popscreen for smoother movement
int height = clamp<int> (PopHeight + int(r_TicFracF * PopHeightChange), -POP_HEIGHT, 0); int height = clamp<int> (PopHeight + int(r_viewpoint.TicFrac * PopHeightChange), -POP_HEIGHT, 0);
xscale = CleanXfac; xscale = CleanXfac;
yscale = CleanYfac; yscale = CleanYfac;
@ -608,7 +608,7 @@ private:
if (KeyPopScroll > 0) if (KeyPopScroll > 0)
{ {
// Extrapolate the scroll position for smoother scrolling // Extrapolate the scroll position for smoother scrolling
int scroll = MAX<int> (0,KeyPopScroll - int(r_TicFracF * (280./KEY_TIME))); int scroll = MAX<int> (0,KeyPopScroll - int(r_viewpoint.TicFrac * (280./KEY_TIME)));
pos -= 10; pos -= 10;
leftcol = leftcol - 280 + scroll; leftcol = leftcol - 280 + scroll;
} }

View file

@ -518,8 +518,8 @@ void GLWall::RenderFogBoundaryCompat()
// as the shader version but it's an acceptable compromise. // as the shader version but it's an acceptable compromise.
float fogdensity = gl_GetFogDensity(lightlevel, Colormap.FadeColor, Colormap.fogdensity); float fogdensity = gl_GetFogDensity(lightlevel, Colormap.FadeColor, Colormap.fogdensity);
float dist1 = Dist2(ViewPos.X, ViewPos.Y, glseg.x1, glseg.y1); float dist1 = Dist2(r_viewpoint.Pos.X, r_viewpoint.Pos.Y, glseg.x1, glseg.y1);
float dist2 = Dist2(ViewPos.X, ViewPos.Y, glseg.x2, glseg.y2); float dist2 = Dist2(r_viewpoint.Pos.X, r_viewpoint.Pos.Y, glseg.x2, glseg.y2);
// these values were determined by trial and error and are scale dependent! // these values were determined by trial and error and are scale dependent!
float fogd1 = (0.95f - exp(-fogdensity*dist1 / 62500.f)) * 1.05f; float fogd1 = (0.95f - exp(-fogdensity*dist1 / 62500.f)) * 1.05f;

View file

@ -4,6 +4,7 @@
#include "doomtype.h" #include "doomtype.h"
#include "vectors.h" #include "vectors.h"
#include "r_utility.h"
struct GLRenderSettings struct GLRenderSettings
{ {
@ -36,12 +37,11 @@ extern GLRenderSettings glset;
#include "a_sharedglobal.h" #include "a_sharedglobal.h"
#include "c_cvars.h" #include "c_cvars.h"
extern int extralight;
EXTERN_CVAR(Int, gl_weaponlight); EXTERN_CVAR(Int, gl_weaponlight);
inline int getExtraLight() inline int getExtraLight()
{ {
return extralight * gl_weaponlight; return r_viewpoint.extralight * gl_weaponlight;
} }
void gl_RecalcVertexHeights(vertex_t * v); void gl_RecalcVertexHeights(vertex_t * v);

View file

@ -1023,7 +1023,7 @@ void gl_RenderModel(GLSprite * spr)
if (spr->actor->renderflags & RF_INTERPOLATEANGLES) if (spr->actor->renderflags & RF_INTERPOLATEANGLES)
{ {
// [Nash] use interpolated angles // [Nash] use interpolated angles
DRotator Angles = spr->actor->InterpolatedAngles(r_TicFracF); DRotator Angles = spr->actor->InterpolatedAngles(r_viewpoint.TicFrac);
angle = Angles.Yaw.Degrees; angle = Angles.Yaw.Degrees;
} }

View file

@ -374,7 +374,7 @@ static inline void RenderThings(subsector_t * sub, sector_t * sector)
FIntCVar *cvar = thing->GetClass()->distancecheck; FIntCVar *cvar = thing->GetClass()->distancecheck;
if (cvar != NULL && *cvar >= 0) if (cvar != NULL && *cvar >= 0)
{ {
double dist = (thing->Pos() - ViewPos).LengthSquared(); double dist = (thing->Pos() - r_viewpoint.Pos).LengthSquared();
double check = (double)**cvar; double check = (double)**cvar;
if (dist >= check * check) if (dist >= check * check)
{ {
@ -391,7 +391,7 @@ static inline void RenderThings(subsector_t * sub, sector_t * sector)
FIntCVar *cvar = thing->GetClass()->distancecheck; FIntCVar *cvar = thing->GetClass()->distancecheck;
if (cvar != NULL && *cvar >= 0) if (cvar != NULL && *cvar >= 0)
{ {
double dist = (thing->Pos() - ViewPos).LengthSquared(); double dist = (thing->Pos() - r_viewpoint.Pos).LengthSquared();
double check = (double)**cvar; double check = (double)**cvar;
if (dist >= check * check) if (dist >= check * check)
{ {

View file

@ -393,14 +393,14 @@ fixed_t viewx, viewy;
void R_SetView() void R_SetView()
{ {
viewx = FLOAT2FIXED(ViewPos.X); viewx = FLOAT2FIXED(r_viewpoint.Pos.X);
viewy = FLOAT2FIXED(ViewPos.Y); viewy = FLOAT2FIXED(r_viewpoint.Pos.Y);
} }
angle_t R_PointToPseudoAngle(double x, double y) angle_t R_PointToPseudoAngle(double x, double y)
{ {
double vecx = x - ViewPos.X; double vecx = x - r_viewpoint.Pos.X;
double vecy = y - ViewPos.Y; double vecy = y - r_viewpoint.Pos.Y;
if (vecx == 0 && vecy == 0) if (vecx == 0 && vecy == 0)
{ {
@ -451,8 +451,8 @@ bool Clipper::CheckBox(const float *bspcoord)
// Find the corners of the box // Find the corners of the box
// that define the edges from current viewpoint. // that define the edges from current viewpoint.
boxpos = (ViewPos.X <= bspcoord[BOXLEFT] ? 0 : ViewPos.X < bspcoord[BOXRIGHT ] ? 1 : 2) + boxpos = (r_viewpoint.Pos.X <= bspcoord[BOXLEFT] ? 0 : r_viewpoint.Pos.X < bspcoord[BOXRIGHT ] ? 1 : 2) +
(ViewPos.Y >= bspcoord[BOXTOP ] ? 0 : ViewPos.Y > bspcoord[BOXBOTTOM] ? 4 : 8); (r_viewpoint.Pos.Y >= bspcoord[BOXTOP ] ? 0 : r_viewpoint.Pos.Y > bspcoord[BOXBOTTOM] ? 4 : 8);
if (boxpos == 5) return true; if (boxpos == 5) return true;

View file

@ -299,7 +299,7 @@ void GLDrawList::SortWallIntoPlane(SortNode * head,SortNode * sort)
GLFlat * fh=&flats[drawitems[head->itemindex].index]; GLFlat * fh=&flats[drawitems[head->itemindex].index];
GLWall * ws=&walls[drawitems[sort->itemindex].index]; GLWall * ws=&walls[drawitems[sort->itemindex].index];
bool ceiling = fh->z > ViewPos.Z; bool ceiling = fh->z > r_viewpoint.Pos.Z;
if ((ws->ztop[0] > fh->z || ws->ztop[1] > fh->z) && (ws->zbottom[0] < fh->z || ws->zbottom[1] < fh->z)) if ((ws->ztop[0] > fh->z || ws->ztop[1] > fh->z) && (ws->zbottom[0] < fh->z || ws->zbottom[1] < fh->z))
{ {
@ -362,7 +362,7 @@ void GLDrawList::SortSpriteIntoPlane(SortNode * head,SortNode * sort)
GLFlat * fh=&flats[drawitems[head->itemindex].index]; GLFlat * fh=&flats[drawitems[head->itemindex].index];
GLSprite * ss=&sprites[drawitems[sort->itemindex].index]; GLSprite * ss=&sprites[drawitems[sort->itemindex].index];
bool ceiling = fh->z > ViewPos.Z; bool ceiling = fh->z > r_viewpoint.Pos.Z;
if ((ss->z1>fh->z && ss->z2<fh->z) || ss->modelframe) if ((ss->z1>fh->z && ss->z2<fh->z) || ss->modelframe)
{ {
@ -770,7 +770,7 @@ void GLDrawList::DoDrawSorted(SortNode * head)
if (drawitems[head->itemindex].rendertype == GLDIT_FLAT) if (drawitems[head->itemindex].rendertype == GLDIT_FLAT)
{ {
z = flats[drawitems[head->itemindex].index].z; z = flats[drawitems[head->itemindex].index].z;
relation = z > ViewPos.Z ? 1 : -1; relation = z > r_viewpoint.Pos.Z ? 1 : -1;
} }
@ -1186,9 +1186,9 @@ void FDrawInfo::DrawFloodedPlane(wallseg * ws, float planez, sector_t * sec, boo
gl_SetFog(lightlevel, rel, &Colormap, false); gl_SetFog(lightlevel, rel, &Colormap, false);
gl_RenderState.SetMaterial(gltexture, CLAMP_NONE, 0, -1, false); gl_RenderState.SetMaterial(gltexture, CLAMP_NONE, 0, -1, false);
float fviewx = ViewPos.X; float fviewx = r_viewpoint.Pos.X;
float fviewy = ViewPos.Y; float fviewy = r_viewpoint.Pos.Y;
float fviewz = ViewPos.Z; float fviewz = r_viewpoint.Pos.Z;
gl_SetPlaneTextureRotation(&plane, gltexture); gl_SetPlaneTextureRotation(&plane, gltexture);
gl_RenderState.Apply(); gl_RenderState.Apply();
@ -1239,7 +1239,7 @@ void FDrawInfo::FloodUpperGap(seg_t * seg)
double frontz = fakefsector->ceilingplane.ZatPoint(seg->v1); double frontz = fakefsector->ceilingplane.ZatPoint(seg->v1);
if (fakebsector->GetTexture(sector_t::ceiling)==skyflatnum) return; if (fakebsector->GetTexture(sector_t::ceiling)==skyflatnum) return;
if (backz < ViewPos.Z) return; if (backz < r_viewpoint.Pos.Z) return;
if (seg->sidedef == seg->linedef->sidedef[0]) if (seg->sidedef == seg->linedef->sidedef[0])
{ {
@ -1292,7 +1292,7 @@ void FDrawInfo::FloodLowerGap(seg_t * seg)
if (fakebsector->GetTexture(sector_t::floor) == skyflatnum) return; if (fakebsector->GetTexture(sector_t::floor) == skyflatnum) return;
if (fakebsector->GetPlaneTexZ(sector_t::floor) > ViewPos.Z) return; if (fakebsector->GetPlaneTexZ(sector_t::floor) > r_viewpoint.Pos.Z) return;
if (seg->sidedef == seg->linedef->sidedef[0]) if (seg->sidedef == seg->linedef->sidedef[0])
{ {

View file

@ -611,7 +611,7 @@ void GLFlat::ProcessSector(sector_t * frontsector)
// //
// //
// //
if (frontsector->floorplane.ZatPoint(ViewPos) <= ViewPos.Z) if (frontsector->floorplane.ZatPoint(r_viewpoint.Pos) <= r_viewpoint.Pos.Z)
{ {
// process the original floor first. // process the original floor first.
@ -671,7 +671,7 @@ void GLFlat::ProcessSector(sector_t * frontsector)
// //
// //
// //
if (frontsector->ceilingplane.ZatPoint(ViewPos) >= ViewPos.Z) if (frontsector->ceilingplane.ZatPoint(r_viewpoint.Pos) >= r_viewpoint.Pos.Z)
{ {
// process the original ceiling first. // process the original ceiling first.
@ -761,7 +761,7 @@ void GLFlat::ProcessSector(sector_t * frontsector)
double ff_top = rover->top.plane->ZatPoint(sector->centerspot); double ff_top = rover->top.plane->ZatPoint(sector->centerspot);
if (ff_top < lastceilingheight) if (ff_top < lastceilingheight)
{ {
if (ViewPos.Z <= rover->top.plane->ZatPoint(ViewPos)) if (r_viewpoint.Pos.Z <= rover->top.plane->ZatPoint(r_viewpoint.Pos))
{ {
SetFrom3DFloor(rover, true, !!(rover->flags&FF_FOG)); SetFrom3DFloor(rover, true, !!(rover->flags&FF_FOG));
Colormap.FadeColor = frontsector->ColorMap->Fade; Colormap.FadeColor = frontsector->ColorMap->Fade;
@ -775,7 +775,7 @@ void GLFlat::ProcessSector(sector_t * frontsector)
double ff_bottom = rover->bottom.plane->ZatPoint(sector->centerspot); double ff_bottom = rover->bottom.plane->ZatPoint(sector->centerspot);
if (ff_bottom < lastceilingheight) if (ff_bottom < lastceilingheight)
{ {
if (ViewPos.Z <= rover->bottom.plane->ZatPoint(ViewPos)) if (r_viewpoint.Pos.Z <= rover->bottom.plane->ZatPoint(r_viewpoint.Pos))
{ {
SetFrom3DFloor(rover, false, !(rover->flags&FF_FOG)); SetFrom3DFloor(rover, false, !(rover->flags&FF_FOG));
Colormap.FadeColor = frontsector->ColorMap->Fade; Colormap.FadeColor = frontsector->ColorMap->Fade;
@ -801,7 +801,7 @@ void GLFlat::ProcessSector(sector_t * frontsector)
double ff_bottom = rover->bottom.plane->ZatPoint(sector->centerspot); double ff_bottom = rover->bottom.plane->ZatPoint(sector->centerspot);
if (ff_bottom > lastfloorheight || (rover->flags&FF_FIX)) if (ff_bottom > lastfloorheight || (rover->flags&FF_FIX))
{ {
if (ViewPos.Z >= rover->bottom.plane->ZatPoint(ViewPos)) if (r_viewpoint.Pos.Z >= rover->bottom.plane->ZatPoint(r_viewpoint.Pos))
{ {
SetFrom3DFloor(rover, false, !(rover->flags&FF_FOG)); SetFrom3DFloor(rover, false, !(rover->flags&FF_FOG));
Colormap.FadeColor = frontsector->ColorMap->Fade; Colormap.FadeColor = frontsector->ColorMap->Fade;
@ -822,7 +822,7 @@ void GLFlat::ProcessSector(sector_t * frontsector)
double ff_top = rover->top.plane->ZatPoint(sector->centerspot); double ff_top = rover->top.plane->ZatPoint(sector->centerspot);
if (ff_top > lastfloorheight) if (ff_top > lastfloorheight)
{ {
if (ViewPos.Z >= rover->top.plane->ZatPoint(ViewPos)) if (r_viewpoint.Pos.Z >= rover->top.plane->ZatPoint(r_viewpoint.Pos))
{ {
SetFrom3DFloor(rover, true, !!(rover->flags&FF_FOG)); SetFrom3DFloor(rover, true, !!(rover->flags&FF_FOG));
Colormap.FadeColor = frontsector->ColorMap->Fade; Colormap.FadeColor = frontsector->ColorMap->Fade;

View file

@ -72,8 +72,6 @@ EXTERN_CVAR(Bool, gl_portals)
EXTERN_CVAR(Bool, gl_noquery) EXTERN_CVAR(Bool, gl_noquery)
EXTERN_CVAR(Int, r_mirror_recursions) EXTERN_CVAR(Int, r_mirror_recursions)
extern bool r_showviewer;
TArray<GLPortal *> GLPortal::portals; TArray<GLPortal *> GLPortal::portals;
TArray<float> GLPortal::planestack; TArray<float> GLPortal::planestack;
int GLPortal::recursion; int GLPortal::recursion;
@ -284,15 +282,15 @@ bool GLPortal::Start(bool usestencil, bool doquery)
} }
// save viewpoint // save viewpoint
savedViewPos = ViewPos; savedViewPos = r_viewpoint.Pos;
savedViewActorPos = ViewActorPos; savedViewActorPos = r_viewpoint.ActorPos;
savedshowviewer = r_showviewer; savedshowviewer = r_viewpoint.showviewer;
savedAngle = ViewAngle; savedAngles = r_viewpoint.Angles;
savedviewactor=GLRenderer->mViewActor; savedviewactor=GLRenderer->mViewActor;
savedviewarea=in_area; savedviewarea=in_area;
savedviewpath[0] = ViewPath[0]; savedviewpath[0] = r_viewpoint.Path[0];
savedviewpath[1] = ViewPath[1]; savedviewpath[1] = r_viewpoint.Path[1];
savedvisibility = camera ? camera->renderflags & RF_MAYBEINVISIBLE : ActorRenderFlags::FromInt(0); savedvisibility = r_viewpoint.camera ? r_viewpoint.camera->renderflags & RF_MAYBEINVISIBLE : ActorRenderFlags::FromInt(0);
PrevPortal = GLRenderer->mCurrentPortal; PrevPortal = GLRenderer->mCurrentPortal;
@ -308,7 +306,7 @@ bool GLPortal::Start(bool usestencil, bool doquery)
inline void GLPortal::ClearClipper() inline void GLPortal::ClearClipper()
{ {
DAngle angleOffset = deltaangle(savedAngle, ViewAngle); DAngle angleOffset = deltaangle(savedAngles.Yaw, r_viewpoint.Angles.Yaw);
clipper.Clear(); clipper.Clear();
@ -329,7 +327,7 @@ inline void GLPortal::ClearClipper()
// and finally clip it to the visible area // and finally clip it to the visible area
angle_t a1 = GLRenderer->FrustumAngle(); angle_t a1 = GLRenderer->FrustumAngle();
if (a1 < ANGLE_180) clipper.SafeAddClipRangeRealAngles(ViewAngle.BAMs() + a1, ViewAngle.BAMs() - a1); if (a1 < ANGLE_180) clipper.SafeAddClipRangeRealAngles(r_viewpoint.Angles.Yaw.BAMs() + a1, r_viewpoint.Angles.Yaw.BAMs() - a1);
// lock the parts that have just been clipped out. // lock the parts that have just been clipped out.
clipper.SetSilhouette(); clipper.SetSilhouette();
@ -354,16 +352,16 @@ void GLPortal::End(bool usestencil)
if (needdepth) FDrawInfo::EndDrawInfo(); if (needdepth) FDrawInfo::EndDrawInfo();
// Restore the old view // Restore the old view
ViewPath[0] = savedviewpath[0]; r_viewpoint.Path[0] = savedviewpath[0];
ViewPath[1] = savedviewpath[1]; r_viewpoint.Path[1] = savedviewpath[1];
ViewPos = savedViewPos; r_viewpoint.Pos = savedViewPos;
r_showviewer = savedshowviewer; r_viewpoint.showviewer = savedshowviewer;
ViewActorPos = savedViewActorPos; r_viewpoint.ActorPos = savedViewActorPos;
ViewAngle = savedAngle; r_viewpoint.Angles = savedAngles;
GLRenderer->mViewActor=savedviewactor; GLRenderer->mViewActor=savedviewactor;
in_area=savedviewarea; in_area=savedviewarea;
if (camera != nullptr) camera->renderflags = (camera->renderflags & ~RF_MAYBEINVISIBLE) | savedvisibility; if (r_viewpoint.camera != nullptr) r_viewpoint.camera->renderflags = (r_viewpoint.camera->renderflags & ~RF_MAYBEINVISIBLE) | savedvisibility;
GLRenderer->SetupView(ViewPos.X, ViewPos.Y, ViewPos.Z, ViewAngle, !!(MirrorFlag & 1), !!(PlaneMirrorFlag & 1)); GLRenderer->SetupView(r_viewpoint.Pos.X, r_viewpoint.Pos.Y, r_viewpoint.Pos.Z, r_viewpoint.Angles.Yaw, !!(MirrorFlag & 1), !!(PlaneMirrorFlag & 1));
{ {
ScopedColorMask colorMask(0, 0, 0, 0); // glColorMask(0, 0, 0, 0); // no graphics ScopedColorMask colorMask(0, 0, 0, 0); // glColorMask(0, 0, 0, 0); // no graphics
@ -415,14 +413,14 @@ void GLPortal::End(bool usestencil)
glDepthMask(true); glDepthMask(true);
} }
// Restore the old view // Restore the old view
r_showviewer = savedshowviewer; r_viewpoint.showviewer = savedshowviewer;
ViewActorPos = savedViewActorPos; r_viewpoint.ActorPos = savedViewActorPos;
ViewPos = savedViewPos; r_viewpoint.Pos = savedViewPos;
ViewAngle = savedAngle; r_viewpoint.Angles = savedAngles;
GLRenderer->mViewActor=savedviewactor; GLRenderer->mViewActor=savedviewactor;
in_area=savedviewarea; in_area=savedviewarea;
if (camera != nullptr) camera->renderflags |= savedvisibility; if (r_viewpoint.camera != nullptr) r_viewpoint.camera->renderflags |= savedvisibility;
GLRenderer->SetupView(ViewPos.X, ViewPos.Y, ViewPos.Z, ViewAngle, !!(MirrorFlag&1), !!(PlaneMirrorFlag&1)); GLRenderer->SetupView(r_viewpoint.Pos.X, r_viewpoint.Pos.Y, r_viewpoint.Pos.Z, r_viewpoint.Angles.Yaw, !!(MirrorFlag&1), !!(PlaneMirrorFlag&1));
// This draws a valid z-buffer into the stencil's contents to ensure it // This draws a valid z-buffer into the stencil's contents to ensure it
// doesn't get overwritten by the level's geometry. // doesn't get overwritten by the level's geometry.
@ -619,7 +617,7 @@ static int skyboxrecursion=0;
void GLSkyboxPortal::DrawContents() void GLSkyboxPortal::DrawContents()
{ {
int old_pm = PlaneMirrorMode; int old_pm = PlaneMirrorMode;
int saved_extralight = extralight; int saved_extralight = r_viewpoint.extralight;
if (skyboxrecursion >= 3) if (skyboxrecursion >= 3)
{ {
@ -630,29 +628,29 @@ void GLSkyboxPortal::DrawContents()
skyboxrecursion++; skyboxrecursion++;
AActor *origin = portal->mSkybox; AActor *origin = portal->mSkybox;
portal->mFlags |= PORTSF_INSKYBOX; portal->mFlags |= PORTSF_INSKYBOX;
extralight = 0; r_viewpoint.extralight = 0;
PlaneMirrorMode = 0; PlaneMirrorMode = 0;
bool oldclamp = gl_RenderState.SetDepthClamp(false); bool oldclamp = gl_RenderState.SetDepthClamp(false);
ViewPos = origin->InterpolatedPosition(r_TicFracF); r_viewpoint.Pos = origin->InterpolatedPosition(r_viewpoint.TicFrac);
ViewActorPos = origin->Pos(); r_viewpoint.ActorPos = origin->Pos();
ViewAngle += (origin->PrevAngles.Yaw + deltaangle(origin->PrevAngles.Yaw, origin->Angles.Yaw) * r_TicFracF); r_viewpoint.Angles.Yaw += (origin->PrevAngles.Yaw + deltaangle(origin->PrevAngles.Yaw, origin->Angles.Yaw) * r_viewpoint.TicFrac);
// Don't let the viewpoint be too close to a floor or ceiling // Don't let the viewpoint be too close to a floor or ceiling
double floorh = origin->Sector->floorplane.ZatPoint(origin->Pos()); double floorh = origin->Sector->floorplane.ZatPoint(origin->Pos());
double ceilh = origin->Sector->ceilingplane.ZatPoint(origin->Pos()); double ceilh = origin->Sector->ceilingplane.ZatPoint(origin->Pos());
if (ViewPos.Z < floorh + 4) ViewPos.Z = floorh + 4; if (r_viewpoint.Pos.Z < floorh + 4) r_viewpoint.Pos.Z = floorh + 4;
if (ViewPos.Z > ceilh - 4) ViewPos.Z = ceilh - 4; if (r_viewpoint.Pos.Z > ceilh - 4) r_viewpoint.Pos.Z = ceilh - 4;
GLRenderer->mViewActor = origin; GLRenderer->mViewActor = origin;
inskybox = true; inskybox = true;
GLRenderer->SetupView(ViewPos.X, ViewPos.Y, ViewPos.Z, ViewAngle, !!(MirrorFlag & 1), !!(PlaneMirrorFlag & 1)); GLRenderer->SetupView(r_viewpoint.Pos.X, r_viewpoint.Pos.Y, r_viewpoint.Pos.Z, r_viewpoint.Angles.Yaw, !!(MirrorFlag & 1), !!(PlaneMirrorFlag & 1));
GLRenderer->SetViewArea(); GLRenderer->SetViewArea();
ClearClipper(); ClearClipper();
int mapsection = R_PointInSubsector(ViewPos)->mapsection; int mapsection = R_PointInSubsector(r_viewpoint.Pos)->mapsection;
SaveMapSection(); SaveMapSection();
currentmapsection[mapsection >> 3] |= 1 << (mapsection & 7); currentmapsection[mapsection >> 3] |= 1 << (mapsection & 7);
@ -664,7 +662,7 @@ void GLSkyboxPortal::DrawContents()
skyboxrecursion--; skyboxrecursion--;
PlaneMirrorMode = old_pm; PlaneMirrorMode = old_pm;
extralight = saved_extralight; r_viewpoint.extralight = saved_extralight;
RestoreMapSection(); RestoreMapSection();
} }
@ -737,21 +735,21 @@ void GLSectorStackPortal::DrawContents()
{ {
FPortal *portal = origin; FPortal *portal = origin;
ViewPos += origin->mDisplacement; r_viewpoint.Pos += origin->mDisplacement;
ViewActorPos += origin->mDisplacement; r_viewpoint.ActorPos += origin->mDisplacement;
GLRenderer->mViewActor = NULL; GLRenderer->mViewActor = NULL;
// avoid recursions! // avoid recursions!
if (origin->plane != -1) instack[origin->plane]++; if (origin->plane != -1) instack[origin->plane]++;
GLRenderer->SetupView(ViewPos.X, ViewPos.Y, ViewPos.Z, ViewAngle, !!(MirrorFlag&1), !!(PlaneMirrorFlag&1)); GLRenderer->SetupView(r_viewpoint.Pos.X, r_viewpoint.Pos.Y, r_viewpoint.Pos.Z, r_viewpoint.Angles.Yaw, !!(MirrorFlag&1), !!(PlaneMirrorFlag&1));
SaveMapSection(); SaveMapSection();
SetupCoverage(); SetupCoverage();
ClearClipper(); ClearClipper();
// If the viewpoint is not within the portal, we need to invalidate the entire clip area. // If the viewpoint is not within the portal, we need to invalidate the entire clip area.
// The portal will re-validate the necessary parts when its subsectors get traversed. // The portal will re-validate the necessary parts when its subsectors get traversed.
subsector_t *sub = R_PointInSubsector(ViewPos); subsector_t *sub = R_PointInSubsector(r_viewpoint.Pos);
if (!(gl_drawinfo->ss_renderflags[sub - ::subsectors] & SSRF_SEEN)) if (!(gl_drawinfo->ss_renderflags[sub - ::subsectors] & SSRF_SEEN))
{ {
clipper.SafeAddClipRange(0, ANGLE_MAX); clipper.SafeAddClipRange(0, ANGLE_MAX);
@ -793,15 +791,15 @@ void GLPlaneMirrorPortal::DrawContents()
int old_pm = PlaneMirrorMode; int old_pm = PlaneMirrorMode;
// the player is always visible in a mirror. // the player is always visible in a mirror.
r_showviewer = true; r_viewpoint.showviewer = true;
double planez = origin->ZatPoint(ViewPos); double planez = origin->ZatPoint(r_viewpoint.Pos);
ViewPos.Z = 2 * planez - ViewPos.Z; r_viewpoint.Pos.Z = 2 * planez - r_viewpoint.Pos.Z;
GLRenderer->mViewActor = NULL; GLRenderer->mViewActor = NULL;
PlaneMirrorMode = origin->fC() < 0 ? -1 : 1; PlaneMirrorMode = origin->fC() < 0 ? -1 : 1;
PlaneMirrorFlag++; PlaneMirrorFlag++;
GLRenderer->SetupView(ViewPos.X, ViewPos.Y, ViewPos.Z, ViewAngle, !!(MirrorFlag & 1), !!(PlaneMirrorFlag & 1)); GLRenderer->SetupView(r_viewpoint.Pos.X, r_viewpoint.Pos.Y, r_viewpoint.Pos.Z, r_viewpoint.Angles.Yaw, !!(MirrorFlag & 1), !!(PlaneMirrorFlag & 1));
ClearClipper(); ClearClipper();
gl_RenderState.SetClipHeight(planez, PlaneMirrorMode < 0 ? -1.f : 1.f); gl_RenderState.SetClipHeight(planez, PlaneMirrorMode < 0 ? -1.f : 1.f);
@ -863,7 +861,7 @@ int GLLinePortal::ClipSeg(seg_t *seg)
{ {
return PClip_Inside; // should be handled properly. return PClip_Inside; // should be handled properly.
} }
return P_ClipLineToPortal(linedef, line(), ViewPos) ? PClip_InFront : PClip_Inside; return P_ClipLineToPortal(linedef, line(), r_viewpoint.Pos) ? PClip_InFront : PClip_Inside;
} }
int GLLinePortal::ClipSubsector(subsector_t *sub) int GLLinePortal::ClipSubsector(subsector_t *sub)
@ -910,32 +908,32 @@ void GLMirrorPortal::DrawContents()
} }
GLRenderer->mClipPortal = this; GLRenderer->mClipPortal = this;
DAngle StartAngle = ViewAngle; DAngle StartAngle = r_viewpoint.Angles.Yaw;
DVector3 StartPos = ViewPos; DVector3 StartPos = r_viewpoint.Pos;
vertex_t *v1 = linedef->v1; vertex_t *v1 = linedef->v1;
vertex_t *v2 = linedef->v2; vertex_t *v2 = linedef->v2;
// the player is always visible in a mirror. // the player is always visible in a mirror.
r_showviewer = true; r_viewpoint.showviewer = true;
// Reflect the current view behind the mirror. // Reflect the current view behind the mirror.
if (linedef->Delta().X == 0) if (linedef->Delta().X == 0)
{ {
// vertical mirror // vertical mirror
ViewPos.X = 2 * v1->fX() - StartPos.X; r_viewpoint.Pos.X = 2 * v1->fX() - StartPos.X;
// Compensation for reendering inaccuracies // Compensation for reendering inaccuracies
if (StartPos.X < v1->fX()) ViewPos.X -= 0.1; if (StartPos.X < v1->fX()) r_viewpoint.Pos.X -= 0.1;
else ViewPos.X += 0.1; else r_viewpoint.Pos.X += 0.1;
} }
else if (linedef->Delta().Y == 0) else if (linedef->Delta().Y == 0)
{ {
// horizontal mirror // horizontal mirror
ViewPos.Y = 2*v1->fY() - StartPos.Y; r_viewpoint.Pos.Y = 2*v1->fY() - StartPos.Y;
// Compensation for reendering inaccuracies // Compensation for reendering inaccuracies
if (StartPos.Y<v1->fY()) ViewPos.Y -= 0.1; if (StartPos.Y<v1->fY()) r_viewpoint.Pos.Y -= 0.1;
else ViewPos.Y += 0.1; else r_viewpoint.Pos.Y += 0.1;
} }
else else
{ {
@ -952,27 +950,27 @@ void GLMirrorPortal::DrawContents()
// the above two cases catch len == 0 // the above two cases catch len == 0
double r = ((x - x1)*dx + (y - y1)*dy) / (dx*dx + dy*dy); double r = ((x - x1)*dx + (y - y1)*dy) / (dx*dx + dy*dy);
ViewPos.X = (x1 + r * dx)*2 - x; r_viewpoint.Pos.X = (x1 + r * dx)*2 - x;
ViewPos.Y = (y1 + r * dy)*2 - y; r_viewpoint.Pos.Y = (y1 + r * dy)*2 - y;
// Compensation for reendering inaccuracies // Compensation for reendering inaccuracies
FVector2 v(-dx, dy); FVector2 v(-dx, dy);
v.MakeUnit(); v.MakeUnit();
ViewPos.X+= v[1] * renderdepth / 2; r_viewpoint.Pos.X+= v[1] * renderdepth / 2;
ViewPos.Y+= v[0] * renderdepth / 2; r_viewpoint.Pos.Y+= v[0] * renderdepth / 2;
} }
ViewAngle = linedef->Delta().Angle() * 2. - StartAngle; r_viewpoint.Angles.Yaw = linedef->Delta().Angle() * 2. - StartAngle;
GLRenderer->mViewActor = NULL; GLRenderer->mViewActor = NULL;
MirrorFlag++; MirrorFlag++;
GLRenderer->SetupView(ViewPos.X, ViewPos.Y, ViewPos.Z, ViewAngle, !!(MirrorFlag&1), !!(PlaneMirrorFlag&1)); GLRenderer->SetupView(r_viewpoint.Pos.X, r_viewpoint.Pos.Y, r_viewpoint.Pos.Z, r_viewpoint.Angles.Yaw, !!(MirrorFlag&1), !!(PlaneMirrorFlag&1));
clipper.Clear(); clipper.Clear();
angle_t af = GLRenderer->FrustumAngle(); angle_t af = GLRenderer->FrustumAngle();
if (af<ANGLE_180) clipper.SafeAddClipRangeRealAngles(ViewAngle.BAMs()+af, ViewAngle.BAMs()-af); if (af<ANGLE_180) clipper.SafeAddClipRangeRealAngles(r_viewpoint.Angles.Yaw.BAMs()+af, r_viewpoint.Angles.Yaw.BAMs()-af);
angle_t a2 = linedef->v1->GetClipAngle(); angle_t a2 = linedef->v1->GetClipAngle();
angle_t a1 = linedef->v2->GetClipAngle(); angle_t a1 = linedef->v2->GetClipAngle();
@ -1013,23 +1011,23 @@ void GLLineToLinePortal::DrawContents()
GLRenderer->mClipPortal = this; GLRenderer->mClipPortal = this;
line_t *origin = glport->lines[0]->mOrigin; line_t *origin = glport->lines[0]->mOrigin;
P_TranslatePortalXY(origin, ViewPos.X, ViewPos.Y); P_TranslatePortalXY(origin, r_viewpoint.Pos.X, r_viewpoint.Pos.Y);
P_TranslatePortalXY(origin, ViewActorPos.X, ViewActorPos.Y); P_TranslatePortalXY(origin, r_viewpoint.ActorPos.X, r_viewpoint.ActorPos.Y);
P_TranslatePortalAngle(origin, ViewAngle); P_TranslatePortalAngle(origin, r_viewpoint.Angles.Yaw);
P_TranslatePortalZ(origin, ViewPos.Z); P_TranslatePortalZ(origin, r_viewpoint.Pos.Z);
P_TranslatePortalXY(origin, ViewPath[0].X, ViewPath[0].Y); P_TranslatePortalXY(origin, r_viewpoint.Path[0].X, r_viewpoint.Path[0].Y);
P_TranslatePortalXY(origin, ViewPath[1].X, ViewPath[1].Y); P_TranslatePortalXY(origin, r_viewpoint.Path[1].X, r_viewpoint.Path[1].Y);
if (!r_showviewer && camera != nullptr && P_PointOnLineSidePrecise(ViewPath[0], glport->lines[0]->mDestination) != P_PointOnLineSidePrecise(ViewPath[1], glport->lines[0]->mDestination)) if (!r_viewpoint.showviewer && r_viewpoint.camera != nullptr && P_PointOnLineSidePrecise(r_viewpoint.Path[0], glport->lines[0]->mDestination) != P_PointOnLineSidePrecise(r_viewpoint.Path[1], glport->lines[0]->mDestination))
{ {
double distp = (ViewPath[0] - ViewPath[1]).Length(); double distp = (r_viewpoint.Path[0] - r_viewpoint.Path[1]).Length();
if (distp > EQUAL_EPSILON) if (distp > EQUAL_EPSILON)
{ {
double dist1 = (ViewPos - ViewPath[0]).Length(); double dist1 = (r_viewpoint.Pos - r_viewpoint.Path[0]).Length();
double dist2 = (ViewPos - ViewPath[1]).Length(); double dist2 = (r_viewpoint.Pos - r_viewpoint.Path[1]).Length();
if (dist1 + dist2 < distp + 1) if (dist1 + dist2 < distp + 1)
{ {
camera->renderflags |= RF_MAYBEINVISIBLE; r_viewpoint.camera->renderflags |= RF_MAYBEINVISIBLE;
} }
} }
} }
@ -1049,7 +1047,7 @@ void GLLineToLinePortal::DrawContents()
} }
GLRenderer->mViewActor = nullptr; GLRenderer->mViewActor = nullptr;
GLRenderer->SetupView(ViewPos.X, ViewPos.Y, ViewPos.Z, ViewAngle, !!(MirrorFlag&1), !!(PlaneMirrorFlag&1)); GLRenderer->SetupView(r_viewpoint.Pos.X, r_viewpoint.Pos.Y, r_viewpoint.Pos.Z, r_viewpoint.Angles.Yaw, !!(MirrorFlag&1), !!(PlaneMirrorFlag&1));
ClearClipper(); ClearClipper();
gl_RenderState.SetClipLine(glport->lines[0]->mDestination); gl_RenderState.SetClipLine(glport->lines[0]->mDestination);
@ -1093,9 +1091,9 @@ GLHorizonPortal::GLHorizonPortal(GLHorizonInfo * pt, bool local)
// create the vertex data for this horizon portal. // create the vertex data for this horizon portal.
GLSectorPlane * sp = &origin->plane; GLSectorPlane * sp = &origin->plane;
const float vx = ViewPos.X; const float vx = r_viewpoint.Pos.X;
const float vy = ViewPos.Y; const float vy = r_viewpoint.Pos.Y;
const float vz = ViewPos.Z; const float vz = r_viewpoint.Pos.Z;
const float z = sp->Texheight; const float z = sp->Texheight;
const float tz = (z - vz); const float tz = (z - vz);
@ -1166,7 +1164,7 @@ void GLHorizonPortal::DrawContents()
PortalAll.Unclock(); PortalAll.Unclock();
return; return;
} }
gl_RenderState.SetCameraPos(ViewPos.X, ViewPos.Y, ViewPos.Z); gl_RenderState.SetCameraPos(r_viewpoint.Pos.X, r_viewpoint.Pos.Y, r_viewpoint.Pos.Z);
if (gltexture && gltexture->tex->isFullbright()) if (gltexture && gltexture->tex->isFullbright())
@ -1243,7 +1241,7 @@ void GLEEHorizonPortal::DrawContents()
horz.colormap = sector->ColorMap; horz.colormap = sector->ColorMap;
if (portal->mType == PORTS_PLANE) if (portal->mType == PORTS_PLANE)
{ {
horz.plane.Texheight = ViewPos.Z + fabs(horz.plane.Texheight); horz.plane.Texheight = r_viewpoint.Pos.Z + fabs(horz.plane.Texheight);
} }
GLHorizonPortal ceil(&horz, true); GLHorizonPortal ceil(&horz, true);
ceil.DrawContents(); ceil.DrawContents();
@ -1256,7 +1254,7 @@ void GLEEHorizonPortal::DrawContents()
horz.colormap = sector->ColorMap; horz.colormap = sector->ColorMap;
if (portal->mType == PORTS_PLANE) if (portal->mType == PORTS_PLANE)
{ {
horz.plane.Texheight = ViewPos.Z - fabs(horz.plane.Texheight); horz.plane.Texheight = r_viewpoint.Pos.Z - fabs(horz.plane.Texheight);
} }
GLHorizonPortal floor(&horz, true); GLHorizonPortal floor(&horz, true);
floor.DrawContents(); floor.DrawContents();

View file

@ -101,7 +101,7 @@ private:
DVector3 savedviewpath[2]; DVector3 savedviewpath[2];
DVector3 savedViewPos; DVector3 savedViewPos;
DVector3 savedViewActorPos; DVector3 savedViewActorPos;
DAngle savedAngle; DRotator savedAngles;
bool savedshowviewer; bool savedshowviewer;
AActor * savedviewactor; AActor * savedviewactor;
area_t savedviewarea; area_t savedviewarea;

View file

@ -493,7 +493,7 @@ void FDrawInfo::HandleMissingTextures()
HandledSubsectors.Clear(); HandledSubsectors.Clear();
validcount++; validcount++;
if (MissingUpperTextures[i].Planez > ViewPos.Z) if (MissingUpperTextures[i].Planez > r_viewpoint.Pos.Z)
{ {
// close the hole only if all neighboring sectors are an exact height match // close the hole only if all neighboring sectors are an exact height match
// Otherwise just fill in the missing textures. // Otherwise just fill in the missing textures.
@ -565,7 +565,7 @@ void FDrawInfo::HandleMissingTextures()
HandledSubsectors.Clear(); HandledSubsectors.Clear();
validcount++; validcount++;
if (MissingLowerTextures[i].Planez < ViewPos.Z) if (MissingLowerTextures[i].Planez < r_viewpoint.Pos.Z)
{ {
// close the hole only if all neighboring sectors are an exact height match // close the hole only if all neighboring sectors are an exact height match
// Otherwise just fill in the missing textures. // Otherwise just fill in the missing textures.
@ -655,7 +655,7 @@ void FDrawInfo::DrawUnhandledMissingTextures()
// already done! // already done!
if (seg->linedef->validcount == validcount) continue; // already done if (seg->linedef->validcount == validcount) continue; // already done
seg->linedef->validcount = validcount; seg->linedef->validcount = validcount;
if (seg->frontsector->GetPlaneTexZ(sector_t::ceiling) < ViewPos.Z) continue; // out of sight if (seg->frontsector->GetPlaneTexZ(sector_t::ceiling) < r_viewpoint.Pos.Z) continue; // out of sight
// FIXME: The check for degenerate subsectors should be more precise // FIXME: The check for degenerate subsectors should be more precise
if (seg->PartnerSeg && (seg->PartnerSeg->Subsector->flags & SSECF_DEGENERATE)) continue; if (seg->PartnerSeg && (seg->PartnerSeg->Subsector->flags & SSECF_DEGENERATE)) continue;
@ -677,7 +677,7 @@ void FDrawInfo::DrawUnhandledMissingTextures()
if (seg->linedef->validcount == validcount) continue; // already done if (seg->linedef->validcount == validcount) continue; // already done
seg->linedef->validcount = validcount; seg->linedef->validcount = validcount;
if (!(sectorrenderflags[seg->backsector->sectornum] & SSRF_RENDERFLOOR)) continue; if (!(sectorrenderflags[seg->backsector->sectornum] & SSRF_RENDERFLOOR)) continue;
if (seg->frontsector->GetPlaneTexZ(sector_t::floor) > ViewPos.Z) continue; // out of sight if (seg->frontsector->GetPlaneTexZ(sector_t::floor) > r_viewpoint.Pos.Z) continue; // out of sight
if (seg->backsector->transdoor) continue; if (seg->backsector->transdoor) continue;
if (seg->backsector->GetTexture(sector_t::floor) == skyflatnum) continue; if (seg->backsector->GetTexture(sector_t::floor) == skyflatnum) continue;
if (seg->backsector->ValidatePortal(sector_t::floor) != NULL) continue; if (seg->backsector->ValidatePortal(sector_t::floor) != NULL) continue;
@ -787,7 +787,7 @@ bool FDrawInfo::CollectSubsectorsFloor(subsector_t * sub, sector_t * anchor)
sub->render_sector->GetPlaneTexZ(sector_t::floor) != anchor->GetPlaneTexZ(sector_t::floor) || sub->render_sector->GetPlaneTexZ(sector_t::floor) != anchor->GetPlaneTexZ(sector_t::floor) ||
sub->render_sector->GetFloorLight() != anchor->GetFloorLight()) sub->render_sector->GetFloorLight() != anchor->GetFloorLight())
{ {
if (sub == viewsubsector && ViewPos.Z < anchor->GetPlaneTexZ(sector_t::floor)) inview = true; if (sub == viewsubsector && r_viewpoint.Pos.Z < anchor->GetPlaneTexZ(sector_t::floor)) inview = true;
HandledSubsectors.Push(sub); HandledSubsectors.Push(sub);
} }
} }
@ -937,7 +937,7 @@ void FDrawInfo::HandleHackedSubsectors()
totalssms.Reset(); totalssms.Reset();
totalssms.Clock(); totalssms.Clock();
viewsubsector = R_PointInSubsector(ViewPos); viewsubsector = R_PointInSubsector(r_viewpoint.Pos);
// Each subsector may only be processed once in this loop! // Each subsector may only be processed once in this loop!
validcount++; validcount++;

View file

@ -88,7 +88,6 @@ EXTERN_CVAR (Float, underwater_fade_scalar)
extern int viewpitch; extern int viewpitch;
extern bool NoInterpolateView; extern bool NoInterpolateView;
extern bool r_showviewer;
int gl_fixedcolormap; int gl_fixedcolormap;
area_t in_area; area_t in_area;
@ -111,7 +110,7 @@ angle_t FGLRenderer::FrustumAngle()
// ok, this is a gross hack that barely works... // ok, this is a gross hack that barely works...
// but at least it doesn't overestimate too much... // but at least it doesn't overestimate too much...
double floatangle=2.0+(45.0+((tilt/1.9)))*mCurrentFoV*48.0/AspectMultiplier(WidescreenRatio)/90.0; double floatangle=2.0+(45.0+((tilt/1.9)))*mCurrentFoV*48.0/AspectMultiplier(r_viewwindow.WidescreenRatio)/90.0;
angle_t a1 = DAngle(floatangle).BAMs(); angle_t a1 = DAngle(floatangle).BAMs();
if (a1>=ANGLE_180) return 0xffffffff; if (a1>=ANGLE_180) return 0xffffffff;
return a1; return a1;
@ -125,14 +124,14 @@ angle_t FGLRenderer::FrustumAngle()
void FGLRenderer::SetViewArea() void FGLRenderer::SetViewArea()
{ {
// The render_sector is better suited to represent the current position in GL // The render_sector is better suited to represent the current position in GL
viewsector = R_PointInSubsector(ViewPos)->render_sector; r_viewpoint.sector = R_PointInSubsector(r_viewpoint.Pos)->render_sector;
// Get the heightsec state from the render sector, not the current one! // Get the heightsec state from the render sector, not the current one!
if (viewsector->heightsec && !(viewsector->heightsec->MoreFlags & SECF_IGNOREHEIGHTSEC)) if (r_viewpoint.sector->heightsec && !(r_viewpoint.sector->heightsec->MoreFlags & SECF_IGNOREHEIGHTSEC))
{ {
in_area = ViewPos.Z <= viewsector->heightsec->floorplane.ZatPoint(ViewPos) ? area_below : in_area = r_viewpoint.Pos.Z <= r_viewpoint.sector->heightsec->floorplane.ZatPoint(r_viewpoint.Pos) ? area_below :
(ViewPos.Z > viewsector->heightsec->ceilingplane.ZatPoint(ViewPos) && (r_viewpoint.Pos.Z > r_viewpoint.sector->heightsec->ceilingplane.ZatPoint(r_viewpoint.Pos) &&
!(viewsector->heightsec->MoreFlags&SECF_FAKEFLOORONLY)) ? area_above : area_normal; !(r_viewpoint.sector->heightsec->MoreFlags&SECF_FAKEFLOORONLY)) ? area_above : area_normal;
} }
else else
{ {
@ -197,11 +196,11 @@ void FGLRenderer::Set3DViewport(bool mainview)
void FGLRenderer::SetViewAngle(DAngle viewangle) void FGLRenderer::SetViewAngle(DAngle viewangle)
{ {
mAngles.Yaw = float(270.0-viewangle.Degrees); mAngles.Yaw = float(270.0-viewangle.Degrees);
DVector2 v = ViewAngle.ToVector(); DVector2 v = r_viewpoint.Angles.Yaw.ToVector();
mViewVector.X = v.X; mViewVector.X = v.X;
mViewVector.Y = v.Y; mViewVector.Y = v.Y;
R_SetViewAngle(); R_SetViewAngle(r_viewpoint, r_viewwindow);
} }
@ -312,7 +311,7 @@ void FGLRenderer::RenderScene(int recursion)
glDepthMask(true); glDepthMask(true);
if (!gl_no_skyclear) GLPortal::RenderFirstSkyPortal(recursion); if (!gl_no_skyclear) GLPortal::RenderFirstSkyPortal(recursion);
gl_RenderState.SetCameraPos(ViewPos.X, ViewPos.Y, ViewPos.Z); gl_RenderState.SetCameraPos(r_viewpoint.Pos.X, r_viewpoint.Pos.Y, r_viewpoint.Pos.Z);
gl_RenderState.EnableFog(true); gl_RenderState.EnableFog(true);
gl_RenderState.BlendFunc(GL_ONE,GL_ZERO); gl_RenderState.BlendFunc(GL_ONE,GL_ZERO);
@ -449,7 +448,7 @@ void FGLRenderer::RenderTranslucent()
RenderAll.Clock(); RenderAll.Clock();
glDepthMask(false); glDepthMask(false);
gl_RenderState.SetCameraPos(ViewPos.X, ViewPos.Y, ViewPos.Z); gl_RenderState.SetCameraPos(r_viewpoint.Pos.X, r_viewpoint.Pos.Y, r_viewpoint.Pos.Z);
// final pass: translucent stuff // final pass: translucent stuff
gl_RenderState.AlphaFunc(GL_GEQUAL, gl_mask_sprite_threshold); gl_RenderState.AlphaFunc(GL_GEQUAL, gl_mask_sprite_threshold);
@ -497,11 +496,11 @@ void FGLRenderer::DrawScene(int drawmode)
ssao_portals_available--; ssao_portals_available--;
} }
if (camera != nullptr) if (r_viewpoint.camera != nullptr)
{ {
ActorRenderFlags savedflags = camera->renderflags; ActorRenderFlags savedflags = r_viewpoint.camera->renderflags;
CreateScene(); CreateScene();
camera->renderflags = savedflags; r_viewpoint.camera->renderflags = savedflags;
} }
else else
{ {
@ -582,11 +581,11 @@ void FGLRenderer::DrawBlend(sector_t * viewsector)
{ {
double lightbottom; double lightbottom;
if (i < lightlist.Size() - 1) if (i < lightlist.Size() - 1)
lightbottom = lightlist[i + 1].plane.ZatPoint(ViewPos); lightbottom = lightlist[i + 1].plane.ZatPoint(r_viewpoint.Pos);
else else
lightbottom = viewsector->floorplane.ZatPoint(ViewPos); lightbottom = viewsector->floorplane.ZatPoint(r_viewpoint.Pos);
if (lightbottom < ViewPos.Z && (!lightlist[i].caster || !(lightlist[i].caster->flags&FF_FADEWALLS))) if (lightbottom < r_viewpoint.Pos.Z && (!lightlist[i].caster || !(lightlist[i].caster->flags&FF_FADEWALLS)))
{ {
// 3d floor 'fog' is rendered as a blending value // 3d floor 'fog' is rendered as a blending value
blendv = lightlist[i].blend; blendv = lightlist[i].blend;
@ -735,7 +734,7 @@ void FGLRenderer::ProcessScene(bool toscreen)
iter_dlightf = iter_dlight = draw_dlight = draw_dlightf = 0; iter_dlightf = iter_dlight = draw_dlight = draw_dlightf = 0;
GLPortal::BeginScene(); GLPortal::BeginScene();
int mapsection = R_PointInSubsector(ViewPos)->mapsection; int mapsection = R_PointInSubsector(r_viewpoint.Pos)->mapsection;
memset(&currentmapsection[0], 0, currentmapsection.Size()); memset(&currentmapsection[0], 0, currentmapsection.Size());
currentmapsection[mapsection>>3] |= 1 << (mapsection & 7); currentmapsection[mapsection>>3] |= 1 << (mapsection & 7);
DrawScene(toscreen ? DM_MAINVIEW : DM_OFFSCREEN); DrawScene(toscreen ? DM_MAINVIEW : DM_OFFSCREEN);
@ -760,7 +759,7 @@ void FGLRenderer::SetFixedColormap (player_t *player)
if (cplayer->extralight == INT_MIN) if (cplayer->extralight == INT_MIN)
{ {
gl_fixedcolormap=CM_FIRSTSPECIALCOLORMAP + INVERSECOLORMAP; gl_fixedcolormap=CM_FIRSTSPECIALCOLORMAP + INVERSECOLORMAP;
extralight=0; r_viewpoint.extralight=0;
} }
else if (cplayer->fixedcolormap != NOFIXEDCOLORMAP) else if (cplayer->fixedcolormap != NOFIXEDCOLORMAP)
{ {
@ -801,17 +800,17 @@ sector_t * FGLRenderer::RenderViewpoint (AActor * camera, GL_IRECT * bounds, flo
mSceneClearColor[0] = 0.0f; mSceneClearColor[0] = 0.0f;
mSceneClearColor[1] = 0.0f; mSceneClearColor[1] = 0.0f;
mSceneClearColor[2] = 0.0f; mSceneClearColor[2] = 0.0f;
R_SetupFrame (camera); R_SetupFrame (r_viewpoint, r_viewwindow, camera);
SetViewArea(); SetViewArea();
// 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. // 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 = ViewPitch.Normalized180().Radians(); double radPitch = r_viewpoint.Angles.Pitch.Normalized180().Radians();
double angx = cos(radPitch); double angx = cos(radPitch);
double angy = sin(radPitch) * glset.pixelstretch; double angy = sin(radPitch) * glset.pixelstretch;
double alen = sqrt(angx*angx + angy*angy); double alen = sqrt(angx*angx + angy*angy);
mAngles.Pitch = (float)RAD2DEG(asin(angy / alen)); mAngles.Pitch = (float)RAD2DEG(asin(angy / alen));
mAngles.Roll.Degrees = ViewRoll.Degrees; mAngles.Roll.Degrees = r_viewpoint.Angles.Roll.Degrees;
// Scroll the sky // Scroll the sky
mSky1Pos = (float)fmod(gl_frameMS * level.skyspeed1, 1024.f) * 90.f/256.f; mSky1Pos = (float)fmod(gl_frameMS * level.skyspeed1, 1024.f) * 90.f/256.f;
@ -830,7 +829,7 @@ sector_t * FGLRenderer::RenderViewpoint (AActor * camera, GL_IRECT * bounds, flo
} }
// 'viewsector' will not survive the rendering so it cannot be used anymore below. // 'viewsector' will not survive the rendering so it cannot be used anymore below.
lviewsector = viewsector; lviewsector = r_viewpoint.sector;
// Render (potentially) multiple views for stereo 3d // Render (potentially) multiple views for stereo 3d
float viewShift[3]; float viewShift[3];
@ -847,16 +846,16 @@ sector_t * FGLRenderer::RenderViewpoint (AActor * camera, GL_IRECT * bounds, flo
// Stereo mode specific perspective projection // Stereo mode specific perspective projection
SetProjection( eye->GetProjection(fov, ratio, fovratio) ); SetProjection( eye->GetProjection(fov, ratio, fovratio) );
// SetProjection(fov, ratio, fovratio); // switch to perspective mode and set up clipper // SetProjection(fov, ratio, fovratio); // switch to perspective mode and set up clipper
SetViewAngle(ViewAngle); SetViewAngle(r_viewpoint.Angles.Yaw);
// Stereo mode specific viewpoint adjustment - temporarily shifts global ViewPos // Stereo mode specific viewpoint adjustment - temporarily shifts global ViewPos
eye->GetViewShift(GLRenderer->mAngles.Yaw.Degrees, viewShift); eye->GetViewShift(GLRenderer->mAngles.Yaw.Degrees, viewShift);
s3d::ScopedViewShifter viewShifter(viewShift); s3d::ScopedViewShifter viewShifter(viewShift);
SetViewMatrix(ViewPos.X, ViewPos.Y, ViewPos.Z, false, false); SetViewMatrix(r_viewpoint.Pos.X, r_viewpoint.Pos.Y, r_viewpoint.Pos.Z, false, false);
gl_RenderState.ApplyMatrices(); gl_RenderState.ApplyMatrices();
clipper.Clear(); clipper.Clear();
angle_t a1 = FrustumAngle(); angle_t a1 = FrustumAngle();
clipper.SafeAddClipRangeRealAngles(ViewAngle.BAMs() + a1, ViewAngle.BAMs() - a1); clipper.SafeAddClipRangeRealAngles(r_viewpoint.Angles.Yaw.BAMs() + a1, r_viewpoint.Angles.Yaw.BAMs() - a1);
ProcessScene(toscreen); ProcessScene(toscreen);
if (mainview && toscreen) EndDrawScene(lviewsector); // do not call this for camera textures. if (mainview && toscreen) EndDrawScene(lviewsector); // do not call this for camera textures.
@ -916,8 +915,8 @@ void FGLRenderer::RenderView (player_t* player)
ResetProfilingData(); ResetProfilingData();
// Get this before everything else // Get this before everything else
if (cl_capfps || r_NoInterpolate) r_TicFracF = 1.; if (cl_capfps || r_NoInterpolate) r_viewpoint.TicFrac = 1.;
else r_TicFracF = I_GetTimeFrac (&r_FrameTime); else r_viewpoint.TicFrac = I_GetTimeFrac (&r_viewpoint.FrameTime);
gl_frameMS = I_MSTime(); gl_frameMS = I_MSTime();
P_FindParticleSubsectors (); P_FindParticleSubsectors ();
@ -934,8 +933,8 @@ void FGLRenderer::RenderView (player_t* player)
// now render the main view // now render the main view
float fovratio; float fovratio;
float ratio = WidescreenRatio; float ratio = r_viewwindow.WidescreenRatio;
if (WidescreenRatio >= 1.3f) if (r_viewwindow.WidescreenRatio >= 1.3f)
{ {
fovratio = 1.333333f; fovratio = 1.333333f;
} }
@ -950,7 +949,7 @@ void FGLRenderer::RenderView (player_t* player)
TThinkerIterator<ADynamicLight> it(STAT_DLIGHT); TThinkerIterator<ADynamicLight> it(STAT_DLIGHT);
GLRenderer->mLightCount = ((it.Next()) != NULL); GLRenderer->mLightCount = ((it.Next()) != NULL);
sector_t * viewsector = RenderViewpoint(player->camera, NULL, FieldOfView.Degrees, ratio, fovratio, true, true); sector_t * viewsector = RenderViewpoint(player->camera, NULL, r_viewpoint.FieldOfView.Degrees, ratio, fovratio, true, true);
All.Unclock(); All.Unclock();
} }
@ -980,7 +979,7 @@ void FGLRenderer::WriteSavePic (player_t *player, FileWriter *file, int width, i
GLRenderer->mLightCount = ((it.Next()) != NULL); GLRenderer->mLightCount = ((it.Next()) != NULL);
sector_t *viewsector = RenderViewpoint(players[consoleplayer].camera, &bounds, sector_t *viewsector = RenderViewpoint(players[consoleplayer].camera, &bounds,
FieldOfView.Degrees, 1.6f, 1.6f, true, false); r_viewpoint.FieldOfView.Degrees, 1.6f, 1.6f, true, false);
glDisable(GL_STENCIL_TEST); glDisable(GL_STENCIL_TEST);
gl_RenderState.SetFixedColormap(CM_DEFAULT); gl_RenderState.SetFixedColormap(CM_DEFAULT);
gl_RenderState.SetSoftLightLevel(-1); gl_RenderState.SetSoftLightLevel(-1);

View file

@ -159,8 +159,8 @@ void GLWall::SkyPlane(sector_t *sector, int plane, bool allowreflect)
} }
else if (allowreflect && sector->GetReflect(plane) > 0) else if (allowreflect && sector->GetReflect(plane) > 0)
{ {
if ((plane == sector_t::ceiling && ViewPos.Z > sector->ceilingplane.fD()) || if ((plane == sector_t::ceiling && r_viewpoint.Pos.Z > sector->ceilingplane.fD()) ||
(plane == sector_t::floor && ViewPos.Z < -sector->floorplane.fD())) return; (plane == sector_t::floor && r_viewpoint.Pos.Z < -sector->floorplane.fD())) return;
ptype = PORTALTYPE_PLANEMIRROR; ptype = PORTALTYPE_PLANEMIRROR;
planemirror = plane == sector_t::ceiling ? &sector->ceilingplane : &sector->floorplane; planemirror = plane == sector_t::ceiling ? &sector->ceilingplane : &sector->floorplane;
} }
@ -345,7 +345,7 @@ void GLWall::SkyBottom(seg_t * seg,sector_t * fs,sector_t * bs,vertex_t * v1,ver
else else
{ {
// Special hack for Vrack2b // Special hack for Vrack2b
if (bs->floorplane.ZatPoint(ViewPos) > ViewPos.Z) return; if (bs->floorplane.ZatPoint(r_viewpoint.Pos) > r_viewpoint.Pos.Z) return;
} }
} }
zbottom[0]=zbottom[1]=-32768.0f; zbottom[0]=zbottom[1]=-32768.0f;

View file

@ -519,7 +519,7 @@ void GLSkyPortal::DrawContents()
bool oldClamp = gl_RenderState.SetDepthClamp(true); bool oldClamp = gl_RenderState.SetDepthClamp(true);
gl_MatrixStack.Push(gl_RenderState.mViewMatrix); gl_MatrixStack.Push(gl_RenderState.mViewMatrix);
GLRenderer->SetupView(0, 0, 0, ViewAngle, !!(MirrorFlag & 1), !!(PlaneMirrorFlag & 1)); GLRenderer->SetupView(0, 0, 0, r_viewpoint.Angles.Yaw, !!(MirrorFlag & 1), !!(PlaneMirrorFlag & 1));
gl_RenderState.SetVertexBuffer(GLRenderer->mSkyVBO); gl_RenderState.SetVertexBuffer(GLRenderer->mSkyVBO);
if (origin->texture[0] && origin->texture[0]->tex->gl_info.bSkybox) if (origin->texture[0] && origin->texture[0]->tex->gl_info.bSkybox)

View file

@ -78,7 +78,6 @@ EXTERN_CVAR (Float, transsouls)
extern TArray<spritedef_t> sprites; extern TArray<spritedef_t> sprites;
extern TArray<spriteframe_t> SpriteFrames; extern TArray<spriteframe_t> SpriteFrames;
extern TArray<PalEntry> BloodTranslationColors; extern TArray<PalEntry> BloodTranslationColors;
extern bool r_showviewer;
enum HWRenderStyle enum HWRenderStyle
{ {
@ -189,8 +188,8 @@ void GLSprite::CalculateVertices(FVector3 *v)
{ {
// [CMB] Rotate relative to camera XY position, not just camera direction, // [CMB] Rotate relative to camera XY position, not just camera direction,
// which is nicer in VR // which is nicer in VR
float xrel = xcenter - ViewPos.X; float xrel = xcenter - r_viewpoint.Pos.X;
float yrel = ycenter - ViewPos.Y; float yrel = ycenter - r_viewpoint.Pos.Y;
float absAngleDeg = RAD2DEG(atan2(-yrel, xrel)); float absAngleDeg = RAD2DEG(atan2(-yrel, xrel));
float counterRotationDeg = 270. - GLRenderer->mAngles.Yaw.Degrees; // counteracts existing sprite rotation float counterRotationDeg = 270. - GLRenderer->mAngles.Yaw.Degrees; // counteracts existing sprite rotation
float relAngleDeg = counterRotationDeg + absAngleDeg; float relAngleDeg = counterRotationDeg + absAngleDeg;
@ -298,7 +297,7 @@ void GLSprite::Draw(int pass)
// fog + fuzz don't work well without some fiddling with the alpha value! // fog + fuzz don't work well without some fiddling with the alpha value!
if (!gl_isBlack(Colormap.FadeColor)) if (!gl_isBlack(Colormap.FadeColor))
{ {
float dist=Dist2(ViewPos.X, ViewPos.Y, x,y); float dist=Dist2(r_viewpoint.Pos.X, r_viewpoint.Pos.Y, x,y);
int fogd = gl_GetFogDensity(lightlevel, Colormap.FadeColor, Colormap.fogdensity); int fogd = gl_GetFogDensity(lightlevel, Colormap.FadeColor, Colormap.fogdensity);
// this value was determined by trial and error and is scale dependent! // this value was determined by trial and error and is scale dependent!
@ -396,7 +395,7 @@ void GLSprite::Draw(int pass)
secplane_t *lowplane = i == (*lightlist).Size() - 1 ? &bottomp : &(*lightlist)[i + 1].plane; secplane_t *lowplane = i == (*lightlist).Size() - 1 ? &bottomp : &(*lightlist)[i + 1].plane;
int thislight = (*lightlist)[i].caster != NULL ? gl_ClampLight(*(*lightlist)[i].p_lightlevel) : lightlevel; int thislight = (*lightlist)[i].caster != NULL ? gl_ClampLight(*(*lightlist)[i].p_lightlevel) : lightlevel;
int thisll = actor == nullptr? thislight : (uint8_t)gl_CheckSpriteGlow(actor->Sector, thislight, actor->InterpolatedPosition(r_TicFracF)); int thisll = actor == nullptr? thislight : (uint8_t)gl_CheckSpriteGlow(actor->Sector, thislight, actor->InterpolatedPosition(r_viewpoint.TicFrac));
FColormap thiscm; FColormap thiscm;
thiscm.FadeColor = Colormap.FadeColor; thiscm.FadeColor = Colormap.FadeColor;
@ -671,6 +670,8 @@ void GLSprite::Process(AActor* thing, sector_t * sector, int thruportal)
return; return;
} }
AActor *camera = r_viewpoint.camera;
if (thing->renderflags & RF_INVISIBLE || !thing->RenderStyle.IsVisible(thing->Alpha)) if (thing->renderflags & RF_INVISIBLE || !thing->RenderStyle.IsVisible(thing->Alpha))
{ {
if (!(thing->flags & MF_STEALTH) || !gl_fixedcolormap || !gl_enhanced_nightvision || thing == camera) if (!(thing->flags & MF_STEALTH) || !gl_fixedcolormap || !gl_enhanced_nightvision || thing == camera)
@ -687,26 +688,26 @@ void GLSprite::Process(AActor* thing, sector_t * sector, int thruportal)
if (!thruportal && !(currentmapsection[thing->subsector->mapsection >> 3] & (1 << (thing->subsector->mapsection & 7)))) return; if (!thruportal && !(currentmapsection[thing->subsector->mapsection >> 3] & (1 << (thing->subsector->mapsection & 7)))) return;
// [RH] Interpolate the sprite's position to make it look smooth // [RH] Interpolate the sprite's position to make it look smooth
DVector3 thingpos = thing->InterpolatedPosition(r_TicFracF); DVector3 thingpos = thing->InterpolatedPosition(r_viewpoint.TicFrac);
if (thruportal == 1) thingpos += Displacements.getOffset(thing->Sector->PortalGroup, sector->PortalGroup); if (thruportal == 1) thingpos += Displacements.getOffset(thing->Sector->PortalGroup, sector->PortalGroup);
// Some added checks if the camera actor is not supposed to be seen. It can happen that some portal setup has this actor in view in which case it may not be skipped here // Some added checks if the camera actor is not supposed to be seen. It can happen that some portal setup has this actor in view in which case it may not be skipped here
if (thing == camera && !r_showviewer) if (thing == camera && !r_viewpoint.showviewer)
{ {
DVector3 thingorigin = thing->Pos(); DVector3 thingorigin = thing->Pos();
if (thruportal == 1) thingorigin += Displacements.getOffset(thing->Sector->PortalGroup, sector->PortalGroup); if (thruportal == 1) thingorigin += Displacements.getOffset(thing->Sector->PortalGroup, sector->PortalGroup);
if (fabs(thingorigin.X - ViewActorPos.X) < 2 && fabs(thingorigin.Y - ViewActorPos.Y) < 2) return; if (fabs(thingorigin.X - r_viewpoint.ActorPos.X) < 2 && fabs(thingorigin.Y - r_viewpoint.ActorPos.Y) < 2) return;
} }
// Thing is invisible if close to the camera. // Thing is invisible if close to the camera.
if (thing->renderflags & RF_MAYBEINVISIBLE) if (thing->renderflags & RF_MAYBEINVISIBLE)
{ {
if (fabs(thingpos.X - ViewPos.X) < 32 && fabs(thingpos.Y - ViewPos.Y) < 32) return; if (fabs(thingpos.X - r_viewpoint.Pos.X) < 32 && fabs(thingpos.Y - r_viewpoint.Pos.Y) < 32) return;
} }
// Too close to the camera. This doesn't look good if it is a sprite. // Too close to the camera. This doesn't look good if it is a sprite.
if (fabs(thingpos.X - ViewPos.X) < 2 && fabs(thingpos.Y - ViewPos.Y) < 2) if (fabs(thingpos.X - r_viewpoint.Pos.X) < 2 && fabs(thingpos.Y - r_viewpoint.Pos.Y) < 2)
{ {
if (ViewPos.Z >= thingpos.Z - 2 && ViewPos.Z <= thingpos.Z + thing->Height + 2) if (r_viewpoint.Pos.Z >= thingpos.Z - 2 && r_viewpoint.Pos.Z <= thingpos.Z + thing->Height + 2)
{ {
// exclude vertically moving objects from this check. // exclude vertically moving objects from this check.
if (!thing->Vel.isZero()) if (!thing->Vel.isZero())
@ -728,7 +729,7 @@ void GLSprite::Process(AActor* thing, sector_t * sector, int thruportal)
if (speed >= thing->target->radius / 2) if (speed >= thing->target->radius / 2)
{ {
double clipdist = clamp(thing->Speed, thing->target->radius, thing->target->radius * 2); double clipdist = clamp(thing->Speed, thing->target->radius, thing->target->radius * 2);
if ((thingpos - ViewPos).LengthSquared() < clipdist * clipdist) return; if ((thingpos - r_viewpoint.Pos).LengthSquared() < clipdist * clipdist) return;
} }
} }
thing->flags7 |= MF7_FLYCHEAT; // do this only once for the very first frame, but not if it gets into range again. thing->flags7 |= MF7_FLYCHEAT; // do this only once for the very first frame, but not if it gets into range again.
@ -741,7 +742,7 @@ void GLSprite::Process(AActor* thing, sector_t * sector, int thruportal)
} }
// disabled because almost none of the actual game code is even remotely prepared for this. If desired, use the INTERPOLATE flag. // disabled because almost none of the actual game code is even remotely prepared for this. If desired, use the INTERPOLATE flag.
if (thing->renderflags & RF_INTERPOLATEANGLES) if (thing->renderflags & RF_INTERPOLATEANGLES)
Angles = thing->InterpolatedAngles(r_TicFracF); Angles = thing->InterpolatedAngles(r_viewpoint.TicFrac);
else else
Angles = thing->Angles; Angles = thing->Angles;
@ -768,7 +769,7 @@ void GLSprite::Process(AActor* thing, sector_t * sector, int thruportal)
// [RH] Make floatbobbing a renderer-only effect. // [RH] Make floatbobbing a renderer-only effect.
if (thing->flags2 & MF2_FLOATBOB) if (thing->flags2 & MF2_FLOATBOB)
{ {
float fz = thing->GetBobOffset(r_TicFracF); float fz = thing->GetBobOffset(r_viewpoint.TicFrac);
z += fz; z += fz;
} }
@ -776,7 +777,7 @@ void GLSprite::Process(AActor* thing, sector_t * sector, int thruportal)
if (!modelframe) if (!modelframe)
{ {
bool mirror; bool mirror;
DAngle ang = (thingpos - ViewPos).Angle(); DAngle ang = (thingpos - r_viewpoint.Pos).Angle();
FTextureID patch; FTextureID patch;
// [ZZ] add direct picnum override // [ZZ] add direct picnum override
if (isPicnumOverride) if (isPicnumOverride)
@ -879,7 +880,7 @@ void GLSprite::Process(AActor* thing, sector_t * sector, int thruportal)
gltexture=NULL; gltexture=NULL;
} }
depth = FloatToFixed((x - ViewPos.X) * ViewTanCos + (y - ViewPos.Y) * ViewTanSin); depth = FloatToFixed((x - r_viewpoint.Pos.X) * r_viewpoint.TanCos + (y - r_viewpoint.Pos.Y) * r_viewpoint.TanSin);
// light calculation // light calculation
@ -1188,7 +1189,7 @@ void GLSprite::ProcessParticle (particle_t *particle, sector_t *sector)//, int s
z1=z-scalefac; z1=z-scalefac;
z2=z+scalefac; z2=z+scalefac;
depth = FloatToFixed((x - ViewPos.X) * ViewTanCos + (y - ViewPos.Y) * ViewTanSin); depth = FloatToFixed((x - r_viewpoint.Pos.X) * r_viewpoint.TanCos + (y - r_viewpoint.Pos.Y) * r_viewpoint.TanSin);
actor=NULL; actor=NULL;
this->particle=particle; this->particle=particle;
@ -1242,9 +1243,9 @@ void gl_RenderActorsInPortal(FGLLinePortal *glport)
DVector3 newpos = savedpos; DVector3 newpos = savedpos;
sector_t fakesector; sector_t fakesector;
if (!r_showviewer && th == camera) if (!r_viewpoint.showviewer && th == r_viewpoint.camera)
{ {
if (fabs(savedpos.X - ViewActorPos.X) < 2 && fabs(savedpos.Y - ViewActorPos.Y) < 2) if (fabs(savedpos.X - r_viewpoint.ActorPos.X) < 2 && fabs(savedpos.Y - r_viewpoint.ActorPos.Y) < 2)
{ {
continue; continue;
} }

View file

@ -87,7 +87,7 @@ void GLWall::PutWall(bool translucent)
if (translucent) // translucent walls if (translucent) // translucent walls
{ {
ViewDistance = (ViewPos - (seg->linedef->v1->fPos() + seg->linedef->Delta() / 2)).XY().LengthSquared(); ViewDistance = (r_viewpoint.Pos - (seg->linedef->v1->fPos() + seg->linedef->Delta() / 2)).XY().LengthSquared();
if (gl.buffermethod == BM_DEFERRED) MakeVertices(true); if (gl.buffermethod == BM_DEFERRED) MakeVertices(true);
gl_drawinfo->drawlists[GLDL_TRANSLUCENT].AddWall(this); gl_drawinfo->drawlists[GLDL_TRANSLUCENT].AddWall(this);
} }
@ -430,10 +430,10 @@ bool GLWall::DoHorizon(seg_t * seg,sector_t * fs, vertex_t * v1,vertex_t * v2)
ztop[1] = ztop[0] = fs->GetPlaneTexZ(sector_t::ceiling); ztop[1] = ztop[0] = fs->GetPlaneTexZ(sector_t::ceiling);
zbottom[1] = zbottom[0] = fs->GetPlaneTexZ(sector_t::floor); zbottom[1] = zbottom[0] = fs->GetPlaneTexZ(sector_t::floor);
if (ViewPos.Z < fs->GetPlaneTexZ(sector_t::ceiling)) if (r_viewpoint.Pos.Z < fs->GetPlaneTexZ(sector_t::ceiling))
{ {
if (ViewPos.Z > fs->GetPlaneTexZ(sector_t::floor)) if (r_viewpoint.Pos.Z > fs->GetPlaneTexZ(sector_t::floor))
zbottom[1] = zbottom[0] = ViewPos.Z; zbottom[1] = zbottom[0] = r_viewpoint.Pos.Z;
if (fs->GetTexture(sector_t::ceiling) == skyflatnum) if (fs->GetTexture(sector_t::ceiling) == skyflatnum)
{ {
@ -460,7 +460,7 @@ bool GLWall::DoHorizon(seg_t * seg,sector_t * fs, vertex_t * v1,vertex_t * v2)
ztop[1] = ztop[0] = zbottom[0]; ztop[1] = ztop[0] = zbottom[0];
} }
if (ViewPos.Z > fs->GetPlaneTexZ(sector_t::floor)) if (r_viewpoint.Pos.Z > fs->GetPlaneTexZ(sector_t::floor))
{ {
zbottom[1] = zbottom[0] = fs->GetPlaneTexZ(sector_t::floor); zbottom[1] = zbottom[0] = fs->GetPlaneTexZ(sector_t::floor);
if (fs->GetTexture(sector_t::floor) == skyflatnum) if (fs->GetTexture(sector_t::floor) == skyflatnum)

View file

@ -96,7 +96,7 @@ void FGLRenderer::DrawPSprite (player_t * player,DPSprite *psp, float sx, float
tex->GetSpriteRect(&r); tex->GetSpriteRect(&r);
// calculate edges of the shape // calculate edges of the shape
scalex = (320.0f / (240.0f * WidescreenRatio)) * vw / 320; scalex = (320.0f / (240.0f * r_viewwindow.WidescreenRatio)) * vw / 320;
tx = sx - (160 - r.left); tx = sx - (160 - r.left);
x1 = tx * scalex + vw/2; x1 = tx * scalex + vw/2;
@ -201,6 +201,8 @@ void FGLRenderer::DrawPlayerSprites(sector_t * viewsector, bool hudModelStep)
s3d::Stereo3DMode::getCurrentMode().AdjustPlayerSprites(); s3d::Stereo3DMode::getCurrentMode().AdjustPlayerSprites();
AActor *camera = r_viewpoint.camera;
// this is the same as the software renderer // this is the same as the software renderer
if (!player || if (!player ||
!r_drawplayersprites || !r_drawplayersprites ||
@ -212,7 +214,7 @@ void FGLRenderer::DrawPlayerSprites(sector_t * viewsector, bool hudModelStep)
float bobx, boby, wx, wy; float bobx, boby, wx, wy;
DPSprite *weapon; DPSprite *weapon;
P_BobWeapon(camera->player, &bobx, &boby, r_TicFracF); P_BobWeapon(camera->player, &bobx, &boby, r_viewpoint.TicFrac);
// Interpolate the main weapon layer once so as to be able to add it to other layers. // Interpolate the main weapon layer once so as to be able to add it to other layers.
if ((weapon = camera->player->FindPSprite(PSP_WEAPON)) != nullptr) if ((weapon = camera->player->FindPSprite(PSP_WEAPON)) != nullptr)
@ -224,8 +226,8 @@ void FGLRenderer::DrawPlayerSprites(sector_t * viewsector, bool hudModelStep)
} }
else else
{ {
wx = weapon->oldx + (weapon->x - weapon->oldx) * r_TicFracF; wx = weapon->oldx + (weapon->x - weapon->oldx) * r_viewpoint.TicFrac;
wy = weapon->oldy + (weapon->y - weapon->oldy) * r_TicFracF; wy = weapon->oldy + (weapon->y - weapon->oldy) * r_viewpoint.TicFrac;
} }
} }
else else
@ -257,11 +259,11 @@ void FGLRenderer::DrawPlayerSprites(sector_t * viewsector, bool hudModelStep)
if (i<lightlist.Size()-1) if (i<lightlist.Size()-1)
{ {
lightbottom=lightlist[i+1].plane.ZatPoint(ViewPos); lightbottom=lightlist[i+1].plane.ZatPoint(r_viewpoint.Pos);
} }
else else
{ {
lightbottom=viewsector->floorplane.ZatPoint(ViewPos); lightbottom=viewsector->floorplane.ZatPoint(r_viewpoint.Pos);
} }
if (lightbottom<player->viewz) if (lightbottom<player->viewz)
@ -427,8 +429,8 @@ void FGLRenderer::DrawPlayerSprites(sector_t * viewsector, bool hudModelStep)
psp->oldy = psp->y; psp->oldy = psp->y;
} }
float sx = psp->oldx + (psp->x - psp->oldx) * r_TicFracF; float sx = psp->oldx + (psp->x - psp->oldx) * r_viewpoint.TicFrac;
float sy = psp->oldy + (psp->y - psp->oldy) * r_TicFracF; float sy = psp->oldy + (psp->y - psp->oldy) * r_viewpoint.TicFrac;
if (psp->Flags & PSPF_ADDBOB) if (psp->Flags & PSPF_ADDBOB)
{ {

View file

@ -34,15 +34,15 @@ namespace s3d {
ScopedViewShifter::ScopedViewShifter(float dxyz[3]) // in meters ScopedViewShifter::ScopedViewShifter(float dxyz[3]) // in meters
{ {
// save original values // save original values
cachedView = ViewPos; cachedView = r_viewpoint.Pos;
// modify values // modify values
ViewPos += DVector3(dxyz[0], dxyz[1], dxyz[2]); r_viewpoint.Pos += DVector3(dxyz[0], dxyz[1], dxyz[2]);
} }
ScopedViewShifter::~ScopedViewShifter() ScopedViewShifter::~ScopedViewShifter()
{ {
// restore original values // restore original values
ViewPos = cachedView; r_viewpoint.Pos = cachedView;
} }
} }

View file

@ -319,10 +319,10 @@ const FHardwareTexture *FGLTexture::Bind(int texunit, int clampmode, int transla
// need to do software warping // need to do software warping
FWarpTexture *wt = static_cast<FWarpTexture*>(tex); FWarpTexture *wt = static_cast<FWarpTexture*>(tex);
unsigned char *warpbuffer = new unsigned char[w*h*4]; unsigned char *warpbuffer = new unsigned char[w*h*4];
WarpBuffer((uint32_t*)warpbuffer, (const uint32_t*)buffer, w, h, wt->WidthOffsetMultiplier, wt->HeightOffsetMultiplier, r_FrameTime, wt->Speed, tex->bWarped); WarpBuffer((uint32_t*)warpbuffer, (const uint32_t*)buffer, w, h, wt->WidthOffsetMultiplier, wt->HeightOffsetMultiplier, r_viewpoint.FrameTime, wt->Speed, tex->bWarped);
delete[] buffer; delete[] buffer;
buffer = warpbuffer; buffer = warpbuffer;
wt->GenTime = r_FrameTime; wt->GenTime = r_viewpoint.FrameTime;
} }
tex->ProcessData(buffer, w, h, false); tex->ProcessData(buffer, w, h, false);
} }

View file

@ -231,7 +231,7 @@ void CheckBench()
FString compose; FString compose;
compose.Format("Map %s: \"%s\",\nx = %1.4f, y = %1.4f, z = %1.4f, angle = %1.4f, pitch = %1.4f\n", compose.Format("Map %s: \"%s\",\nx = %1.4f, y = %1.4f, z = %1.4f, angle = %1.4f, pitch = %1.4f\n",
level.MapName.GetChars(), level.LevelName.GetChars(), ViewPos.X, ViewPos.Y, ViewPos.Z, ViewAngle.Degrees, ViewPitch.Degrees); level.MapName.GetChars(), level.LevelName.GetChars(), r_viewpoint.Pos.X, r_viewpoint.Pos.Y, r_viewpoint.Pos.Z, r_viewpoint.Angles.Yaw.Degrees, r_viewpoint.Angles.Pitch.Degrees);
AppendRenderStats(compose); AppendRenderStats(compose);
AppendRenderTimes(compose); AppendRenderTimes(compose);

View file

@ -732,7 +732,7 @@ void P_DrawRailTrail(AActor *source, TArray<SPortalHit> &portalhits, int color1,
{ {
if (shortest == NULL || shortest->sounddist > seg.sounddist) shortest = &seg; if (shortest == NULL || shortest->sounddist > seg.sounddist) shortest = &seg;
} }
S_Sound (DVector3(shortest->soundpos, ViewPos.Z), CHAN_WEAPON, sound, 1, ATTN_NORM); S_Sound (DVector3(shortest->soundpos, r_viewpoint.Pos.Z), CHAN_WEAPON, sound, 1, ATTN_NORM);
} }
} }
} }

View file

@ -1494,7 +1494,7 @@ bool AActor::IsInsideVisibleAngles() const
if (mo != nullptr) if (mo != nullptr)
{ {
DVector3 diffang = ViewPos - Pos(); DVector3 diffang = r_viewpoint.Pos - Pos();
DAngle to = diffang.Angle(); DAngle to = diffang.Angle();
if (!(renderflags & RF_ABSMASKANGLE)) if (!(renderflags & RF_ABSMASKANGLE))

View file

@ -135,13 +135,13 @@ TriMatrix TriMatrix::frustum(float left, float right, float bottom, float top, f
TriMatrix TriMatrix::worldToView() TriMatrix TriMatrix::worldToView()
{ {
TriMatrix m = null(); TriMatrix m = null();
m.matrix[0 + 0 * 4] = (float)ViewSin; m.matrix[0 + 0 * 4] = (float)r_viewpoint.Sin;
m.matrix[0 + 1 * 4] = (float)-ViewCos; m.matrix[0 + 1 * 4] = (float)-r_viewpoint.Cos;
m.matrix[1 + 2 * 4] = 1.0f; m.matrix[1 + 2 * 4] = 1.0f;
m.matrix[2 + 0 * 4] = (float)-ViewCos; m.matrix[2 + 0 * 4] = (float)-r_viewpoint.Cos;
m.matrix[2 + 1 * 4] = (float)-ViewSin; m.matrix[2 + 1 * 4] = (float)-r_viewpoint.Sin;
m.matrix[3 + 3 * 4] = 1.0f; m.matrix[3 + 3 * 4] = 1.0f;
return m * translate((float)-ViewPos.X, (float)-ViewPos.Y, (float)-ViewPos.Z); return m * translate((float)-r_viewpoint.Pos.X, (float)-r_viewpoint.Pos.Y, (float)-r_viewpoint.Pos.Z);
} }
TriMatrix TriMatrix::viewToClip() TriMatrix TriMatrix::viewToClip()
@ -149,7 +149,7 @@ TriMatrix TriMatrix::viewToClip()
auto viewport = swrenderer::RenderViewport::Instance(); auto viewport = swrenderer::RenderViewport::Instance();
float near = 5.0f; float near = 5.0f;
float far = 65536.0f; float far = 65536.0f;
float width = (float)(FocalTangent * near); float width = (float)(r_viewwindow.FocalTangent * near);
float top = (float)(viewport->CenterY / viewport->InvZtoScale * near); float top = (float)(viewport->CenterY / viewport->InvZtoScale * near);
float bottom = (float)(top - viewheight / viewport->InvZtoScale * near); float bottom = (float)(top - viewheight / viewport->InvZtoScale * near);
return frustum(-width, width, bottom, top, near, far); return frustum(-width, width, bottom, top, near, far);

View file

@ -40,7 +40,6 @@
EXTERN_CVAR(Bool, r_shadercolormaps) EXTERN_CVAR(Bool, r_shadercolormaps)
EXTERN_CVAR(Int, screenblocks) EXTERN_CVAR(Int, screenblocks)
void InitGLRMapinfoData(); void InitGLRMapinfoData();
extern bool r_showviewer;
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
@ -89,8 +88,8 @@ void PolyRenderer::RenderViewToCanvas(AActor *actor, DCanvas *canvas, int x, int
viewwidth = width; viewwidth = width;
viewport->RenderTarget = canvas; viewport->RenderTarget = canvas;
R_SetWindow(12, width, height, height, true); R_SetWindow(r_viewpoint, r_viewwindow, 12, width, height, height, true);
viewport->SetViewport(width, height, WidescreenRatio); viewport->SetViewport(width, height, r_viewwindow.WidescreenRatio);
viewwindowx = x; viewwindowx = x;
viewwindowy = y; viewwindowy = y;
viewactive = true; viewactive = true;
@ -103,10 +102,10 @@ void PolyRenderer::RenderViewToCanvas(AActor *actor, DCanvas *canvas, int x, int
canvas->Unlock(); canvas->Unlock();
viewport->RenderTarget = screen; viewport->RenderTarget = screen;
R_ExecuteSetViewSize(); R_ExecuteSetViewSize(r_viewpoint, r_viewwindow);
float trueratio; float trueratio;
ActiveRatio(width, height, &trueratio); ActiveRatio(width, height, &trueratio);
viewport->SetViewport(width, height, WidescreenRatio); viewport->SetViewport(width, height, r_viewwindow.WidescreenRatio);
viewactive = savedviewactive; viewactive = savedviewactive;
} }
@ -118,14 +117,14 @@ void PolyRenderer::RenderActorView(AActor *actor, bool dontmaplines)
P_FindParticleSubsectors(); P_FindParticleSubsectors();
PO_LinkToSubsectors(); PO_LinkToSubsectors();
R_SetupFrame(actor); R_SetupFrame(r_viewpoint, r_viewwindow, actor);
swrenderer::CameraLight::Instance()->SetCamera(actor); swrenderer::CameraLight::Instance()->SetCamera(actor);
swrenderer::RenderViewport::Instance()->SetupFreelook(); swrenderer::RenderViewport::Instance()->SetupFreelook();
ActorRenderFlags savedflags = camera->renderflags; ActorRenderFlags savedflags = r_viewpoint.camera->renderflags;
// Never draw the player unless in chasecam mode // Never draw the player unless in chasecam mode
if (!r_showviewer) if (!r_viewpoint.showviewer)
camera->renderflags |= RF_INVISIBLE; r_viewpoint.camera->renderflags |= RF_INVISIBLE;
ClearBuffers(); ClearBuffers();
SetSceneViewport(); SetSceneViewport();
@ -136,7 +135,7 @@ void PolyRenderer::RenderActorView(AActor *actor, bool dontmaplines)
MainPortal.RenderTranslucent(0); MainPortal.RenderTranslucent(0);
PlayerSprites.Render(); PlayerSprites.Render();
camera->renderflags = savedflags; r_viewpoint.camera->renderflags = savedflags;
interpolator.RestoreInterpolations (); interpolator.RestoreInterpolations ();
NetUpdate(); NetUpdate();
@ -193,23 +192,23 @@ void PolyRenderer::SetupPerspectiveMatrix()
// Code provided courtesy of Graf Zahl. Now we just have to plug it into the viewmatrix code... // 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. // 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 = ViewPitch.Normalized180().Radians(); double radPitch = r_viewpoint.Angles.Pitch.Normalized180().Radians();
double angx = cos(radPitch); double angx = cos(radPitch);
double angy = sin(radPitch) * glset.pixelstretch; double angy = sin(radPitch) * glset.pixelstretch;
double alen = sqrt(angx*angx + angy*angy); double alen = sqrt(angx*angx + angy*angy);
float adjustedPitch = (float)asin(angy / alen); float adjustedPitch = (float)asin(angy / alen);
float adjustedViewAngle = (float)(ViewAngle - 90).Radians(); float adjustedViewAngle = (float)(r_viewpoint.Angles.Yaw - 90).Radians();
float ratio = WidescreenRatio; float ratio = r_viewwindow.WidescreenRatio;
float fovratio = (WidescreenRatio >= 1.3f) ? 1.333333f : ratio; float fovratio = (r_viewwindow.WidescreenRatio >= 1.3f) ? 1.333333f : ratio;
float fovy = (float)(2 * DAngle::ToDegrees(atan(tan(FieldOfView.Radians() / 2) / fovratio)).Degrees); float fovy = (float)(2 * DAngle::ToDegrees(atan(tan(r_viewpoint.FieldOfView.Radians() / 2) / fovratio)).Degrees);
TriMatrix worldToView = TriMatrix worldToView =
TriMatrix::rotate(adjustedPitch, 1.0f, 0.0f, 0.0f) * TriMatrix::rotate(adjustedPitch, 1.0f, 0.0f, 0.0f) *
TriMatrix::rotate(adjustedViewAngle, 0.0f, -1.0f, 0.0f) * TriMatrix::rotate(adjustedViewAngle, 0.0f, -1.0f, 0.0f) *
TriMatrix::scale(1.0f, glset.pixelstretch, 1.0f) * TriMatrix::scale(1.0f, glset.pixelstretch, 1.0f) *
TriMatrix::swapYZ() * TriMatrix::swapYZ() *
TriMatrix::translate((float)-ViewPos.X, (float)-ViewPos.Y, (float)-ViewPos.Z); TriMatrix::translate((float)-r_viewpoint.Pos.X, (float)-r_viewpoint.Pos.Y, (float)-r_viewpoint.Pos.Z);
WorldToClip = TriMatrix::perspective(fovy, ratio, 5.0f, 65535.0f) * worldToView; WorldToClip = TriMatrix::perspective(fovy, ratio, 5.0f, 65535.0f) * worldToView;
} }

View file

@ -50,7 +50,7 @@ void PolyCull::CullNode(void *node)
node_t *bsp = (node_t *)node; node_t *bsp = (node_t *)node;
// Decide which side the view point is on. // Decide which side the view point is on.
int side = PointOnSide(ViewPos, bsp); int side = PointOnSide(r_viewpoint.Pos, bsp);
// Recursively divide front space (toward the viewer). // Recursively divide front space (toward the viewer).
CullNode(bsp->children[side]); 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) if ((line->sidedef == nullptr || !(line->sidedef->Flags & WALLF_POLYOBJ)) && line->backsector == nullptr)
{ {
// Skip lines not facing viewer // Skip lines not facing viewer
DVector2 pt1 = line->v1->fPos() - ViewPos; DVector2 pt1 = line->v1->fPos() - r_viewpoint.Pos;
DVector2 pt2 = line->v2->fPos() - ViewPos; DVector2 pt2 = line->v2->fPos() - r_viewpoint.Pos;
if (pt1.Y * (pt1.X - pt2.X) + pt1.X * (pt2.Y - pt1.Y) >= 0) if (pt1.Y * (pt1.X - pt2.X) + pt1.X * (pt2.Y - pt1.Y) >= 0)
continue; continue;
@ -179,7 +179,7 @@ bool PolyCull::CheckBBox(float *bspcoord)
{ {
// Start using a quick frustum AABB test: // Start using a quick frustum AABB test:
AxisAlignedBoundingBox aabb(Vec3f(bspcoord[BOXLEFT], bspcoord[BOXBOTTOM], (float)ViewPos.Z - 1000.0f), Vec3f(bspcoord[BOXRIGHT], bspcoord[BOXTOP], (float)ViewPos.Z + 1000.0f)); 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));
auto result = IntersectionTest::frustum_aabb(frustumPlanes, aabb); auto result = IntersectionTest::frustum_aabb(frustumPlanes, aabb);
if (result == IntersectionTest::outside) if (result == IntersectionTest::outside)
return false; return false;
@ -266,14 +266,14 @@ LineSegmentRange PolyCull::GetSegmentRangeForLine(double x1, double y1, double x
} }
// Transform to 2D view space: // Transform to 2D view space:
x1 = x1 - ViewPos.X; x1 = x1 - r_viewpoint.Pos.X;
y1 = y1 - ViewPos.Y; y1 = y1 - r_viewpoint.Pos.Y;
x2 = x2 - ViewPos.X; x2 = x2 - r_viewpoint.Pos.X;
y2 = y2 - ViewPos.Y; y2 = y2 - r_viewpoint.Pos.Y;
double rx1 = x1 * ViewSin - y1 * ViewCos; double rx1 = x1 * r_viewpoint.Sin - y1 * r_viewpoint.Cos;
double rx2 = x2 * ViewSin - y2 * ViewCos; double rx2 = x2 * r_viewpoint.Sin - y2 * r_viewpoint.Cos;
double ry1 = x1 * ViewCos + y1 * ViewSin; double ry1 = x1 * r_viewpoint.Cos + y1 * r_viewpoint.Sin;
double ry2 = x2 * ViewCos + y2 * ViewSin; double ry2 = x2 * r_viewpoint.Cos + y2 * r_viewpoint.Sin;
// Is it potentially visible when looking straight up or down? // Is it potentially visible when looking straight up or down?
if (!(ry1 < updownnear && ry2 < updownnear) && !(ry1 > znear && ry2 > znear) && if (!(ry1 < updownnear && ry2 < updownnear) && !(ry1 > znear && ry2 > znear) &&

View file

@ -107,7 +107,7 @@ void RenderPolyDecal::Render(const TriMatrix &worldToClip, const Vec4f &clipPlan
return; return;
bool foggy = false; bool foggy = false;
int actualextralight = foggy ? 0 : extralight << 4; int actualextralight = foggy ? 0 : r_viewpoint.extralight << 4;
std::pair<float, float> offsets[4] = std::pair<float, float> offsets[4] =
{ {

View file

@ -37,8 +37,8 @@ void RenderPolyParticle::Render(const TriMatrix &worldToClip, const Vec4f &clipP
DVector2 points[2] = DVector2 points[2] =
{ {
{ pos.X - ViewSin * psize, pos.Y + ViewCos * psize }, { pos.X - r_viewpoint.Sin * psize, pos.Y + r_viewpoint.Cos * psize },
{ pos.X + ViewSin * psize, pos.Y - ViewCos * psize } { pos.X + r_viewpoint.Sin * psize, pos.Y - r_viewpoint.Cos * psize }
}; };
TriVertex *vertices = PolyVertexBuffer::GetVertices(4); TriVertex *vertices = PolyVertexBuffer::GetVertices(4);
@ -46,7 +46,7 @@ void RenderPolyParticle::Render(const TriMatrix &worldToClip, const Vec4f &clipP
return; return;
bool foggy = false; bool foggy = false;
int actualextralight = foggy ? 0 : extralight << 4; int actualextralight = foggy ? 0 : r_viewpoint.extralight << 4;
std::pair<float, float> offsets[4] = std::pair<float, float> offsets[4] =
{ {

View file

@ -57,7 +57,7 @@ void RenderPolyPlane::RenderPlanes(const TriMatrix &worldToClip, const Vec4f &cl
//fakeFloor->alpha //fakeFloor->alpha
double fakeHeight = fakeFloor->top.plane->ZatPoint(frontsector->centerspot); double fakeHeight = fakeFloor->top.plane->ZatPoint(frontsector->centerspot);
if (fakeHeight < ViewPos.Z && fakeHeight > frontsector->floorplane.ZatPoint(frontsector->centerspot)) if (fakeHeight < r_viewpoint.Pos.Z && fakeHeight > frontsector->floorplane.ZatPoint(frontsector->centerspot))
{ {
plane.Render3DFloor(worldToClip, clipPlane, sub, subsectorDepth, stencilValue, false, fakeFloor); plane.Render3DFloor(worldToClip, clipPlane, sub, subsectorDepth, stencilValue, false, fakeFloor);
} }
@ -78,7 +78,7 @@ void RenderPolyPlane::RenderPlanes(const TriMatrix &worldToClip, const Vec4f &cl
//fakeFloor->alpha //fakeFloor->alpha
double fakeHeight = fakeFloor->bottom.plane->ZatPoint(frontsector->centerspot); double fakeHeight = fakeFloor->bottom.plane->ZatPoint(frontsector->centerspot);
if (fakeHeight > ViewPos.Z && fakeHeight < frontsector->ceilingplane.ZatPoint(frontsector->centerspot)) if (fakeHeight > r_viewpoint.Pos.Z && fakeHeight < frontsector->ceilingplane.ZatPoint(frontsector->centerspot))
{ {
plane.Render3DFloor(worldToClip, clipPlane, sub, subsectorDepth, stencilValue, true, fakeFloor); plane.Render3DFloor(worldToClip, clipPlane, sub, subsectorDepth, stencilValue, true, fakeFloor);
} }
@ -187,8 +187,8 @@ void RenderPolyPlane::Render(const TriMatrix &worldToClip, const Vec4f &clipPlan
{ {
seg_t *line = &sub->firstline[i]; seg_t *line = &sub->firstline[i];
DVector2 pt1 = line->v1->fPos() - ViewPos; DVector2 pt1 = line->v1->fPos() - r_viewpoint.Pos;
DVector2 pt2 = line->v2->fPos() - ViewPos; DVector2 pt2 = line->v2->fPos() - r_viewpoint.Pos;
if (pt1.Y * (pt1.X - pt2.X) + pt1.X * (pt2.Y - pt1.Y) >= 0) if (pt1.Y * (pt1.X - pt2.X) + pt1.X * (pt2.Y - pt1.Y) >= 0)
inside = false; inside = false;
@ -218,7 +218,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) 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 planePos = v;
DVector2 planeNormal = v - ViewPos; DVector2 planeNormal = v - r_viewpoint.Pos;
planeNormal.MakeUnit(); planeNormal.MakeUnit();
double planeD = -(planeNormal | (planePos + planeNormal * 0.001)); double planeD = -(planeNormal | (planePos + planeNormal * 0.001));
polyportal->PortalPlane = Vec4f((float)planeNormal.X, (float)planeNormal.Y, 0.0f, (float)planeD); polyportal->PortalPlane = Vec4f((float)planeNormal.X, (float)planeNormal.Y, 0.0f, (float)planeD);
@ -238,7 +238,7 @@ void RenderPolyPlane::Render(const TriMatrix &worldToClip, const Vec4f &clipPlan
{ {
// Floor and ceiling texture needs to be swapped sometimes? Why?? :( // Floor and ceiling texture needs to be swapped sometimes? Why?? :(
if (ViewPos.Z < fakesector->floorplane.Zat0()) // In water if (r_viewpoint.Pos.Z < fakesector->floorplane.Zat0()) // In water
{ {
if (ceiling) if (ceiling)
{ {
@ -254,7 +254,7 @@ void RenderPolyPlane::Render(const TriMatrix &worldToClip, const Vec4f &clipPlan
ccw = true; ccw = true;
} }
} }
else if (ViewPos.Z >= fakesector->ceilingplane.Zat0() && !fakeflooronly) // In ceiling water else if (r_viewpoint.Pos.Z >= fakesector->ceilingplane.Zat0() && !fakeflooronly) // In ceiling water
{ {
if (ceiling) if (ceiling)
{ {

View file

@ -43,18 +43,18 @@ void RenderPolyPlayerSprites::Render()
// draws the canvas textures between this call and the final call to RenderRemainingSprites.. // draws the canvas textures between this call and the final call to RenderRemainingSprites..
if (!r_drawplayersprites || if (!r_drawplayersprites ||
!camera || !r_viewpoint.camera ||
!camera->player || !r_viewpoint.camera->player ||
(players[consoleplayer].cheats & CF_CHASECAM) || (players[consoleplayer].cheats & CF_CHASECAM) ||
(r_deathcamera && camera->health <= 0)) (r_deathcamera && r_viewpoint.camera->health <= 0))
return; return;
float bobx, boby; float bobx, boby;
P_BobWeapon(camera->player, &bobx, &boby, r_TicFracF); P_BobWeapon(r_viewpoint.camera->player, &bobx, &boby, r_viewpoint.TicFrac);
// Interpolate the main weapon layer once so as to be able to add it to other layers. // Interpolate the main weapon layer once so as to be able to add it to other layers.
double wx, wy; double wx, wy;
DPSprite *weapon = camera->player->FindPSprite(PSP_WEAPON); DPSprite *weapon = r_viewpoint.camera->player->FindPSprite(PSP_WEAPON);
if (weapon) if (weapon)
{ {
if (weapon->firstTic) if (weapon->firstTic)
@ -64,8 +64,8 @@ void RenderPolyPlayerSprites::Render()
} }
else else
{ {
wx = weapon->oldx + (weapon->x - weapon->oldx) * r_TicFracF; wx = weapon->oldx + (weapon->x - weapon->oldx) * r_viewpoint.TicFrac;
wy = weapon->oldy + (weapon->y - weapon->oldy) * r_TicFracF; wy = weapon->oldy + (weapon->y - weapon->oldy) * r_viewpoint.TicFrac;
} }
} }
else else
@ -74,7 +74,7 @@ void RenderPolyPlayerSprites::Render()
wy = 0; wy = 0;
} }
for (DPSprite *sprite = camera->player->psprites; sprite != nullptr; sprite = sprite->GetNext()) for (DPSprite *sprite = r_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. // [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 // It's possible this psprite's caller is now null but the layer itself hasn't been destroyed
@ -82,7 +82,7 @@ void RenderPolyPlayerSprites::Render()
// In this case let's simply not draw it to avoid crashing. // In this case let's simply not draw it to avoid crashing.
if ((sprite->GetID() != PSP_TARGETCENTER || CrosshairImage == nullptr) && sprite->GetCaller() != nullptr) if ((sprite->GetID() != PSP_TARGETCENTER || CrosshairImage == nullptr) && sprite->GetCaller() != nullptr)
{ {
RenderSprite(sprite, camera, bobx, boby, wx, wy, r_TicFracF); RenderSprite(sprite, r_viewpoint.camera, bobx, boby, wx, wy, r_viewpoint.TicFrac);
} }
} }
} }
@ -143,7 +143,7 @@ void RenderPolyPlayerSprites::RenderSprite(DPSprite *sprite, AActor *owner, floa
auto viewport = swrenderer::RenderViewport::Instance(); auto viewport = swrenderer::RenderViewport::Instance();
double pspritexscale = centerxwide / 160.0; double pspritexscale = r_viewwindow.centerxwide / 160.0;
double pspriteyscale = pspritexscale * viewport->YaspectMul; double pspriteyscale = pspritexscale * viewport->YaspectMul;
double pspritexiscale = 1 / pspritexscale; double pspritexiscale = 1 / pspritexscale;
@ -167,7 +167,7 @@ void RenderPolyPlayerSprites::RenderSprite(DPSprite *sprite, AActor *owner, floa
double texturemid = (BaseYCenter - sy) * tex->Scale.Y + tex->TopOffset; double texturemid = (BaseYCenter - sy) * tex->Scale.Y + tex->TopOffset;
// Adjust PSprite for fullscreen views // Adjust PSprite for fullscreen views
if (camera->player && (viewport->RenderTarget != screen || viewheight == viewport->RenderTarget->GetHeight() || (viewport->RenderTarget->GetWidth() > (BaseXCenter * 2) && !st_scale))) if (r_viewpoint.camera->player && (viewport->RenderTarget != screen || viewheight == viewport->RenderTarget->GetHeight() || (viewport->RenderTarget->GetWidth() > (BaseXCenter * 2) && !st_scale)))
{ {
AWeapon *weapon = dyn_cast<AWeapon>(sprite->GetCaller()); AWeapon *weapon = dyn_cast<AWeapon>(sprite->GetCaller());
if (weapon != nullptr && weapon->YAdjust != 0) if (weapon != nullptr && weapon->YAdjust != 0)
@ -186,7 +186,7 @@ void RenderPolyPlayerSprites::RenderSprite(DPSprite *sprite, AActor *owner, floa
// Move the weapon down for 1280x1024. // Move the weapon down for 1280x1024.
if (sprite->GetID() < PSP_TARGETCENTER) if (sprite->GetID() < PSP_TARGETCENTER)
{ {
texturemid -= AspectPspriteOffset(WidescreenRatio); texturemid -= AspectPspriteOffset(r_viewwindow.WidescreenRatio);
} }
int clipped_x1 = MAX(x1, 0); int clipped_x1 = MAX(x1, 0);
@ -212,7 +212,7 @@ void RenderPolyPlayerSprites::RenderSprite(DPSprite *sprite, AActor *owner, floa
bool noaccel = false; bool noaccel = false;
FDynamicColormap *basecolormap = viewsector->ColorMap; FDynamicColormap *basecolormap = r_viewpoint.sector->ColorMap;
FDynamicColormap *colormap_to_use = basecolormap; FDynamicColormap *colormap_to_use = basecolormap;
int ColormapNum = 0; int ColormapNum = 0;
@ -222,7 +222,7 @@ void RenderPolyPlayerSprites::RenderSprite(DPSprite *sprite, AActor *owner, floa
RenderStyle = STYLE_Normal; RenderStyle = STYLE_Normal;
bool foggy = false; bool foggy = false;
int actualextralight = foggy ? 0 : extralight << 4; int actualextralight = foggy ? 0 : r_viewpoint.extralight << 4;
int spriteshade = swrenderer::LightVisibility::LightLevelToShade(owner->Sector->lightlevel + actualextralight, foggy); int spriteshade = swrenderer::LightVisibility::LightLevelToShade(owner->Sector->lightlevel + actualextralight, foggy);
double minz = double((2048 * 4) / double(1 << 20)); double minz = double((2048 * 4) / double(1 << 20));
ColormapNum = GETPALOOKUP(swrenderer::LightVisibility::Instance()->SpriteGlobVis(foggy) / minz, spriteshade); ColormapNum = GETPALOOKUP(swrenderer::LightVisibility::Instance()->SpriteGlobVis(foggy) / minz, spriteshade);
@ -287,14 +287,14 @@ void RenderPolyPlayerSprites::RenderSprite(DPSprite *sprite, AActor *owner, floa
} }
*/ */
if (camera->Inventory != nullptr) if (r_viewpoint.camera->Inventory != nullptr)
{ {
visstyle_t visstyle; visstyle_t visstyle;
visstyle.Alpha = Alpha; visstyle.Alpha = Alpha;
visstyle.RenderStyle = STYLE_Count; visstyle.RenderStyle = STYLE_Count;
visstyle.Invert = false; visstyle.Invert = false;
camera->Inventory->AlterWeaponSprite(&visstyle); r_viewpoint.camera->Inventory->AlterWeaponSprite(&visstyle);
Alpha = visstyle.Alpha; Alpha = visstyle.Alpha;

View file

@ -32,8 +32,6 @@
#include "swrenderer/scene/r_light.h" #include "swrenderer/scene/r_light.h"
#include "gl/data/gl_data.h" #include "gl/data/gl_data.h"
extern bool r_showviewer;
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
PolyDrawSectorPortal::PolyDrawSectorPortal(FSectorPortal *portal, bool ceiling) : Portal(portal), Ceiling(ceiling) PolyDrawSectorPortal::PolyDrawSectorPortal(FSectorPortal *portal, bool ceiling) : Portal(portal), Ceiling(ceiling)
@ -49,21 +47,21 @@ void PolyDrawSectorPortal::Render(int portalDepth)
SaveGlobals(); SaveGlobals();
// To do: get this information from PolyRenderer instead of duplicating the code.. // To do: get this information from PolyRenderer instead of duplicating the code..
double radPitch = ViewPitch.Normalized180().Radians(); double radPitch = r_viewpoint.Angles.Pitch.Normalized180().Radians();
double angx = cos(radPitch); double angx = cos(radPitch);
double angy = sin(radPitch) * glset.pixelstretch; double angy = sin(radPitch) * glset.pixelstretch;
double alen = sqrt(angx*angx + angy*angy); double alen = sqrt(angx*angx + angy*angy);
float adjustedPitch = (float)asin(angy / alen); float adjustedPitch = (float)asin(angy / alen);
float adjustedViewAngle = (float)(ViewAngle - 90).Radians(); float adjustedViewAngle = (float)(r_viewpoint.Angles.Yaw - 90).Radians();
float ratio = WidescreenRatio; float ratio = r_viewwindow.WidescreenRatio;
float fovratio = (WidescreenRatio >= 1.3f) ? 1.333333f : ratio; float fovratio = (r_viewwindow.WidescreenRatio >= 1.3f) ? 1.333333f : ratio;
float fovy = (float)(2 * DAngle::ToDegrees(atan(tan(FieldOfView.Radians() / 2) / fovratio)).Degrees); float fovy = (float)(2 * DAngle::ToDegrees(atan(tan(r_viewpoint.FieldOfView.Radians() / 2) / fovratio)).Degrees);
TriMatrix worldToView = TriMatrix worldToView =
TriMatrix::rotate(adjustedPitch, 1.0f, 0.0f, 0.0f) * TriMatrix::rotate(adjustedPitch, 1.0f, 0.0f, 0.0f) *
TriMatrix::rotate(adjustedViewAngle, 0.0f, -1.0f, 0.0f) * TriMatrix::rotate(adjustedViewAngle, 0.0f, -1.0f, 0.0f) *
TriMatrix::scale(1.0f, glset.pixelstretch, 1.0f) * TriMatrix::scale(1.0f, glset.pixelstretch, 1.0f) *
TriMatrix::swapYZ() * TriMatrix::swapYZ() *
TriMatrix::translate((float)-ViewPos.X, (float)-ViewPos.Y, (float)-ViewPos.Z); TriMatrix::translate((float)-r_viewpoint.Pos.X, (float)-r_viewpoint.Pos.Y, (float)-r_viewpoint.Pos.Z);
TriMatrix worldToClip = TriMatrix::perspective(fovy, ratio, 5.0f, 65535.0f) * worldToView; TriMatrix worldToClip = TriMatrix::perspective(fovy, ratio, 5.0f, 65535.0f) * worldToView;
RenderPortal.SetViewpoint(worldToClip, PortalPlane, StencilValue); RenderPortal.SetViewpoint(worldToClip, PortalPlane, StencilValue);
@ -87,33 +85,33 @@ void PolyDrawSectorPortal::RenderTranslucent(int portalDepth)
void PolyDrawSectorPortal::SaveGlobals() void PolyDrawSectorPortal::SaveGlobals()
{ {
savedextralight = extralight; savedextralight = r_viewpoint.extralight;
savedpos = ViewPos; savedpos = r_viewpoint.Pos;
savedangle = ViewAngle; savedangles = r_viewpoint.Angles;
savedvisibility = swrenderer::LightVisibility::Instance()->GetVisibility(); savedvisibility = swrenderer::LightVisibility::Instance()->GetVisibility();
savedcamera = camera; savedcamera = r_viewpoint.camera;
savedsector = viewsector; savedsector = r_viewpoint.sector;
if (Portal->mType == PORTS_SKYVIEWPOINT) if (Portal->mType == PORTS_SKYVIEWPOINT)
{ {
// Don't let gun flashes brighten the sky box // Don't let gun flashes brighten the sky box
AActor *sky = Portal->mSkybox; AActor *sky = Portal->mSkybox;
extralight = 0; r_viewpoint.extralight = 0;
swrenderer::LightVisibility::Instance()->SetVisibility(sky->args[0] * 0.25f); swrenderer::LightVisibility::Instance()->SetVisibility(sky->args[0] * 0.25f);
ViewPos = sky->InterpolatedPosition(r_TicFracF); r_viewpoint.Pos = sky->InterpolatedPosition(r_viewpoint.TicFrac);
ViewAngle = savedangle + (sky->PrevAngles.Yaw + deltaangle(sky->PrevAngles.Yaw, sky->Angles.Yaw) * r_TicFracF); r_viewpoint.Angles.Yaw = savedangles.Yaw + (sky->PrevAngles.Yaw + deltaangle(sky->PrevAngles.Yaw, sky->Angles.Yaw) * r_viewpoint.TicFrac);
} }
else //if (Portal->mType == PORTS_STACKEDSECTORTHING || Portal->mType == PORTS_PORTAL || Portal->mType == PORTS_LINKEDPORTAL) else //if (Portal->mType == PORTS_STACKEDSECTORTHING || Portal->mType == PORTS_PORTAL || Portal->mType == PORTS_LINKEDPORTAL)
{ {
//extralight = pl->extralight; //extralight = pl->extralight;
//swrenderer::R_SetVisibility(pl->visibility); //swrenderer::R_SetVisibility(pl->visibility);
ViewPos.X += Portal->mDisplacement.X; r_viewpoint.Pos.X += Portal->mDisplacement.X;
ViewPos.Y += Portal->mDisplacement.Y; r_viewpoint.Pos.Y += Portal->mDisplacement.Y;
} }
camera = nullptr; r_viewpoint.camera = nullptr;
viewsector = Portal->mDestination; r_viewpoint.sector = Portal->mDestination;
R_SetViewAngle(); R_SetViewAngle(r_viewpoint, r_viewwindow);
Portal->mFlags |= PORTSF_INSKYBOX; Portal->mFlags |= PORTSF_INSKYBOX;
if (Portal->mPartner > 0) level.sectorPortals[Portal->mPartner].mFlags |= PORTSF_INSKYBOX; if (Portal->mPartner > 0) level.sectorPortals[Portal->mPartner].mFlags |= PORTSF_INSKYBOX;
@ -124,13 +122,13 @@ void PolyDrawSectorPortal::RestoreGlobals()
Portal->mFlags &= ~PORTSF_INSKYBOX; Portal->mFlags &= ~PORTSF_INSKYBOX;
if (Portal->mPartner > 0) level.sectorPortals[Portal->mPartner].mFlags &= ~PORTSF_INSKYBOX; if (Portal->mPartner > 0) level.sectorPortals[Portal->mPartner].mFlags &= ~PORTSF_INSKYBOX;
camera = savedcamera; r_viewpoint.camera = savedcamera;
viewsector = savedsector; r_viewpoint.sector = savedsector;
ViewPos = savedpos; r_viewpoint.Pos = savedpos;
swrenderer::LightVisibility::Instance()->SetVisibility(savedvisibility); swrenderer::LightVisibility::Instance()->SetVisibility(savedvisibility);
extralight = savedextralight; r_viewpoint.extralight = savedextralight;
ViewAngle = savedangle; r_viewpoint.Angles = savedangles;
R_SetViewAngle(); R_SetViewAngle(r_viewpoint, r_viewwindow);
} }
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
@ -150,21 +148,21 @@ void PolyDrawLinePortal::Render(int portalDepth)
SaveGlobals(); SaveGlobals();
// To do: get this information from PolyRenderer instead of duplicating the code.. // To do: get this information from PolyRenderer instead of duplicating the code..
double radPitch = ViewPitch.Normalized180().Radians(); double radPitch = r_viewpoint.Angles.Pitch.Normalized180().Radians();
double angx = cos(radPitch); double angx = cos(radPitch);
double angy = sin(radPitch) * glset.pixelstretch; double angy = sin(radPitch) * glset.pixelstretch;
double alen = sqrt(angx*angx + angy*angy); double alen = sqrt(angx*angx + angy*angy);
float adjustedPitch = (float)asin(angy / alen); float adjustedPitch = (float)asin(angy / alen);
float adjustedViewAngle = (float)(ViewAngle - 90).Radians(); float adjustedViewAngle = (float)(r_viewpoint.Angles.Yaw - 90).Radians();
float ratio = WidescreenRatio; float ratio = r_viewwindow.WidescreenRatio;
float fovratio = (WidescreenRatio >= 1.3f) ? 1.333333f : ratio; float fovratio = (r_viewwindow.WidescreenRatio >= 1.3f) ? 1.333333f : ratio;
float fovy = (float)(2 * DAngle::ToDegrees(atan(tan(FieldOfView.Radians() / 2) / fovratio)).Degrees); float fovy = (float)(2 * DAngle::ToDegrees(atan(tan(r_viewpoint.FieldOfView.Radians() / 2) / fovratio)).Degrees);
TriMatrix worldToView = TriMatrix worldToView =
TriMatrix::rotate(adjustedPitch, 1.0f, 0.0f, 0.0f) * TriMatrix::rotate(adjustedPitch, 1.0f, 0.0f, 0.0f) *
TriMatrix::rotate(adjustedViewAngle, 0.0f, -1.0f, 0.0f) * TriMatrix::rotate(adjustedViewAngle, 0.0f, -1.0f, 0.0f) *
TriMatrix::scale(1.0f, glset.pixelstretch, 1.0f) * TriMatrix::scale(1.0f, glset.pixelstretch, 1.0f) *
TriMatrix::swapYZ() * TriMatrix::swapYZ() *
TriMatrix::translate((float)-ViewPos.X, (float)-ViewPos.Y, (float)-ViewPos.Z); TriMatrix::translate((float)-r_viewpoint.Pos.X, (float)-r_viewpoint.Pos.Y, (float)-r_viewpoint.Pos.Z);
if (Mirror) if (Mirror)
worldToView = TriMatrix::scale(-1.0f, 1.0f, 1.0f) * worldToView; worldToView = TriMatrix::scale(-1.0f, 1.0f, 1.0f) * worldToView;
TriMatrix worldToClip = TriMatrix::perspective(fovy, ratio, 5.0f, 65535.0f) * worldToView; TriMatrix worldToClip = TriMatrix::perspective(fovy, ratio, 5.0f, 65535.0f) * worldToView;
@ -193,30 +191,30 @@ void PolyDrawLinePortal::RenderTranslucent(int portalDepth)
void PolyDrawLinePortal::SaveGlobals() void PolyDrawLinePortal::SaveGlobals()
{ {
savedextralight = extralight; savedextralight = r_viewpoint.extralight;
savedpos = ViewPos; savedpos = r_viewpoint.Pos;
savedangle = ViewAngle; savedangles = r_viewpoint.Angles;
savedcamera = camera; savedcamera = r_viewpoint.camera;
savedsector = viewsector; savedsector = r_viewpoint.sector;
savedinvisibility = camera ? (camera->renderflags & RF_INVISIBLE) == RF_INVISIBLE : false; savedinvisibility = r_viewpoint.camera ? (r_viewpoint.camera->renderflags & RF_INVISIBLE) == RF_INVISIBLE : false;
savedViewPath[0] = ViewPath[0]; savedViewPath[0] = r_viewpoint.Path[0];
savedViewPath[1] = ViewPath[1]; savedViewPath[1] = r_viewpoint.Path[1];
if (Mirror) if (Mirror)
{ {
DAngle startang = ViewAngle; DAngle startang = r_viewpoint.Angles.Yaw;
DVector3 startpos = ViewPos; DVector3 startpos = r_viewpoint.Pos;
vertex_t *v1 = Mirror->v1; vertex_t *v1 = Mirror->v1;
// Reflect the current view behind the mirror. // Reflect the current view behind the mirror.
if (Mirror->Delta().X == 0) if (Mirror->Delta().X == 0)
{ // vertical mirror { // vertical mirror
ViewPos.X = v1->fX() - startpos.X + v1->fX(); r_viewpoint.Pos.X = v1->fX() - startpos.X + v1->fX();
} }
else if (Mirror->Delta().Y == 0) else if (Mirror->Delta().Y == 0)
{ // horizontal mirror { // horizontal mirror
ViewPos.Y = v1->fY() - startpos.Y + v1->fY(); r_viewpoint.Pos.Y = v1->fY() - startpos.Y + v1->fY();
} }
else else
{ // any mirror { // any mirror
@ -232,36 +230,36 @@ void PolyDrawLinePortal::SaveGlobals()
// the above two cases catch len == 0 // the above two cases catch len == 0
double r = ((x - x1)*dx + (y - y1)*dy) / (dx*dx + dy*dy); double r = ((x - x1)*dx + (y - y1)*dy) / (dx*dx + dy*dy);
ViewPos.X = (x1 + r * dx) * 2 - x; r_viewpoint.Pos.X = (x1 + r * dx) * 2 - x;
ViewPos.Y = (y1 + r * dy) * 2 - y; r_viewpoint.Pos.Y = (y1 + r * dy) * 2 - y;
} }
ViewAngle = Mirror->Delta().Angle() * 2 - startang; r_viewpoint.Angles.Yaw = Mirror->Delta().Angle() * 2 - startang;
if (camera) if (r_viewpoint.camera)
camera->renderflags &= ~RF_INVISIBLE; r_viewpoint.camera->renderflags &= ~RF_INVISIBLE;
} }
else else
{ {
auto src = Portal->mOrigin; auto src = Portal->mOrigin;
auto dst = Portal->mDestination; auto dst = Portal->mDestination;
P_TranslatePortalXY(src, ViewPos.X, ViewPos.Y); P_TranslatePortalXY(src, r_viewpoint.Pos.X, r_viewpoint.Pos.Y);
P_TranslatePortalZ(src, ViewPos.Z); P_TranslatePortalZ(src, r_viewpoint.Pos.Z);
P_TranslatePortalAngle(src, ViewAngle); P_TranslatePortalAngle(src, r_viewpoint.Angles.Yaw);
P_TranslatePortalXY(src, ViewPath[0].X, ViewPath[0].Y); P_TranslatePortalXY(src, r_viewpoint.Path[0].X, r_viewpoint.Path[0].Y);
P_TranslatePortalXY(src, ViewPath[1].X, ViewPath[1].Y); P_TranslatePortalXY(src, r_viewpoint.Path[1].X, r_viewpoint.Path[1].Y);
if (!r_showviewer && camera && P_PointOnLineSidePrecise(ViewPath[0], dst) != P_PointOnLineSidePrecise(ViewPath[1], dst)) if (!r_viewpoint.showviewer && r_viewpoint.camera && P_PointOnLineSidePrecise(r_viewpoint.Path[0], dst) != P_PointOnLineSidePrecise(r_viewpoint.Path[1], dst))
{ {
double distp = (ViewPath[0] - ViewPath[1]).Length(); double distp = (r_viewpoint.Path[0] - r_viewpoint.Path[1]).Length();
if (distp > EQUAL_EPSILON) if (distp > EQUAL_EPSILON)
{ {
double dist1 = (ViewPos - ViewPath[0]).Length(); double dist1 = (r_viewpoint.Pos - r_viewpoint.Path[0]).Length();
double dist2 = (ViewPos - ViewPath[1]).Length(); double dist2 = (r_viewpoint.Pos - r_viewpoint.Path[1]).Length();
if (dist1 + dist2 < distp + 1) if (dist1 + dist2 < distp + 1)
{ {
camera->renderflags |= RF_INVISIBLE; r_viewpoint.camera->renderflags |= RF_INVISIBLE;
} }
} }
} }
@ -269,7 +267,7 @@ void PolyDrawLinePortal::SaveGlobals()
//camera = nullptr; //camera = nullptr;
//viewsector = R_PointInSubsector(ViewPos)->sector; //viewsector = R_PointInSubsector(ViewPos)->sector;
R_SetViewAngle(); R_SetViewAngle(r_viewpoint, r_viewwindow);
if (Mirror) if (Mirror)
PolyTriangleDrawer::toggle_mirror(); PolyTriangleDrawer::toggle_mirror();
@ -277,21 +275,21 @@ void PolyDrawLinePortal::SaveGlobals()
void PolyDrawLinePortal::RestoreGlobals() void PolyDrawLinePortal::RestoreGlobals()
{ {
if (camera) if (r_viewpoint.camera)
{ {
if (savedinvisibility) if (savedinvisibility)
camera->renderflags |= RF_INVISIBLE; r_viewpoint.camera->renderflags |= RF_INVISIBLE;
else else
camera->renderflags &= ~RF_INVISIBLE; r_viewpoint.camera->renderflags &= ~RF_INVISIBLE;
} }
camera = savedcamera; r_viewpoint.camera = savedcamera;
viewsector = savedsector; r_viewpoint.sector = savedsector;
ViewPos = savedpos; r_viewpoint.Pos = savedpos;
extralight = savedextralight; r_viewpoint.extralight = savedextralight;
ViewAngle = savedangle; r_viewpoint.Angles = savedangles;
ViewPath[0] = savedViewPath[0]; r_viewpoint.Path[0] = savedViewPath[0];
ViewPath[1] = savedViewPath[1]; r_viewpoint.Path[1] = savedViewPath[1];
R_SetViewAngle(); R_SetViewAngle(r_viewpoint, r_viewwindow);
if (Mirror) if (Mirror)
PolyTriangleDrawer::toggle_mirror(); PolyTriangleDrawer::toggle_mirror();

View file

@ -63,7 +63,7 @@ private:
int savedextralight; int savedextralight;
DVector3 savedpos; DVector3 savedpos;
DAngle savedangle; DRotator savedangles;
double savedvisibility; double savedvisibility;
AActor *savedcamera; AActor *savedcamera;
sector_t *savedsector; sector_t *savedsector;
@ -92,7 +92,7 @@ private:
int savedextralight; int savedextralight;
DVector3 savedpos; DVector3 savedpos;
DAngle savedangle; DRotator savedangles;
AActor *savedcamera; AActor *savedcamera;
sector_t *savedsector; sector_t *savedsector;
bool savedinvisibility; bool savedinvisibility;

View file

@ -187,8 +187,8 @@ void RenderPolyScene::RenderSprite(AActor *thing, double sortDistance, DVector2
void RenderPolyScene::RenderLine(subsector_t *sub, seg_t *line, sector_t *frontsector, uint32_t subsectorDepth) void RenderPolyScene::RenderLine(subsector_t *sub, seg_t *line, sector_t *frontsector, uint32_t subsectorDepth)
{ {
// Reject lines not facing viewer // Reject lines not facing viewer
DVector2 pt1 = line->v1->fPos() - ViewPos; DVector2 pt1 = line->v1->fPos() - r_viewpoint.Pos;
DVector2 pt2 = line->v2->fPos() - ViewPos; DVector2 pt2 = line->v2->fPos() - r_viewpoint.Pos;
if (pt1.Y * (pt1.X - pt2.X) + pt1.X * (pt2.Y - pt1.Y) >= 0) if (pt1.Y * (pt1.X - pt2.X) + pt1.X * (pt2.Y - pt1.Y) >= 0)
return; return;
@ -335,7 +335,7 @@ void RenderPolyScene::RenderTranslucent(int portalDepth)
DVector2 left, right; DVector2 left, right;
if (!RenderPolySprite::GetLine(thing, left, right)) if (!RenderPolySprite::GetLine(thing, left, right))
continue; continue;
double distanceSquared = (thing->Pos() - ViewPos).LengthSquared(); double distanceSquared = (thing->Pos() - r_viewpoint.Pos).LengthSquared();
RenderSprite(thing, distanceSquared, left, right); RenderSprite(thing, distanceSquared, left, right);
} }
} }

View file

@ -50,7 +50,7 @@ void PolySkyDome::Render(const TriMatrix &worldToClip)
if (level.flags & LEVEL_DOUBLESKY) if (level.flags & LEVEL_DOUBLESKY)
backskytex = TexMan(sky2tex, true); backskytex = TexMan(sky2tex, true);
TriMatrix objectToWorld = TriMatrix::translate((float)ViewPos.X, (float)ViewPos.Y, (float)ViewPos.Z); TriMatrix objectToWorld = TriMatrix::translate((float)r_viewpoint.Pos.X, (float)r_viewpoint.Pos.Y, (float)r_viewpoint.Pos.Z);
objectToClip = worldToClip * objectToWorld; objectToClip = worldToClip * objectToWorld;
int rc = mRows + 1; int rc = mRows + 1;

View file

@ -38,7 +38,7 @@ bool RenderPolySprite::GetLine(AActor *thing, DVector2 &left, DVector2 &right)
if (IsThingCulled(thing)) if (IsThingCulled(thing))
return false; return false;
DVector3 pos = thing->InterpolatedPosition(r_TicFracF); DVector3 pos = thing->InterpolatedPosition(r_viewpoint.TicFrac);
bool flipTextureX = false; bool flipTextureX = false;
FTexture *tex = GetSpriteTexture(thing, flipTextureX); FTexture *tex = GetSpriteTexture(thing, flipTextureX);
@ -59,8 +59,8 @@ bool RenderPolySprite::GetLine(AActor *thing, DVector2 &left, DVector2 &right)
pos.X += spriteHalfWidth; pos.X += spriteHalfWidth;
left = DVector2(pos.X - ViewSin * spriteHalfWidth, pos.Y + ViewCos * spriteHalfWidth); left = DVector2(pos.X - r_viewpoint.Sin * spriteHalfWidth, pos.Y + r_viewpoint.Cos * spriteHalfWidth);
right = DVector2(pos.X + ViewSin * spriteHalfWidth, pos.Y - ViewCos * spriteHalfWidth); right = DVector2(pos.X + r_viewpoint.Sin * spriteHalfWidth, pos.Y - r_viewpoint.Cos * spriteHalfWidth);
return true; return true;
} }
@ -70,8 +70,8 @@ void RenderPolySprite::Render(const TriMatrix &worldToClip, const Vec4f &clipPla
if (!GetLine(thing, line[0], line[1])) if (!GetLine(thing, line[0], line[1]))
return; return;
DVector3 pos = thing->InterpolatedPosition(r_TicFracF); DVector3 pos = thing->InterpolatedPosition(r_viewpoint.TicFrac);
pos.Z += thing->GetBobOffset(r_TicFracF); pos.Z += thing->GetBobOffset(r_viewpoint.TicFrac);
bool flipTextureX = false; bool flipTextureX = false;
FTexture *tex = GetSpriteTexture(thing, flipTextureX); FTexture *tex = GetSpriteTexture(thing, flipTextureX);
@ -105,7 +105,7 @@ void RenderPolySprite::Render(const TriMatrix &worldToClip, const Vec4f &clipPla
return; return;
bool foggy = false; bool foggy = false;
int actualextralight = foggy ? 0 : extralight << 4; int actualextralight = foggy ? 0 : r_viewpoint.extralight << 4;
std::pair<float, float> offsets[4] = std::pair<float, float> offsets[4] =
{ {
@ -273,7 +273,7 @@ bool RenderPolySprite::IsThingCulled(AActor *thing)
FIntCVar *cvar = thing->GetClass()->distancecheck; FIntCVar *cvar = thing->GetClass()->distancecheck;
if (cvar != nullptr && *cvar >= 0) if (cvar != nullptr && *cvar >= 0)
{ {
double dist = (thing->Pos() - ViewPos).LengthSquared(); double dist = (thing->Pos() - r_viewpoint.Pos).LengthSquared();
double check = (double)**cvar; double check = (double)**cvar;
if (dist >= check * check) if (dist >= check * check)
return true; return true;
@ -385,9 +385,9 @@ FTexture *RenderPolySprite::GetSpriteTexture(AActor *thing, /*out*/ bool &flipX)
{ {
// choose a different rotation based on player view // choose a different rotation based on player view
spriteframe_t *sprframe = &SpriteFrames[tex->Rotations]; spriteframe_t *sprframe = &SpriteFrames[tex->Rotations];
DVector3 pos = thing->InterpolatedPosition(r_TicFracF); DVector3 pos = thing->InterpolatedPosition(r_viewpoint.TicFrac);
pos.Z += thing->GetBobOffset(r_TicFracF); pos.Z += thing->GetBobOffset(r_viewpoint.TicFrac);
DAngle ang = (pos - ViewPos).Angle(); DAngle ang = (pos - r_viewpoint.Pos).Angle();
angle_t rot; angle_t rot;
if (sprframe->Texture[0] == sprframe->Texture[1]) if (sprframe->Texture[0] == sprframe->Texture[1])
{ {
@ -420,9 +420,9 @@ FTexture *RenderPolySprite::GetSpriteTexture(AActor *thing, /*out*/ bool &flipX)
//picnum = SpriteFrames[sprdef->spriteframes + thing->frame].Texture[0]; //picnum = SpriteFrames[sprdef->spriteframes + thing->frame].Texture[0];
// choose a different rotation based on player view // choose a different rotation based on player view
spriteframe_t *sprframe = &SpriteFrames[sprdef->spriteframes + thing->frame]; spriteframe_t *sprframe = &SpriteFrames[sprdef->spriteframes + thing->frame];
DVector3 pos = thing->InterpolatedPosition(r_TicFracF); DVector3 pos = thing->InterpolatedPosition(r_viewpoint.TicFrac);
pos.Z += thing->GetBobOffset(r_TicFracF); pos.Z += thing->GetBobOffset(r_viewpoint.TicFrac);
DAngle ang = (pos - ViewPos).Angle(); DAngle ang = (pos - r_viewpoint.Pos).Angle();
angle_t rot; angle_t rot;
if (sprframe->Texture[0] == sprframe->Texture[1]) if (sprframe->Texture[0] == sprframe->Texture[1])
{ {

View file

@ -362,7 +362,7 @@ int RenderPolyWall::GetLightLevel()
else else
{ {
bool foggy = false; bool foggy = false;
int actualextralight = foggy ? 0 : extralight << 4; int actualextralight = foggy ? 0 : r_viewpoint.extralight << 4;
return clamp(Side->GetLightLevel(foggy, LineSeg->frontsector->lightlevel) + actualextralight, 0, 255); return clamp(Side->GetLightLevel(foggy, LineSeg->frontsector->lightlevel) + actualextralight, 0, 255);
} }
} }

View file

@ -34,8 +34,8 @@ void RenderPolyWallSprite::Render(const TriMatrix &worldToClip, const Vec4f &cli
if (RenderPolySprite::IsThingCulled(thing)) if (RenderPolySprite::IsThingCulled(thing))
return; return;
DVector3 pos = thing->InterpolatedPosition(r_TicFracF); DVector3 pos = thing->InterpolatedPosition(r_viewpoint.TicFrac);
pos.Z += thing->GetBobOffset(r_TicFracF); pos.Z += thing->GetBobOffset(r_viewpoint.TicFrac);
bool flipTextureX = false; bool flipTextureX = false;
FTexture *tex = RenderPolySprite::GetSpriteTexture(thing, flipTextureX); FTexture *tex = RenderPolySprite::GetSpriteTexture(thing, flipTextureX);
@ -73,7 +73,7 @@ void RenderPolyWallSprite::Render(const TriMatrix &worldToClip, const Vec4f &cli
return; return;
bool foggy = false; bool foggy = false;
int actualextralight = foggy ? 0 : extralight << 4; int actualextralight = foggy ? 0 : r_viewpoint.extralight << 4;
std::pair<float, float> offsets[4] = std::pair<float, float> offsets[4] =
{ {

View file

@ -133,8 +133,8 @@ void R_InitSkyMap ()
skyiscale = float(r_Yaspect / freelookviewheight); skyiscale = float(r_Yaspect / freelookviewheight);
skyscale = freelookviewheight / r_Yaspect; skyscale = freelookviewheight / r_Yaspect;
skyiscale *= float(FieldOfView.Degrees / 90.); skyiscale *= float(r_viewpoint.FieldOfView.Degrees / 90.);
skyscale *= float(90. / FieldOfView.Degrees); skyscale *= float(90. / r_viewpoint.FieldOfView.Degrees);
} }
if (skystretch) if (skystretch)

View file

@ -106,46 +106,43 @@ int viewwindowy;
int viewwidth; int viewwidth;
int viewheight; int viewheight;
DVector3 ViewPos; FRenderViewpoint::FRenderViewpoint()
DVector3 ViewActorPos; // the actual position of the viewing actor, without interpolation and quake offsets. {
DAngle ViewAngle; player = nullptr;
DAngle ViewPitch; Pos = { 0.0, 0.0, 0.0 };
DAngle ViewRoll; ActorPos = { 0.0, 0.0, 0.0 };
DVector3 ViewPath[2]; Angles = { 0.0, 0.0, 0.0 };
double ViewCos, ViewTanCos; Path[0] = { 0.0, 0.0, 0.0 };
double ViewSin, ViewTanSin; Path[1] = { 0.0, 0.0, 0.0 };
Cos = 0.0;
Sin = 0.0;
TanCos = 0.0;
TanSin = 0.0;
camera = nullptr;
sector = nullptr;
FieldOfView = 90.; // Angles in the SCREENWIDTH wide window
TicFrac = 0.0;
FrameTime = 0;
extralight = 0;
showviewer = false;
}
FRenderViewpoint r_viewpoint;
int centerx; FViewWindow r_viewwindow;
int centery;
int centerxwide;
int otic; int otic;
sector_t *viewsector;
AActor *camera; // [RH] camera to draw from. doesn't have to be a player
double r_TicFracF; // same as floating point
uint32_t r_FrameTime; // [RH] Time this frame started drawing (in ms)
bool r_NoInterpolate; bool r_NoInterpolate;
bool r_showviewer;
angle_t LocalViewAngle; angle_t LocalViewAngle;
int LocalViewPitch; int LocalViewPitch;
bool LocalKeyboardTurner; bool LocalKeyboardTurner;
float WidescreenRatio;
int setblocks; int setblocks;
int extralight;
bool setsizeneeded; bool setsizeneeded;
double FocalTangent;
unsigned int R_OldBlend = ~0; unsigned int R_OldBlend = ~0;
int validcount = 1; // increment every time a check is made int validcount = 1; // increment every time a check is made
DAngle FieldOfView = 90.; // Angles in the SCREENWIDTH wide window
FCanvasTextureInfo *FCanvasTextureInfo::List; FCanvasTextureInfo *FCanvasTextureInfo::List;
DVector3a view; DVector3a view;
@ -163,14 +160,14 @@ static void R_Shutdown ();
// //
//========================================================================== //==========================================================================
void R_SetFOV (DAngle fov) void R_SetFOV (FRenderViewpoint &viewpoint, DAngle fov)
{ {
if (fov < 5.) fov = 5.; if (fov < 5.) fov = 5.;
else if (fov > 170.) fov = 170.; else if (fov > 170.) fov = 170.;
if (fov != FieldOfView) if (fov != viewpoint.FieldOfView)
{ {
FieldOfView = fov; viewpoint.FieldOfView = fov;
setsizeneeded = true; setsizeneeded = true;
} }
} }
@ -196,7 +193,7 @@ void R_SetViewSize (int blocks)
// //
//========================================================================== //==========================================================================
void R_SetWindow (int windowSize, int fullWidth, int fullHeight, int stHeight, bool renderingToCanvas) void R_SetWindow (FRenderViewpoint &viewpoint, FViewWindow &viewwindow, int windowSize, int fullWidth, int fullHeight, int stHeight, bool renderingToCanvas)
{ {
if (windowSize >= 11) if (windowSize >= 11)
{ {
@ -218,11 +215,11 @@ void R_SetWindow (int windowSize, int fullWidth, int fullHeight, int stHeight, b
if (renderingToCanvas) if (renderingToCanvas)
{ {
WidescreenRatio = fullWidth / (float)fullHeight; viewwindow.WidescreenRatio = fullWidth / (float)fullHeight;
} }
else else
{ {
WidescreenRatio = ActiveRatio(fullWidth, fullHeight); viewwindow.WidescreenRatio = ActiveRatio(fullWidth, fullHeight);
} }
DrawFSHUD = (windowSize == 11); DrawFSHUD = (windowSize == 11);
@ -230,28 +227,28 @@ void R_SetWindow (int windowSize, int fullWidth, int fullHeight, int stHeight, b
// [RH] Sky height fix for screens not 200 (or 240) pixels tall // [RH] Sky height fix for screens not 200 (or 240) pixels tall
R_InitSkyMap (); R_InitSkyMap ();
centery = viewheight/2; viewwindow.centery = viewheight/2;
centerx = viewwidth/2; viewwindow.centerx = viewwidth/2;
if (AspectTallerThanWide(WidescreenRatio)) if (AspectTallerThanWide(viewwindow.WidescreenRatio))
{ {
centerxwide = centerx; viewwindow.centerxwide = viewwindow.centerx;
} }
else else
{ {
centerxwide = centerx * AspectMultiplier(WidescreenRatio) / 48; viewwindow.centerxwide = viewwindow.centerx * AspectMultiplier(viewwindow.WidescreenRatio) / 48;
} }
DAngle fov = FieldOfView; DAngle fov = viewpoint.FieldOfView;
// For widescreen displays, increase the FOV so that the middle part of the // For widescreen displays, increase the FOV so that the middle part of the
// screen that would be visible on a 4:3 display has the requested FOV. // screen that would be visible on a 4:3 display has the requested FOV.
if (centerxwide != centerx) if (viewwindow.centerxwide != viewwindow.centerx)
{ // centerxwide is what centerx would be if the display was not widescreen { // centerxwide is what centerx would be if the display was not widescreen
fov = DAngle::ToDegrees(2 * atan(centerx * tan(fov.Radians()/2) / double(centerxwide))); fov = DAngle::ToDegrees(2 * atan(viewwindow.centerx * tan(fov.Radians()/2) / double(viewwindow.centerxwide)));
if (fov > 170.) fov = 170.; if (fov > 170.) fov = 170.;
} }
FocalTangent = tan(fov.Radians() / 2); viewwindow.FocalTangent = tan(fov.Radians() / 2);
} }
//========================================================================== //==========================================================================
@ -260,12 +257,12 @@ void R_SetWindow (int windowSize, int fullWidth, int fullHeight, int stHeight, b
// //
//========================================================================== //==========================================================================
void R_ExecuteSetViewSize () void R_ExecuteSetViewSize (FRenderViewpoint &viewpoint, FViewWindow &viewwindow)
{ {
setsizeneeded = false; setsizeneeded = false;
V_SetBorderNeedRefresh(); V_SetBorderNeedRefresh();
R_SetWindow (setblocks, SCREENWIDTH, SCREENHEIGHT, gST_Y); R_SetWindow (viewpoint, viewwindow, setblocks, SCREENWIDTH, SCREENHEIGHT, gST_Y);
// Handle resize, e.g. smaller view windows with border and/or status bar. // Handle resize, e.g. smaller view windows with border and/or status bar.
viewwindowx = (screen->GetWidth() - viewwidth) >> 1; viewwindowx = (screen->GetWidth() - viewwidth) >> 1;
@ -361,7 +358,7 @@ static void R_Shutdown ()
//CVAR (Int, tf, 0, 0) //CVAR (Int, tf, 0, 0)
EXTERN_CVAR (Bool, cl_noprediction) EXTERN_CVAR (Bool, cl_noprediction)
void R_InterpolateView (player_t *player, double Frac, InterpolationViewer *iview) void R_InterpolateView (FRenderViewpoint &viewpoint, player_t *player, double Frac, InterpolationViewer *iview)
{ {
if (NoInterpolateView) if (NoInterpolateView)
{ {
@ -384,7 +381,7 @@ void R_InterpolateView (player_t *player, double Frac, InterpolationViewer *ivie
// What needs be done is to store the portal transitions of the camera actor as waypoints // What needs be done is to store the portal transitions of the camera actor as waypoints
// and then find out on which part of the path the current view lies. // and then find out on which part of the path the current view lies.
// Needless to say, this doesn't work for chasecam mode. // Needless to say, this doesn't work for chasecam mode.
if (!r_showviewer) if (!viewpoint.showviewer)
{ {
double pathlen = 0; double pathlen = 0;
double zdiff = 0; double zdiff = 0;
@ -426,34 +423,34 @@ void R_InterpolateView (player_t *player, double Frac, InterpolationViewer *ivie
oviewangle += adiff; oviewangle += adiff;
nviewangle -= totaladiff - adiff; nviewangle -= totaladiff - adiff;
DVector2 viewpos = start.pos + (fragfrac * (end.pos - start.pos)); DVector2 viewpos = start.pos + (fragfrac * (end.pos - start.pos));
ViewPos = { viewpos, oviewz + Frac * (nviewz - oviewz) }; viewpoint.Pos = { viewpos, oviewz + Frac * (nviewz - oviewz) };
break; break;
} }
} }
InterpolationPath.Pop(); InterpolationPath.Pop();
ViewPath[0] = iview->Old.Pos; viewpoint.Path[0] = iview->Old.Pos;
ViewPath[1] = ViewPath[0] + (InterpolationPath[0].pos - ViewPath[0]).XY().MakeResize(pathlen); viewpoint.Path[1] = viewpoint.Path[0] + (InterpolationPath[0].pos - viewpoint.Path[0]).XY().MakeResize(pathlen);
} }
} }
else else
{ {
DVector2 disp = Displacements.getOffset(oldgroup, newgroup); DVector2 disp = Displacements.getOffset(oldgroup, newgroup);
ViewPos = iview->Old.Pos + (iview->New.Pos - iview->Old.Pos - disp) * Frac; viewpoint.Pos = iview->Old.Pos + (iview->New.Pos - iview->Old.Pos - disp) * Frac;
ViewPath[0] = ViewPath[1] = iview->New.Pos; viewpoint.Path[0] = viewpoint.Path[1] = iview->New.Pos;
} }
} }
else else
{ {
ViewPos = iview->New.Pos; viewpoint.Pos = iview->New.Pos;
ViewPath[0] = ViewPath[1] = iview->New.Pos; viewpoint.Path[0] = viewpoint.Path[1] = iview->New.Pos;
} }
if (player != NULL && if (player != NULL &&
!(player->cheats & CF_INTERPVIEW) && !(player->cheats & CF_INTERPVIEW) &&
player - players == consoleplayer && player - players == consoleplayer &&
camera == player->mo && viewpoint.camera == player->mo &&
!demoplayback && !demoplayback &&
iview->New.Pos.X == camera->X() && iview->New.Pos.X == viewpoint.camera->X() &&
iview->New.Pos.Y == camera->Y() && iview->New.Pos.Y == viewpoint.camera->Y() &&
!(player->cheats & (CF_TOTALLYFROZEN|CF_FROZEN)) && !(player->cheats & (CF_TOTALLYFROZEN|CF_FROZEN)) &&
player->playerstate == PST_LIVE && player->playerstate == PST_LIVE &&
player->mo->reactiontime == 0 && player->mo->reactiontime == 0 &&
@ -462,41 +459,41 @@ void R_InterpolateView (player_t *player, double Frac, InterpolationViewer *ivie
(!netgame || !cl_noprediction) && (!netgame || !cl_noprediction) &&
!LocalKeyboardTurner) !LocalKeyboardTurner)
{ {
ViewAngle = (nviewangle + AngleToFloat(LocalViewAngle & 0xFFFF0000)).Normalized180(); viewpoint.Angles.Yaw = (nviewangle + AngleToFloat(LocalViewAngle & 0xFFFF0000)).Normalized180();
DAngle delta = player->centering ? DAngle(0.) : AngleToFloat(int(LocalViewPitch & 0xFFFF0000)); DAngle delta = player->centering ? DAngle(0.) : AngleToFloat(int(LocalViewPitch & 0xFFFF0000));
ViewPitch = clamp<DAngle>((iview->New.Angles.Pitch - delta).Normalized180(), player->MinPitch, player->MaxPitch); viewpoint.Angles.Pitch = clamp<DAngle>((iview->New.Angles.Pitch - delta).Normalized180(), player->MinPitch, player->MaxPitch);
ViewRoll = iview->New.Angles.Roll.Normalized180(); viewpoint.Angles.Roll = iview->New.Angles.Roll.Normalized180();
} }
else else
{ {
ViewPitch = (iview->Old.Angles.Pitch + deltaangle(iview->Old.Angles.Pitch, iview->New.Angles.Pitch) * Frac).Normalized180(); viewpoint.Angles.Pitch = (iview->Old.Angles.Pitch + deltaangle(iview->Old.Angles.Pitch, iview->New.Angles.Pitch) * Frac).Normalized180();
ViewAngle = (oviewangle + deltaangle(oviewangle, nviewangle) * Frac).Normalized180(); viewpoint.Angles.Yaw = (oviewangle + deltaangle(oviewangle, nviewangle) * Frac).Normalized180();
ViewRoll = (iview->Old.Angles.Roll + deltaangle(iview->Old.Angles.Roll, iview->New.Angles.Roll) * Frac).Normalized180(); viewpoint.Angles.Roll = (iview->Old.Angles.Roll + deltaangle(iview->Old.Angles.Roll, iview->New.Angles.Roll) * Frac).Normalized180();
} }
// Due to interpolation this is not necessarily the same as the sector the camera is in. // Due to interpolation this is not necessarily the same as the sector the camera is in.
viewsector = R_PointInSubsector(ViewPos)->sector; viewpoint.sector = R_PointInSubsector(viewpoint.Pos)->sector;
bool moved = false; bool moved = false;
while (!viewsector->PortalBlocksMovement(sector_t::ceiling)) while (!viewpoint.sector->PortalBlocksMovement(sector_t::ceiling))
{ {
if (ViewPos.Z > viewsector->GetPortalPlaneZ(sector_t::ceiling)) if (viewpoint.Pos.Z > viewpoint.sector->GetPortalPlaneZ(sector_t::ceiling))
{ {
ViewPos += viewsector->GetPortalDisplacement(sector_t::ceiling); viewpoint.Pos += viewpoint.sector->GetPortalDisplacement(sector_t::ceiling);
ViewActorPos += viewsector->GetPortalDisplacement(sector_t::ceiling); viewpoint.ActorPos += viewpoint.sector->GetPortalDisplacement(sector_t::ceiling);
viewsector = R_PointInSubsector(ViewPos)->sector; viewpoint.sector = R_PointInSubsector(viewpoint.Pos)->sector;
moved = true; moved = true;
} }
else break; else break;
} }
if (!moved) if (!moved)
{ {
while (!viewsector->PortalBlocksMovement(sector_t::floor)) while (!viewpoint.sector->PortalBlocksMovement(sector_t::floor))
{ {
if (ViewPos.Z < viewsector->GetPortalPlaneZ(sector_t::floor)) if (viewpoint.Pos.Z < viewpoint.sector->GetPortalPlaneZ(sector_t::floor))
{ {
ViewPos += viewsector->GetPortalDisplacement(sector_t::floor); viewpoint.Pos += viewpoint.sector->GetPortalDisplacement(sector_t::floor);
ViewActorPos += viewsector->GetPortalDisplacement(sector_t::floor); viewpoint.ActorPos += viewpoint.sector->GetPortalDisplacement(sector_t::floor);
viewsector = R_PointInSubsector(ViewPos)->sector; viewpoint.sector = R_PointInSubsector(viewpoint.Pos)->sector;
moved = true; moved = true;
} }
else break; else break;
@ -522,13 +519,13 @@ void R_ResetViewInterpolation ()
// //
//========================================================================== //==========================================================================
void R_SetViewAngle () void R_SetViewAngle (FRenderViewpoint &viewpoint, const FViewWindow &viewwindow)
{ {
ViewSin = ViewAngle.Sin(); viewpoint.Sin = viewpoint.Angles.Yaw.Sin();
ViewCos = ViewAngle.Cos(); viewpoint.Cos = viewpoint.Angles.Yaw.Cos();
ViewTanSin = FocalTangent * ViewSin; viewpoint.TanSin = viewwindow.FocalTangent * viewpoint.Sin;
ViewTanCos = FocalTangent * ViewCos; viewpoint.TanCos = viewwindow.FocalTangent * viewpoint.Cos;
} }
//========================================================================== //==========================================================================
@ -677,7 +674,7 @@ static double QuakePower(double factor, double intensity, double offset)
// //
//========================================================================== //==========================================================================
void R_SetupFrame (AActor *actor) void R_SetupFrame (FRenderViewpoint &viewpoint, FViewWindow &viewwindow, AActor *actor)
{ {
if (actor == NULL) if (actor == NULL)
{ {
@ -691,23 +688,23 @@ void R_SetupFrame (AActor *actor)
if (player != NULL && player->mo == actor) if (player != NULL && player->mo == actor)
{ // [RH] Use camera instead of viewplayer { // [RH] Use camera instead of viewplayer
camera = player->camera; viewpoint.camera = player->camera;
if (camera == NULL) if (viewpoint.camera == NULL)
{ {
camera = player->camera = player->mo; viewpoint.camera = player->camera = player->mo;
} }
} }
else else
{ {
camera = actor; viewpoint.camera = actor;
} }
if (camera == NULL) if (viewpoint.camera == NULL)
{ {
I_Error ("You lost your body. Bad dehacked work is likely to blame."); I_Error ("You lost your body. Bad dehacked work is likely to blame.");
} }
iview = FindPastViewer (camera); iview = FindPastViewer (viewpoint.camera);
int nowtic = I_GetTime (false); int nowtic = I_GetTime (false);
if (iview->otic != -1 && nowtic > iview->otic) if (iview->otic != -1 && nowtic > iview->otic)
@ -717,38 +714,38 @@ void R_SetupFrame (AActor *actor)
} }
if (player != NULL && gamestate != GS_TITLELEVEL && if (player != NULL && gamestate != GS_TITLELEVEL &&
((player->cheats & CF_CHASECAM) || (r_deathcamera && camera->health <= 0))) ((player->cheats & CF_CHASECAM) || (r_deathcamera && viewpoint.camera->health <= 0)))
{ {
sector_t *oldsector = R_PointInSubsector(iview->Old.Pos)->sector; sector_t *oldsector = R_PointInSubsector(iview->Old.Pos)->sector;
// [RH] Use chasecam view // [RH] Use chasecam view
DVector3 campos; DVector3 campos;
DAngle camangle; DAngle camangle;
P_AimCamera (camera, campos, camangle, viewsector, unlinked); // fixme: This needs to translate the angle, too. P_AimCamera (viewpoint.camera, campos, camangle, viewpoint.sector, unlinked); // fixme: This needs to translate the angle, too.
iview->New.Pos = campos; iview->New.Pos = campos;
iview->New.Angles.Yaw = camangle; iview->New.Angles.Yaw = camangle;
r_showviewer = true; viewpoint.showviewer = true;
// Interpolating this is a very complicated thing because nothing keeps track of the aim camera's movement, so whenever we detect a portal transition // Interpolating this is a very complicated thing because nothing keeps track of the aim camera's movement, so whenever we detect a portal transition
// it's probably best to just reset the interpolation for this move. // it's probably best to just reset the interpolation for this move.
// Note that this can still cause problems with unusually linked portals // Note that this can still cause problems with unusually linked portals
if (viewsector->PortalGroup != oldsector->PortalGroup || (unlinked && ((iview->New.Pos.XY() - iview->Old.Pos.XY()).LengthSquared()) > 256*256)) if (viewpoint.sector->PortalGroup != oldsector->PortalGroup || (unlinked && ((iview->New.Pos.XY() - iview->Old.Pos.XY()).LengthSquared()) > 256*256))
{ {
iview->otic = nowtic; iview->otic = nowtic;
iview->Old = iview->New; iview->Old = iview->New;
r_NoInterpolate = true; r_NoInterpolate = true;
} }
ViewActorPos = campos; viewpoint.ActorPos = campos;
} }
else else
{ {
ViewActorPos = iview->New.Pos = { camera->Pos().XY(), camera->player ? camera->player->viewz : camera->Z() + camera->GetCameraHeight() }; viewpoint.ActorPos = iview->New.Pos = { viewpoint.camera->Pos().XY(), viewpoint.camera->player ? viewpoint.camera->player->viewz : viewpoint.camera->Z() + viewpoint.camera->GetCameraHeight() };
viewsector = camera->Sector; viewpoint.sector = viewpoint.camera->Sector;
r_showviewer = false; viewpoint.showviewer = false;
} }
iview->New.Angles = camera->Angles; iview->New.Angles = viewpoint.camera->Angles;
if (camera->player != 0) if (viewpoint.camera->player != 0)
{ {
player = camera->player; player = viewpoint.camera->player;
} }
if (iview->otic == -1 || r_NoInterpolate) if (iview->otic == -1 || r_NoInterpolate)
@ -757,33 +754,33 @@ void R_SetupFrame (AActor *actor)
iview->otic = nowtic; iview->otic = nowtic;
} }
r_TicFracF = I_GetTimeFrac (&r_FrameTime); viewpoint.TicFrac = I_GetTimeFrac (&viewpoint.FrameTime);
if (cl_capfps || r_NoInterpolate) if (cl_capfps || r_NoInterpolate)
{ {
r_TicFracF = 1.; viewpoint.TicFrac = 1.;
} }
R_InterpolateView (player, r_TicFracF, iview); R_InterpolateView (viewpoint, player, viewpoint.TicFrac, iview);
R_SetViewAngle (); R_SetViewAngle (viewpoint, viewwindow);
interpolator.DoInterpolations (r_TicFracF); interpolator.DoInterpolations (viewpoint.TicFrac);
// Keep the view within the sector's floor and ceiling // Keep the view within the sector's floor and ceiling
if (viewsector->PortalBlocksMovement(sector_t::ceiling)) if (viewpoint.sector->PortalBlocksMovement(sector_t::ceiling))
{ {
double theZ = viewsector->ceilingplane.ZatPoint(ViewPos) - 4; double theZ = viewpoint.sector->ceilingplane.ZatPoint(viewpoint.Pos) - 4;
if (ViewPos.Z > theZ) if (viewpoint.Pos.Z > theZ)
{ {
ViewPos.Z = theZ; viewpoint.Pos.Z = theZ;
} }
} }
if (viewsector->PortalBlocksMovement(sector_t::floor)) if (viewpoint.sector->PortalBlocksMovement(sector_t::floor))
{ {
double theZ = viewsector->floorplane.ZatPoint(ViewPos) + 4; double theZ = viewpoint.sector->floorplane.ZatPoint(viewpoint.Pos) + 4;
if (ViewPos.Z < theZ) if (viewpoint.Pos.Z < theZ)
{ {
ViewPos.Z = theZ; viewpoint.Pos.Z = theZ;
} }
} }
@ -792,62 +789,62 @@ void R_SetupFrame (AActor *actor)
FQuakeJiggers jiggers; FQuakeJiggers jiggers;
memset(&jiggers, 0, sizeof(jiggers)); memset(&jiggers, 0, sizeof(jiggers));
if (DEarthquake::StaticGetQuakeIntensities(camera, jiggers) > 0) if (DEarthquake::StaticGetQuakeIntensities(viewpoint.camera, jiggers) > 0)
{ {
double quakefactor = r_quakeintensity; double quakefactor = r_quakeintensity;
DAngle an; DAngle an;
if (jiggers.RollIntensity != 0 || jiggers.RollWave != 0) if (jiggers.RollIntensity != 0 || jiggers.RollWave != 0)
{ {
ViewRoll += QuakePower(quakefactor, jiggers.RollIntensity, jiggers.RollWave); viewpoint.Angles.Roll += QuakePower(quakefactor, jiggers.RollIntensity, jiggers.RollWave);
} }
if (jiggers.RelIntensity.X != 0 || jiggers.RelOffset.X != 0) if (jiggers.RelIntensity.X != 0 || jiggers.RelOffset.X != 0)
{ {
an = camera->Angles.Yaw; an = viewpoint.camera->Angles.Yaw;
double power = QuakePower(quakefactor, jiggers.RelIntensity.X, jiggers.RelOffset.X); double power = QuakePower(quakefactor, jiggers.RelIntensity.X, jiggers.RelOffset.X);
ViewPos += an.ToVector(power); viewpoint.Pos += an.ToVector(power);
} }
if (jiggers.RelIntensity.Y != 0 || jiggers.RelOffset.Y != 0) if (jiggers.RelIntensity.Y != 0 || jiggers.RelOffset.Y != 0)
{ {
an = camera->Angles.Yaw + 90; an = viewpoint.camera->Angles.Yaw + 90;
double power = QuakePower(quakefactor, jiggers.RelIntensity.Y, jiggers.RelOffset.Y); double power = QuakePower(quakefactor, jiggers.RelIntensity.Y, jiggers.RelOffset.Y);
ViewPos += an.ToVector(power); viewpoint.Pos += an.ToVector(power);
} }
// FIXME: Relative Z is not relative // FIXME: Relative Z is not relative
if (jiggers.RelIntensity.Z != 0 || jiggers.RelOffset.Z != 0) if (jiggers.RelIntensity.Z != 0 || jiggers.RelOffset.Z != 0)
{ {
ViewPos.Z += QuakePower(quakefactor, jiggers.RelIntensity.Z, jiggers.RelOffset.Z); viewpoint.Pos.Z += QuakePower(quakefactor, jiggers.RelIntensity.Z, jiggers.RelOffset.Z);
} }
if (jiggers.Intensity.X != 0 || jiggers.Offset.X != 0) if (jiggers.Intensity.X != 0 || jiggers.Offset.X != 0)
{ {
ViewPos.X += QuakePower(quakefactor, jiggers.Intensity.X, jiggers.Offset.X); viewpoint.Pos.X += QuakePower(quakefactor, jiggers.Intensity.X, jiggers.Offset.X);
} }
if (jiggers.Intensity.Y != 0 || jiggers.Offset.Y != 0) if (jiggers.Intensity.Y != 0 || jiggers.Offset.Y != 0)
{ {
ViewPos.Y += QuakePower(quakefactor, jiggers.Intensity.Y, jiggers.Offset.Y); viewpoint.Pos.Y += QuakePower(quakefactor, jiggers.Intensity.Y, jiggers.Offset.Y);
} }
if (jiggers.Intensity.Z != 0 || jiggers.Offset.Z != 0) if (jiggers.Intensity.Z != 0 || jiggers.Offset.Z != 0)
{ {
ViewPos.Z += QuakePower(quakefactor, jiggers.Intensity.Z, jiggers.Offset.Z); viewpoint.Pos.Z += QuakePower(quakefactor, jiggers.Intensity.Z, jiggers.Offset.Z);
} }
} }
} }
extralight = camera->player ? camera->player->extralight : 0; viewpoint.extralight = viewpoint.camera->player ? viewpoint.camera->player->extralight : 0;
// killough 3/20/98, 4/4/98: select colormap based on player status // killough 3/20/98, 4/4/98: select colormap based on player status
// [RH] Can also select a blend // [RH] Can also select a blend
newblend = 0; newblend = 0;
TArray<lightlist_t> &lightlist = viewsector->e->XFloor.lightlist; TArray<lightlist_t> &lightlist = viewpoint.sector->e->XFloor.lightlist;
if (lightlist.Size() > 0) if (lightlist.Size() > 0)
{ {
for(unsigned int i = 0; i < lightlist.Size(); i++) for(unsigned int i = 0; i < lightlist.Size(); i++)
{ {
secplane_t *plane; secplane_t *plane;
int viewside; int viewside;
plane = (i < lightlist.Size()-1) ? &lightlist[i+1].plane : &viewsector->floorplane; plane = (i < lightlist.Size()-1) ? &lightlist[i+1].plane : &viewpoint.sector->floorplane;
viewside = plane->PointOnSide(ViewPos); viewside = plane->PointOnSide(viewpoint.Pos);
// Reverse the direction of the test if the plane was downward facing. // Reverse the direction of the test if the plane was downward facing.
// We want to know if the view is above it, whatever its orientation may be. // We want to know if the view is above it, whatever its orientation may be.
if (plane->fC() < 0) if (plane->fC() < 0)
@ -866,12 +863,12 @@ void R_SetupFrame (AActor *actor)
} }
else else
{ {
const sector_t *s = viewsector->GetHeightSec(); const sector_t *s = viewpoint.sector->GetHeightSec();
if (s != NULL) if (s != NULL)
{ {
newblend = s->floorplane.PointOnSide(ViewPos) < 0 newblend = s->floorplane.PointOnSide(viewpoint.Pos) < 0
? s->bottommap ? s->bottommap
: s->ceilingplane.PointOnSide(ViewPos) < 0 : s->ceilingplane.PointOnSide(viewpoint.Pos) < 0
? s->topmap ? s->topmap
: s->midmap; : s->midmap;
if (APART(newblend) == 0 && newblend >= numfakecmaps) if (APART(newblend) == 0 && newblend >= numfakecmaps)

View file

@ -14,11 +14,13 @@ class FSerializer;
struct FRenderViewpoint struct FRenderViewpoint
{ {
FRenderViewpoint();
player_t *player; // For which player is this viewpoint being renderered? (can be null for camera textures) player_t *player; // For which player is this viewpoint being renderered? (can be null for camera textures)
DVector3 Pos; // Camera position DVector3 Pos; // Camera position
DVector3 ActorPos; // Camera actor's position DVector3 ActorPos; // Camera actor's position
DRotator Angles; // Camera angles DRotator Angles; // Camera angles
DVector3 Path; // View path for portal calculations DVector3 Path[2]; // View path for portal calculations
double Cos; // cos(Angles.Yaw) double Cos; // cos(Angles.Yaw)
double Sin; // sin(Angles.Yaw) double Sin; // sin(Angles.Yaw)
double TanCos; // FocalTangent * cos(Angles.Yaw) double TanCos; // FocalTangent * cos(Angles.Yaw)
@ -35,38 +37,19 @@ struct FRenderViewpoint
bool showviewer; // show the camera actor? bool showviewer; // show the camera actor?
}; };
extern DVector3 ViewPos; extern FRenderViewpoint r_viewpoint;
extern DVector3 ViewActorPos;
extern DAngle ViewAngle;
extern DAngle ViewPitch;
extern DAngle ViewRoll;
extern DVector3 ViewPath[2];
extern double ViewCos;
extern double ViewSin;
extern double ViewTanCos;
extern double ViewTanSin;
extern AActor* camera; // [RH] camera instead of viewplayer
extern sector_t* viewsector; // [RH] keep track of sector viewing from
extern DAngle FieldOfView;
extern double r_TicFracF;
extern uint32_t r_FrameTime;
extern int extralight;
extern bool r_showviewer;
//----------------------------------- //-----------------------------------
struct FViewWindow struct FViewWindow
{ {
double FocalTangent; double FocalTangent = 0.0;
int centerx; int centerx = 0;
int centerxwide; int centerxwide = 0;
int centery; int centery = 0;
float WidescreenRatio; float WidescreenRatio = 0.0f;
}; };
extern int centerx, centerxwide; extern FViewWindow r_viewwindow;
extern int centery;
extern double FocalTangent;
extern float WidescreenRatio;
//----------------------------------- //-----------------------------------
@ -127,17 +110,17 @@ bool R_GetViewInterpolationStatus();
void R_ClearInterpolationPath(); void R_ClearInterpolationPath();
void R_AddInterpolationPoint(const DVector3a &vec); void R_AddInterpolationPoint(const DVector3a &vec);
void R_SetViewSize (int blocks); void R_SetViewSize (int blocks);
void R_SetFOV (DAngle fov); void R_SetFOV (FRenderViewpoint &viewpoint, DAngle fov);
void R_SetupFrame (AActor * camera); void R_SetupFrame (FRenderViewpoint &viewpoint, FViewWindow &viewwindow, AActor * camera);
void R_SetViewAngle (); void R_SetViewAngle (FRenderViewpoint &viewpoint, const FViewWindow &viewwindow);
// Called by startup code. // Called by startup code.
void R_Init (void); void R_Init (void);
void R_ExecuteSetViewSize (void); void R_ExecuteSetViewSize (FRenderViewpoint &viewpoint, FViewWindow &viewwindow);
// Called by M_Responder. // Called by M_Responder.
void R_SetViewSize (int blocks); void R_SetViewSize (int blocks);
void R_SetWindow (int windowSize, int fullWidth, int fullHeight, int stHeight, bool renderingToCanvas = false); void R_SetWindow (FRenderViewpoint &viewpoint, FViewWindow &viewwindow, int windowSize, int fullWidth, int fullHeight, int stHeight, bool renderingToCanvas = false);
extern void R_FreePastViewers (); extern void R_FreePastViewers ();

View file

@ -2686,7 +2686,7 @@ namespace swrenderer
uint32_t u, v; uint32_t u, v;
int i; int i;
iz = plane_sz[2] + plane_sz[1] * (centery - y) + plane_sz[0] * (x1 - centerx); iz = plane_sz[2] + plane_sz[1] * (r_viewwindow.centery - y) + plane_sz[0] * (x1 - r_viewwindow.centerx);
// Lighting is simple. It's just linear interpolation from start to end // Lighting is simple. It's just linear interpolation from start to end
if (plane_shade) if (plane_shade)
@ -2703,8 +2703,8 @@ namespace swrenderer
} }
} }
uz = plane_su[2] + plane_su[1] * (centery - y) + plane_su[0] * (x1 - centerx); 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] * (centery - y) + plane_sv[0] * (x1 - centerx); vz = plane_sv[2] + plane_sv[1] * (r_viewwindow.centery - y) + plane_sv[0] * (x1 - r_viewwindow.centerx);
fb = _dest; fb = _dest;

View file

@ -474,7 +474,7 @@ namespace swrenderer
int count = _x2 - _x1 + 1; int count = _x2 - _x1 + 1;
// Depth (Z) change across the span // Depth (Z) change across the span
double iz = _plane_sz[2] + _plane_sz[1] * (centery - _y) + _plane_sz[0] * (_x1 - centerx); double iz = _plane_sz[2] + _plane_sz[1] * (r_viewwindow.centery - _y) + _plane_sz[0] * (_x1 - r_viewwindow.centerx);
// Light change across the span // Light change across the span
fixed_t lightstart = _light; fixed_t lightstart = _light;
@ -491,8 +491,8 @@ namespace swrenderer
fixed_t steplight = (lightend - lightstart) / count; fixed_t steplight = (lightend - lightstart) / count;
// Texture coordinates // Texture coordinates
double uz = _plane_su[2] + _plane_su[1] * (centery - _y) + _plane_su[0] * (_x1 - centerx); 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] * (centery - _y) + _plane_sv[0] * (_x1 - centerx); double vz = _plane_sv[2] + _plane_sv[1] * (r_viewwindow.centery - _y) + _plane_sv[0] * (_x1 - r_viewwindow.centerx);
double startz = 1.f / iz; double startz = 1.f / iz;
double startu = uz*startz; double startu = uz*startz;
double startv = vz*startz; double startv = vz*startz;

View file

@ -73,8 +73,8 @@ namespace swrenderer
basecolormap = colormap; basecolormap = colormap;
mLineSegment = line; mLineSegment = line;
DVector2 pt1 = line->v1->fPos() - ViewPos; DVector2 pt1 = line->v1->fPos() - r_viewpoint.Pos;
DVector2 pt2 = line->v2->fPos() - ViewPos; DVector2 pt2 = line->v2->fPos() - r_viewpoint.Pos;
// Reject lines not facing viewer // Reject lines not facing viewer
if (pt1.Y * (pt1.X - pt2.X) + pt1.X * (pt2.Y - pt1.Y) >= 0) 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) // 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. // [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, ViewPos)) if (!renderportal->CurrentPortalInSkybox && renderportal->CurrentPortal && P_ClipLineToPortal(line->linedef, renderportal->CurrentPortal->dst, r_viewpoint.Pos))
return; return;
vertex_t *v1 = line->linedef->v1; vertex_t *v1 = line->linedef->v1;
@ -114,7 +114,7 @@ namespace swrenderer
{ {
swapvalues(v1, v2); swapvalues(v1, v2);
} }
WallT.InitFromLine(Thread, v1->fPos() - ViewPos, v2->fPos() - ViewPos); WallT.InitFromLine(Thread, v1->fPos() - r_viewpoint.Pos, v2->fPos() - r_viewpoint.Pos);
} }
mFrontCeilingZ1 = mFrontSector->ceilingplane.ZatPoint(line->v1); mFrontCeilingZ1 = mFrontSector->ceilingplane.ZatPoint(line->v1);
@ -363,13 +363,13 @@ namespace swrenderer
draw_segment->silhouette = 0; draw_segment->silhouette = 0;
if (mFrontFloorZ1 > mBackFloorZ1 || mFrontFloorZ2 > mBackFloorZ2 || if (mFrontFloorZ1 > mBackFloorZ1 || mFrontFloorZ2 > mBackFloorZ2 ||
mBackSector->floorplane.PointOnSide(ViewPos) < 0) mBackSector->floorplane.PointOnSide(r_viewpoint.Pos) < 0)
{ {
draw_segment->silhouette = SIL_BOTTOM; draw_segment->silhouette = SIL_BOTTOM;
} }
if (mFrontCeilingZ1 < mBackCeilingZ1 || mFrontCeilingZ2 < mBackCeilingZ2 || if (mFrontCeilingZ1 < mBackCeilingZ1 || mFrontCeilingZ2 < mBackCeilingZ2 ||
mBackSector->ceilingplane.PointOnSide(ViewPos) < 0) mBackSector->ceilingplane.PointOnSide(r_viewpoint.Pos) < 0)
{ {
draw_segment->silhouette |= SIL_TOP; draw_segment->silhouette |= SIL_TOP;
} }
@ -564,7 +564,7 @@ namespace swrenderer
// deep water check // deep water check
if (mFrontSector->GetHeightSec() == nullptr) if (mFrontSector->GetHeightSec() == nullptr)
{ {
int planeside = mFrontSector->floorplane.PointOnSide(ViewPos); int planeside = mFrontSector->floorplane.PointOnSide(r_viewpoint.Pos);
if (mFrontSector->floorplane.fC() < 0) // 3D floors have the floor backwards if (mFrontSector->floorplane.fC() < 0) // 3D floors have the floor backwards
planeside = -planeside; planeside = -planeside;
if (planeside <= 0) // above view plane if (planeside <= 0) // above view plane
@ -621,7 +621,7 @@ namespace swrenderer
// deep water check // deep water check
if (mFrontSector->GetHeightSec() == nullptr && mFrontSector->GetTexture(sector_t::ceiling) != skyflatnum) if (mFrontSector->GetHeightSec() == nullptr && mFrontSector->GetTexture(sector_t::ceiling) != skyflatnum)
{ {
int planeside = mFrontSector->ceilingplane.PointOnSide(ViewPos); int planeside = mFrontSector->ceilingplane.PointOnSide(r_viewpoint.Pos);
if (mFrontSector->ceilingplane.fC() > 0) // 3D floors have the ceiling backwards if (mFrontSector->ceilingplane.fC() > 0) // 3D floors have the ceiling backwards
planeside = -planeside; planeside = -planeside;
if (planeside <= 0) // below view plane if (planeside <= 0) // below view plane
@ -718,8 +718,8 @@ namespace swrenderer
if (mLineSegment->linedef->special == Line_Horizon) if (mLineSegment->linedef->special == Line_Horizon)
{ {
// Be aware: Line_Horizon does not work properly with sloped planes // Be aware: Line_Horizon does not work properly with sloped planes
fillshort(walltop.ScreenY + WallC.sx1, WallC.sx2 - WallC.sx1, centery); fillshort(walltop.ScreenY + WallC.sx1, WallC.sx2 - WallC.sx1, r_viewwindow.centery);
fillshort(wallbottom.ScreenY + WallC.sx1, WallC.sx2 - WallC.sx1, centery); fillshort(wallbottom.ScreenY + WallC.sx1, WallC.sx2 - WallC.sx1, r_viewwindow.centery);
} }
else else
{ {
@ -819,7 +819,7 @@ namespace swrenderer
{ // normal orientation { // normal orientation
if (linedef->flags & ML_DONTPEGTOP) if (linedef->flags & ML_DONTPEGTOP)
{ // top of texture at top { // top of texture at top
mTopPart.TextureMid = (mFrontSector->GetPlaneTexZ(sector_t::ceiling) - ViewPos.Z) * yrepeat; mTopPart.TextureMid = (mFrontSector->GetPlaneTexZ(sector_t::ceiling) - r_viewpoint.Pos.Z) * yrepeat;
if (rowoffset < 0 && mTopPart.Texture != NULL) if (rowoffset < 0 && mTopPart.Texture != NULL)
{ {
rowoffset += mTopPart.Texture->GetHeight(); rowoffset += mTopPart.Texture->GetHeight();
@ -827,7 +827,7 @@ namespace swrenderer
} }
else else
{ // bottom of texture at bottom { // bottom of texture at bottom
mTopPart.TextureMid = (mBackSector->GetPlaneTexZ(sector_t::ceiling) - ViewPos.Z) * yrepeat + mTopPart.Texture->GetHeight(); mTopPart.TextureMid = (mBackSector->GetPlaneTexZ(sector_t::ceiling) - r_viewpoint.Pos.Z) * yrepeat + mTopPart.Texture->GetHeight();
} }
} }
else else
@ -835,11 +835,11 @@ namespace swrenderer
rowoffset = -rowoffset; rowoffset = -rowoffset;
if (linedef->flags & ML_DONTPEGTOP) if (linedef->flags & ML_DONTPEGTOP)
{ // bottom of texture at top { // bottom of texture at top
mTopPart.TextureMid = (mFrontSector->GetPlaneTexZ(sector_t::ceiling) - ViewPos.Z) * yrepeat + mTopPart.Texture->GetHeight(); mTopPart.TextureMid = (mFrontSector->GetPlaneTexZ(sector_t::ceiling) - r_viewpoint.Pos.Z) * yrepeat + mTopPart.Texture->GetHeight();
} }
else else
{ // top of texture at bottom { // top of texture at bottom
mTopPart.TextureMid = (mBackSector->GetPlaneTexZ(sector_t::ceiling) - ViewPos.Z) * yrepeat; mTopPart.TextureMid = (mBackSector->GetPlaneTexZ(sector_t::ceiling) - r_viewpoint.Pos.Z) * yrepeat;
} }
} }
if (mTopPart.Texture->bWorldPanning) if (mTopPart.Texture->bWorldPanning)
@ -875,11 +875,11 @@ namespace swrenderer
{ // normal orientation { // normal orientation
if (linedef->flags & ML_DONTPEGBOTTOM) if (linedef->flags & ML_DONTPEGBOTTOM)
{ // bottom of texture at bottom { // bottom of texture at bottom
mMiddlePart.TextureMid = (mFrontSector->GetPlaneTexZ(sector_t::floor) - ViewPos.Z) * yrepeat + mMiddlePart.Texture->GetHeight(); mMiddlePart.TextureMid = (mFrontSector->GetPlaneTexZ(sector_t::floor) - r_viewpoint.Pos.Z) * yrepeat + mMiddlePart.Texture->GetHeight();
} }
else else
{ // top of texture at top { // top of texture at top
mMiddlePart.TextureMid = (mFrontSector->GetPlaneTexZ(sector_t::ceiling) - ViewPos.Z) * yrepeat; mMiddlePart.TextureMid = (mFrontSector->GetPlaneTexZ(sector_t::ceiling) - r_viewpoint.Pos.Z) * yrepeat;
if (rowoffset < 0 && mMiddlePart.Texture != NULL) if (rowoffset < 0 && mMiddlePart.Texture != NULL)
{ {
rowoffset += mMiddlePart.Texture->GetHeight(); rowoffset += mMiddlePart.Texture->GetHeight();
@ -891,11 +891,11 @@ namespace swrenderer
rowoffset = -rowoffset; rowoffset = -rowoffset;
if (linedef->flags & ML_DONTPEGBOTTOM) if (linedef->flags & ML_DONTPEGBOTTOM)
{ // top of texture at bottom { // top of texture at bottom
mMiddlePart.TextureMid = (mFrontSector->GetPlaneTexZ(sector_t::floor) - ViewPos.Z) * yrepeat; mMiddlePart.TextureMid = (mFrontSector->GetPlaneTexZ(sector_t::floor) - r_viewpoint.Pos.Z) * yrepeat;
} }
else else
{ // bottom of texture at top { // bottom of texture at top
mMiddlePart.TextureMid = (mFrontSector->GetPlaneTexZ(sector_t::ceiling) - ViewPos.Z) * yrepeat + mMiddlePart.Texture->GetHeight(); mMiddlePart.TextureMid = (mFrontSector->GetPlaneTexZ(sector_t::ceiling) - r_viewpoint.Pos.Z) * yrepeat + mMiddlePart.Texture->GetHeight();
} }
} }
if (mMiddlePart.Texture->bWorldPanning) if (mMiddlePart.Texture->bWorldPanning)
@ -940,11 +940,11 @@ namespace swrenderer
{ // normal orientation { // normal orientation
if (linedef->flags & ML_DONTPEGBOTTOM) if (linedef->flags & ML_DONTPEGBOTTOM)
{ // bottom of texture at bottom { // bottom of texture at bottom
mBottomPart.TextureMid = (frontlowertop - ViewPos.Z) * yrepeat; mBottomPart.TextureMid = (frontlowertop - r_viewpoint.Pos.Z) * yrepeat;
} }
else else
{ // top of texture at top { // top of texture at top
mBottomPart.TextureMid = (mBackSector->GetPlaneTexZ(sector_t::floor) - ViewPos.Z) * yrepeat; mBottomPart.TextureMid = (mBackSector->GetPlaneTexZ(sector_t::floor) - r_viewpoint.Pos.Z) * yrepeat;
if (rowoffset < 0 && mBottomPart.Texture != NULL) if (rowoffset < 0 && mBottomPart.Texture != NULL)
{ {
rowoffset += mBottomPart.Texture->GetHeight(); rowoffset += mBottomPart.Texture->GetHeight();
@ -956,11 +956,11 @@ namespace swrenderer
rowoffset = -rowoffset; rowoffset = -rowoffset;
if (linedef->flags & ML_DONTPEGBOTTOM) if (linedef->flags & ML_DONTPEGBOTTOM)
{ // top of texture at bottom { // top of texture at bottom
mBottomPart.TextureMid = (frontlowertop - ViewPos.Z) * yrepeat; mBottomPart.TextureMid = (frontlowertop - r_viewpoint.Pos.Z) * yrepeat;
} }
else else
{ // bottom of texture at top { // bottom of texture at top
mBottomPart.TextureMid = (mBackSector->GetPlaneTexZ(sector_t::floor) - ViewPos.Z) * yrepeat + mBottomPart.Texture->GetHeight(); mBottomPart.TextureMid = (mBackSector->GetPlaneTexZ(sector_t::floor) - r_viewpoint.Pos.Z) * yrepeat + mBottomPart.Texture->GetHeight();
} }
} }
if (mBottomPart.Texture->bWorldPanning) if (mBottomPart.Texture->bWorldPanning)
@ -1271,11 +1271,11 @@ namespace swrenderer
// Transform and clip coordinates. Returns true if it was clipped away // 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) bool FWallCoords::Init(RenderThread *thread, const DVector2 &pt1, const DVector2 &pt2, double too_close)
{ {
tleft.X = float(pt1.X * ViewSin - pt1.Y * ViewCos); tleft.X = float(pt1.X * r_viewpoint.Sin - pt1.Y * r_viewpoint.Cos);
tright.X = float(pt2.X * ViewSin - pt2.Y * ViewCos); tright.X = float(pt2.X * r_viewpoint.Sin - pt2.Y * r_viewpoint.Cos);
tleft.Y = float(pt1.X * ViewTanCos + pt1.Y * ViewTanSin); tleft.Y = float(pt1.X * r_viewpoint.TanCos + pt1.Y * r_viewpoint.TanSin);
tright.Y = float(pt2.X * ViewTanCos + pt2.Y * ViewTanSin); tright.Y = float(pt2.X * r_viewpoint.TanCos + pt2.Y * r_viewpoint.TanSin);
RenderPortal *renderportal = thread->Portal.get(); RenderPortal *renderportal = thread->Portal.get();
auto viewport = RenderViewport::Instance(); auto viewport = RenderViewport::Instance();
@ -1342,9 +1342,9 @@ namespace swrenderer
{ {
swapvalues(left, right); swapvalues(left, right);
} }
UoverZorg = left->X * centerx; UoverZorg = left->X * r_viewwindow.centerx;
UoverZstep = -left->Y; UoverZstep = -left->Y;
InvZorg = (left->X - right->X) * centerx; InvZorg = (left->X - right->X) * r_viewwindow.centerx;
InvZstep = right->Y - left->Y; InvZstep = right->Y - left->Y;
} }
@ -1352,10 +1352,10 @@ namespace swrenderer
{ {
// Coordinates should have already had viewx,viewy subtracted // Coordinates should have already had viewx,viewy subtracted
double fullx1 = left.X * ViewSin - left.Y * ViewCos; double fullx1 = left.X * r_viewpoint.Sin - left.Y * r_viewpoint.Cos;
double fullx2 = right.X * ViewSin - right.Y * ViewCos; double fullx2 = right.X * r_viewpoint.Sin - right.Y * r_viewpoint.Cos;
double fully1 = left.X * ViewTanCos + left.Y * ViewTanSin; double fully1 = left.X * r_viewpoint.TanCos + left.Y * r_viewpoint.TanSin;
double fully2 = right.X * ViewTanCos + right.Y * ViewTanSin; double fully2 = right.X * r_viewpoint.TanCos + right.Y * r_viewpoint.TanSin;
RenderPortal *renderportal = thread->Portal.get(); RenderPortal *renderportal = thread->Portal.get();
@ -1365,9 +1365,9 @@ namespace swrenderer
fullx2 = -fullx2; fullx2 = -fullx2;
} }
UoverZorg = float(fullx1 * centerx); UoverZorg = float(fullx1 * r_viewwindow.centerx);
UoverZstep = float(-fully1); UoverZstep = float(-fully1);
InvZorg = float((fullx1 - fullx2) * centerx); InvZorg = float((fullx1 - fullx2) * r_viewwindow.centerx);
InvZstep = float(fully2 - fully1); InvZstep = float(fully2 - fully1);
} }
} }

View file

@ -118,7 +118,7 @@ namespace swrenderer
{ {
if (!(clip3d->fake3D & FAKE3D_CLIPTOP)) if (!(clip3d->fake3D & FAKE3D_CLIPTOP))
{ {
clip3d->sclipTop = sec->ceilingplane.ZatPoint(ViewPos); clip3d->sclipTop = sec->ceilingplane.ZatPoint(r_viewpoint.Pos);
} }
for (i = frontsector->e->XFloor.lightlist.Size() - 1; i >= 0; i--) for (i = frontsector->e->XFloor.lightlist.Size() - 1; i >= 0; i--)
{ {
@ -202,7 +202,7 @@ namespace swrenderer
{ {
// rowoffset is added before the multiply so that the masked texture will // rowoffset is added before the multiply so that the masked texture will
// still be positioned in world units rather than texels. // still be positioned in world units rather than texels.
texturemid += rowoffset - ViewPos.Z; texturemid += rowoffset - r_viewpoint.Pos.Z;
textop = texturemid; textop = texturemid;
texturemid *= MaskedScaleY; texturemid *= MaskedScaleY;
} }
@ -210,8 +210,8 @@ namespace swrenderer
{ {
// rowoffset is added outside the multiply so that it positions the texture // rowoffset is added outside the multiply so that it positions the texture
// by texels instead of world units. // by texels instead of world units.
textop = texturemid + rowoffset / MaskedScaleY - ViewPos.Z; textop = texturemid + rowoffset / MaskedScaleY - r_viewpoint.Pos.Z;
texturemid = (texturemid - ViewPos.Z) * MaskedScaleY + rowoffset; texturemid = (texturemid - r_viewpoint.Pos.Z) * MaskedScaleY + rowoffset;
} }
if (sprflipvert) if (sprflipvert)
{ {
@ -230,12 +230,12 @@ namespace swrenderer
goto clearfog; goto clearfog;
} }
if ((clip3d->fake3D & FAKE3D_CLIPBOTTOM) && textop < clip3d->sclipBottom - ViewPos.Z) if ((clip3d->fake3D & FAKE3D_CLIPBOTTOM) && textop < clip3d->sclipBottom - r_viewpoint.Pos.Z)
{ {
notrelevant = true; notrelevant = true;
goto clearfog; goto clearfog;
} }
if ((clip3d->fake3D & FAKE3D_CLIPTOP) && textop - texheight > clip3d->sclipTop - ViewPos.Z) if ((clip3d->fake3D & FAKE3D_CLIPTOP) && textop - texheight > clip3d->sclipTop - r_viewpoint.Pos.Z)
{ {
notrelevant = true; notrelevant = true;
goto clearfog; goto clearfog;
@ -248,7 +248,7 @@ namespace swrenderer
if (clip3d->fake3D & FAKE3D_CLIPTOP) if (clip3d->fake3D & FAKE3D_CLIPTOP)
{ {
wallupper.Project(textop < clip3d->sclipTop - ViewPos.Z ? textop : clip3d->sclipTop - ViewPos.Z, &WallC); wallupper.Project(textop < clip3d->sclipTop - r_viewpoint.Pos.Z ? textop : clip3d->sclipTop - r_viewpoint.Pos.Z, &WallC);
} }
else else
{ {
@ -256,7 +256,7 @@ namespace swrenderer
} }
if (clip3d->fake3D & FAKE3D_CLIPBOTTOM) if (clip3d->fake3D & FAKE3D_CLIPBOTTOM)
{ {
walllower.Project(textop - texheight > clip3d->sclipBottom - ViewPos.Z ? textop - texheight : clip3d->sclipBottom - ViewPos.Z, &WallC); walllower.Project(textop - texheight > clip3d->sclipBottom - r_viewpoint.Pos.Z ? textop - texheight : clip3d->sclipBottom - r_viewpoint.Pos.Z, &WallC);
} }
else else
{ {
@ -319,13 +319,13 @@ namespace swrenderer
{ {
// rowoffset is added before the multiply so that the masked texture will // rowoffset is added before the multiply so that the masked texture will
// still be positioned in world units rather than texels. // still be positioned in world units rather than texels.
texturemid = (texturemid - ViewPos.Z + rowoffset) * MaskedScaleY; texturemid = (texturemid - r_viewpoint.Pos.Z + rowoffset) * MaskedScaleY;
} }
else else
{ {
// rowoffset is added outside the multiply so that it positions the texture // rowoffset is added outside the multiply so that it positions the texture
// by texels instead of world units. // by texels instead of world units.
texturemid = (texturemid - ViewPos.Z) * MaskedScaleY + rowoffset; texturemid = (texturemid - r_viewpoint.Pos.Z) * MaskedScaleY + rowoffset;
} }
WallC.sz1 = ds->sz1; WallC.sz1 = ds->sz1;
@ -347,7 +347,7 @@ namespace swrenderer
if (clip3d->fake3D & FAKE3D_CLIPTOP) if (clip3d->fake3D & FAKE3D_CLIPTOP)
{ {
wallupper.Project(clip3d->sclipTop - ViewPos.Z, &WallC); wallupper.Project(clip3d->sclipTop - r_viewpoint.Pos.Z, &WallC);
for (i = x1; i < x2; i++) for (i = x1; i < x2; i++)
{ {
if (wallupper.ScreenY[i] < mceilingclip[i]) if (wallupper.ScreenY[i] < mceilingclip[i])
@ -357,7 +357,7 @@ namespace swrenderer
} }
if (clip3d->fake3D & FAKE3D_CLIPBOTTOM) if (clip3d->fake3D & FAKE3D_CLIPBOTTOM)
{ {
walllower.Project(clip3d->sclipBottom - ViewPos.Z, &WallC); walllower.Project(clip3d->sclipBottom - r_viewpoint.Pos.Z, &WallC);
for (i = x1; i < x2; i++) for (i = x1; i < x2; i++)
{ {
if (walllower.ScreenY[i] > mfloorclip[i]) if (walllower.ScreenY[i] > mfloorclip[i])
@ -450,7 +450,7 @@ namespace swrenderer
{ {
rowoffset += rw_pic->GetHeight(); rowoffset += rw_pic->GetHeight();
} }
double texturemid = (planez - ViewPos.Z) * yscale; double texturemid = (planez - r_viewpoint.Pos.Z) * yscale;
if (rw_pic->bWorldPanning) if (rw_pic->bWorldPanning)
{ {
// rowoffset is added before the multiply so that the masked texture will // rowoffset is added before the multiply so that the masked texture will
@ -483,8 +483,8 @@ namespace swrenderer
WallT = ds->tmapvals; WallT = ds->tmapvals;
Clip3DFloors *clip3d = Thread->Clip3D.get(); Clip3DFloors *clip3d = Thread->Clip3D.get();
wallupper.Project(clip3d->sclipTop - ViewPos.Z, &WallC); wallupper.Project(clip3d->sclipTop - r_viewpoint.Pos.Z, &WallC);
walllower.Project(clip3d->sclipBottom - ViewPos.Z, &WallC); walllower.Project(clip3d->sclipBottom - r_viewpoint.Pos.Z, &WallC);
for (i = x1; i < x2; i++) for (i = x1; i < x2; i++)
{ {

View file

@ -207,12 +207,12 @@ namespace swrenderer
{ {
if (!(cur_node->lightsource->flags2&MF2_DORMANT)) if (!(cur_node->lightsource->flags2&MF2_DORMANT))
{ {
double lightX = cur_node->lightsource->X() - ViewPos.X; double lightX = cur_node->lightsource->X() - r_viewpoint.Pos.X;
double lightY = cur_node->lightsource->Y() - ViewPos.Y; double lightY = cur_node->lightsource->Y() - r_viewpoint.Pos.Y;
double lightZ = cur_node->lightsource->Z() - ViewPos.Z; double lightZ = cur_node->lightsource->Z() - r_viewpoint.Pos.Z;
float lx = (float)(lightX * ViewSin - lightY * ViewCos) - drawerargs.dc_viewpos.X; float lx = (float)(lightX * r_viewpoint.Sin - lightY * r_viewpoint.Cos) - drawerargs.dc_viewpos.X;
float ly = (float)(lightX * ViewTanCos + lightY * ViewTanSin) - drawerargs.dc_viewpos.Y; float ly = (float)(lightX * r_viewpoint.TanCos + lightY * r_viewpoint.TanSin) - drawerargs.dc_viewpos.Y;
float lz = (float)lightZ; float lz = (float)lightZ;
// Precalculate the constant part of the dot here so the drawer doesn't have to. // Precalculate the constant part of the dot here so the drawer doesn't have to.
@ -446,17 +446,17 @@ namespace swrenderer
if (yrepeat >= 0) if (yrepeat >= 0)
{ // normal orientation: draw strips from top to bottom { // normal orientation: draw strips from top to bottom
partition = top - fmod(top - texturemid / yrepeat - ViewPos.Z, scaledtexheight); partition = top - fmod(top - texturemid / yrepeat - r_viewpoint.Pos.Z, scaledtexheight);
if (partition == top) if (partition == top)
{ {
partition -= scaledtexheight; partition -= scaledtexheight;
} }
const short *up = uwal; const short *up = uwal;
short *down = most1.ScreenY; short *down = most1.ScreenY;
texturemid = (partition - ViewPos.Z) * yrepeat + texheight; texturemid = (partition - r_viewpoint.Pos.Z) * yrepeat + texheight;
while (partition > bot) while (partition > bot)
{ {
ProjectedWallCull j = most3.Project(partition - ViewPos.Z, &WallC); ProjectedWallCull j = most3.Project(partition - r_viewpoint.Pos.Z, &WallC);
if (j != ProjectedWallCull::OutsideAbove) if (j != ProjectedWallCull::OutsideAbove)
{ {
for (int j = x1; j < x2; ++j) for (int j = x1; j < x2; ++j)
@ -474,13 +474,13 @@ namespace swrenderer
} }
else else
{ // upside down: draw strips from bottom to top { // upside down: draw strips from bottom to top
partition = bot - fmod(bot - texturemid / yrepeat - ViewPos.Z, scaledtexheight); partition = bot - fmod(bot - texturemid / yrepeat - r_viewpoint.Pos.Z, scaledtexheight);
short *up = most1.ScreenY; short *up = most1.ScreenY;
const short *down = dwal; const short *down = dwal;
texturemid = (partition - ViewPos.Z) * yrepeat + texheight; texturemid = (partition - r_viewpoint.Pos.Z) * yrepeat + texheight;
while (partition < top) while (partition < top)
{ {
ProjectedWallCull j = most3.Project(partition - ViewPos.Z, &WallC); ProjectedWallCull j = most3.Project(partition - r_viewpoint.Pos.Z, &WallC);
if (j != ProjectedWallCull::OutsideBelow) if (j != ProjectedWallCull::OutsideBelow)
{ {
for (int j = x1; j < x2; ++j) for (int j = x1; j < x2; ++j)

View file

@ -80,7 +80,7 @@ namespace swrenderer
{ {
if (!plane.isSlope()) if (!plane.isSlope())
{ {
return Project(plane.Zat0() - ViewPos.Z, wallc); return Project(plane.Zat0() - r_viewpoint.Pos.Z, wallc);
} }
else else
{ {
@ -96,7 +96,7 @@ namespace swrenderer
x -= frac * (x - curline->v1->fX()); x -= frac * (x - curline->v1->fX());
y -= frac * (y - curline->v1->fY()); y -= frac * (y - curline->v1->fY());
} }
z1 = plane.ZatPoint(x, y) - ViewPos.Z; z1 = plane.ZatPoint(x, y) - r_viewpoint.Pos.Z;
if (wallc->sx2 > wallc->sx1 + 1) if (wallc->sx2 > wallc->sx1 + 1)
{ {
@ -108,7 +108,7 @@ namespace swrenderer
x += frac * (curline->v2->fX() - x); x += frac * (curline->v2->fX() - x);
y += frac * (curline->v2->fY() - y); y += frac * (curline->v2->fY() - y);
} }
z2 = plane.ZatPoint(x, y) - ViewPos.Z; z2 = plane.ZatPoint(x, y) - r_viewpoint.Pos.Z;
} }
else else
{ {
@ -125,7 +125,7 @@ namespace swrenderer
x += frac * (curline->v2->fX() - x); x += frac * (curline->v2->fX() - x);
y += frac * (curline->v2->fY() - y); y += frac * (curline->v2->fY() - y);
} }
z1 = plane.ZatPoint(x, y) - ViewPos.Z; z1 = plane.ZatPoint(x, y) - r_viewpoint.Pos.Z;
if (wallc->sx2 > wallc->sx1 + 1) if (wallc->sx2 > wallc->sx1 + 1)
{ {
@ -137,7 +137,7 @@ namespace swrenderer
x -= frac * (x - curline->v1->fX()); x -= frac * (x - curline->v1->fX());
y -= frac * (y - curline->v1->fY()); y -= frac * (y - curline->v1->fY());
} }
z2 = plane.ZatPoint(x, y) - ViewPos.Z; z2 = plane.ZatPoint(x, y) - r_viewpoint.Pos.Z;
} }
else else
{ {

View file

@ -68,20 +68,20 @@ namespace swrenderer
if (planeang != 0) if (planeang != 0)
{ {
double cosine = cos(planeang), sine = sin(planeang); double cosine = cos(planeang), sine = sin(planeang);
pviewx = pl->xform.xOffs + ViewPos.X * cosine - ViewPos.Y * sine; pviewx = pl->xform.xOffs + r_viewpoint.Pos.X * cosine - r_viewpoint.Pos.Y * sine;
pviewy = pl->xform.yOffs + pl->xform.baseyOffs - ViewPos.X * sine - ViewPos.Y * cosine; pviewy = pl->xform.yOffs + pl->xform.baseyOffs - r_viewpoint.Pos.X * sine - r_viewpoint.Pos.Y * cosine;
} }
else else
{ {
pviewx = pl->xform.xOffs + ViewPos.X; pviewx = pl->xform.xOffs + r_viewpoint.Pos.X;
pviewy = pl->xform.yOffs - ViewPos.Y; pviewy = pl->xform.yOffs - r_viewpoint.Pos.Y;
} }
pviewx = _xscale * pviewx; pviewx = _xscale * pviewx;
pviewy = _yscale * pviewy; pviewy = _yscale * pviewy;
// left to right mapping // left to right mapping
planeang += (ViewAngle - 90).Radians(); planeang += (r_viewpoint.Angles.Yaw - 90).Radians();
auto viewport = RenderViewport::Instance(); auto viewport = RenderViewport::Instance();
@ -113,7 +113,7 @@ namespace swrenderer
minx = pl->left; minx = pl->left;
planeheight = fabs(pl->height.Zat0() - ViewPos.Z); planeheight = fabs(pl->height.Zat0() - r_viewpoint.Pos.Z);
basecolormap = colormap; basecolormap = colormap;
@ -231,12 +231,12 @@ namespace swrenderer
cur_node = light_list; cur_node = light_list;
while (cur_node) while (cur_node)
{ {
double lightX = cur_node->lightsource->X() - ViewPos.X; double lightX = cur_node->lightsource->X() - r_viewpoint.Pos.X;
double lightY = cur_node->lightsource->Y() - ViewPos.Y; double lightY = cur_node->lightsource->Y() - r_viewpoint.Pos.Y;
double lightZ = cur_node->lightsource->Z() - ViewPos.Z; double lightZ = cur_node->lightsource->Z() - r_viewpoint.Pos.Z;
float lx = (float)(lightX * ViewSin - lightY * ViewCos); float lx = (float)(lightX * r_viewpoint.Sin - lightY * r_viewpoint.Cos);
float ly = (float)(lightX * ViewTanCos + lightY * ViewTanSin) - drawerargs.dc_viewpos.Y; float ly = (float)(lightX * r_viewpoint.TanCos + lightY * r_viewpoint.TanSin) - drawerargs.dc_viewpos.Y;
float lz = (float)lightZ - drawerargs.dc_viewpos.Z; float lz = (float)lightZ - drawerargs.dc_viewpos.Z;
// Precalculate the constant part of the dot here so the drawer doesn't have to. // Precalculate the constant part of the dot here so the drawer doesn't have to.

View file

@ -70,7 +70,7 @@ namespace swrenderer
} }
sky2tex = sky2texture; sky2tex = sky2texture;
skymid = skytexturemid; skymid = skytexturemid;
skyangle = ViewAngle.BAMs(); skyangle = r_viewpoint.Angles.Yaw.BAMs();
if (pl->picnum == skyflatnum) if (pl->picnum == skyflatnum)
{ {
@ -188,7 +188,7 @@ namespace swrenderer
if (r_linearsky) if (r_linearsky)
{ {
angle_t xangle = (angle_t)((0.5 - x / (double)viewwidth) * FocalTangent * ANGLE_90); angle_t xangle = (angle_t)((0.5 - x / (double)viewwidth) * r_viewwindow.FocalTangent * ANGLE_90);
ang = (skyangle + xangle) ^ skyflip; ang = (skyangle + xangle) ^ skyflip;
} }
else else

View file

@ -86,7 +86,7 @@ namespace swrenderer
lyscale = _yscale * ifloatpow2[drawerargs.TextureHeightBits()]; lyscale = _yscale * ifloatpow2[drawerargs.TextureHeightBits()];
xscale = 64.f / lxscale; xscale = 64.f / lxscale;
yscale = 64.f / lyscale; yscale = 64.f / lyscale;
zeroheight = pl->height.ZatPoint(ViewPos); zeroheight = pl->height.ZatPoint(r_viewpoint.Pos);
pviewx = xs_ToFixed(32 - drawerargs.TextureWidthBits(), pl->xform.xOffs * pl->xform.xScale); pviewx = xs_ToFixed(32 - drawerargs.TextureWidthBits(), pl->xform.xOffs * pl->xform.xScale);
pviewy = xs_ToFixed(32 - drawerargs.TextureHeightBits(), pl->xform.yOffs * pl->xform.yScale); 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 // p is the texture origin in view space
// Don't add in the offsets at this stage, because doing so can result in // Don't add in the offsets at this stage, because doing so can result in
// errors if the flat is rotated. // errors if the flat is rotated.
ang = M_PI * 3 / 2 - ViewAngle.Radians(); ang = M_PI * 3 / 2 - r_viewpoint.Angles.Yaw.Radians();
cosine = cos(ang), sine = sin(ang); cosine = cos(ang), sine = sin(ang);
p[0] = ViewPos.X * cosine - ViewPos.Y * sine; p[0] = r_viewpoint.Pos.X * cosine - r_viewpoint.Pos.Y * sine;
p[2] = ViewPos.X * sine + ViewPos.Y * cosine; p[2] = r_viewpoint.Pos.X * sine + r_viewpoint.Pos.Y * cosine;
p[1] = pl->height.ZatPoint(0.0, 0.0) - ViewPos.Z; p[1] = pl->height.ZatPoint(0.0, 0.0) - r_viewpoint.Pos.Z;
// m is the v direction vector in view space // m is the v direction vector in view space
ang = ang - M_PI / 2 - planeang; 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 // 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. // the textures a constant size across the surface's plane instead.
cosine = cos(planeang), sine = sin(planeang); cosine = cos(planeang), sine = sin(planeang);
m[1] = pl->height.ZatPoint(ViewPos.X + yscale * sine, ViewPos.Y + yscale * cosine) - zeroheight; m[1] = pl->height.ZatPoint(r_viewpoint.Pos.X + yscale * sine, r_viewpoint.Pos.Y + yscale * cosine) - zeroheight;
n[1] = -(pl->height.ZatPoint(ViewPos.X - xscale * cosine, ViewPos.Y + xscale * sine) - zeroheight); n[1] = -(pl->height.ZatPoint(r_viewpoint.Pos.X - xscale * cosine, r_viewpoint.Pos.Y + xscale * sine) - zeroheight);
plane_su = p ^ m; plane_su = p ^ m;
plane_sv = p ^ n; plane_sv = p ^ n;
@ -157,7 +157,7 @@ namespace swrenderer
basecolormap = colormap; basecolormap = colormap;
bool foggy = level.fadeto || basecolormap->Fade || (level.flags & LEVEL_HASFADETABLE);; bool foggy = level.fadeto || basecolormap->Fade || (level.flags & LEVEL_HASFADETABLE);;
planelightfloat = (LightVisibility::Instance()->SlopePlaneGlobVis(foggy) * lxscale * lyscale) / (fabs(pl->height.ZatPoint(ViewPos) - ViewPos.Z)) / 65536.f; planelightfloat = (LightVisibility::Instance()->SlopePlaneGlobVis(foggy) * lxscale * lyscale) / (fabs(pl->height.ZatPoint(r_viewpoint.Pos) - r_viewpoint.Pos.Z)) / 65536.f;
if (pl->height.fC() > 0) if (pl->height.fC() > 0)
planelightfloat = -planelightfloat; planelightfloat = -planelightfloat;

View file

@ -167,7 +167,7 @@ namespace swrenderer
*xform == check->xform *xform == check->xform
) )
) && ) &&
check->viewangle == renderportal->stacked_angle check->viewangle == renderportal->stacked_angle.Yaw
) )
) )
) )
@ -191,7 +191,7 @@ namespace swrenderer
renderportal->CurrentPortalUniq == check->CurrentPortalUniq && renderportal->CurrentPortalUniq == check->CurrentPortalUniq &&
renderportal->MirrorFlags == check->MirrorFlags && renderportal->MirrorFlags == check->MirrorFlags &&
Thread->Clip3D->CurrentSkybox == check->CurrentSkybox && Thread->Clip3D->CurrentSkybox == check->CurrentSkybox &&
ViewPos == check->viewpos r_viewpoint.Pos == check->viewpos
) )
{ {
return check; return check;
@ -210,7 +210,7 @@ namespace swrenderer
check->extralight = renderportal->stacked_extralight; check->extralight = renderportal->stacked_extralight;
check->visibility = renderportal->stacked_visibility; check->visibility = renderportal->stacked_visibility;
check->viewpos = renderportal->stacked_viewpos; check->viewpos = renderportal->stacked_viewpos;
check->viewangle = renderportal->stacked_angle; check->viewangle = renderportal->stacked_angle.Yaw;
check->Alpha = alpha; check->Alpha = alpha;
check->Additive = additive; check->Additive = additive;
check->CurrentPortalUniq = renderportal->CurrentPortalUniq; check->CurrentPortalUniq = renderportal->CurrentPortalUniq;
@ -350,8 +350,8 @@ namespace swrenderer
VisiblePlane *pl; VisiblePlane *pl;
int i; int i;
DVector3 oViewPos = ViewPos; DVector3 oViewPos = r_viewpoint.Pos;
DAngle oViewAngle = ViewAngle; DAngle oViewAngle = r_viewpoint.Angles.Yaw;
RenderPortal *renderportal = Thread->Portal.get(); RenderPortal *renderportal = Thread->Portal.get();
@ -364,15 +364,15 @@ namespace swrenderer
if (pl->sky < 0 && pl->height.Zat0() == height) if (pl->sky < 0 && pl->height.Zat0() == height)
{ {
ViewPos = pl->viewpos; r_viewpoint.Pos = pl->viewpos;
ViewAngle = pl->viewangle; r_viewpoint.Angles.Yaw = pl->viewangle;
renderportal->MirrorFlags = pl->MirrorFlags; renderportal->MirrorFlags = pl->MirrorFlags;
pl->Render(Thread, pl->sky & 0x7FFFFFFF, pl->Additive, true); pl->Render(Thread, pl->sky & 0x7FFFFFFF, pl->Additive, true);
} }
} }
} }
ViewPos = oViewPos; r_viewpoint.Pos = oViewPos;
ViewAngle = oViewAngle; r_viewpoint.Angles.Yaw = oViewAngle;
} }
} }

View file

@ -256,15 +256,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. // 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(); CameraLight savedCameraLight = *CameraLight::Instance();
DAngle savedfov = FieldOfView; DAngle savedfov = r_viewpoint.FieldOfView;
R_SetFOV ((double)fov); R_SetFOV (r_viewpoint, (double)fov);
if (r_polyrenderer) if (r_polyrenderer)
PolyRenderer::Instance()->RenderViewToCanvas(viewpoint, Canvas, 0, 0, tex->GetWidth(), tex->GetHeight(), tex->bFirstUpdate); PolyRenderer::Instance()->RenderViewToCanvas(viewpoint, Canvas, 0, 0, tex->GetWidth(), tex->GetHeight(), tex->bFirstUpdate);
else else
mScene.RenderViewToCanvas(viewpoint, Canvas, 0, 0, tex->GetWidth(), tex->GetHeight(), tex->bFirstUpdate); mScene.RenderViewToCanvas(viewpoint, Canvas, 0, 0, tex->GetWidth(), tex->GetHeight(), tex->bFirstUpdate);
R_SetFOV (savedfov); R_SetFOV (r_viewpoint, savedfov);
if (Canvas->IsBgra()) if (Canvas->IsBgra())
{ {

View file

@ -68,7 +68,7 @@ namespace swrenderer
HeightLevel *near; HeightLevel *near;
HeightLevel *curr; HeightLevel *curr;
double height = add->ZatPoint(ViewPos); double height = add->ZatPoint(r_viewpoint.Pos);
if (height >= sec->CenterCeiling()) return; if (height >= sec->CenterCeiling()) return;
if (height <= sec->CenterFloor()) return; if (height <= sec->CenterFloor()) return;

View file

@ -47,6 +47,7 @@ namespace swrenderer
void CameraLight::SetCamera(AActor *actor) void CameraLight::SetCamera(AActor *actor)
{ {
AActor *camera = r_viewpoint.camera;
player_t *player = actor->player; player_t *player = actor->player;
if (camera && camera->player != nullptr) if (camera && camera->player != nullptr)
player = camera->player; player = camera->player;
@ -84,10 +85,10 @@ namespace swrenderer
} }
} }
// [RH] Inverse light for shooting the Sigil // [RH] Inverse light for shooting the Sigil
if (fixedcolormap == nullptr && extralight == INT_MIN) if (fixedcolormap == nullptr && r_viewpoint.extralight == INT_MIN)
{ {
fixedcolormap = &SpecialColormaps[INVERSECOLORMAP]; fixedcolormap = &SpecialColormaps[INVERSECOLORMAP];
extralight = 0; r_viewpoint.extralight = 0;
} }
} }
@ -108,7 +109,7 @@ namespace swrenderer
CurrentVisibility = vis; CurrentVisibility = vis;
auto viewport = RenderViewport::Instance(); auto viewport = RenderViewport::Instance();
if (FocalTangent == 0 || viewport->FocalLengthY == 0) if (r_viewwindow.FocalTangent == 0 || viewport->FocalLengthY == 0)
{ // If r_visibility is called before the renderer is all set up, don't { // 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 // divide by zero. This will be called again later, and the proper
// values can be initialized then. // values can be initialized then.
@ -117,7 +118,7 @@ namespace swrenderer
BaseVisibility = vis; BaseVisibility = vis;
MaxVisForWall = (viewport->InvZtoScale * (SCREENWIDTH*r_Yaspect) / (viewwidth*SCREENHEIGHT * FocalTangent)); MaxVisForWall = (viewport->InvZtoScale * (SCREENWIDTH*r_Yaspect) / (viewwidth*SCREENHEIGHT * r_viewwindow.FocalTangent));
MaxVisForWall = 32767.0 / MaxVisForWall; MaxVisForWall = 32767.0 / MaxVisForWall;
MaxVisForFloor = 32767.0 / (viewheight >> 2) * viewport->FocalLengthY / 160; MaxVisForFloor = 32767.0 / (viewheight >> 2) * viewport->FocalLengthY / 160;
@ -129,8 +130,8 @@ namespace swrenderer
else else
WallVisibility = BaseVisibility; WallVisibility = BaseVisibility;
WallVisibility = (viewport->InvZtoScale * SCREENWIDTH*AspectBaseHeight(WidescreenRatio) / WallVisibility = (viewport->InvZtoScale * SCREENWIDTH*AspectBaseHeight(r_viewwindow.WidescreenRatio) /
(viewwidth*SCREENHEIGHT * 3)) * (WallVisibility * FocalTangent); (viewwidth*SCREENHEIGHT * 3)) * (WallVisibility * r_viewwindow.FocalTangent);
// Prevent overflow on floors/ceilings. Note that the calculation of // Prevent overflow on floors/ceilings. Note that the calculation of
// MaxVisForFloor means that planes less than two units from the player's // MaxVisForFloor means that planes less than two units from the player's
@ -145,7 +146,7 @@ namespace swrenderer
FloorVisibility = 160.0 * FloorVisibility / viewport->FocalLengthY; FloorVisibility = 160.0 * FloorVisibility / viewport->FocalLengthY;
TiltVisibility = float(vis * FocalTangent * (16.f * 320.f) / viewwidth); TiltVisibility = float(vis * r_viewwindow.FocalTangent * (16.f * 320.f) / viewwidth);
NoLightFade = glset.nolightfade; NoLightFade = glset.nolightfade;
} }

View file

@ -84,10 +84,10 @@ namespace swrenderer
double WallVis(double screenZ, bool foggy) const { return WallGlobVis(foggy) / screenZ; } double WallVis(double screenZ, bool foggy) const { return WallGlobVis(foggy) / screenZ; }
double SpriteVis(double screenZ, bool foggy) const { return SpriteGlobVis(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 ParticleVis(double screenZ, bool foggy) const { return ParticleGlobVis(foggy) / screenZ; }
double FlatPlaneVis(int screenY, double planeZ, bool foggy) const { return FlatPlaneGlobVis(foggy) / fabs(planeZ - ViewPos.Z) * fabs(RenderViewport::Instance()->CenterY - screenY); } double FlatPlaneVis(int screenY, double planeZ, bool foggy) const { return FlatPlaneGlobVis(foggy) / fabs(planeZ - r_viewpoint.Pos.Z) * fabs(RenderViewport::Instance()->CenterY - screenY); }
static fixed_t LightLevelToShade(int lightlevel, bool foggy); static fixed_t LightLevelToShade(int lightlevel, bool foggy);
static int ActualExtraLight(bool fog) { return fog ? 0 : extralight << 4; } static int ActualExtraLight(bool fog) { return fog ? 0 : r_viewpoint.extralight << 4; }
private: private:
double BaseVisibility = 0.0; double BaseVisibility = 0.0;

View file

@ -98,9 +98,9 @@ namespace swrenderer
const sector_t *s = sec->GetHeightSec(); const sector_t *s = sec->GetHeightSec();
if (s != nullptr) if (s != nullptr)
{ {
sector_t *heightsec = viewsector->heightsec; sector_t *heightsec = r_viewpoint.sector->heightsec;
bool underwater = r_fakingunderwater || bool underwater = r_fakingunderwater ||
(heightsec && heightsec->floorplane.PointOnSide(ViewPos) <= 0); (heightsec && heightsec->floorplane.PointOnSide(r_viewpoint.Pos) <= 0);
bool doorunderwater = false; bool doorunderwater = false;
int diffTex = (s->MoreFlags & SECF_CLIPFAKEPLANES); int diffTex = (s->MoreFlags & SECF_CLIPFAKEPLANES);
@ -159,8 +159,8 @@ namespace swrenderer
} }
} }
double refceilz = s->ceilingplane.ZatPoint(ViewPos); double refceilz = s->ceilingplane.ZatPoint(r_viewpoint.Pos);
double orgceilz = sec->ceilingplane.ZatPoint(ViewPos); double orgceilz = sec->ceilingplane.ZatPoint(r_viewpoint.Pos);
#if 1 #if 1
// [RH] Allow viewing underwater areas through doors/windows that // [RH] Allow viewing underwater areas through doors/windows that
@ -234,7 +234,7 @@ namespace swrenderer
} }
FakeSide = WaterFakeSide::BelowFloor; FakeSide = WaterFakeSide::BelowFloor;
} }
else if (heightsec && heightsec->ceilingplane.PointOnSide(ViewPos) <= 0 && else if (heightsec && heightsec->ceilingplane.PointOnSide(r_viewpoint.Pos) <= 0 &&
orgceilz > refceilz && !(s->MoreFlags & SECF_FAKEFLOORONLY)) orgceilz > refceilz && !(s->MoreFlags & SECF_FAKEFLOORONLY))
{ // Above-ceiling hack { // Above-ceiling hack
tempsec->ceilingplane = s->ceilingplane; tempsec->ceilingplane = s->ceilingplane;
@ -307,16 +307,16 @@ namespace swrenderer
// Find the corners of the box // Find the corners of the box
// that define the edges from current viewpoint. // that define the edges from current viewpoint.
if (ViewPos.X <= bspcoord[BOXLEFT]) if (r_viewpoint.Pos.X <= bspcoord[BOXLEFT])
boxx = 0; boxx = 0;
else if (ViewPos.X < bspcoord[BOXRIGHT]) else if (r_viewpoint.Pos.X < bspcoord[BOXRIGHT])
boxx = 1; boxx = 1;
else else
boxx = 2; boxx = 2;
if (ViewPos.Y >= bspcoord[BOXTOP]) if (r_viewpoint.Pos.Y >= bspcoord[BOXTOP])
boxy = 0; boxy = 0;
else if (ViewPos.Y > bspcoord[BOXBOTTOM]) else if (r_viewpoint.Pos.Y > bspcoord[BOXBOTTOM])
boxy = 1; boxy = 1;
else else
boxy = 2; boxy = 2;
@ -325,10 +325,10 @@ namespace swrenderer
if (boxpos == 5) if (boxpos == 5)
return true; return true;
x1 = bspcoord[checkcoord[boxpos][0]] - ViewPos.X; x1 = bspcoord[checkcoord[boxpos][0]] - r_viewpoint.Pos.X;
y1 = bspcoord[checkcoord[boxpos][1]] - ViewPos.Y; y1 = bspcoord[checkcoord[boxpos][1]] - r_viewpoint.Pos.Y;
x2 = bspcoord[checkcoord[boxpos][2]] - ViewPos.X; x2 = bspcoord[checkcoord[boxpos][2]] - r_viewpoint.Pos.X;
y2 = bspcoord[checkcoord[boxpos][3]] - ViewPos.Y; y2 = bspcoord[checkcoord[boxpos][3]] - r_viewpoint.Pos.Y;
// check clip list for an open space // check clip list for an open space
@ -336,10 +336,10 @@ namespace swrenderer
if (y1 * (x1 - x2) + x1 * (y2 - y1) >= -EQUAL_EPSILON) if (y1 * (x1 - x2) + x1 * (y2 - y1) >= -EQUAL_EPSILON)
return true; return true;
rx1 = x1 * ViewSin - y1 * ViewCos; rx1 = x1 * r_viewpoint.Sin - y1 * r_viewpoint.Cos;
rx2 = x2 * ViewSin - y2 * ViewCos; rx2 = x2 * r_viewpoint.Sin - y2 * r_viewpoint.Cos;
ry1 = x1 * ViewTanCos + y1 * ViewTanSin; ry1 = x1 * r_viewpoint.TanCos + y1 * r_viewpoint.TanSin;
ry2 = x2 * ViewTanCos + y2 * ViewTanSin; ry2 = x2 * r_viewpoint.TanCos + y2 * r_viewpoint.TanSin;
if (Thread->Portal->MirrorFlags & RF_XFLIP) if (Thread->Portal->MirrorFlags & RF_XFLIP)
{ {
@ -501,7 +501,7 @@ namespace swrenderer
portal = frontsector->ValidatePortal(sector_t::ceiling); portal = frontsector->ValidatePortal(sector_t::ceiling);
VisiblePlane *ceilingplane = frontsector->ceilingplane.PointOnSide(ViewPos) > 0 || VisiblePlane *ceilingplane = frontsector->ceilingplane.PointOnSide(r_viewpoint.Pos) > 0 ||
frontsector->GetTexture(sector_t::ceiling) == skyflatnum || frontsector->GetTexture(sector_t::ceiling) == skyflatnum ||
portal != nullptr || portal != nullptr ||
(frontsector->heightsec && (frontsector->heightsec &&
@ -542,7 +542,7 @@ namespace swrenderer
// killough 10/98: add support for skies transferred from sidedefs // killough 10/98: add support for skies transferred from sidedefs
portal = frontsector->ValidatePortal(sector_t::floor); portal = frontsector->ValidatePortal(sector_t::floor);
VisiblePlane *floorplane = frontsector->floorplane.PointOnSide(ViewPos) > 0 || // killough 3/7/98 VisiblePlane *floorplane = frontsector->floorplane.PointOnSide(r_viewpoint.Pos) > 0 || // killough 3/7/98
frontsector->GetTexture(sector_t::floor) == skyflatnum || frontsector->GetTexture(sector_t::floor) == skyflatnum ||
portal != nullptr || portal != nullptr ||
(frontsector->heightsec && (frontsector->heightsec &&
@ -591,7 +591,7 @@ namespace swrenderer
clip3d->NewClip(); clip3d->NewClip();
} }
double fakeHeight = clip3d->fakeFloor->fakeFloor->top.plane->ZatPoint(frontsector->centerspot); double fakeHeight = clip3d->fakeFloor->fakeFloor->top.plane->ZatPoint(frontsector->centerspot);
if (fakeHeight < ViewPos.Z && if (fakeHeight < r_viewpoint.Pos.Z &&
fakeHeight > frontsector->floorplane.ZatPoint(frontsector->centerspot)) fakeHeight > frontsector->floorplane.ZatPoint(frontsector->centerspot))
{ {
clip3d->fake3D = FAKE3D_FAKEFLOOR; clip3d->fake3D = FAKE3D_FAKEFLOOR;
@ -654,7 +654,7 @@ namespace swrenderer
clip3d->NewClip(); clip3d->NewClip();
} }
double fakeHeight = clip3d->fakeFloor->fakeFloor->bottom.plane->ZatPoint(frontsector->centerspot); double fakeHeight = clip3d->fakeFloor->fakeFloor->bottom.plane->ZatPoint(frontsector->centerspot);
if (fakeHeight > ViewPos.Z && if (fakeHeight > r_viewpoint.Pos.Z &&
fakeHeight < frontsector->ceilingplane.ZatPoint(frontsector->centerspot)) fakeHeight < frontsector->ceilingplane.ZatPoint(frontsector->centerspot))
{ {
clip3d->fake3D = FAKE3D_FAKECEILING; clip3d->fake3D = FAKE3D_FAKECEILING;
@ -798,7 +798,7 @@ namespace swrenderer
node_t *bsp = (node_t *)node; node_t *bsp = (node_t *)node;
// Decide which side the view point is on. // Decide which side the view point is on.
int side = R_PointOnSide(ViewPos, bsp); int side = R_PointOnSide(r_viewpoint.Pos, bsp);
// Recursively divide front space (toward the viewer). // Recursively divide front space (toward the viewer).
RenderBSPNode(bsp->children[side]); RenderBSPNode(bsp->children[side]);
@ -848,7 +848,7 @@ namespace swrenderer
FIntCVar *cvar = thing->GetClass()->distancecheck; FIntCVar *cvar = thing->GetClass()->distancecheck;
if (cvar != nullptr && *cvar >= 0) if (cvar != nullptr && *cvar >= 0)
{ {
double dist = (thing->Pos() - ViewPos).LengthSquared(); double dist = (thing->Pos() - r_viewpoint.Pos).LengthSquared();
double check = (double)**cvar; double check = (double)**cvar;
if (dist >= check * check) if (dist >= check * check)
{ {
@ -930,8 +930,8 @@ namespace swrenderer
bool RenderOpaquePass::GetThingSprite(AActor *thing, ThingSprite &sprite) bool RenderOpaquePass::GetThingSprite(AActor *thing, ThingSprite &sprite)
{ {
sprite.pos = thing->InterpolatedPosition(r_TicFracF); sprite.pos = thing->InterpolatedPosition(r_viewpoint.TicFrac);
sprite.pos.Z += thing->GetBobOffset(r_TicFracF); sprite.pos.Z += thing->GetBobOffset(r_viewpoint.TicFrac);
sprite.spritenum = thing->sprite; sprite.spritenum = thing->sprite;
sprite.tex = nullptr; sprite.tex = nullptr;
@ -958,7 +958,7 @@ namespace swrenderer
{ {
// choose a different rotation based on player view // choose a different rotation based on player view
spriteframe_t *sprframe = &SpriteFrames[sprite.tex->Rotations]; spriteframe_t *sprframe = &SpriteFrames[sprite.tex->Rotations];
DAngle ang = (sprite.pos - ViewPos).Angle(); DAngle ang = (sprite.pos - r_viewpoint.Pos).Angle();
angle_t rot; angle_t rot;
if (sprframe->Texture[0] == sprframe->Texture[1]) if (sprframe->Texture[0] == sprframe->Texture[1])
{ {
@ -1001,7 +1001,7 @@ namespace swrenderer
//picnum = SpriteFrames[sprdef->spriteframes + thing->frame].Texture[0]; //picnum = SpriteFrames[sprdef->spriteframes + thing->frame].Texture[0];
// choose a different rotation based on player view // choose a different rotation based on player view
spriteframe_t *sprframe = &SpriteFrames[sprdef->spriteframes + thing->frame]; spriteframe_t *sprframe = &SpriteFrames[sprdef->spriteframes + thing->frame];
DAngle ang = (sprite.pos - ViewPos).Angle(); DAngle ang = (sprite.pos - r_viewpoint.Pos).Angle();
angle_t rot; angle_t rot;
if (sprframe->Texture[0] == sprframe->Texture[1]) if (sprframe->Texture[0] == sprframe->Texture[1])
{ {

View file

@ -101,12 +101,12 @@ namespace swrenderer
Thread->Clip3D->EnterSkybox(); Thread->Clip3D->EnterSkybox();
CurrentPortalInSkybox = true; CurrentPortalInSkybox = true;
int savedextralight = extralight; int savedextralight = r_viewpoint.extralight;
DVector3 savedpos = ViewPos; DVector3 savedpos = r_viewpoint.Pos;
DAngle savedangle = ViewAngle; DRotator savedangles = r_viewpoint.Angles;
double savedvisibility = LightVisibility::Instance()->GetVisibility(); double savedvisibility = LightVisibility::Instance()->GetVisibility();
AActor *savedcamera = camera; AActor *savedcamera = r_viewpoint.camera;
sector_t *savedsector = viewsector; sector_t *savedsector = r_viewpoint.sector;
for (VisiblePlane *pl = planes->PopFirstPortalPlane(); pl != nullptr; pl = planes->PopFirstPortalPlane()) 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 // Don't let gun flashes brighten the sky box
AActor *sky = port->mSkybox; AActor *sky = port->mSkybox;
extralight = 0; r_viewpoint.extralight = 0;
LightVisibility::Instance()->SetVisibility(sky->args[0] * 0.25f); LightVisibility::Instance()->SetVisibility(sky->args[0] * 0.25f);
ViewPos = sky->InterpolatedPosition(r_TicFracF); r_viewpoint.Pos = sky->InterpolatedPosition(r_viewpoint.TicFrac);
ViewAngle = savedangle + (sky->PrevAngles.Yaw + deltaangle(sky->PrevAngles.Yaw, sky->Angles.Yaw) * r_TicFracF); r_viewpoint.Angles.Yaw = savedangles.Yaw + (sky->PrevAngles.Yaw + deltaangle(sky->PrevAngles.Yaw, sky->Angles.Yaw) * r_viewpoint.TicFrac);
CopyStackedViewParameters(); CopyStackedViewParameters();
break; break;
@ -138,12 +138,12 @@ namespace swrenderer
case PORTS_STACKEDSECTORTHING: case PORTS_STACKEDSECTORTHING:
case PORTS_PORTAL: case PORTS_PORTAL:
case PORTS_LINKEDPORTAL: case PORTS_LINKEDPORTAL:
extralight = pl->extralight; r_viewpoint.extralight = pl->extralight;
LightVisibility::Instance()->SetVisibility(pl->visibility); LightVisibility::Instance()->SetVisibility(pl->visibility);
ViewPos.X = pl->viewpos.X + port->mDisplacement.X; r_viewpoint.Pos.X = pl->viewpos.X + port->mDisplacement.X;
ViewPos.Y = pl->viewpos.Y + port->mDisplacement.Y; r_viewpoint.Pos.Y = pl->viewpos.Y + port->mDisplacement.Y;
ViewPos.Z = pl->viewpos.Z; r_viewpoint.Pos.Z = pl->viewpos.Z;
ViewAngle = pl->viewangle; r_viewpoint.Angles.Yaw = pl->viewangle;
break; break;
case PORTS_HORIZON: case PORTS_HORIZON:
@ -158,10 +158,10 @@ namespace swrenderer
port->mFlags |= PORTSF_INSKYBOX; port->mFlags |= PORTSF_INSKYBOX;
if (port->mPartner > 0) level.sectorPortals[port->mPartner].mFlags |= PORTSF_INSKYBOX; if (port->mPartner > 0) level.sectorPortals[port->mPartner].mFlags |= PORTSF_INSKYBOX;
camera = nullptr; r_viewpoint.camera = nullptr;
viewsector = port->mDestination; r_viewpoint.sector = port->mDestination;
assert(viewsector != nullptr); assert(viewsector != nullptr);
R_SetViewAngle(); R_SetViewAngle(r_viewpoint, r_viewwindow);
Thread->OpaquePass->ClearSeenSprites(); Thread->OpaquePass->ClearSeenSprites();
Thread->Clip3D->ClearFakeFloors(); Thread->Clip3D->ClearFakeFloors();
@ -188,7 +188,7 @@ namespace swrenderer
drawseglist->PushPortal(); drawseglist->PushPortal();
Thread->SpriteList->PushPortal(); Thread->SpriteList->PushPortal();
viewposStack.Push(ViewPos); viewposStack.Push(r_viewpoint.Pos);
visplaneStack.Push(pl); visplaneStack.Push(pl);
// Create a drawseg to clip sprites to the sky plane // Create a drawseg to clip sprites to the sky plane
@ -227,7 +227,7 @@ namespace swrenderer
while (viewposStack.Size() > 0) while (viewposStack.Size() > 0)
{ {
// Masked textures and planes need the view coordinates restored for proper positioning. // Masked textures and planes need the view coordinates restored for proper positioning.
viewposStack.Pop(ViewPos); viewposStack.Pop(r_viewpoint.Pos);
Thread->TranslucentPass->Render(); Thread->TranslucentPass->Render();
@ -242,13 +242,13 @@ namespace swrenderer
drawseglist->PopPortal(); drawseglist->PopPortal();
} }
camera = savedcamera; r_viewpoint.camera = savedcamera;
viewsector = savedsector; r_viewpoint.sector = savedsector;
ViewPos = savedpos; r_viewpoint.Pos = savedpos;
LightVisibility::Instance()->SetVisibility(savedvisibility); LightVisibility::Instance()->SetVisibility(savedvisibility);
extralight = savedextralight; r_viewpoint.extralight = savedextralight;
ViewAngle = savedangle; r_viewpoint.Angles = savedangles;
R_SetViewAngle(); R_SetViewAngle(r_viewpoint, r_viewwindow);
CurrentPortalInSkybox = false; CurrentPortalInSkybox = false;
Thread->Clip3D->LeaveSkybox(); Thread->Clip3D->LeaveSkybox();
@ -318,12 +318,12 @@ namespace swrenderer
return; return;
} }
DAngle startang = ViewAngle; DAngle startang = r_viewpoint.Angles.Yaw;
DVector3 startpos = ViewPos; DVector3 startpos = r_viewpoint.Pos;
DVector3 savedpath[2] = { ViewPath[0], ViewPath[1] }; DVector3 savedpath[2] = { r_viewpoint.Path[0], r_viewpoint.Path[1] };
ActorRenderFlags savedvisibility = camera ? camera->renderflags & RF_INVISIBLE : ActorRenderFlags::FromInt(0); ActorRenderFlags savedvisibility = r_viewpoint.camera ? r_viewpoint.camera->renderflags & RF_INVISIBLE : ActorRenderFlags::FromInt(0);
camera->renderflags &= ~RF_INVISIBLE; r_viewpoint.camera->renderflags &= ~RF_INVISIBLE;
CurrentPortalUniq++; CurrentPortalUniq++;
@ -337,11 +337,11 @@ namespace swrenderer
// Reflect the current view behind the mirror. // Reflect the current view behind the mirror.
if (pds->src->Delta().X == 0) if (pds->src->Delta().X == 0)
{ // vertical mirror { // vertical mirror
ViewPos.X = v1->fX() - startpos.X + v1->fX(); r_viewpoint.Pos.X = v1->fX() - startpos.X + v1->fX();
} }
else if (pds->src->Delta().Y == 0) else if (pds->src->Delta().Y == 0)
{ // horizontal mirror { // horizontal mirror
ViewPos.Y = v1->fY() - startpos.Y + v1->fY(); r_viewpoint.Pos.Y = v1->fY() - startpos.Y + v1->fY();
} }
else else
{ // any mirror { // any mirror
@ -357,40 +357,40 @@ namespace swrenderer
// the above two cases catch len == 0 // the above two cases catch len == 0
double r = ((x - x1)*dx + (y - y1)*dy) / (dx*dx + dy*dy); double r = ((x - x1)*dx + (y - y1)*dy) / (dx*dx + dy*dy);
ViewPos.X = (x1 + r * dx) * 2 - x; r_viewpoint.Pos.X = (x1 + r * dx) * 2 - x;
ViewPos.Y = (y1 + r * dy) * 2 - y; r_viewpoint.Pos.Y = (y1 + r * dy) * 2 - y;
} }
ViewAngle = pds->src->Delta().Angle() * 2 - startang; r_viewpoint.Angles.Yaw = pds->src->Delta().Angle() * 2 - startang;
} }
else else
{ {
P_TranslatePortalXY(pds->src, ViewPos.X, ViewPos.Y); P_TranslatePortalXY(pds->src, r_viewpoint.Pos.X, r_viewpoint.Pos.Y);
P_TranslatePortalZ(pds->src, ViewPos.Z); P_TranslatePortalZ(pds->src, r_viewpoint.Pos.Z);
P_TranslatePortalAngle(pds->src, ViewAngle); P_TranslatePortalAngle(pds->src, r_viewpoint.Angles.Yaw);
P_TranslatePortalXY(pds->src, ViewPath[0].X, ViewPath[0].Y); P_TranslatePortalXY(pds->src, r_viewpoint.Path[0].X, r_viewpoint.Path[0].Y);
P_TranslatePortalXY(pds->src, ViewPath[1].X, ViewPath[1].Y); P_TranslatePortalXY(pds->src, r_viewpoint.Path[1].X, r_viewpoint.Path[1].Y);
if (!r_showviewer && camera && P_PointOnLineSidePrecise(ViewPath[0], pds->dst) != P_PointOnLineSidePrecise(ViewPath[1], pds->dst)) if (!r_viewpoint.showviewer && r_viewpoint.camera && P_PointOnLineSidePrecise(r_viewpoint.Path[0], pds->dst) != P_PointOnLineSidePrecise(r_viewpoint.Path[1], pds->dst))
{ {
double distp = (ViewPath[0] - ViewPath[1]).Length(); double distp = (r_viewpoint.Path[0] - r_viewpoint.Path[1]).Length();
if (distp > EQUAL_EPSILON) if (distp > EQUAL_EPSILON)
{ {
double dist1 = (ViewPos - ViewPath[0]).Length(); double dist1 = (r_viewpoint.Pos - r_viewpoint.Path[0]).Length();
double dist2 = (ViewPos - ViewPath[1]).Length(); double dist2 = (r_viewpoint.Pos - r_viewpoint.Path[1]).Length();
if (dist1 + dist2 < distp + 1) if (dist1 + dist2 < distp + 1)
{ {
camera->renderflags |= RF_INVISIBLE; r_viewpoint.camera->renderflags |= RF_INVISIBLE;
} }
} }
} }
} }
ViewSin = ViewAngle.Sin(); r_viewpoint.Sin = r_viewpoint.Angles.Yaw.Sin();
ViewCos = ViewAngle.Cos(); r_viewpoint.Cos = r_viewpoint.Angles.Yaw.Cos();
ViewTanSin = FocalTangent * ViewSin; r_viewpoint.TanSin = r_viewwindow.FocalTangent * r_viewpoint.Sin;
ViewTanCos = FocalTangent * ViewCos; r_viewpoint.TanCos = r_viewwindow.FocalTangent * r_viewpoint.Cos;
CopyStackedViewParameters(); CopyStackedViewParameters();
@ -425,14 +425,14 @@ namespace swrenderer
Thread->OpaquePass->RenderScene(); Thread->OpaquePass->RenderScene();
Thread->Clip3D->ResetClip(); // reset clips (floor/ceiling) Thread->Clip3D->ResetClip(); // reset clips (floor/ceiling)
if (!savedvisibility && camera) camera->renderflags &= ~RF_INVISIBLE; if (!savedvisibility && r_viewpoint.camera) r_viewpoint.camera->renderflags &= ~RF_INVISIBLE;
PlaneCycles.Clock(); PlaneCycles.Clock();
Thread->PlaneList->Render(); Thread->PlaneList->Render();
RenderPlanePortals(); RenderPlanePortals();
PlaneCycles.Unclock(); PlaneCycles.Unclock();
double vzp = ViewPos.Z; double vzp = r_viewpoint.Pos.Z;
int prevuniq = CurrentPortalUniq; int prevuniq = CurrentPortalUniq;
// depth check is in another place right now // depth check is in another place right now
@ -463,10 +463,10 @@ namespace swrenderer
CurrentPortal = prevpds; CurrentPortal = prevpds;
MirrorFlags = prevmf; MirrorFlags = prevmf;
ViewAngle = startang; r_viewpoint.Angles.Yaw = startang;
ViewPos = startpos; r_viewpoint.Pos = startpos;
ViewPath[0] = savedpath[0]; r_viewpoint.Path[0] = savedpath[0];
ViewPath[1] = savedpath[1]; r_viewpoint.Path[1] = savedpath[1];
} }
void RenderPortal::RenderLinePortalHighlight(PortalDrawseg* pds) void RenderPortal::RenderLinePortalHighlight(PortalDrawseg* pds)
@ -513,9 +513,9 @@ namespace swrenderer
void RenderPortal::CopyStackedViewParameters() void RenderPortal::CopyStackedViewParameters()
{ {
stacked_viewpos = ViewPos; stacked_viewpos = r_viewpoint.Pos;
stacked_angle = ViewAngle; stacked_angle = r_viewpoint.Angles;
stacked_extralight = extralight; stacked_extralight = r_viewpoint.extralight;
stacked_visibility = LightVisibility::Instance()->GetVisibility(); stacked_visibility = LightVisibility::Instance()->GetVisibility();
} }

View file

@ -50,7 +50,7 @@ namespace swrenderer
int stacked_extralight = 0; int stacked_extralight = 0;
double stacked_visibility = 0.0; double stacked_visibility = 0.0;
DVector3 stacked_viewpos; DVector3 stacked_viewpos;
DAngle stacked_angle; DRotator stacked_angle;
int numskyboxes = 0; // For ADD_STAT(skyboxes) int numskyboxes = 0; // For ADD_STAT(skyboxes)

View file

@ -132,7 +132,7 @@ namespace swrenderer
MaskedCycles.Reset(); MaskedCycles.Reset();
WallScanCycles.Reset(); WallScanCycles.Reset();
R_SetupFrame(actor); R_SetupFrame(r_viewpoint, r_viewwindow, actor);
CameraLight::Instance()->SetCamera(actor); CameraLight::Instance()->SetCamera(actor);
RenderViewport::Instance()->SetupFreelook(); RenderViewport::Instance()->SetupFreelook();
@ -146,18 +146,18 @@ namespace swrenderer
// Link the polyobjects right before drawing the scene to reduce the amounts of calls to this function // Link the polyobjects right before drawing the scene to reduce the amounts of calls to this function
PO_LinkToSubsectors(); PO_LinkToSubsectors();
ActorRenderFlags savedflags = camera->renderflags; ActorRenderFlags savedflags = r_viewpoint.camera->renderflags;
// Never draw the player unless in chasecam mode // Never draw the player unless in chasecam mode
if (!r_showviewer) if (!r_viewpoint.showviewer)
{ {
camera->renderflags |= RF_INVISIBLE; r_viewpoint.camera->renderflags |= RF_INVISIBLE;
} }
RenderThreadSlices(); RenderThreadSlices();
MainThread()->PlayerSprites->Render(); MainThread()->PlayerSprites->Render();
RenderDrawQueues(); RenderDrawQueues();
camera->renderflags = savedflags; r_viewpoint.camera->renderflags = savedflags;
interpolator.RestoreInterpolations(); interpolator.RestoreInterpolations();
// If we don't want shadered colormaps, NULL it now so that the // If we don't want shadered colormaps, NULL it now so that the
@ -331,17 +331,17 @@ namespace swrenderer
viewwidth = width; viewwidth = width;
viewport->RenderTarget = canvas; viewport->RenderTarget = canvas;
R_SetWindow(12, width, height, height, true); R_SetWindow(r_viewpoint, r_viewwindow, 12, width, height, height, true);
viewwindowx = x; viewwindowx = x;
viewwindowy = y; viewwindowy = y;
viewactive = true; viewactive = true;
viewport->SetViewport(width, height, WidescreenRatio); viewport->SetViewport(width, height, r_viewwindow.WidescreenRatio);
RenderActorView(actor, dontmaplines); RenderActorView(actor, dontmaplines);
viewport->RenderTarget = screen; viewport->RenderTarget = screen;
R_ExecuteSetViewSize(); R_ExecuteSetViewSize(r_viewpoint, r_viewwindow);
float trueratio; float trueratio;
ActiveRatio(width, height, &trueratio); ActiveRatio(width, height, &trueratio);
screen->Lock(true); screen->Lock(true);

View file

@ -175,7 +175,7 @@ namespace swrenderer
else else
{ // kg3D - correct sorting { // kg3D - correct sorting
// ceilings // ceilings
for (HeightLevel *hl = clip3d->height_cur; hl != nullptr && hl->height >= ViewPos.Z; hl = hl->prev) for (HeightLevel *hl = clip3d->height_cur; hl != nullptr && hl->height >= r_viewpoint.Pos.Z; hl = hl->prev)
{ {
if (hl->next) if (hl->next)
{ {
@ -195,7 +195,7 @@ namespace swrenderer
clip3d->fake3D = FAKE3D_DOWN2UP | FAKE3D_CLIPTOP; clip3d->fake3D = FAKE3D_DOWN2UP | FAKE3D_CLIPTOP;
clip3d->sclipTop = clip3d->height_top->height; clip3d->sclipTop = clip3d->height_top->height;
DrawMaskedSingle(true); DrawMaskedSingle(true);
for (HeightLevel *hl = clip3d->height_top; hl != nullptr && hl->height < ViewPos.Z; hl = hl->next) for (HeightLevel *hl = clip3d->height_top; hl != nullptr && hl->height < r_viewpoint.Pos.Z; hl = hl->next)
{ {
Thread->PlaneList->RenderHeight(hl->height); Thread->PlaneList->RenderHeight(hl->height);
if (hl->next) if (hl->next)

View file

@ -144,8 +144,8 @@ namespace swrenderer
DVector2 angvec = (curline->v2->fPos() - curline->v1->fPos()).Unit(); DVector2 angvec = (curline->v2->fPos() - curline->v1->fPos()).Unit();
float maskedScaleY; float maskedScaleY;
decal_left = decal_pos - edge_left * angvec - ViewPos; decal_left = decal_pos - edge_left * angvec - r_viewpoint.Pos;
decal_right = decal_pos + edge_right * angvec - ViewPos; decal_right = decal_pos + edge_right * angvec - r_viewpoint.Pos;
CameraLight *cameraLight; CameraLight *cameraLight;
double texturemid; double texturemid;
@ -222,7 +222,7 @@ namespace swrenderer
} }
yscale = decal->ScaleY; yscale = decal->ScaleY;
texturemid = WallSpriteTile->TopOffset + (zpos - ViewPos.Z) / yscale; texturemid = WallSpriteTile->TopOffset + (zpos - r_viewpoint.Pos.Z) / yscale;
// Clip sprite to drawseg // Clip sprite to drawseg
x1 = MAX<int>(clipper->x1, x1); x1 = MAX<int>(clipper->x1, x1);

View file

@ -77,16 +77,16 @@ namespace swrenderer
return; return;
// transform the origin point // transform the origin point
tr_x = particle->Pos.X - ViewPos.X; tr_x = particle->Pos.X - r_viewpoint.Pos.X;
tr_y = particle->Pos.Y - ViewPos.Y; tr_y = particle->Pos.Y - r_viewpoint.Pos.Y;
tz = tr_x * ViewTanCos + tr_y * ViewTanSin; tz = tr_x * r_viewpoint.TanCos + tr_y * r_viewpoint.TanSin;
// particle is behind view plane? // particle is behind view plane?
if (tz < MINZ) if (tz < MINZ)
return; return;
tx = tr_x * ViewSin - tr_y * ViewCos; tx = tr_x * r_viewpoint.Sin - tr_y * r_viewpoint.Cos;
// Flip for mirrors // Flip for mirrors
if (renderportal->MirrorFlags & RF_XFLIP) if (renderportal->MirrorFlags & RF_XFLIP)
@ -99,13 +99,13 @@ namespace swrenderer
return; return;
tiz = 1 / tz; tiz = 1 / tz;
xscale = centerx * tiz; xscale = r_viewwindow.centerx * tiz;
// calculate edges of the shape // calculate edges of the shape
double psize = particle->size / 8.0; double psize = particle->size / 8.0;
x1 = MAX<int>(renderportal->WindowLeft, centerx + xs_RoundToInt((tx - psize) * xscale)); x1 = MAX<int>(renderportal->WindowLeft, r_viewwindow.centerx + xs_RoundToInt((tx - psize) * xscale));
x2 = MIN<int>(renderportal->WindowRight, centerx + xs_RoundToInt((tx + psize) * xscale)); x2 = MIN<int>(renderportal->WindowRight, r_viewwindow.centerx + xs_RoundToInt((tx + psize) * xscale));
if (x1 >= x2) if (x1 >= x2)
return; return;
@ -113,7 +113,7 @@ namespace swrenderer
auto viewport = RenderViewport::Instance(); auto viewport = RenderViewport::Instance();
yscale = xscale; // YaspectMul is not needed for particles as they should always be square yscale = xscale; // YaspectMul is not needed for particles as they should always be square
ty = particle->Pos.Z - ViewPos.Z; ty = particle->Pos.Z - r_viewpoint.Pos.Z;
y1 = xs_RoundToInt(viewport->CenterY - (ty + psize) * yscale); y1 = xs_RoundToInt(viewport->CenterY - (ty + psize) * yscale);
y2 = xs_RoundToInt(viewport->CenterY - (ty - psize) * yscale); y2 = xs_RoundToInt(viewport->CenterY - (ty - psize) * yscale);

View file

@ -82,37 +82,37 @@ namespace swrenderer
F3DFloor *rover; F3DFloor *rover;
if (!r_drawplayersprites || if (!r_drawplayersprites ||
!camera || !r_viewpoint.camera ||
!camera->player || !r_viewpoint.camera->player ||
(players[consoleplayer].cheats & CF_CHASECAM) || (players[consoleplayer].cheats & CF_CHASECAM) ||
(r_deathcamera && camera->health <= 0)) (r_deathcamera && r_viewpoint.camera->health <= 0))
return; return;
FDynamicColormap *basecolormap; FDynamicColormap *basecolormap;
CameraLight *cameraLight = CameraLight::Instance(); CameraLight *cameraLight = CameraLight::Instance();
if (cameraLight->FixedLightLevel() < 0 && viewsector->e && viewsector->e->XFloor.lightlist.Size()) if (cameraLight->FixedLightLevel() < 0 && r_viewpoint.sector->e && r_viewpoint.sector->e->XFloor.lightlist.Size())
{ {
for (i = viewsector->e->XFloor.lightlist.Size() - 1; i >= 0; i--) for (i = r_viewpoint.sector->e->XFloor.lightlist.Size() - 1; i >= 0; i--)
{ {
if (ViewPos.Z <= viewsector->e->XFloor.lightlist[i].plane.Zat0()) if (r_viewpoint.Pos.Z <= r_viewpoint.sector->e->XFloor.lightlist[i].plane.Zat0())
{ {
rover = viewsector->e->XFloor.lightlist[i].caster; rover = r_viewpoint.sector->e->XFloor.lightlist[i].caster;
if (rover) if (rover)
{ {
if (rover->flags & FF_DOUBLESHADOW && ViewPos.Z <= rover->bottom.plane->Zat0()) if (rover->flags & FF_DOUBLESHADOW && r_viewpoint.Pos.Z <= rover->bottom.plane->Zat0())
break; break;
sec = rover->model; sec = rover->model;
if (rover->flags & FF_FADEWALLS) if (rover->flags & FF_FADEWALLS)
basecolormap = sec->ColorMap; basecolormap = sec->ColorMap;
else else
basecolormap = viewsector->e->XFloor.lightlist[i].extra_colormap; basecolormap = r_viewpoint.sector->e->XFloor.lightlist[i].extra_colormap;
} }
break; break;
} }
} }
if (!sec) if (!sec)
{ {
sec = viewsector; sec = r_viewpoint.sector;
basecolormap = sec->ColorMap; basecolormap = sec->ColorMap;
} }
floorlight = ceilinglight = sec->lightlevel; floorlight = ceilinglight = sec->lightlevel;
@ -120,7 +120,7 @@ namespace swrenderer
else else
{ // This used to use camera->Sector but due to interpolation that can be incorrect { // 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. // when the interpolated viewpoint is in a different sector than the camera.
sec = Thread->OpaquePass->FakeFlat(viewsector, &tempsec, &floorlight, &ceilinglight, nullptr, 0, 0, 0, 0); sec = Thread->OpaquePass->FakeFlat(r_viewpoint.sector, &tempsec, &floorlight, &ceilinglight, nullptr, 0, 0, 0, 0);
// [RH] set basecolormap // [RH] set basecolormap
basecolormap = sec->ColorMap; basecolormap = sec->ColorMap;
@ -133,7 +133,7 @@ namespace swrenderer
lightnum = ((floorlight + ceilinglight) >> 1) + LightVisibility::ActualExtraLight(foggy); lightnum = ((floorlight + ceilinglight) >> 1) + LightVisibility::ActualExtraLight(foggy);
int spriteshade = LightVisibility::LightLevelToShade(lightnum, foggy) - 24 * FRACUNIT; int spriteshade = LightVisibility::LightLevelToShade(lightnum, foggy) - 24 * FRACUNIT;
if (camera->player != NULL) if (r_viewpoint.camera->player != NULL)
{ {
auto viewport = RenderViewport::Instance(); auto viewport = RenderViewport::Instance();
@ -143,10 +143,10 @@ namespace swrenderer
viewport->CenterY = viewheight / 2; viewport->CenterY = viewheight / 2;
P_BobWeapon(camera->player, &bobx, &boby, r_TicFracF); P_BobWeapon(r_viewpoint.camera->player, &bobx, &boby, r_viewpoint.TicFrac);
// Interpolate the main weapon layer once so as to be able to add it to other layers. // Interpolate the main weapon layer once so as to be able to add it to other layers.
if ((weapon = camera->player->FindPSprite(PSP_WEAPON)) != nullptr) if ((weapon = r_viewpoint.camera->player->FindPSprite(PSP_WEAPON)) != nullptr)
{ {
if (weapon->firstTic) if (weapon->firstTic)
{ {
@ -155,8 +155,8 @@ namespace swrenderer
} }
else else
{ {
wx = weapon->oldx + (weapon->x - weapon->oldx) * r_TicFracF; wx = weapon->oldx + (weapon->x - weapon->oldx) * r_viewpoint.TicFrac;
wy = weapon->oldy + (weapon->y - weapon->oldy) * r_TicFracF; wy = weapon->oldy + (weapon->y - weapon->oldy) * r_viewpoint.TicFrac;
} }
} }
else else
@ -166,7 +166,7 @@ namespace swrenderer
} }
// add all active psprites // add all active psprites
psp = camera->player->psprites; psp = r_viewpoint.camera->player->psprites;
while (psp) while (psp)
{ {
// [RH] Don't draw the targeter's crosshair if the player already has a crosshair set. // [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) if ((psp->GetID() != PSP_TARGETCENTER || CrosshairImage == nullptr) && psp->GetCaller() != nullptr)
{ {
RenderSprite(psp, camera, bobx, boby, wx, wy, r_TicFracF, spriteshade, basecolormap, foggy); RenderSprite(psp, r_viewpoint.camera, bobx, boby, wx, wy, r_viewpoint.TicFrac, spriteshade, basecolormap, foggy);
} }
psp = psp->GetNext(); psp = psp->GetNext();
@ -245,7 +245,7 @@ namespace swrenderer
auto viewport = RenderViewport::Instance(); auto viewport = RenderViewport::Instance();
double pspritexscale = centerxwide / 160.0; double pspritexscale = r_viewwindow.centerxwide / 160.0;
double pspriteyscale = pspritexscale * viewport->YaspectMul; double pspriteyscale = pspritexscale * viewport->YaspectMul;
double pspritexiscale = 1 / pspritexscale; double pspritexiscale = 1 / pspritexscale;
@ -273,7 +273,7 @@ namespace swrenderer
vis.texturemid = (BASEYCENTER - sy) * tex->Scale.Y + tex->TopOffset; vis.texturemid = (BASEYCENTER - sy) * tex->Scale.Y + tex->TopOffset;
if (camera->player && (viewport->RenderTarget != screen || if (r_viewpoint.camera->player && (viewport->RenderTarget != screen ||
viewheight == viewport->RenderTarget->GetHeight() || viewheight == viewport->RenderTarget->GetHeight() ||
(viewport->RenderTarget->GetWidth() > (BASEXCENTER * 2) && !st_scale))) (viewport->RenderTarget->GetWidth() > (BASEXCENTER * 2) && !st_scale)))
{ // Adjust PSprite for fullscreen views { // Adjust PSprite for fullscreen views
@ -292,7 +292,7 @@ namespace swrenderer
} }
if (pspr->GetID() < PSP_TARGETCENTER) if (pspr->GetID() < PSP_TARGETCENTER)
{ // Move the weapon down for 1280x1024. { // Move the weapon down for 1280x1024.
vis.texturemid -= AspectPspriteOffset(WidescreenRatio); vis.texturemid -= AspectPspriteOffset(r_viewwindow.WidescreenRatio);
} }
vis.x1 = x1 < 0 ? 0 : x1; vis.x1 = x1 < 0 ? 0 : x1;
vis.x2 = x2 >= viewwidth ? viewwidth : x2; vis.x2 = x2 >= viewwidth ? viewwidth : x2;
@ -447,14 +447,14 @@ namespace swrenderer
colormap_to_use = (FDynamicColormap*)vis.Light.BaseColormap; colormap_to_use = (FDynamicColormap*)vis.Light.BaseColormap;
if (camera->Inventory != nullptr) if (r_viewpoint.camera->Inventory != nullptr)
{ {
visstyle_t visstyle; visstyle_t visstyle;
visstyle.Alpha = vis.Alpha; visstyle.Alpha = vis.Alpha;
visstyle.RenderStyle = STYLE_Count; visstyle.RenderStyle = STYLE_Count;
visstyle.Invert = false; visstyle.Invert = false;
camera->Inventory->AlterWeaponSprite(&visstyle); r_viewpoint.camera->Inventory->AlterWeaponSprite(&visstyle);
vis.Alpha = visstyle.Alpha; vis.Alpha = visstyle.Alpha;

View file

@ -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) 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 // transform the origin point
double tr_x = pos.X - ViewPos.X; double tr_x = pos.X - r_viewpoint.Pos.X;
double tr_y = pos.Y - ViewPos.Y; double tr_y = pos.Y - r_viewpoint.Pos.Y;
double tz = tr_x * ViewTanCos + tr_y * ViewTanSin; double tz = tr_x * r_viewpoint.TanCos + tr_y * r_viewpoint.TanSin;
// thing is behind view plane? // thing is behind view plane?
if (tz < MINZ) if (tz < MINZ)
return; return;
double tx = tr_x * ViewSin - tr_y * ViewCos; double tx = tr_x * r_viewpoint.Sin - tr_y * r_viewpoint.Cos;
// [RH] Flip for mirrors // [RH] Flip for mirrors
RenderPortal *renderportal = thread->Portal.get(); RenderPortal *renderportal = thread->Portal.get();
@ -129,7 +129,7 @@ namespace swrenderer
double xscale = viewport->CenterX / tz; double xscale = viewport->CenterX / tz;
// [RH] Reject sprites that are off the top or bottom of the screen // [RH] Reject sprites that are off the top or bottom of the screen
if (viewport->globaluclip * tz > ViewPos.Z - gzb || viewport->globaldclip * tz < ViewPos.Z - gzt) if (viewport->globaluclip * tz > r_viewpoint.Pos.Z - gzb || viewport->globaldclip * tz < r_viewpoint.Pos.Z - gzt)
{ {
return; return;
} }
@ -142,14 +142,14 @@ namespace swrenderer
tx -= ((renderflags & RF_XFLIP) ? (tex->GetWidth() - tex->LeftOffset - 1) : tex->LeftOffset) * thingxscalemul; tx -= ((renderflags & RF_XFLIP) ? (tex->GetWidth() - tex->LeftOffset - 1) : tex->LeftOffset) * thingxscalemul;
double dtx1 = tx * xscale; double dtx1 = tx * xscale;
int x1 = centerx + xs_RoundToInt(dtx1); int x1 = r_viewwindow.centerx + xs_RoundToInt(dtx1);
// off the right side? // off the right side?
if (x1 >= renderportal->WindowRight) if (x1 >= renderportal->WindowRight)
return; return;
tx += tex->GetWidth() * thingxscalemul; tx += tex->GetWidth() * thingxscalemul;
int x2 = centerx + xs_RoundToInt(tx * xscale); int x2 = r_viewwindow.centerx + xs_RoundToInt(tx * xscale);
// off the left side or too small? // off the left side or too small?
if ((x2 < renderportal->WindowLeft || x2 <= x1)) if ((x2 < renderportal->WindowLeft || x2 <= x1))
@ -168,7 +168,7 @@ namespace swrenderer
vis->yscale = float(viewport->InvZtoScale * yscale / tz); vis->yscale = float(viewport->InvZtoScale * yscale / tz);
vis->idepth = float(1 / tz); vis->idepth = float(1 / tz);
vis->floorclip = thing->Floorclip / yscale; vis->floorclip = thing->Floorclip / yscale;
vis->texturemid = tex->TopOffset - (ViewPos.Z - pos.Z + thing->Floorclip) / yscale; vis->texturemid = tex->TopOffset - (r_viewpoint.Pos.Z - pos.Z + thing->Floorclip) / yscale;
vis->x1 = x1 < renderportal->WindowLeft ? renderportal->WindowLeft : x1; vis->x1 = x1 < renderportal->WindowLeft ? renderportal->WindowLeft : x1;
vis->x2 = x2 > renderportal->WindowRight ? renderportal->WindowRight : x2; vis->x2 = x2 > renderportal->WindowRight ? renderportal->WindowRight : x2;
//vis->Angle = thing->Angles.Yaw; //vis->Angle = thing->Angles.Yaw;
@ -184,7 +184,7 @@ namespace swrenderer
vis->xiscale = iscale; vis->xiscale = iscale;
} }
vis->startfrac += (fixed_t)(vis->xiscale * (vis->x1 - centerx + 0.5 - dtx1)); vis->startfrac += (fixed_t)(vis->xiscale * (vis->x1 - r_viewwindow.centerx + 0.5 - dtx1));
// killough 3/27/98: save sector for special clipping later // killough 3/27/98: save sector for special clipping later
vis->heightsec = heightsec; vis->heightsec = heightsec;
@ -194,8 +194,8 @@ namespace swrenderer
vis->gpos = { (float)pos.X, (float)pos.Y, (float)pos.Z }; vis->gpos = { (float)pos.X, (float)pos.Y, (float)pos.Z };
vis->gzb = (float)gzb; // [RH] use gzb, not thing->z vis->gzb = (float)gzb; // [RH] use gzb, not thing->z
vis->gzt = (float)gzt; // killough 3/27/98 vis->gzt = (float)gzt; // killough 3/27/98
vis->deltax = float(pos.X - ViewPos.X); vis->deltax = float(pos.X - r_viewpoint.Pos.X);
vis->deltay = float(pos.Y - ViewPos.Y); vis->deltay = float(pos.Y - r_viewpoint.Pos.Y);
vis->renderflags = renderflags; vis->renderflags = renderflags;
if (thing->flags5 & MF5_BRIGHT) if (thing->flags5 & MF5_BRIGHT)
vis->renderflags |= RF_FULLBRIGHT; // kg3D vis->renderflags |= RF_FULLBRIGHT; // kg3D

View file

@ -95,7 +95,7 @@ namespace swrenderer
{ {
if (!(clip3d->fake3D & FAKE3D_CLIPTOP)) if (!(clip3d->fake3D & FAKE3D_CLIPTOP))
{ {
clip3d->sclipTop = spr->sector->ceilingplane.ZatPoint(ViewPos); clip3d->sclipTop = spr->sector->ceilingplane.ZatPoint(r_viewpoint.Pos);
} }
sector_t *sec = nullptr; sector_t *sec = nullptr;
FDynamicColormap *mybasecolormap = nullptr; FDynamicColormap *mybasecolormap = nullptr;
@ -169,7 +169,7 @@ namespace swrenderer
if (spr->FakeFlatStat != WaterFakeSide::AboveCeiling) if (spr->FakeFlatStat != WaterFakeSide::AboveCeiling)
{ {
double hz = spr->heightsec->floorplane.ZatPoint(spr->gpos); double hz = spr->heightsec->floorplane.ZatPoint(spr->gpos);
int h = xs_RoundToInt(viewport->CenterY - (hz - ViewPos.Z) * scale); int h = xs_RoundToInt(viewport->CenterY - (hz - r_viewpoint.Pos.Z) * scale);
if (spr->FakeFlatStat == WaterFakeSide::BelowFloor) if (spr->FakeFlatStat == WaterFakeSide::BelowFloor)
{ // seen below floor: clip top { // seen below floor: clip top
@ -191,7 +191,7 @@ namespace swrenderer
if (spr->FakeFlatStat != WaterFakeSide::BelowFloor && !(spr->heightsec->MoreFlags & SECF_FAKEFLOORONLY)) if (spr->FakeFlatStat != WaterFakeSide::BelowFloor && !(spr->heightsec->MoreFlags & SECF_FAKEFLOORONLY))
{ {
double hz = spr->heightsec->ceilingplane.ZatPoint(spr->gpos); double hz = spr->heightsec->ceilingplane.ZatPoint(spr->gpos);
int h = xs_RoundToInt(viewport->CenterY - (hz - ViewPos.Z) * scale); int h = xs_RoundToInt(viewport->CenterY - (hz - r_viewpoint.Pos.Z) * scale);
if (spr->FakeFlatStat == WaterFakeSide::AboveCeiling) if (spr->FakeFlatStat == WaterFakeSide::AboveCeiling)
{ // seen above ceiling: clip bottom { // seen above ceiling: clip bottom
@ -230,12 +230,12 @@ namespace swrenderer
if (spr->fakefloor) if (spr->fakefloor)
{ {
double floorz = spr->fakefloor->top.plane->Zat0(); double floorz = spr->fakefloor->top.plane->Zat0();
if (ViewPos.Z > floorz && floorz == clip3d->sclipBottom) if (r_viewpoint.Pos.Z > floorz && floorz == clip3d->sclipBottom)
{ {
hz = spr->fakefloor->bottom.plane->Zat0(); hz = spr->fakefloor->bottom.plane->Zat0();
} }
} }
int h = xs_RoundToInt(viewport->CenterY - (hz - ViewPos.Z) * scale); int h = xs_RoundToInt(viewport->CenterY - (hz - r_viewpoint.Pos.Z) * scale);
if (h < botclip) if (h < botclip)
{ {
botclip = MAX<short>(0, h); botclip = MAX<short>(0, h);
@ -251,12 +251,12 @@ namespace swrenderer
if (spr->fakeceiling != nullptr) if (spr->fakeceiling != nullptr)
{ {
double ceilingZ = spr->fakeceiling->bottom.plane->Zat0(); double ceilingZ = spr->fakeceiling->bottom.plane->Zat0();
if (ViewPos.Z < ceilingZ && ceilingZ == clip3d->sclipTop) if (r_viewpoint.Pos.Z < ceilingZ && ceilingZ == clip3d->sclipTop)
{ {
hz = spr->fakeceiling->top.plane->Zat0(); hz = spr->fakeceiling->top.plane->Zat0();
} }
} }
int h = xs_RoundToInt(viewport->CenterY - (hz - ViewPos.Z) * scale); int h = xs_RoundToInt(viewport->CenterY - (hz - r_viewpoint.Pos.Z) * scale);
if (h > topclip) if (h > topclip)
{ {
topclip = short(MIN(h, viewheight)); topclip = short(MIN(h, viewheight));

View file

@ -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) 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 // transform the origin point
double tr_x = pos.X - ViewPos.X; double tr_x = pos.X - r_viewpoint.Pos.X;
double tr_y = pos.Y - ViewPos.Y; double tr_y = pos.Y - r_viewpoint.Pos.Y;
double tz = tr_x * ViewTanCos + tr_y * ViewTanSin; double tz = tr_x * r_viewpoint.TanCos + tr_y * r_viewpoint.TanSin;
double tx = tr_x * ViewSin - tr_y * ViewCos; double tx = tr_x * r_viewpoint.Sin - tr_y * r_viewpoint.Cos;
// [RH] Flip for mirrors // [RH] Flip for mirrors
RenderPortal *renderportal = thread->Portal.get(); RenderPortal *renderportal = thread->Portal.get();
@ -121,8 +121,8 @@ namespace swrenderer
vis->Angle -= ang; vis->Angle -= ang;
} }
vis->pa.vpos = { (float)ViewPos.X, (float)ViewPos.Y, (float)ViewPos.Z }; vis->pa.vpos = { (float)r_viewpoint.Pos.X, (float)r_viewpoint.Pos.Y, (float)r_viewpoint.Pos.Z };
vis->pa.vang = FAngle((float)ViewAngle.Degrees); vis->pa.vang = FAngle((float)r_viewpoint.Angles.Yaw.Degrees);
// killough 3/27/98: save sector for special clipping later // killough 3/27/98: save sector for special clipping later
vis->heightsec = heightsec; vis->heightsec = heightsec;
@ -132,8 +132,8 @@ namespace swrenderer
vis->gpos = { (float)pos.X, (float)pos.Y, (float)pos.Z }; vis->gpos = { (float)pos.X, (float)pos.Y, (float)pos.Z };
vis->gzb = (float)gzb; // [RH] use gzb, not thing->z vis->gzb = (float)gzb; // [RH] use gzb, not thing->z
vis->gzt = (float)gzt; // killough 3/27/98 vis->gzt = (float)gzt; // killough 3/27/98
vis->deltax = float(pos.X - ViewPos.X); vis->deltax = float(pos.X - r_viewpoint.Pos.X);
vis->deltay = float(pos.Y - ViewPos.Y); vis->deltay = float(pos.Y - r_viewpoint.Pos.Y);
vis->renderflags = renderflags; vis->renderflags = renderflags;
if (thing->flags5 & MF5_BRIGHT) if (thing->flags5 & MF5_BRIGHT)
vis->renderflags |= RF_FULLBRIGHT; // kg3D vis->renderflags |= RF_FULLBRIGHT; // kg3D
@ -267,9 +267,9 @@ namespace swrenderer
auto viewport = RenderViewport::Instance(); auto viewport = RenderViewport::Instance();
const int nytooclose = centerxwide * 2100, nytoofar = 32768*32768 - 1048576; const int nytooclose = r_viewwindow.centerxwide * 2100, nytoofar = 32768*32768 - 1048576;
const int xdimenscale = FLOAT2FIXED(centerxwide * viewport->YaspectMul / 160); const int xdimenscale = FLOAT2FIXED(r_viewwindow.centerxwide * viewport->YaspectMul / 160);
const double centerxwide_f = centerxwide; const double centerxwide_f = r_viewwindow.centerxwide;
const double centerxwidebig_f = centerxwide_f * 65536*65536*8; const double centerxwidebig_f = centerxwide_f * 65536*65536*8;
// Convert to Build's coordinate system. // Convert to Build's coordinate system.
@ -315,8 +315,8 @@ namespace swrenderer
daxscale <<= (k+8); dayscale <<= (k+8); daxscale <<= (k+8); dayscale <<= (k+8);
dazscale = FixedDiv(dayscale, FLOAT2FIXED(viewport->BaseYaspectMul)); dazscale = FixedDiv(dayscale, FLOAT2FIXED(viewport->BaseYaspectMul));
daxscale = fixed_t(daxscale / viewport->YaspectMul); daxscale = fixed_t(daxscale / viewport->YaspectMul);
daxscale = Scale(daxscale, xdimenscale, centerxwide << 9); daxscale = Scale(daxscale, xdimenscale, r_viewwindow.centerxwide << 9);
dayscale = Scale(dayscale, FixedMul(xdimenscale, viewport->viewingrangerecip), centerxwide << 9); dayscale = Scale(dayscale, FixedMul(xdimenscale, viewport->viewingrangerecip), r_viewwindow.centerxwide << 9);
daxscalerecip = (1<<30) / daxscale; daxscalerecip = (1<<30) / daxscale;
dayscalerecip = (1<<30) / dayscale; dayscalerecip = (1<<30) / dayscale;
@ -432,9 +432,9 @@ namespace swrenderer
voxend = (kvxslab_t *)(slabxoffs + xyoffs[y+1]); voxend = (kvxslab_t *)(slabxoffs + xyoffs[y+1]);
if (voxptr >= voxend) continue; if (voxptr >= voxend) continue;
lx = xs_RoundToInt(nx * centerxwide_f / (ny + y1)) + centerx; lx = xs_RoundToInt(nx * centerxwide_f / (ny + y1)) + r_viewwindow.centerx;
if (lx < 0) lx = 0; if (lx < 0) lx = 0;
rx = xs_RoundToInt((nx + nxoff) * centerxwide_f / (ny + y2)) + centerx; rx = xs_RoundToInt((nx + nxoff) * centerxwide_f / (ny + y2)) + r_viewwindow.centerx;
if (rx > viewwidth) rx = viewwidth; if (rx > viewwidth) rx = viewwidth;
if (rx <= lx) continue; if (rx <= lx) continue;
@ -475,20 +475,20 @@ namespace swrenderer
if (k < 0) if (k < 0)
{ {
if ((voxptr->backfacecull & oand32) == 0) continue; if ((voxptr->backfacecull & oand32) == 0) continue;
z2 = MulScale32(l2, k) + centery; /* Below slab */ z2 = MulScale32(l2, k) + r_viewwindow.centery; /* Below slab */
} }
else else
{ {
if ((voxptr->backfacecull & oand) == 0) continue; /* Middle of slab */ if ((voxptr->backfacecull & oand) == 0) continue; /* Middle of slab */
z2 = MulScale32(l1, k) + centery; z2 = MulScale32(l1, k) + r_viewwindow.centery;
} }
z1 = MulScale32(l1, j) + centery; z1 = MulScale32(l1, j) + r_viewwindow.centery;
} }
else else
{ {
if ((voxptr->backfacecull & oand16) == 0) continue; if ((voxptr->backfacecull & oand16) == 0) continue;
z1 = MulScale32(l2, j) + centery; /* Above slab */ z1 = MulScale32(l2, j) + r_viewwindow.centery; /* Above slab */
z2 = MulScale32(l1, j + (zleng << 15)) + centery; z2 = MulScale32(l1, j + (zleng << 15)) + r_viewwindow.centery;
} }
if (z2 <= z1) continue; if (z2 <= z1) continue;

View file

@ -82,8 +82,8 @@ namespace swrenderer
x1 *= scale.X; x1 *= scale.X;
x2 *= scale.X; x2 *= scale.X;
left.X = pos.X - x1 * angcos - ViewPos.X; left.X = pos.X - x1 * angcos - r_viewpoint.Pos.X;
left.Y = pos.Y - x1 * angsin - ViewPos.Y; left.Y = pos.Y - x1 * angsin - r_viewpoint.Pos.Y;
right.X = left.X + x2 * angcos; right.X = left.X + x2 * angcos;
right.Y = right.Y + x2 * angsin; right.Y = right.Y + x2 * angsin;
@ -98,7 +98,7 @@ namespace swrenderer
// Sprite sorting should probably treat these as walls, not sprites, // Sprite sorting should probably treat these as walls, not sprites,
// but right now, I just want to get them drawing. // but right now, I just want to get them drawing.
tz = (pos.X - ViewPos.X) * ViewTanCos + (pos.Y - ViewPos.Y) * ViewTanSin; tz = (pos.X - r_viewpoint.Pos.X) * r_viewpoint.TanCos + (pos.Y - r_viewpoint.Pos.Y) * r_viewpoint.TanSin;
int scaled_to = pic->GetScaledTopOffset(); int scaled_to = pic->GetScaledTopOffset();
int scaled_bo = scaled_to - pic->GetScaledHeight(); 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->gpos = { (float)pos.X, (float)pos.Y, (float)pos.Z };
vis->gzb = (float)gzb; vis->gzb = (float)gzb;
vis->gzt = (float)gzt; vis->gzt = (float)gzt;
vis->deltax = float(pos.X - ViewPos.X); vis->deltax = float(pos.X - r_viewpoint.Pos.X);
vis->deltay = float(pos.Y - ViewPos.Y); vis->deltay = float(pos.Y - r_viewpoint.Pos.Y);
vis->renderflags = renderflags; vis->renderflags = renderflags;
if (thing->flags5 & MF5_BRIGHT) vis->renderflags |= RF_FULLBRIGHT; // kg3D if (thing->flags5 & MF5_BRIGHT) vis->renderflags |= RF_FULLBRIGHT; // kg3D
vis->RenderStyle = thing->RenderStyle; vis->RenderStyle = thing->RenderStyle;
@ -158,7 +158,7 @@ namespace swrenderer
walltexcoords.Project(spr->pic->GetWidth() << FRACBITS, x1, x2, WallT); walltexcoords.Project(spr->pic->GetWidth() << FRACBITS, x1, x2, WallT);
iyscale = 1 / spr->yscale; iyscale = 1 / spr->yscale;
double texturemid = (spr->gzt - ViewPos.Z) * iyscale; double texturemid = (spr->gzt - r_viewpoint.Pos.Z) * iyscale;
if (spr->renderflags & RF_XFLIP) if (spr->renderflags & RF_XFLIP)
{ {
int right = (spr->pic->GetWidth() << FRACBITS) - 1; int right = (spr->pic->GetWidth() << FRACBITS) - 1;

View file

@ -70,8 +70,8 @@ namespace swrenderer
fuzzviewheight = viewheight - 2; // Maximum row the fuzzer can draw to fuzzviewheight = viewheight - 2; // Maximum row the fuzzer can draw to
CenterX = centerx; CenterX = r_viewwindow.centerx;
CenterY = centery; CenterY = r_viewwindow.centery;
virtwidth = virtwidth2 = fullWidth; virtwidth = virtwidth2 = fullWidth;
virtheight = virtheight2 = fullHeight; virtheight = virtheight2 = fullHeight;
@ -85,13 +85,13 @@ namespace swrenderer
virtwidth2 = virtwidth2 * AspectMultiplier(trueratio) / 48; virtwidth2 = virtwidth2 * AspectMultiplier(trueratio) / 48;
} }
if (AspectTallerThanWide(WidescreenRatio)) if (AspectTallerThanWide(r_viewwindow.WidescreenRatio))
{ {
virtheight = virtheight * AspectMultiplier(WidescreenRatio) / 48; virtheight = virtheight * AspectMultiplier(r_viewwindow.WidescreenRatio) / 48;
} }
else else
{ {
virtwidth = virtwidth * AspectMultiplier(WidescreenRatio) / 48; virtwidth = virtwidth * AspectMultiplier(r_viewwindow.WidescreenRatio) / 48;
} }
BaseYaspectMul = 320.0 * virtheight2 / (r_Yaspect * virtwidth2); BaseYaspectMul = 320.0 * virtheight2 / (r_Yaspect * virtwidth2);
@ -117,9 +117,9 @@ namespace swrenderer
{ {
double dy; double dy;
if (camera != NULL) if (r_viewpoint.camera != NULL)
{ {
dy = FocalLengthY * (-ViewPitch).Tan(); dy = FocalLengthY * (-r_viewpoint.Angles.Pitch).Tan();
} }
else else
{ {
@ -127,7 +127,7 @@ namespace swrenderer
} }
CenterY = (viewheight / 2.0) + dy; CenterY = (viewheight / 2.0) + dy;
centery = xs_ToInt(CenterY); r_viewwindow.centery = xs_ToInt(CenterY);
globaluclip = -CenterY / InvZtoScale; globaluclip = -CenterY / InvZtoScale;
globaldclip = (viewheight - CenterY) / InvZtoScale; globaldclip = (viewheight - CenterY) / InvZtoScale;
} }
@ -153,23 +153,23 @@ namespace swrenderer
int i; int i;
// Calc focallength so FieldOfView angles cover viewwidth. // Calc focallength so FieldOfView angles cover viewwidth.
FocalLengthX = CenterX / FocalTangent; FocalLengthX = CenterX / r_viewwindow.FocalTangent;
FocalLengthY = FocalLengthX * YaspectMul; FocalLengthY = FocalLengthX * YaspectMul;
// This is 1/FocalTangent before the widescreen extension of FOV. // This is 1/FocalTangent before the widescreen extension of FOV.
viewingrangerecip = FLOAT2FIXED(1. / tan(FieldOfView.Radians() / 2)); viewingrangerecip = FLOAT2FIXED(1. / tan(r_viewpoint.FieldOfView.Radians() / 2));
// Now generate xtoviewangle for sky texture mapping. // Now generate xtoviewangle for sky texture mapping.
// [RH] Do not generate viewangletox, because texture mapping is no // [RH] Do not generate viewangletox, because texture mapping is no
// longer done with trig, so it's not needed. // longer done with trig, so it's not needed.
const double slopestep = FocalTangent / centerx; const double slopestep = r_viewwindow.FocalTangent / r_viewwindow.centerx;
double slope; double slope;
for (i = centerx, slope = 0; i <= viewwidth; i++, slope += slopestep) for (i = r_viewwindow.centerx, slope = 0; i <= viewwidth; i++, slope += slopestep)
{ {
xtoviewangle[i] = angle_t((2 * M_PI - atan(slope)) * (ANGLE_180 / M_PI)); xtoviewangle[i] = angle_t((2 * M_PI - atan(slope)) * (ANGLE_180 / M_PI));
} }
for (i = 0; i < centerx; i++) for (i = 0; i < r_viewwindow.centerx; i++)
{ {
xtoviewangle[i] = 0 - xtoviewangle[viewwidth - i - 1]; xtoviewangle[i] = 0 - xtoviewangle[viewwidth - i - 1];
} }
@ -177,23 +177,23 @@ namespace swrenderer
DVector2 RenderViewport::PointWorldToView(const DVector2 &worldPos) const DVector2 RenderViewport::PointWorldToView(const DVector2 &worldPos) const
{ {
double translatedX = worldPos.X - ViewPos.X; double translatedX = worldPos.X - r_viewpoint.Pos.X;
double translatedY = worldPos.Y - ViewPos.Y; double translatedY = worldPos.Y - r_viewpoint.Pos.Y;
return { return {
translatedX * ViewSin - translatedY * ViewCos, translatedX * r_viewpoint.Sin - translatedY * r_viewpoint.Cos,
translatedX * ViewTanCos + translatedY * ViewTanSin translatedX * r_viewpoint.TanCos + translatedY * r_viewpoint.TanSin
}; };
} }
DVector3 RenderViewport::PointWorldToView(const DVector3 &worldPos) const DVector3 RenderViewport::PointWorldToView(const DVector3 &worldPos) const
{ {
double translatedX = worldPos.X - ViewPos.X; double translatedX = worldPos.X - r_viewpoint.Pos.X;
double translatedY = worldPos.Y - ViewPos.Y; double translatedY = worldPos.Y - r_viewpoint.Pos.Y;
double translatedZ = worldPos.Z - ViewPos.Z; double translatedZ = worldPos.Z - r_viewpoint.Pos.Z;
return { return {
translatedX * ViewSin - translatedY * ViewCos, translatedX * r_viewpoint.Sin - translatedY * r_viewpoint.Cos,
translatedZ, translatedZ,
translatedX * ViewTanCos + translatedY * ViewTanSin translatedX * r_viewpoint.TanCos + translatedY * r_viewpoint.TanSin
}; };
} }

View file

@ -80,12 +80,12 @@ void FWarpTexture::Unload ()
bool FWarpTexture::CheckModified () bool FWarpTexture::CheckModified ()
{ {
return r_FrameTime != GenTime; return r_viewpoint.FrameTime != GenTime;
} }
const uint8_t *FWarpTexture::GetPixels () const uint8_t *FWarpTexture::GetPixels ()
{ {
uint32_t time = r_FrameTime; uint32_t time = r_viewpoint.FrameTime;
if (Pixels == NULL || time != GenTime) if (Pixels == NULL || time != GenTime)
{ {
@ -96,7 +96,7 @@ const uint8_t *FWarpTexture::GetPixels ()
const uint32_t *FWarpTexture::GetPixelsBgra() const uint32_t *FWarpTexture::GetPixelsBgra()
{ {
uint32_t time = r_FrameTime; uint32_t time = r_viewpoint.FrameTime;
if (Pixels == NULL || time != GenTime) if (Pixels == NULL || time != GenTime)
{ {
MakeTexture(time); MakeTexture(time);
@ -115,7 +115,7 @@ const uint32_t *FWarpTexture::GetPixelsBgra()
const uint8_t *FWarpTexture::GetColumn (unsigned int column, const Span **spans_out) const uint8_t *FWarpTexture::GetColumn (unsigned int column, const Span **spans_out)
{ {
uint32_t time = r_FrameTime; uint32_t time = r_viewpoint.FrameTime;
if (Pixels == NULL || time != GenTime) if (Pixels == NULL || time != GenTime)
{ {

View file

@ -1112,10 +1112,10 @@ void DoomSpecificInfo (char *buffer, size_t bufflen)
} }
else else
{ {
buffer += mysnprintf (buffer, buffend - buffer, "\r\n\r\nviewx = %f", ViewPos.X); buffer += mysnprintf (buffer, buffend - buffer, "\r\n\r\nviewx = %f", r_viewpoint.Pos.X);
buffer += mysnprintf (buffer, buffend - buffer, "\r\nviewy = %f", ViewPos.Y); buffer += mysnprintf (buffer, buffend - buffer, "\r\nviewy = %f", r_viewpoint.Pos.Y);
buffer += mysnprintf (buffer, buffend - buffer, "\r\nviewz = %f", ViewPos.Z); buffer += mysnprintf (buffer, buffend - buffer, "\r\nviewz = %f", r_viewpoint.Pos.Z);
buffer += mysnprintf (buffer, buffend - buffer, "\r\nviewangle = %f", ViewAngle); buffer += mysnprintf (buffer, buffend - buffer, "\r\nviewangle = %f", r_viewpoint.Angles.Yaw);
} }
} }
*buffer++ = '\r'; *buffer++ = '\r';