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()) {