From 1b8533f256fac4fecf644efaae1491e6b8dafc25 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?eray=20or=C3=A7unus?= <erayorcunus@gmail.com>
Date: Sun, 3 Nov 2019 02:13:29 +0300
Subject: [PATCH] Renderer fixes

---
 src/core/config.h       |  3 +++
 src/render/Renderer.cpp | 24 ++++++++++++++----------
 src/render/Renderer.h   |  4 ++--
 3 files changed, 19 insertions(+), 12 deletions(-)

diff --git a/src/core/config.h b/src/core/config.h
index 12cb7be8..4ceb701d 100644
--- a/src/core/config.h
+++ b/src/core/config.h
@@ -87,6 +87,9 @@ enum Config {
 	NUM_FIRES = 40,
 
 	NUMPEDROUTES = 200,
+
+	NUMVISIBLEENTITIES = 2000,
+	NUMINVISIBLEENTITIES = 150,
 };
 
 // We'll use this once we're ready to become independent of the game
diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp
index 562d5882..8322c22a 100644
--- a/src/render/Renderer.cpp
+++ b/src/render/Renderer.cpp
@@ -40,9 +40,9 @@ struct EntityInfo
 CLinkList<EntityInfo> &gSortedVehiclesAndPeds = *(CLinkList<EntityInfo>*)0x629AC0;
 
 int32 &CRenderer::ms_nNoOfVisibleEntities = *(int32*)0x940730;
-CEntity **CRenderer::ms_aVisibleEntityPtrs = (CEntity**)0x6E9920;
+CEntity *(&CRenderer::ms_aVisibleEntityPtrs)[NUMVISIBLEENTITIES] = *(CEntity * (*)[NUMVISIBLEENTITIES]) * (uintptr*)0x6E9920;
+CEntity *(&CRenderer::ms_aInVisibleEntityPtrs)[NUMINVISIBLEENTITIES] = *(CEntity * (*)[NUMINVISIBLEENTITIES]) * (uintptr*)0x880B50;
 int32 &CRenderer::ms_nNoOfInVisibleEntities = *(int32*)0x8F1B78;
-CEntity **CRenderer::ms_aInVisibleEntityPtrs = (CEntity**)0x880B50;
 
 CVector &CRenderer::ms_vecCameraPosition = *(CVector*)0x8E2C3C;
 CVehicle *&CRenderer::m_pFirstPersonVehicle = *(CVehicle**)0x885B80;
@@ -73,9 +73,9 @@ CRenderer::PreRender(void)
 	for(i = 0; i < ms_nNoOfInVisibleEntities; i++)
 		ms_aInVisibleEntityPtrs[i]->PreRender();
 
-	for(node = CVisibilityPlugins::m_alphaEntityList.tail.prev;
-	    node != &CVisibilityPlugins::m_alphaEntityList.head;
-	    node = node->prev)
+	for(node = CVisibilityPlugins::m_alphaEntityList.head.next;
+	    node != &CVisibilityPlugins::m_alphaEntityList.tail;
+	    node = node->next)
 		((CEntity*)node->item.entity)->PreRender();
 
 	CHeli::SpecialHeliPreRender();
@@ -983,7 +983,7 @@ CRenderer::ScanSectorList(CPtrList *lists)
 					dy = ms_vecCameraPosition.y - ent->GetPosition().y;
 					if(dx > -65.0f && dx < 65.0f &&
 					   dy > -65.0f && dy < 65.0f &&
-					   ms_nNoOfInVisibleEntities < 150)
+					   ms_nNoOfInVisibleEntities < NUMINVISIBLEENTITIES - 1)
 						ms_aInVisibleEntityPtrs[ms_nNoOfInVisibleEntities++] = ent;
 					break;
 				case VIS_STREAMME:
@@ -1033,7 +1033,7 @@ CRenderer::ScanSectorList_Priority(CPtrList *lists)
 					dy = ms_vecCameraPosition.y - ent->GetPosition().y;
 					if(dx > -65.0f && dx < 65.0f &&
 					   dy > -65.0f && dy < 65.0f &&
-					   ms_nNoOfInVisibleEntities < 150)
+					   ms_nNoOfInVisibleEntities < NUMINVISIBLEENTITIES - 1)
 						ms_aInVisibleEntityPtrs[ms_nNoOfInVisibleEntities++] = ent;
 					break;
 				case VIS_STREAMME:
@@ -1078,7 +1078,7 @@ CRenderer::ScanSectorList_Subway(CPtrList *lists)
 				dy = ms_vecCameraPosition.y - ent->GetPosition().y;
 				if(dx > -65.0f && dx < 65.0f &&
 				   dy > -65.0f && dy < 65.0f &&
-				   ms_nNoOfInVisibleEntities < 150)
+				   ms_nNoOfInVisibleEntities < NUMINVISIBLEENTITIES - 1)
 					ms_aInVisibleEntityPtrs[ms_nNoOfInVisibleEntities++] = ent;
 				break;
 			}
@@ -1160,8 +1160,12 @@ CRenderer::IsEntityCullZoneVisible(CEntity *ent)
 		return IsVehicleCullZoneVisible(ent);
 	case ENTITY_TYPE_PED:
 		ped = (CPed*)ent;
-		if(ped->bInVehicle)
-			return ped->m_pMyVehicle && IsVehicleCullZoneVisible(ped->m_pMyVehicle);
+		if (ped->bInVehicle) {
+			if (ped->m_pMyVehicle)
+				return IsVehicleCullZoneVisible(ped->m_pMyVehicle);
+			else
+				return true;
+		}
 		return !(ped->m_pCurSurface && ped->m_pCurSurface->bZoneCulled2);
 	case ENTITY_TYPE_OBJECT:
 		obj = (CObject*)ent;
diff --git a/src/render/Renderer.h b/src/render/Renderer.h
index 817cdaae..ea49ed4e 100644
--- a/src/render/Renderer.h
+++ b/src/render/Renderer.h
@@ -19,9 +19,9 @@ class CPtrList;
 class CRenderer
 {
 	static int32 &ms_nNoOfVisibleEntities;
-	static CEntity **ms_aVisibleEntityPtrs;	// [2000];
+	static CEntity *(&ms_aVisibleEntityPtrs)[NUMVISIBLEENTITIES];
 	static int32 &ms_nNoOfInVisibleEntities;
-	static CEntity **ms_aInVisibleEntityPtrs;	// [150];
+	static CEntity *(&ms_aInVisibleEntityPtrs)[NUMINVISIBLEENTITIES];
 
 	static CVector &ms_vecCameraPosition;
 	static CVehicle *&m_pFirstPersonVehicle;