vtm/vtm-gdx/src/org/oscim/gdx/GdxMap.java
2013-10-09 01:56:08 +02:00

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;
}
}
}