wrap Offscreen renderer in S3DB/BuildingLayer
This commit is contained in:
parent
d90a0e9475
commit
a7897427a3
@ -1,10 +1,8 @@
|
|||||||
package org.oscim.android.test;
|
package org.oscim.android.test;
|
||||||
|
|
||||||
import org.oscim.android.cache.TileCache;
|
import org.oscim.android.cache.TileCache;
|
||||||
import org.oscim.layers.GenericLayer;
|
|
||||||
import org.oscim.layers.tile.TileLayer;
|
import org.oscim.layers.tile.TileLayer;
|
||||||
import org.oscim.layers.tile.s3db.S3DBLayer;
|
import org.oscim.layers.tile.s3db.S3DBLayer;
|
||||||
import org.oscim.renderer.OffscreenRenderer;
|
|
||||||
import org.oscim.theme.VtmThemes;
|
import org.oscim.theme.VtmThemes;
|
||||||
import org.oscim.tiling.TileSource;
|
import org.oscim.tiling.TileSource;
|
||||||
import org.oscim.tiling.source.oscimap4.OSciMap4TileSource;
|
import org.oscim.tiling.source.oscimap4.OSciMap4TileSource;
|
||||||
@ -20,6 +18,7 @@ public class S3DBMapActivity extends BaseMapActivity {
|
|||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
|
|
||||||
mMap.setTheme(VtmThemes.DEFAULT);
|
mMap.setTheme(VtmThemes.DEFAULT);
|
||||||
|
|
||||||
//mMap.setTheme(VtmThemes.TRONRENDER);
|
//mMap.setTheme(VtmThemes.TRONRENDER);
|
||||||
//mMap.setTheme(VtmThemes.OSMARENDER);
|
//mMap.setTheme(VtmThemes.OSMARENDER);
|
||||||
|
|
||||||
@ -31,13 +30,15 @@ public class S3DBMapActivity extends BaseMapActivity {
|
|||||||
ts.setCache(mS3dbCache);
|
ts.setCache(mS3dbCache);
|
||||||
}
|
}
|
||||||
TileLayer tl = new S3DBLayer(mMap, ts);
|
TileLayer tl = new S3DBLayer(mMap, ts);
|
||||||
OffscreenRenderer or = new OffscreenRenderer(mMap.getWidth(),
|
//OffscreenRenderer or = new OffscreenRenderer(mMap.getWidth(),
|
||||||
mMap.getHeight());
|
// mMap.getHeight());
|
||||||
or.setRenderer(tl.getRenderer());
|
//or.setRenderer(tl.getRenderer());
|
||||||
mMap.layers().add(tl);
|
mMap.layers().add(tl);
|
||||||
|
|
||||||
mMap.layers().add(new GenericLayer(mMap, or));
|
//mMap.layers().add(new GenericLayer(mMap, or));
|
||||||
mMap.layers().add(new LabelLayer(mMap, mBaseLayer));
|
|
||||||
|
//mMap.layers().add(new LabelLayer(mMap, mBaseLayer));
|
||||||
|
mMap.setMapPosition(53.08, 8.83, Math.pow(2, 17));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -7,6 +7,7 @@ import org.oscim.layers.tile.TileRenderer;
|
|||||||
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.OffscreenRenderer;
|
||||||
import org.oscim.tiling.TileSource;
|
import org.oscim.tiling.TileSource;
|
||||||
import org.oscim.utils.ColorUtil;
|
import org.oscim.utils.ColorUtil;
|
||||||
import org.oscim.utils.ColorsCSS;
|
import org.oscim.utils.ColorsCSS;
|
||||||
@ -41,25 +42,27 @@ public class S3DBLayer extends TileLayer {
|
|||||||
|
|
||||||
public static class S3DBRenderer extends TileRenderer {
|
public static class S3DBRenderer extends TileRenderer {
|
||||||
ExtrusionRenderer mExtRenderer;
|
ExtrusionRenderer mExtRenderer;
|
||||||
|
OffscreenRenderer or;
|
||||||
|
|
||||||
public S3DBRenderer() {
|
public S3DBRenderer() {
|
||||||
mExtRenderer = new ExtrusionRenderer(this, 16, true, false);
|
mExtRenderer = new ExtrusionRenderer(this, 16, true, false);
|
||||||
|
|
||||||
|
or = new OffscreenRenderer();
|
||||||
|
or.setRenderer(mExtRenderer);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected synchronized void update(GLViewport v) {
|
protected synchronized void update(GLViewport v) {
|
||||||
super.update(v);
|
super.update(v);
|
||||||
mExtRenderer.update(v);
|
//mExtRenderer.update(v);
|
||||||
setReady(mExtRenderer.isReady());
|
or.update(v);
|
||||||
|
setReady(or.isReady());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected synchronized void render(GLViewport v) {
|
protected synchronized void render(GLViewport v) {
|
||||||
mExtRenderer.render(v);
|
or.render(v);
|
||||||
}
|
//mExtRenderer.render(v);
|
||||||
|
|
||||||
public synchronized void render2(GLViewport v) {
|
|
||||||
mExtRenderer.render2(v);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -101,7 +104,7 @@ public class S3DBLayer extends TileLayer {
|
|||||||
return Color.LTGRAY;
|
return Color.LTGRAY;
|
||||||
|
|
||||||
if ("transparent" == color)
|
if ("transparent" == color)
|
||||||
return Color.get(128, 128, 128, 128);
|
return Color.get(0, 1, 1, 1);
|
||||||
|
|
||||||
Integer css = ColorsCSS.get(color);
|
Integer css = ColorsCSS.get(color);
|
||||||
|
|
||||||
|
@ -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.OffscreenRenderer;
|
||||||
import org.oscim.renderer.elements.ElementLayers;
|
import org.oscim.renderer.elements.ElementLayers;
|
||||||
import org.oscim.renderer.elements.ExtrusionLayer;
|
import org.oscim.renderer.elements.ExtrusionLayer;
|
||||||
import org.oscim.theme.styles.ExtrusionStyle;
|
import org.oscim.theme.styles.ExtrusionStyle;
|
||||||
@ -35,14 +36,22 @@ public class BuildingLayer extends Layer implements TileLoaderThemeHook {
|
|||||||
//static final Logger log = LoggerFactory.getLogger(BuildingOverlay.class);
|
//static final Logger log = LoggerFactory.getLogger(BuildingOverlay.class);
|
||||||
|
|
||||||
private final static int MIN_ZOOM = 17;
|
private final static int MIN_ZOOM = 17;
|
||||||
|
private final static boolean POST_AA = false;
|
||||||
|
|
||||||
private final int mMinZoom;
|
private final int mMinZoom;
|
||||||
|
private ExtrusionRenderer mExtRenderer;
|
||||||
|
|
||||||
public BuildingLayer(Map map, VectorTileLayer tileLayer) {
|
public BuildingLayer(Map map, VectorTileLayer tileLayer) {
|
||||||
super(map);
|
this(map, tileLayer, MIN_ZOOM);
|
||||||
tileLayer.addHook(this);
|
|
||||||
|
|
||||||
mMinZoom = MIN_ZOOM;
|
// super(map);
|
||||||
mRenderer = new ExtrusionRenderer(tileLayer.tileRenderer(), MIN_ZOOM);
|
// tileLayer.addHook(this);
|
||||||
|
//
|
||||||
|
// mMinZoom = MIN_ZOOM;
|
||||||
|
//
|
||||||
|
// OffscreenRenderer or = new OffscreenRenderer();
|
||||||
|
// or.setRenderer(new ExtrusionRenderer(tileLayer.tileRenderer(), MIN_ZOOM));
|
||||||
|
// mRenderer = or;
|
||||||
}
|
}
|
||||||
|
|
||||||
public BuildingLayer(Map map, VectorTileLayer tileLayer, int minZoom) {
|
public BuildingLayer(Map map, VectorTileLayer tileLayer, int minZoom) {
|
||||||
@ -50,8 +59,7 @@ public class BuildingLayer extends Layer implements TileLoaderThemeHook {
|
|||||||
tileLayer.addHook(this);
|
tileLayer.addHook(this);
|
||||||
|
|
||||||
mMinZoom = minZoom;
|
mMinZoom = minZoom;
|
||||||
mRenderer = new ExtrusionRenderer(tileLayer.tileRenderer(), mMinZoom) {
|
mExtRenderer = new ExtrusionRenderer(tileLayer.tileRenderer(), mMinZoom) {
|
||||||
|
|
||||||
private long mStartTime;
|
private long mStartTime;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -90,6 +98,14 @@ public class BuildingLayer extends Layer implements TileLoaderThemeHook {
|
|||||||
super.update(v);
|
super.update(v);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if (POST_AA) {
|
||||||
|
OffscreenRenderer or = new OffscreenRenderer();
|
||||||
|
or.setRenderer(mExtRenderer);
|
||||||
|
mRenderer = or;
|
||||||
|
} else {
|
||||||
|
mRenderer = mExtRenderer;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private final float mFadeTime = 500;
|
private final float mFadeTime = 500;
|
||||||
|
@ -3,7 +3,6 @@ package org.oscim.renderer;
|
|||||||
import java.nio.IntBuffer;
|
import java.nio.IntBuffer;
|
||||||
|
|
||||||
import org.oscim.backend.GL20;
|
import org.oscim.backend.GL20;
|
||||||
import org.oscim.layers.tile.s3db.S3DBLayer.S3DBRenderer;
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
@ -11,31 +10,15 @@ public class OffscreenRenderer extends LayerRenderer {
|
|||||||
final static Logger log = LoggerFactory.getLogger(OffscreenRenderer.class);
|
final static Logger log = LoggerFactory.getLogger(OffscreenRenderer.class);
|
||||||
|
|
||||||
int fb;
|
int fb;
|
||||||
//int depthRb;
|
|
||||||
int renderTex;
|
int renderTex;
|
||||||
int renderDepth;
|
int renderDepth;
|
||||||
|
|
||||||
int texW;
|
int texW = -1;
|
||||||
int texH;
|
int texH = -1;
|
||||||
|
|
||||||
public OffscreenRenderer(int w, int h) {
|
|
||||||
texW = w;
|
|
||||||
texH = h;
|
|
||||||
}
|
|
||||||
|
|
||||||
int nearestPowerOf2(int x) {
|
|
||||||
--x;
|
|
||||||
x |= x >> 1;
|
|
||||||
x |= x >> 2;
|
|
||||||
x |= x >> 4;
|
|
||||||
x |= x >> 8;
|
|
||||||
x |= x >> 16;
|
|
||||||
return ++x;
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean initialized;
|
boolean initialized;
|
||||||
|
|
||||||
private boolean useDepthTexture = true;
|
private boolean useDepthTexture = false;
|
||||||
|
|
||||||
protected boolean setup1(GLViewport viewport) {
|
protected boolean setup1(GLViewport viewport) {
|
||||||
IntBuffer buf = MapRenderer.getIntBuffer(1);
|
IntBuffer buf = MapRenderer.getIntBuffer(1);
|
||||||
@ -50,11 +33,12 @@ public class OffscreenRenderer extends LayerRenderer {
|
|||||||
GL.glGenTextures(1, buf);
|
GL.glGenTextures(1, buf);
|
||||||
renderTex = buf.get(0);
|
renderTex = buf.get(0);
|
||||||
|
|
||||||
|
GLUtils.checkGlError("0");
|
||||||
|
|
||||||
GL.glBindFramebuffer(GL20.GL_FRAMEBUFFER, fb);
|
GL.glBindFramebuffer(GL20.GL_FRAMEBUFFER, fb);
|
||||||
|
|
||||||
// generate color texture
|
// generate color texture
|
||||||
GL.glBindTexture(GL20.GL_TEXTURE_2D, renderTex);
|
GL.glBindTexture(GL20.GL_TEXTURE_2D, renderTex);
|
||||||
GLUtils.checkGlError("0");
|
|
||||||
|
|
||||||
GLUtils.setTextureParameter(GL20.GL_NEAREST,
|
GLUtils.setTextureParameter(GL20.GL_NEAREST,
|
||||||
GL20.GL_NEAREST,
|
GL20.GL_NEAREST,
|
||||||
@ -69,8 +53,7 @@ public class OffscreenRenderer extends LayerRenderer {
|
|||||||
GL20.GL_COLOR_ATTACHMENT0,
|
GL20.GL_COLOR_ATTACHMENT0,
|
||||||
GL20.GL_TEXTURE_2D,
|
GL20.GL_TEXTURE_2D,
|
||||||
renderTex, 0);
|
renderTex, 0);
|
||||||
|
GLUtils.checkGlError("1");
|
||||||
GLUtils.checkGlError("00");
|
|
||||||
|
|
||||||
if (useDepthTexture) {
|
if (useDepthTexture) {
|
||||||
buf.clear();
|
buf.clear();
|
||||||
@ -81,16 +64,17 @@ public class OffscreenRenderer extends LayerRenderer {
|
|||||||
GL20.GL_NEAREST,
|
GL20.GL_NEAREST,
|
||||||
GL20.GL_CLAMP_TO_EDGE,
|
GL20.GL_CLAMP_TO_EDGE,
|
||||||
GL20.GL_CLAMP_TO_EDGE);
|
GL20.GL_CLAMP_TO_EDGE);
|
||||||
GLUtils.checkGlError("1");
|
|
||||||
|
|
||||||
GL.glTexImage2D(GL20.GL_TEXTURE_2D, 0, GL20.GL_DEPTH_COMPONENT,
|
GL.glTexImage2D(GL20.GL_TEXTURE_2D, 0,
|
||||||
texW, texH, 0, GL20.GL_DEPTH_COMPONENT,
|
GL20.GL_DEPTH_COMPONENT,
|
||||||
|
texW, texH, 0,
|
||||||
|
GL20.GL_DEPTH_COMPONENT,
|
||||||
GL20.GL_UNSIGNED_SHORT, null);
|
GL20.GL_UNSIGNED_SHORT, null);
|
||||||
|
|
||||||
GLUtils.checkGlError("11 " + texW + " / " + texH);
|
GL.glFramebufferTexture2D(GL20.GL_FRAMEBUFFER,
|
||||||
|
GL20.GL_DEPTH_ATTACHMENT,
|
||||||
GL.glFramebufferTexture2D(GL20.GL_FRAMEBUFFER, GL20.GL_DEPTH_ATTACHMENT,
|
GL20.GL_TEXTURE_2D,
|
||||||
GL20.GL_TEXTURE_2D, renderDepth, 0);
|
renderDepth, 0);
|
||||||
} else {
|
} else {
|
||||||
buf.clear();
|
buf.clear();
|
||||||
GL.glGenRenderbuffers(1, buf);
|
GL.glGenRenderbuffers(1, buf);
|
||||||
@ -108,14 +92,14 @@ public class OffscreenRenderer extends LayerRenderer {
|
|||||||
depthRenderbuffer);
|
depthRenderbuffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
GLUtils.checkGlError("111");
|
GLUtils.checkGlError("2");
|
||||||
|
|
||||||
int status = GL.glCheckFramebufferStatus(GL20.GL_FRAMEBUFFER);
|
int status = GL.glCheckFramebufferStatus(GL20.GL_FRAMEBUFFER);
|
||||||
GL.glBindFramebuffer(GL20.GL_FRAMEBUFFER, 0);
|
GL.glBindFramebuffer(GL20.GL_FRAMEBUFFER, 0);
|
||||||
GL.glBindTexture(GL20.GL_TEXTURE_2D, 0);
|
GL.glBindTexture(GL20.GL_TEXTURE_2D, 0);
|
||||||
|
|
||||||
if (status != GL20.GL_FRAMEBUFFER_COMPLETE) {
|
if (status != GL20.GL_FRAMEBUFFER_COMPLETE) {
|
||||||
log.debug("invalid framebuffer!!! " + status);
|
log.debug("invalid framebuffer! " + status);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -159,7 +143,7 @@ public class OffscreenRenderer extends LayerRenderer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void update(GLViewport viewport) {
|
public void update(GLViewport viewport) {
|
||||||
if (!initialized) {
|
if (!initialized) {
|
||||||
setup1(viewport);
|
setup1(viewport);
|
||||||
initialized = true;
|
initialized = true;
|
||||||
@ -169,21 +153,15 @@ public class OffscreenRenderer extends LayerRenderer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void render(GLViewport viewport) {
|
public void render(GLViewport viewport) {
|
||||||
//begin();
|
//begin();
|
||||||
GL.glBindFramebuffer(GL20.GL_FRAMEBUFFER, fb);
|
GL.glBindFramebuffer(GL20.GL_FRAMEBUFFER, fb);
|
||||||
GL.glViewport(0, 0, texW, texH);
|
GL.glViewport(0, 0, texW, texH);
|
||||||
GL.glDepthMask(true);
|
GL.glDepthMask(true);
|
||||||
//GL.glViewport(0, 0, this.texW, this.texH);
|
|
||||||
GL.glClearColor(0, 0, 0, 0);
|
GL.glClearColor(0, 0, 0, 0);
|
||||||
//GL.glDepthRangef(0, 1);
|
|
||||||
//GL.glClearDepthf(1);
|
|
||||||
GL.glClear(GL20.GL_DEPTH_BUFFER_BIT | GL20.GL_COLOR_BUFFER_BIT);
|
GL.glClear(GL20.GL_DEPTH_BUFFER_BIT | GL20.GL_COLOR_BUFFER_BIT);
|
||||||
//GL.glClear(GL20.GL_DEPTH_BUFFER_BIT);
|
|
||||||
|
|
||||||
((S3DBRenderer) mRenderer).render2(viewport);
|
mRenderer.render(viewport);
|
||||||
|
|
||||||
GL.glViewport(0, 0, (int) viewport.getWidth(), (int) viewport.getHeight());
|
|
||||||
|
|
||||||
GL.glBindFramebuffer(GL20.GL_FRAMEBUFFER, 0);
|
GL.glBindFramebuffer(GL20.GL_FRAMEBUFFER, 0);
|
||||||
|
|
||||||
@ -201,21 +179,15 @@ public class OffscreenRenderer extends LayerRenderer {
|
|||||||
|
|
||||||
MapRenderer.bindQuadVertexVBO(hPos, true);
|
MapRenderer.bindQuadVertexVBO(hPos, true);
|
||||||
|
|
||||||
//GL.glUniform2f(hScreen, texW, texH);
|
GL.glUniform2f(hPixel,
|
||||||
GL.glUniform2f(hPixel, (float) (1.0 / texW * 0.5), (float) (1.0 / texH * 0.5));
|
(float) (1.0 / texW * 0.5),
|
||||||
|
(float) (1.0 / texH * 0.5));
|
||||||
|
|
||||||
GLState.enableVertexArrays(hPos, -1);
|
GLState.enableVertexArrays(hPos, -1);
|
||||||
|
|
||||||
GLState.test(false, false);
|
GLState.test(false, false);
|
||||||
GLState.blend(true);
|
GLState.blend(true);
|
||||||
GL.glDrawArrays(GL20.GL_TRIANGLE_STRIP, 0, 4);
|
GL.glDrawArrays(GL20.GL_TRIANGLE_STRIP, 0, 4);
|
||||||
|
|
||||||
GLUtils.checkGlError("....");
|
GLUtils.checkGlError("....");
|
||||||
|
|
||||||
//GL.glDepthRangef(1, -1);
|
|
||||||
//GL.glClearDepthf(1);
|
|
||||||
|
|
||||||
//GL.glActiveTexture(GL20.GL_TEXTURE1);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user