remove poly2tri triangulator for now
This commit is contained in:
parent
124624785d
commit
5df4ac883a
@ -24,7 +24,7 @@ class GLMapTile extends MapTile {
|
|||||||
|
|
||||||
LineLayers lineLayers;
|
LineLayers lineLayers;
|
||||||
PolygonLayers polygonLayers;
|
PolygonLayers polygonLayers;
|
||||||
MeshLayers meshLayers;
|
// MeshLayers meshLayers;
|
||||||
|
|
||||||
boolean newData;
|
boolean newData;
|
||||||
boolean loading;
|
boolean loading;
|
||||||
|
|||||||
@ -58,7 +58,7 @@ public class MapGenerator implements IMapGenerator, IRenderCallback, IMapDatabas
|
|||||||
|
|
||||||
private LineLayers mLineLayers;
|
private LineLayers mLineLayers;
|
||||||
private PolygonLayers mPolyLayers;
|
private PolygonLayers mPolyLayers;
|
||||||
private MeshLayers mMeshLayers;
|
// private MeshLayers mMeshLayers;
|
||||||
|
|
||||||
private int mDrawingLayer;
|
private int mDrawingLayer;
|
||||||
private int mLevels;
|
private int mLevels;
|
||||||
@ -365,10 +365,10 @@ public class MapGenerator implements IMapGenerator, IRenderCallback, IMapDatabas
|
|||||||
|
|
||||||
mLineLayers = new LineLayers();
|
mLineLayers = new LineLayers();
|
||||||
mPolyLayers = new PolygonLayers();
|
mPolyLayers = new PolygonLayers();
|
||||||
mMeshLayers = new MeshLayers();
|
// mMeshLayers = new MeshLayers();
|
||||||
mCurrentTile.lineLayers = mLineLayers;
|
mCurrentTile.lineLayers = mLineLayers;
|
||||||
mCurrentTile.polygonLayers = mPolyLayers;
|
mCurrentTile.polygonLayers = mPolyLayers;
|
||||||
mCurrentTile.meshLayers = mMeshLayers;
|
// mCurrentTile.meshLayers = mMeshLayers;
|
||||||
|
|
||||||
firstMatch = true;
|
firstMatch = true;
|
||||||
|
|
||||||
|
|||||||
@ -30,7 +30,6 @@ import static android.opengl.GLES20.GL_SCISSOR_TEST;
|
|||||||
import static android.opengl.GLES20.GL_SRC_ALPHA;
|
import static android.opengl.GLES20.GL_SRC_ALPHA;
|
||||||
import static android.opengl.GLES20.GL_STENCIL_BUFFER_BIT;
|
import static android.opengl.GLES20.GL_STENCIL_BUFFER_BIT;
|
||||||
import static android.opengl.GLES20.GL_STENCIL_TEST;
|
import static android.opengl.GLES20.GL_STENCIL_TEST;
|
||||||
import static android.opengl.GLES20.GL_TRIANGLES;
|
|
||||||
import static android.opengl.GLES20.GL_TRIANGLE_FAN;
|
import static android.opengl.GLES20.GL_TRIANGLE_FAN;
|
||||||
import static android.opengl.GLES20.GL_TRIANGLE_STRIP;
|
import static android.opengl.GLES20.GL_TRIANGLE_STRIP;
|
||||||
import static android.opengl.GLES20.GL_ZERO;
|
import static android.opengl.GLES20.GL_ZERO;
|
||||||
@ -101,7 +100,7 @@ public class MapRenderer implements org.mapsforge.android.IMapRenderer {
|
|||||||
private static final String TAG = "MapRenderer";
|
private static final String TAG = "MapRenderer";
|
||||||
private static final int MB = 1024 * 1024;
|
private static final int MB = 1024 * 1024;
|
||||||
|
|
||||||
private boolean mTriangulate = false;
|
// private boolean mTriangulate = false;
|
||||||
|
|
||||||
private static int CACHE_TILES_MAX = 400;
|
private static int CACHE_TILES_MAX = 400;
|
||||||
private static int CACHE_TILES = CACHE_TILES_MAX;
|
private static int CACHE_TILES = CACHE_TILES_MAX;
|
||||||
@ -693,46 +692,46 @@ public class MapRenderer implements org.mapsforge.android.IMapRenderer {
|
|||||||
|
|
||||||
private int mLastBoundVBO;
|
private int mLastBoundVBO;
|
||||||
|
|
||||||
private boolean drawTriangles(GLMapTile tile, int diff) {
|
// private boolean drawTriangles(GLMapTile tile, int diff) {
|
||||||
|
//
|
||||||
if (tile.meshLayers == null || tile.meshLayers.array == null)
|
// if (tile.meshLayers == null || tile.meshLayers.array == null)
|
||||||
return true;
|
// return true;
|
||||||
|
//
|
||||||
glScissor(tile.sx, tile.sy, tile.sw, tile.sh);
|
// glScissor(tile.sx, tile.sy, tile.sw, tile.sh);
|
||||||
|
//
|
||||||
if (mLastBoundVBO != tile.polygonVBO.id) {
|
// if (mLastBoundVBO != tile.polygonVBO.id) {
|
||||||
mLastBoundVBO = tile.polygonVBO.id;
|
// mLastBoundVBO = tile.polygonVBO.id;
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, tile.polygonVBO.id);
|
// glBindBuffer(GL_ARRAY_BUFFER, tile.polygonVBO.id);
|
||||||
|
//
|
||||||
if (useHalfFloat) {
|
// if (useHalfFloat) {
|
||||||
glVertexAttribPointer(gPolygonVertexPositionHandle, 2,
|
// glVertexAttribPointer(gPolygonVertexPositionHandle, 2,
|
||||||
OES_HALF_FLOAT, false, 0,
|
// OES_HALF_FLOAT, false, 0,
|
||||||
POLYGON_VERTICES_DATA_POS_OFFSET);
|
// POLYGON_VERTICES_DATA_POS_OFFSET);
|
||||||
} else {
|
// } else {
|
||||||
glVertexAttribPointer(gPolygonVertexPositionHandle, 2,
|
// glVertexAttribPointer(gPolygonVertexPositionHandle, 2,
|
||||||
GL_FLOAT, false, 0,
|
// GL_FLOAT, false, 0,
|
||||||
POLYGON_VERTICES_DATA_POS_OFFSET);
|
// POLYGON_VERTICES_DATA_POS_OFFSET);
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
// glBindBuffer(GL_ARRAY_BUFFER, 0);
|
// // glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||||
}
|
// }
|
||||||
setMatrix(tile, diff);
|
// setMatrix(tile, diff);
|
||||||
glUniformMatrix4fv(gPolygonMatrixHandle, 1, false, mMVPMatrix, 0);
|
// glUniformMatrix4fv(gPolygonMatrixHandle, 1, false, mMVPMatrix, 0);
|
||||||
|
//
|
||||||
MeshLayer[] layers = tile.meshLayers.array;
|
// MeshLayer[] layers = tile.meshLayers.array;
|
||||||
|
//
|
||||||
for (int i = 0, n = layers.length; i < n; i++) {
|
// for (int i = 0, n = layers.length; i < n; i++) {
|
||||||
MeshLayer l = layers[i];
|
// MeshLayer l = layers[i];
|
||||||
glUniform4fv(gPolygonColorHandle, 1, l.colors, 0);
|
// glUniform4fv(gPolygonColorHandle, 1, l.colors, 0);
|
||||||
|
//
|
||||||
// glUniform4f(gPolygonColorHandle, 1, 0, 0, 1);
|
// // glUniform4f(gPolygonColorHandle, 1, 0, 0, 1);
|
||||||
|
//
|
||||||
// System.out.println("draw: " + l.offset + " " + l.verticesCnt);
|
// // System.out.println("draw: " + l.offset + " " + l.verticesCnt);
|
||||||
glDrawArrays(GL_TRIANGLES, l.offset, l.verticesCnt);
|
// glDrawArrays(GL_TRIANGLES, l.offset, l.verticesCnt);
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
return true;
|
// return true;
|
||||||
}
|
// }
|
||||||
|
|
||||||
private boolean drawLines(GLMapTile tile, int diff) {
|
private boolean drawLines(GLMapTile tile, int diff) {
|
||||||
float z = 1;
|
float z = 1;
|
||||||
@ -961,37 +960,37 @@ public class MapRenderer implements org.mapsforge.android.IMapRenderer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void drawProxyTriangles(GLMapTile tile) {
|
// private void drawProxyTriangles(GLMapTile tile) {
|
||||||
if (tile.parent != null && tile.parent.isDrawn) {
|
// if (tile.parent != null && tile.parent.isDrawn) {
|
||||||
tile.parent.sx = tile.sx;
|
// tile.parent.sx = tile.sx;
|
||||||
tile.parent.sy = tile.sy;
|
// tile.parent.sy = tile.sy;
|
||||||
tile.parent.sw = tile.sw;
|
// tile.parent.sw = tile.sw;
|
||||||
tile.parent.sh = tile.sh;
|
// tile.parent.sh = tile.sh;
|
||||||
drawTriangles(tile.parent, -1);
|
// drawTriangles(tile.parent, -1);
|
||||||
} else {
|
// } else {
|
||||||
int drawn = 0;
|
// int drawn = 0;
|
||||||
|
//
|
||||||
for (int i = 0; i < 4; i++) {
|
// for (int i = 0; i < 4; i++) {
|
||||||
GLMapTile c = tile.child[i];
|
// GLMapTile c = tile.child[i];
|
||||||
|
//
|
||||||
if (c != null && c.isDrawn && setTileScissor(c, 2)) {
|
// if (c != null && c.isDrawn && setTileScissor(c, 2)) {
|
||||||
drawTriangles(c, 1);
|
// drawTriangles(c, 1);
|
||||||
drawn++;
|
// drawn++;
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
if (drawn < 4 && tile.parent != null) {
|
// if (drawn < 4 && tile.parent != null) {
|
||||||
GLMapTile p = tile.parent.parent;
|
// GLMapTile p = tile.parent.parent;
|
||||||
if (p != null && p.isDrawn) {
|
// if (p != null && p.isDrawn) {
|
||||||
p.sx = tile.sx;
|
// p.sx = tile.sx;
|
||||||
p.sy = tile.sy;
|
// p.sy = tile.sy;
|
||||||
p.sw = tile.sw;
|
// p.sw = tile.sw;
|
||||||
p.sh = tile.sh;
|
// p.sh = tile.sh;
|
||||||
drawTriangles(p, -2);
|
// drawTriangles(p, -2);
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|
||||||
private int uploadCnt = 0;
|
private int uploadCnt = 0;
|
||||||
|
|
||||||
@ -1048,68 +1047,68 @@ public class MapRenderer implements org.mapsforge.android.IMapRenderer {
|
|||||||
tile.lineLayers = null;
|
tile.lineLayers = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!mTriangulate) {
|
// if (!mTriangulate) {
|
||||||
if (useHalfFloat)
|
if (useHalfFloat)
|
||||||
shortBuffer[uploadCnt * 2 + 1] = tile.polygonLayers
|
shortBuffer[uploadCnt * 2 + 1] = tile.polygonLayers
|
||||||
.compileLayerData(shortBuffer[uploadCnt * 2 + 1]);
|
.compileLayerData(shortBuffer[uploadCnt * 2 + 1]);
|
||||||
else
|
else
|
||||||
floatBuffer[uploadCnt * 2 + 1] = tile.polygonLayers
|
floatBuffer[uploadCnt * 2 + 1] = tile.polygonLayers
|
||||||
.compileLayerData(floatBuffer[uploadCnt * 2 + 1]);
|
.compileLayerData(floatBuffer[uploadCnt * 2 + 1]);
|
||||||
|
|
||||||
// Upload polygon data to vertex buffer object
|
// Upload polygon data to vertex buffer object
|
||||||
if (tile.polygonLayers.size > 0) {
|
if (tile.polygonLayers.size > 0) {
|
||||||
mBufferMemoryUsage -= tile.polygonVBO.size;
|
mBufferMemoryUsage -= tile.polygonVBO.size;
|
||||||
|
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, tile.polygonVBO.id);
|
glBindBuffer(GL_ARRAY_BUFFER, tile.polygonVBO.id);
|
||||||
// glBufferData(GL_ARRAY_BUFFER, 0, null,
|
// glBufferData(GL_ARRAY_BUFFER, 0, null,
|
||||||
// GL_DYNAMIC_DRAW);
|
// GL_DYNAMIC_DRAW);
|
||||||
|
|
||||||
if (useHalfFloat) {
|
|
||||||
tile.polygonVBO.size = tile.polygonLayers.size * SHORT_BYTES;
|
|
||||||
glBufferData(GL_ARRAY_BUFFER, tile.polygonVBO.size,
|
|
||||||
shortBuffer[uploadCnt * 2 + 1], GL_DYNAMIC_DRAW);
|
|
||||||
} else {
|
|
||||||
tile.polygonVBO.size = tile.polygonLayers.size * FLOAT_BYTES;
|
|
||||||
glBufferData(GL_ARRAY_BUFFER, tile.polygonVBO.size,
|
|
||||||
floatBuffer[uploadCnt * 2 + 1], GL_DYNAMIC_DRAW);
|
|
||||||
}
|
|
||||||
mBufferMemoryUsage += tile.polygonVBO.size;
|
|
||||||
|
|
||||||
|
if (useHalfFloat) {
|
||||||
|
tile.polygonVBO.size = tile.polygonLayers.size * SHORT_BYTES;
|
||||||
|
glBufferData(GL_ARRAY_BUFFER, tile.polygonVBO.size,
|
||||||
|
shortBuffer[uploadCnt * 2 + 1], GL_DYNAMIC_DRAW);
|
||||||
} else {
|
} else {
|
||||||
tile.polygonLayers = null;
|
tile.polygonVBO.size = tile.polygonLayers.size * FLOAT_BYTES;
|
||||||
}
|
glBufferData(GL_ARRAY_BUFFER, tile.polygonVBO.size,
|
||||||
}
|
floatBuffer[uploadCnt * 2 + 1], GL_DYNAMIC_DRAW);
|
||||||
else {
|
|
||||||
if (useHalfFloat)
|
|
||||||
shortBuffer[uploadCnt * 2 + 1] = tile.meshLayers
|
|
||||||
.compileLayerData(shortBuffer[uploadCnt * 2 + 1]);
|
|
||||||
else
|
|
||||||
floatBuffer[uploadCnt * 2 + 1] = tile.meshLayers
|
|
||||||
.compileLayerData(floatBuffer[uploadCnt * 2 + 1]);
|
|
||||||
|
|
||||||
// Upload triangle data to vertex buffer object
|
|
||||||
if (tile.meshLayers.size > 0) {
|
|
||||||
mBufferMemoryUsage -= tile.polygonVBO.size;
|
|
||||||
|
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, tile.polygonVBO.id);
|
|
||||||
// glBufferData(GL_ARRAY_BUFFER, 0, null,
|
|
||||||
// GL_DYNAMIC_DRAW);
|
|
||||||
|
|
||||||
if (useHalfFloat) {
|
|
||||||
tile.polygonVBO.size = tile.meshLayers.size * SHORT_BYTES;
|
|
||||||
glBufferData(GL_ARRAY_BUFFER, tile.polygonVBO.size,
|
|
||||||
shortBuffer[uploadCnt * 2 + 1], GL_DYNAMIC_DRAW);
|
|
||||||
} else {
|
|
||||||
tile.polygonVBO.size = tile.meshLayers.size * FLOAT_BYTES;
|
|
||||||
glBufferData(GL_ARRAY_BUFFER, tile.polygonVBO.size,
|
|
||||||
floatBuffer[uploadCnt * 2 + 1], GL_DYNAMIC_DRAW);
|
|
||||||
}
|
|
||||||
mBufferMemoryUsage += tile.polygonVBO.size;
|
|
||||||
|
|
||||||
} else {
|
|
||||||
tile.meshLayers = null;
|
|
||||||
}
|
}
|
||||||
|
mBufferMemoryUsage += tile.polygonVBO.size;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
tile.polygonLayers = null;
|
||||||
}
|
}
|
||||||
|
// }
|
||||||
|
// else {
|
||||||
|
// if (useHalfFloat)
|
||||||
|
// shortBuffer[uploadCnt * 2 + 1] = tile.meshLayers
|
||||||
|
// .compileLayerData(shortBuffer[uploadCnt * 2 + 1]);
|
||||||
|
// else
|
||||||
|
// floatBuffer[uploadCnt * 2 + 1] = tile.meshLayers
|
||||||
|
// .compileLayerData(floatBuffer[uploadCnt * 2 + 1]);
|
||||||
|
//
|
||||||
|
// // Upload triangle data to vertex buffer object
|
||||||
|
// if (tile.meshLayers.size > 0) {
|
||||||
|
// mBufferMemoryUsage -= tile.polygonVBO.size;
|
||||||
|
//
|
||||||
|
// glBindBuffer(GL_ARRAY_BUFFER, tile.polygonVBO.id);
|
||||||
|
// // glBufferData(GL_ARRAY_BUFFER, 0, null,
|
||||||
|
// // GL_DYNAMIC_DRAW);
|
||||||
|
//
|
||||||
|
// if (useHalfFloat) {
|
||||||
|
// tile.polygonVBO.size = tile.meshLayers.size * SHORT_BYTES;
|
||||||
|
// glBufferData(GL_ARRAY_BUFFER, tile.polygonVBO.size,
|
||||||
|
// shortBuffer[uploadCnt * 2 + 1], GL_DYNAMIC_DRAW);
|
||||||
|
// } else {
|
||||||
|
// tile.polygonVBO.size = tile.meshLayers.size * FLOAT_BYTES;
|
||||||
|
// glBufferData(GL_ARRAY_BUFFER, tile.polygonVBO.size,
|
||||||
|
// floatBuffer[uploadCnt * 2 + 1], GL_DYNAMIC_DRAW);
|
||||||
|
// }
|
||||||
|
// mBufferMemoryUsage += tile.polygonVBO.size;
|
||||||
|
//
|
||||||
|
// } else {
|
||||||
|
// tile.meshLayers = null;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
tile.newData = false;
|
tile.newData = false;
|
||||||
tile.isDrawn = true;
|
tile.isDrawn = true;
|
||||||
tile.isLoading = false;
|
tile.isLoading = false;
|
||||||
@ -1235,39 +1234,39 @@ public class MapRenderer implements org.mapsforge.android.IMapRenderer {
|
|||||||
glUseProgram(gPolygonProgram);
|
glUseProgram(gPolygonProgram);
|
||||||
glEnableVertexAttribArray(gPolygonVertexPositionHandle);
|
glEnableVertexAttribArray(gPolygonVertexPositionHandle);
|
||||||
|
|
||||||
if (!mTriangulate) {
|
// if (!mTriangulate) {
|
||||||
glDisable(GL_BLEND);
|
glDisable(GL_BLEND);
|
||||||
// Draw Polygons
|
// Draw Polygons
|
||||||
glEnable(GL_STENCIL_TEST);
|
glEnable(GL_STENCIL_TEST);
|
||||||
|
|
||||||
// glEnableVertexAttribArray(gPolygonVertexPositionHandle);
|
// glEnableVertexAttribArray(gPolygonVertexPositionHandle);
|
||||||
|
|
||||||
for (int i = 0; i < tileCnt; i++) {
|
for (int i = 0; i < tileCnt; i++) {
|
||||||
if (tiles[i].isVisible) {
|
if (tiles[i].isVisible) {
|
||||||
GLMapTile tile = tiles[i];
|
GLMapTile tile = tiles[i];
|
||||||
|
|
||||||
if (tile.isDrawn)
|
if (tile.isDrawn)
|
||||||
drawPolygons(tile, 0);
|
drawPolygons(tile, 0);
|
||||||
else
|
else
|
||||||
drawProxyPolygons(tile);
|
drawProxyPolygons(tile);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
// GlUtils.checkGlError("polygons");
|
|
||||||
glDisable(GL_STENCIL_TEST);
|
|
||||||
} else {
|
|
||||||
// Draw Triangles
|
|
||||||
for (int i = 0; i < tileCnt; i++) {
|
|
||||||
if (tiles[i].isVisible) {
|
|
||||||
GLMapTile tile = tiles[i];
|
|
||||||
|
|
||||||
if (tile.isDrawn)
|
|
||||||
drawTriangles(tile, 0);
|
|
||||||
else
|
|
||||||
drawProxyTriangles(tile);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// GlUtils.checkGlError("triangles");
|
|
||||||
}
|
}
|
||||||
|
// GlUtils.checkGlError("polygons");
|
||||||
|
glDisable(GL_STENCIL_TEST);
|
||||||
|
// } else {
|
||||||
|
// // Draw Triangles
|
||||||
|
// for (int i = 0; i < tileCnt; i++) {
|
||||||
|
// if (tiles[i].isVisible) {
|
||||||
|
// GLMapTile tile = tiles[i];
|
||||||
|
//
|
||||||
|
// if (tile.isDrawn)
|
||||||
|
// drawTriangles(tile, 0);
|
||||||
|
// else
|
||||||
|
// drawProxyTriangles(tile);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// // GlUtils.checkGlError("triangles");
|
||||||
|
// }
|
||||||
// required on GalaxyII, Android 2.3.3 (cant just VAA enable once...)
|
// required on GalaxyII, Android 2.3.3 (cant just VAA enable once...)
|
||||||
glDisableVertexAttribArray(gPolygonVertexPositionHandle);
|
glDisableVertexAttribArray(gPolygonVertexPositionHandle);
|
||||||
|
|
||||||
|
|||||||
@ -1,68 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2010, 2011, 2012 Hannes Janetzek
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify it under the
|
|
||||||
* terms of the GNU Lesser General Public License as published by the Free Software
|
|
||||||
* Foundation, either version 3 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
||||||
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
|
||||||
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public License along with
|
|
||||||
* this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
package org.mapsforge.android.glrenderer;
|
|
||||||
|
|
||||||
import java.util.LinkedList;
|
|
||||||
|
|
||||||
import org.poly2tri.Poly2Tri;
|
|
||||||
import org.poly2tri.geometry.polygon.Polygon;
|
|
||||||
import org.poly2tri.geometry.polygon.PolygonPoint;
|
|
||||||
import org.poly2tri.triangulation.delaunay.DelaunayTriangle;
|
|
||||||
|
|
||||||
public class MeshLayer extends Layer {
|
|
||||||
|
|
||||||
MeshLayer(int l, int color) {
|
|
||||||
super(l, color);
|
|
||||||
|
|
||||||
curItem = LayerPool.get();
|
|
||||||
pool = new LinkedList<PoolItem>();
|
|
||||||
pool.add(curItem);
|
|
||||||
}
|
|
||||||
|
|
||||||
void addPolygon(float[] points, int position, int length) {
|
|
||||||
float[] curVertices = curItem.vertices;
|
|
||||||
int outPos = curItem.used;
|
|
||||||
|
|
||||||
int len = length / 2 - 1;
|
|
||||||
int pos = position;
|
|
||||||
|
|
||||||
PolygonPoint[] pp = new PolygonPoint[len];
|
|
||||||
|
|
||||||
for (int i = 0; i < len; i++) {
|
|
||||||
pp[i] = new PolygonPoint(points[pos++], points[pos++]);
|
|
||||||
}
|
|
||||||
|
|
||||||
Polygon poly = new Polygon(pp);
|
|
||||||
|
|
||||||
Poly2Tri.triangulate(poly);
|
|
||||||
|
|
||||||
for (DelaunayTriangle tri : poly.getTriangles()) {
|
|
||||||
|
|
||||||
for (int i = 0; i < 3; i++) {
|
|
||||||
|
|
||||||
if (outPos == PoolItem.SIZE) {
|
|
||||||
curVertices = getNextPoolItem();
|
|
||||||
outPos = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
curVertices[outPos++] = (float) tri.points[i].getX();
|
|
||||||
curVertices[outPos++] = (float) tri.points[i].getY();
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
curItem.used = outPos;
|
|
||||||
verticesCnt += poly.getTriangles().size() * 3;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,150 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2010, 2011, 2012 Hannes Janetzek
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify it under the
|
|
||||||
* terms of the GNU Lesser General Public License as published by the Free Software
|
|
||||||
* Foundation, either version 3 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
||||||
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
|
||||||
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public License along with
|
|
||||||
* this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
package org.mapsforge.android.glrenderer;
|
|
||||||
|
|
||||||
import java.nio.ByteBuffer;
|
|
||||||
import java.nio.ByteOrder;
|
|
||||||
import java.nio.FloatBuffer;
|
|
||||||
import java.nio.ShortBuffer;
|
|
||||||
|
|
||||||
import android.util.SparseArray;
|
|
||||||
|
|
||||||
public class MeshLayers {
|
|
||||||
private static final int NUM_VERTEX_FLOATS = 2;
|
|
||||||
|
|
||||||
private SparseArray<MeshLayer> layers;
|
|
||||||
|
|
||||||
MeshLayer[] array = null;
|
|
||||||
int size;
|
|
||||||
|
|
||||||
MeshLayers() {
|
|
||||||
layers = new SparseArray<MeshLayer>(10);
|
|
||||||
size = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
MeshLayer getLayer(int layer, int color) {
|
|
||||||
MeshLayer l = layers.get(layer);
|
|
||||||
if (l != null) {
|
|
||||||
return l;
|
|
||||||
}
|
|
||||||
|
|
||||||
l = new MeshLayer(layer, color);
|
|
||||||
layers.put(layer, l);
|
|
||||||
return l;
|
|
||||||
}
|
|
||||||
|
|
||||||
FloatBuffer compileLayerData(FloatBuffer buf) {
|
|
||||||
FloatBuffer fbuf = buf;
|
|
||||||
|
|
||||||
array = new MeshLayer[layers.size()];
|
|
||||||
|
|
||||||
for (int i = 0, n = layers.size(); i < n; i++) {
|
|
||||||
MeshLayer l = layers.valueAt(i);
|
|
||||||
array[i] = l;
|
|
||||||
size += l.verticesCnt;
|
|
||||||
}
|
|
||||||
|
|
||||||
size *= NUM_VERTEX_FLOATS;
|
|
||||||
|
|
||||||
if (buf == null || buf.capacity() < size) {
|
|
||||||
ByteBuffer bbuf = ByteBuffer.allocateDirect(size * 4).order(
|
|
||||||
ByteOrder.nativeOrder());
|
|
||||||
// Log.d("GLMap", "allocate buffer " + size);
|
|
||||||
fbuf = bbuf.asFloatBuffer();
|
|
||||||
} else {
|
|
||||||
fbuf.position(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
int pos = 0;
|
|
||||||
|
|
||||||
for (int i = 0, n = array.length; i < n; i++) {
|
|
||||||
MeshLayer l = array[i];
|
|
||||||
|
|
||||||
for (PoolItem item : l.pool) {
|
|
||||||
fbuf.put(item.vertices, 0, item.used);
|
|
||||||
|
|
||||||
// for (int j = 0; j < item.used; j++)
|
|
||||||
// System.out.println(">" + item.vertices[j]);
|
|
||||||
}
|
|
||||||
|
|
||||||
l.offset = pos;
|
|
||||||
pos += l.verticesCnt;
|
|
||||||
|
|
||||||
LayerPool.add(l.pool);
|
|
||||||
l.pool = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
fbuf.position(0);
|
|
||||||
// for (int i = 0; i < size; i++)
|
|
||||||
// System.out.println("<" + fbuf.get());
|
|
||||||
// fbuf.position(0);
|
|
||||||
// System.out.println("....... mesh layer size: " + size + " " + array.length);
|
|
||||||
|
|
||||||
// not needed for drawing
|
|
||||||
layers = null;
|
|
||||||
|
|
||||||
return fbuf;
|
|
||||||
}
|
|
||||||
|
|
||||||
ShortBuffer compileLayerData(ShortBuffer buf) {
|
|
||||||
ShortBuffer sbuf = buf;
|
|
||||||
|
|
||||||
array = new MeshLayer[layers.size()];
|
|
||||||
|
|
||||||
for (int i = 0, n = layers.size(); i < n; i++) {
|
|
||||||
MeshLayer l = layers.valueAt(i);
|
|
||||||
array[i] = l;
|
|
||||||
size += l.verticesCnt;
|
|
||||||
}
|
|
||||||
|
|
||||||
size *= NUM_VERTEX_FLOATS;
|
|
||||||
|
|
||||||
if (buf == null || buf.capacity() < size) {
|
|
||||||
ByteBuffer bbuf = ByteBuffer.allocateDirect(size * 2).order(
|
|
||||||
ByteOrder.nativeOrder());
|
|
||||||
sbuf = bbuf.asShortBuffer();
|
|
||||||
} else {
|
|
||||||
sbuf.position(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
short[] data = new short[PoolItem.SIZE];
|
|
||||||
|
|
||||||
int pos = 0;
|
|
||||||
|
|
||||||
for (int i = 0, n = array.length; i < n; i++) {
|
|
||||||
MeshLayer l = array[i];
|
|
||||||
|
|
||||||
for (int k = 0, m = l.pool.size(); k < m; k++) {
|
|
||||||
PoolItem item = l.pool.get(k);
|
|
||||||
PoolItem.toHalfFloat(item, data);
|
|
||||||
sbuf.put(data, 0, item.used);
|
|
||||||
}
|
|
||||||
|
|
||||||
l.offset = pos;
|
|
||||||
pos += l.verticesCnt;
|
|
||||||
|
|
||||||
LayerPool.add(l.pool);
|
|
||||||
l.pool = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
// System.out.println("....... mesh layer size: " + size + " " + array.length);
|
|
||||||
sbuf.position(0);
|
|
||||||
|
|
||||||
// not needed for drawing
|
|
||||||
layers = null;
|
|
||||||
|
|
||||||
return sbuf;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -19,7 +19,6 @@ import java.util.List;
|
|||||||
|
|
||||||
import org.mapsforge.android.mapgenerator.IMapGenerator;
|
import org.mapsforge.android.mapgenerator.IMapGenerator;
|
||||||
import org.mapsforge.android.mapgenerator.MapGeneratorJob;
|
import org.mapsforge.android.mapgenerator.MapGeneratorJob;
|
||||||
import org.mapsforge.android.mapgenerator.Theme;
|
|
||||||
import org.mapsforge.android.rendertheme.IRenderCallback;
|
import org.mapsforge.android.rendertheme.IRenderCallback;
|
||||||
import org.mapsforge.android.rendertheme.RenderTheme;
|
import org.mapsforge.android.rendertheme.RenderTheme;
|
||||||
import org.mapsforge.android.rendertheme.renderinstruction.Area;
|
import org.mapsforge.android.rendertheme.renderinstruction.Area;
|
||||||
@ -44,8 +43,9 @@ public class MapGenerator implements IMapGenerator, IRenderCallback,
|
|||||||
private static final byte LAYERS = 11;
|
private static final byte LAYERS = 11;
|
||||||
private static final Paint PAINT_WATER_TILE_HIGHTLIGHT = new Paint(
|
private static final Paint PAINT_WATER_TILE_HIGHTLIGHT = new Paint(
|
||||||
Paint.ANTI_ALIAS_FLAG);
|
Paint.ANTI_ALIAS_FLAG);
|
||||||
private static final double STROKE_INCREASE = 1.5;
|
|
||||||
private static final byte STROKE_MIN_ZOOM_LEVEL = 12;
|
// private static final double STROKE_INCREASE = 1.5;
|
||||||
|
// private static final byte STROKE_MIN_ZOOM_LEVEL = 12;
|
||||||
|
|
||||||
private static byte getValidLayer(byte layer) {
|
private static byte getValidLayer(byte layer) {
|
||||||
if (layer < 0) {
|
if (layer < 0) {
|
||||||
@ -65,9 +65,9 @@ public class MapGenerator implements IMapGenerator, IRenderCallback,
|
|||||||
private List<PointTextContainer> mNodes;
|
private List<PointTextContainer> mNodes;
|
||||||
private float mPoiX;
|
private float mPoiX;
|
||||||
private float mPoiY;
|
private float mPoiY;
|
||||||
private Theme mPreviousJobTheme;
|
// private Theme mPreviousJobTheme;
|
||||||
private float mPreviousTextScale;
|
// private float mPreviousTextScale;
|
||||||
private byte mPreviousZoomLevel;
|
// private byte mPreviousZoomLevel;
|
||||||
private static RenderTheme renderTheme;
|
private static RenderTheme renderTheme;
|
||||||
|
|
||||||
private final List<WayTextContainer> mWayNames;
|
private final List<WayTextContainer> mWayNames;
|
||||||
@ -469,12 +469,12 @@ public class MapGenerator implements IMapGenerator, IRenderCallback,
|
|||||||
mWaySymbols.clear();
|
mWaySymbols.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void createWayLists() {
|
// private void createWayLists() {
|
||||||
int levels = MapGenerator.renderTheme.getLevels();
|
// int levels = MapGenerator.renderTheme.getLevels();
|
||||||
for (byte i = LAYERS - 1; i >= 0; --i) {
|
// for (byte i = LAYERS - 1; i >= 0; --i) {
|
||||||
mWays[i] = new LayerContainer(levels);
|
// mWays[i] = new LayerContainer(levels);
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Converts a latitude value into an Y coordinate on the current tile.
|
* Converts a latitude value into an Y coordinate on the current tile.
|
||||||
@ -504,17 +504,17 @@ public class MapGenerator implements IMapGenerator, IRenderCallback,
|
|||||||
- mCurrentTileX;
|
- mCurrentTileX;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
// /**
|
||||||
* Sets the scale stroke factor for the given zoom level.
|
// * Sets the scale stroke factor for the given zoom level.
|
||||||
*
|
// *
|
||||||
* @param zoomLevel
|
// * @param zoomLevel
|
||||||
* the zoom level for which the scale stroke factor should be set.
|
// * the zoom level for which the scale stroke factor should be set.
|
||||||
*/
|
// */
|
||||||
private static void setScaleStrokeWidth(byte zoomLevel) {
|
// private static void setScaleStrokeWidth(byte zoomLevel) {
|
||||||
int zoomLevelDiff = Math.max(zoomLevel - STROKE_MIN_ZOOM_LEVEL, 0);
|
// int zoomLevelDiff = Math.max(zoomLevel - STROKE_MIN_ZOOM_LEVEL, 0);
|
||||||
MapGenerator.renderTheme.scaleStrokeWidth((float) Math.pow(STROKE_INCREASE,
|
// MapGenerator.renderTheme.scaleStrokeWidth((float) Math.pow(STROKE_INCREASE,
|
||||||
zoomLevelDiff));
|
// zoomLevelDiff));
|
||||||
}
|
// }
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IMapDatabase getMapDatabase() {
|
public IMapDatabase getMapDatabase() {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user