From a4759de13adbacf85cb4cf41cf5b0b82cf03a867 Mon Sep 17 00:00:00 2001
From: Cinders <cinder@cinderblocks.biz>
Date: Tue, 18 Aug 2015 23:28:18 -0600
Subject: [PATCH] ALCH-267 - Thanks Liru and Shyotl. :)

---
 indra/newview/llnetmap.cpp       | 43 +++++++++++++++++++-------------
 indra/newview/llviewerregion.cpp | 30 ++++++++++++++++++++++
 indra/newview/llviewerregion.h   |  8 ++++--
 3 files changed, 62 insertions(+), 19 deletions(-)

diff --git a/indra/newview/llnetmap.cpp b/indra/newview/llnetmap.cpp
index 369e370275..ca3293a4ef 100755
--- a/indra/newview/llnetmap.cpp
+++ b/indra/newview/llnetmap.cpp
@@ -53,7 +53,6 @@
 #include "llsurface.h"
 #include "llviewercamera.h"
 #include "llviewercontrol.h"
-#include "llviewernetwork.h"
 #include "llviewertexture.h"
 #include "llviewertexturelist.h"
 #include "llviewermenu.h"
@@ -259,24 +258,34 @@ void LLNetMap::draw()
 
 			
 			// <alchemy>
-			if (use_world_map_image && LLGridManager::getInstance()->isInSecondlife())
+			if (use_world_map_image)
 			{
-				LLViewerTexture* img = regionp->getMapImage();
-				if (img && img->hasGLTexture())
+				const LLViewerRegion::tex_matrix_t& tiles(regionp->getWorldMapTiles());
+				for (S32 i(0), scaled_width(real_width / region_width), square_width(scaled_width * scaled_width);
+					 i < square_width; ++i)
 				{
-					gGL.getTexUnit(0)->bind(img);
-					gGL.begin(LLRender::QUADS);
-					gGL.texCoord2f(0.f, 1.f);
-					gGL.vertex2f(left, top);
-					gGL.texCoord2f(0.f, 0.f);
-					gGL.vertex2f(left, bottom);
-					gGL.texCoord2f(1.f, 0.f);
-					gGL.vertex2f(right, bottom);
-					gGL.texCoord2f(1.f, 1.f);
-					gGL.vertex2f(right, top);
-					gGL.end();
-
-					img->setBoostLevel(LLGLTexture::BOOST_MAP_VISIBLE);
+					const F32 y(i / scaled_width);
+					const F32 x(i - y * scaled_width);
+					const F32 local_left(left + x * mScale);
+					const F32 local_right(local_left + mScale);
+					const F32 local_bottom(bottom + y * mScale);
+					const F32 local_top(local_bottom + mScale);
+					LLViewerTexture* img = tiles[x * scaled_width + y];
+					if (img && img->hasGLTexture())
+					{
+						gGL.getTexUnit(0)->bind(img);
+						gGL.begin(LLRender::QUADS);
+							gGL.texCoord2f(0.f, 1.f);
+							gGL.vertex2f(local_left, local_top);
+							gGL.texCoord2f(0.f, 0.f);
+							gGL.vertex2f(local_left, local_bottom);
+							gGL.texCoord2f(1.f, 0.f);
+							gGL.vertex2f(local_right, local_bottom);
+							gGL.texCoord2f(1.f, 1.f);
+							gGL.vertex2f(local_right, local_top);
+						gGL.end();
+						img->setBoostLevel(LLViewerTexture::BOOST_MAP_VISIBLE);
+					}
 				}
 			}
 			else
diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp
index 2bfbc097c5..38fe57c671 100755
--- a/indra/newview/llviewerregion.cpp
+++ b/indra/newview/llviewerregion.cpp
@@ -541,6 +541,9 @@ LLViewerRegion::~LLViewerRegion()
 
 	delete mImpl;
 	mImpl = NULL;
+
+	for (LLPointer<LLViewerTexture> tile : mWorldMapTiles)
+		tile->setBoostLevel(LLViewerTexture::BOOST_NONE);
 }
 
 LLEventPump& LLViewerRegion::getCapAPI() const
@@ -3418,6 +3421,33 @@ void LLViewerRegion::setGodnames()
 	}
 }
 
+const LLViewerRegion::tex_matrix_t& LLViewerRegion::getWorldMapTiles() const
+{
+	if (mWorldMapTiles.empty())
+	{
+		U32 gridX, gridY;
+		grid_from_region_handle(mHandle, &gridX, &gridY);
+		U32 totalX(getWidth() / REGION_WIDTH_U32);
+		if (!totalX) ++totalX; // If this region is too small, still get an image.
+		// *TODO: Non-square regions?
+		//U32 totalY(getLength()/REGION_WIDTH_U32);
+		//if (!totalY) ++totalY; // If this region is too small, still get an image.
+		const U32 totalY(totalX);
+		mWorldMapTiles.reserve(totalX * totalY);
+		for (U32 x = 0; x != totalX; ++x)
+			for (U32 y = 0; y != totalY; ++y)
+			{
+				const std::string map_url = getMapServerURL().append(llformat("map-1-%d-%d-objects.jpg", gridX + x, gridY + y));
+				LL_WARNS() << "WOO! " << map_url << LL_ENDL;
+				LLPointer<LLViewerTexture> tex(LLViewerTextureManager::getFetchedTextureFromUrl(map_url, FTT_MAP_TILE, TRUE,
+											   LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE));
+				mWorldMapTiles.push_back(tex);
+				tex->setBoostLevel(LLViewerTexture::BOOST_MAP);
+			}
+	}
+	return mWorldMapTiles;
+}
+
 LLViewerTexture* LLViewerRegion::getMapImage()
 {
 	if (mMapImage.isNull())
diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h
index a4344c3da4..528195c12a 100755
--- a/indra/newview/llviewerregion.h
+++ b/indra/newview/llviewerregion.h
@@ -411,7 +411,10 @@ public:
 	/// "God names" surname and full account names map
 	std::set<std::string> getGods() const { return mGodNames; };
 	//@}
-	
+
+	typedef std::vector<LLPointer<LLViewerTexture> > tex_matrix_t;
+	const tex_matrix_t& getWorldMapTiles() const;
+
 	LLViewerTexture* getMapImage(); // <alchemy/>
 
 private:
@@ -576,8 +579,9 @@ private:
 	LLFrameTimer mMaterialsCapThrottleTimer;
 	LLFrameTimer mRenderInfoRequestTimer;
 
+	mutable tex_matrix_t mWorldMapTiles;
 	LLPointer<LLViewerTexture> mMapImage; // <alchemy/>
-    std::set<std::string> mGodNames;
+	std::set<std::string> mGodNames;
 };
 
 inline BOOL LLViewerRegion::getRegionProtocol(U64 protocol) const
-- 
GitLab