GeometryBuffer: switch to int[] indices

This commit is contained in:
Hannes Janetzek 2014-08-25 01:03:36 +02:00
parent 7be8155939
commit 990e04477c
14 changed files with 36 additions and 34 deletions

@ -369,7 +369,7 @@ public class TileDecoder extends PbfDecoder {
decodeVarintArray(indexCnt, mElem.index); decodeVarintArray(indexCnt, mElem.index);
short[] index = mElem.index; int[] index = mElem.index;
int coordCnt = 0; int coordCnt = 0;
for (int i = 0; i < indexCnt; i++) { for (int i = 0; i < indexCnt; i++) {

@ -65,7 +65,7 @@ public class OSciMap2TileSource extends UrlTileSource {
private static final int TAG_ELEM_MIN_HEIGHT = 32; private static final int TAG_ELEM_MIN_HEIGHT = 32;
private static final int TAG_ELEM_PRIORITY = 41; private static final int TAG_ELEM_PRIORITY = 41;
private short[] mSArray; private int[] mSArray;
private final TagSet mTileTags; private final TagSet mTileTags;
private final MapElement mElem; private final MapElement mElem;
@ -82,7 +82,7 @@ public class OSciMap2TileSource extends UrlTileSource {
mTileTags = new TagSet(20); mTileTags = new TagSet(20);
// temp array for decoding shorts // temp array for decoding shorts
mSArray = new short[100]; mSArray = new int[100];
} }
@Override @Override
@ -115,7 +115,7 @@ public class OSciMap2TileSource extends UrlTileSource {
case TAG_TILE_TAG_KEYS: case TAG_TILE_TAG_KEYS:
int len = numTags; int len = numTags;
if (mSArray.length < len) if (mSArray.length < len)
mSArray = new short[len]; mSArray = new int[len];
decodeVarintArray(numTags, mSArray); decodeVarintArray(numTags, mSArray);
break; break;
@ -163,7 +163,7 @@ public class OSciMap2TileSource extends UrlTileSource {
mElem.ensureIndexSize(indexCnt, false); mElem.ensureIndexSize(indexCnt, false);
decodeVarintArray(indexCnt, mElem.index); decodeVarintArray(indexCnt, mElem.index);
short[] index = mElem.index; int[] index = mElem.index;
int coordCnt = 0; int coordCnt = 0;
for (int i = 0; i < indexCnt; i++) { for (int i = 0; i < indexCnt; i++) {

@ -56,7 +56,7 @@ public class GeometryBuffer {
public float[] points; public float[] points;
/** The indexes. */ /** The indexes. */
public short[] index; public int[] index;
/** The current index position. */ /** The current index position. */
public int indexPos; public int indexPos;
@ -76,11 +76,11 @@ public class GeometryBuffer {
* @param points the points * @param points the points
* @param index the index * @param index the index
*/ */
public GeometryBuffer(float[] points, short[] index) { public GeometryBuffer(float[] points, int[] index) {
if (points == null) if (points == null)
points = new float[GROW_POINTS]; points = new float[GROW_POINTS];
if (index == null) if (index == null)
index = new short[GROW_INDICES]; index = new int[GROW_INDICES];
this.points = points; this.points = points;
this.index = index; this.index = index;
@ -129,7 +129,7 @@ public class GeometryBuffer {
* @param numIndices the num indices * @param numIndices the num indices
*/ */
public GeometryBuffer(int numPoints, int numIndices) { public GeometryBuffer(int numPoints, int numIndices) {
this(new float[numPoints * 2], new short[numIndices]); this(new float[numPoints * 2], new int[numIndices]);
} }
/** /**
@ -304,11 +304,11 @@ public class GeometryBuffer {
* @param copy the copy * @param copy the copy
* @return the short[] array holding current index * @return the short[] array holding current index
*/ */
public short[] ensureIndexSize(int size, boolean copy) { public int[] ensureIndexSize(int size, boolean copy) {
if (size < index.length) if (size < index.length)
return index; return index;
short[] newIndex = new short[size + GROW_INDICES]; int[] newIndex = new int[size + GROW_INDICES];
if (copy) if (copy)
System.arraycopy(index, 0, newIndex, 0, index.length); System.arraycopy(index, 0, newIndex, 0, index.length);

@ -40,7 +40,7 @@ class S3DBTileLoader extends TileLoader {
4096, 0, 0, 4096, 0, 0,
0, 4096, 0, 0, 4096, 0,
4096, 4096, 0 }; 4096, 4096, 0 };
g.index = new short[] { 0, 1, 2, 2, 1, 3 }; g.index = new int[] { 0, 1, 2, 2, 1, 3 };
mTilePlane.tags.add(new Tag("c", "transparent")); mTilePlane.tags.add(new Tag("c", "transparent"));
} }

@ -153,7 +153,7 @@ public class ExtrusionLayer extends RenderElement {
if (element.type != GeometryType.TRIS) if (element.type != GeometryType.TRIS)
return; return;
short[] index = element.index; int[] index = element.index;
float[] points = element.points; float[] points = element.points;
int vertexCnt = sumVertices; int vertexCnt = sumVertices;
@ -338,7 +338,7 @@ public class ExtrusionLayer extends RenderElement {
public void add(MapElement element, float height, float minHeight) { public void add(MapElement element, float height, float minHeight) {
short[] index = element.index; int[] index = element.index;
float[] points = element.points; float[] points = element.points;
/* 10 cm steps */ /* 10 cm steps */
@ -415,7 +415,7 @@ public class ExtrusionLayer extends RenderElement {
/** roof indices for concave shapes */ /** roof indices for concave shapes */
private void addRoof(int startVertex, GeometryBuffer geom, int ipos, int ppos) { private void addRoof(int startVertex, GeometryBuffer geom, int ipos, int ppos) {
short[] index = geom.index; int[] index = geom.index;
float[] points = geom.points; float[] points = geom.points;
int len = 0; int len = 0;

@ -43,7 +43,7 @@ public final class LineLayer extends RenderElement {
/** scale factor mapping extrusion vector to short values */ /** scale factor mapping extrusion vector to short values */
public static final float DIR_SCALE = 2048; public static final float DIR_SCALE = 2048;
/** maximal resoultion */ /** maximal resolution */
private static final float MIN_DIST = 1 / 8f; private static final float MIN_DIST = 1 / 8f;
/** /**
@ -110,7 +110,7 @@ public final class LineLayer extends RenderElement {
addLine(points, null, numPoints, closed); addLine(points, null, numPoints, closed);
} }
private void addLine(float[] points, short[] index, int numPoints, boolean closed) { private void addLine(float[] points, int[] index, int numPoints, boolean closed) {
boolean rounded = false; boolean rounded = false;
boolean squared = false; boolean squared = false;

@ -105,7 +105,7 @@ public final class LineTexLayer extends RenderElement {
addLine(geom.points, geom.index); addLine(geom.points, geom.index);
} }
public void addLine(float[] points, short[] index) { public void addLine(float[] points, int[] index) {
if (vertexItems.empty()) { if (vertexItems.empty()) {
/* HACK add one vertex offset when compiling /* HACK add one vertex offset when compiling

@ -78,7 +78,7 @@ public final class PolygonLayer extends IndexedRenderElement {
float ymax = Short.MIN_VALUE; float ymax = Short.MIN_VALUE;
float[] bbox = new float[8]; float[] bbox = new float[8];
public void addPolygon(float[] points, short[] index) { public void addPolygon(float[] points, int[] index) {
short center = (short) ((Tile.SIZE >> 1) * S); short center = (short) ((Tile.SIZE >> 1) * S);
short id = (short) numVertices; short id = (short) numVertices;

@ -319,7 +319,7 @@ public abstract class PbfDecoder implements ITileDecoder {
return ((val >>> 1) ^ -(val & 1)); return ((val >>> 1) ^ -(val & 1));
} }
public void decodeVarintArray(int num, short[] array) throws IOException { public void decodeVarintArray(int num, int[] array) throws IOException {
int bytes = decodeVarint32(); int bytes = decodeVarint32();
fillBuffer(bytes); fillBuffer(bytes);
@ -353,7 +353,7 @@ public abstract class PbfDecoder implements ITileDecoder {
} }
} }
array[cnt] = (short) val; array[cnt] = val;
} }
if (pos != bufferPos + bytes) if (pos != bufferPos + bytes)

@ -554,7 +554,7 @@ public class MapDatabase implements ITileDataSource {
} }
//short[] wayLengths = new short[numBlocks]; //short[] wayLengths = new short[numBlocks];
short[] wayLengths = mElem.ensureIndexSize(numBlocks, false); int[] wayLengths = mElem.ensureIndexSize(numBlocks, false);
if (wayLengths.length > numBlocks) if (wayLengths.length > numBlocks)
wayLengths[numBlocks] = -1; wayLengths[numBlocks] = -1;
@ -962,7 +962,7 @@ public class MapDatabase implements ITileDataSource {
private boolean projectToTile(GeometryBuffer geom) { private boolean projectToTile(GeometryBuffer geom) {
float[] coords = geom.points; float[] coords = geom.points;
short[] indices = geom.index; int[] indices = geom.index;
long x = mTile.tileX * Tile.SIZE; long x = mTile.tileX * Tile.SIZE;
long y = mTile.tileY * Tile.SIZE + Tile.SIZE; long y = mTile.tileY * Tile.SIZE + Tile.SIZE;

@ -59,7 +59,7 @@ public class TileDecoder extends PbfDecoder {
private static final int TAG_ELEM_COORDS = 13; private static final int TAG_ELEM_COORDS = 13;
private static final int TAG_ELEM_LAYER = 21; private static final int TAG_ELEM_LAYER = 21;
private short[] mSArray = new short[100]; private int[] mSArray = new int[100];
private Tile mTile; private Tile mTile;
@ -153,7 +153,7 @@ public class TileDecoder extends PbfDecoder {
case TAG_TILE_TAGS: case TAG_TILE_TAGS:
int len = numTags * 2; int len = numTags * 2;
if (mSArray.length < len) if (mSArray.length < len)
mSArray = new short[len]; mSArray = new int[len];
decodeVarintArray(len, mSArray); decodeVarintArray(len, mSArray);
if (!decodeTileTags(numTags, mSArray, keys, values)) { if (!decodeTileTags(numTags, mSArray, keys, values)) {
@ -181,7 +181,7 @@ public class TileDecoder extends PbfDecoder {
return true; return true;
} }
private boolean decodeTileTags(int numTags, short[] tagIdx, private boolean decodeTileTags(int numTags, int[] tagIdx,
String[] keys, String[] vals) { String[] keys, String[] vals) {
Tag tag; Tag tag;
@ -234,7 +234,7 @@ public class TileDecoder extends PbfDecoder {
mElem.ensureIndexSize(indexCnt, false); mElem.ensureIndexSize(indexCnt, false);
decodeVarintArray(indexCnt, mElem.index); decodeVarintArray(indexCnt, mElem.index);
short[] index = mElem.index; int[] index = mElem.index;
int coordCnt = 0; int coordCnt = 0;
if (shift) { if (shift) {
@ -373,8 +373,8 @@ public class TileDecoder extends PbfDecoder {
private boolean decodeElementTags(int numTags) throws IOException { private boolean decodeElementTags(int numTags) throws IOException {
if (mSArray.length < numTags) if (mSArray.length < numTags)
mSArray = new short[numTags]; mSArray = new int[numTags];
short[] tagIds = mSArray; int[] tagIds = mSArray;
decodeVarintArray(numTags, tagIds); decodeVarintArray(numTags, tagIds);

@ -33,7 +33,7 @@ public class Tessellator {
* Special version for ExtrusionLayer to match indices with vertex * Special version for ExtrusionLayer to match indices with vertex
* positions. * positions.
*/ */
public static int tessellate(float[] points, int ppos, int plen, short[] index, public static int tessellate(float[] points, int ppos, int plen, int[] index,
int ipos, int rings, int vertexOffset, VertexData outTris) { int ipos, int rings, int vertexOffset, VertexData outTris) {
int[] result = new int[2]; int[] result = new int[2];
@ -156,6 +156,7 @@ public class Tessellator {
return 1; return 1;
} }
/* FIXME This modifies geom ?! */
public static int tessellate(GeometryBuffer geom, float scale, public static int tessellate(GeometryBuffer geom, float scale,
VertexData outPoints, VertexData outTris, int vertexOffset) { VertexData outPoints, VertexData outTris, int vertexOffset) {
@ -180,6 +181,7 @@ public class Tessellator {
numPoints += geom.index[idx]; numPoints += geom.index[idx];
} }
/* FIXME !!! */
for (int i = pointPos; i < pointPos + numPoints; i += 2) { for (int i = pointPos; i < pointPos + numPoints; i += 2) {
geom.points[i + 0] = (int) (geom.points[i + 0] * s); geom.points[i + 0] = (int) (geom.points[i + 0] * s);
geom.points[i + 1] = (int) (geom.points[i + 1] * s); geom.points[i + 1] = (int) (geom.points[i + 1] * s);
@ -257,7 +259,7 @@ public class Tessellator {
* @return context - must be freed with tessFinish() * @return context - must be freed with tessFinish()
*/ */
protected static native long tessellate(float[] points, int pos, protected static native long tessellate(float[] points, int pos,
short[] index, int ipos, int numRings, int[] result); int[] index, int ipos, int numRings, int[] result);
protected static native void tessFinish(long ctx); protected static native void tessFinish(long ctx);
@ -268,7 +270,7 @@ public class Tessellator {
protected static native int tessGetVerticesFloat(long ctx, float[] coordinates); protected static native int tessGetVerticesFloat(long ctx, float[] coordinates);
protected static native int tessGetIndices(long ctx, short[] indices); protected static native int tessGetIndices(long ctx, int[] indices);
protected static native int tessGetIndicesWO(long ctx, short[] indices, int offset); protected static native int tessGetIndicesWO(long ctx, short[] indices, int offset);
} }

@ -36,7 +36,7 @@ public class SimplifyDP {
int[] stack = new int[32]; int[] stack = new int[32];
public void simplify(GeometryBuffer geom, float sqTolerance) { public void simplify(GeometryBuffer geom, float sqTolerance) {
short[] idx = geom.index; int[] idx = geom.index;
int inPos = 0; int inPos = 0;
int outPos = 0; int outPos = 0;

@ -79,7 +79,7 @@ public class TileClipper {
int numLines = mLineClipper.clipLine(geom, out); int numLines = mLineClipper.clipLine(geom, out);
short idx[] = geom.ensureIndexSize(numLines + 1, false); int idx[] = geom.ensureIndexSize(numLines + 1, false);
System.arraycopy(out.index, 0, idx, 0, numLines); System.arraycopy(out.index, 0, idx, 0, numLines);
geom.index[numLines] = -1; geom.index[numLines] = -1;