From d492358a945fa675044406036dfe7e84ed4a5d06 Mon Sep 17 00:00:00 2001 From: Hannes Janetzek Date: Wed, 26 Nov 2014 18:39:50 +0100 Subject: [PATCH] sync viewport --- .../src/org/oscim/android/MapView.java | 35 ++++++++------- vtm-gdx/src/org/oscim/gdx/GdxMap.java | 44 +++++++++---------- vtm/src/org/oscim/map/Map.java | 4 +- vtm/src/org/oscim/renderer/MapRenderer.java | 23 ++-------- 4 files changed, 46 insertions(+), 60 deletions(-) diff --git a/vtm-android/src/org/oscim/android/MapView.java b/vtm-android/src/org/oscim/android/MapView.java index 613ceda2..d8c7c712 100644 --- a/vtm-android/src/org/oscim/android/MapView.java +++ b/vtm-android/src/org/oscim/android/MapView.java @@ -174,14 +174,16 @@ public class MapView extends GLSurfaceView { @Override public void updateMap(boolean redraw) { - if (mPausing) - return; + synchronized (mRedrawCb) { + if (mPausing) + return; - if (!mRenderRequest) { - mRenderRequest = true; - mMapView.post(mRedrawCb); - } else { - mRenderWait = true; + if (!mRenderRequest) { + mRenderRequest = true; + mMapView.post(mRedrawCb); + } else { + mRenderWait = true; + } } } @@ -190,7 +192,8 @@ public class MapView extends GLSurfaceView { if (mPausing) return; - updateMap(true); + /** TODO should not need to call prepareFrame in mRedrawCb */ + updateMap(false); } @Override @@ -198,15 +201,13 @@ public class MapView extends GLSurfaceView { } @Override - public void doneFrame() { - mRenderRequest = false; - - if (mRenderWait) { - //log.debug("redraw"); - mRenderWait = false; - updateMap(true); - //prepareFrame(); - //mGLView.requestRender(); + public void doneFrame(boolean animate) { + synchronized (mRedrawCb) { + mRenderRequest = false; + if (animate || mRenderWait) { + mRenderWait = false; + render(); + } } } diff --git a/vtm-gdx/src/org/oscim/gdx/GdxMap.java b/vtm-gdx/src/org/oscim/gdx/GdxMap.java index 20fa383a..288d8408 100644 --- a/vtm-gdx/src/org/oscim/gdx/GdxMap.java +++ b/vtm-gdx/src/org/oscim/gdx/GdxMap.java @@ -157,24 +157,25 @@ public abstract class GdxMap implements ApplicationListener { @Override public void updateMap(boolean forceRender) { - - if (!mRenderRequest) { - mRenderRequest = true; - Gdx.app.postRunnable(mRedrawCb); - } else { - mRenderWait = true; + synchronized (mRedrawCb) { + if (!mRenderRequest) { + mRenderRequest = true; + Gdx.app.postRunnable(mRedrawCb); + } else { + mRenderWait = true; + } } } @Override public void render() { - //updateMap(true); - - mRenderRequest = true; - if (mClearMap) - updateMap(false); - else { - Gdx.graphics.requestRendering(); + synchronized (mRedrawCb) { + mRenderRequest = true; + if (mClearMap) + updateMap(false); + else { + Gdx.graphics.requestRendering(); + } } } @@ -200,16 +201,13 @@ public abstract class GdxMap implements ApplicationListener { } @Override - public void doneFrame() { - mRenderRequest = false; - - if (mRenderWait) { - mRenderWait = false; - - mRenderRequest = true; - - prepareFrame(); - Gdx.graphics.requestRendering(); + public void doneFrame(boolean animate) { + synchronized (mRedrawCb) { + mRenderRequest = false; + if (animate || mRenderWait) { + mRenderWait = false; + updateMap(true); + } } } } diff --git a/vtm/src/org/oscim/map/Map.java b/vtm/src/org/oscim/map/Map.java index 9737ae8d..e7dcd053 100644 --- a/vtm/src/org/oscim/map/Map.java +++ b/vtm/src/org/oscim/map/Map.java @@ -340,7 +340,9 @@ public abstract class Map implements TaskQueue { return mLayers.handleGesture(g, e); } + /** Called on render thread, use synchronized! */ public abstract void beginFrame(); - public abstract void doneFrame(); + /** Called on render thread, use synchronized! */ + public abstract void doneFrame(boolean needsRedraw); } diff --git a/vtm/src/org/oscim/renderer/MapRenderer.java b/vtm/src/org/oscim/renderer/MapRenderer.java index 63fe7152..f55fc2bc 100644 --- a/vtm/src/org/oscim/renderer/MapRenderer.java +++ b/vtm/src/org/oscim/renderer/MapRenderer.java @@ -70,33 +70,22 @@ public class MapRenderer { mClearColor = GLUtils.colorToFloat(color); } - private final Runnable renderBegin = new Runnable() { - @Override - public void run() { - mMap.beginFrame(); - } - }; - private final Runnable renderDone = new Runnable() { - @Override - public void run() { - mMap.doneFrame(); - } - }; - public void onDrawFrame() { frametime = System.currentTimeMillis(); + rerender = false; - mMap.post(renderBegin); + mMap.beginFrame(); draw(); - mMap.post(renderDone); + mMap.doneFrame(rerender); mBufferPool.releaseBuffers(); TextureItem.disposeTextures(); } private void draw() { + GLState.setClearColor(mClearColor); gl.depthMask(true); @@ -150,10 +139,6 @@ public class MapRenderer { BufferObject.checkBufferUsage(true); // FIXME also throw out some textures etc } - if (rerender) { - mMap.render(); - rerender = false; - } } public void onSurfaceChanged(int width, int height) {