remove depth-buffer tile clipping
not needed anymore, yay!
This commit is contained in:
parent
a0111e09b7
commit
f5c162330a
@ -39,7 +39,7 @@ import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
/**
|
||||
* Special Renderer for drawing tile polygons
|
||||
* Special Renderer for drawing tile polygons using a stencil buffer method
|
||||
*/
|
||||
public final class PolygonLayer extends RenderElement {
|
||||
static final Logger log = LoggerFactory.getLogger(PolygonLayer.class);
|
||||
@ -260,8 +260,9 @@ public final class PolygonLayer extends RenderElement {
|
||||
|
||||
GLState.enableVertexArrays(hPolygonVertexPosition[shader], -1);
|
||||
|
||||
GL.glVertexAttribPointer(hPolygonVertexPosition[shader], 2, GL20.GL_SHORT,
|
||||
false, 0, POLYGON_VERTICES_DATA_POS_OFFSET);
|
||||
GL.glVertexAttribPointer(hPolygonVertexPosition[shader], 2,
|
||||
GL20.GL_SHORT, false, 0,
|
||||
POLYGON_VERTICES_DATA_POS_OFFSET);
|
||||
|
||||
m.mvp.setAsUniform(hPolygonMatrix[shader]);
|
||||
}
|
||||
@ -374,14 +375,6 @@ public final class PolygonLayer extends RenderElement {
|
||||
*/
|
||||
static void drawStencilRegion(boolean first) {
|
||||
|
||||
// if (!first) {
|
||||
// GL.glStencilMask(0x7F);
|
||||
// GL.glClear(GL20.GL_STENCIL_BUFFER_BIT);
|
||||
// // disable drawing to color buffer
|
||||
// GL.glColorMask(false, false, false, false);
|
||||
// GL.glStencilFunc(GL_EQUAL, CLIP_BIT, CLIP_BIT);
|
||||
// }
|
||||
|
||||
// disable drawing to color buffer
|
||||
GL.glColorMask(false, false, false, false);
|
||||
|
||||
@ -389,20 +382,6 @@ public final class PolygonLayer extends RenderElement {
|
||||
GL.glStencilMask(0xFF);
|
||||
|
||||
if (first) {
|
||||
// clear previous clip-region from stencil buffer
|
||||
//GL.glClear(GL20.GL_STENCIL_BUFFER_BIT);
|
||||
|
||||
// Draw clip-region into depth and stencil buffer
|
||||
// this is used for tile line and polygon layers.
|
||||
// Depth offset is increased for each tile. Together
|
||||
// with depth test (GL_LESS) this ensures to only
|
||||
// draw where no other tile has drawn yet.
|
||||
GL.glEnable(GL20.GL_POLYGON_OFFSET_FILL);
|
||||
|
||||
// test GL_LESS and write to depth buffer
|
||||
GLState.test(true, true);
|
||||
GL.glDepthMask(true);
|
||||
|
||||
// always pass stencil test and set clip bit
|
||||
GL.glStencilFunc(GL20.GL_ALWAYS, CLIP_BIT, 0x00);
|
||||
} else {
|
||||
@ -418,25 +397,18 @@ public final class PolygonLayer extends RenderElement {
|
||||
GL.glDrawArrays(GL20.GL_TRIANGLE_STRIP, 0, 4);
|
||||
|
||||
if (first) {
|
||||
// dont modify depth buffer
|
||||
GL.glDepthMask(false);
|
||||
// test only stencil
|
||||
GLState.test(false, true);
|
||||
|
||||
GL.glDisable(GL20.GL_POLYGON_OFFSET_FILL);
|
||||
|
||||
GL.glStencilFunc(GL20.GL_EQUAL, CLIP_BIT, CLIP_BIT);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Clear stencilbuffer for a tile region by drawing
|
||||
* a quad with func 'always' and op 'zero'. Using 'color'
|
||||
* and 'alpha' for a fake fade effect.
|
||||
*/
|
||||
public static void drawOver(Matrices m, int color, float alpha) {
|
||||
setShader(polyShader, m);
|
||||
|
||||
/*
|
||||
* clear stencilbuffer (tile region) by drawing
|
||||
* a quad with func 'always' and op 'zero'
|
||||
*/
|
||||
|
||||
if (color != 0) {
|
||||
GLUtils.setColor(hPolygonColor[0], color, alpha);
|
||||
GLState.blend(true);
|
||||
|
||||
@ -25,7 +25,6 @@ import org.oscim.core.MapPosition;
|
||||
import org.oscim.core.Tile;
|
||||
import org.oscim.renderer.BufferObject;
|
||||
import org.oscim.renderer.ElementRenderer;
|
||||
import org.oscim.renderer.GLMatrix;
|
||||
import org.oscim.renderer.LayerRenderer;
|
||||
import org.oscim.renderer.MapRenderer;
|
||||
import org.oscim.renderer.MapRenderer.Matrices;
|
||||
@ -361,15 +360,10 @@ public class TileRenderer extends LayerRenderer {
|
||||
return maxFade;
|
||||
}
|
||||
|
||||
// Counter increases polygon-offset for each tile drawn.
|
||||
private int mOffsetCnt;
|
||||
|
||||
// Current number of frames drawn, used to not draw a
|
||||
// tile twice per frame.
|
||||
private int mDrawSerial = 0;
|
||||
|
||||
private Matrices mMatrices;
|
||||
private final GLMatrix mProjMatrix = new GLMatrix();
|
||||
|
||||
/**
|
||||
* Draw tiles:
|
||||
@ -381,33 +375,23 @@ public class TileRenderer extends LayerRenderer {
|
||||
*/
|
||||
private void draw(MapTile[] tiles, int tileCnt, MapPosition pos, Matrices m) {
|
||||
|
||||
mOffsetCnt = -2048;
|
||||
mMatrices = m;
|
||||
|
||||
mProjMatrix.copy(m.proj);
|
||||
// discard depth projection from tilt, we use depth buffer
|
||||
// for clipping
|
||||
mProjMatrix.setValue(10, 0);
|
||||
mProjMatrix.setValue(14, 0);
|
||||
mProjMatrix.multiplyRhs(m.view);
|
||||
|
||||
GL.glDepthMask(true);
|
||||
GL.glClear(GL20.GL_DEPTH_BUFFER_BIT);
|
||||
GL.glDepthFunc(GL20.GL_LESS);
|
||||
|
||||
// Draw visible tiles
|
||||
/** draw visible tiles */
|
||||
for (int i = 0; i < tileCnt; i++) {
|
||||
MapTile t = tiles[i];
|
||||
if (t.isVisible && t.state == STATE_READY)
|
||||
drawTile(t, pos);
|
||||
}
|
||||
|
||||
/**
|
||||
* draw parent or children as proxy for visibile tiles that dont
|
||||
* have data yet. Proxies are clipped to the region where nothing
|
||||
* was drawn to depth buffer.
|
||||
* TODO draw proxies for placeholder
|
||||
*/
|
||||
double scale = pos.getZoomScale();
|
||||
|
||||
// Draw parent or children as proxy for visibile tiles that dont
|
||||
// have data yet. Proxies are clipped to the region where nothing
|
||||
// was drawn to depth buffer.
|
||||
// TODO draw proxies for placeholder
|
||||
for (int i = 0; i < tileCnt; i++) {
|
||||
MapTile t = tiles[i];
|
||||
if (t.isVisible && (t.state != STATE_READY) && (t.holder == null)) {
|
||||
@ -416,20 +400,18 @@ public class TileRenderer extends LayerRenderer {
|
||||
}
|
||||
}
|
||||
|
||||
// Draw grandparents
|
||||
/** draw grandparents */
|
||||
for (int i = 0; i < tileCnt; i++) {
|
||||
MapTile t = tiles[i];
|
||||
if (t.isVisible && (t.state != STATE_READY) && (t.holder == null))
|
||||
drawProxyTile(t, pos, false, false);
|
||||
}
|
||||
|
||||
// make sure stencil buffer write is disabled
|
||||
/** make sure stencil buffer write is disabled */
|
||||
GL.glStencilMask(0x00);
|
||||
GL.glDepthMask(false);
|
||||
|
||||
mDrawSerial++;
|
||||
|
||||
// clear reference
|
||||
mMatrices = null;
|
||||
}
|
||||
|
||||
@ -465,10 +447,7 @@ public class TileRenderer extends LayerRenderer {
|
||||
|
||||
Matrices m = mMatrices;
|
||||
m.mvp.setTransScale(x, y, scale / MapRenderer.COORD_SCALE);
|
||||
m.mvp.multiplyLhs(mProjMatrix);
|
||||
|
||||
// set depth offset (used for clipping to tile boundaries)
|
||||
GL.glPolygonOffset(0, mOffsetCnt++);
|
||||
m.mvp.multiplyLhs(m.viewproj);
|
||||
|
||||
boolean clipped = false;
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user