Fix mirror

This commit is contained in:
Magnus Norddahl 2016-12-07 22:26:18 +01:00
parent 480b22c50e
commit 066158be69
5 changed files with 47 additions and 16 deletions

View file

@ -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();
} }

View file

@ -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];
}; };

View file

@ -121,10 +121,17 @@ 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)
{ {

View file

@ -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)

View file

@ -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;