add option to use MeshLayer for tile polygon rendering

This commit is contained in:
Hannes Janetzek 2014-01-22 22:54:07 +01:00
parent dc37296750
commit f2a140e414
3 changed files with 37 additions and 17 deletions

View File

@ -27,6 +27,7 @@ import org.oscim.renderer.elements.ElementLayers;
import org.oscim.renderer.elements.ExtrusionLayer; import org.oscim.renderer.elements.ExtrusionLayer;
import org.oscim.renderer.elements.LineLayer; import org.oscim.renderer.elements.LineLayer;
import org.oscim.renderer.elements.LineTexLayer; import org.oscim.renderer.elements.LineTexLayer;
import org.oscim.renderer.elements.MeshLayer;
import org.oscim.renderer.elements.PolygonLayer; import org.oscim.renderer.elements.PolygonLayer;
import org.oscim.renderer.elements.SymbolItem; import org.oscim.renderer.elements.SymbolItem;
import org.oscim.renderer.elements.TextItem; import org.oscim.renderer.elements.TextItem;
@ -319,17 +320,20 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac
} }
} }
private final static boolean USE_MESH_POLY = false;
@Override @Override
public void renderArea(Area area, int level) { public void renderArea(Area area, int level) {
int numLayer = mCurLayer + level; int numLayer = mCurLayer + level;
if (USE_MESH_POLY) {
PolygonLayer layer = mTile.layers.getPolygonLayer(numLayer); MeshLayer l = mTile.layers.getMeshLayer(numLayer);
l.area = area;
if (layer == null) l.addMesh(mElement);
return; } else {
PolygonLayer l = mTile.layers.getPolygonLayer(numLayer);
layer.area = area; l.area = area;
layer.addPolygon(mElement.points, mElement.index); l.addPolygon(mElement.points, mElement.index);
}
} }
@Override @Override

View File

@ -31,6 +31,7 @@ import org.oscim.renderer.elements.ElementLayers;
import org.oscim.renderer.elements.ExtrusionLayer; import org.oscim.renderer.elements.ExtrusionLayer;
import org.oscim.renderer.elements.LineLayer; import org.oscim.renderer.elements.LineLayer;
import org.oscim.renderer.elements.LineTexLayer; import org.oscim.renderer.elements.LineTexLayer;
import org.oscim.renderer.elements.MeshLayer;
import org.oscim.renderer.elements.PolygonLayer; import org.oscim.renderer.elements.PolygonLayer;
import org.oscim.renderer.elements.SymbolItem; import org.oscim.renderer.elements.SymbolItem;
import org.oscim.renderer.elements.TextItem; import org.oscim.renderer.elements.TextItem;
@ -324,14 +325,22 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac
} }
} }
// slower to load (requires tesselation) and uses
// more memory but should be faster to render
private final static boolean USE_MESH_POLY = false;
@Override @Override
public void renderArea(Area area, int level) { public void renderArea(Area area, int level) {
int numLayer = mCurLayer + level; int numLayer = mCurLayer + level;
if (USE_MESH_POLY) {
PolygonLayer l = mTile.layers.getPolygonLayer(numLayer); MeshLayer l = mTile.layers.getMeshLayer(numLayer);
l.area = area;
l.area = area; l.addMesh(mElement);
l.addPolygon(mElement.points, mElement.index); } else {
PolygonLayer l = mTile.layers.getPolygonLayer(numLayer);
l.area = area;
l.addPolygon(mElement.points, mElement.index);
}
} }
@Override @Override

View File

@ -32,6 +32,7 @@ import org.oscim.renderer.MapRenderer.Matrices;
import org.oscim.renderer.elements.BitmapLayer; import org.oscim.renderer.elements.BitmapLayer;
import org.oscim.renderer.elements.LineLayer; import org.oscim.renderer.elements.LineLayer;
import org.oscim.renderer.elements.LineTexLayer; import org.oscim.renderer.elements.LineTexLayer;
import org.oscim.renderer.elements.MeshLayer;
import org.oscim.renderer.elements.PolygonLayer; import org.oscim.renderer.elements.PolygonLayer;
import org.oscim.renderer.elements.RenderElement; import org.oscim.renderer.elements.RenderElement;
import org.oscim.utils.FastMath; import org.oscim.utils.FastMath;
@ -480,22 +481,28 @@ public class TileRenderer extends LayerRenderer {
case RenderElement.LINE: case RenderElement.LINE:
if (!clipped) { if (!clipped) {
// draw stencil buffer clip region
PolygonLayer.Renderer.draw(pos, null, m, true, div, true);
clipped = true; clipped = true;
PolygonLayer.Renderer.draw(pos, null, m, true, div, true);
} }
l = LineLayer.Renderer.draw(t.layers, l, pos, m, scale); l = LineLayer.Renderer.draw(t.layers, l, pos, m, scale);
break; break;
case RenderElement.TEXLINE: case RenderElement.TEXLINE:
if (!clipped) { if (!clipped) {
// draw stencil buffer clip region
PolygonLayer.Renderer.draw(pos, null, m, true, div, true);
clipped = true; clipped = true;
PolygonLayer.Renderer.draw(pos, null, m, true, div, true);
} }
l = LineTexLayer.Renderer.draw(t.layers, l, pos, m, div); l = LineTexLayer.Renderer.draw(t.layers, l, pos, m, div);
break; break;
case RenderElement.MESH:
if (!clipped) {
clipped = true;
PolygonLayer.Renderer.draw(pos, null, m, true, div, true);
}
l = MeshLayer.Renderer.draw(pos, l, m);
break;
default: default:
// just in case // just in case
l = l.next; l = l.next;