diff --git a/vtm-android-example/src/org/oscim/android/test/JeoIndoorMapActivity.java b/vtm-android-example/src/org/oscim/android/test/JeoIndoorMapActivity.java index 65d58437..bfb75c27 100644 --- a/vtm-android-example/src/org/oscim/android/test/JeoIndoorMapActivity.java +++ b/vtm-android-example/src/org/oscim/android/test/JeoIndoorMapActivity.java @@ -9,7 +9,7 @@ import java.util.Arrays; import org.jeo.data.VectorDataset; import org.jeo.map.Style; import org.oscim.layers.OSMIndoorLayer; -import org.oscim.layers.tile.vector.BuildingLayer; +import org.oscim.layers.tile.buildings.BuildingLayer; import org.oscim.layers.tile.vector.labeling.LabelLayer; import org.oscim.test.JeoTest; import org.oscim.theme.VtmThemes; diff --git a/vtm-android-example/src/org/oscim/android/test/OsmJsonMapActivity.java b/vtm-android-example/src/org/oscim/android/test/OsmJsonMapActivity.java index d4561799..1a2b84b5 100644 --- a/vtm-android-example/src/org/oscim/android/test/OsmJsonMapActivity.java +++ b/vtm-android-example/src/org/oscim/android/test/OsmJsonMapActivity.java @@ -18,7 +18,7 @@ import org.oscim.android.MapActivity; import org.oscim.android.MapView; import org.oscim.layers.TileGridLayer; import org.oscim.layers.tile.bitmap.BitmapTileLayer; -import org.oscim.layers.tile.vector.BuildingLayer; +import org.oscim.layers.tile.buildings.BuildingLayer; import org.oscim.layers.tile.vector.VectorTileLayer; import org.oscim.renderer.MapRenderer; import org.oscim.theme.IRenderTheme; diff --git a/vtm-android-example/src/org/oscim/android/test/S3DBMapActivity.java b/vtm-android-example/src/org/oscim/android/test/S3DBMapActivity.java index a56bcea6..70ea4389 100644 --- a/vtm-android-example/src/org/oscim/android/test/S3DBMapActivity.java +++ b/vtm-android-example/src/org/oscim/android/test/S3DBMapActivity.java @@ -2,7 +2,7 @@ package org.oscim.android.test; import org.oscim.android.cache.TileCache; import org.oscim.layers.tile.TileLayer; -import org.oscim.layers.tile.s3db.S3DBLayer; +import org.oscim.layers.tile.buildings.S3DBLayer; import org.oscim.layers.tile.vector.labeling.LabelLayer; import org.oscim.theme.VtmThemes; import org.oscim.tiling.TileSource; diff --git a/vtm-android-example/src/org/oscim/android/test/SimpleMapActivity.java b/vtm-android-example/src/org/oscim/android/test/SimpleMapActivity.java index 00d9357e..45faecc8 100644 --- a/vtm-android-example/src/org/oscim/android/test/SimpleMapActivity.java +++ b/vtm-android-example/src/org/oscim/android/test/SimpleMapActivity.java @@ -15,7 +15,7 @@ * this program. If not, see . */package org.oscim.android.test; -import org.oscim.layers.tile.vector.BuildingLayer; +import org.oscim.layers.tile.buildings.BuildingLayer; import org.oscim.layers.tile.vector.labeling.LabelLayer; import org.oscim.map.Layers; import org.oscim.map.Map; diff --git a/vtm-android-example/src/org/oscim/android/test/ThemeStylerActivity.java b/vtm-android-example/src/org/oscim/android/test/ThemeStylerActivity.java index 2b54f0c8..fc050dc2 100644 --- a/vtm-android-example/src/org/oscim/android/test/ThemeStylerActivity.java +++ b/vtm-android-example/src/org/oscim/android/test/ThemeStylerActivity.java @@ -3,7 +3,7 @@ package org.oscim.android.test; import static org.oscim.utils.ColorUtil.modHsv; import static org.oscim.utils.ColorUtil.shiftHue; -import org.oscim.layers.tile.vector.BuildingLayer; +import org.oscim.layers.tile.buildings.BuildingLayer; import org.oscim.layers.tile.vector.VectorTileLayer; import org.oscim.layers.tile.vector.labeling.LabelLayer; import org.oscim.map.Layers; diff --git a/vtm-android-start/src/org/oscim/android/start/TestActivity.java b/vtm-android-start/src/org/oscim/android/start/TestActivity.java index 85af33f7..72f36951 100644 --- a/vtm-android-start/src/org/oscim/android/start/TestActivity.java +++ b/vtm-android-start/src/org/oscim/android/start/TestActivity.java @@ -1,7 +1,7 @@ package org.oscim.android.start; import org.oscim.android.MapActivity; -import org.oscim.layers.tile.vector.BuildingLayer; +import org.oscim.layers.tile.buildings.BuildingLayer; import org.oscim.layers.tile.vector.VectorTileLayer; import org.oscim.layers.tile.vector.labeling.LabelLayer; import org.oscim.map.Map; diff --git a/vtm-gdx/src/org/oscim/gdx/GdxMap.java b/vtm-gdx/src/org/oscim/gdx/GdxMap.java index fcb62818..dda61619 100644 --- a/vtm-gdx/src/org/oscim/gdx/GdxMap.java +++ b/vtm-gdx/src/org/oscim/gdx/GdxMap.java @@ -17,7 +17,7 @@ package org.oscim.gdx; import org.oscim.layers.TileGridLayer; -import org.oscim.layers.tile.vector.BuildingLayer; +import org.oscim.layers.tile.buildings.BuildingLayer; import org.oscim.layers.tile.vector.VectorTileLayer; import org.oscim.layers.tile.vector.labeling.LabelLayer; import org.oscim.map.Layers; diff --git a/vtm-jeo/src/org/oscim/test/JeoTest.java b/vtm-jeo/src/org/oscim/test/JeoTest.java index d29955a3..2fb5a207 100644 --- a/vtm-jeo/src/org/oscim/test/JeoTest.java +++ b/vtm-jeo/src/org/oscim/test/JeoTest.java @@ -21,7 +21,7 @@ import org.jeo.geojson.GeoJSONReader; import org.jeo.geom.GeomBuilder; import org.jeo.map.Style; import org.oscim.layers.OSMIndoorLayer; -import org.oscim.layers.tile.vector.BuildingLayer; +import org.oscim.layers.tile.buildings.BuildingLayer; import org.oscim.layers.tile.vector.VectorTileLayer; import org.oscim.map.Map; import org.oscim.renderer.MapRenderer; diff --git a/vtm-playground/src/org/oscim/test/MapTest.java b/vtm-playground/src/org/oscim/test/MapTest.java index 9ac5e1ff..fc043900 100644 --- a/vtm-playground/src/org/oscim/test/MapTest.java +++ b/vtm-playground/src/org/oscim/test/MapTest.java @@ -2,6 +2,7 @@ package org.oscim.test; import org.oscim.gdx.GdxMap; import org.oscim.gdx.GdxMapApp; +import org.oscim.layers.tile.buildings.BuildingLayer; import org.oscim.layers.tile.vector.VectorTileLayer; import org.oscim.layers.tile.vector.labeling.LabelLayer; import org.oscim.theme.VtmThemes; @@ -18,7 +19,7 @@ public class MapTest extends GdxMap { VectorTileLayer l = mMap.setBaseMap(new OSciMap4TileSource()); mMap.setTheme(VtmThemes.DEFAULT); - + mMap.layers().add(new BuildingLayer(mMap, l)); mMap.layers().add(new LabelLayer(mMap, l)); mMap.setMapPosition(53.08, 8.82, 1 << 17); diff --git a/vtm-playground/src/org/oscim/test/MeshTest.java b/vtm-playground/src/org/oscim/test/MeshTest.java index 068c7d7a..a2a9ad48 100644 --- a/vtm-playground/src/org/oscim/test/MeshTest.java +++ b/vtm-playground/src/org/oscim/test/MeshTest.java @@ -2,7 +2,7 @@ package org.oscim.test; import org.oscim.gdx.GdxMapApp; import org.oscim.layers.tile.bitmap.BitmapTileLayer; -import org.oscim.layers.tile.s3db.S3DBLayer; +import org.oscim.layers.tile.buildings.S3DBLayer; import org.oscim.tiling.TileSource; import org.oscim.tiling.source.bitmap.DefaultSources; import org.oscim.tiling.source.oscimap4.OSciMap4TileSource; diff --git a/vtm-playground/src/org/oscim/test/gdx/poi3d/Gdx3DTest.java b/vtm-playground/src/org/oscim/test/gdx/poi3d/Gdx3DTest.java index 431d2724..d5d981ec 100644 --- a/vtm-playground/src/org/oscim/test/gdx/poi3d/Gdx3DTest.java +++ b/vtm-playground/src/org/oscim/test/gdx/poi3d/Gdx3DTest.java @@ -2,7 +2,7 @@ package org.oscim.test.gdx.poi3d; import org.oscim.gdx.GdxMap; import org.oscim.gdx.GdxMapApp; -import org.oscim.layers.tile.vector.BuildingLayer; +import org.oscim.layers.tile.buildings.BuildingLayer; import org.oscim.layers.tile.vector.VectorTileLayer; import org.oscim.layers.tile.vector.labeling.LabelLayer; import org.oscim.renderer.MapRenderer; diff --git a/vtm-web-app/src/org/oscim/web/client/GwtMap.java b/vtm-web-app/src/org/oscim/web/client/GwtMap.java index 1428ef13..f092bc6d 100644 --- a/vtm-web-app/src/org/oscim/web/client/GwtMap.java +++ b/vtm-web-app/src/org/oscim/web/client/GwtMap.java @@ -26,8 +26,8 @@ import org.oscim.gdx.client.GwtGdxGraphics; import org.oscim.gdx.client.MapConfig; import org.oscim.gdx.client.MapUrl; import org.oscim.layers.tile.bitmap.BitmapTileLayer; -import org.oscim.layers.tile.s3db.S3DBLayer; -import org.oscim.layers.tile.vector.BuildingLayer; +import org.oscim.layers.tile.buildings.BuildingLayer; +import org.oscim.layers.tile.buildings.S3DBLayer; import org.oscim.layers.tile.vector.VectorTileLayer; import org.oscim.layers.tile.vector.labeling.LabelLayer; import org.oscim.renderer.MapRenderer; diff --git a/vtm-web-js/src/org/oscim/web/js/JsOverlays.java b/vtm-web-js/src/org/oscim/web/js/JsOverlays.java index 2b647706..f3704c64 100644 --- a/vtm-web-js/src/org/oscim/web/js/JsOverlays.java +++ b/vtm-web-js/src/org/oscim/web/js/JsOverlays.java @@ -4,7 +4,7 @@ import org.oscim.core.MapPosition; import org.oscim.layers.GenericLayer; import org.oscim.layers.Layer; import org.oscim.layers.TileGridLayer; -import org.oscim.layers.tile.vector.BuildingLayer; +import org.oscim.layers.tile.buildings.BuildingLayer; import org.oscim.layers.tile.vector.OsmTileLayer; import org.oscim.layers.tile.vector.VectorTileLayer; import org.oscim.layers.tile.vector.labeling.LabelLayer; diff --git a/vtm/src/org/oscim/layers/tile/vector/BuildingLayer.java b/vtm/src/org/oscim/layers/tile/buildings/BuildingLayer.java similarity index 72% rename from vtm/src/org/oscim/layers/tile/vector/BuildingLayer.java rename to vtm/src/org/oscim/layers/tile/buildings/BuildingLayer.java index 283a60bc..51ae59bc 100644 --- a/vtm/src/org/oscim/layers/tile/vector/BuildingLayer.java +++ b/vtm/src/org/oscim/layers/tile/buildings/BuildingLayer.java @@ -14,18 +14,17 @@ * You should have received a copy of the GNU Lesser General Public License along with * this program. If not, see . */ -package org.oscim.layers.tile.vector; +package org.oscim.layers.tile.buildings; import org.oscim.core.MapElement; import org.oscim.core.MercatorProjection; import org.oscim.core.Tag; import org.oscim.layers.Layer; import org.oscim.layers.tile.MapTile; +import org.oscim.layers.tile.vector.VectorTileLayer; import org.oscim.layers.tile.vector.VectorTileLayer.TileLoaderThemeHook; import org.oscim.map.Map; import org.oscim.renderer.ExtrusionRenderer; -import org.oscim.renderer.GLViewport; -import org.oscim.renderer.MapRenderer; import org.oscim.renderer.OffscreenRenderer; import org.oscim.renderer.OffscreenRenderer.Mode; import org.oscim.renderer.elements.ElementLayers; @@ -33,7 +32,6 @@ import org.oscim.renderer.elements.ExtrusionLayer; import org.oscim.renderer.elements.ExtrusionLayers; import org.oscim.theme.styles.ExtrusionStyle; import org.oscim.theme.styles.RenderStyle; -import org.oscim.utils.FastMath; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -46,13 +44,8 @@ public class BuildingLayer extends Layer implements TileLoaderThemeHook { private static final Object BUILDING_DATA = BuildingLayer.class.getName(); - private final int mMinZoom; - private final int mMaxZoom; - private ExtrusionRenderer mExtRenderer; - private final float mFadeTime = 300; - public BuildingLayer(Map map, VectorTileLayer tileLayer) { this(map, tileLayer, MIN_ZOOM, MAX_ZOOM); @@ -70,64 +63,8 @@ public class BuildingLayer extends Layer implements TileLoaderThemeHook { super(map); tileLayer.addHook(this); - mMinZoom = zoomMin; - mMaxZoom = zoomMax; - - mExtRenderer = new ExtrusionRenderer(tileLayer.tileRenderer(), - mMinZoom, mMaxZoom, - false, true) { - private long mStartTime; - - @Override - protected boolean setup() { - mAlpha = 0; - return super.setup(); - } - - @Override - public void update(GLViewport v) { - - 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 (mAlpha < 1) { - //log.debug("fade in {}", mAlpha); - long now = System.currentTimeMillis(); - if (mStartTime == 0) { - mStartTime = now; - } - float a = (now - mStartTime) / mFadeTime; - mAlpha = FastMath.clamp(a, 0, 1); - MapRenderer.animate(); - } else - mStartTime = 0; - } else { - if (mAlpha > 0) { - //log.debug("fade out {} {}", mAlpha, mStartTime); - long now = System.currentTimeMillis(); - if (mStartTime == 0) { - mStartTime = now; - } - long dt = (now - mStartTime); - if (dt > 0) { - float a = 1 - dt / mFadeTime; - mAlpha = FastMath.clamp(a, 0, 1); - } - MapRenderer.animate(); - } else - mStartTime = 0; - } - super.update(v); - } - }; + mExtRenderer = new BuildingRenderer(tileLayer.tileRenderer(), + zoomMin, zoomMax, false, true); if (POST_AA) { OffscreenRenderer or = new OffscreenRenderer(Mode.FXAA); @@ -138,6 +75,7 @@ public class BuildingLayer extends Layer implements TileLoaderThemeHook { } } + /** TileLoaderThemeHook */ @Override public boolean render(MapTile tile, ElementLayers layers, MapElement element, RenderStyle style, int level) { diff --git a/vtm/src/org/oscim/layers/tile/buildings/BuildingRenderer.java b/vtm/src/org/oscim/layers/tile/buildings/BuildingRenderer.java new file mode 100644 index 00000000..42821c07 --- /dev/null +++ b/vtm/src/org/oscim/layers/tile/buildings/BuildingRenderer.java @@ -0,0 +1,204 @@ +package org.oscim.layers.tile.buildings; + +import static org.oscim.layers.tile.MapTile.State.NEW_DATA; +import static org.oscim.layers.tile.MapTile.State.READY; + +import org.oscim.layers.tile.MapTile; +import org.oscim.layers.tile.TileDistanceSort; +import org.oscim.layers.tile.TileRenderer; +import org.oscim.layers.tile.TileSet; +import org.oscim.renderer.ExtrusionRenderer; +import org.oscim.renderer.GLViewport; +import org.oscim.renderer.MapRenderer; +import org.oscim.renderer.elements.ElementLayers; +import org.oscim.renderer.elements.ExtrusionLayers; +import org.oscim.utils.FastMath; + +public class BuildingRenderer extends ExtrusionRenderer { + + private final TileRenderer mTileLayer; + private final TileSet mTileSet; + + private final int mZoomMin; + private final int mZoomMax; + + private final float mFadeInTime = 300; + private final float mFadeOutTime = 500; + + private long mStartTime; + + public BuildingRenderer(TileRenderer tileRenderLayer, int zoomMin, int zoomMax, + boolean mesh, boolean alpha) { + super(mesh, alpha); + + mZoomMax = zoomMax; + mZoomMin = zoomMin; + mTileLayer = tileRenderLayer; + mTileSet = new TileSet(); + } + + @Override + protected boolean setup() { + mAlpha = 0; + return super.setup(); + + } + + @Override + public void update(GLViewport v) { + + int diff = (v.pos.zoomLevel - mZoomMin); + + /* if below min zoom or already faded out */ + if ((diff < -1)) { + setReady(false); + return; + } + + boolean show = diff >= 0; + + if (show) { + if (mAlpha < 1) { + //log.debug("fade in {}", mAlpha); + long now = System.currentTimeMillis(); + if (mStartTime == 0) { + mStartTime = now; + } + float a = (now - mStartTime) / mFadeInTime; + mAlpha = FastMath.clamp(a, 0, 1); + MapRenderer.animate(); + } else + mStartTime = 0; + } else { + if (mAlpha > 0) { + //log.debug("fade out {} {}", mAlpha, mStartTime); + long now = System.currentTimeMillis(); + if (mStartTime == 0) { + mStartTime = now + 200; // delay hide a little + } + long dt = (now - mStartTime); + if (dt > 0) { + float a = 1 - dt / mFadeOutTime; + mAlpha = FastMath.clamp(a, 0, 1); + } + MapRenderer.animate(); + } else + mStartTime = 0; + } + + if (mAlpha == 0 || v.pos.zoomLevel < (mZoomMin - 1)) { + setReady(false); + return; + } + + mTileLayer.getVisibleTiles(mTileSet); + + if (mTileSet.cnt == 0) { + mTileLayer.releaseTiles(mTileSet); + setReady(false); + return; + } + + MapTile[] tiles = mTileSet.tiles; + TileDistanceSort.sort(tiles, 0, mTileSet.cnt); + + /* keep a list of tiles available for rendering */ + if (mExtrusionLayerSet == null || mExtrusionLayerSet.length < mTileSet.cnt * 4) + mExtrusionLayerSet = new ExtrusionLayers[mTileSet.cnt * 4]; + + /* compile one tile max per frame */ + boolean compiled = false; + + int activeTiles = 0; + int zoom = tiles[0].zoomLevel; + + if (zoom >= mZoomMin && zoom <= mZoomMax) { + /* TODO - if tile is not available try parent or children */ + + for (int i = 0; i < mTileSet.cnt; i++) { + ExtrusionLayers els = getLayer(tiles[i]); + if (els == null) + continue; + + if (els.compiled) + mExtrusionLayerSet[activeTiles++] = els; + else if (!compiled && els.compileLayers()) { + mExtrusionLayerSet[activeTiles++] = els; + compiled = true; + } + } + } else if (zoom == mZoomMax + 1) { + /* special case for s3db: render from parent tiles */ + for (int i = 0; i < mTileSet.cnt; i++) { + MapTile t = tiles[i].node.parent(); + + if (t == null) + continue; + + // for (MapTile c : mTiles) + // if (c == t) + // continue O; + + ExtrusionLayers els = getLayer(t); + if (els == null) + continue; + + if (els.compiled) + mExtrusionLayerSet[activeTiles++] = els; + + else if (!compiled && els.compileLayers()) { + mExtrusionLayerSet[activeTiles++] = els; + compiled = true; + } + } + } else if (zoom == mZoomMin - 1) { + /* check if proxy children are ready */ + for (int i = 0; i < mTileSet.cnt; i++) { + MapTile t = tiles[i]; + for (byte j = 0; j < 4; j++) { + if (!t.hasProxy(1 << j)) + continue; + + MapTile c = t.node.child(j); + ExtrusionLayers el = getLayer(c); + + if (el == null || !el.compiled) + continue; + + mExtrusionLayerSet[activeTiles++] = el; + } + } + } + + /* load more tiles on next frame */ + if (compiled) + MapRenderer.animate(); + + mExtrusionLayerCnt = activeTiles; + + //log.debug("active tiles: {}", mExtrusionLayerCnt); + + if (activeTiles == 0) { + mTileLayer.releaseTiles(mTileSet); + setReady(false); + return; + } + setReady(true); + } + + @Override + public void render(GLViewport v) { + super.render(v); + + /* release lock on tile data */ + mTileLayer.releaseTiles(mTileSet); + } + + private static ExtrusionLayers getLayer(MapTile t) { + ElementLayers layers = t.getLayers(); + if (layers != null && !t.state(READY | NEW_DATA)) + return null; + + return BuildingLayer.get(t); + } +} diff --git a/vtm/src/org/oscim/layers/tile/s3db/S3DBLayer.java b/vtm/src/org/oscim/layers/tile/buildings/S3DBLayer.java similarity index 93% rename from vtm/src/org/oscim/layers/tile/s3db/S3DBLayer.java rename to vtm/src/org/oscim/layers/tile/buildings/S3DBLayer.java index 340a7022..4feaba17 100644 --- a/vtm/src/org/oscim/layers/tile/s3db/S3DBLayer.java +++ b/vtm/src/org/oscim/layers/tile/buildings/S3DBLayer.java @@ -1,11 +1,10 @@ -package org.oscim.layers.tile.s3db; +package org.oscim.layers.tile.buildings; import org.oscim.backend.canvas.Color; import org.oscim.layers.tile.TileLayer; import org.oscim.layers.tile.TileManager; import org.oscim.layers.tile.TileRenderer; import org.oscim.map.Map; -import org.oscim.renderer.ExtrusionRenderer; import org.oscim.renderer.GLViewport; import org.oscim.renderer.OffscreenRenderer; import org.oscim.renderer.OffscreenRenderer.Mode; @@ -43,12 +42,11 @@ public class S3DBLayer extends TileLayer { } public static class S3DBRenderer extends TileRenderer { - ExtrusionRenderer mExtRenderer; + BuildingRenderer mExtRenderer; OffscreenRenderer or; public S3DBRenderer() { - mExtRenderer = new ExtrusionRenderer(this, SRC_ZOOM, SRC_ZOOM, - true, false); + mExtRenderer = new BuildingRenderer(this, SRC_ZOOM, SRC_ZOOM, true, false); if (POST_FXAA) { or = new OffscreenRenderer(Mode.FXAA); @@ -76,6 +74,17 @@ public class S3DBLayer extends TileLayer { mExtRenderer.render(v); } } + + @Override + protected boolean setup() { + if (POST_FXAA) { + or.setup(); + } else { + mExtRenderer.setup(); + } + + return super.setup(); + } } static int getColor(String color, boolean roof) { diff --git a/vtm/src/org/oscim/layers/tile/s3db/S3DBTileLoader.java b/vtm/src/org/oscim/layers/tile/buildings/S3DBTileLoader.java similarity index 95% rename from vtm/src/org/oscim/layers/tile/s3db/S3DBTileLoader.java rename to vtm/src/org/oscim/layers/tile/buildings/S3DBTileLoader.java index eeeec45f..db465e5d 100644 --- a/vtm/src/org/oscim/layers/tile/s3db/S3DBTileLoader.java +++ b/vtm/src/org/oscim/layers/tile/buildings/S3DBTileLoader.java @@ -1,6 +1,6 @@ -package org.oscim.layers.tile.s3db; +package org.oscim.layers.tile.buildings; -import static org.oscim.layers.tile.s3db.S3DBLayer.getMaterialColor; +import static org.oscim.layers.tile.buildings.S3DBLayer.getMaterialColor; import org.oscim.backend.canvas.Color; import org.oscim.core.GeometryBuffer; @@ -11,7 +11,6 @@ import org.oscim.core.Tag; import org.oscim.layers.tile.MapTile; import org.oscim.layers.tile.TileLoader; import org.oscim.layers.tile.TileManager; -import org.oscim.layers.tile.vector.BuildingLayer; import org.oscim.renderer.elements.ExtrusionLayer; import org.oscim.renderer.elements.ExtrusionLayers; import org.oscim.tiling.ITileDataSource; diff --git a/vtm/src/org/oscim/renderer/ExtrusionRenderer.java b/vtm/src/org/oscim/renderer/ExtrusionRenderer.java index 7d8406e2..8cae3ea8 100644 --- a/vtm/src/org/oscim/renderer/ExtrusionRenderer.java +++ b/vtm/src/org/oscim/renderer/ExtrusionRenderer.java @@ -16,47 +16,30 @@ */ package org.oscim.renderer; -import static org.oscim.layers.tile.MapTile.State.NEW_DATA; -import static org.oscim.layers.tile.MapTile.State.READY; - import org.oscim.backend.GL20; import org.oscim.core.Tile; -import org.oscim.layers.tile.MapTile; -import org.oscim.layers.tile.TileRenderer; -import org.oscim.layers.tile.TileSet; -import org.oscim.layers.tile.vector.BuildingLayer; -import org.oscim.renderer.elements.ElementLayers; import org.oscim.renderer.elements.ExtrusionLayer; import org.oscim.renderer.elements.ExtrusionLayers; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class ExtrusionRenderer extends LayerRenderer { +public abstract class ExtrusionRenderer extends LayerRenderer { static final Logger log = LoggerFactory.getLogger(ExtrusionRenderer.class); - private final boolean debug = false; + static final boolean debugDraw = false; - private final TileRenderer mTileLayer; - private final int mZoomMin; - private final int mZoomMax; private final boolean drawAlpha; - - protected float mAlpha = 1; private final int mMode; + private Shader mShader; - public ExtrusionRenderer(TileRenderer tileRenderLayer, - int zoomMin, int zoomMax, boolean mesh, boolean alpha) { - mTileLayer = tileRenderLayer; - mTileSet = new TileSet(); - mZoomMin = zoomMin; - mZoomMax = zoomMax; + protected ExtrusionLayers[] mExtrusionLayerSet; + protected int mExtrusionLayerCnt; + protected float mAlpha = 1; + + public ExtrusionRenderer(boolean mesh, boolean alpha) { mMode = mesh ? 1 : 0; drawAlpha = alpha; } - private final TileSet mTileSet; - private ExtrusionLayers[] mExtrusionLayerSet; - private int mExtrusionLayerCnt; - public static class Shader extends GLShader { int uMVP, uColor, uAlpha, uMode, aPos, aLight; @@ -73,124 +56,16 @@ public class ExtrusionRenderer extends LayerRenderer { } } - protected Shader mShader; - @Override protected boolean setup() { if (mMode == 0) mShader = new Shader("extrusion_layer_ext"); else mShader = new Shader("extrusion_layer_mesh"); + return true; } - @Override - public void update(GLViewport v) { - - if (mAlpha == 0 || v.pos.zoomLevel < (mZoomMin - 1)) { - setReady(false); - return; - } - - int activeTiles = 0; - mTileLayer.getVisibleTiles(mTileSet); - MapTile[] tiles = mTileSet.tiles; - - if (mTileSet.cnt == 0) { - mTileLayer.releaseTiles(mTileSet); - setReady(false); - return; - } - - /* keep a list of tiles available for rendering */ - if (mExtrusionLayerSet == null || mExtrusionLayerSet.length < mTileSet.cnt * 4) - mExtrusionLayerSet = new ExtrusionLayers[mTileSet.cnt * 4]; - - int zoom = tiles[0].zoomLevel; - - /* compile one tile max per frame */ - boolean compiled = false; - - if (zoom >= mZoomMin && zoom <= mZoomMax) { - /* TODO - if tile is not available try parent or children */ - - for (int i = 0; i < mTileSet.cnt; i++) { - ExtrusionLayers els = getLayer(tiles[i]); - if (els == null) - continue; - - if (els.compiled) - mExtrusionLayerSet[activeTiles++] = els; - else if (!compiled && els.compileLayers()) { - mExtrusionLayerSet[activeTiles++] = els; - compiled = true; - } - } - } else if (zoom == mZoomMax + 1) { - /* special case for s3db: render from parent tiles */ - for (int i = 0; i < mTileSet.cnt; i++) { - MapTile t = tiles[i].node.parent(); - - if (t == null) - continue; - - // for (MapTile c : mTiles) - // if (c == t) - // continue O; - - ExtrusionLayers els = getLayer(t); - if (els == null) - continue; - - if (els.compiled) - mExtrusionLayerSet[activeTiles++] = els; - - else if (!compiled && els.compileLayers()) { - mExtrusionLayerSet[activeTiles++] = els; - compiled = true; - } - } - } else if (zoom == mZoomMin - 1) { - /* check if proxy children are ready */ - for (int i = 0; i < mTileSet.cnt; i++) { - MapTile t = tiles[i]; - for (byte j = 0; j < 4; j++) { - if (!t.hasProxy(1 << j)) - continue; - - MapTile c = t.node.child(j); - ExtrusionLayers el = getLayer(c); - - if (el == null || !el.compiled) - continue; - - mExtrusionLayerSet[activeTiles++] = el; - } - } - } - - /* load more tiles on next frame */ - if (compiled) - MapRenderer.animate(); - - mExtrusionLayerCnt = activeTiles; - - //log.debug("active tiles: {}", mExtrusionLayerCnt); - - if (activeTiles > 0) - setReady(true); - else - mTileLayer.releaseTiles(mTileSet); - } - - private static ExtrusionLayers getLayer(MapTile t) { - ElementLayers layers = t.getLayers(); - if (layers != null && !t.state(READY | NEW_DATA)) - return null; - - return BuildingLayer.get(t); - } - private void renderCombined(int vertexPointer, ExtrusionLayers els) { if (els.vboIndices == null) return; @@ -222,13 +97,10 @@ public class ExtrusionRenderer extends LayerRenderer { // with alpha... might be faster and would allow postprocessing outlines. ExtrusionLayers[] els = mExtrusionLayerSet; - Shader s = mShader; //[mMode]; + Shader s = mShader; - if (debug) { + if (debugDraw) { s.useProgram(); - - //GLState.useProgram(shaderProgram[mMode]); - GLState.enableVertexArrays(s.aPos, s.aLight); GL.glUniform1i(s.uMode, 0); GLUtils.glUniform4fv(s.uColor, 4, DEBUG_COLOR); @@ -393,10 +265,7 @@ public class ExtrusionRenderer extends LayerRenderer { GL.glDepthMask(false); GL.glDisable(GL20.GL_CULL_FACE); - GL.glBindBuffer(GL20.GL_ELEMENT_ARRAY_BUFFER, 0); - - mTileLayer.releaseTiles(mTileSet); } private static void setMatrix(GLViewport v, ExtrusionLayers l, int delta) { diff --git a/vtm/src/org/oscim/renderer/OffscreenRenderer.java b/vtm/src/org/oscim/renderer/OffscreenRenderer.java index 19a05bf9..621d49b9 100644 --- a/vtm/src/org/oscim/renderer/OffscreenRenderer.java +++ b/vtm/src/org/oscim/renderer/OffscreenRenderer.java @@ -159,6 +159,12 @@ public class OffscreenRenderer extends LayerRenderer { mRenderer = renderer; } + @Override + public boolean setup() { + mRenderer.setup(); + return super.setup(); + } + @Override public void update(GLViewport viewport) { if (texW != viewport.getWidth() || texH != viewport.getHeight()) {