move 'fillCoordinates' and uploadLayers from MapRenderer to ElementRenderer
- handle MeshLayer in ElementRenderer
This commit is contained in:
parent
c519a4f34b
commit
a9d9c97bff
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user