Fix flicker portal in portal render limit handler
Change: Extract portal handle process from "handleDataResponse" to "handlePortalData" Add "action" property to object returned by $.ajax() to identity type of request Delay low level portal render until no active request of map data.
This commit is contained in:
@ -3,9 +3,22 @@
|
||||
// Functions to handle hiding low level portal when portal render
|
||||
// limit is reached.
|
||||
//
|
||||
// After initialized and reset in window.requestData(), portals in
|
||||
// response data will pass to function "pushPortal". Each new portal
|
||||
// not on the map will add 1 to newPortalsPerLevel[portal level].
|
||||
// On initialization, previous minLevel will preserve to previousMinLevel
|
||||
// with zoom level difference.
|
||||
//
|
||||
// After initialized and reset in window.requestData(), "processPortals"
|
||||
// intercept all portals data in "handleDataResponse". Put the count of
|
||||
// new portals to newPortalsPerLevel[portal level]. And split portals
|
||||
// into two parts base on previousMinLevel. Portals with level >=
|
||||
// previousMinLevel will return as result and continue to render.
|
||||
// Others will save to portalsPreviousMinLevel. If there is no more
|
||||
// active request of map data, portals will not split and
|
||||
// portalsPreviousMinLevel will add back to result and render base on
|
||||
// current minLevel.
|
||||
//
|
||||
// "handleFailRequest" is added to handle the case when the last request
|
||||
// failed and "processPortals" didn't get called. It will get
|
||||
// portalsPreviousMinLevel base on current minLevel and render them.
|
||||
//
|
||||
// "getMinLevel" will be called by "getMinPortalLevel" in utils_misc.js
|
||||
// to determine min portal level to draw on map.
|
||||
@ -28,12 +41,25 @@ window.portalRenderLimit = function() {}
|
||||
window.portalRenderLimit.initialized = false;
|
||||
window.portalRenderLimit.minLevelSet = false;
|
||||
window.portalRenderLimit.minLevel = -1;
|
||||
window.portalRenderLimit.previousMinLevel = -1;
|
||||
window.portalRenderLimit.previousZoomLevel;
|
||||
window.portalRenderLimit.newPortalsPerLevel = new Array(MAX_PORTAL_LEVEL + 1);
|
||||
window.portalRenderLimit.portalsPreviousMinLevel = new Array(MAX_PORTAL_LEVEL + 1);
|
||||
|
||||
window.portalRenderLimit.init = function () {
|
||||
var currentZoomLevel = map.getZoom();
|
||||
if(!portalRenderLimit.previousZoomLevel) portalRenderLimit.previousZoomLevel = currentZoomLevel;
|
||||
if(portalRenderLimit.minLevelSet) {
|
||||
var zoomDiff = currentZoomLevel - portalRenderLimit.previousZoomLevel;
|
||||
portalRenderLimit.previousMinLevel = Math.max(portalRenderLimit.minLevel - zoomDiff, -1);
|
||||
portalRenderLimit.previousMinLevel = Math.min(portalRenderLimit.previousMinLevel, MAX_PORTAL_LEVEL);
|
||||
}
|
||||
portalRenderLimit.previousZoomLevel = currentZoomLevel;
|
||||
|
||||
portalRenderLimit.initialized = true;
|
||||
portalRenderLimit.minLevel = -1;
|
||||
portalRenderLimit.resetCounting();
|
||||
portalRenderLimit.resetPortalsPreviousMinLevel();
|
||||
}
|
||||
|
||||
window.portalRenderLimit.resetCounting = function() {
|
||||
@ -43,7 +69,45 @@ window.portalRenderLimit.resetCounting = function() {
|
||||
}
|
||||
}
|
||||
|
||||
window.portalRenderLimit.pushPortal = function(ent) {
|
||||
window.portalRenderLimit.resetPortalsPreviousMinLevel = function() {
|
||||
for(var i = 0; i <= MAX_PORTAL_LEVEL; i++) {
|
||||
portalRenderLimit.portalsPreviousMinLevel[i] = new Array();
|
||||
}
|
||||
}
|
||||
|
||||
window.portalRenderLimit.processPortals = function(ppp) {
|
||||
portalRenderLimit.resetCounting();
|
||||
var resultPortals = new Array();
|
||||
|
||||
$.each(ppp, function(ind, portal) {
|
||||
portalRenderLimit.countPortal(portal);
|
||||
|
||||
if(!portalRenderLimit.isLastRequest()) {
|
||||
var portalLevel = parseInt(getPortalLevel(portal[2]));
|
||||
if(portalLevel < portalRenderLimit.previousMinLevel) {
|
||||
portalRenderLimit.portalsPreviousMinLevel[portalLevel].push(portal);
|
||||
}else{
|
||||
resultPortals.push(portal);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
if(portalRenderLimit.isLastRequest()) {
|
||||
resultPortals = portalRenderLimit.getLowLevelPortals(ppp);
|
||||
portalRenderLimit.resetPortalsPreviousMinLevel();
|
||||
}
|
||||
return resultPortals;
|
||||
}
|
||||
|
||||
window.portalRenderLimit.handleFailRequest = function() {
|
||||
if(portalRenderLimit.isLastRequest()) {
|
||||
var ppp = portalRenderLimit.getLowLevelPortals(null);
|
||||
portalRenderLimit.resetPortalsPreviousMinLevel();
|
||||
handlePortalData(ppp);
|
||||
}
|
||||
}
|
||||
|
||||
window.portalRenderLimit.countPortal = function(ent) {
|
||||
var portalGuid = ent[0];
|
||||
var portalLevel = parseInt(getPortalLevel(ent[2]));
|
||||
var layerGroup = portalsLayers[portalLevel];
|
||||
@ -52,6 +116,27 @@ window.portalRenderLimit.pushPortal = function(ent) {
|
||||
portalRenderLimit.newPortalsPerLevel[portalLevel]++;
|
||||
}
|
||||
|
||||
window.portalRenderLimit.getLowLevelPortals = function(appendTo) {
|
||||
var resultPortals = appendTo ? appendTo : new Array();
|
||||
for(var i = portalRenderLimit.getMinLevel();
|
||||
i < portalRenderLimit.previousMinLevel;
|
||||
i++) {
|
||||
$.merge(resultPortals, portalRenderLimit.portalsPreviousMinLevel[i]);
|
||||
}
|
||||
return resultPortals;
|
||||
}
|
||||
|
||||
window.portalRenderLimit.isLastRequest = function() {
|
||||
var result = true;
|
||||
$.each(window.activeRequests, function(ind, req) {
|
||||
if(req.action === 'getThinnedEntitiesV2') {
|
||||
result = false;
|
||||
return false;
|
||||
}
|
||||
});
|
||||
return result;
|
||||
}
|
||||
|
||||
window.portalRenderLimit.getMinLevel = function() {
|
||||
if(!portalRenderLimit.initialized) return -1;
|
||||
if(!portalRenderLimit.minLevelSet) portalRenderLimit.setMinLevel();
|
||||
|
Reference in New Issue
Block a user