rename BaseLayer -> BaseMap

This commit is contained in:
Hannes Janetzek 2013-01-21 03:15:02 +01:00
parent f5e0cce52f
commit 1dd7e3c7a8
2 changed files with 66 additions and 31 deletions

View File

@ -30,8 +30,8 @@ import android.opengl.Matrix;
/** /**
* @author Hannes Janetzek * @author Hannes Janetzek
*/ */
public class BaseLayer { public class BaseMap {
private final static String TAG = BaseLayer.class.getName(); private final static String TAG = BaseMap.class.getName();
// used to not draw a tile twice per frame. // used to not draw a tile twice per frame.
private static int mDrawSerial = 0; private static int mDrawSerial = 0;
@ -47,10 +47,14 @@ public class BaseLayer {
mfProjMatrix[14] = 0; mfProjMatrix[14] = 0;
} }
private static int mDrawCnt;
static void draw(MapTile[] tiles, int tileCnt, MapPosition pos) { static void draw(MapTile[] tiles, int tileCnt, MapPosition pos) {
//long start = SystemClock.uptimeMillis(); //long start = SystemClock.uptimeMillis();
Matrix.multiplyMM(mVPMatrix, 0, mfProjMatrix, 0, pos.viewMatrix, 0); Matrix.multiplyMM(mVPMatrix, 0, mfProjMatrix, 0, pos.viewMatrix, 0);
mDrawCnt = 0;
GLES20.glEnable(GL_POLYGON_OFFSET_FILL); GLES20.glEnable(GL_POLYGON_OFFSET_FILL);
LineRenderer.beginLines(); LineRenderer.beginLines();
for (int i = 0; i < tileCnt; i++) { for (int i = 0; i < tileCnt; i++) {
@ -66,8 +70,15 @@ public class BaseLayer {
for (int i = 0; i < tileCnt; i++) { for (int i = 0; i < tileCnt; i++) {
MapTile t = tiles[i]; MapTile t = tiles[i];
if (t.isVisible && (t.state != STATE_READY) && (t.holder == null)) if (t.isVisible && (t.state != STATE_READY) && (t.holder == null))
drawProxyTile(t, pos); drawProxyTile(t, pos, true);
} }
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);
}
LineRenderer.endLines(); LineRenderer.endLines();
GLES20.glDisable(GL_POLYGON_OFFSET_FILL); GLES20.glDisable(GL_POLYGON_OFFSET_FILL);
@ -106,7 +117,8 @@ public class BaseLayer {
Matrix.multiplyMM(mvp, 0, mVPMatrix, 0, mvp, 0); Matrix.multiplyMM(mvp, 0, mVPMatrix, 0, mvp, 0);
// set depth offset (used for clipping to tile boundaries) // set depth offset (used for clipping to tile boundaries)
GLES20.glPolygonOffset(-1, -GLRenderer.depthOffset(t)); //GLES20.glPolygonOffset(-1, -GLRenderer.depthOffset(t));
GLES20.glPolygonOffset(-1, (mDrawCnt++));
GLES20.glBindBuffer(GL_ARRAY_BUFFER, t.vbo.id); GLES20.glBindBuffer(GL_ARRAY_BUFFER, t.vbo.id);
@ -148,7 +160,7 @@ public class BaseLayer {
// } // }
} }
private static boolean drawProxyChild(MapTile tile, MapPosition pos) { private static int drawProxyChild(MapTile tile, MapPosition pos) {
int drawn = 0; int drawn = 0;
for (int i = 0; i < 4; i++) { for (int i = 0; i < 4; i++) {
if ((tile.proxies & 1 << i) == 0) if ((tile.proxies & 1 << i) == 0)
@ -161,46 +173,64 @@ public class BaseLayer {
drawn++; drawn++;
} }
} }
return drawn == 4; return drawn;
} }
private static void drawProxyTile(MapTile tile, MapPosition pos) { private static void drawProxyTile(MapTile tile, MapPosition pos, boolean parent) {
int diff = pos.zoomLevel - tile.zoomLevel; int diff = pos.zoomLevel - tile.zoomLevel;
boolean drawn = false;
if (pos.scale > 1.5f || diff < 0) { if (pos.scale > 1.5f || diff < 0) {
// prefer drawing children // prefer drawing children
if (!drawProxyChild(tile, pos)) { if (drawProxyChild(tile, pos) == 4)
return;
if (parent) {
// draw parent proxy
if ((tile.proxies & MapTile.PROXY_PARENT) != 0) { if ((tile.proxies & MapTile.PROXY_PARENT) != 0) {
MapTile t = tile.rel.parent.tile; MapTile t = tile.rel.parent.tile;
if (t.state == STATE_READY) { if (t.state == STATE_READY)
drawTile(t, pos); drawTile(t, pos);
drawn = true;
} }
} else if ((tile.proxies & MapTile.PROXY_GRAMPA) != 0) {
// check if parent was already drawn
if ((tile.proxies & MapTile.PROXY_PARENT) != 0) {
MapTile t = tile.rel.parent.tile;
if (t.state == STATE_READY)
return;
} }
if (!drawn && (tile.proxies & MapTile.PROXY_GRAMPA) != 0) {
MapTile t = tile.rel.parent.parent.tile; MapTile t = tile.rel.parent.parent.tile;
if (t.state == STATE_READY) if (t.state == STATE_READY)
drawTile(t, pos); drawTile(t, pos);
}
} }
} else { } else {
// prefer drawing parent // prefer drawing parent
if (parent) {
MapTile t = tile.rel.parent.tile; MapTile t = tile.rel.parent.tile;
if (t != null && t.state == STATE_READY) { if (t != null && t.state == STATE_READY) {
drawTile(t, pos); drawTile(t, pos);
return;
} else if (!drawProxyChild(tile, pos)) { }
if ((tile.proxies & MapTile.PROXY_GRAMPA) != 0) { drawProxyChild(tile, pos);
t = tile.rel.parent.parent.tile;
} else if ((tile.proxies & MapTile.PROXY_GRAMPA) != 0) {
// check if parent was already drawn
if ((tile.proxies & MapTile.PROXY_PARENT) != 0) {
MapTile t = tile.rel.parent.tile;
if (t.state == STATE_READY)
return;
}
// this will do nothing, just to check
if (drawProxyChild(tile, pos) > 0)
return;
MapTile t = tile.rel.parent.parent.tile;
if (t.state == STATE_READY) if (t.state == STATE_READY)
drawTile(t, pos); drawTile(t, pos);
} }
} }
} }
} }
}

View File

@ -82,7 +82,8 @@ public class GLRenderer implements GLSurfaceView.Renderer {
private static float[] mTileCoords = new float[8]; private static float[] mTileCoords = new float[8];
private static float[] mDebugCoords = new float[8]; private static float[] mDebugCoords = new float[8];
private static float[] mClearColor = null; //private
static float[] mClearColor = null;
private static boolean mUpdateColor = false; private static boolean mUpdateColor = false;
// drawlock to synchronize Main- and GL-Thread // drawlock to synchronize Main- and GL-Thread
@ -339,12 +340,14 @@ public class GLRenderer implements GLSurfaceView.Renderer {
if (mUpdateColor) { if (mUpdateColor) {
float cc[] = mClearColor; float cc[] = mClearColor;
GLES20.glClearColor(cc[0], cc[1], cc[2], cc[3]); GLES20.glClearColor(cc[0], cc[1], cc[2], cc[3]);
//GLES20.glClearColor(0.8f, 0.8f, 0.8f, 1);
mUpdateColor = false; mUpdateColor = false;
} }
// Note: it seems faster to also clear the stencil buffer even // Note: it seems faster to also clear the stencil buffer even
// when not needed. probaly otherwise it is masked out from the // when not needed. probaly otherwise it is masked out from the
// depth buffer as they share the same memory region afaik // depth buffer as they share the same memory region afaik
// or for a better reason see OpenGL Insights chapter 23.
GLES20.glDepthMask(true); GLES20.glDepthMask(true);
GLES20.glStencilMask(0xFF); GLES20.glStencilMask(0xFF);
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT
@ -457,7 +460,7 @@ public class GLRenderer implements GLSurfaceView.Renderer {
overlays.get(i).update(mMapPosition, changed, tilesChanged); overlays.get(i).update(mMapPosition, changed, tilesChanged);
/* draw base layer */ /* draw base layer */
BaseLayer.draw(tiles, tileCnt, pos); BaseMap.draw(tiles, tileCnt, pos);
// start drawing while overlays uploading textures, etc // start drawing while overlays uploading textures, etc
GLES20.glFlush(); GLES20.glFlush();
@ -470,6 +473,7 @@ public class GLRenderer implements GLSurfaceView.Renderer {
for (int i = 0, n = overlays.size(); i < n; i++) { for (int i = 0, n = overlays.size(); i < n; i++) {
RenderOverlay renderOverlay = overlays.get(i); RenderOverlay renderOverlay = overlays.get(i);
// helper to compile layers into single vbo
if (renderOverlay.newData) { if (renderOverlay.newData) {
if (renderOverlay.vbo == null) { if (renderOverlay.vbo == null) {
renderOverlay.vbo = BufferObject.get(); renderOverlay.vbo = BufferObject.get();
@ -477,7 +481,6 @@ public class GLRenderer implements GLSurfaceView.Renderer {
if (renderOverlay.vbo == null) if (renderOverlay.vbo == null)
continue; continue;
} }
if (uploadOverlayData(renderOverlay)) if (uploadOverlayData(renderOverlay))
renderOverlay.isReady = true; renderOverlay.isReady = true;
} }
@ -562,9 +565,11 @@ public class GLRenderer implements GLSurfaceView.Renderer {
Matrix.multiplyMM(mProjMatrix, 0, mMVPMatrix, 0, mProjMatrix, 0); Matrix.multiplyMM(mProjMatrix, 0, mMVPMatrix, 0, mProjMatrix, 0);
} }
BaseLayer.setProjection(mProjMatrix); BaseMap.setProjection(mProjMatrix);
GLES20.glViewport(0, 0, width, height); GLES20.glViewport(0, 0, width, height);
//GLES20.glScissor(0, 0, width, height);
//GLES20.glEnable(GLES20.GL_SCISSOR_TEST);
if (!mNewSurface) { if (!mNewSurface) {
mMapView.redrawMap(); mMapView.redrawMap();