From 0cd575363ff51b4850477655ec13597eea9fae7d Mon Sep 17 00:00:00 2001
From: Magnus Norddahl <dpjudas@users.noreply.github.com>
Date: Wed, 28 Jun 2017 19:55:11 +0200
Subject: [PATCH] - Add r_sprite_distance_cull that per default culls all
 things further than 5000 units away

---
 src/swrenderer/scene/r_opaque_pass.cpp | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)

diff --git a/src/swrenderer/scene/r_opaque_pass.cpp b/src/swrenderer/scene/r_opaque_pass.cpp
index 7d6d6b461..bebb9580f 100644
--- a/src/swrenderer/scene/r_opaque_pass.cpp
+++ b/src/swrenderer/scene/r_opaque_pass.cpp
@@ -72,6 +72,20 @@
 EXTERN_CVAR(Bool, r_fullbrightignoresectorcolor);
 EXTERN_CVAR(Bool, r_drawvoxels);
 
+namespace { double sprite_distance_cull = 1e16; }
+
+CUSTOM_CVAR(Float, r_sprite_distance_cull, 5000.0, CVAR_ARCHIVE | CVAR_GLOBALCONFIG)
+{
+	if (r_sprite_distance_cull > 0.0)
+	{
+		sprite_distance_cull = r_sprite_distance_cull * r_sprite_distance_cull;
+	}
+	else
+	{
+		sprite_distance_cull = 1e16;
+	}
+}
+
 namespace swrenderer
 {
 	RenderOpaquePass::RenderOpaquePass(RenderThread *thread) : renderline(thread)
@@ -936,6 +950,10 @@ namespace swrenderer
 		if (!renderportal->CurrentPortalInSkybox && renderportal->CurrentPortal && !!P_PointOnLineSidePrecise(thing->Pos(), renderportal->CurrentPortal->dst))
 			return false;
 
+		double distanceSquared = (thing->Pos() - Thread->Viewport->viewpoint.Pos).LengthSquared();
+		if (distanceSquared > sprite_distance_cull)
+			return false;
+
 		return true;
 	}