wrap Offscreen renderer in S3DB/BuildingLayer

This commit is contained in:
Hannes Janetzek 2014-03-21 00:38:07 +01:00
parent d90a0e9475
commit a7897427a3
4 changed files with 63 additions and 71 deletions

View File

@ -1,10 +1,8 @@
package org.oscim.android.test;
import org.oscim.android.cache.TileCache;
import org.oscim.layers.GenericLayer;
import org.oscim.layers.tile.TileLayer;
import org.oscim.layers.tile.s3db.S3DBLayer;
import org.oscim.renderer.OffscreenRenderer;
import org.oscim.theme.VtmThemes;
import org.oscim.tiling.TileSource;
import org.oscim.tiling.source.oscimap4.OSciMap4TileSource;
@ -20,6 +18,7 @@ public class S3DBMapActivity extends BaseMapActivity {
super.onCreate(savedInstanceState);
mMap.setTheme(VtmThemes.DEFAULT);
//mMap.setTheme(VtmThemes.TRONRENDER);
//mMap.setTheme(VtmThemes.OSMARENDER);
@ -31,13 +30,15 @@ public class S3DBMapActivity extends BaseMapActivity {
ts.setCache(mS3dbCache);
}
TileLayer tl = new S3DBLayer(mMap, ts);
OffscreenRenderer or = new OffscreenRenderer(mMap.getWidth(),
mMap.getHeight());
or.setRenderer(tl.getRenderer());
//OffscreenRenderer or = new OffscreenRenderer(mMap.getWidth(),
// mMap.getHeight());
//or.setRenderer(tl.getRenderer());
mMap.layers().add(tl);
mMap.layers().add(new GenericLayer(mMap, or));
mMap.layers().add(new LabelLayer(mMap, mBaseLayer));
//mMap.layers().add(new GenericLayer(mMap, or));
//mMap.layers().add(new LabelLayer(mMap, mBaseLayer));
mMap.setMapPosition(53.08, 8.83, Math.pow(2, 17));
}
@Override

View File

@ -7,6 +7,7 @@ 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.tiling.TileSource;
import org.oscim.utils.ColorUtil;
import org.oscim.utils.ColorsCSS;
@ -41,25 +42,27 @@ public class S3DBLayer extends TileLayer {
public static class S3DBRenderer extends TileRenderer {
ExtrusionRenderer mExtRenderer;
OffscreenRenderer or;
public S3DBRenderer() {
mExtRenderer = new ExtrusionRenderer(this, 16, true, false);
or = new OffscreenRenderer();
or.setRenderer(mExtRenderer);
}
@Override
protected synchronized void update(GLViewport v) {
super.update(v);
mExtRenderer.update(v);
setReady(mExtRenderer.isReady());
//mExtRenderer.update(v);
or.update(v);
setReady(or.isReady());
}
@Override
protected synchronized void render(GLViewport v) {
mExtRenderer.render(v);
}
public synchronized void render2(GLViewport v) {
mExtRenderer.render2(v);
or.render(v);
//mExtRenderer.render(v);
}
}
@ -101,7 +104,7 @@ public class S3DBLayer extends TileLayer {
return Color.LTGRAY;
if ("transparent" == color)
return Color.get(128, 128, 128, 128);
return Color.get(0, 1, 1, 1);
Integer css = ColorsCSS.get(color);

View File

@ -25,6 +25,7 @@ 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.OffscreenRenderer;
import org.oscim.renderer.elements.ElementLayers;
import org.oscim.renderer.elements.ExtrusionLayer;
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);
private final static int MIN_ZOOM = 17;
private final static boolean POST_AA = false;
private final int mMinZoom;
private ExtrusionRenderer mExtRenderer;
public BuildingLayer(Map map, VectorTileLayer tileLayer) {
super(map);
tileLayer.addHook(this);
this(map, tileLayer, MIN_ZOOM);
mMinZoom = MIN_ZOOM;
mRenderer = new ExtrusionRenderer(tileLayer.tileRenderer(), MIN_ZOOM);
// super(map);
// 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) {
@ -50,8 +59,7 @@ public class BuildingLayer extends Layer implements TileLoaderThemeHook {
tileLayer.addHook(this);
mMinZoom = minZoom;
mRenderer = new ExtrusionRenderer(tileLayer.tileRenderer(), mMinZoom) {
mExtRenderer = new ExtrusionRenderer(tileLayer.tileRenderer(), mMinZoom) {
private long mStartTime;
@Override
@ -90,6 +98,14 @@ public class BuildingLayer extends Layer implements TileLoaderThemeHook {
super.update(v);
}
};
if (POST_AA) {
OffscreenRenderer or = new OffscreenRenderer();
or.setRenderer(mExtRenderer);
mRenderer = or;
} else {
mRenderer = mExtRenderer;
}
}
private final float mFadeTime = 500;

View File

@ -3,7 +3,6 @@ package org.oscim.renderer;
import java.nio.IntBuffer;
import org.oscim.backend.GL20;
import org.oscim.layers.tile.s3db.S3DBLayer.S3DBRenderer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -11,31 +10,15 @@ public class OffscreenRenderer extends LayerRenderer {
final static Logger log = LoggerFactory.getLogger(OffscreenRenderer.class);
int fb;
//int depthRb;
int renderTex;
int renderDepth;
int texW;
int texH;
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;
}
int texW = -1;
int texH = -1;
boolean initialized;
private boolean useDepthTexture = true;
private boolean useDepthTexture = false;
protected boolean setup1(GLViewport viewport) {
IntBuffer buf = MapRenderer.getIntBuffer(1);
@ -50,11 +33,12 @@ public class OffscreenRenderer extends LayerRenderer {
GL.glGenTextures(1, buf);
renderTex = buf.get(0);
GLUtils.checkGlError("0");
GL.glBindFramebuffer(GL20.GL_FRAMEBUFFER, fb);
// generate color texture
GL.glBindTexture(GL20.GL_TEXTURE_2D, renderTex);
GLUtils.checkGlError("0");
GLUtils.setTextureParameter(GL20.GL_NEAREST,
GL20.GL_NEAREST,
@ -69,8 +53,7 @@ public class OffscreenRenderer extends LayerRenderer {
GL20.GL_COLOR_ATTACHMENT0,
GL20.GL_TEXTURE_2D,
renderTex, 0);
GLUtils.checkGlError("00");
GLUtils.checkGlError("1");
if (useDepthTexture) {
buf.clear();
@ -81,16 +64,17 @@ public class OffscreenRenderer extends LayerRenderer {
GL20.GL_NEAREST,
GL20.GL_CLAMP_TO_EDGE,
GL20.GL_CLAMP_TO_EDGE);
GLUtils.checkGlError("1");
GL.glTexImage2D(GL20.GL_TEXTURE_2D, 0, GL20.GL_DEPTH_COMPONENT,
texW, texH, 0, GL20.GL_DEPTH_COMPONENT,
GL.glTexImage2D(GL20.GL_TEXTURE_2D, 0,
GL20.GL_DEPTH_COMPONENT,
texW, texH, 0,
GL20.GL_DEPTH_COMPONENT,
GL20.GL_UNSIGNED_SHORT, null);
GLUtils.checkGlError("11 " + texW + " / " + texH);
GL.glFramebufferTexture2D(GL20.GL_FRAMEBUFFER, GL20.GL_DEPTH_ATTACHMENT,
GL20.GL_TEXTURE_2D, renderDepth, 0);
GL.glFramebufferTexture2D(GL20.GL_FRAMEBUFFER,
GL20.GL_DEPTH_ATTACHMENT,
GL20.GL_TEXTURE_2D,
renderDepth, 0);
} else {
buf.clear();
GL.glGenRenderbuffers(1, buf);
@ -108,14 +92,14 @@ public class OffscreenRenderer extends LayerRenderer {
depthRenderbuffer);
}
GLUtils.checkGlError("111");
GLUtils.checkGlError("2");
int status = GL.glCheckFramebufferStatus(GL20.GL_FRAMEBUFFER);
GL.glBindFramebuffer(GL20.GL_FRAMEBUFFER, 0);
GL.glBindTexture(GL20.GL_TEXTURE_2D, 0);
if (status != GL20.GL_FRAMEBUFFER_COMPLETE) {
log.debug("invalid framebuffer!!! " + status);
log.debug("invalid framebuffer! " + status);
return false;
}
@ -159,7 +143,7 @@ public class OffscreenRenderer extends LayerRenderer {
}
@Override
protected void update(GLViewport viewport) {
public void update(GLViewport viewport) {
if (!initialized) {
setup1(viewport);
initialized = true;
@ -169,21 +153,15 @@ public class OffscreenRenderer extends LayerRenderer {
}
@Override
protected void render(GLViewport viewport) {
public void render(GLViewport viewport) {
//begin();
GL.glBindFramebuffer(GL20.GL_FRAMEBUFFER, fb);
GL.glViewport(0, 0, texW, texH);
GL.glDepthMask(true);
//GL.glViewport(0, 0, this.texW, this.texH);
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);
((S3DBRenderer) mRenderer).render2(viewport);
GL.glViewport(0, 0, (int) viewport.getWidth(), (int) viewport.getHeight());
mRenderer.render(viewport);
GL.glBindFramebuffer(GL20.GL_FRAMEBUFFER, 0);
@ -201,21 +179,15 @@ public class OffscreenRenderer extends LayerRenderer {
MapRenderer.bindQuadVertexVBO(hPos, true);
//GL.glUniform2f(hScreen, texW, texH);
GL.glUniform2f(hPixel, (float) (1.0 / texW * 0.5), (float) (1.0 / texH * 0.5));
GL.glUniform2f(hPixel,
(float) (1.0 / texW * 0.5),
(float) (1.0 / texH * 0.5));
GLState.enableVertexArrays(hPos, -1);
GLState.test(false, false);
GLState.blend(true);
GL.glDrawArrays(GL20.GL_TRIANGLE_STRIP, 0, 4);
GLUtils.checkGlError("....");
//GL.glDepthRangef(1, -1);
//GL.glClearDepthf(1);
//GL.glActiveTexture(GL20.GL_TEXTURE1);
}
}