nicer building fade

This commit is contained in:
Hannes Janetzek 2014-05-25 00:23:13 +02:00
parent 6bc3818318
commit 5af831abb5

View File

@ -1,7 +1,9 @@
package org.oscim.layers.tile.buildings; package org.oscim.layers.tile.buildings;
import static java.lang.System.currentTimeMillis;
import static org.oscim.layers.tile.MapTile.State.NEW_DATA; import static org.oscim.layers.tile.MapTile.State.NEW_DATA;
import static org.oscim.layers.tile.MapTile.State.READY; import static org.oscim.layers.tile.MapTile.State.READY;
import static org.oscim.utils.FastMath.clamp;
import org.oscim.layers.tile.MapTile; import org.oscim.layers.tile.MapTile;
import org.oscim.layers.tile.TileDistanceSort; import org.oscim.layers.tile.TileDistanceSort;
@ -12,9 +14,11 @@ import org.oscim.renderer.GLViewport;
import org.oscim.renderer.MapRenderer; import org.oscim.renderer.MapRenderer;
import org.oscim.renderer.elements.ElementLayers; import org.oscim.renderer.elements.ElementLayers;
import org.oscim.renderer.elements.ExtrusionLayers; import org.oscim.renderer.elements.ExtrusionLayers;
import org.oscim.utils.FastMath; import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class BuildingRenderer extends ExtrusionRenderer { public class BuildingRenderer extends ExtrusionRenderer {
static final Logger log = LoggerFactory.getLogger(BuildingRenderer.class);
private final TileRenderer mTileLayer; private final TileRenderer mTileLayer;
private final TileSet mTileSet; private final TileSet mTileSet;
@ -22,10 +26,11 @@ public class BuildingRenderer extends ExtrusionRenderer {
private final int mZoomMin; private final int mZoomMin;
private final int mZoomMax; private final int mZoomMax;
private final float mFadeInTime = 300; private final float mFadeInTime = 250;
private final float mFadeOutTime = 500; private final float mFadeOutTime = 400;
private long mStartTime; private long mAnimTime;
private boolean mShow;
public BuildingRenderer(TileRenderer tileRenderLayer, int zoomMin, int zoomMax, public BuildingRenderer(TileRenderer tileRenderLayer, int zoomMin, int zoomMax,
boolean mesh, boolean alpha) { boolean mesh, boolean alpha) {
@ -50,43 +55,36 @@ public class BuildingRenderer extends ExtrusionRenderer {
int diff = (v.pos.zoomLevel - mZoomMin); int diff = (v.pos.zoomLevel - mZoomMin);
/* if below min zoom or already faded out */ /* if below min zoom or already faded out */
if ((diff < -1)) { if (diff < -1) {
mAlpha = 0;
mShow = false;
setReady(false); setReady(false);
return; return;
} }
boolean show = diff >= 0; if (diff >= 0) {
if (show) {
if (mAlpha < 1) { if (mAlpha < 1) {
//log.debug("fade in {}", mAlpha); long now = currentTimeMillis();
long now = System.currentTimeMillis(); if (!mShow)
if (mStartTime == 0) { mAnimTime = now - (long) (mAlpha * mFadeInTime);
mStartTime = now;
} mShow = true;
float a = (now - mStartTime) / mFadeInTime; mAlpha = clamp((now - mAnimTime) / mFadeInTime, 0, 1);
mAlpha = FastMath.clamp(a, 0, 1);
MapRenderer.animate(); MapRenderer.animate();
} else }
mStartTime = 0;
} else { } else {
if (mAlpha > 0) { if (mAlpha > 0) {
//log.debug("fade out {} {}", mAlpha, mStartTime); long now = currentTimeMillis();
long now = System.currentTimeMillis(); if (mShow)
if (mStartTime == 0) { mAnimTime = now - (long) ((1 - mAlpha) * mFadeOutTime);
mStartTime = now + 200; // delay hide a little
} mShow = false;
long dt = (now - mStartTime); mAlpha = clamp(1 - (now - mAnimTime) / mFadeOutTime, 0, 1);
if (dt > 0) {
float a = 1 - dt / mFadeOutTime;
mAlpha = FastMath.clamp(a, 0, 1);
}
MapRenderer.animate(); MapRenderer.animate();
} else }
mStartTime = 0;
} }
if (mAlpha == 0 || v.pos.zoomLevel < (mZoomMin - 1)) { if (mAlpha == 0) {
setReady(false); setReady(false);
return; return;
} }