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