mirror of
https://github.com/ZDoom/gzdoom-gles.git
synced 2025-02-07 07:21:01 +00:00
- save r_viewpoint as a whole when processing portals.
This commit is contained in:
parent
753cd0aede
commit
87dfa34f1f
8 changed files with 16 additions and 34 deletions
|
@ -90,7 +90,6 @@ FGLRenderer::FGLRenderer(OpenGLFrameBuffer *fb)
|
||||||
mMirrorCount = 0;
|
mMirrorCount = 0;
|
||||||
mPlaneMirrorCount = 0;
|
mPlaneMirrorCount = 0;
|
||||||
mAngles = FRotator(0.f, 0.f, 0.f);
|
mAngles = FRotator(0.f, 0.f, 0.f);
|
||||||
mViewVector = FVector2(0,0);
|
|
||||||
mVBO = nullptr;
|
mVBO = nullptr;
|
||||||
mSkyVBO = nullptr;
|
mSkyVBO = nullptr;
|
||||||
mShaderManager = nullptr;
|
mShaderManager = nullptr;
|
||||||
|
|
|
@ -129,7 +129,6 @@ public:
|
||||||
FShadowMap mShadowMap;
|
FShadowMap mShadowMap;
|
||||||
|
|
||||||
FRotator mAngles;
|
FRotator mAngles;
|
||||||
FVector2 mViewVector;
|
|
||||||
|
|
||||||
FFlatVertexBuffer *mVBO;
|
FFlatVertexBuffer *mVBO;
|
||||||
FSkyVertexBuffer *mSkyVBO;
|
FSkyVertexBuffer *mSkyVBO;
|
||||||
|
|
|
@ -266,13 +266,8 @@ bool GLPortal::Start(bool usestencil, bool doquery, FDrawInfo **pDi)
|
||||||
}
|
}
|
||||||
|
|
||||||
// save viewpoint
|
// save viewpoint
|
||||||
savedViewPos = r_viewpoint.Pos;
|
savedviewpoint = r_viewpoint;
|
||||||
savedViewActorPos = r_viewpoint.ActorPos;
|
|
||||||
savedshowviewer = r_viewpoint.showviewer;
|
|
||||||
savedAngles = r_viewpoint.Angles;
|
|
||||||
savedviewactor=GLRenderer->mViewActor;
|
savedviewactor=GLRenderer->mViewActor;
|
||||||
savedviewpath[0] = r_viewpoint.Path[0];
|
|
||||||
savedviewpath[1] = r_viewpoint.Path[1];
|
|
||||||
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);
|
||||||
|
|
||||||
|
|
||||||
|
@ -286,7 +281,8 @@ bool GLPortal::Start(bool usestencil, bool doquery, FDrawInfo **pDi)
|
||||||
|
|
||||||
inline void GLPortal::ClearClipper(FDrawInfo *di)
|
inline void GLPortal::ClearClipper(FDrawInfo *di)
|
||||||
{
|
{
|
||||||
DAngle angleOffset = deltaangle(savedAngles.Yaw, r_viewpoint.Angles.Yaw);
|
FRenderViewpoint &oldvp = savedviewpoint;
|
||||||
|
DAngle angleOffset = deltaangle(oldvp.Angles.Yaw, r_viewpoint.Angles.Yaw);
|
||||||
|
|
||||||
di->mClipper->Clear();
|
di->mClipper->Clear();
|
||||||
|
|
||||||
|
@ -294,8 +290,8 @@ inline void GLPortal::ClearClipper(FDrawInfo *di)
|
||||||
di->mClipper->SafeAddClipRange(0,0xffffffff);
|
di->mClipper->SafeAddClipRange(0,0xffffffff);
|
||||||
for (unsigned int i = 0; i < lines.Size(); i++)
|
for (unsigned int i = 0; i < lines.Size(); i++)
|
||||||
{
|
{
|
||||||
DAngle startAngle = (DVector2(lines[i].glseg.x2, lines[i].glseg.y2) - savedViewPos).Angle() + angleOffset;
|
DAngle startAngle = (DVector2(lines[i].glseg.x2, lines[i].glseg.y2) - oldvp.Pos).Angle() + angleOffset;
|
||||||
DAngle endAngle = (DVector2(lines[i].glseg.x1, lines[i].glseg.y1) - savedViewPos).Angle() + angleOffset;
|
DAngle endAngle = (DVector2(lines[i].glseg.x1, lines[i].glseg.y1) - oldvp.Pos).Angle() + angleOffset;
|
||||||
|
|
||||||
if (deltaangle(endAngle, startAngle) < 0)
|
if (deltaangle(endAngle, startAngle) < 0)
|
||||||
{
|
{
|
||||||
|
@ -329,12 +325,7 @@ void GLPortal::End(bool usestencil)
|
||||||
if (needdepth) FDrawInfo::EndDrawInfo();
|
if (needdepth) FDrawInfo::EndDrawInfo();
|
||||||
|
|
||||||
// Restore the old view
|
// Restore the old view
|
||||||
r_viewpoint.Path[0] = savedviewpath[0];
|
r_viewpoint = savedviewpoint;
|
||||||
r_viewpoint.Path[1] = savedviewpath[1];
|
|
||||||
r_viewpoint.Pos = savedViewPos;
|
|
||||||
r_viewpoint.showviewer = savedshowviewer;
|
|
||||||
r_viewpoint.ActorPos = savedViewActorPos;
|
|
||||||
r_viewpoint.Angles = savedAngles;
|
|
||||||
GLRenderer->mViewActor=savedviewactor;
|
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));
|
||||||
|
@ -389,10 +380,7 @@ void GLPortal::End(bool usestencil)
|
||||||
glDepthMask(true);
|
glDepthMask(true);
|
||||||
}
|
}
|
||||||
// Restore the old view
|
// Restore the old view
|
||||||
r_viewpoint.showviewer = savedshowviewer;
|
r_viewpoint = savedviewpoint;
|
||||||
r_viewpoint.ActorPos = savedViewActorPos;
|
|
||||||
r_viewpoint.Pos = savedViewPos;
|
|
||||||
r_viewpoint.Angles = savedAngles;
|
|
||||||
GLRenderer->mViewActor=savedviewactor;
|
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));
|
||||||
|
|
|
@ -37,6 +37,7 @@
|
||||||
#define __GL_PORTAL_H
|
#define __GL_PORTAL_H
|
||||||
|
|
||||||
#include "tarray.h"
|
#include "tarray.h"
|
||||||
|
#include "r_utility.h"
|
||||||
#include "actor.h"
|
#include "actor.h"
|
||||||
#include "gl/renderer/gl_renderer.h"
|
#include "gl/renderer/gl_renderer.h"
|
||||||
#include "gl/scene/gl_drawinfo.h"
|
#include "gl/scene/gl_drawinfo.h"
|
||||||
|
@ -69,13 +70,9 @@ public:
|
||||||
private:
|
private:
|
||||||
void DrawPortalStencil();
|
void DrawPortalStencil();
|
||||||
|
|
||||||
DVector3 savedviewpath[2];
|
|
||||||
DVector3 savedViewPos;
|
|
||||||
DVector3 savedViewActorPos;
|
|
||||||
DRotator savedAngles;
|
|
||||||
bool savedshowviewer;
|
|
||||||
AActor * savedviewactor;
|
AActor * savedviewactor;
|
||||||
ActorRenderFlags savedvisibility;
|
ActorRenderFlags savedvisibility;
|
||||||
|
FRenderViewpoint savedviewpoint;
|
||||||
GLPortal *PrevPortal;
|
GLPortal *PrevPortal;
|
||||||
TArray<unsigned int> mPrimIndices;
|
TArray<unsigned int> mPrimIndices;
|
||||||
|
|
||||||
|
|
|
@ -151,8 +151,8 @@ void GLSceneDrawer::SetViewAngle(DAngle viewangle)
|
||||||
FRenderViewpoint &vp = r_viewpoint;
|
FRenderViewpoint &vp = r_viewpoint;
|
||||||
GLRenderer->mAngles.Yaw = float(270.0-viewangle.Degrees);
|
GLRenderer->mAngles.Yaw = float(270.0-viewangle.Degrees);
|
||||||
DVector2 v = vp.Angles.Yaw.ToVector();
|
DVector2 v = vp.Angles.Yaw.ToVector();
|
||||||
GLRenderer->mViewVector.X = v.X;
|
vp.ViewVector.X = v.X;
|
||||||
GLRenderer->mViewVector.Y = v.Y;
|
vp.ViewVector.Y = v.Y;
|
||||||
|
|
||||||
vp.SetViewAngle(r_viewwindow);
|
vp.SetViewAngle(r_viewwindow);
|
||||||
}
|
}
|
||||||
|
@ -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->mViewVector = GLRenderer->mViewVector;
|
|
||||||
di->mViewActor = GLRenderer->mViewActor;
|
di->mViewActor = GLRenderer->mViewActor;
|
||||||
di->mShadowMap = &GLRenderer->mShadowMap;
|
di->mShadowMap = &GLRenderer->mShadowMap;
|
||||||
|
|
||||||
|
|
|
@ -84,7 +84,6 @@ struct HWDrawInfo
|
||||||
std::atomic<int> spriteindex;
|
std::atomic<int> spriteindex;
|
||||||
IPortal *mClipPortal;
|
IPortal *mClipPortal;
|
||||||
FRotator mAngles;
|
FRotator mAngles;
|
||||||
FVector2 mViewVector;
|
|
||||||
AActor *mViewActor;
|
AActor *mViewActor;
|
||||||
IShadowMap *mShadowMap;
|
IShadowMap *mShadowMap;
|
||||||
Clipper *mClipper;
|
Clipper *mClipper;
|
||||||
|
|
|
@ -597,8 +597,8 @@ void GLSprite::Process(HWDrawInfo *di, AActor* thing, sector_t * sector, area_t
|
||||||
switch (spritetype)
|
switch (spritetype)
|
||||||
{
|
{
|
||||||
case RF_FACESPRITE:
|
case RF_FACESPRITE:
|
||||||
viewvecX = di->mViewVector.X;
|
viewvecX = vp.ViewVector.X;
|
||||||
viewvecY = di->mViewVector.Y;
|
viewvecY = vp.ViewVector.Y;
|
||||||
|
|
||||||
x1 = x - viewvecY*leftfac;
|
x1 = x - viewvecY*leftfac;
|
||||||
x2 = x - viewvecY*rightfac;
|
x2 = x - viewvecY*rightfac;
|
||||||
|
@ -946,8 +946,8 @@ void GLSprite::ProcessParticle (HWDrawInfo *di, particle_t *particle, sector_t *
|
||||||
else factor = 1 / 7.f;
|
else factor = 1 / 7.f;
|
||||||
float scalefac=particle->size * factor;
|
float scalefac=particle->size * factor;
|
||||||
|
|
||||||
float viewvecX = di->mViewVector.X;
|
float viewvecX = vp.ViewVector.X;
|
||||||
float viewvecY = di->mViewVector.Y;
|
float viewvecY = vp.ViewVector.Y;
|
||||||
|
|
||||||
x1=x+viewvecY*scalefac;
|
x1=x+viewvecY*scalefac;
|
||||||
x2=x-viewvecY*scalefac;
|
x2=x-viewvecY*scalefac;
|
||||||
|
|
|
@ -21,6 +21,7 @@ struct FRenderViewpoint
|
||||||
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
|
||||||
|
DVector2 ViewVector; // HWR only: direction the camera is facing.
|
||||||
|
|
||||||
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)
|
||||||
|
|
Loading…
Reference in a new issue