Map renderer COORD_SCALE configurable and global use (#344)
This commit is contained in:
@@ -33,6 +33,7 @@ import org.oscim.utils.FastMath;
|
||||
import java.nio.FloatBuffer;
|
||||
|
||||
import static org.oscim.backend.GLAdapter.gl;
|
||||
import static org.oscim.renderer.MapRenderer.COORD_SCALE;
|
||||
|
||||
public class HexagonRenderTest extends GdxMap {
|
||||
|
||||
@@ -66,7 +67,7 @@ public class HexagonRenderTest extends GdxMap {
|
||||
private BufferObject mVBO;
|
||||
|
||||
int mZoom = -1;
|
||||
float mCellScale = 60 * MapRenderer.COORD_SCALE;
|
||||
float mCellScale = 60 * COORD_SCALE;
|
||||
|
||||
@Override
|
||||
public void update(GLViewport v) {
|
||||
|
||||
@@ -6,13 +6,14 @@ attribute vec2 tex_coord;
|
||||
uniform mat4 u_mv;
|
||||
uniform mat4 u_proj;
|
||||
uniform float u_scale;
|
||||
uniform float u_coord_scale;
|
||||
uniform vec2 u_div;
|
||||
varying vec2 tex_c;
|
||||
const float coord_scale = 1.0/8.0;
|
||||
void
|
||||
main(){
|
||||
vec4 pos;
|
||||
vec2 dir = vertex.zw;
|
||||
float coord_scale = 1.0 / u_coord_scale;
|
||||
if (abs(mod(vertex.x, 2.0)) == 0.0) {
|
||||
pos = u_proj * (u_mv * vec4(vertex.xy + dir * u_scale, 0.0, 1.0));
|
||||
}
|
||||
|
||||
@@ -21,6 +21,8 @@ package org.oscim.renderer;
|
||||
import org.oscim.backend.canvas.Bitmap;
|
||||
import org.oscim.renderer.bucket.BitmapBucket;
|
||||
|
||||
import static org.oscim.renderer.MapRenderer.COORD_SCALE;
|
||||
|
||||
/**
|
||||
* RenderLayer to draw a custom Bitmap.
|
||||
* NOTE: Only modify the Bitmap within a synchronized block!
|
||||
@@ -91,7 +93,7 @@ public class BitmapRenderer extends BucketRenderer {
|
||||
|
||||
@Override
|
||||
public synchronized void render(GLViewport v) {
|
||||
v.useScreenCoordinates(mWidth, mHeight, position, xOffset, yOffset, 8);
|
||||
v.useScreenCoordinates(mWidth, mHeight, position, xOffset, yOffset, COORD_SCALE);
|
||||
BitmapBucket.Renderer.draw(buckets.get(), v, 1, 1);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -33,6 +33,7 @@ import org.oscim.utils.FastMath;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import static org.oscim.renderer.MapRenderer.COORD_SCALE;
|
||||
import static org.oscim.renderer.bucket.RenderBucket.BITMAP;
|
||||
import static org.oscim.renderer.bucket.RenderBucket.CIRCLE;
|
||||
import static org.oscim.renderer.bucket.RenderBucket.HAIRLINE;
|
||||
@@ -173,7 +174,7 @@ public class BucketRenderer extends LayerRenderer {
|
||||
* @param project if true apply view- and projection, or just view otherwise.
|
||||
*/
|
||||
protected void setMatrix(GLViewport v, boolean project) {
|
||||
setMatrix(v, project, MapRenderer.COORD_SCALE);
|
||||
setMatrix(v, project, COORD_SCALE);
|
||||
}
|
||||
|
||||
protected void setMatrix(GLViewport v, boolean project, float coordScale) {
|
||||
|
||||
@@ -25,6 +25,7 @@ import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import static org.oscim.backend.GLAdapter.gl;
|
||||
import static org.oscim.renderer.MapRenderer.COORD_SCALE;
|
||||
|
||||
public abstract class ExtrusionRenderer extends LayerRenderer {
|
||||
static final Logger log = LoggerFactory.getLogger(ExtrusionRenderer.class);
|
||||
@@ -254,7 +255,7 @@ public abstract class ExtrusionRenderer extends LayerRenderer {
|
||||
float x = (float) ((l.x - v.pos.x) * curScale);
|
||||
float y = (float) ((l.y - v.pos.y) * curScale);
|
||||
|
||||
v.mvp.setTransScale(x, y, scale / MapRenderer.COORD_SCALE);
|
||||
v.mvp.setTransScale(x, y, scale / COORD_SCALE);
|
||||
v.mvp.setValue(10, scale / 10);
|
||||
v.mvp.multiplyLhs(v.viewproj);
|
||||
|
||||
|
||||
@@ -38,7 +38,7 @@ public class MapRenderer {
|
||||
/**
|
||||
* scale factor used for short vertices
|
||||
*/
|
||||
public static final float COORD_SCALE = 8.0f;
|
||||
public static float COORD_SCALE = 8.0f;
|
||||
|
||||
private final Map mMap;
|
||||
private final GLViewport mViewport;
|
||||
|
||||
@@ -21,12 +21,12 @@ import org.oscim.backend.canvas.Bitmap;
|
||||
import org.oscim.renderer.GLShader;
|
||||
import org.oscim.renderer.GLState;
|
||||
import org.oscim.renderer.GLViewport;
|
||||
import org.oscim.renderer.MapRenderer;
|
||||
import org.oscim.renderer.bucket.TextureItem.TexturePool;
|
||||
|
||||
import java.nio.ShortBuffer;
|
||||
|
||||
import static org.oscim.backend.GLAdapter.gl;
|
||||
import static org.oscim.renderer.MapRenderer.COORD_SCALE;
|
||||
import static org.oscim.renderer.MapRenderer.MAX_INDICES;
|
||||
import static org.oscim.renderer.MapRenderer.bindQuadIndicesVBO;
|
||||
|
||||
@@ -84,8 +84,8 @@ public class BitmapBucket extends TextureBucket {
|
||||
|
||||
private void setVertices(ShortBuffer vboData) {
|
||||
short[] buf = mVertices;
|
||||
short w = (short) (mWidth * MapRenderer.COORD_SCALE);
|
||||
short h = (short) (mHeight * MapRenderer.COORD_SCALE);
|
||||
short w = (short) (mWidth * COORD_SCALE);
|
||||
short h = (short) (mHeight * COORD_SCALE);
|
||||
|
||||
short texMin = 0;
|
||||
short texMax = 1;
|
||||
|
||||
@@ -21,7 +21,6 @@ import org.oscim.core.GeometryBuffer;
|
||||
import org.oscim.core.GeometryBuffer.GeometryType;
|
||||
import org.oscim.core.MapElement;
|
||||
import org.oscim.core.Tile;
|
||||
import org.oscim.renderer.MapRenderer;
|
||||
import org.oscim.utils.FastMath;
|
||||
import org.oscim.utils.KeyMap;
|
||||
import org.oscim.utils.KeyMap.HashItem;
|
||||
@@ -33,11 +32,11 @@ import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.nio.ShortBuffer;
|
||||
|
||||
import static org.oscim.renderer.MapRenderer.COORD_SCALE;
|
||||
|
||||
public class ExtrusionBucket extends RenderBucket {
|
||||
static final Logger log = LoggerFactory.getLogger(ExtrusionBucket.class);
|
||||
|
||||
private static final float S = MapRenderer.COORD_SCALE;
|
||||
|
||||
private VertexData mIndices[];
|
||||
private LineClipper mClipper;
|
||||
|
||||
@@ -164,7 +163,7 @@ public class ExtrusionBucket extends RenderBucket {
|
||||
synchronized (vertexPool) {
|
||||
|
||||
Vertex key = vertexPool.get();
|
||||
double scale = S * Tile.SIZE / 4096;
|
||||
double scale = COORD_SCALE * Tile.SIZE / 4096;
|
||||
|
||||
for (int k = 0, n = index.length; k < n; ) {
|
||||
if (index[k] < 0)
|
||||
@@ -330,9 +329,9 @@ public class ExtrusionBucket extends RenderBucket {
|
||||
// v = 0;
|
||||
// }
|
||||
// /* set coordinate */
|
||||
// vertices[v++] = (short) (points[j++] * S);
|
||||
// vertices[v++] = (short) (points[j++] * S);
|
||||
// vertices[v++] = (short) (points[j++] * S);
|
||||
// vertices[v++] = (short) (points[j++] * COORD_SCALE);
|
||||
// vertices[v++] = (short) (points[j++] * COORD_SCALE);
|
||||
// vertices[v++] = (short) (points[j++] * COORD_SCALE);
|
||||
// v++;
|
||||
// }
|
||||
//
|
||||
@@ -491,8 +490,8 @@ public class ExtrusionBucket extends RenderBucket {
|
||||
} else { // if (addFace)
|
||||
short c = (short) (color1 | fcolor << 8);
|
||||
/* add bottom and top vertex for each point */
|
||||
vertexItems.add((short) (cx * S), (short) (cy * S), mh, c);
|
||||
vertexItems.add((short) (cx * S), (short) (cy * S), h, c);
|
||||
vertexItems.add((short) (cx * COORD_SCALE), (short) (cy * COORD_SCALE), mh, c);
|
||||
vertexItems.add((short) (cx * COORD_SCALE), (short) (cy * COORD_SCALE), h, c);
|
||||
|
||||
//v += 8;
|
||||
break;
|
||||
@@ -512,8 +511,8 @@ public class ExtrusionBucket extends RenderBucket {
|
||||
c = (short) (color2 | color1 << 8);
|
||||
|
||||
/* add bottom and top vertex for each point */
|
||||
vertexItems.add((short) (cx * S), (short) (cy * S), mh, c);
|
||||
vertexItems.add((short) (cx * S), (short) (cy * S), h, c);
|
||||
vertexItems.add((short) (cx * COORD_SCALE), (short) (cy * COORD_SCALE), mh, c);
|
||||
vertexItems.add((short) (cx * COORD_SCALE), (short) (cy * COORD_SCALE), h, c);
|
||||
|
||||
color1 = color2;
|
||||
|
||||
|
||||
@@ -26,12 +26,12 @@ import org.oscim.renderer.GLShader;
|
||||
import org.oscim.renderer.GLState;
|
||||
import org.oscim.renderer.GLUtils;
|
||||
import org.oscim.renderer.GLViewport;
|
||||
import org.oscim.renderer.MapRenderer;
|
||||
import org.oscim.theme.styles.LineStyle;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import static org.oscim.backend.GLAdapter.gl;
|
||||
import static org.oscim.renderer.MapRenderer.COORD_SCALE;
|
||||
|
||||
/**
|
||||
* Note:
|
||||
@@ -42,7 +42,6 @@ import static org.oscim.backend.GLAdapter.gl;
|
||||
public class LineBucket extends RenderBucket {
|
||||
static final Logger log = LoggerFactory.getLogger(LineBucket.class);
|
||||
|
||||
private static final float COORD_SCALE = MapRenderer.COORD_SCALE;
|
||||
/**
|
||||
* scale factor mapping extrusion vector to short values
|
||||
*/
|
||||
@@ -537,7 +536,7 @@ public class LineBucket extends RenderBucket {
|
||||
|
||||
/* factor to normalize extrusion vector and scale to coord scale */
|
||||
private final static float COORD_SCALE_BY_DIR_SCALE =
|
||||
MapRenderer.COORD_SCALE / LineBucket.DIR_SCALE;
|
||||
COORD_SCALE / LineBucket.DIR_SCALE;
|
||||
|
||||
private final static int CAP_THIN = 0;
|
||||
private final static int CAP_BUTT = 1;
|
||||
|
||||
@@ -247,7 +247,7 @@ public final class LineTexBucket extends LineBucket {
|
||||
|
||||
/* factor to normalize extrusion vector and scale to coord scale */
|
||||
private final static float COORD_SCALE_BY_DIR_SCALE =
|
||||
MapRenderer.COORD_SCALE / LineBucket.DIR_SCALE;
|
||||
COORD_SCALE / LineBucket.DIR_SCALE;
|
||||
|
||||
private static int mVertexFlipID;
|
||||
|
||||
|
||||
@@ -25,7 +25,6 @@ import org.oscim.renderer.GLShader;
|
||||
import org.oscim.renderer.GLState;
|
||||
import org.oscim.renderer.GLUtils;
|
||||
import org.oscim.renderer.GLViewport;
|
||||
import org.oscim.renderer.MapRenderer;
|
||||
import org.oscim.renderer.bucket.VertexData.Chunk;
|
||||
import org.oscim.theme.styles.AreaStyle;
|
||||
import org.oscim.utils.ColorUtil;
|
||||
@@ -134,8 +133,7 @@ public class MeshBucket extends RenderBucket {
|
||||
|
||||
Chunk chunk = vertexItems.obtainChunk();
|
||||
|
||||
tess.getVertices(chunk.vertices, offset, size,
|
||||
MapRenderer.COORD_SCALE);
|
||||
tess.getVertices(chunk.vertices, offset, size, COORD_SCALE);
|
||||
offset += size;
|
||||
|
||||
vertexItems.releaseChunk(size);
|
||||
|
||||
@@ -28,7 +28,6 @@ import org.oscim.renderer.GLShader;
|
||||
import org.oscim.renderer.GLState;
|
||||
import org.oscim.renderer.GLUtils;
|
||||
import org.oscim.renderer.GLViewport;
|
||||
import org.oscim.renderer.MapRenderer;
|
||||
import org.oscim.theme.styles.AreaStyle;
|
||||
import org.oscim.utils.ArrayUtils;
|
||||
import org.oscim.utils.geom.LineClipper;
|
||||
@@ -39,6 +38,7 @@ import org.slf4j.LoggerFactory;
|
||||
import java.nio.ShortBuffer;
|
||||
|
||||
import static org.oscim.backend.GLAdapter.gl;
|
||||
import static org.oscim.renderer.MapRenderer.COORD_SCALE;
|
||||
import static org.oscim.utils.FastMath.clamp;
|
||||
|
||||
/**
|
||||
@@ -52,8 +52,6 @@ public final class PolygonBucket extends RenderBucket {
|
||||
public final static int CLIP_DEPTH = 2;
|
||||
public final static int CLIP_TEST_DEPTH = 3;
|
||||
|
||||
private static final float S = MapRenderer.COORD_SCALE;
|
||||
|
||||
public static boolean enableTexture = true;
|
||||
|
||||
public AreaStyle area;
|
||||
@@ -75,7 +73,7 @@ public final class PolygonBucket extends RenderBucket {
|
||||
final float[] bbox = new float[8];
|
||||
|
||||
public void addPolygon(float[] points, int[] index) {
|
||||
short center = (short) ((Tile.SIZE >> 1) * S);
|
||||
short center = (short) ((Tile.SIZE >> 1) * COORD_SCALE);
|
||||
|
||||
boolean outline = area.strokeWidth > 0;
|
||||
|
||||
@@ -96,8 +94,8 @@ public final class PolygonBucket extends RenderBucket {
|
||||
int inPos = pos;
|
||||
|
||||
for (int j = 0; j < length; j += 2) {
|
||||
float x = (points[inPos++] * S);
|
||||
float y = (points[inPos++] * S);
|
||||
float x = (points[inPos++] * COORD_SCALE);
|
||||
float y = (points[inPos++] * COORD_SCALE);
|
||||
xmax = Math.max(xmax, x);
|
||||
xmin = Math.min(xmin, x);
|
||||
ymax = Math.max(ymax, y);
|
||||
@@ -117,8 +115,8 @@ public final class PolygonBucket extends RenderBucket {
|
||||
}
|
||||
}
|
||||
|
||||
vertexItems.add((short) (points[pos + 0] * S),
|
||||
(short) (points[pos + 1] * S));
|
||||
vertexItems.add((short) (points[pos + 0] * COORD_SCALE),
|
||||
(short) (points[pos + 1] * COORD_SCALE));
|
||||
numVertices++;
|
||||
|
||||
pos += length;
|
||||
|
||||
@@ -29,6 +29,7 @@ import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.nio.ShortBuffer;
|
||||
|
||||
import static org.oscim.renderer.MapRenderer.COORD_SCALE;
|
||||
import static org.oscim.renderer.bucket.RenderBucket.CIRCLE;
|
||||
import static org.oscim.renderer.bucket.RenderBucket.HAIRLINE;
|
||||
import static org.oscim.renderer.bucket.RenderBucket.LINE;
|
||||
@@ -434,7 +435,7 @@ public class RenderBuckets extends TileData {
|
||||
private static short[] fillCoords;
|
||||
|
||||
static {
|
||||
short s = (short) (Tile.SIZE * MapRenderer.COORD_SCALE);
|
||||
short s = (short) (Tile.SIZE * COORD_SCALE);
|
||||
fillCoords = new short[]{0, s, s, s, 0, 0, s, 0};
|
||||
}
|
||||
|
||||
|
||||
@@ -28,10 +28,11 @@ import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.nio.ShortBuffer;
|
||||
|
||||
import static org.oscim.renderer.MapRenderer.COORD_SCALE;
|
||||
|
||||
public final class SymbolBucket extends TextureBucket {
|
||||
static final Logger log = LoggerFactory.getLogger(SymbolBucket.class);
|
||||
|
||||
private final static float SCALE = 8.0f;
|
||||
private final static int VERTICES_PER_SPRITE = 4;
|
||||
private final static int LBIT_MASK = 0xfffffffe;
|
||||
|
||||
@@ -132,10 +133,10 @@ public final class SymbolBucket extends TextureBucket {
|
||||
continue;
|
||||
}
|
||||
|
||||
short u1 = (short) (SCALE * x);
|
||||
short v1 = (short) (SCALE * y);
|
||||
short u2 = (short) (SCALE * (x + width));
|
||||
short v2 = (short) (SCALE * (y + height));
|
||||
short u1 = (short) (COORD_SCALE * x);
|
||||
short v1 = (short) (COORD_SCALE * y);
|
||||
short u2 = (short) (COORD_SCALE * (x + width));
|
||||
short v2 = (short) (COORD_SCALE * (y + height));
|
||||
|
||||
PointF prevOffset = null;
|
||||
short x1 = 0, y1 = 0, x2 = 0, y2 = 0;
|
||||
@@ -156,25 +157,25 @@ public final class SymbolBucket extends TextureBucket {
|
||||
float hw = width / 2f;
|
||||
float hh = height / 2f;
|
||||
|
||||
x1 = (short) (SCALE * (-hw));
|
||||
x2 = (short) (SCALE * (hw));
|
||||
y1 = (short) (SCALE * (hh));
|
||||
y2 = (short) (SCALE * (-hh));
|
||||
x1 = (short) (COORD_SCALE * (-hw));
|
||||
x2 = (short) (COORD_SCALE * (hw));
|
||||
y1 = (short) (COORD_SCALE * (hh));
|
||||
y2 = (short) (COORD_SCALE * (-hh));
|
||||
} else {
|
||||
float hw = (float) (it.offset.x * width);
|
||||
float hh = (float) (it.offset.y * height);
|
||||
x1 = (short) (SCALE * (-hw));
|
||||
x2 = (short) (SCALE * (width - hw));
|
||||
y1 = (short) (SCALE * (height - hh));
|
||||
y2 = (short) (SCALE * (-hh));
|
||||
x1 = (short) (COORD_SCALE * (-hw));
|
||||
x2 = (short) (COORD_SCALE * (width - hw));
|
||||
y1 = (short) (COORD_SCALE * (height - hh));
|
||||
y2 = (short) (COORD_SCALE * (-hh));
|
||||
}
|
||||
}
|
||||
|
||||
/* add vertices */
|
||||
short tx = (short) ((int) (SCALE * it.x) & LBIT_MASK
|
||||
short tx = (short) ((int) (COORD_SCALE * it.x) & LBIT_MASK
|
||||
| (it.billboard ? 1 : 0));
|
||||
|
||||
short ty = (short) (SCALE * it.y);
|
||||
short ty = (short) (COORD_SCALE * it.y);
|
||||
|
||||
vertexItems.add(tx, ty, x1, y1, u1, v2);
|
||||
vertexItems.add(tx, ty, x1, y2, u1, v1);
|
||||
@@ -192,17 +193,17 @@ public final class SymbolBucket extends TextureBucket {
|
||||
offsetX = 0;
|
||||
offsetY = 0;
|
||||
} else {
|
||||
offsetX = (short) (((width / 2f) - (it.offset.x * width)) * SCALE);
|
||||
offsetY = (short) (((height / 2f) - (it.offset.y * height)) * SCALE);
|
||||
offsetX = (short) (((width / 2f) - (it.offset.x * width)) * COORD_SCALE);
|
||||
offsetY = (short) (((height / 2f) - (it.offset.y * height)) * COORD_SCALE);
|
||||
}
|
||||
|
||||
float hw = width / 2f;
|
||||
float hh = height / 2f;
|
||||
|
||||
minX = (SCALE * (-hw));
|
||||
maxX = (SCALE * (hw));
|
||||
minY = (SCALE * (hh));
|
||||
maxY = (SCALE * (-hh));
|
||||
minX = (COORD_SCALE * (-hw));
|
||||
maxX = (COORD_SCALE * (hw));
|
||||
minY = (COORD_SCALE * (hh));
|
||||
maxY = (COORD_SCALE * (-hh));
|
||||
|
||||
// target drawing rectangle
|
||||
{ // lower-left
|
||||
@@ -231,9 +232,9 @@ public final class SymbolBucket extends TextureBucket {
|
||||
}
|
||||
|
||||
/* add vertices */
|
||||
short tx = (short) (((int) (SCALE * it.x) & LBIT_MASK
|
||||
short tx = (short) (((int) (COORD_SCALE * it.x) & LBIT_MASK
|
||||
| (it.billboard ? 1 : 0)) + offsetX);
|
||||
short ty = (short) ((SCALE * it.y) + offsetY);
|
||||
short ty = (short) ((COORD_SCALE * it.y) + offsetY);
|
||||
|
||||
vertexItems.add(tx, ty, points[0], points[1], u1, v2); // lower-left
|
||||
vertexItems.add(tx, ty, points[2], points[3], u1, v1); // upper-left
|
||||
|
||||
@@ -83,7 +83,7 @@ public class TextureBucket extends RenderBucket {
|
||||
}
|
||||
|
||||
static class Shader extends GLShader {
|
||||
int uMV, uProj, uScale, uTexSize, aPos, aTexCoord;
|
||||
int uMV, uProj, uScale, uCoordScale, uTexSize, aPos, aTexCoord;
|
||||
|
||||
Shader() {
|
||||
if (!create("texture_layer"))
|
||||
@@ -92,6 +92,7 @@ public class TextureBucket extends RenderBucket {
|
||||
uMV = getUniform("u_mv");
|
||||
uProj = getUniform("u_proj");
|
||||
uScale = getUniform("u_scale");
|
||||
uCoordScale = getUniform("u_coord_scale");
|
||||
uTexSize = getUniform("u_div");
|
||||
aPos = getAttrib("vertex");
|
||||
aTexCoord = getAttrib("tex_coord");
|
||||
@@ -127,6 +128,7 @@ public class TextureBucket extends RenderBucket {
|
||||
|
||||
TextureBucket tb = (TextureBucket) b;
|
||||
gl.uniform1f(shader.uScale, tb.fixed ? 1 / scale : 1);
|
||||
gl.uniform1f(shader.uCoordScale, COORD_SCALE);
|
||||
|
||||
v.proj.setAsUniform(shader.uProj);
|
||||
v.mvp.setAsUniform(shader.uMV);
|
||||
|
||||
Reference in New Issue
Block a user