Terrain * TerrainLattice::LoadTerrain(int index)
{
	int indexX, indexY;
	Terrain *pTerrain = NULL;
	if(GetXYFromTileID(index, &indexX, &indexY))
	{
		pTerrain = m_pLoader->LoadTerrainAt( NULL, indexX, indexY, m_useGeoMipmap);

		pair<TerrainTileCacheMap_type::iterator, bool> res = m_pCachedTerrains.insert(pair<int, TerrainTileCacheItem>(index, TerrainTileCacheItem(pTerrain)));
		if(res.second ==false)
		{
			/// replace the old object, if the terrain already exist
			OUTPUT_LOG("replacing old tile, this is really unexpected\n");
			SAFE_DELETE((*(res.first)).second.pTerrain);
			(*(res.first)).second.pTerrain = pTerrain;
		}
		if(pTerrain)
		{
			pTerrain->OnLoad();

			//GeoMipmapCode
			if(m_useGeoMipmap)
			{
				pTerrain->SetSharedIB(m_pIndices);
				pTerrain->SetSharedIndexInfoGroup(&m_geoMipmapIndices);
			}
		}
	}
	return pTerrain;
}