fix: re-enable building animation

This commit is contained in:
Hannes Janetzek 2014-05-21 13:40:10 +02:00
parent d96e9c4070
commit 5c388e7fcb
2 changed files with 51 additions and 38 deletions

View File

@ -25,6 +25,7 @@ import org.oscim.layers.tile.vector.VectorTileLayer.TileLoaderThemeHook;
import org.oscim.map.Map; import org.oscim.map.Map;
import org.oscim.renderer.ExtrusionRenderer; import org.oscim.renderer.ExtrusionRenderer;
import org.oscim.renderer.GLViewport; import org.oscim.renderer.GLViewport;
import org.oscim.renderer.MapRenderer;
import org.oscim.renderer.OffscreenRenderer; import org.oscim.renderer.OffscreenRenderer;
import org.oscim.renderer.OffscreenRenderer.Mode; import org.oscim.renderer.OffscreenRenderer.Mode;
import org.oscim.renderer.elements.ElementLayers; import org.oscim.renderer.elements.ElementLayers;
@ -32,9 +33,11 @@ import org.oscim.renderer.elements.ExtrusionLayer;
import org.oscim.theme.styles.ExtrusionStyle; import org.oscim.theme.styles.ExtrusionStyle;
import org.oscim.theme.styles.RenderStyle; import org.oscim.theme.styles.RenderStyle;
import org.oscim.utils.FastMath; import org.oscim.utils.FastMath;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class BuildingLayer extends Layer implements TileLoaderThemeHook { public class BuildingLayer extends Layer implements TileLoaderThemeHook {
//static final Logger log = LoggerFactory.getLogger(BuildingOverlay.class); static final Logger log = LoggerFactory.getLogger(BuildingLayer.class);
private final static int MIN_ZOOM = 17; private final static int MIN_ZOOM = 17;
private final static boolean POST_AA = false; private final static boolean POST_AA = false;
@ -42,6 +45,8 @@ public class BuildingLayer extends Layer implements TileLoaderThemeHook {
private final int mMinZoom; private final int mMinZoom;
private ExtrusionRenderer mExtRenderer; private ExtrusionRenderer mExtRenderer;
private final float mFadeTime = 300;
public BuildingLayer(Map map, VectorTileLayer tileLayer) { public BuildingLayer(Map map, VectorTileLayer tileLayer) {
this(map, tileLayer, MIN_ZOOM); this(map, tileLayer, MIN_ZOOM);
@ -63,39 +68,53 @@ public class BuildingLayer extends Layer implements TileLoaderThemeHook {
mExtRenderer = new ExtrusionRenderer(tileLayer.tileRenderer(), mMinZoom) { mExtRenderer = new ExtrusionRenderer(tileLayer.tileRenderer(), mMinZoom) {
private long mStartTime; private long mStartTime;
@Override
protected boolean setup() {
mAlpha = 0;
return super.setup();
}
@Override @Override
public void update(GLViewport v) { public void update(GLViewport v) {
boolean show = v.pos.scale >= (1 << mMinZoom); int diff = (v.pos.zoomLevel - mMinZoom);
/* if below min zoom or already faded out */
if ((diff < -1)) {// || (diff < 0 && mAlpha == 0)){
setReady(false);
return;
}
boolean show = diff >= 0;
if (show) { if (show) {
if (mAlpha < 1) { if (mAlpha < 1) {
//log.debug("fade in {}", mAlpha);
long now = System.currentTimeMillis(); long now = System.currentTimeMillis();
if (mStartTime == 0) { if (mStartTime == 0) {
mStartTime = now; mStartTime = now;
} }
float a = (now - mStartTime) / mFadeTime; float a = (now - mStartTime) / mFadeTime;
mAlpha = FastMath.clamp(a, 0, 1); mAlpha = FastMath.clamp(a, 0, 1);
mMap.render(); MapRenderer.animate();
} else } else
mStartTime = 0; mStartTime = 0;
} else { } else {
if (mAlpha > 0) { if (mAlpha > 0) {
//log.debug("fade out {} {}", mAlpha, mStartTime);
long now = System.currentTimeMillis(); long now = System.currentTimeMillis();
if (mStartTime == 0) { if (mStartTime == 0) {
mStartTime = now + 100; mStartTime = now;
} }
long diff = (now - mStartTime); long dt = (now - mStartTime);
if (diff > 0) { if (dt > 0) {
float a = 1 - diff / mFadeTime; float a = 1 - dt / mFadeTime;
mAlpha = FastMath.clamp(a, 0, 1); mAlpha = FastMath.clamp(a, 0, 1);
} }
mMap.render(); MapRenderer.animate();
} else } else
mStartTime = 0; mStartTime = 0;
} }
//log.debug(show + " > " + mAlpha);
super.update(v); super.update(v);
} }
}; };
@ -109,8 +128,6 @@ public class BuildingLayer extends Layer implements TileLoaderThemeHook {
} }
} }
private final float mFadeTime = 500;
@Override @Override
public boolean render(MapTile tile, ElementLayers layers, MapElement element, public boolean render(MapTile tile, ElementLayers layers, MapElement element,
RenderStyle style, int level) { RenderStyle style, int level) {
@ -150,29 +167,27 @@ public class BuildingLayer extends Layer implements TileLoaderThemeHook {
return true; return true;
} }
//private int multi; // private int multi;
//@Override // @Override
//public boolean onTouchEvent(MotionEvent e) { // public void onInputEvent(Event event, MotionEvent e) {
// int action = e.getAction() & MotionEvent.ACTION_MASK; // int action = e.getAction() & MotionEvent.ACTION_MASK;
// if (action == MotionEvent.ACTION_POINTER_DOWN) { // if (action == MotionEvent.ACTION_POINTER_DOWN) {
// multi++; // multi++;
// } else if (action == MotionEvent.ACTION_POINTER_UP) { // } else if (action == MotionEvent.ACTION_POINTER_UP) {
// multi--; // multi--;
// if (!mActive && mAlpha > 0) { // if (!mActive && mAlpha > 0) {
// // finish hiding // // finish hiding
// //log.debug("add multi hide timer " + mAlpha); // //log.debug("add multi hide timer " + mAlpha);
// addShowTimer(mFadeTime * mAlpha, false); // addShowTimer(mFadeTime * mAlpha, false);
// } // }
// } else if (action == MotionEvent.ACTION_CANCEL) { // } else if (action == MotionEvent.ACTION_CANCEL) {
// multi = 0; // multi = 0;
// log.debug("cancel " + multi); // log.debug("cancel " + multi);
// if (mTimer != null) { // if (mTimer != null) {
// mTimer.cancel(); // mTimer.cancel();
// mTimer = null; // mTimer = null;
// }
// } // }
// } // }
//
// return false;
//}
} }

View File

@ -100,7 +100,7 @@ public class ExtrusionRenderer extends LayerRenderer {
if (!initialized && !initShader()) if (!initialized && !initShader())
return; return;
if (mAlpha == 0 || v.pos.zoomLevel < mTileZoom) { if (mAlpha == 0 || v.pos.zoomLevel < (mTileZoom - 1)) {
setReady(false); setReady(false);
return; return;
} }
@ -184,7 +184,6 @@ public class ExtrusionRenderer extends LayerRenderer {
MapRenderer.animate(); MapRenderer.animate();
mTileCnt = activeTiles; mTileCnt = activeTiles;
//log.debug("" + activeTiles + " " + zoom);
if (activeTiles > 0) if (activeTiles > 0)
setReady(true); setReady(true);
@ -321,8 +320,7 @@ public class ExtrusionRenderer extends LayerRenderer {
GL.glEnable(GL20.GL_CULL_FACE); GL.glEnable(GL20.GL_CULL_FACE);
GL.glDepthFunc(GL20.GL_LESS); GL.glDepthFunc(GL20.GL_LESS);
//GL.glUniform1f(uExtAlpha, mAlpha); GL.glUniform1f(s.uAlpha, mAlpha);
GL.glUniform1f(s.uAlpha, 1);
if (drawAlpha) { if (drawAlpha) {
GL.glColorMask(false, false, false, false); GL.glColorMask(false, false, false, false);