- moved ViewActor variable into FRenderViewpoint.

This commit is contained in:
Christoph Oelckers 2018-06-19 18:51:46 +02:00
parent 87dfa34f1f
commit eddb179e36
6 changed files with 20 additions and 25 deletions

View file

@ -93,7 +93,6 @@ public:
int mMirrorCount; int mMirrorCount;
int mPlaneMirrorCount; int mPlaneMirrorCount;
float mCurrentFoV; float mCurrentFoV;
AActor *mViewActor;
FShaderManager *mShaderManager; FShaderManager *mShaderManager;
FSamplerManager *mSamplerManager; FSamplerManager *mSamplerManager;
unsigned int mFBID; unsigned int mFBID;

View file

@ -267,14 +267,13 @@ bool GLPortal::Start(bool usestencil, bool doquery, FDrawInfo **pDi)
// save viewpoint // save viewpoint
savedviewpoint = r_viewpoint; savedviewpoint = r_viewpoint;
savedviewactor=GLRenderer->mViewActor;
savedvisibility = r_viewpoint.camera ? r_viewpoint.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;
GLRenderer->mCurrentPortal = this; GLRenderer->mCurrentPortal = this;
if (PrevPortal != NULL) PrevPortal->PushState(); if (PrevPortal != nullptr) PrevPortal->PushState();
return true; return true;
} }
@ -317,7 +316,7 @@ void GLPortal::End(bool usestencil)
bool needdepth = NeedDepthBuffer(); bool needdepth = NeedDepthBuffer();
Clocker c(PortalAll); Clocker c(PortalAll);
if (PrevPortal != NULL) PrevPortal->PopState(); if (PrevPortal != nullptr) PrevPortal->PopState();
GLRenderer->mCurrentPortal = PrevPortal; GLRenderer->mCurrentPortal = PrevPortal;
if (usestencil) if (usestencil)
@ -326,7 +325,6 @@ void GLPortal::End(bool usestencil)
// Restore the old view // Restore the old view
r_viewpoint = savedviewpoint; r_viewpoint = savedviewpoint;
GLRenderer->mViewActor=savedviewactor;
if (r_viewpoint.camera != nullptr) r_viewpoint.camera->renderflags = (r_viewpoint.camera->renderflags & ~RF_MAYBEINVISIBLE) | savedvisibility; if (r_viewpoint.camera != nullptr) r_viewpoint.camera->renderflags = (r_viewpoint.camera->renderflags & ~RF_MAYBEINVISIBLE) | savedvisibility;
drawer->SetupView(r_viewpoint.Pos.X, r_viewpoint.Pos.Y, r_viewpoint.Pos.Z, r_viewpoint.Angles.Yaw, !!(MirrorFlag & 1), !!(PlaneMirrorFlag & 1)); drawer->SetupView(r_viewpoint.Pos.X, r_viewpoint.Pos.Y, r_viewpoint.Pos.Z, r_viewpoint.Angles.Yaw, !!(MirrorFlag & 1), !!(PlaneMirrorFlag & 1));
@ -381,7 +379,6 @@ void GLPortal::End(bool usestencil)
} }
// Restore the old view // Restore the old view
r_viewpoint = savedviewpoint; r_viewpoint = savedviewpoint;
GLRenderer->mViewActor=savedviewactor;
if (r_viewpoint.camera != nullptr) r_viewpoint.camera->renderflags |= savedvisibility; if (r_viewpoint.camera != nullptr) r_viewpoint.camera->renderflags |= savedvisibility;
drawer->SetupView(r_viewpoint.Pos.X, r_viewpoint.Pos.Y, r_viewpoint.Pos.Z, r_viewpoint.Angles.Yaw, !!(MirrorFlag&1), !!(PlaneMirrorFlag&1)); drawer->SetupView(r_viewpoint.Pos.X, r_viewpoint.Pos.Y, r_viewpoint.Pos.Z, r_viewpoint.Angles.Yaw, !!(MirrorFlag&1), !!(PlaneMirrorFlag&1));
@ -458,7 +455,7 @@ void GLPortal::EndFrame()
// Only use occlusion query if there are more than 2 portals. // Only use occlusion query if there are more than 2 portals.
// Otherwise there's too much overhead. // Otherwise there's too much overhead.
// (And don't forget to consider the separating NULL pointers!) // (And don't forget to consider the separating nullptr pointers!)
bool usequery = portals.Size() > 2 + (unsigned)renderdepth; bool usequery = portals.Size() > 2 + (unsigned)renderdepth;
while (portals.Pop(p) && p) while (portals.Pop(p) && p)
@ -494,13 +491,13 @@ void GLPortal::EndFrame()
bool GLPortal::RenderFirstSkyPortal(int recursion) bool GLPortal::RenderFirstSkyPortal(int recursion)
{ {
GLPortal * p; GLPortal * p;
GLPortal * best = NULL; GLPortal * best = nullptr;
unsigned bestindex=0; unsigned bestindex=0;
// Find the one with the highest amount of lines. // Find the one with the highest amount of lines.
// Normally this is also the one that saves the largest amount // Normally this is also the one that saves the largest amount
// of time by drawing it before the scene itself. // of time by drawing it before the scene itself.
for(int i = portals.Size()-1; i >= 0 && portals[i] != NULL; --i) for(int i = portals.Size()-1; i >= 0 && portals[i] != nullptr; --i)
{ {
p=portals[i]; p=portals[i];
if (p->lines.Size() > 0 && p->IsSky()) if (p->lines.Size() > 0 && p->IsSky())
@ -538,7 +535,7 @@ GLPortal * GLPortal::FindPortal(const void * src)
int i=portals.Size()-1; int i=portals.Size()-1;
while (i>=0 && portals[i] && portals[i]->GetSource()!=src) i--; while (i>=0 && portals[i] && portals[i]->GetSource()!=src) i--;
return i>=0? portals[i]:NULL; return i>=0? portals[i]:nullptr;
} }
@ -587,7 +584,7 @@ void GLSkyboxPortal::DrawContents(FDrawInfo *di)
if (r_viewpoint.Pos.Z < floorh + 4) r_viewpoint.Pos.Z = floorh + 4; if (r_viewpoint.Pos.Z < floorh + 4) r_viewpoint.Pos.Z = floorh + 4;
if (r_viewpoint.Pos.Z > ceilh - 4) r_viewpoint.Pos.Z = ceilh - 4; if (r_viewpoint.Pos.Z > ceilh - 4) r_viewpoint.Pos.Z = ceilh - 4;
GLRenderer->mViewActor = origin; r_viewpoint.ViewActor = origin;
inskybox = true; inskybox = true;
drawer->SetupView(r_viewpoint.Pos.X, r_viewpoint.Pos.Y, r_viewpoint.Pos.Z, r_viewpoint.Angles.Yaw, !!(MirrorFlag & 1), !!(PlaneMirrorFlag & 1)); drawer->SetupView(r_viewpoint.Pos.X, r_viewpoint.Pos.Y, r_viewpoint.Pos.Z, r_viewpoint.Angles.Yaw, !!(MirrorFlag & 1), !!(PlaneMirrorFlag & 1));
@ -625,7 +622,7 @@ void GLSkyboxPortal::DrawContents(FDrawInfo *di)
GLSectorStackPortal *FSectorPortalGroup::GetRenderState() GLSectorStackPortal *FSectorPortalGroup::GetRenderState()
{ {
if (glportal == NULL) glportal = new GLSectorStackPortal(this); if (glportal == nullptr) glportal = new GLSectorStackPortal(this);
return glportal; return glportal;
} }
@ -633,9 +630,9 @@ GLSectorStackPortal *FSectorPortalGroup::GetRenderState()
GLSectorStackPortal::~GLSectorStackPortal() GLSectorStackPortal::~GLSectorStackPortal()
{ {
if (origin != NULL && origin->glportal == this) if (origin != nullptr && origin->glportal == this)
{ {
origin->glportal = NULL; origin->glportal = nullptr;
} }
} }
@ -692,7 +689,7 @@ void GLSectorStackPortal::DrawContents(FDrawInfo *di)
r_viewpoint.Pos += origin->mDisplacement; r_viewpoint.Pos += origin->mDisplacement;
r_viewpoint.ActorPos += origin->mDisplacement; r_viewpoint.ActorPos += origin->mDisplacement;
GLRenderer->mViewActor = NULL; r_viewpoint.ViewActor = nullptr;
// avoid recursions! // avoid recursions!
if (origin->plane != -1) screen->instack[origin->plane]++; if (origin->plane != -1) screen->instack[origin->plane]++;
@ -748,7 +745,7 @@ void GLPlaneMirrorPortal::DrawContents(FDrawInfo *di)
double planez = origin->ZatPoint(r_viewpoint.Pos); double planez = origin->ZatPoint(r_viewpoint.Pos);
r_viewpoint.Pos.Z = 2 * planez - r_viewpoint.Pos.Z; r_viewpoint.Pos.Z = 2 * planez - r_viewpoint.Pos.Z;
GLRenderer->mViewActor = NULL; r_viewpoint.ViewActor = nullptr;
PlaneMirrorMode = origin->fC() < 0 ? -1 : 1; PlaneMirrorMode = origin->fC() < 0 ? -1 : 1;
PlaneMirrorFlag++; PlaneMirrorFlag++;
@ -919,7 +916,7 @@ void GLMirrorPortal::DrawContents(FDrawInfo *di)
} }
r_viewpoint.Angles.Yaw = linedef->Delta().Angle() * 2. - StartAngle; r_viewpoint.Angles.Yaw = linedef->Delta().Angle() * 2. - StartAngle;
GLRenderer->mViewActor = NULL; r_viewpoint.ViewActor = nullptr;
MirrorFlag++; MirrorFlag++;
drawer->SetupView(r_viewpoint.Pos.X, r_viewpoint.Pos.Y, r_viewpoint.Pos.Z, r_viewpoint.Angles.Yaw, !!(MirrorFlag&1), !!(PlaneMirrorFlag&1)); drawer->SetupView(r_viewpoint.Pos.X, r_viewpoint.Pos.Y, r_viewpoint.Pos.Z, r_viewpoint.Angles.Yaw, !!(MirrorFlag&1), !!(PlaneMirrorFlag&1));
@ -998,7 +995,7 @@ void GLLineToLinePortal::DrawContents(FDrawInfo *di)
di->CurrentMapSections.Set(sub->mapsection); di->CurrentMapSections.Set(sub->mapsection);
} }
GLRenderer->mViewActor = nullptr; r_viewpoint.ViewActor = nullptr;
drawer->SetupView(r_viewpoint.Pos.X, r_viewpoint.Pos.Y, r_viewpoint.Pos.Z, r_viewpoint.Angles.Yaw, !!(MirrorFlag&1), !!(PlaneMirrorFlag&1)); drawer->SetupView(r_viewpoint.Pos.X, r_viewpoint.Pos.Y, r_viewpoint.Pos.Z, r_viewpoint.Angles.Yaw, !!(MirrorFlag&1), !!(PlaneMirrorFlag&1));
ClearClipper(di); ClearClipper(di);

View file

@ -236,7 +236,6 @@ void GLSceneDrawer::CreateScene(FDrawInfo *di)
validcount++; // used for processing sidedefs only once by the renderer. validcount++; // used for processing sidedefs only once by the renderer.
di->mAngles = GLRenderer->mAngles; di->mAngles = GLRenderer->mAngles;
di->mViewActor = GLRenderer->mViewActor;
di->mShadowMap = &GLRenderer->mShadowMap; di->mShadowMap = &GLRenderer->mShadowMap;
di->RenderBSPNode (level.HeadNode()); di->RenderBSPNode (level.HeadNode());
@ -633,14 +632,14 @@ sector_t * GLSceneDrawer::RenderViewpoint (AActor * camera, IntRect * bounds, fl
GLRenderer->mAngles.Pitch = (float)RAD2DEG(asin(angy / alen)); GLRenderer->mAngles.Pitch = (float)RAD2DEG(asin(angy / alen));
GLRenderer->mAngles.Roll.Degrees = r_viewpoint.Angles.Roll.Degrees; GLRenderer->mAngles.Roll.Degrees = r_viewpoint.Angles.Roll.Degrees;
if (camera->player && camera->player-players==consoleplayer && if (camera->player && camera->player - players == consoleplayer &&
((camera->player->cheats & CF_CHASECAM) || (r_deathcamera && camera->health <= 0)) && camera==camera->player->mo) ((camera->player->cheats & CF_CHASECAM) || (r_deathcamera && camera->health <= 0)) && camera == camera->player->mo)
{ {
GLRenderer->mViewActor=NULL; r_viewpoint.ViewActor = nullptr;
} }
else else
{ {
GLRenderer->mViewActor=camera; r_viewpoint.ViewActor = camera;
} }
// '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.

View file

@ -84,7 +84,6 @@ struct HWDrawInfo
std::atomic<int> spriteindex; std::atomic<int> spriteindex;
IPortal *mClipPortal; IPortal *mClipPortal;
FRotator mAngles; FRotator mAngles;
AActor *mViewActor;
IShadowMap *mShadowMap; IShadowMap *mShadowMap;
Clipper *mClipper; Clipper *mClipper;

View file

@ -461,7 +461,7 @@ void GLSprite::Process(HWDrawInfo *di, AActor* thing, sector_t * sector, area_t
// don't draw first frame of a player missile // don't draw first frame of a player missile
if (thing->flags&MF_MISSILE) if (thing->flags&MF_MISSILE)
{ {
if (!(thing->flags7 & MF7_FLYCHEAT) && thing->target == di->mViewActor && di->mViewActor != nullptr) if (!(thing->flags7 & MF7_FLYCHEAT) && thing->target == vp.ViewActor && vp.ViewActor != nullptr)
{ {
double speed = thing->Vel.Length(); double speed = thing->Vel.Length();
if (speed >= thing->target->radius / 2) if (speed >= thing->target->radius / 2)

View file

@ -22,6 +22,7 @@ struct FRenderViewpoint
DVector3 ActorPos; // Camera actor's position DVector3 ActorPos; // Camera actor's position
DRotator Angles; // Camera angles DRotator Angles; // Camera angles
DVector2 ViewVector; // HWR only: direction the camera is facing. DVector2 ViewVector; // HWR only: direction the camera is facing.
AActor *ViewActor; // either the same as camera or nullptr
DVector3 Path[2]; // View path for portal calculations DVector3 Path[2]; // View path for portal calculations
double Cos; // cos(Angles.Yaw) double Cos; // cos(Angles.Yaw)