package org.oscim.renderer.bucket;
import static org.oscim.backend.GLAdapter.gl;
import static org.oscim.renderer.MapRenderer.COORD_SCALE;
import org.oscim.backend.GL;
import org.oscim.core.GeometryBuffer;
import org.oscim.renderer.GLShader;
import org.oscim.renderer.GLState;
import org.oscim.renderer.GLUtils;
import org.oscim.renderer.GLViewport;
import org.oscim.theme.styles.LineStyle;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class HairLineBucket extends RenderBucket {
static final Logger log = LoggerFactory.getLogger(HairLineBucket.class);
public LineStyle line;
public HairLineBucket(int level) {
super(RenderBucket.HAIRLINE, true, false);
this.level = level;
}
public void addLine(GeometryBuffer geom) {
short id = (short) numVertices;
float pts[] = geom.points;
boolean poly = geom.isPoly();
int inPos = 0;
for (int i = 0, n = geom.index.length; i < n; i++) {
int len = geom.index[i];
if (len < 0)
break;
if (len < 4 || (poly && len < 6)) {
inPos += len;
continue;
}
int end = inPos + len;
vertexItems.add((short) (pts[inPos++] * COORD_SCALE),
(short) (pts[inPos++] * COORD_SCALE));
short first = id;
indiceItems.add(id++);
numIndices++;
while (inPos < end) {
vertexItems.add((short) (pts[inPos++] * COORD_SCALE),
(short) (pts[inPos++] * COORD_SCALE));
indiceItems.add(id);
numIndices++;
if (inPos == end) {
if (poly) {
indiceItems.add(id);
numIndices++;
indiceItems.add(first);
numIndices++;
}
id++;
break;
}
indiceItems.add(id++);
numIndices++;
}
}
numVertices = id;
}
public static class Renderer {
static Shader shader;
static boolean init() {
shader = new Shader("hairline");
return true;
}
public static class Shader extends GLShader {
int uMVP, uColor, uWidth, uScreen, aPos;
Shader(String shaderFile) {
if (!create(shaderFile))
return;
uMVP = getUniform("u_mvp");
uColor = getUniform("u_color");
uWidth = getUniform("u_width");
uScreen = getUniform("u_screen");
aPos = getAttrib("a_pos");
}
public void set(GLViewport v) {
useProgram();
GLState.enableVertexArrays(aPos, -1);
v.mvp.setAsUniform(uMVP);
gl.uniform2f(uScreen, v.getWidth() / 2, v.getHeight() / 2);
gl.uniform1f(uWidth, 1.5f);
gl.lineWidth(2);
}
}
public static RenderBucket draw(RenderBucket l, GLViewport v) {
GLState.blend(true);
Shader s = shader;
s.set(v);
for (; l != null && l.type == HAIRLINE; l = l.next) {
HairLineBucket ll = (HairLineBucket) l;
GLUtils.setColor(s.uColor, ll.line.color, 1);
gl.vertexAttribPointer(s.aPos, 2, GL.SHORT,
false, 0, ll.vertexOffset);
gl.drawElements(GL.LINES,
ll.numIndices,
GL.UNSIGNED_SHORT,
ll.indiceOffset);
}
//GL.lineWidth(1);
return l;
}
}
}