diff --git a/vtm/src/org/oscim/renderer/ExtrusionRenderer.java b/vtm/src/org/oscim/renderer/ExtrusionRenderer.java index e475b52a..624476d4 100644 --- a/vtm/src/org/oscim/renderer/ExtrusionRenderer.java +++ b/vtm/src/org/oscim/renderer/ExtrusionRenderer.java @@ -37,6 +37,7 @@ public class ExtrusionRenderer extends LayerRenderer { private final TileRenderer mTileLayer; private final int mTileZoom; + private final boolean drawAlpha; protected float mAlpha = 1; @@ -45,13 +46,15 @@ public class ExtrusionRenderer extends LayerRenderer { mTileSet = new TileSet(); mTileZoom = tileZoom; mMode = 0; + drawAlpha = true; } - public ExtrusionRenderer(TileRenderer tileRenderLayer, int tileZoom, boolean mesh) { + public ExtrusionRenderer(TileRenderer tileRenderLayer, int tileZoom, boolean mesh, boolean alpha) { mTileLayer = tileRenderLayer; mTileSet = new TileSet(); mTileZoom = tileZoom; mMode = mesh ? 1 : 0; + drawAlpha = alpha; } private static int[] shaderProgram = new int[2]; @@ -210,8 +213,6 @@ public class ExtrusionRenderer extends LayerRenderer { private final boolean debug = false; - private final boolean drawAlpha = false; - @Override public void render(GLViewport v) { // TODO one could render in one pass to texture and then draw the texture @@ -231,7 +232,7 @@ public class ExtrusionRenderer extends LayerRenderer { GLState.enableVertexArrays(uExtVertexPosition, uExtLightPosition); GL.glUniform1i(uExtMode, 0); - GLUtils.glUniform4fv(uExtColor, 4, mColor); + GLUtils.glUniform4fv(uExtColor, 4, DEBUG_COLOR); GL.glUniform1f(uExtAlpha, 1); GLState.test(false, false); @@ -268,8 +269,6 @@ public class ExtrusionRenderer extends LayerRenderer { } GL.glDepthMask(true); - //GL.glStencilMask(0xff); - //GL.glClear(GL20.GL_DEPTH_BUFFER_BIT | GL20.GL_STENCIL_BUFFER_BIT); GL.glClear(GL20.GL_DEPTH_BUFFER_BIT); GLState.test(true, false); @@ -285,7 +284,6 @@ public class ExtrusionRenderer extends LayerRenderer { GL.glUniform1f(uExtAlpha, 1); if (drawAlpha) { - GL.glColorMask(false, false, false, false); GL.glUniform1i(uExtMode, -1); //GLUtils.glUniform4fv(uExtColor, 4, mColor); @@ -293,12 +291,19 @@ public class ExtrusionRenderer extends LayerRenderer { // draw to depth buffer for (int i = 0; i < mTileCnt; i++) { MapTile t = tiles[i]; - ExtrusionLayer el = t.getLayers().getExtrusionLayers(); + if (el == null) + continue; + + int d = MapTile.depthOffset(t) * 10; + + setMatrix(v, t, d); + v.mvp.setAsUniform(uExtMatrix); + for (; el != null; el = (ExtrusionLayer) el.next) { - int d = MapTile.depthOffset(t) * 10; - setMatrix(v, t, d); - v.mvp.setAsUniform(uExtMatrix); + + if (el.vboIndices == null) + continue; el.vboIndices.bind(); el.vboVertices.bind(); @@ -306,10 +311,12 @@ public class ExtrusionRenderer extends LayerRenderer { GL.glVertexAttribPointer(uExtVertexPosition, 3, GL20.GL_SHORT, false, 8, 0); - GL.glDrawElements(GL20.GL_TRIANGLES, - (el.numIndices[0] + el.numIndices[1] - + el.numIndices[2]), - GL20.GL_UNSIGNED_SHORT, 0); + GL.glDrawElements(GL20.GL_TRIANGLES, el.numIndices[0] + + el.numIndices[1] + el.numIndices[2] + //+ el.numIndices[3] + el.numIndices[4] + , + GL20.GL_UNSIGNED_SHORT, + 0); } } @@ -318,7 +325,6 @@ public class ExtrusionRenderer extends LayerRenderer { GLState.blend(true); } - // enable color buffer, use depth mask GLState.enableVertexArrays(uExtVertexPosition, uExtLightPosition); float[] currentColor = null; @@ -332,12 +338,10 @@ public class ExtrusionRenderer extends LayerRenderer { if (el.vboIndices == null) continue; - if (el.colors == null) { - currentColor = mColor; - GLUtils.glUniform4fv(uExtColor, mMode == 0 ? 4 : 1, currentColor); - } else if (currentColor != el.colors) { + if (el.colors != currentColor) { currentColor = el.colors; - GLUtils.glUniform4fv(uExtColor, mMode == 0 ? 4 : 1, currentColor); + GLUtils.glUniform4fv(uExtColor, mMode == 0 ? 4 : 1, + el.colors); } int d = 1; @@ -432,34 +436,34 @@ public class ExtrusionRenderer extends LayerRenderer { v.mvp.addDepthOffset(delta); } - private final float _a = 0.88f; - private final float _r = 0xe9; - private final float _g = 0xe8; - private final float _b = 0xe6; - private final float _o = 20; - private final float _s = 4; - private final float _l = 0; + private static float A = 0.88f; + private static float R = 0xe9; + private static float G = 0xe8; + private static float B = 0xe6; + private static float O = 20; + private static float S = 4; + private static float L = 0; - private final float[] mColor = { + private static float[] DEBUG_COLOR = { // roof color - _a * ((_r + _l) / 255), - _a * ((_g + _l) / 255), - _a * ((_b + _l) / 255), + A * ((R + L) / 255), + A * ((G + L) / 255), + A * ((B + L) / 255), 0.8f, // sligthly differ adjacent side // faces to improve contrast - _a * ((_r - _s) / 255 + 0.01f), - _a * ((_g - _s) / 255 + 0.01f), - _a * ((_b - _s) / 255), - _a, - _a * ((_r - _s) / 255), - _a * ((_g - _s) / 255), - _a * ((_b - _s) / 255), - _a, + A * ((R - S) / 255 + 0.01f), + A * ((G - S) / 255 + 0.01f), + A * ((B - S) / 255), + A, + A * ((R - S) / 255), + A * ((G - S) / 255), + A * ((B - S) / 255), + A, // roof outline - (_r - _o) / 255, - (_g - _o) / 255, - (_b - _o) / 255, + (R - O) / 255, + (G - O) / 255, + (B - O) / 255, 0.9f, }; @@ -478,15 +482,13 @@ public class ExtrusionRenderer extends LayerRenderer { // change height by u_alpha + " gl_Position = u_mvp * vec4(a_pos.xy, a_pos.z * u_alpha, 1.0);" //+ " depth = gl_Position.z;" - + " if (u_mode == -1) ;" + + " if (u_mode == -1){;" // roof / depth pass //+ " color = u_color[0] * u_alpha;" - + " else if (u_mode == 0){" + + " } else if (u_mode == 0){" // roof / depth pass - + " color = u_color[0] * u_alpha;" - + " } else {" - // decrease contrast with distance - + " if (u_mode == 1){" + + " color = u_color[0] * u_alpha;" + + " } else if (u_mode == 1){" // sides 1 - use 0xff00 // scale direction to -0.5<>0.5 + " float dir = a_light.y / ff;" @@ -507,30 +509,7 @@ public class ExtrusionRenderer extends LayerRenderer { // outline + " float z = (0.98 - gl_Position.z * 0.02);" + " color = u_color[3] * z;" - + " } else {" - // normalize face x/y direction - + " vec2 enc = (a_light / 255.0);" - + " vec2 fenc = enc * 4.0 - 2.0;" - + " float f = dot(fenc, fenc);" - + " float g = sqrt(1.0 - f / 4.0);" - + " vec3 r_norm;" - + " r_norm.xy = fenc * g;" - + " r_norm.z = 1.0 - f / 2.0;" - - // normal points up or down (1,-1) - ////+ " float dir = 1.0 - (2.0 * abs(mod(a_light.x,2.0)));" - // recreate face normal vector - ///+ " vec3 r_norm = vec3(n.xy, dir * (1.0 - length(n.xy)));" - - + " vec3 light = normalize(vec3(-0.2,0.2,1.0));" - + " float l = (1.0 + dot(r_norm, light)) / 2.0;" - - /** ambient */ - //+ " l = 0.2 + l * 0.8;" - /** extreme fake-ssao by height */ - + " l = l + (clamp(a_pos.z / 8192.0, 0.0, 0.1) - 0.05);" - + " color = vec4(l, l, l-0.02, 1.0);" - + "}}}"; + + "}}"; final static String extrusionVertexShader2 = "" + "uniform mat4 u_mvp;" @@ -540,6 +519,8 @@ public class ExtrusionRenderer extends LayerRenderer { + "attribute vec2 a_light;" + "varying vec4 color;" + "varying float depth;" + + "const float alpha = 1.0;" + + "void main() {" // change height by u_alpha + " vec4 pos = a_pos;" @@ -560,14 +541,19 @@ public class ExtrusionRenderer extends LayerRenderer { // recreate face normal vector ///+ " vec3 r_norm = vec3(n.xy, dir * (1.0 - length(n.xy)));" - + " vec3 light = normalize(vec3(-0.2,0.2,1.0));" - + " float l = (1.0 + dot(r_norm, light)) / 2.0;" + + " vec3 light_dir = normalize(vec3(0.2, 0.2, 1.0));" + + " float l = dot(r_norm, light_dir) * 0.8;" + + " light_dir = normalize(vec3(-0.2, -0.2, 1.0));" + + " l += dot(r_norm, light_dir) * 0.2;" + + //+ " l = (l + (1.0 - r_norm.z))*0.5;" /** ambient */ - //+ " l = 0.2 + l * 0.8;" + + " l = 0.4 + l * 0.6;" + /** extreme fake-ssao by height */ - + " l = l + (clamp(a_pos.z / 8192.0, 0.0, 0.1) - 0.05);" - + " color = u_color * l;" //vec4(l, l, l-0.02, 1.0);" + + " l += (clamp(a_pos.z / 2048.0, 0.0, 0.1) - 0.05);" + + " color = vec4(u_color.rgb * (clamp(l, 0.0, 1.0) * alpha), alpha);" + "}"; final static String extrusionFragmentShader = ""