Merge branch 'tile_fade'

This commit is contained in:
Hannes Janetzek 2014-01-19 22:55:49 +01:00
commit b587990602
5 changed files with 92 additions and 35 deletions

View File

@ -78,10 +78,7 @@ public class VectorTileLayer extends TileLayer<VectorTileLoader> {
mTileLoader.get(i).setTileDataSource(tileDataSource); mTileLoader.get(i).setTileDataSource(tileDataSource);
} }
//mTileManager.setZoomTable(mTileSource.getMapInfo().zoomLevel);
mMap.clearMap(); mMap.clearMap();
resumeLoaders(); resumeLoaders();
return true; return true;
@ -91,12 +88,17 @@ public class VectorTileLayer extends TileLayer<VectorTileLoader> {
* Set {@link IRenderTheme} used by {@link TileLoader} * Set {@link IRenderTheme} used by {@link TileLoader}
*/ */
public void setRenderTheme(IRenderTheme theme) { public void setRenderTheme(IRenderTheme theme) {
// wait for loaders to finish all current jobs to
// not change theme instance hold by loader instance
// while running
pauseLoaders(true); pauseLoaders(true);
mTileManager.clearJobs(); mTileManager.clearJobs();
for (VectorTileLoader g : mTileLoader) for (VectorTileLoader g : mTileLoader)
g.setRenderTheme(theme); g.setRenderTheme(theme);
mRenderLayer.setOverdrawColor(theme.getMapBackground());
resumeLoaders(); resumeLoaders();
} }
} }

View File

@ -280,6 +280,10 @@ public class MapRenderer {
BufferObject.checkBufferUsage(true); BufferObject.checkBufferUsage(true);
// FIXME also throw out some textures etc // FIXME also throw out some textures etc
} }
if (rerender) {
mMap.render();
rerender = false;
}
} }
public static int depthOffset(MapTile t) { public static int depthOffset(MapTile t) {
@ -403,4 +407,13 @@ public class MapRenderer {
GL.glBindBuffer(GL20.GL_ELEMENT_ARRAY_BUFFER, bind ? mQuadIndicesID : 0); GL.glBindBuffer(GL20.GL_ELEMENT_ARRAY_BUFFER, bind ? mQuadIndicesID : 0);
} }
private static boolean rerender;
/**
* Trigger next redraw from GL-Thread. This should be used to animate
* LayerRenderers instead of calling Map.render().
*/
public static void animate() {
rerender = true;
}
} }

View File

@ -432,7 +432,7 @@ public final class PolygonLayer extends RenderElement {
} }
} }
public static void drawOver(Matrices m, int color) { public static void drawOver(Matrices m, int color, float alpha) {
setShader(polyShader, m); setShader(polyShader, m);
/* /*
@ -441,7 +441,7 @@ public final class PolygonLayer extends RenderElement {
*/ */
if (color != 0) { if (color != 0) {
GLUtils.setColor(hPolygonColor[0], color, 1); GLUtils.setColor(hPolygonColor[0], color, alpha);
GLState.blend(true); GLState.blend(true);
} else { } else {
// disable drawing to framebuffer (will be re-enabled in fill) // disable drawing to framebuffer (will be re-enabled in fill)

View File

@ -94,6 +94,7 @@ public class MapTile extends Tile {
* Tile is in view region. Set by TileRenderer. * Tile is in view region. Set by TileRenderer.
*/ */
public boolean isVisible; public boolean isVisible;
public long fadeTime;
/** /**
* Pointer to access relatives in QuadTree * Pointer to access relatives in QuadTree

View File

@ -20,6 +20,7 @@ import static org.oscim.tiling.MapTile.STATE_NEW_DATA;
import static org.oscim.tiling.MapTile.STATE_READY; import static org.oscim.tiling.MapTile.STATE_READY;
import org.oscim.backend.GL20; import org.oscim.backend.GL20;
import org.oscim.backend.canvas.Color;
import org.oscim.core.MapPosition; import org.oscim.core.MapPosition;
import org.oscim.core.Tile; import org.oscim.core.Tile;
import org.oscim.renderer.BufferObject; import org.oscim.renderer.BufferObject;
@ -42,6 +43,8 @@ import org.slf4j.LoggerFactory;
public class TileRenderer extends LayerRenderer { public class TileRenderer extends LayerRenderer {
static final Logger log = LoggerFactory.getLogger(TileRenderer.class); static final Logger log = LoggerFactory.getLogger(TileRenderer.class);
private static final boolean debugOverdraw = false;
private final TileManager mTileManager; private final TileManager mTileManager;
private int mUploadSerial; private int mUploadSerial;
@ -56,16 +59,22 @@ public class TileRenderer extends LayerRenderer {
private int mRenderOverdraw; private int mRenderOverdraw;
private float mRenderAlpha; private float mRenderAlpha;
public void setOverdrawColor(int color) { /**
* Threadsafe
*/
public synchronized void setOverdrawColor(int color) {
mOverdraw = color; mOverdraw = color;
} }
public void setBitmapAlpha(float alpha) { /**
* Threadsafe
*/
public synchronized void setBitmapAlpha(float alpha) {
mAlpha = alpha; mAlpha = alpha;
} }
/** /**
* synced with clearTiles * synced with clearTiles, setOverdrawColor and setBitmapAlpha
*/ */
@Override @Override
protected synchronized void update(MapPosition pos, boolean positionChanged, Matrices m) { protected synchronized void update(MapPosition pos, boolean positionChanged, Matrices m) {
@ -75,15 +84,19 @@ public class TileRenderer extends LayerRenderer {
return; return;
} }
// get current tiles to draw
boolean tilesChanged; boolean tilesChanged;
synchronized (tilelock) { synchronized (tilelock) {
// get current tiles to draw
tilesChanged = mTileManager.getActiveTiles(mDrawTiles); tilesChanged = mTileManager.getActiveTiles(mDrawTiles);
} }
if (mDrawTiles.cnt == 0) if (mDrawTiles.cnt == 0)
return; return;
// keep constant while rendering frame
mRenderAlpha = mAlpha;
mRenderOverdraw = mOverdraw;
int tileCnt = mDrawTiles.cnt; int tileCnt = mDrawTiles.cnt;
MapTile[] tiles = mDrawTiles.tiles; MapTile[] tiles = mDrawTiles.tiles;
@ -93,16 +106,12 @@ public class TileRenderer extends LayerRenderer {
tileCnt += mNumTileHolder; tileCnt += mNumTileHolder;
/* prepare tile for rendering */ // prepare tiles for rendering
if (compileTileLayers(tiles, tileCnt) > 0) { if (compileTileLayers(tiles, tileCnt) > 0) {
mUploadSerial++; mUploadSerial++;
BufferObject.checkBufferUsage(false); BufferObject.checkBufferUsage(false);
} }
// keep constant while rendering frame
mRenderAlpha = mAlpha;
mRenderOverdraw = mOverdraw;
draw(tiles, tileCnt, pos, m); draw(tiles, tileCnt, pos, m);
} }
@ -234,8 +243,8 @@ public class TileRenderer extends LayerRenderer {
tileSet.releaseTiles(); tileSet.releaseTiles();
// ensure same size // ensure same size
if (tileSet.tiles.length != mDrawTiles.tiles.length) { if (tileSet.tiles.length != newTiles.length) {
tileSet.tiles = new MapTile[mDrawTiles.tiles.length]; tileSet.tiles = new MapTile[newTiles.length];
} }
// lock tiles to not be removed from cache // lock tiles to not be removed from cache
@ -282,17 +291,13 @@ public class TileRenderer extends LayerRenderer {
t.isVisible = true; t.isVisible = true;
} }
// add placeholder tiles to show both sides
// of date line. a little too complicated...
int xmax = 1 << mZoom; int xmax = 1 << mZoom;
if (x1 >= 0 && x2 < xmax) if (x1 >= 0 && x2 < xmax)
return; return;
// add placeholder tiles to show both sides O: for (int x = x1; x < x2; x++) {
// of date line. a little too complicated...
for (int x = x1; x < x2; x++) {
MapTile holder = null;
MapTile tile = null;
boolean found = false;
if (x >= 0 && x < xmax) if (x >= 0 && x < xmax)
continue; continue;
@ -306,14 +311,10 @@ public class TileRenderer extends LayerRenderer {
continue; continue;
for (int i = cnt; i < cnt + mNumTileHolder; i++) for (int i = cnt; i < cnt + mNumTileHolder; i++)
if (tiles[i].tileX == x && tiles[i].tileY == y) { if (tiles[i].tileX == x && tiles[i].tileY == y)
found = true; continue O;
break;
}
if (found)
continue;
MapTile tile = null;
for (int i = 0; i < cnt; i++) for (int i = 0; i < cnt; i++)
if (tiles[i].tileX == xx && tiles[i].tileY == y) { if (tiles[i].tileX == xx && tiles[i].tileY == y) {
tile = tiles[i]; tile = tiles[i];
@ -327,7 +328,7 @@ public class TileRenderer extends LayerRenderer {
//log.error(" + mNumTileHolder"); //log.error(" + mNumTileHolder");
break; break;
} }
holder = new MapTile(x, y, (byte) mZoom); MapTile holder = new MapTile(x, y, (byte) mZoom);
holder.isVisible = true; holder.isVisible = true;
holder.holder = tile; holder.holder = tile;
tile.isVisible = true; tile.isVisible = true;
@ -336,6 +337,29 @@ public class TileRenderer extends LayerRenderer {
} }
}; };
private long getMinFade(MapTile t) {
long maxFade = MapRenderer.frametime - 50;
for (int c = 0; c < 4; c++) {
MapTile ci = t.rel.get(c);
if (ci == null)
continue;
if (ci.state == MapTile.STATE_READY || ci.fadeTime > 0)
maxFade = Math.min(maxFade, ci.fadeTime);
}
MapTile p = t.rel.getParent();
if (p != null && (p.state == MapTile.STATE_READY || p.fadeTime > 0)) {
maxFade = Math.min(maxFade, p.fadeTime);
p = p.rel.getParent();
if (p != null && (p.state == MapTile.STATE_READY || p.fadeTime > 0))
maxFade = Math.min(maxFade, p.fadeTime);
}
return maxFade;
}
// Counter increases polygon-offset for each tile drawn. // Counter increases polygon-offset for each tile drawn.
private int mOffsetCnt; private int mOffsetCnt;
@ -368,7 +392,6 @@ public class TileRenderer extends LayerRenderer {
GL.glDepthMask(true); GL.glDepthMask(true);
GL.glClear(GL20.GL_DEPTH_BUFFER_BIT); GL.glClear(GL20.GL_DEPTH_BUFFER_BIT);
GL.glDepthFunc(GL20.GL_LESS); GL.glDepthFunc(GL20.GL_LESS);
// Draw visible tiles // Draw visible tiles
@ -505,7 +528,27 @@ public class TileRenderer extends LayerRenderer {
} }
} }
PolygonLayer.Renderer.drawOver(m, mRenderOverdraw); if (t.fadeTime == 0)
t.fadeTime = getMinFade(t);
if (debugOverdraw) {
if (t.zoomLevel > pos.zoomLevel)
PolygonLayer.Renderer.drawOver(m, Color.BLUE, 0.5f);
else if (t.zoomLevel < pos.zoomLevel)
PolygonLayer.Renderer.drawOver(m, Color.RED, 0.5f);
else
PolygonLayer.Renderer.drawOver(m, Color.GREEN, 0.5f);
return;
}
if (mRenderOverdraw != 0 && MapRenderer.frametime - t.fadeTime < 500) {
float fade = 1 - (MapRenderer.frametime - t.fadeTime) / 500f;
PolygonLayer.Renderer.drawOver(m, mRenderOverdraw, fade * fade);
MapRenderer.animate();
} else {
PolygonLayer.Renderer.drawOver(m, 0, 1);
}
} }
private int drawProxyChild(MapTile tile, MapPosition pos) { private int drawProxyChild(MapTile tile, MapPosition pos) {
@ -590,7 +633,5 @@ public class TileRenderer extends LayerRenderer {
@Override @Override
protected void render(MapPosition position, Matrices matrices) { protected void render(MapPosition position, Matrices matrices) {
// TODO Auto-generated method stub
} }
} }