move 'fillCoordinates' and uploadLayers from MapRenderer to ElementRenderer

- handle MeshLayer in ElementRenderer
This commit is contained in:
Hannes Janetzek 2013-09-25 02:58:58 +02:00
parent c519a4f34b
commit a9d9c97bff
3 changed files with 71 additions and 55 deletions

View File

@ -14,7 +14,10 @@
*/
package org.oscim.renderer;
import java.nio.ShortBuffer;
import org.oscim.backend.GL20;
import org.oscim.backend.Log;
import org.oscim.core.MapPosition;
import org.oscim.core.Tile;
import org.oscim.renderer.MapRenderer.Matrices;
@ -22,16 +25,21 @@ import org.oscim.renderer.elements.BitmapLayer;
import org.oscim.renderer.elements.ElementLayers;
import org.oscim.renderer.elements.LineLayer;
import org.oscim.renderer.elements.LineTexLayer;
import org.oscim.renderer.elements.MeshLayer;
import org.oscim.renderer.elements.PolygonLayer;
import org.oscim.renderer.elements.RenderElement;
import org.oscim.renderer.elements.TextureLayer;
import org.oscim.utils.FastMath;
/**
* Base class to use the renderer.sublayers for drawing
* Base class to use the renderer.elements for drawing
*/
public abstract class ElementRenderer extends LayerRenderer {
private static final String TAG = ElementRenderer.class.getName();
private static short[] fillCoords;
/**
* Use mMapPosition.copy(position) to keep the position for which
* the Overlay is _compiled_. NOTE: required by setMatrix utility
@ -44,6 +52,21 @@ public abstract class ElementRenderer extends LayerRenderer {
public ElementRenderer() {
layers = new ElementLayers();
mMapPosition = new MapPosition();
if (fillCoords == null) {
// tile fill coords
short min = (short) 0;
short max = (short) (Tile.SIZE * MapRenderer.COORD_SCALE);
fillCoords = new short[8];
fillCoords[0] = min;
fillCoords[1] = max;
fillCoords[2] = max;
fillCoords[3] = max;
fillCoords[4] = min;
fillCoords[5] = min;
fillCoords[6] = max;
fillCoords[7] = min;
}
}
/**
@ -76,6 +99,15 @@ public abstract class ElementRenderer extends LayerRenderer {
case RenderElement.TEXLINE:
l = LineTexLayer.Renderer.draw(layers, l, curPos, m, div);
break;
case RenderElement.MESH:
l = MeshLayer.Renderer.draw(pos, l, m);
break;
default:
Log.d(TAG, "invalid layer");
l = l.next;
break;
}
}
}
@ -105,6 +137,7 @@ public abstract class ElementRenderer extends LayerRenderer {
*/
protected void compile() {
int newSize = layers.getSize();
if (newSize <= 0) {
BufferObject.release(layers.vbo);
layers.vbo = null;
@ -115,10 +148,40 @@ public abstract class ElementRenderer extends LayerRenderer {
if (layers.vbo == null)
layers.vbo = BufferObject.get(GL20.GL_ARRAY_BUFFER, newSize);
if (MapRenderer.uploadLayers(layers, newSize, true))
if (uploadLayers(layers, newSize, true))
setReady(true);
}
public static boolean uploadLayers(ElementLayers layers, int newSize,
boolean addFill) {
// add fill coordinates
if (addFill)
newSize += 8;
ShortBuffer sbuf = MapRenderer.getShortBuffer(newSize);
if (addFill)
sbuf.put(fillCoords, 0, 8);
layers.compile(sbuf, addFill);
sbuf.flip();
if (newSize != sbuf.remaining()) {
Log.d(TAG, "wrong size: "
+ " new size: " + newSize
+ " buffer pos: " + sbuf.position()
+ " buffer limit: " + sbuf.limit()
+ " buffer fill: " + sbuf.remaining());
return false;
}
// * SHORT_BYTES
newSize *= 2;
layers.vbo.loadBufferData(sbuf, newSize);
return true;
}
/**
* Utility: Set matrices.mvp matrix relative to the difference of current
* MapPosition and the last updated Overlay MapPosition.
@ -148,7 +211,8 @@ public abstract class ElementRenderer extends LayerRenderer {
matrices.mvp.setTransScale((float) (x * tileScale),
(float) (y * tileScale),
(float) ((position.scale / oPos.scale) / MapRenderer.COORD_SCALE));
(float) (position.scale / oPos.scale)
/ MapRenderer.COORD_SCALE);
matrices.mvp.multiplyLhs(project ? matrices.viewproj : matrices.view);
}

View File

@ -24,7 +24,6 @@ import org.oscim.backend.GL20;
import org.oscim.backend.GLAdapter;
import org.oscim.backend.Log;
import org.oscim.core.MapPosition;
import org.oscim.core.Tile;
import org.oscim.map.Map;
import org.oscim.map.Viewport;
import org.oscim.renderer.elements.ElementLayers;
@ -37,21 +36,15 @@ public class MapRenderer {
static GL20 GL;
private static final int SHORT_BYTES = 2;
private static final int CACHE_TILES_MAX = 250;
/** scale factor used for short vertices */
public static final float COORD_SCALE = 8.0f;
static int CACHE_TILES = CACHE_TILES_MAX;
private static Map mMap;
public static int screenWidth, screenHeight;
private static Viewport mViewport;
private static MapPosition mMapPosition;
private static short[] mFillCoords;
public class Matrices {
/** Do not modify! */
@ -153,20 +146,6 @@ public class MapRenderer {
mMapPosition = new MapPosition();
mMatrices = new Matrices();
// tile fill coords
short min = (short) 0;
short max = (short) (Tile.SIZE * COORD_SCALE);
mFillCoords = new short[8];
mFillCoords[0] = min;
mFillCoords[1] = max;
mFillCoords[2] = max;
mFillCoords[3] = max;
mFillCoords[4] = min;
mFillCoords[5] = min;
mFillCoords[6] = max;
mFillCoords[7] = min;
mBufferPool = new BufferPool();
// FIXME should be done in 'destroy' method
@ -230,34 +209,6 @@ public class MapRenderer {
return b.intBuffer;
}
public static boolean uploadLayers(ElementLayers layers, int newSize,
boolean addFill) {
// add fill coordinates
if (addFill)
newSize += 8;
ShortBuffer sbuf = getShortBuffer(newSize);
if (addFill)
sbuf.put(mFillCoords, 0, 8);
layers.compile(sbuf, addFill);
sbuf.flip();
if (newSize != sbuf.remaining()) {
Log.d(TAG, "wrong size: "
+ " new size: " + newSize
+ " buffer pos: " + sbuf.position()
+ " buffer limit: " + sbuf.limit()
+ " buffer fill: " + sbuf.remaining());
return false;
}
newSize *= SHORT_BYTES;
layers.vbo.loadBufferData(sbuf, newSize);
return true;
}
public void onDrawFrame() {
// prevent main thread recreating all tiles (updateMap)
@ -429,7 +380,7 @@ public class MapRenderer {
GLUtils.init(GL);
// Set up some vertex buffer objects
BufferObject.init(GL, CACHE_TILES);
BufferObject.init(GL, 200);
// classes that require GL context for initialization
ElementLayers.initRenderer(GL);

View File

@ -22,6 +22,7 @@ import org.oscim.backend.Log;
import org.oscim.core.MapPosition;
import org.oscim.core.Tile;
import org.oscim.renderer.BufferObject;
import org.oscim.renderer.ElementRenderer;
import org.oscim.renderer.GLMatrix;
import org.oscim.renderer.LayerRenderer;
import org.oscim.renderer.MapRenderer;
@ -169,7 +170,7 @@ public class TileRenderer extends LayerRenderer {
if (tile.layers.vbo == null)
tile.layers.vbo = BufferObject.get(GL20.GL_ARRAY_BUFFER, newSize);
if (!MapRenderer.uploadLayers(tile.layers, newSize, true)) {
if (!ElementRenderer.uploadLayers(tile.layers, newSize, true)) {
Log.d(TAG, "BUG uploadTileData " + tile + " failed!");
BufferObject.release(tile.layers.vbo);