wrap Offscreen renderer in S3DB/BuildingLayer
This commit is contained in:
parent
d90a0e9475
commit
a7897427a3
@ -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
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user