mirror of
https://github.com/ZDoom/gzdoom.git
synced 2024-11-19 02:42:05 +00:00
Fix mirror
This commit is contained in:
parent
480b22c50e
commit
066158be69
5 changed files with 47 additions and 16 deletions
|
@ -162,11 +162,14 @@ void PolyDrawLinePortal::Render(int portalDepth)
|
||||||
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)-ViewPos.X, (float)-ViewPos.Y, (float)-ViewPos.Z);
|
||||||
|
if (Mirror)
|
||||||
|
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;
|
||||||
|
|
||||||
// Calculate plane clipping
|
// Calculate plane clipping
|
||||||
DVector2 planePos = Portal->mDestination->v1->fPos();
|
line_t *clipLine = Portal ? Portal->mDestination : Mirror;
|
||||||
DVector2 planeNormal = (Portal->mDestination->v2->fPos() - Portal->mDestination->v1->fPos()).Rotated90CW();
|
DVector2 planePos = clipLine->v1->fPos();
|
||||||
|
DVector2 planeNormal = (clipLine->v2->fPos() - clipLine->v1->fPos()).Rotated90CW();
|
||||||
planeNormal.MakeUnit();
|
planeNormal.MakeUnit();
|
||||||
double planeD = -(planeNormal | (planePos + planeNormal * 0.001));
|
double planeD = -(planeNormal | (planePos + planeNormal * 0.001));
|
||||||
Vec4f portalPlane((float)planeNormal.X, (float)planeNormal.Y, 0.0f, (float)planeD);
|
Vec4f portalPlane((float)planeNormal.X, (float)planeNormal.Y, 0.0f, (float)planeD);
|
||||||
|
@ -191,7 +194,7 @@ void PolyDrawLinePortal::SaveGlobals()
|
||||||
savedangle = ViewAngle;
|
savedangle = ViewAngle;
|
||||||
savedcamera = camera;
|
savedcamera = camera;
|
||||||
savedsector = viewsector;
|
savedsector = viewsector;
|
||||||
savedvisibility = camera ? camera->renderflags & RF_INVISIBLE : ActorRenderFlags::FromInt(0);
|
savedinvisibility = camera ? (camera->renderflags & RF_INVISIBLE) == RF_INVISIBLE : false;
|
||||||
savedViewPath[0] = ViewPath[0];
|
savedViewPath[0] = ViewPath[0];
|
||||||
savedViewPath[1] = ViewPath[1];
|
savedViewPath[1] = ViewPath[1];
|
||||||
|
|
||||||
|
@ -229,6 +232,9 @@ void PolyDrawLinePortal::SaveGlobals()
|
||||||
ViewPos.Y = (y1 + r * dy) * 2 - y;
|
ViewPos.Y = (y1 + r * dy) * 2 - y;
|
||||||
}
|
}
|
||||||
ViewAngle = Mirror->Delta().Angle() * 2 - startang;
|
ViewAngle = Mirror->Delta().Angle() * 2 - startang;
|
||||||
|
|
||||||
|
if (camera)
|
||||||
|
camera->renderflags &= ~RF_INVISIBLE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -255,22 +261,25 @@ void PolyDrawLinePortal::SaveGlobals()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*if (Portal->mirror)
|
|
||||||
{
|
|
||||||
if (MirrorFlags & RF_XFLIP) MirrorFlags &= ~RF_XFLIP;
|
|
||||||
else MirrorFlags |= RF_XFLIP;
|
|
||||||
}*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
camera = nullptr;
|
//camera = nullptr;
|
||||||
//viewsector = R_PointInSubsector(ViewPos)->sector;
|
//viewsector = R_PointInSubsector(ViewPos)->sector;
|
||||||
R_SetViewAngle();
|
R_SetViewAngle();
|
||||||
|
|
||||||
|
if (Mirror)
|
||||||
|
PolyTriangleDrawer::toggle_mirror();
|
||||||
}
|
}
|
||||||
|
|
||||||
void PolyDrawLinePortal::RestoreGlobals()
|
void PolyDrawLinePortal::RestoreGlobals()
|
||||||
{
|
{
|
||||||
if (!savedvisibility && camera) camera->renderflags &= ~RF_INVISIBLE;
|
if (camera)
|
||||||
|
{
|
||||||
|
if (savedinvisibility)
|
||||||
|
camera->renderflags |= RF_INVISIBLE;
|
||||||
|
else
|
||||||
|
camera->renderflags &= ~RF_INVISIBLE;
|
||||||
|
}
|
||||||
camera = savedcamera;
|
camera = savedcamera;
|
||||||
viewsector = savedsector;
|
viewsector = savedsector;
|
||||||
ViewPos = savedpos;
|
ViewPos = savedpos;
|
||||||
|
@ -279,4 +288,7 @@ void PolyDrawLinePortal::RestoreGlobals()
|
||||||
ViewPath[0] = savedViewPath[0];
|
ViewPath[0] = savedViewPath[0];
|
||||||
ViewPath[1] = savedViewPath[1];
|
ViewPath[1] = savedViewPath[1];
|
||||||
R_SetViewAngle();
|
R_SetViewAngle();
|
||||||
|
|
||||||
|
if (Mirror)
|
||||||
|
PolyTriangleDrawer::toggle_mirror();
|
||||||
}
|
}
|
||||||
|
|
|
@ -85,6 +85,6 @@ private:
|
||||||
DAngle savedangle;
|
DAngle savedangle;
|
||||||
AActor *savedcamera;
|
AActor *savedcamera;
|
||||||
sector_t *savedsector;
|
sector_t *savedsector;
|
||||||
ActorRenderFlags savedvisibility;
|
bool savedinvisibility;
|
||||||
DVector3 savedViewPath[2];
|
DVector3 savedViewPath[2];
|
||||||
};
|
};
|
||||||
|
|
|
@ -121,9 +121,16 @@ void RenderPolyScene::RenderSubsector(subsector_t *sub)
|
||||||
void RenderPolyScene::RenderSprite(AActor *thing, double sortDistance, const DVector2 &left, const DVector2 &right)
|
void RenderPolyScene::RenderSprite(AActor *thing, double sortDistance, const DVector2 &left, const DVector2 &right)
|
||||||
{
|
{
|
||||||
if (numnodes == 0)
|
if (numnodes == 0)
|
||||||
RenderSprite(thing, sortDistance, left, right, 0.0, 1.0, subsectors);
|
{
|
||||||
|
subsector_t *sub = subsectors;
|
||||||
|
auto it = SubsectorDepths.find(sub);
|
||||||
|
if (it != SubsectorDepths.end())
|
||||||
|
TranslucentObjects.push_back({ thing, sub, it->second, sortDistance, 0.0f, 1.0f });
|
||||||
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
RenderSprite(thing, sortDistance, left, right, 0.0, 1.0, nodes + numnodes - 1); // The head node is the last node output.
|
RenderSprite(thing, sortDistance, left, right, 0.0, 1.0, nodes + numnodes - 1); // The head node is the last node output.
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void RenderPolyScene::RenderSprite(AActor *thing, double sortDistance, DVector2 left, DVector2 right, double t1, double t2, void *node)
|
void RenderPolyScene::RenderSprite(AActor *thing, double sortDistance, DVector2 left, DVector2 right, double t1, double t2, void *node)
|
||||||
|
|
|
@ -45,6 +45,7 @@ int PolyTriangleDrawer::dest_width;
|
||||||
int PolyTriangleDrawer::dest_height;
|
int PolyTriangleDrawer::dest_height;
|
||||||
uint8_t *PolyTriangleDrawer::dest;
|
uint8_t *PolyTriangleDrawer::dest;
|
||||||
bool PolyTriangleDrawer::dest_bgra;
|
bool PolyTriangleDrawer::dest_bgra;
|
||||||
|
bool PolyTriangleDrawer::mirror;
|
||||||
|
|
||||||
void PolyTriangleDrawer::set_viewport(int x, int y, int width, int height, DCanvas *canvas)
|
void PolyTriangleDrawer::set_viewport(int x, int y, int width, int height, DCanvas *canvas)
|
||||||
{
|
{
|
||||||
|
@ -66,11 +67,18 @@ void PolyTriangleDrawer::set_viewport(int x, int y, int width, int height, DCanv
|
||||||
dest += (offsetx + offsety * dest_pitch) * pixelsize;
|
dest += (offsetx + offsety * dest_pitch) * pixelsize;
|
||||||
dest_width = clamp(viewport_x + viewport_width, 0, dest_width - offsetx);
|
dest_width = clamp(viewport_x + viewport_width, 0, dest_width - offsetx);
|
||||||
dest_height = clamp(viewport_y + viewport_height, 0, dest_height - offsety);
|
dest_height = clamp(viewport_y + viewport_height, 0, dest_height - offsety);
|
||||||
|
|
||||||
|
mirror = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void PolyTriangleDrawer::toggle_mirror()
|
||||||
|
{
|
||||||
|
mirror = !mirror;
|
||||||
}
|
}
|
||||||
|
|
||||||
void PolyTriangleDrawer::draw(const PolyDrawArgs &args, TriDrawVariant variant, TriBlendMode blendmode)
|
void PolyTriangleDrawer::draw(const PolyDrawArgs &args, TriDrawVariant variant, TriBlendMode blendmode)
|
||||||
{
|
{
|
||||||
DrawerCommandQueue::QueueCommand<DrawPolyTrianglesCommand>(args, variant, blendmode);
|
DrawerCommandQueue::QueueCommand<DrawPolyTrianglesCommand>(args, variant, blendmode, mirror);
|
||||||
}
|
}
|
||||||
|
|
||||||
void PolyTriangleDrawer::draw_arrays(const PolyDrawArgs &drawargs, TriDrawVariant variant, TriBlendMode blendmode, WorkerThreadData *thread)
|
void PolyTriangleDrawer::draw_arrays(const PolyDrawArgs &drawargs, TriDrawVariant variant, TriBlendMode blendmode, WorkerThreadData *thread)
|
||||||
|
@ -328,9 +336,11 @@ void PolyTriangleDrawer::clipedge(const ShadedTriVertex *verts, TriVertex *clipp
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
DrawPolyTrianglesCommand::DrawPolyTrianglesCommand(const PolyDrawArgs &args, TriDrawVariant variant, TriBlendMode blendmode)
|
DrawPolyTrianglesCommand::DrawPolyTrianglesCommand(const PolyDrawArgs &args, TriDrawVariant variant, TriBlendMode blendmode, bool mirror)
|
||||||
: args(args), variant(variant), blendmode(blendmode)
|
: args(args), variant(variant), blendmode(blendmode)
|
||||||
{
|
{
|
||||||
|
if (mirror)
|
||||||
|
this->args.ccw = !this->args.ccw;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DrawPolyTrianglesCommand::Execute(DrawerThread *thread)
|
void DrawPolyTrianglesCommand::Execute(DrawerThread *thread)
|
||||||
|
|
|
@ -158,6 +158,7 @@ class PolyTriangleDrawer
|
||||||
public:
|
public:
|
||||||
static void set_viewport(int x, int y, int width, int height, DCanvas *canvas);
|
static void set_viewport(int x, int y, int width, int height, DCanvas *canvas);
|
||||||
static void draw(const PolyDrawArgs &args, TriDrawVariant variant, TriBlendMode blendmode);
|
static void draw(const PolyDrawArgs &args, TriDrawVariant variant, TriBlendMode blendmode);
|
||||||
|
static void toggle_mirror();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static ShadedTriVertex shade_vertex(const TriMatrix &objectToClip, const float *clipPlane, const TriVertex &v);
|
static ShadedTriVertex shade_vertex(const TriMatrix &objectToClip, const float *clipPlane, const TriVertex &v);
|
||||||
|
@ -169,6 +170,7 @@ private:
|
||||||
static int viewport_x, viewport_y, viewport_width, viewport_height, dest_pitch, dest_width, dest_height;
|
static int viewport_x, viewport_y, viewport_width, viewport_height, dest_pitch, dest_width, dest_height;
|
||||||
static bool dest_bgra;
|
static bool dest_bgra;
|
||||||
static uint8_t *dest;
|
static uint8_t *dest;
|
||||||
|
static bool mirror;
|
||||||
|
|
||||||
enum { max_additional_vertices = 16 };
|
enum { max_additional_vertices = 16 };
|
||||||
|
|
||||||
|
@ -245,7 +247,7 @@ private:
|
||||||
class DrawPolyTrianglesCommand : public DrawerCommand
|
class DrawPolyTrianglesCommand : public DrawerCommand
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
DrawPolyTrianglesCommand(const PolyDrawArgs &args, TriDrawVariant variant, TriBlendMode blendmode);
|
DrawPolyTrianglesCommand(const PolyDrawArgs &args, TriDrawVariant variant, TriBlendMode blendmode, bool mirror);
|
||||||
|
|
||||||
void Execute(DrawerThread *thread) override;
|
void Execute(DrawerThread *thread) override;
|
||||||
FString DebugInfo() override;
|
FString DebugInfo() override;
|
||||||
|
|
Loading…
Reference in a new issue