Merge branch 'patch-bug-portal-render-limit' of https://github.com/Xelio/ingress-intel-total-conversion into Xelio-patch-bug-portal-render-limit

This commit is contained in:
Jon Atkins 2013-05-14 04:35:31 +01:00
commit c344c8c857
2 changed files with 51 additions and 36 deletions

View File

@ -160,6 +160,8 @@ window.handleDataResponse = function(data, textStatus, jqXHR) {
// Process the portals with portal render limit handler first // Process the portals with portal render limit handler first
// Low level portal will hold until last request // Low level portal will hold until last request
var newPpp = portalRenderLimit.splitOrMergeLowLevelPortals(ppp); var newPpp = portalRenderLimit.splitOrMergeLowLevelPortals(ppp);
// Clean up level of portal which over render limit after portalRenderLimit handler counted the new portals
portalRenderLimit.cleanUpOverLimitPortalLevel();
handlePortalsRender(newPpp); handlePortalsRender(newPpp);
resolvePlayerNames(); resolvePlayerNames();
@ -174,15 +176,15 @@ window.handlePortalsRender = function(portals) {
// the portal // the portal
var oldSelectedPortal = selectedPortal; var oldSelectedPortal = selectedPortal;
runHooks('portalDataLoaded', {portals : portals}); runHooks('portalDataLoaded', {portals : portals});
$.each(portals, function(ind, portal) { $.each(portals, function(guid, portal) {
//~ if(selectedPortal === portal[0]) portalUpdateAvailable = true; //~ if(selectedPortal === portal[0]) portalUpdateAvailable = true;
if(urlPortalLL && urlPortalLL[0] === portal[2].locationE6.latE6/1E6 && urlPortalLL[1] === portal[2].locationE6.lngE6/1E6) { if(urlPortalLL && urlPortalLL[0] === portal[2].locationE6.latE6/1E6 && urlPortalLL[1] === portal[2].locationE6.lngE6/1E6) {
urlPortal = portal[0]; urlPortal = guid;
portalInUrlAvailable = true; portalInUrlAvailable = true;
urlPortalLL = null; urlPortalLL = null;
} }
if(window.portals[portal[0]]) { if(window.portals[guid]) {
highlightPortal(window.portals[portal[0]]); highlightPortal(window.portals[guid]);
} }
renderPortal(portal); renderPortal(portal);
}); });

View File

@ -4,21 +4,19 @@
// limit is reached. // limit is reached.
// //
// On initialization, previous minLevel will preserve to previousMinLevel // On initialization, previous minLevel will preserve to previousMinLevel
// with zoom level difference. // and modify with zoom level difference.
// //
// After initialized and reset in window.requestData(), "processPortals" // After initialized and reset in window.requestData(), "processPortals"
// intercept all portals data in "handleDataResponse". Put the count of // intercept all portals data in "handleDataResponse". Put the count of
// new portals to newPortalsPerLevel[portal level]. And split portals // new portals to newPortalsPerLevel[portal level]. Portals with level >=
// into two parts base on previousMinLevel. Portals with level >= // previousMinLevel and already on map will return as result and continue
// previousMinLevel will return as result and continue to render. // to render. Others will save to portalsLowerThanPrevMinLv. If there is
// Others will save to portalsPreviousMinLevel. If there is no more // no more active request of map data, portalsLowerThanPrevMinLv will add
// active request of map data, portals will not split and // back to result and render base on current minLevel.
// portalsPreviousMinLevel will add back to result and render base on
// current minLevel.
// //
// "handleFailRequest" is added to handle the case when the last request // "window.handleFailRequest" is added to handle the case when the last request
// failed and "processPortals" didn't get called. It will get // failed and "processPortals" didn't get called. It will get
// portalsPreviousMinLevel base on current minLevel and render them. // portalsLowerThanPrevMinLv base on current minLevel and render them.
// //
// "getMinLevel" will be called by "getMinPortalLevel" in utils_misc.js // "getMinLevel" will be called by "getMinPortalLevel" in utils_misc.js
// to determine min portal level to draw on map. // to determine min portal level to draw on map.
@ -30,9 +28,7 @@
// high to low, and sum total portal count (old + new) to check // high to low, and sum total portal count (old + new) to check
// minLevel. // minLevel.
// //
// In each call of window.handleDataResponse(), it will call // minLevel is preserved and only replaced when render limit reached in
// "resetCounting" to reset previous response data. But minLevel
// is preserved and only replaced when render limit reached in
// higher level, until next window.requestData() called and reset. // higher level, until next window.requestData() called and reset.
// //
@ -42,12 +38,13 @@ window.portalRenderLimit.initialized = false;
window.portalRenderLimit.minLevelSet = false; window.portalRenderLimit.minLevelSet = false;
window.portalRenderLimit.minLevel = -1; window.portalRenderLimit.minLevel = -1;
window.portalRenderLimit.previousMinLevel = -1; window.portalRenderLimit.previousMinLevel = -1;
window.portalRenderLimit.previousZoomLevel; window.portalRenderLimit.previousZoomLevel = null;
window.portalRenderLimit.newPortalsPerLevel = new Array(MAX_PORTAL_LEVEL + 1); window.portalRenderLimit.newPortalsPerLevel = new Array(MAX_PORTAL_LEVEL + 1);
window.portalRenderLimit.portalsPreviousMinLevel = new Array(MAX_PORTAL_LEVEL + 1); window.portalRenderLimit.portalsLowerThanPrevMinLv = new Array(MAX_PORTAL_LEVEL + 1);
window.portalRenderLimit.init = function () { window.portalRenderLimit.init = function () {
var currentZoomLevel = map.getZoom(); var currentZoomLevel = map.getZoom();
// previousZoomLevel set to current zoom level on the first run
portalRenderLimit.previousZoomLevel = portalRenderLimit.previousZoomLevel || currentZoomLevel; portalRenderLimit.previousZoomLevel = portalRenderLimit.previousZoomLevel || currentZoomLevel;
// If there is a minLevel set in previous run, calculate previousMinLevel with it. // If there is a minLevel set in previous run, calculate previousMinLevel with it.
@ -59,10 +56,10 @@ window.portalRenderLimit.init = function () {
portalRenderLimit.previousZoomLevel = currentZoomLevel; portalRenderLimit.previousZoomLevel = currentZoomLevel;
portalRenderLimit.initialized = true;
portalRenderLimit.minLevel = -1; portalRenderLimit.minLevel = -1;
portalRenderLimit.resetCounting(); portalRenderLimit.resetCounting();
portalRenderLimit.resetPortalsPreviousMinLevel(); portalRenderLimit.resetPortalsLowerThanPrevMinLv();
portalRenderLimit.initialized = true;
} }
window.portalRenderLimit.resetCounting = function() { window.portalRenderLimit.resetCounting = function() {
@ -72,12 +69,22 @@ window.portalRenderLimit.resetCounting = function() {
} }
} }
window.portalRenderLimit.resetPortalsPreviousMinLevel = function() { window.portalRenderLimit.resetPortalsLowerThanPrevMinLv = function() {
for(var i = 0; i <= MAX_PORTAL_LEVEL; i++) { for(var i = 0; i <= MAX_PORTAL_LEVEL; i++) {
portalRenderLimit.portalsPreviousMinLevel[i] = new Array(); portalRenderLimit.portalsLowerThanPrevMinLv[i] = {};
} }
} }
// Use to clean up level of portals which is over render limit after counting new portals
window.portalRenderLimit.cleanUpOverLimitPortalLevel = function() {
var currentMinLevel = window.getMinPortalLevel();
for(var i = 0; i < currentMinLevel; i++) {
portalsLayers[i].clearLayers();
}
}
// Count new portals. Then split lower level portal if it's not last request.
// And Merge back if it's last request and render limit not yet hit
window.portalRenderLimit.splitOrMergeLowLevelPortals = function(originPortals) { window.portalRenderLimit.splitOrMergeLowLevelPortals = function(originPortals) {
portalRenderLimit.resetCounting(); portalRenderLimit.resetCounting();
portalRenderLimit.countingPortals(originPortals); portalRenderLimit.countingPortals(originPortals);
@ -101,29 +108,33 @@ window.portalRenderLimit.countingPortals = function(portals) {
}); });
} }
// Split the portal if it's lower level and not on map
window.portalRenderLimit.splitLowLevelPortals = function(portals) { window.portalRenderLimit.splitLowLevelPortals = function(portals) {
var resultPortals = new Array(); var resultPortals = {};
$.each(portals, function(ind, portal) {
$.each(portals || {}, function(guid, portal) {
var portalLevel = parseInt(getPortalLevel(portal[2])); var portalLevel = parseInt(getPortalLevel(portal[2]));
if(portalLevel < portalRenderLimit.previousMinLevel) { var portalOnMap = window.portals[guid];
portalRenderLimit.portalsPreviousMinLevel[portalLevel].push(portal);
if(!portalOnMap && portalLevel < portalRenderLimit.previousMinLevel) {
portalRenderLimit.portalsLowerThanPrevMinLv[portalLevel][guid] = portal;
} else { } else {
resultPortals.push(portal); resultPortals[guid] = portal;
} }
}); });
return resultPortals; return resultPortals;
} }
window.portalRenderLimit.mergeLowLevelPortals = function(appendTo) { window.portalRenderLimit.mergeLowLevelPortals = function(appendTo) {
var resultPortals = appendTo ? appendTo : new Array(); var resultPortals = appendTo ? appendTo : {};
for(var i = portalRenderLimit.getMinLevel(); for(var i = portalRenderLimit.getMinLevel();
i < portalRenderLimit.previousMinLevel; i < portalRenderLimit.previousMinLevel;
i++) { i++) {
$.merge(resultPortals, portalRenderLimit.portalsPreviousMinLevel[i]); $.extend(resultPortals, portalRenderLimit.portalsLowerThanPrevMinLv[i]);
} }
// Reset portalsPreviousMinLevel, ensure they return only once // Reset portalsLowerThanPrevMinLv, ensure they return only once
portalRenderLimit.resetPortalsPreviousMinLevel(); portalRenderLimit.resetPortalsLowerThanPrevMinLv();
return resultPortals; return resultPortals;
} }
@ -140,7 +151,9 @@ window.portalRenderLimit.setMinLevel = function() {
// Find the min portal level under render limit // Find the min portal level under render limit
while(newMinLevel > 0) { while(newMinLevel > 0) {
var oldPortalCount = layerGroupLength(portalsLayers[newMinLevel - 1]); var oldPortalCount = layerGroupLength(portalsLayers[newMinLevel - 1]);
var newPortalCount = portalRenderLimit.newPortalsPerLevel[newMinLevel - 1]; var storedPortalCount = Object.keys(portalRenderLimit.portalsLowerThanPrevMinLv[newMinLevel - 1]).length;
var newPortalCount = Math.max(storedPortalCount, portalRenderLimit.newPortalsPerLevel[newMinLevel - 1]);
totalPortalsCount += oldPortalCount + newPortalCount; totalPortalsCount += oldPortalCount + newPortalCount;
if(totalPortalsCount >= MAX_DRAWN_PORTALS) if(totalPortalsCount >= MAX_DRAWN_PORTALS)
break; break;