From 85f5f897d714e3aa00e88819c14b8c738775cbe7 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl <dpjudas@users.noreply.github.com> Date: Sat, 9 Jun 2018 12:29:33 +0200 Subject: [PATCH] - enable model rendering in the software renderer --- src/polyrenderer/poly_renderer.cpp | 6 ++++++ src/polyrenderer/scene/poly_playersprite.cpp | 4 ++-- src/polyrenderer/scene/poly_sprite.cpp | 2 +- src/swrenderer/line/r_walldraw.cpp | 6 +++--- src/swrenderer/plane/r_flatplane.cpp | 2 +- src/swrenderer/plane/r_skyplane.cpp | 2 +- src/swrenderer/plane/r_slopeplane.cpp | 2 +- src/swrenderer/r_renderthread.h | 1 + src/swrenderer/scene/r_opaque_pass.cpp | 2 +- src/swrenderer/scene/r_scene.cpp | 14 +++++++++----- src/swrenderer/things/r_playersprite.cpp | 2 +- src/swrenderer/things/r_visiblesprite.cpp | 2 +- src/swrenderer/things/r_visiblespritelist.cpp | 2 +- wadsrc/static/language.enu | 1 + wadsrc/static/menudef.txt | 1 + 15 files changed, 31 insertions(+), 18 deletions(-) diff --git a/src/polyrenderer/poly_renderer.cpp b/src/polyrenderer/poly_renderer.cpp index 76d8a937e..ec2f7a628 100644 --- a/src/polyrenderer/poly_renderer.cpp +++ b/src/polyrenderer/poly_renderer.cpp @@ -27,6 +27,7 @@ #include "st_stuff.h" #include "r_data/r_translate.h" #include "r_data/r_interpolate.h" +#include "r_data/models/models.h" #include "poly_renderer.h" #include "d_net.h" #include "po_man.h" @@ -41,6 +42,9 @@ EXTERN_CVAR(Int, screenblocks) EXTERN_CVAR(Float, r_visibility) +EXTERN_CVAR(Bool, r_models) + +extern bool r_modelscene; ///////////////////////////////////////////////////////////////////////////// @@ -156,6 +160,8 @@ void PolyRenderer::RenderActorView(AActor *actor, bool dontmaplines) ScreenTriangle::FuzzStart = (ScreenTriangle::FuzzStart + 14) % FUZZTABLE; + r_modelscene = r_models && Models.Size() > 0; + ClearBuffers(); SetSceneViewport(); diff --git a/src/polyrenderer/scene/poly_playersprite.cpp b/src/polyrenderer/scene/poly_playersprite.cpp index e08857de9..fecbc77ac 100644 --- a/src/polyrenderer/scene/poly_playersprite.cpp +++ b/src/polyrenderer/scene/poly_playersprite.cpp @@ -34,7 +34,7 @@ EXTERN_CVAR(Bool, r_drawplayersprites) EXTERN_CVAR(Bool, r_deathcamera) EXTERN_CVAR(Bool, r_fullbrightignoresectorcolor) -EXTERN_CVAR(Bool, r_models) +extern bool r_modelscene; void RenderPolyPlayerSprites::Render(PolyRenderThread *thread) { @@ -60,7 +60,7 @@ void RenderPolyPlayerSprites::Render(PolyRenderThread *thread) (r_deathcamera && viewpoint.camera->health <= 0)) return; - renderHUDModel = r_models && IsHUDModelForPlayerAvailable(players[consoleplayer].camera->player); + renderHUDModel = r_modelscene && IsHUDModelForPlayerAvailable(players[consoleplayer].camera->player); PolyTransferHeights fakeflat(viewpoint.camera->subsector); diff --git a/src/polyrenderer/scene/poly_sprite.cpp b/src/polyrenderer/scene/poly_sprite.cpp index 88ffb99b6..9dda0edf7 100644 --- a/src/polyrenderer/scene/poly_sprite.cpp +++ b/src/polyrenderer/scene/poly_sprite.cpp @@ -74,7 +74,7 @@ bool RenderPolySprite::GetLine(AActor *thing, DVector2 &left, DVector2 &right) void RenderPolySprite::Render(PolyRenderThread *thread, AActor *thing, subsector_t *sub, uint32_t stencilValue, float t1, float t2) { - if (r_models) + if (r_modelscene) { int spritenum = thing->sprite; bool isPicnumOverride = thing->picnum.isValid(); diff --git a/src/swrenderer/line/r_walldraw.cpp b/src/swrenderer/line/r_walldraw.cpp index 92235ae34..138efab84 100644 --- a/src/swrenderer/line/r_walldraw.cpp +++ b/src/swrenderer/line/r_walldraw.cpp @@ -267,7 +267,7 @@ namespace swrenderer drawerargs.SetTextureVStep(sampler.uv_step); drawerargs.SetTextureVPos(sampler.uv_pos); drawerargs.DrawColumn(Thread); - if (r_models) + if (r_modelscene) drawerargs.DrawDepthColumn(Thread, zbufferdepth); uint64_t step64 = sampler.uv_step; @@ -287,7 +287,7 @@ namespace swrenderer drawerargs.SetTextureVStep(sampler.uv_step); drawerargs.SetTextureVPos(sampler.uv_pos); drawerargs.DrawColumn(Thread); - if (r_models) + if (r_modelscene) drawerargs.DrawDepthColumn(Thread, zbufferdepth); uint64_t step64 = sampler.uv_step; @@ -315,7 +315,7 @@ namespace swrenderer drawerargs.SetTextureVStep(sampler.uv_step); drawerargs.SetTextureVPos(uv_pos); drawerargs.DrawColumn(Thread); - if (r_models) + if (r_modelscene) drawerargs.DrawDepthColumn(Thread, zbufferdepth); y += count; diff --git a/src/swrenderer/plane/r_flatplane.cpp b/src/swrenderer/plane/r_flatplane.cpp index 88b3871a6..51d376bd4 100644 --- a/src/swrenderer/plane/r_flatplane.cpp +++ b/src/swrenderer/plane/r_flatplane.cpp @@ -284,7 +284,7 @@ namespace swrenderer drawerargs.SetDestX2(x2); drawerargs.DrawSpan(Thread); - if (r_models) + if (r_modelscene) drawerargs.DrawDepthSpan(Thread, zbufferdepth, zbufferdepth); } diff --git a/src/swrenderer/plane/r_skyplane.cpp b/src/swrenderer/plane/r_skyplane.cpp index 526be96e7..afa9496c0 100644 --- a/src/swrenderer/plane/r_skyplane.cpp +++ b/src/swrenderer/plane/r_skyplane.cpp @@ -225,7 +225,7 @@ namespace swrenderer else drawerargs.DrawDoubleSkyColumn(Thread); - if (r_models) + if (r_modelscene) drawerargs.DrawDepthSkyColumn(Thread, 1.0f / 65536.0f); } diff --git a/src/swrenderer/plane/r_slopeplane.cpp b/src/swrenderer/plane/r_slopeplane.cpp index df307e425..20eb3dbf4 100644 --- a/src/swrenderer/plane/r_slopeplane.cpp +++ b/src/swrenderer/plane/r_slopeplane.cpp @@ -214,7 +214,7 @@ namespace swrenderer { drawerargs.DrawTiltedSpan(Thread, y, x1, x2, plane_sz, plane_su, plane_sv, plane_shade, planeshade, planelightfloat, pviewx, pviewy, basecolormap); - if (r_models) + if (r_modelscene) { double viewZ = 1.0; double viewX1 = Thread->Viewport->ScreenToViewX(x1, viewZ); diff --git a/src/swrenderer/r_renderthread.h b/src/swrenderer/r_renderthread.h index 36189c35d..b65713e07 100644 --- a/src/swrenderer/r_renderthread.h +++ b/src/swrenderer/r_renderthread.h @@ -31,6 +31,7 @@ class RenderMemory; class ADynamicLight; EXTERN_CVAR(Bool, r_models); +extern bool r_modelscene; namespace swrenderer { diff --git a/src/swrenderer/scene/r_opaque_pass.cpp b/src/swrenderer/scene/r_opaque_pass.cpp index 5a88c8086..1cb7045eb 100644 --- a/src/swrenderer/scene/r_opaque_pass.cpp +++ b/src/swrenderer/scene/r_opaque_pass.cpp @@ -954,7 +954,7 @@ namespace swrenderer { RenderVoxel::Project(Thread, thing, sprite.pos, sprite.voxel, sprite.spriteScale, sprite.renderflags, fakeside, fakefloor, fakeceiling, sec, thingShade, foggy, thingColormap); } - else if (!r_models) + else if (!r_modelscene) { RenderSprite::Project(Thread, thing, sprite.pos, sprite.tex, sprite.spriteScale, sprite.renderflags, fakeside, fakefloor, fakeceiling, sec, thingShade, foggy, thingColormap); } diff --git a/src/swrenderer/scene/r_scene.cpp b/src/swrenderer/scene/r_scene.cpp index bf6653568..a50284ace 100644 --- a/src/swrenderer/scene/r_scene.cpp +++ b/src/swrenderer/scene/r_scene.cpp @@ -67,7 +67,9 @@ EXTERN_CVAR(Int, r_clearbuffer) EXTERN_CVAR(Int, r_debug_draw) CVAR(Bool, r_scene_multithreaded, false, 0); -CVAR(Bool, r_models, false, 0); +CVAR(Bool, r_models, true, CVAR_ARCHIVE | CVAR_GLOBALCONFIG); + +bool r_modelscene = false; namespace swrenderer { @@ -101,7 +103,9 @@ namespace swrenderer float trueratio; ActiveRatio(width, height, &trueratio); viewport->SetViewport(MainThread(), width, height, trueratio); - if (r_models) + + r_modelscene = r_models && Models.Size() > 0; + if (r_modelscene) PolyTriangleDrawer::ClearBuffers(viewport->RenderTarget); if (r_clearbuffer != 0 || r_debug_draw != 0) @@ -156,7 +160,7 @@ namespace swrenderer R_UpdateFuzzPosFrameStart(); - if (r_models) + if (r_modelscene) MainThread()->Viewport->SetupPolyViewport(MainThread()); FRenderViewpoint origviewpoint = MainThread()->Viewport->viewpoint; @@ -172,7 +176,7 @@ namespace swrenderer // Mirrors fail to restore the original viewpoint -- we need it for the HUD weapon to draw correctly. MainThread()->Viewport->viewpoint = origviewpoint; - if (r_models) + if (r_modelscene) MainThread()->Viewport->SetupPolyViewport(MainThread()); RenderPSprites(); @@ -371,7 +375,7 @@ namespace swrenderer viewwindowy = y; viewactive = true; viewport->SetViewport(MainThread(), width, height, MainThread()->Viewport->viewwindow.WidescreenRatio); - if (r_models) + if (r_modelscene) PolyTriangleDrawer::ClearBuffers(viewport->RenderTarget); // Render: diff --git a/src/swrenderer/things/r_playersprite.cpp b/src/swrenderer/things/r_playersprite.cpp index e1156f4fd..1a6f52e2d 100644 --- a/src/swrenderer/things/r_playersprite.cpp +++ b/src/swrenderer/things/r_playersprite.cpp @@ -94,7 +94,7 @@ namespace swrenderer (r_deathcamera && Thread->Viewport->viewpoint.camera->health <= 0)) return; - renderHUDModel = r_models && IsHUDModelForPlayerAvailable(players[consoleplayer].camera->player); + renderHUDModel = r_modelscene && IsHUDModelForPlayerAvailable(players[consoleplayer].camera->player); FDynamicColormap *basecolormap; CameraLight *cameraLight = CameraLight::Instance(); diff --git a/src/swrenderer/things/r_visiblesprite.cpp b/src/swrenderer/things/r_visiblesprite.cpp index e4e7f80e2..5687fe473 100644 --- a/src/swrenderer/things/r_visiblesprite.cpp +++ b/src/swrenderer/things/r_visiblesprite.cpp @@ -315,7 +315,7 @@ namespace swrenderer RenderPortal *renderportal = thread->Portal.get(); // Render draw segments behind sprite - if (r_models) + if (r_modelscene) { int subsectordepth = spr->SubsectorDepth; for (unsigned int index = 0; index != segmentlist->TranslucentSegmentsCount(); index++) diff --git a/src/swrenderer/things/r_visiblespritelist.cpp b/src/swrenderer/things/r_visiblespritelist.cpp index 0fee922b2..f6181b506 100644 --- a/src/swrenderer/things/r_visiblespritelist.cpp +++ b/src/swrenderer/things/r_visiblespritelist.cpp @@ -83,7 +83,7 @@ namespace swrenderer SortedSprites[i] = Sprites[first + count - i - 1]; } - if (r_models) // To do: only do this if models are spotted - just in case there's some lame renderhack somewhere that relies on Carmacks algorithm + if (r_modelscene) { for (unsigned int i = 0; i < count; i++) { diff --git a/wadsrc/static/language.enu b/wadsrc/static/language.enu index 348faac9c..1a034207c 100644 --- a/wadsrc/static/language.enu +++ b/wadsrc/static/language.enu @@ -1818,6 +1818,7 @@ DSPLYMNU_ATTACHEDSURFACES = "Use attached surfaces"; // Not used DSPLYMNU_SKYMODE = "Sky render mode"; DSPLYMNU_LINEARSKY = "Linear skies"; DSPLYMNU_GZDFULLBRIGHT = "Fullbright overrides sector color"; +DSPLYMNU_MODELS = "Models"; DSPLYMNU_SCALEFUZZ = "Scale fuzz effect"; DSPLYMNU_DRAWFUZZ = "Use fuzz effect"; DSPLYMNU_OLDTRANS = "Classic Transparency"; diff --git a/wadsrc/static/menudef.txt b/wadsrc/static/menudef.txt index 405526a38..28f9e17d7 100644 --- a/wadsrc/static/menudef.txt +++ b/wadsrc/static/menudef.txt @@ -724,6 +724,7 @@ OptionMenu "SWROptions" protected Option "$DSPLYMNU_LINEARSKY", "r_linearsky", "OnOff" Option "$DSPLYMNU_GZDFULLBRIGHT", "r_fullbrightignoresectorcolor", "OnOff" Option "$DSPLYMNU_SCALEFUZZ", "r_fuzzscale", "OnOff" + Option "$DSPLYMNU_MODELS", "r_models", "OnOff" } OptionMenu "VideoOptions" protected