diff --git a/src/gl/scene/gl_flats.cpp b/src/gl/scene/gl_flats.cpp index 2fe139c62..63c4f9a01 100644 --- a/src/gl/scene/gl_flats.cpp +++ b/src/gl/scene/gl_flats.cpp @@ -210,47 +210,44 @@ void FDrawInfo::DrawSubsectors(GLFlat *flat, int pass, bool processlights, bool auto vcount = flat->sector->ibocount; gl_RenderState.Apply(); - auto iboindex = flat->iboindex; if (gl.legacyMode) { processlights = false; - iboindex = -1; + goto legacy; } - if (iboindex >= 0) + if (vcount > 0 && !gl_RenderState.GetClipLineShouldBeActive()) { - if (vcount > 0 && !gl_RenderState.GetClipLineShouldBeActive()) + if (processlights) SetupSectorLights(flat, GLPASS_ALL, &dli); + drawcalls.Clock(); + glDrawElements(GL_TRIANGLES, vcount, GL_UNSIGNED_INT, GLRenderer->mVBO->GetIndexPointer() + flat->iboindex); + drawcalls.Unclock(); + flatvertices += vcount; + flatprimitives++; + } + else if (flat->iboindex >= 0) + { + int index = flat->iboindex; + for (int i=0; isector->subsectorcount; i++) { - if (processlights) SetupSectorLights(flat, GLPASS_ALL, &dli); - drawcalls.Clock(); - glDrawElements(GL_TRIANGLES, vcount, GL_UNSIGNED_INT, GLRenderer->mVBO->GetIndexPointer() + iboindex); - drawcalls.Unclock(); - flatvertices += vcount; - flatprimitives++; - } - else - { - int index = iboindex; - for (int i = 0; i < flat->sector->subsectorcount; i++) + subsector_t * sub = flat->sector->subsectors[i]; + if (sub->numlines <= 2) continue; + + if (ss_renderflags[sub->Index()]& flat->renderflags || istrans) { - subsector_t * sub = flat->sector->subsectors[i]; - if (sub->numlines <= 2) continue; - - if (ss_renderflags[sub->Index()] & flat->renderflags || istrans) - { - if (processlights) SetupSubsectorLights(flat, GLPASS_ALL, sub, &dli); - drawcalls.Clock(); - glDrawElements(GL_TRIANGLES, (sub->numlines - 2) * 3, GL_UNSIGNED_INT, GLRenderer->mVBO->GetIndexPointer() + index); - drawcalls.Unclock(); - flatvertices += sub->numlines; - flatprimitives++; - } - index += (sub->numlines - 2) * 3; + if (processlights) SetupSubsectorLights(flat, GLPASS_ALL, sub, &dli); + drawcalls.Clock(); + glDrawElements(GL_TRIANGLES, (sub->numlines - 2) * 3, GL_UNSIGNED_INT, GLRenderer->mVBO->GetIndexPointer() + index); + drawcalls.Unclock(); + flatvertices += sub->numlines; + flatprimitives++; } + index += (sub->numlines - 2) * 3; } } else { + legacy: // Draw the subsectors belonging to this sector for (int i=0; isector->subsectorcount; i++) { diff --git a/src/polyrenderer/drawers/poly_draw_args.cpp b/src/polyrenderer/drawers/poly_draw_args.cpp index 86b14bfd8..3a921ae0a 100644 --- a/src/polyrenderer/drawers/poly_draw_args.cpp +++ b/src/polyrenderer/drawers/poly_draw_args.cpp @@ -235,6 +235,7 @@ void RectDrawArgs::SetTexture(FTexture *texture, FRenderStyle style) void RectDrawArgs::SetTexture(FTexture *texture, uint32_t translationID, FRenderStyle style) { + // Alphatexture overrides translations. if (translationID != 0xffffffff && translationID != 0 && !(style.Flags & STYLEF_RedIsAlpha)) { FRemapTable *table = TranslationToTable(translationID); @@ -308,61 +309,63 @@ void RectDrawArgs::Draw(PolyRenderThread *thread, double x0, double x1, double y thread->DrawQueue->Push(*this); } -void RectDrawArgs::SetStyle(FRenderStyle renderstyle, double alpha, uint32_t fillcolor, uint32_t translationID, FTexture *tex, bool fullbright) +void RectDrawArgs::SetStyle(const FRenderStyle &renderstyle, double alpha, uint32_t fillcolor, uint32_t translationID, FTexture *tex, bool fullbright) { SetTexture(tex, translationID, renderstyle); + SetColor(0xff000000 | fillcolor, fillcolor >> 24); if (renderstyle == LegacyRenderStyles[STYLE_Normal] || (r_drawfuzz == 0 && renderstyle == LegacyRenderStyles[STYLE_OptFuzzy])) { - SetStyle(Translation() ? RectBlendMode::TranslatedAdd : RectBlendMode::TextureAdd, 1.0, 0.0); + SetStyle(Translation() ? TriBlendMode::NormalTranslated : TriBlendMode::Normal, alpha); } else if (renderstyle == LegacyRenderStyles[STYLE_Add] && fullbright && alpha == 1.0 && !Translation()) { - SetStyle(RectBlendMode::TextureAddSrcColor, 1.0, 1.0); - } - else if (renderstyle == LegacyRenderStyles[STYLE_Add]) - { - SetStyle(Translation() ? RectBlendMode::TranslatedAdd : RectBlendMode::TextureAdd, alpha, 1.0); - } - else if (renderstyle == LegacyRenderStyles[STYLE_Subtract]) - { - SetStyle(Translation() ? RectBlendMode::TranslatedRevSub : RectBlendMode::TextureRevSub, alpha, 1.0); + SetStyle(TriBlendMode::SrcColor, alpha); } else if (renderstyle == LegacyRenderStyles[STYLE_SoulTrans]) { - SetStyle(Translation() ? RectBlendMode::TranslatedAdd : RectBlendMode::TextureAdd, transsouls, 1.0 - transsouls); + SetStyle(Translation() ? TriBlendMode::AddTranslated : TriBlendMode::Add, transsouls); } else if (renderstyle == LegacyRenderStyles[STYLE_Fuzzy] || (r_drawfuzz == 1 && renderstyle == LegacyRenderStyles[STYLE_OptFuzzy])) { SetColor(0xff000000, 0); - SetStyle(RectBlendMode::Fuzz); + SetStyle(TriBlendMode::Fuzzy); } else if (renderstyle == LegacyRenderStyles[STYLE_Shadow] || (r_drawfuzz == 2 && renderstyle == LegacyRenderStyles[STYLE_OptFuzzy])) { - SetStyle(Translation() ? RectBlendMode::TranslatedAdd : RectBlendMode::TextureAdd, 0.0, 160 / 255.0); + SetColor(0xff000000, 0); + SetStyle(Translation() ? TriBlendMode::TranslucentStencilTranslated : TriBlendMode::TranslucentStencil, 1.0 - 160 / 255.0); } - else if (renderstyle == LegacyRenderStyles[STYLE_TranslucentStencil]) + else if (renderstyle == LegacyRenderStyles[STYLE_Stencil]) { - SetColor(0xff000000 | fillcolor, fillcolor >> 24); - SetStyle(RectBlendMode::Stencil, alpha, 1.0 - alpha); + SetStyle(Translation() ? TriBlendMode::StencilTranslated : TriBlendMode::Stencil, alpha); } - else if (renderstyle == LegacyRenderStyles[STYLE_AddStencil]) + else if (renderstyle == LegacyRenderStyles[STYLE_Translucent]) { - SetColor(0xff000000 | fillcolor, fillcolor >> 24); - SetStyle(RectBlendMode::AddStencil, alpha, 1.0); + SetStyle(Translation() ? TriBlendMode::TranslucentTranslated : TriBlendMode::Translucent, alpha); + } + else if (renderstyle == LegacyRenderStyles[STYLE_Add]) + { + SetStyle(Translation() ? TriBlendMode::AddTranslated : TriBlendMode::Add, alpha); } else if (renderstyle == LegacyRenderStyles[STYLE_Shaded]) { - SetColor(0xff000000 | fillcolor, fillcolor >> 24); - SetStyle(RectBlendMode::Shaded, alpha, 1.0 - alpha); + SetStyle(Translation() ? TriBlendMode::ShadedTranslated : TriBlendMode::Shaded, alpha); + } + else if (renderstyle == LegacyRenderStyles[STYLE_TranslucentStencil]) + { + SetStyle(Translation() ? TriBlendMode::TranslucentStencilTranslated : TriBlendMode::TranslucentStencil, alpha); + } + else if (renderstyle == LegacyRenderStyles[STYLE_Subtract]) + { + SetStyle(Translation() ? TriBlendMode::SubtractTranslated : TriBlendMode::Subtract, alpha); + } + else if (renderstyle == LegacyRenderStyles[STYLE_AddStencil]) + { + SetStyle(Translation() ? TriBlendMode::AddStencilTranslated : TriBlendMode::AddStencil, alpha); } else if (renderstyle == LegacyRenderStyles[STYLE_AddShaded]) { - SetColor(0xff000000 | fillcolor, fillcolor >> 24); - SetStyle(RectBlendMode::AddShaded, alpha, 1.0); - } - else - { - SetStyle(Translation() ? RectBlendMode::TranslatedAdd : RectBlendMode::TextureAdd, alpha, 1.0 - alpha); + SetStyle(Translation() ? TriBlendMode::AddShadedTranslated : TriBlendMode::AddShaded, alpha); } } diff --git a/src/swrenderer/line/r_walldraw.cpp b/src/swrenderer/line/r_walldraw.cpp index 92235ae34..64f14135f 100644 --- a/src/swrenderer/line/r_walldraw.cpp +++ b/src/swrenderer/line/r_walldraw.cpp @@ -189,12 +189,7 @@ namespace swrenderer { auto viewport = Thread->Viewport.get(); - int tx = x; - bool mirror = !!(Thread->Portal->MirrorFlags & RF_XFLIP); - if (mirror) - tx = viewwidth - tx - 1; - - drawerargs.dc_viewpos.X = (float)((tx + 0.5 - viewport->CenterX) / viewport->CenterX * zcol); + drawerargs.dc_viewpos.X = (float)((x + 0.5 - viewport->CenterX) / viewport->CenterX * zcol); drawerargs.dc_viewpos.Y = zcol; drawerargs.dc_viewpos.Z = (float)((viewport->CenterY - y1 - 0.5) / viewport->InvZtoScale * zcol); drawerargs.dc_viewpos_step.Z = (float)(-zcol / viewport->InvZtoScale); diff --git a/src/swrenderer/plane/r_flatplane.cpp b/src/swrenderer/plane/r_flatplane.cpp index 88b3871a6..8d0120559 100644 --- a/src/swrenderer/plane/r_flatplane.cpp +++ b/src/swrenderer/plane/r_flatplane.cpp @@ -205,21 +205,13 @@ namespace swrenderer if (r_dynlights) { - int tx = x1; - bool mirror = !!(Thread->Portal->MirrorFlags & RF_XFLIP); - if (mirror) - tx = viewwidth - tx - 1; - // Find row position in view space float zspan = (float)(planeheight / (fabs(y + 0.5 - viewport->CenterY) / viewport->InvZtoScale)); - drawerargs.dc_viewpos.X = (float)((tx + 0.5 - viewport->CenterX) / viewport->CenterX * zspan); + drawerargs.dc_viewpos.X = (float)((x1 + 0.5 - viewport->CenterX) / viewport->CenterX * zspan); drawerargs.dc_viewpos.Y = zspan; drawerargs.dc_viewpos.Z = (float)((viewport->CenterY - y - 0.5) / viewport->InvZtoScale * zspan); drawerargs.dc_viewpos_step.X = (float)(zspan / viewport->CenterX); - if (mirror) - drawerargs.dc_viewpos_step.X = -drawerargs.dc_viewpos_step.X; - // Plane normal drawerargs.dc_normal.X = 0.0f; drawerargs.dc_normal.Y = 0.0f; diff --git a/src/swrenderer/scene/r_portal.cpp b/src/swrenderer/scene/r_portal.cpp index 323480c32..46e6e8357 100644 --- a/src/swrenderer/scene/r_portal.cpp +++ b/src/swrenderer/scene/r_portal.cpp @@ -173,7 +173,6 @@ namespace swrenderer Thread->Viewport->viewpoint.sector = port->mDestination; assert(Thread->Viewport->viewpoint.sector != nullptr); R_SetViewAngle(Thread->Viewport->viewpoint, Thread->Viewport->viewwindow); - Thread->Viewport->SetupPolyViewport(Thread); Thread->OpaquePass->ClearSeenSprites(); Thread->Clip3D->ClearFakeFloors(); @@ -240,7 +239,6 @@ namespace swrenderer // Masked textures and planes need the view coordinates restored for proper positioning. viewposStack.Pop(Thread->Viewport->viewpoint.Pos); - Thread->Viewport->SetupPolyViewport(Thread); Thread->TranslucentPass->Render(); VisiblePlane *pl = nullptr; // quiet, GCC! @@ -261,7 +259,6 @@ namespace swrenderer Thread->Viewport->viewpoint.extralight = savedextralight; Thread->Viewport->viewpoint.Angles = savedangles; R_SetViewAngle(Thread->Viewport->viewpoint, Thread->Viewport->viewwindow); - Thread->Viewport->SetupPolyViewport(Thread); CurrentPortalInSkybox = false; Thread->Clip3D->LeaveSkybox(); @@ -429,8 +426,6 @@ namespace swrenderer else MirrorFlags |= RF_XFLIP; } - Thread->Viewport->SetupPolyViewport(Thread); - // some portals have height differences, account for this here Thread->Clip3D->EnterSkybox(); // push 3D floor height map CurrentPortalInSkybox = false; // first portal in a skybox should set this variable to false for proper clipping in skyboxes. @@ -483,8 +478,6 @@ namespace swrenderer viewpoint.Pos = startpos; viewpoint.Path[0] = savedpath[0]; viewpoint.Path[1] = savedpath[1]; - - viewport->SetupPolyViewport(Thread); } #if 0 diff --git a/src/swrenderer/scene/r_scene.cpp b/src/swrenderer/scene/r_scene.cpp index 71ea71652..d51eef63a 100644 --- a/src/swrenderer/scene/r_scene.cpp +++ b/src/swrenderer/scene/r_scene.cpp @@ -159,8 +159,6 @@ namespace swrenderer if (r_models) MainThread()->Viewport->SetupPolyViewport(MainThread()); - FRenderViewpoint origviewpoint = MainThread()->Viewport->viewpoint; - ActorRenderFlags savedflags = MainThread()->Viewport->viewpoint.camera->renderflags; // Never draw the player unless in chasecam mode if (!MainThread()->Viewport->viewpoint.showviewer) @@ -169,12 +167,6 @@ namespace swrenderer } RenderThreadSlices(); - - // Mirrors fail to restore the original viewpoint -- we need it for the HUD weapon to draw correctly. - MainThread()->Viewport->viewpoint = origviewpoint; - if (r_models) - MainThread()->Viewport->SetupPolyViewport(MainThread()); - RenderPSprites(); MainThread()->Viewport->viewpoint.camera->renderflags = savedflags; @@ -267,7 +259,7 @@ namespace swrenderer thread->OpaquePass->ResetFakingUnderwater(); // [RH] Hack to make windows into underwater areas possible thread->Portal->SetMainPortal(); - PolyTriangleDrawer::SetViewport(thread->DrawQueue, viewwindowx, viewwindowy, viewwidth, viewheight, thread->Viewport->RenderTarget, true); + PolyTriangleDrawer::SetViewport(thread->DrawQueue, viewwindowx, viewwindowy, viewwidth, viewheight, thread->Viewport->RenderTarget); // Cull things outside the range seen by this thread VisibleSegmentRenderer visitor; diff --git a/src/swrenderer/things/r_model.h b/src/swrenderer/things/r_model.h index fea1f1117..ee6608358 100644 --- a/src/swrenderer/things/r_model.h +++ b/src/swrenderer/things/r_model.h @@ -47,24 +47,22 @@ namespace swrenderer float x, y, z; FSpriteModelFrame *smf; AActor *actor; - Mat4f WorldToClip; - bool MirrorWorldToClip; }; class SWModelRenderer : public FModelRenderer { public: - SWModelRenderer(RenderThread *thread, Fake3DTranslucent clip3DFloor, Mat4f *worldToClip, bool mirrorWorldToClip); + SWModelRenderer(RenderThread *thread, Fake3DTranslucent clip3DFloor); ModelRendererType GetType() const override { return SWModelRendererType; } - void BeginDrawModel(AActor *actor, FSpriteModelFrame *smf, const VSMatrix &objectToWorldMatrix) override; + void BeginDrawModel(AActor *actor, FSpriteModelFrame *smf, const VSMatrix &objectToWorldMatrix, bool mirrored) override; void EndDrawModel(AActor *actor, FSpriteModelFrame *smf) override; IModelVertexBuffer *CreateVertexBuffer(bool needindex, bool singleframe) override; void SetVertexBuffer(IModelVertexBuffer *buffer) override; void ResetVertexBuffer() override; VSMatrix GetViewToWorldMatrix() override; - void BeginDrawHUDModel(AActor *actor, const VSMatrix &objectToWorldMatrix) override; + void BeginDrawHUDModel(AActor *actor, const VSMatrix &objectToWorldMatrix, bool mirrored) override; void EndDrawHUDModel(AActor *actor) override; void SetInterpolation(double interpolation) override; void SetMaterial(FTexture *skin, bool clampNoFilter, int translation) override; @@ -83,8 +81,6 @@ namespace swrenderer unsigned int *IndexBuffer = nullptr; TriVertex *VertexBuffer = nullptr; float InterpolationFactor = 0.0; - Mat4f *WorldToClip = nullptr; - bool MirrorWorldToClip = false; }; class SWModelVertexBuffer : public IModelVertexBuffer diff --git a/src/swrenderer/viewport/r_viewport.cpp b/src/swrenderer/viewport/r_viewport.cpp index e3cfc1548..57994d899 100644 --- a/src/swrenderer/viewport/r_viewport.cpp +++ b/src/swrenderer/viewport/r_viewport.cpp @@ -62,10 +62,6 @@ namespace swrenderer void RenderViewport::SetupPolyViewport(RenderThread *thread) { WorldToView = SoftwareWorldToView(viewpoint); - - if (thread->Portal->MirrorFlags & RF_XFLIP) - WorldToView = Mat4f::Scale(-1.0f, 1.0f, 1.0f) * WorldToView; - ViewToClip = SoftwareViewToClip(); WorldToClip = ViewToClip * WorldToView; }