Map renderer COORD_SCALE configurable and global use (#344)

This commit is contained in:
Longri
2017-03-29 13:21:18 +02:00
committed by Emux
parent 7a28788972
commit c580e1d7a5
15 changed files with 64 additions and 60 deletions

View File

@@ -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) {

View File

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

View File

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

View File

@@ -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) {

View File

@@ -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);

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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);

View File

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

View File

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

View File

@@ -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

View File

@@ -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);