diff --git a/vtm/src/org/oscim/layers/tile/vector/labeling/TextRenderer.java b/vtm/src/org/oscim/layers/tile/vector/labeling/TextRenderer.java index 4e4278f5..105c33d1 100644 --- a/vtm/src/org/oscim/layers/tile/vector/labeling/TextRenderer.java +++ b/vtm/src/org/oscim/layers/tile/vector/labeling/TextRenderer.java @@ -648,7 +648,7 @@ class TextRenderer extends ElementRenderer { l = PolygonLayer.Renderer.draw(pos, l, m, true, 1, false); } else { float div = scale * (float) (pos.scale / (1 << pos.zoomLevel)); - l = LineLayer.Renderer.draw(layers, l, pos, m, div, 0); + l = LineLayer.Renderer.draw(layers, l, pos, m, div); } } } diff --git a/vtm/src/org/oscim/renderer/ElementRenderer.java b/vtm/src/org/oscim/renderer/ElementRenderer.java index a820b37c..c289d709 100644 --- a/vtm/src/org/oscim/renderer/ElementRenderer.java +++ b/vtm/src/org/oscim/renderer/ElementRenderer.java @@ -30,7 +30,6 @@ 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; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -71,12 +70,13 @@ public abstract class ElementRenderer extends LayerRenderer { protected synchronized void render(MapPosition curPos, Matrices m) { MapPosition pos = mMapPosition; - float div = FastMath.pow(pos.zoomLevel - curPos.zoomLevel); + float div = (float) (curPos.scale / pos.scale); + + //float div = FastMath.pow(pos.zoomLevel - curPos.zoomLevel); layers.vbo.bind(); GLState.test(false, false); GLState.blend(true); - int simple = (curPos.tilt < 1 ? 1 : 0); if (layers.baseLayers != null) { setMatrix(curPos, m, true); @@ -88,7 +88,7 @@ public abstract class ElementRenderer extends LayerRenderer { break; case RenderElement.LINE: - l = LineLayer.Renderer.draw(layers, l, curPos, m, div, simple); + l = LineLayer.Renderer.draw(layers, l, curPos, m, div); break; case RenderElement.TEXLINE: @@ -110,8 +110,6 @@ public abstract class ElementRenderer extends LayerRenderer { if (layers.textureLayers != null) { setMatrix(curPos, m, false); - float scale = (float) (pos.scale / curPos.scale); - for (RenderElement l = layers.textureLayers; l != null;) { switch (l.type) { case RenderElement.BITMAP: @@ -119,7 +117,7 @@ public abstract class ElementRenderer extends LayerRenderer { break; default: - l = TextureLayer.Renderer.draw(l, scale, m); + l = TextureLayer.Renderer.draw(l, 1 / div, m); } } } diff --git a/vtm/src/org/oscim/renderer/elements/LineLayer.java b/vtm/src/org/oscim/renderer/elements/LineLayer.java index 8ad45d0e..2a57c20d 100644 --- a/vtm/src/org/oscim/renderer/elements/LineLayer.java +++ b/vtm/src/org/oscim/renderer/elements/LineLayer.java @@ -639,13 +639,16 @@ public final class LineLayer extends RenderElement { } public static RenderElement draw(ElementLayers layers, RenderElement curLayer, - MapPosition pos, Matrices m, float div, int mode) { + MapPosition pos, Matrices m, float scale) { if (curLayer == null) return null; - GLState.useProgram(lineProgram[mode]); + // simple line shader does not take forward shortening into + // account. only used when tilt is 0. + int mode = pos.tilt < 1 ? 1 : 0; + GLState.useProgram(lineProgram[mode]); GLState.blend(true); // Somehow we loose the texture after an indefinite @@ -662,24 +665,20 @@ public final class LineLayer extends RenderElement { GLState.enableVertexArrays(hLineVertexPosition[mode], -1); - GL.glVertexAttribPointer(hLineVertexPosition[mode], 4, GL20.GL_SHORT, false, 0, - layers.lineOffset); + GL.glVertexAttribPointer(hLineVertexPosition[mode], 4, GL20.GL_SHORT, + false, 0, layers.lineOffset); m.mvp.setAsUniform(hLineMatrix[mode]); - double scale = pos.getZoomScale(); - // Line scale factor for non fixed lines: Within a zoom- // level lines would be scaled by the factor 2 by view-matrix. // Though lines should only scale by sqrt(2). This is achieved // by inverting scaling of extrusion vector with: width/sqrt(s). - // within one zoom-level: 1 <= s <= 2 - double relativeScale = scale / div; - double variableScale = (float) Math.sqrt(relativeScale * 2 / 2.2); + double variableScale = Math.sqrt(scale); // scale factor to map one pixel on tile to one pixel on screen: // used with orthographic projection, (shader mode == 1) - double pixel = (mode == SHADER_PROJ) ? 0 : (1.5 / relativeScale); + double pixel = (mode == SHADER_PROJ) ? 0 : 1.5 / scale; GL.glUniform1f(uLineFade, (float) pixel); @@ -711,13 +710,9 @@ public final class LineLayer extends RenderElement { // draw LineLayer if (!line.outline) { - if (line.fixed) { - // invert scaling of extrusion vectors so that line - // width stays the same. 'max'? - width = Math.max(ll.width, 1) / relativeScale; - } else { - width = ll.width / variableScale; - } + // invert scaling of extrusion vectors so that line + // width stays the same. + width = ll.width / (line.fixed ? scale : variableScale); GL.glUniform1f(uLineWidth, (float) (width * COORD_SCALE_BY_DIR_SCALE)); @@ -755,16 +750,14 @@ public final class LineLayer extends RenderElement { for (LineLayer o = ll.outlines; o != null; o = o.outlines) { if (o.line.fixed) - width = (ll.width + o.width) / relativeScale; + width = (ll.width + o.width) / scale; else - width = ll.width / relativeScale + o.width / variableScale; + width = ll.width / scale + o.width / variableScale; GL.glUniform1f(uLineWidth, (float) (width * COORD_SCALE_BY_DIR_SCALE)); // Line-edge fade if (line.blur > 0) { - //GL.glUniform1f(uLineFade, (float) FastMath.clamp((1 - (line.blur / relativeScale)), 0, 1)); - //GL.glUniform1f(uLineFade, (float) (1 - (line.blur / relativeScale))); GL.glUniform1f(uLineFade, line.blur); blur = true; } else if (mode == SHADER_FLAT) { diff --git a/vtm/src/org/oscim/tiling/TileRenderer.java b/vtm/src/org/oscim/tiling/TileRenderer.java index f945e091..9367199e 100644 --- a/vtm/src/org/oscim/tiling/TileRenderer.java +++ b/vtm/src/org/oscim/tiling/TileRenderer.java @@ -455,24 +455,20 @@ public class TileRenderer extends LayerRenderer { float div = FastMath.pow(z - pos.zoomLevel); - double curScale = Tile.SIZE * pos.scale; - double scale = (pos.scale / (1 << z)); + double tileScale = Tile.SIZE * pos.scale; + float x = (float) ((tile.x - pos.x) * tileScale); + float y = (float) ((tile.y - pos.y) * tileScale); - float x = (float) ((tile.x - pos.x) * curScale); - float y = (float) ((tile.y - pos.y) * curScale); + // scale relative to zoom-level of this tile + float scale = (float) (pos.scale / (1 << z)); Matrices m = mMatrices; - m.mvp.setTransScale(x, y, (float) (scale / MapRenderer.COORD_SCALE)); - + m.mvp.setTransScale(x, y, scale / MapRenderer.COORD_SCALE); m.mvp.multiplyLhs(mProjMatrix); // set depth offset (used for clipping to tile boundaries) GL.glPolygonOffset(0, mOffsetCnt++); - // simple line shader does not take forward shortening into - // account. only used when tilt is 0. - int simpleShader = (pos.tilt < 1 ? 1 : 0); - boolean clipped = false; for (RenderElement l = t.layers.baseLayers; l != null;) { @@ -488,7 +484,7 @@ public class TileRenderer extends LayerRenderer { PolygonLayer.Renderer.draw(pos, null, m, true, div, true); clipped = true; } - l = LineLayer.Renderer.draw(t.layers, l, pos, m, div, simpleShader); + l = LineLayer.Renderer.draw(t.layers, l, pos, m, scale); break; case RenderElement.TEXLINE: