LineLayer.Renderer: pass relative scale
This commit is contained in:
parent
683e0733a5
commit
c8d79ee6fc
@ -648,7 +648,7 @@ class TextRenderer extends ElementRenderer {
|
|||||||
l = PolygonLayer.Renderer.draw(pos, l, m, true, 1, false);
|
l = PolygonLayer.Renderer.draw(pos, l, m, true, 1, false);
|
||||||
} else {
|
} else {
|
||||||
float div = scale * (float) (pos.scale / (1 << pos.zoomLevel));
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -30,7 +30,6 @@ import org.oscim.renderer.elements.MeshLayer;
|
|||||||
import org.oscim.renderer.elements.PolygonLayer;
|
import org.oscim.renderer.elements.PolygonLayer;
|
||||||
import org.oscim.renderer.elements.RenderElement;
|
import org.oscim.renderer.elements.RenderElement;
|
||||||
import org.oscim.renderer.elements.TextureLayer;
|
import org.oscim.renderer.elements.TextureLayer;
|
||||||
import org.oscim.utils.FastMath;
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
@ -71,12 +70,13 @@ public abstract class ElementRenderer extends LayerRenderer {
|
|||||||
protected synchronized void render(MapPosition curPos, Matrices m) {
|
protected synchronized void render(MapPosition curPos, Matrices m) {
|
||||||
MapPosition pos = mMapPosition;
|
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();
|
layers.vbo.bind();
|
||||||
GLState.test(false, false);
|
GLState.test(false, false);
|
||||||
GLState.blend(true);
|
GLState.blend(true);
|
||||||
int simple = (curPos.tilt < 1 ? 1 : 0);
|
|
||||||
|
|
||||||
if (layers.baseLayers != null) {
|
if (layers.baseLayers != null) {
|
||||||
setMatrix(curPos, m, true);
|
setMatrix(curPos, m, true);
|
||||||
@ -88,7 +88,7 @@ public abstract class ElementRenderer extends LayerRenderer {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case RenderElement.LINE:
|
case RenderElement.LINE:
|
||||||
l = LineLayer.Renderer.draw(layers, l, curPos, m, div, simple);
|
l = LineLayer.Renderer.draw(layers, l, curPos, m, div);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case RenderElement.TEXLINE:
|
case RenderElement.TEXLINE:
|
||||||
@ -110,8 +110,6 @@ public abstract class ElementRenderer extends LayerRenderer {
|
|||||||
if (layers.textureLayers != null) {
|
if (layers.textureLayers != null) {
|
||||||
setMatrix(curPos, m, false);
|
setMatrix(curPos, m, false);
|
||||||
|
|
||||||
float scale = (float) (pos.scale / curPos.scale);
|
|
||||||
|
|
||||||
for (RenderElement l = layers.textureLayers; l != null;) {
|
for (RenderElement l = layers.textureLayers; l != null;) {
|
||||||
switch (l.type) {
|
switch (l.type) {
|
||||||
case RenderElement.BITMAP:
|
case RenderElement.BITMAP:
|
||||||
@ -119,7 +117,7 @@ public abstract class ElementRenderer extends LayerRenderer {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
l = TextureLayer.Renderer.draw(l, scale, m);
|
l = TextureLayer.Renderer.draw(l, 1 / div, m);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -639,13 +639,16 @@ public final class LineLayer extends RenderElement {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static RenderElement draw(ElementLayers layers, RenderElement curLayer,
|
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)
|
if (curLayer == null)
|
||||||
return 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);
|
GLState.blend(true);
|
||||||
|
|
||||||
// Somehow we loose the texture after an indefinite
|
// Somehow we loose the texture after an indefinite
|
||||||
@ -662,24 +665,20 @@ public final class LineLayer extends RenderElement {
|
|||||||
|
|
||||||
GLState.enableVertexArrays(hLineVertexPosition[mode], -1);
|
GLState.enableVertexArrays(hLineVertexPosition[mode], -1);
|
||||||
|
|
||||||
GL.glVertexAttribPointer(hLineVertexPosition[mode], 4, GL20.GL_SHORT, false, 0,
|
GL.glVertexAttribPointer(hLineVertexPosition[mode], 4, GL20.GL_SHORT,
|
||||||
layers.lineOffset);
|
false, 0, layers.lineOffset);
|
||||||
|
|
||||||
m.mvp.setAsUniform(hLineMatrix[mode]);
|
m.mvp.setAsUniform(hLineMatrix[mode]);
|
||||||
|
|
||||||
double scale = pos.getZoomScale();
|
|
||||||
|
|
||||||
// Line scale factor for non fixed lines: Within a zoom-
|
// Line scale factor for non fixed lines: Within a zoom-
|
||||||
// level lines would be scaled by the factor 2 by view-matrix.
|
// level lines would be scaled by the factor 2 by view-matrix.
|
||||||
// Though lines should only scale by sqrt(2). This is achieved
|
// Though lines should only scale by sqrt(2). This is achieved
|
||||||
// by inverting scaling of extrusion vector with: width/sqrt(s).
|
// by inverting scaling of extrusion vector with: width/sqrt(s).
|
||||||
// within one zoom-level: 1 <= s <= 2
|
double variableScale = Math.sqrt(scale);
|
||||||
double relativeScale = scale / div;
|
|
||||||
double variableScale = (float) Math.sqrt(relativeScale * 2 / 2.2);
|
|
||||||
|
|
||||||
// scale factor to map one pixel on tile to one pixel on screen:
|
// scale factor to map one pixel on tile to one pixel on screen:
|
||||||
// used with orthographic projection, (shader mode == 1)
|
// 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);
|
GL.glUniform1f(uLineFade, (float) pixel);
|
||||||
|
|
||||||
@ -711,13 +710,9 @@ public final class LineLayer extends RenderElement {
|
|||||||
// draw LineLayer
|
// draw LineLayer
|
||||||
if (!line.outline) {
|
if (!line.outline) {
|
||||||
|
|
||||||
if (line.fixed) {
|
|
||||||
// invert scaling of extrusion vectors so that line
|
// invert scaling of extrusion vectors so that line
|
||||||
// width stays the same. 'max'?
|
// width stays the same.
|
||||||
width = Math.max(ll.width, 1) / relativeScale;
|
width = ll.width / (line.fixed ? scale : variableScale);
|
||||||
} else {
|
|
||||||
width = ll.width / variableScale;
|
|
||||||
}
|
|
||||||
|
|
||||||
GL.glUniform1f(uLineWidth, (float) (width * COORD_SCALE_BY_DIR_SCALE));
|
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) {
|
for (LineLayer o = ll.outlines; o != null; o = o.outlines) {
|
||||||
|
|
||||||
if (o.line.fixed)
|
if (o.line.fixed)
|
||||||
width = (ll.width + o.width) / relativeScale;
|
width = (ll.width + o.width) / scale;
|
||||||
else
|
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));
|
GL.glUniform1f(uLineWidth, (float) (width * COORD_SCALE_BY_DIR_SCALE));
|
||||||
|
|
||||||
// Line-edge fade
|
// Line-edge fade
|
||||||
if (line.blur > 0) {
|
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);
|
GL.glUniform1f(uLineFade, line.blur);
|
||||||
blur = true;
|
blur = true;
|
||||||
} else if (mode == SHADER_FLAT) {
|
} else if (mode == SHADER_FLAT) {
|
||||||
|
|||||||
@ -455,24 +455,20 @@ public class TileRenderer extends LayerRenderer {
|
|||||||
|
|
||||||
float div = FastMath.pow(z - pos.zoomLevel);
|
float div = FastMath.pow(z - pos.zoomLevel);
|
||||||
|
|
||||||
double curScale = Tile.SIZE * pos.scale;
|
double tileScale = Tile.SIZE * pos.scale;
|
||||||
double scale = (pos.scale / (1 << z));
|
float x = (float) ((tile.x - pos.x) * tileScale);
|
||||||
|
float y = (float) ((tile.y - pos.y) * tileScale);
|
||||||
|
|
||||||
float x = (float) ((tile.x - pos.x) * curScale);
|
// scale relative to zoom-level of this tile
|
||||||
float y = (float) ((tile.y - pos.y) * curScale);
|
float scale = (float) (pos.scale / (1 << z));
|
||||||
|
|
||||||
Matrices m = mMatrices;
|
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);
|
m.mvp.multiplyLhs(mProjMatrix);
|
||||||
|
|
||||||
// set depth offset (used for clipping to tile boundaries)
|
// set depth offset (used for clipping to tile boundaries)
|
||||||
GL.glPolygonOffset(0, mOffsetCnt++);
|
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;
|
boolean clipped = false;
|
||||||
|
|
||||||
for (RenderElement l = t.layers.baseLayers; l != null;) {
|
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);
|
PolygonLayer.Renderer.draw(pos, null, m, true, div, true);
|
||||||
clipped = 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;
|
break;
|
||||||
|
|
||||||
case RenderElement.TEXLINE:
|
case RenderElement.TEXLINE:
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user