374 lines
8.1 KiB
Java
374 lines
8.1 KiB
Java
package org.oscim.gdx;
|
|
|
|
import org.oscim.backend.AssetAdapter;
|
|
import org.oscim.backend.Log;
|
|
import org.oscim.backend.input.MotionEvent;
|
|
import org.oscim.layers.tile.vector.MapTileLayer;
|
|
import org.oscim.renderer.GLRenderer;
|
|
import org.oscim.renderer.GLState;
|
|
import org.oscim.theme.InternalRenderTheme;
|
|
import org.oscim.tilesource.TileSource;
|
|
import org.oscim.tilesource.oscimap2.OSciMap2TileSource;
|
|
import org.oscim.view.MapRenderCallback;
|
|
import org.oscim.view.MapView;
|
|
import org.oscim.view.MapViewPosition;
|
|
|
|
import com.badlogic.gdx.ApplicationListener;
|
|
import com.badlogic.gdx.Gdx;
|
|
import com.badlogic.gdx.Input.Buttons;
|
|
import com.badlogic.gdx.InputProcessor;
|
|
|
|
public class GdxMap implements ApplicationListener, MapRenderCallback {
|
|
|
|
private final MapView mMapView;
|
|
private final GLRenderer mMapRenderer;
|
|
|
|
public GdxMap() {
|
|
AssetAdapter.g = new GdxAssetAdapter();
|
|
|
|
mMapView = new MapView(this);
|
|
mMapRenderer = new GLRenderer(mMapView);
|
|
}
|
|
|
|
// Stage ui;
|
|
// Label fps;
|
|
// BitmapFont font;
|
|
|
|
@Override
|
|
public void create() {
|
|
|
|
Gdx.graphics.setContinuousRendering(false);
|
|
|
|
if (Log.logger == null)
|
|
Log.logger = new GdxLog();
|
|
|
|
Gdx.app.log("gdx says", "Hi!");
|
|
Log.d("vtm says", "Hi!");
|
|
|
|
int w = Gdx.graphics.getWidth();
|
|
int h = Gdx.graphics.getHeight();
|
|
mWidth = w;
|
|
mHeight = h;
|
|
|
|
TileSource tileSource = new OSciMap2TileSource();
|
|
tileSource.setOption("url",
|
|
"http://city.informatik.uni-bremen.de/osci/map-live");
|
|
//TileSource tileSource = new OSciMap4TileSource();
|
|
//tileSource.setOption("url", "http://city.informatik.uni-bremen.de/osci/testing");
|
|
|
|
MapTileLayer l = mMapView.setBaseMap(tileSource);
|
|
l.setRenderTheme(InternalRenderTheme.DEFAULT);
|
|
|
|
//mMapView.getLayerManager().add(new GenericOverlay(mMapView, new
|
|
// GridRenderLayer(mMapView)));
|
|
|
|
mMapView.getMapViewPosition().setViewport(w, h);
|
|
|
|
mMapRenderer.onSurfaceCreated();
|
|
mMapRenderer.onSurfaceChanged(w, h);
|
|
|
|
Gdx.input.setInputProcessor(new TouchHandler());
|
|
|
|
// ui = new Stage(w, h, false);
|
|
// font = new BitmapFont(false);
|
|
// fps = new Label("fps: 0", new Label.LabelStyle(font, Color.WHITE));
|
|
// fps.setPosition(10, 30);
|
|
// fps.setColor(0, 1, 0, 1);
|
|
// ui.addActor(fps);
|
|
}
|
|
|
|
@Override
|
|
public void dispose() {
|
|
|
|
}
|
|
|
|
private int fpsCnt = 0;
|
|
|
|
@Override
|
|
public void render() {
|
|
// GLState.enableVertexArrays(-1, -1);
|
|
// GLState.blend(false);
|
|
// GLState.test(false, false);
|
|
|
|
mMapRenderer.onDrawFrame();
|
|
|
|
// Gdx.gl20.glBindBuffer(GL20.GL_ARRAY_BUFFER, 0);
|
|
// Gdx.gl20.glBindBuffer(GL20.GL_ELEMENT_ARRAY_BUFFER, 0);
|
|
|
|
// int f = Gdx.graphics.getFramesPerSecond();
|
|
// if (f != fpsCnt) {
|
|
// Log.d("fps", ">" + f);
|
|
// fpsCnt = f;
|
|
// }
|
|
|
|
// fps.setText("fps: " + Gdx.graphics.getFramesPerSecond());
|
|
// ui.draw();
|
|
}
|
|
|
|
@Override
|
|
public void resize(int w, int h) {
|
|
mWidth = w;
|
|
mHeight = h;
|
|
|
|
mMapView.getMapViewPosition().setViewport(w, h);
|
|
mMapRenderer.onSurfaceChanged(w, h);
|
|
}
|
|
|
|
@Override
|
|
public void pause() {
|
|
}
|
|
|
|
@Override
|
|
public void resume() {
|
|
}
|
|
|
|
/**
|
|
* Update all Layers on Main thread.
|
|
*
|
|
* @param forceRedraw
|
|
* also render frame FIXME (does nothing atm)
|
|
*/
|
|
void redrawMapInternal(boolean forceRedraw) {
|
|
GLState.blend(false);
|
|
GLState.test(false, false);
|
|
//if (forceRedraw && !mClearMap)
|
|
// Gdx.graphics.requestRendering();
|
|
|
|
mMapView.updateLayers();
|
|
|
|
//if (mClearMap) {
|
|
Gdx.graphics.requestRendering();
|
|
mClearMap = false;
|
|
//}
|
|
}
|
|
|
|
private boolean mClearMap;
|
|
|
|
public void clearMap() {
|
|
mClearMap = true;
|
|
}
|
|
|
|
/* private */boolean mWaitRedraw;
|
|
private final Runnable mRedrawRequest = new Runnable() {
|
|
@Override
|
|
public void run() {
|
|
mWaitRedraw = false;
|
|
redrawMapInternal(false);
|
|
}
|
|
};
|
|
|
|
@Override
|
|
public void updateMap(boolean forceRender) {
|
|
if (!mWaitRedraw) {
|
|
mWaitRedraw = true;
|
|
Gdx.app.postRunnable(mRedrawRequest);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void renderMap() {
|
|
if (mClearMap)
|
|
updateMap(false);
|
|
else
|
|
Gdx.graphics.requestRendering();
|
|
}
|
|
|
|
int mHeight, mWidth;
|
|
|
|
@Override
|
|
public int getWidth() {
|
|
return mWidth;
|
|
}
|
|
|
|
@Override
|
|
public int getHeight() {
|
|
return mHeight;
|
|
}
|
|
|
|
class GdxMotionEvent extends MotionEvent {
|
|
|
|
@Override
|
|
public int getAction() {
|
|
// TODO Auto-generated method stub
|
|
return 0;
|
|
}
|
|
|
|
@Override
|
|
public float getX() {
|
|
// TODO Auto-generated method stub
|
|
return 0;
|
|
}
|
|
|
|
@Override
|
|
public float getY() {
|
|
// TODO Auto-generated method stub
|
|
return 0;
|
|
}
|
|
|
|
@Override
|
|
public float getX(int idx) {
|
|
// TODO Auto-generated method stub
|
|
return 0;
|
|
}
|
|
|
|
@Override
|
|
public float getY(int idx) {
|
|
// TODO Auto-generated method stub
|
|
return 0;
|
|
}
|
|
|
|
@Override
|
|
public int getPointerCount() {
|
|
// TODO Auto-generated method stub
|
|
return 0;
|
|
}
|
|
|
|
}
|
|
|
|
class TouchHandler implements InputProcessor {
|
|
|
|
private MapViewPosition mMapPosition;
|
|
|
|
public TouchHandler() {
|
|
mMapPosition = mMapView.getMapViewPosition();
|
|
}
|
|
|
|
private boolean mActiveScale;
|
|
private boolean mActiveTilt;
|
|
private boolean mActiveRotate;
|
|
|
|
private int mPosX, mPosY;
|
|
|
|
@Override
|
|
public boolean keyDown(int keycode) {
|
|
// switch (keycode) {
|
|
//
|
|
// case Input.Keys.UP:
|
|
// mMapPosition.moveMap(0, -50);
|
|
// mMapView.redrawMap(true);
|
|
// break;
|
|
// case Input.Keys.DOWN:
|
|
// mMapPosition.moveMap(0, 50);
|
|
// mMapView.redrawMap(true);
|
|
// break;
|
|
// case Input.Keys.LEFT:
|
|
// mMapPosition.moveMap(-50, 0);
|
|
// mMapView.redrawMap(true);
|
|
// break;
|
|
// case Input.Keys.RIGHT:
|
|
// mMapPosition.moveMap(50, 0);
|
|
// mMapView.redrawMap(true);
|
|
// break;
|
|
//
|
|
// case Input.Keys.R:
|
|
// mMapView.setRenderTheme(InternalRenderTheme.DEFAULT);
|
|
// mMapView.redrawMap(true);
|
|
// break;
|
|
//
|
|
// case Input.Keys.T:
|
|
// mMapView.setRenderTheme(InternalRenderTheme.TRONRENDER);
|
|
// mMapView.redrawMap(true);
|
|
// break;
|
|
//
|
|
// }
|
|
return true;
|
|
}
|
|
|
|
@Override
|
|
public boolean keyUp(int keycode) {
|
|
return false;
|
|
}
|
|
|
|
@Override
|
|
public boolean keyTyped(char character) {
|
|
return false;
|
|
}
|
|
|
|
@Override
|
|
public boolean touchDown(int screenX, int screenY, int pointer,
|
|
int button) {
|
|
|
|
if (button == Buttons.MIDDLE) {
|
|
mActiveScale = true;
|
|
// mActiveTilt = true;
|
|
mPosY = screenY;
|
|
} else if (button == Buttons.RIGHT) {
|
|
mActiveRotate = true;
|
|
mPosX = screenX;
|
|
mPosY = screenY;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
@Override
|
|
public boolean touchUp(int screenX, int screenY, int pointer, int button) {
|
|
// Log.d(TAG, "touch up " + pointer);
|
|
mActiveScale = false;
|
|
mActiveTilt = false;
|
|
mActiveRotate = false;
|
|
|
|
return false;
|
|
}
|
|
|
|
@Override
|
|
public boolean touchDragged(int screenX, int screenY, int pointer) {
|
|
boolean changed = false;
|
|
|
|
if (mActiveScale) {
|
|
// changed = mMapPosition.tilt((screenY - mStartY) / 5f);
|
|
changed = mMapPosition.scaleMap(1 - (screenY - mPosY) / 100f,
|
|
0, 0);
|
|
mPosY = screenY;
|
|
return true;
|
|
}
|
|
|
|
if (mActiveRotate) {
|
|
mMapPosition.rotateMap((screenX - mPosX) / 500f, 0, 0);
|
|
mPosX = screenX;
|
|
mMapPosition.tiltMap((screenY - mPosY) / 10f);
|
|
mPosY = screenY;
|
|
changed = true;
|
|
}
|
|
|
|
if (!(mActiveRotate || mActiveTilt)) {
|
|
int dx = screenX - mPosX;
|
|
int dy = screenY - mPosY;
|
|
if (Math.abs(dx) > 0 || Math.abs(dy) > 0) {
|
|
mMapPosition.moveMap(dx, dy);
|
|
mPosX = screenX;
|
|
mPosY = screenY;
|
|
changed = true;
|
|
}
|
|
}
|
|
|
|
if (changed)
|
|
updateMap(true);
|
|
|
|
return true;
|
|
}
|
|
|
|
@Override
|
|
public boolean mouseMoved(int screenX, int screenY) {
|
|
mPosX = screenX;
|
|
mPosY = screenY;
|
|
return false;
|
|
}
|
|
|
|
@Override
|
|
public boolean scrolled(int amount) {
|
|
float fx = mPosX - mMapView.getWidth() / 2;
|
|
float fy = mPosY - mMapView.getHeight() / 2;
|
|
|
|
if (amount > 0)
|
|
mMapPosition.scaleMap(0.9f, fx, fy);
|
|
else
|
|
mMapPosition.scaleMap(1.1f, fx, fy);
|
|
|
|
updateMap(false);
|
|
|
|
return true;
|
|
}
|
|
|
|
}
|
|
}
|