extract compileTileLayers function
This commit is contained in:
parent
a1604b3b33
commit
cf1eb4ada5
@ -75,7 +75,8 @@ public class GLRenderer implements GLSurfaceView.Renderer {
|
|||||||
private static int mBufferMemoryUsage;
|
private static int mBufferMemoryUsage;
|
||||||
|
|
||||||
private static float[] mTileCoords;
|
private static float[] mTileCoords;
|
||||||
//private static float[] mDebugCoords;
|
|
||||||
|
private static float[] mDebugCoords;
|
||||||
|
|
||||||
public class Matrices {
|
public class Matrices {
|
||||||
public final Matrix4 viewproj = new Matrix4();
|
public final Matrix4 viewproj = new Matrix4();
|
||||||
@ -186,6 +187,7 @@ public class GLRenderer implements GLSurfaceView.Renderer {
|
|||||||
|
|
||||||
mMatrices = new Matrices();
|
mMatrices = new Matrices();
|
||||||
mTileCoords = new float[8];
|
mTileCoords = new float[8];
|
||||||
|
mDebugCoords = new float[8];
|
||||||
|
|
||||||
// tile fill coords
|
// tile fill coords
|
||||||
short min = 0;
|
short min = 0;
|
||||||
@ -260,29 +262,6 @@ public class GLRenderer implements GLSurfaceView.Renderer {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void uploadTileData(MapTile tile) {
|
|
||||||
tile.state = STATE_READY;
|
|
||||||
|
|
||||||
if (tile.layers == null)
|
|
||||||
return;
|
|
||||||
|
|
||||||
int newSize = tile.layers.getSize();
|
|
||||||
if (newSize > 0) {
|
|
||||||
|
|
||||||
if (tile.layers.vbo == null)
|
|
||||||
tile.layers.vbo = BufferObject.get(newSize);
|
|
||||||
|
|
||||||
if (!uploadLayers(tile.layers, newSize, true)) {
|
|
||||||
Log.d(TAG, "BUG uploadTileData " + tile + " failed!");
|
|
||||||
|
|
||||||
BufferObject.release(tile.layers.vbo);
|
|
||||||
tile.layers.vbo = null;
|
|
||||||
tile.layers.clear();
|
|
||||||
tile.layers = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void checkBufferUsage(boolean force) {
|
private static void checkBufferUsage(boolean force) {
|
||||||
// try to clear some unused vbo when exceding limit
|
// try to clear some unused vbo when exceding limit
|
||||||
|
|
||||||
@ -327,6 +306,7 @@ public class GLRenderer implements GLSurfaceView.Renderer {
|
|||||||
|
|
||||||
private static Object tilelock = new Object();
|
private static Object tilelock = new Object();
|
||||||
|
|
||||||
|
/** set tile isVisible flag true for tiles that intersect view */
|
||||||
private static void updateTileVisibility() {
|
private static void updateTileVisibility() {
|
||||||
float[] coords = mTileCoords;
|
float[] coords = mTileCoords;
|
||||||
MapPosition pos = mMapPosition;
|
MapPosition pos = mMapPosition;
|
||||||
@ -360,6 +340,80 @@ public class GLRenderer implements GLSurfaceView.Renderer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private static void uploadTileData(MapTile tile) {
|
||||||
|
tile.state = STATE_READY;
|
||||||
|
|
||||||
|
if (tile.layers == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
int newSize = tile.layers.getSize();
|
||||||
|
if (newSize > 0) {
|
||||||
|
|
||||||
|
if (tile.layers.vbo == null)
|
||||||
|
tile.layers.vbo = BufferObject.get(newSize);
|
||||||
|
|
||||||
|
if (!uploadLayers(tile.layers, newSize, true)) {
|
||||||
|
Log.d(TAG, "BUG uploadTileData " + tile + " failed!");
|
||||||
|
|
||||||
|
BufferObject.release(tile.layers.vbo);
|
||||||
|
tile.layers.vbo = null;
|
||||||
|
tile.layers.clear();
|
||||||
|
tile.layers = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** compile tile layer data and upload to VBOs */
|
||||||
|
private static void compileTileLayers(MapTile[] tiles, int tileCnt) {
|
||||||
|
uploadCnt = 0;
|
||||||
|
for (int i = 0; i < tileCnt; i++) {
|
||||||
|
MapTile tile = tiles[i];
|
||||||
|
|
||||||
|
if (!tile.isVisible)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (tile.state == STATE_READY)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (tile.state == STATE_NEW_DATA) {
|
||||||
|
uploadTileData(tile);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tile.holder != null) {
|
||||||
|
// load tile that is referenced by this holder
|
||||||
|
if (tile.holder.state == STATE_NEW_DATA)
|
||||||
|
uploadTileData(tile.holder);
|
||||||
|
|
||||||
|
tile.state = tile.holder.state;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// check near relatives than can serve as proxy
|
||||||
|
if ((tile.proxies & MapTile.PROXY_PARENT) != 0) {
|
||||||
|
MapTile rel = tile.rel.parent.tile;
|
||||||
|
if (rel.state == STATE_NEW_DATA)
|
||||||
|
uploadTileData(rel);
|
||||||
|
|
||||||
|
// dont load child proxies
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int c = 0; c < 4; c++) {
|
||||||
|
if ((tile.proxies & 1 << c) == 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
MapTile rel = tile.rel.child[c].tile;
|
||||||
|
if (rel != null && rel.state == STATE_NEW_DATA)
|
||||||
|
uploadTileData(rel);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (uploadCnt > 0)
|
||||||
|
checkBufferUsage(false);
|
||||||
|
}
|
||||||
|
|
||||||
private static void draw() {
|
private static void draw() {
|
||||||
long start = 0;
|
long start = 0;
|
||||||
|
|
||||||
@ -427,48 +481,7 @@ public class GLRenderer implements GLSurfaceView.Renderer {
|
|||||||
|
|
||||||
tileCnt += mHolderCount;
|
tileCnt += mHolderCount;
|
||||||
|
|
||||||
/* compile layer data and upload to VBOs */
|
compileTileLayers(tiles, tileCnt);
|
||||||
uploadCnt = 0;
|
|
||||||
for (int i = 0; i < tileCnt; i++) {
|
|
||||||
MapTile tile = tiles[i];
|
|
||||||
|
|
||||||
if (!tile.isVisible)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (tile.state == STATE_NEW_DATA) {
|
|
||||||
uploadTileData(tile);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tile.holder != null) {
|
|
||||||
// load tile that is referenced by this holder
|
|
||||||
if (tile.holder.state == STATE_NEW_DATA)
|
|
||||||
uploadTileData(tile.holder);
|
|
||||||
|
|
||||||
tile.state = tile.holder.state;
|
|
||||||
|
|
||||||
} else if (tile.state != STATE_READY) {
|
|
||||||
// check near relatives than can serve as proxy
|
|
||||||
if ((tile.proxies & MapTile.PROXY_PARENT) != 0) {
|
|
||||||
MapTile rel = tile.rel.parent.tile;
|
|
||||||
if (rel.state == STATE_NEW_DATA)
|
|
||||||
uploadTileData(rel);
|
|
||||||
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
for (int c = 0; c < 4; c++) {
|
|
||||||
if ((tile.proxies & 1 << c) == 0)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
MapTile rel = tile.rel.child[c].tile;
|
|
||||||
if (rel != null && rel.state == STATE_NEW_DATA)
|
|
||||||
uploadTileData(rel);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (uploadCnt > 0)
|
|
||||||
checkBufferUsage(false);
|
|
||||||
|
|
||||||
tilesChanged |= (uploadCnt > 0);
|
tilesChanged |= (uploadCnt > 0);
|
||||||
|
|
||||||
@ -518,9 +531,7 @@ public class GLRenderer implements GLSurfaceView.Renderer {
|
|||||||
//
|
//
|
||||||
// pos.zoomLevel = -1;
|
// pos.zoomLevel = -1;
|
||||||
// mMapViewPosition.getMapViewProjection(mDebugCoords);
|
// mMapViewPosition.getMapViewProjection(mDebugCoords);
|
||||||
//
|
|
||||||
// PolygonRenderer.debugDraw(mMatrices.viewproj, mDebugCoords, 1);
|
// PolygonRenderer.debugDraw(mMatrices.viewproj, mDebugCoords, 1);
|
||||||
//
|
|
||||||
//}
|
//}
|
||||||
|
|
||||||
if (GlUtils.checkGlOutOfMemory("finish")) {
|
if (GlUtils.checkGlOutOfMemory("finish")) {
|
||||||
@ -586,9 +597,8 @@ public class GLRenderer implements GLSurfaceView.Renderer {
|
|||||||
//if (debugView) {
|
//if (debugView) {
|
||||||
// // modify this to scale only the view, to see better which tiles are
|
// // modify this to scale only the view, to see better which tiles are
|
||||||
// // rendered
|
// // rendered
|
||||||
// Matrix.setIdentityM(mMatrices.mvp, 0);
|
// mMatrices.mvp.setScale(0.5f, 0.5f, 1);
|
||||||
// Matrix.scaleM(mMatrices.mvp, 0, 0.5f, 0.5f, 1);
|
// mMatrices.proj.multiplyMM(mMatrices.mvp, mMatrices.proj);
|
||||||
// Matrix.multiplyMM(mMatrices.proj, 0, mMatrices.mvp, 0, mMatrices.proj, 0);
|
|
||||||
//}
|
//}
|
||||||
|
|
||||||
GLES20.glViewport(0, 0, width, height);
|
GLES20.glViewport(0, 0, width, height);
|
||||||
@ -614,7 +624,7 @@ public class GLRenderer implements GLSurfaceView.Renderer {
|
|||||||
int[] vboIds = new int[1];
|
int[] vboIds = new int[1];
|
||||||
GLES20.glGenBuffers(1, vboIds, 0);
|
GLES20.glGenBuffers(1, vboIds, 0);
|
||||||
mQuadIndicesID = vboIds[0];
|
mQuadIndicesID = vboIds[0];
|
||||||
int maxIndices = maxQuads * 6;
|
int maxIndices = maxQuads * 6;
|
||||||
short[] indices = new short[maxIndices];
|
short[] indices = new short[maxIndices];
|
||||||
for (int i = 0, j = 0; i < maxIndices; i += 6, j += 4) {
|
for (int i = 0, j = 0; i < maxIndices; i += 6, j += 4) {
|
||||||
indices[i + 0] = (short) (j + 0);
|
indices[i + 0] = (short) (j + 0);
|
||||||
@ -635,7 +645,6 @@ public class GLRenderer implements GLSurfaceView.Renderer {
|
|||||||
indices.length * 2, shortBuffer, GLES20.GL_STATIC_DRAW);
|
indices.length * 2, shortBuffer, GLES20.GL_STATIC_DRAW);
|
||||||
GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, 0);
|
GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, 0);
|
||||||
|
|
||||||
|
|
||||||
mBufferMemoryUsage = 0;
|
mBufferMemoryUsage = 0;
|
||||||
mDrawTiles = null;
|
mDrawTiles = null;
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user