experiments, testcode

This commit is contained in:
Hannes Janetzek 2014-03-29 19:00:57 +01:00
parent aac57ee0d5
commit b286e8f6eb
18 changed files with 1666 additions and 0 deletions

View File

@ -0,0 +1,28 @@
apply plugin: 'java'
apply plugin: 'application'
mainClassName = 'org.oscim.gdx.GdxMapApp'
// package vtm native libs into jar
task copyLibs(type: Copy) {
from(zipTree("../vtm-ext-libs/gdx/vtm-jni-natives.jar"))
into("${buildDir}/assets")
}
tasks.withType(JavaCompile) { compileTask ->
compileTask.dependsOn copyLibs
}
sourceSets {
main.java.srcDirs = ['src']
main.resources.srcDirs = ["${buildDir}/assets"]
output.resourcesDir = 'assets'
}
dependencies {
compile project(':vtm-desktop')
compile project(':vtm-extras')
compile project(':vtm-jeo')
}
run { ignoreExitValue = true }

View File

@ -0,0 +1,38 @@
package org.oscim.test;
import org.oscim.core.BoundingBox;
import org.oscim.gdx.GdxMap;
import org.oscim.gdx.GdxMapApp;
import org.oscim.renderer.MapRenderer;
import org.oscim.tiling.TileSource;
import org.oscim.tiling.source.oscimap4.OSciMap4TileSource;
import com.badlogic.gdx.Input;
public class AnimatorTest extends GdxMap {
@Override
public void createLayers() {
MapRenderer.setBackgroundColor(0xff000000);
TileSource ts = new OSciMap4TileSource();
initDefaultLayers(ts, false, false, false);
mMap.setMapPosition(0, 0, 1 << 4);
}
@Override
protected boolean onKeyDown(int keycode) {
if (keycode == Input.Keys.NUM_1) {
mMap.animator().animateTo(new BoundingBox(53.1, 8.8, 53.2, 8.9));
return true;
}
return false;
}
public static void main(String[] args) {
GdxMapApp.init();
GdxMapApp.run(new AnimatorTest(), null, 256);
}
}

View File

@ -0,0 +1,58 @@
package org.oscim.test;
import org.oscim.gdx.GdxMap;
import org.oscim.gdx.GdxMapApp;
import org.oscim.layers.tile.bitmap.BitmapTileLayer;
import org.oscim.renderer.MapRenderer;
import org.oscim.tiling.source.bitmap.DefaultSources.HillShadeHD;
import org.oscim.tiling.source.bitmap.DefaultSources.OpenStreetMap;
import org.oscim.tiling.source.bitmap.DefaultSources.StamenToner;
import org.oscim.tiling.source.bitmap.DefaultSources.StamenWatercolor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.badlogic.gdx.Input;
public class BitmapLayerTest extends GdxMap {
final Logger log = LoggerFactory.getLogger(BitmapTileLayer.class);
BitmapTileLayer mLayer = null;
@Override
protected boolean onKeyDown(int keycode) {
if (keycode == Input.Keys.NUM_1) {
mMap.layers().remove(mLayer);
mLayer = new BitmapTileLayer(mMap, new OpenStreetMap());
mMap.layers().set(2, mLayer);
return true;
} else if (keycode == Input.Keys.NUM_2) {
mMap.layers().remove(mLayer);
mLayer = new BitmapTileLayer(mMap, new StamenWatercolor());
mMap.layers().set(2, mLayer);
return true;
} else if (keycode == Input.Keys.NUM_3) {
mMap.layers().remove(mLayer);
mLayer = new BitmapTileLayer(mMap, new HillShadeHD());
mMap.layers().set(2, mLayer);
return true;
}
return false;
}
@Override
public void createLayers() {
MapRenderer.setBackgroundColor(0xff888888);
mLayer = new BitmapTileLayer(mMap, new StamenToner());
mMap.layers().add(mLayer);
}
public static void main(String[] args) {
GdxMapApp.init();
GdxMapApp.run(new BitmapLayerTest(), null, 256);
}
}

View File

@ -0,0 +1,82 @@
package org.oscim.test;
import java.io.FileNotFoundException;
import org.oscim.gdx.GdxMap;
import org.oscim.gdx.GdxMapApp;
import org.oscim.layers.tile.vector.VectorTileLayer;
import org.oscim.layers.tile.vector.labeling.LabelLayer;
import org.oscim.renderer.MapRenderer;
import org.oscim.theme.IRenderTheme;
import org.oscim.theme.ThemeLoader;
import org.oscim.tiling.source.mapfile.MapFileTileSource;
import com.badlogic.gdx.Input;
public class ExternalRenderThemeTest extends GdxMap {
VectorTileLayer mapLayer;
@Override
protected boolean onKeyDown(int keycode) {
String name = null;
if (keycode == Input.Keys.NUM_1)
name = "themes/freizeitkarte/theme.xml";
if (keycode == Input.Keys.NUM_2)
name = "themes/elevate/theme.xml";
if (keycode == Input.Keys.NUM_3)
name = "themes/vmap/theme.xml";
if (name == null)
return false;
try {
IRenderTheme theme = ThemeLoader.load(name);
mapLayer.setRenderTheme(theme);
MapRenderer.setBackgroundColor(theme.getMapBackground());
} catch (FileNotFoundException e) {
e.printStackTrace();
}
mMap.clearMap();
mMap.updateMap(true);
return true;
}
@Override
public void createLayers() {
mMap.setMapPosition(53.08, 8.83, 1 << 14);
// TileSource tileSource = new OSciMap4TileSource();
MapFileTileSource tileSource = new MapFileTileSource();
// tileSource.setMapFile("/home/jeff/src/vtm/Freizeitkarte_DEU_NW.map");
tileSource.setMapFile("/home/jeff/germany.map");
VectorTileLayer l = mMap.setBaseMap(tileSource);
mapLayer = l;
// mMap.getLayers().add(new BuildingLayer(mMap, l.getTileLayer()));
mMap.layers().add(new LabelLayer(mMap, l));
try {
IRenderTheme theme = ThemeLoader
.load("themes/freizeitkarte/theme.xml");
// IRenderTheme theme =
// ThemeLoader.load("themes/elevate/theme.xml");
// IRenderTheme theme = ThemeLoader.load("themes/vmap/theme.xml");
l.setRenderTheme(theme);
MapRenderer.setBackgroundColor(theme.getMapBackground());
} catch (FileNotFoundException e) {
e.printStackTrace();
}
// mMap.getLayers().add(new GenericLayer(mMap, new MeshRenderer()));
// mMap.getLayers().add(new GenericLayer(mMap, new GridRenderer()));
}
public static void main(String[] args) {
GdxMapApp.init();
GdxMapApp.run(new ExternalRenderThemeTest(), null, 256);
}
}

View File

@ -0,0 +1,209 @@
package org.oscim.test;
import org.oscim.backend.canvas.Color;
import org.oscim.backend.canvas.Paint.Cap;
import org.oscim.core.GeometryBuffer;
import org.oscim.gdx.GdxMap;
import org.oscim.gdx.GdxMapApp;
import org.oscim.layers.GenericLayer;
import org.oscim.renderer.ElementRenderer;
import org.oscim.renderer.GLViewport;
import org.oscim.renderer.MapRenderer;
import org.oscim.renderer.elements.LineLayer;
import org.oscim.renderer.elements.LineTexLayer;
import org.oscim.theme.styles.LineStyle;
import com.badlogic.gdx.Input;
public class LineRenderTest extends GdxMap {
GeometryBuffer mGeom = new GeometryBuffer(2, 1);
GeometryBuffer mLine = new GeometryBuffer(2, 1);
static boolean fixedLineWidth = true;
LineTest l = new LineTest();
@Override
public void createLayers() {
MapRenderer.setBackgroundColor(0xff000000);
// TileSource ts = new OSciMap4TileSource();
// ts.setOption("url", "http://opensciencemap.org/tiles/vtm");
// initDefaultLayers(ts, false, false, false);
mMap.setMapPosition(0, 0, 1 << 4);
GeometryBuffer g = mLine;
g.startLine();
g.addPoint(-100, 0);
g.addPoint(100, 0);
addLines(l, 0, true, false);
mMap.layers().add(new GenericLayer(mMap, l));
}
void addLines(LineTest l, int layer, boolean addOutline, boolean fixed) {
GeometryBuffer g = mLine;
LineStyle line1, line2, line3, line4;
if (fixed) {
line1 = new LineStyle(Color.RED, 0.5f);
line2 = new LineStyle(Color.GREEN, 1);
line3 = new LineStyle(Color.BLUE, 2);
line4 = new LineStyle(Color.LTGRAY, 3);
} else {
line1 = new LineStyle(0, null, Color.fade(Color.RED, 0.5f), 4.0f,
Cap.BUTT, false, 0, 0, 0, 0, 1f, false);
line2 = new LineStyle(0, null, Color.GREEN, 6.0f, Cap.BUTT, true, 0, 0,
0, 0, 1f, false);
line4 = new LineStyle(0, null, Color.LTGRAY, 2.0f, Cap.ROUND, false, 0,
0, 0, 0, 1f, false);
}
line3 = new LineStyle(0, null, Color.BLUE, 2.0f, Cap.ROUND, true, 4,
Color.CYAN, 1, 0, 0, false);
LineStyle outline = new LineStyle(0, null, Color.BLUE, 2.0f, Cap.ROUND, false, 0,
0, 0, 0, 1f, true);
LineStyle outline2 = new LineStyle(0, null, Color.RED, 2.0f, Cap.ROUND, false, 0,
0, 0, 0, 0, true);
LineLayer ol = l.layers.addLineLayer(0, outline);
LineLayer ol2 = l.layers.addLineLayer(5, outline2);
LineLayer ll = l.layers.addLineLayer(10, line1);
ll.addLine(g.translate(0, -20));
ll.addLine(g.translate(0, 10.5f));
addCircle(-200, -200, 100, ll);
if (addOutline)
ol.addOutline(ll);
ll = l.layers.addLineLayer(20, line2);
ll.addLine(g.translate(0, 10.5f));
ll.addLine(g.translate(0, 10.5f));
addCircle(200, -200, 100, ll);
if (addOutline)
ol.addOutline(ll);
LineTexLayer lt = l.layers.getLineTexLayer(30);
lt.line = line3;
lt.addLine(g.translate(0, 10.5f));
lt.addLine(g.translate(0, 10.5f));
addCircle(200, 200, 100, lt);
// if (addOutline)
// ol2.addOutline(ll);
ll = l.layers.addLineLayer(40, line4);
ll.addLine(g.translate(0, 10.5f));
ll.addLine(g.translate(0, 10.5f));
addCircle(-200, 200, 100, ll);
if (addOutline)
ol2.addOutline(ll);
}
void addCircle(float cx, float cy, float radius, LineLayer ll) {
GeometryBuffer g = mGeom;
g.clear();
g.startLine();
g.addPoint(cx, cy);
g.addPoint(cx, cy);
for (int i = 0; i < 60; i++) {
double d = Math.toRadians(i * 6);
g.setPoint(1, cx + (float) Math.sin(d) * radius,
cy + (float) Math.cos(d) * radius);
ll.addLine(g);
}
}
void addCircle(float cx, float cy, float radius, LineTexLayer ll) {
GeometryBuffer g = mGeom;
g.clear();
g.startLine();
g.addPoint(cx, cy);
g.addPoint(cx, cy);
for (int i = 0; i < 60; i++) {
double d = Math.toRadians(i * 6);
g.setPoint(1, cx + (float) Math.sin(d) * radius,
cy + (float) Math.cos(d) * radius);
ll.addLine(g);
}
}
@Override
protected boolean onKeyDown(int keycode) {
if (keycode < Input.Keys.NUM_1 || keycode > Input.Keys.NUM_4)
return false;
synchronized (l) {
l.clear();
GeometryBuffer g = mLine;
g.clear();
g.startLine();
g.addPoint(-100, 0);
g.addPoint(100, 0);
if (keycode == Input.Keys.NUM_1)
addLines(l, 0, true, true);
else if (keycode == Input.Keys.NUM_2)
addLines(l, 0, true, false);
else if (keycode == Input.Keys.NUM_3)
addLines(l, 0, false, true);
else if (keycode == Input.Keys.NUM_4)
addLines(l, 0, false, false);
}
mMap.updateMap(true);
return true;
}
class LineTest extends ElementRenderer {
public LineTest() {
mMapPosition.scale = 0;
}
public synchronized void clear() {
layers.clear();
setReady(false);
}
@Override
protected synchronized void update(GLViewport v) {
if (mMapPosition.scale == 0)
mMapPosition.copy(v.pos);
if (!isReady()) {
compile();
}
}
// @Override
// protected void setMatrix(MapPosition pos, Matrices m, boolean
// project) {
// m.useScreenCoordinates(true, 8f);
// }
}
public static void main(String[] args) {
GdxMapApp.init();
GdxMapApp.run(new LineRenderTest(), null, 256);
}
}

View File

@ -0,0 +1,110 @@
package org.oscim.test;
import org.oscim.backend.canvas.Color;
import org.oscim.core.GeometryBuffer;
import org.oscim.gdx.GdxMap;
import org.oscim.gdx.GdxMapApp;
import org.oscim.layers.GenericLayer;
import org.oscim.renderer.ElementRenderer;
import org.oscim.renderer.GLViewport;
import org.oscim.renderer.MapRenderer;
import org.oscim.renderer.elements.LineLayer;
import org.oscim.theme.styles.LineStyle;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input;
public class LineTest extends GdxMap {
@Override
protected boolean onKeyDown(int keycode) {
if (keycode == Input.Keys.NUM_1) {
angle++;
mMap.render();
return true;
}
if (keycode == Input.Keys.NUM_2) {
angle--;
mMap.render();
return true;
}
return false;
}
float angle = 0;
@Override
protected void createLayers() {
mMap.layers().add(new GenericLayer(mMap, new ElementRenderer() {
boolean init;
LineLayer ll = layers.addLineLayer(0,
new LineStyle(Color.fade(Color.CYAN, 0.5f), 1.5f));
GeometryBuffer g = new GeometryBuffer(10, 1);
@Override
protected void update(GLViewport v) {
if (!init) {
mMapPosition.copy(v.pos);
init = true;
// g.addPoint(0, 0);
// g.addPoint(0, 1);
// g.addPoint(0.1f, 0);
//
// g.addPoint(1, 1);
// g.addPoint(2, 0);
//
// g.addPoint(2, 1);
// g.addPoint(2, 0);
//
// g.addPoint(3, 1);
// g.addPoint(3, 0);
// g.addPoint(3, 1);
//
// for (int i = 0; i < 60; i++){
// g.startLine();
// g.addPoint(0, 0);
// g.addPoint(0, 1);
// }
//
// g.scale(100, 100);
//
// ll.addLine(g);
//
// compile();
}
layers.clear();
layers.setBaseLayers(ll);
g.clear();
for (int i = 0; i < 60; i++) {
g.startLine();
g.addPoint(-1, 0);
g.addPoint(0, 0);
g.addPoint((float) Math.cos(Math.toRadians(angle)),
(float) Math.sin(Math.toRadians(angle)));
}
g.scale(100, 100);
ll.addLine(g);
compile();
angle = Gdx.input.getX() / 2f % 360;
MapRenderer.animate();
}
}));
}
public static void main(String[] args) {
GdxMapApp.init();
GdxMapApp.run(new LineTest(), null, 256);
}
}

View File

@ -0,0 +1,32 @@
package org.oscim.test;
import org.oscim.gdx.GdxMap;
import org.oscim.gdx.GdxMapApp;
import org.oscim.layers.tile.vector.VectorTileLayer;
import org.oscim.layers.tile.vector.labeling.LabelLayer;
import org.oscim.theme.VtmThemes;
import org.oscim.tiling.source.oscimap4.OSciMap4TileSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class MapTest extends GdxMap {
final Logger log = LoggerFactory.getLogger(MeshTest.class);
@Override
public void createLayers() {
VectorTileLayer l = mMap.setBaseMap(new OSciMap4TileSource());
mMap.setTheme(VtmThemes.DEFAULT);
mMap.layers().add(new LabelLayer(mMap, l));
mMap.setMapPosition(53.08, 8.82, 1 << 17);
}
public static void main(String[] args) {
GdxMapApp.init();
GdxMapApp.run(new MapTest(), null, 400);
}
}

View File

@ -0,0 +1,37 @@
package org.oscim.test;
import org.oscim.gdx.GdxMap;
import org.oscim.gdx.GdxMapApp;
import org.oscim.layers.tile.vector.VectorTileLayer;
import org.oscim.layers.tile.vector.labeling.LabelLayer;
import org.oscim.renderer.MapRenderer;
import org.oscim.theme.VtmThemes;
import org.oscim.tiling.source.mapfile.MapFileTileSource;
public class MapsforgeTest extends GdxMap {
@Override
public void createLayers() {
MapRenderer.setBackgroundColor(0xff888888);
mMap.setMapPosition(53.072, 8.80, 1 << 15);
// mMap.setMapPosition(52.5, 13.3, 1 << 15);
MapFileTileSource tileSource = new MapFileTileSource();
tileSource.setMapFile("/home/jeff/germany.map");
VectorTileLayer l = mMap.setBaseMap(tileSource);
// mMap.getLayers().add(new BuildingLayer(mMap, l.getTileLayer()));
mMap.layers().add(new LabelLayer(mMap, l));
// mMap.setTheme(VtmThemes.DEFAULT);
// mMap.setTheme(VtmThemes.TRONRENDER);
mMap.setTheme(VtmThemes.OSMARENDER);
}
public static void main(String[] args) {
GdxMapApp.init();
GdxMapApp.run(new MapsforgeTest(), null, 400);
}
}

View File

@ -0,0 +1,46 @@
package org.oscim.test;
import org.oscim.gdx.GdxMapApp;
import org.oscim.layers.tile.bitmap.BitmapTileLayer;
import org.oscim.layers.tile.s3db.S3DBLayer;
import org.oscim.tiling.TileSource;
import org.oscim.tiling.source.bitmap.DefaultSources;
import org.oscim.tiling.source.oscimap4.OSciMap4TileSource;
public class MeshTest extends GdxMapApp {
@Override
public void createLayers() {
//MapRenderer.setBackgroundColor(0xf0f0f0);
//VectorTileLayer l = mMap.setBaseMap(new OSciMap4TileSource());
//mMap.setTheme(VtmThemes.DEFAULT);
mMap.setBackgroundMap(new BitmapTileLayer(mMap, new DefaultSources.StamenToner()));
TileSource ts = new OSciMap4TileSource("http://opensciencemap.org/tiles/s3db");
S3DBLayer tl = new S3DBLayer(mMap, ts);
//BuildingLayer tl = new BuildingLayer(mMap, l);
//OffscreenRenderer or = new OffscreenRenderer(mMap.getWidth(),
// mMap.getHeight());
//or.setRenderer(tl.getRenderer());
mMap.layers().add(tl);
//mMap.layers().add(new GenericLayer(mMap, or));
//mMap.layers().add(new LabelLayer(mMap, l));
//mMap.setMapPosition(7.707, 81.689, 1 << 17);
mMap.setMapPosition(53.08, 8.82, 1 << 17);
}
public static void main(String[] args) {
init();
run(new MeshTest(), null, 400);
}
}

View File

@ -0,0 +1,123 @@
package org.oscim.test;
import static org.oscim.utils.ColorUtil.saturate;
import org.oscim.gdx.GdxMap;
import org.oscim.gdx.GdxMapApp;
import org.oscim.layers.tile.vector.VectorTileLayer;
import org.oscim.renderer.MapRenderer;
import org.oscim.theme.RenderTheme;
import org.oscim.theme.VtmThemes;
import org.oscim.theme.rule.Rule;
import org.oscim.theme.rule.Rule.RuleVisitor;
import org.oscim.theme.styles.AreaStyle;
import org.oscim.theme.styles.AreaStyle.AreaBuilder;
import org.oscim.theme.styles.LineStyle;
import org.oscim.theme.styles.LineStyle.LineBuilder;
import org.oscim.theme.styles.RenderStyle;
import org.oscim.tiling.TileSource;
import org.oscim.tiling.source.oscimap4.OSciMap4TileSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.badlogic.gdx.Input;
public class RuleVisitorTest extends GdxMap {
final Logger log = LoggerFactory.getLogger(RuleVisitorTest.class);
RenderTheme mTheme;
double mSaturation = 1;
@Override
protected boolean onKeyDown(int keycode) {
VectorTileLayer l = (VectorTileLayer) mMap.layers().get(1);
RenderTheme t = (RenderTheme) l.getTheme();
if (keycode == Input.Keys.NUM_1) {
mSaturation += 0.1;
t.traverseRules(new SaturateLineStyles(mSaturation, true, true, true));
t.updateStyles();
mMap.render();
return true;
}
if (keycode == Input.Keys.NUM_2) {
mSaturation -= 0.1;
t.traverseRules(new SaturateLineStyles(mSaturation, true, true, true));
t.updateStyles();
mMap.render();
return true;
}
return super.onKeyDown(keycode);
}
@Override
public void createLayers() {
MapRenderer.setBackgroundColor(0xf0f0f0);
TileSource ts = new OSciMap4TileSource();
VectorTileLayer l = mMap.setBaseMap(ts);
mMap.setTheme(VtmThemes.DEFAULT);
RenderTheme t = (RenderTheme) l.getTheme();
mTheme = t;
//t.traverseRules(new DesaturateAreaStyles());
//t.traverseRules(new DesaturateLineStyles());
t.traverseRules(new SaturateLineStyles(0.5, true, true, true));
t.updateStyles();
//mMap.setMapPosition(7.707, 81.689, 1 << 16);
mMap.setMapPosition(53.08, 8.82, 1 << 16);
}
public static void main(String[] args) {
GdxMapApp.init();
GdxMapApp.run(new RuleVisitorTest(), null, 400);
}
static class SaturateLineStyles extends RuleVisitor {
private final LineBuilder lineBuilder = new LineBuilder();
private final AreaBuilder areaBuilder = new AreaBuilder();
private final double saturation;
private final boolean modifyArea;
private final boolean modifyLine;
private final boolean relative;
public SaturateLineStyles(double saturation, boolean relative, boolean modArea,
boolean modLine) {
this.saturation = saturation;
this.modifyArea = modArea;
this.modifyLine = modLine;
this.relative = relative;
}
@Override
public void apply(Rule r) {
for (RenderStyle style : r.styles) {
if (modifyLine && style instanceof LineStyle) {
LineStyle s = (LineStyle) style;
s.set(lineBuilder.set(s)
.color(saturate(s.color, saturation, relative))
.stippleColor(saturate(s.stippleColor, saturation, relative))
.build());
continue;
}
if (modifyArea && style instanceof AreaStyle) {
AreaStyle s = (AreaStyle) style;
s.set(areaBuilder.set(s)
.color(saturate(s.color, saturation, relative))
.blendColor(saturate(s.blendColor, saturation, relative))
.build());
}
}
super.apply(r);
}
}
}

View File

@ -0,0 +1,70 @@
package org.oscim.test;
import static java.lang.System.out;
import java.util.Arrays;
import org.oscim.core.GeometryBuffer;
import org.oscim.core.Tile;
import org.oscim.utils.Tessellator;
import com.badlogic.gdx.utils.SharedLibraryLoader;
public class TessellatorTest extends Tessellator{
public static void main(String[] args) {
new SharedLibraryLoader().load("vtm-jni");
GeometryBuffer e = new GeometryBuffer(128, 3);
int size = Tile.SIZE;
float x1 = -1;
float y1 = -1;
float x2 = size + 1;
float y2 = size + 1;
// always clear geometry before starting
// a different type.
e.clear();
e.startPolygon();
e.addPoint(x1, y1);
e.addPoint(x2, y1);
e.addPoint(x2, y2);
e.addPoint(x1, y2);
y1 = 5;
y2 = size - 5;
x1 = 5;
x2 = size - 5;
e.startHole();
e.addPoint(x1, y1);
e.addPoint(x2, y1);
e.addPoint(x2, y2);
e.addPoint(x1, y2);
addMesh(e);
}
static void addMesh(GeometryBuffer geom) {
int numRings = 2;
int[] result = new int[2];
long ctx = Tessellator.tessellate(geom.points, 0, geom.index, 0, numRings, result);
out.println("ok" + Arrays.toString(result));
short[] coordinates = new short[100];
while (Tessellator.tessGetVertices(ctx, coordinates, 2) > 0) {
out.println(Arrays.toString(coordinates));
}
while (Tessellator.tessGetIndices(ctx, coordinates) > 0) {
out.println(Arrays.toString(coordinates));
}
Tessellator.tessFinish(ctx);
}
}

View File

@ -0,0 +1,48 @@
package org.oscim.test;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import org.oscim.awt.AwtGraphics;
import org.oscim.backend.AssetAdapter;
import org.oscim.core.GeometryBuffer.GeometryType;
import org.oscim.core.Tag;
import org.oscim.core.TagSet;
import org.oscim.theme.IRenderTheme;
import org.oscim.theme.ThemeLoader;
import org.oscim.theme.VtmThemes;
import org.oscim.theme.styles.RenderStyle;
public class ThemeTest {
public static void main(String[] args) {
AwtGraphics.init();
AssetAdapter.g = new AssetAdapter() {
@Override
public InputStream openFileAsStream(String name) {
try {
return new FileInputStream("/home/jeff/src/vtm/OpenScienceMap/vtm/assets/"
+ name);
} catch (FileNotFoundException e) {
e.printStackTrace();
return null;
}
}
};
IRenderTheme t = ThemeLoader.load(VtmThemes.DEFAULT);
TagSet tags = new TagSet();
tags.add(new Tag("highway", "trunk_link"));
tags.add(new Tag("brigde", "yes"));
tags.add(new Tag("oneway", "yes"));
RenderStyle[] ri = t.matchElement(GeometryType.LINE, tags, 16);
for (RenderStyle r : ri) {
System.out.println("class: " + r.getClass().getName());
}
}
}

View File

@ -0,0 +1,127 @@
package org.oscim.test;
import org.oscim.core.MercatorProjection;
import org.oscim.gdx.GdxMap;
import org.oscim.gdx.GdxMapApp;
import org.oscim.layers.tile.MapTile;
import org.oscim.layers.tile.MapTile.TileNode;
import org.oscim.layers.tile.TileLoader;
import org.oscim.layers.tile.TileManager;
import org.oscim.layers.tile.TileSet;
import org.oscim.layers.tile.VectorTileRenderer;
import org.oscim.layers.tile.bitmap.BitmapTileLayer;
import org.oscim.layers.tile.vector.VectorTileLayer;
import org.oscim.layers.tile.vector.VectorTileLoader;
import org.oscim.renderer.MapRenderer;
import org.oscim.theme.DebugTheme;
import org.oscim.tiling.TileSource;
import org.oscim.tiling.source.bitmap.DefaultSources;
import org.oscim.tiling.source.oscimap4.OSciMap4TileSource;
public class TileRenderTest extends GdxMap {
static boolean loadOneTile = true;
static int tileX = 34365 >> 2;
static int tileY = 21333 >> 2;
static byte tileZ = 14;
@Override
public void createLayers() {
final TileManager tileManager;
MapRenderer.setBackgroundColor(0xff888888);
MapTile tile = new MapTile(null, tileX, tileY, tileZ);
double w = 1.0 / (1 << tile.zoomLevel);
double minLon = MercatorProjection.toLongitude(tile.x);
double maxLon = MercatorProjection.toLongitude(tile.x + w);
double minLat = MercatorProjection.toLatitude(tile.y + w);
double maxLat = MercatorProjection.toLatitude(tile.y);
mMap.setMapPosition(minLat + (maxLat - minLat) / 2, minLon
+ (maxLon - minLon) / 2, 1 << tile.zoomLevel);
// mMap.setMapPosition(53.0521, 8.7951, 1 << 15);
if (loadOneTile) {
tile = new MapTile(new TileNode(), tileX, tileY, tileZ);
// setup tile quad-tree, expected for locking
// tile.node= new ;
tile.node.parent = tile.node;
tile.node.parent.parent = tile.node;
// setup TileSet contatining one tile
final TileSet tiles = new TileSet();
tiles.cnt = 1;
tiles.tiles[0] = tile;
tiles.lockTiles();
tileManager = new TileManager(mMap, 0, 32, 100) {
@Override
public boolean getActiveTiles(TileSet tileSet) {
if (tileSet == null)
tileSet = new TileSet(1);
tileSet.setTiles(tiles);
return true;
}
@Override
public void releaseTiles(TileSet tileSet) {
tileSet.releaseTiles();
}
};
} else {
// create TileManager and calculate tiles for current position
tileManager = new TileManager(mMap, 0, 32, 100);
tileManager.init();
tileManager.update(mMap.getMapPosition());
}
final VectorTileLoader[] tileLoader = { null };
VectorTileLayer l = new VectorTileLayer(mMap, tileManager,
new VectorTileRenderer(), 1) {
protected TileLoader createLoader() {
tileLoader[0] = new VectorTileLoader(this) {
public boolean loadTile(MapTile tile) {
mTile = tile;
return super.loadTile(tile);
}
};
return tileLoader[0];
};
};
TileSource tileSource = new OSciMap4TileSource();
l.setTileSource(tileSource);
//IRenderTheme theme = ThemeLoader.load(VtmThemes.TRONRENDER);
//l.setRenderTheme(theme);
l.setRenderTheme(new DebugTheme());
if (loadOneTile) {
tileLoader[0].loadTile(tile);
tileManager.jobCompleted(tile, true);
} else {
MapTile t;
while ((t = tileManager.getTileJob()) != null) {
tileLoader[0].loadTile(t);
tileManager.jobCompleted(t, true);
}
}
mMap.setBackgroundMap(new BitmapTileLayer(mMap, new DefaultSources.StamenToner()));
mMap.layers().add(l);
}
public static void main(String[] args) {
GdxMapApp.init();
GdxMapApp.run(new TileRenderTest(), null, 256);
}
}

View File

@ -0,0 +1,144 @@
package org.oscim.test.renderer;
import java.util.Arrays;
import org.oscim.backend.canvas.Color;
import org.oscim.backend.canvas.Paint.Cap;
import org.oscim.gdx.GdxMap;
import org.oscim.gdx.GdxMapApp;
import org.oscim.layers.GenericLayer;
import org.oscim.renderer.ElementRenderer;
import org.oscim.renderer.GLViewport;
import org.oscim.renderer.atlas.TextureAtlas;
import org.oscim.renderer.atlas.TextureAtlas.Rect;
import org.oscim.renderer.atlas.TextureAtlas.Slot;
import org.oscim.renderer.elements.LineLayer;
import org.oscim.renderer.elements.TextItem;
import org.oscim.renderer.elements.TextLayer;
import org.oscim.theme.styles.LineStyle;
import org.oscim.theme.styles.TextStyle;
import org.oscim.theme.styles.TextStyle.TextBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class AtlasTest extends GdxMap {
@Override
protected void createLayers() {
mMap.setMapPosition(0, 0, 1 << 4);
mMap.layers().add(new GenericLayer(mMap, new AtlasRenderLayer()));
}
public static void main(String[] args) {
GdxMapApp.init();
GdxMapApp.run(new AtlasTest(), null, 400);
}
static class AtlasRenderLayer extends ElementRenderer {
Logger log = LoggerFactory.getLogger(AtlasRenderLayer.class);
public AtlasRenderLayer() {
TextureAtlas mAtlas = TextureAtlas.create(2048, 2048, 1);
LineLayer ll = layers.getLineLayer(0);
ll.line = new LineStyle(Color.BLUE, 3, Cap.BUTT);
ll.scale = 1f;
LineLayer ll2 = layers.getLineLayer(1);
ll2.line = new LineStyle(Color.RED, 3, Cap.BUTT);
ll2.scale = 1f;
LineLayer ll3 = layers.getLineLayer(2);
ll3.line = new LineStyle(Color.GREEN, 3, Cap.BUTT);
ll3.scale = 1f;
TextLayer tl = new TextLayer();
TextStyle t = new TextBuilder().setFontSize(20).setColor(Color.BLACK).build();
layers.setTextureLayers(tl);
float[] points = new float[10];
for (int i = 0; i < 400; i++) {
int w = (int) (20 + Math.random() * 256);
int h = (int) (20 + Math.random() * 56);
Rect r = mAtlas.getRegion(w, h);
if (r == null) {
log.debug("no space left");
continue;
}
r.x += 1;
r.y += 1;
points[0] = r.x;
points[1] = r.y;
points[2] = r.x + (r.w - 2);
points[3] = r.y;
points[4] = r.x + (r.w - 2);
points[5] = r.y + (r.h - 2);
points[6] = r.x;
points[7] = r.y + (r.h - 2);
points[8] = r.x;
points[9] = r.y;
ll.addLine(points, 10, false);
r.x += 1;
r.y += 1;
points[0] = r.x;
points[1] = r.y;
points[2] = r.x + (w - 4);
points[3] = r.y;
points[4] = r.x + (w - 4);
points[5] = r.y + (h - 4);
points[6] = r.x;
points[7] = r.y + (h - 4);
points[8] = r.x;
points[9] = r.y;
log.debug("add region: " + Arrays.toString(points));
ll2.addLine(points, 10, false);
TextItem ti = TextItem.pool.get();
ti.set(r.x + r.w / 2, r.y + r.h / 2, "" + i, t);
ti.x1 = 0;
ti.y1 = 1; // (short) (size / 2);
ti.x2 = 1; // (short) size;
ti.y2 = 1;
tl.addText(ti);
}
for (Slot s = mAtlas.mSlots; s != null; s = s.next) {
points[0] = s.x;
points[1] = s.y;
points[2] = s.x + s.w;
points[3] = s.y;
points[4] = s.x + s.w;
points[5] = 2048;
points[6] = s.x;
points[7] = 2048;
points[8] = s.x;
points[9] = s.y;
ll3.addLine(points, 10, false);
}
tl.prepare();
//tl.labels = TextItem.pool.releaseAll(tl.labels);
}
boolean initial = true;
@Override
protected void update(GLViewport v) {
if (initial) {
mMapPosition.copy(v.pos);
initial = false;
compile();
}
}
}
}

View File

@ -0,0 +1,88 @@
package org.oscim.test.renderer;
import java.util.List;
import org.oscim.backend.canvas.Color;
import org.oscim.core.GeometryBuffer;
import org.oscim.core.Point;
import org.oscim.gdx.GdxMap;
import org.oscim.gdx.GdxMapApp;
import org.oscim.layers.GenericLayer;
import org.oscim.renderer.ElementRenderer;
import org.oscim.renderer.GLViewport;
import org.oscim.renderer.elements.LineLayer;
import org.oscim.theme.styles.LineStyle;
import org.oscim.utils.geom.BezierPath;
public class BezierTest extends GdxMap {
@Override
protected void createLayers() {
mMap.layers().add(new GenericLayer(mMap, new BezierPathLayer()));
}
public static void main(String[] args) {
GdxMapApp.init();
GdxMapApp.run(new BezierTest(), null, 400);
}
static class BezierPathLayer extends ElementRenderer {
public BezierPathLayer() {
mMapPosition.scale = 0;
GeometryBuffer g = new GeometryBuffer(100, 1);
g.startLine();
Point[] pts = new Point[10];
for (int i = 0; i < 10; i++) {
pts[i] = new Point(i * 3, (i * i) % 3 * 4);
pts[i].x *= 10;
pts[i].y *= 10;
// System.out.println(pts[i]);
g.addPoint(pts[i]);
}
LineLayer ll = layers.addLineLayer(0, new LineStyle(Color.BLUE, 2f));
ll.addLine(g);
List<Point> ctrl = BezierPath.cubicSplineControlPoints(pts, 0.1f);
g.clear();
g.startLine();
Point p0 = pts[0];
for (int j = 1, k = 0; j < pts.length; j++) {
Point p1 = ctrl.get(k++);
Point p2 = ctrl.get(k++);
Point p3 = pts[j];
System.out.println(">>> " + p1 + " " + p2);
for (int i = 0; i < 10; i++) {
double mu = (i / 10f);
Point p = BezierPath.cubicBezier(p0, p1, p2, p3, mu);
g.addPoint(p);
System.out.println(mu + " " + p);
}
p0 = p3;
}
ll = layers.addLineLayer(1, new LineStyle(Color.CYAN, 2f));
ll.addLine(g);
}
public synchronized void clear() {
layers.clear();
setReady(false);
}
@Override
protected synchronized void update(GLViewport v) {
if (mMapPosition.scale == 0)
mMapPosition.copy(v.pos);
if (!isReady()) {
compile();
}
}
}
}

View File

@ -0,0 +1,164 @@
/*
* Copyright 2013 Hannes Janetzek
*
* This file is part of the OpenScienceMap project (http://www.opensciencemap.org).
*
* 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.oscim.test.renderer;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import org.oscim.backend.GL20;
import org.oscim.core.MapPosition;
import org.oscim.map.Map;
import org.oscim.renderer.GLShader;
import org.oscim.renderer.GLState;
import org.oscim.renderer.GLUtils;
import org.oscim.renderer.GLViewport;
import org.oscim.renderer.LayerRenderer;
/*
* This is an example how to integrate custom OpenGL drawing routines as map overlay
*
* based on chapter 2 from:
* https://github.com/dalinaum/opengl-es-book-samples/tree/master/Android
* */
public class CustomRenderer extends LayerRenderer {
private final Map mMap;
private final MapPosition mMapPosition;
private int mProgramObject;
private int hVertexPosition;
private int hMatrixPosition;
private FloatBuffer mVertices;
private final float[] mVerticesData = {
-200, -200, 1.0f,
200, 200, 0,
-200, 200, 0.5f,
200, -200, 0.5f,
};
private boolean mInitialized;
public CustomRenderer(Map map) {
mMap = map;
mMapPosition = new MapPosition();
}
// ---------- everything below runs in GLRender Thread ----------
@Override
protected void update(GLViewport v) {
if (!mInitialized) {
if (!init())
return;
mInitialized = true;
// fix current MapPosition
mMapPosition.copy(v.pos);
compile();
}
}
protected void compile() {
// modify mVerticesData and put in FloatBuffer
mVertices.clear();
mVertices.put(mVerticesData);
mVertices.flip();
setReady(true);
}
@Override
protected void render(GLViewport v) {
// Use the program object
GLState.useProgram(mProgramObject);
GLState.blend(true);
GLState.test(false, false);
// unbind previously bound VBOs
GL.glBindBuffer(GL20.GL_ARRAY_BUFFER, 0);
// Load the vertex data
//mVertices.position(0);
GL.glVertexAttribPointer(hVertexPosition, 3, GL20.GL_FLOAT, false, 0, mVertices);
//mVertices.position(2);
//GL.glVertexAttribPointer(hVertexPosition, 2, GL20.GL_FLOAT, false, 4, mVertices);
GLState.enableVertexArrays(hVertexPosition, -1);
/* apply view and projection matrices */
// set mvp (tmp) matrix relative to mMapPosition
// i.e. fixed on the map
float ratio = 1f / mMap.getWidth();
v.mvp.setScale(ratio, ratio, 1);
v.mvp.multiplyLhs(v.proj);
v.mvp.setAsUniform(hMatrixPosition);
// Draw the triangle
GL.glDrawArrays(GL20.GL_TRIANGLE_STRIP, 0, 4);
GLUtils.checkGlError("...");
}
private boolean init() {
// Load the vertex/fragment shaders
int programObject = GLShader.createProgram(vShaderStr, fShaderStr);
if (programObject == 0)
return false;
// Handle for vertex position in shader
hVertexPosition = GL.glGetAttribLocation(programObject, "a_pos");
hMatrixPosition = GL.glGetUniformLocation(programObject, "u_mvp");
// Store the program object
mProgramObject = programObject;
mVertices = ByteBuffer.allocateDirect(mVerticesData.length * 4)
.order(ByteOrder.nativeOrder()).asFloatBuffer();
return true;
}
private final static String vShaderStr = "" +
"precision mediump float;"
+ "uniform mat4 u_mvp;"
+ "attribute vec4 a_pos;"
+ "varying float alpha;"
+ "void main()"
+ "{"
+ " gl_Position = u_mvp * vec4(a_pos.xy, 0.0, 1.0);"
+ " alpha = a_pos.z;"
+ "}";
private final static String fShaderStr = "" +
"precision mediump float;"
+ "varying float alpha;"
+ "void main()"
+ "{"
+ " gl_FragColor = vec4 (alpha, 1.0-alpha, 0.0, 0.7 );"
+ "}";
}

View File

@ -0,0 +1,210 @@
package org.oscim.test.renderer;
import java.nio.FloatBuffer;
import org.oscim.backend.GL20;
import org.oscim.backend.canvas.Color;
import org.oscim.gdx.GdxMap;
import org.oscim.gdx.GdxMapApp;
import org.oscim.layers.GenericLayer;
import org.oscim.renderer.BufferObject;
import org.oscim.renderer.ElementRenderer;
import org.oscim.renderer.GLShader;
import org.oscim.renderer.GLState;
import org.oscim.renderer.GLUtils;
import org.oscim.renderer.GLViewport;
import org.oscim.renderer.MapRenderer;
import org.oscim.utils.FastMath;
public class HexagonRenderTest extends GdxMap {
@Override
protected void createLayers() {
mMap.setMapPosition(0, 0, 1 << 4);
mMap.layers().add(new GenericLayer(mMap, new HexagonRenderer()));
}
public static void main(String[] args) {
GdxMapApp.init();
GdxMapApp.run(new HexagonRenderTest(), null, 400);
}
/* This is an example how to integrate custom OpenGL drawing routines as map
* overlay
*
* based on chapter 2 from:
* https://github.com/dalinaum/opengl-es-book-samples/tree/master/Android */
static class HexagonRenderer extends ElementRenderer {
private int mProgramObject;
private int hVertexPosition;
private int hMatrixPosition;
private int hColorPosition;
private int hCenterPosition;
//private FloatBuffer mVertices;
private boolean mInitialized;
private BufferObject mVBO;
int mZoom = -1;
float mCellScale = 60 * MapRenderer.COORD_SCALE;
@Override
protected void update(GLViewport v) {
if (!mInitialized) {
if (!init()) {
return;
}
mInitialized = true;
compile();
mMapPosition.copy(v.pos);
}
//if (mZoom != v.pos.zoomLevel) {
// mMapPosition.copy(v.pos);
// mZoom = v.pos.zoomLevel;
//}
}
@Override
protected void compile() {
float[] vertices = new float[12];
for (int i = 0; i < 6; i++) {
vertices[i * 2 + 0] = (float) Math.cos(Math.PI * 2 * i / 6) * mCellScale;
vertices[i * 2 + 1] = (float) Math.sin(Math.PI * 2 * i / 6) * mCellScale;
}
FloatBuffer buf = MapRenderer.getFloatBuffer(12);
buf.put(vertices);
mVBO = BufferObject.get(GL20.GL_ARRAY_BUFFER, 0);
mVBO.loadBufferData(buf.flip(), 12 * 4);
setReady(true);
}
@Override
protected void render(GLViewport v) {
// Use the program object
GLState.useProgram(mProgramObject);
GLState.blend(true);
GLState.test(false, false);
// bind VBO data
mVBO.bind();
// set VBO vertex layout
GL.glVertexAttribPointer(hVertexPosition, 2, GL20.GL_FLOAT, false, 0, 0);
GLState.enableVertexArrays(hVertexPosition, -1);
/* apply view and projection matrices */
// set mvp (tmp) matrix relative to mMapPosition
// i.e. fixed on the map
setMatrix(v);
v.mvp.setAsUniform(hMatrixPosition);
final int offset_x = 4;
final int offset_y = 16;
float h = (float) (Math.sqrt(3) / 2);
for (int y = -offset_y; y < offset_y; y++) {
for (int x = -offset_x; x < offset_x; x++) {
float xx = x * 2 + (y % 2 == 0 ? 1 : 0);
float yy = y * h + h / 2;
GL.glUniform2f(hCenterPosition, xx * (mCellScale * 1.5f), yy * mCellScale);
//float alpha = 1 + (float) Math.log10(FastMath.clamp(
// (float) Math.sqrt(xx * xx + yy * yy) / offset_y, 0.0f, 1.0f)) * 2;
float alpha = (float) Math.sqrt(xx * xx + yy * yy) / offset_y;
float fy = (float) (y + offset_y) / (offset_y * 2);
float fx = (float) (x + offset_x) / (offset_x * 2);
float fz = FastMath.clamp(
(float) (x < 0 || y < 0 ? 1 - Math.sqrt(fx * fx + fy
* fy)
: 0),
0,
1);
int c = 0xff << 24
| (int) (0xff * fy) << 16
| (int) (0xff * fx) << 8
| (int) (0xff * fz);
GLUtils.setColor(hColorPosition, c, alpha);
GL.glDrawArrays(GL20.GL_TRIANGLE_FAN, 0, 6);
}
}
GLUtils.setColor(hColorPosition, Color.DKGRAY, 0.3f);
for (int y = -offset_y; y < offset_y; y++) {
for (int x = -offset_x; x < offset_x; x++) {
float xx = x * 2 + (y % 2 == 0 ? 1 : 0);
float yy = y * h + h / 2;
GL.glUniform2f(hCenterPosition, xx * (mCellScale * 1.5f), yy * mCellScale);
GL.glDrawArrays(GL20.GL_LINE_LOOP, 0, 6);
}
}
GLUtils.checkGlError("...");
}
private boolean init() {
// Load the vertex/fragment shaders
int programObject = GLShader.createProgram(vShaderStr, fShaderStr);
if (programObject == 0)
return false;
// Handle for vertex position in shader
hVertexPosition = GL.glGetAttribLocation(programObject, "a_pos");
hMatrixPosition = GL.glGetUniformLocation(programObject, "u_mvp");
hColorPosition = GL.glGetUniformLocation(programObject, "u_color");
hCenterPosition = GL.glGetUniformLocation(programObject, "u_center");
// Store the program object
mProgramObject = programObject;
return true;
}
private final static String vShaderStr = ""
+ "#ifdef GLES\n"
+ "precision mediump float;\n"
+ "#endif\n"
+ "uniform mat4 u_mvp;"
+ "uniform vec2 u_center;"
+ "attribute vec2 a_pos;"
+ "void main()"
+ "{"
+ " gl_Position = u_mvp * vec4(u_center + a_pos, 0.0, 1.0);"
+ "}";
private final static String fShaderStr = ""
+ "#ifdef GLES\n"
+ "precision mediump float;\n"
+ "#endif\n"
+ "varying float alpha;"
+ "uniform vec4 u_color;"
+ "void main()"
+ "{"
+ " gl_FragColor = u_color;"
+ "}";
}
}

View File

@ -0,0 +1,52 @@
/*
* Copyright 2013 Hannes Janetzek
*
* This file is part of the OpenScienceMap project (http://www.opensciencemap.org).
*
* 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.oscim.test.renderer;
import org.oscim.backend.CanvasAdapter;
import org.oscim.renderer.ElementRenderer;
import org.oscim.renderer.GLViewport;
import org.oscim.renderer.elements.SymbolItem;
import org.oscim.renderer.elements.SymbolLayer;
public class SymbolRenderLayer extends ElementRenderer {
boolean initialize = true;
public SymbolRenderLayer() {
SymbolLayer l = new SymbolLayer();
layers.setTextureLayers(l);
SymbolItem it = SymbolItem.pool.get();
it.billboard = false;
try {
it.bitmap = CanvasAdapter.g.loadBitmapAsset("jar:symbols/cafe.png");
} catch (Exception e) {
e.printStackTrace();
}
l.addSymbol(it);
}
@Override
protected void update(GLViewport v) {
if (initialize) {
initialize = false;
mMapPosition.copy(v.pos);
compile();
}
}
}