ExtrusionRenderer: fix translucency for meshes (#566)

This commit is contained in:
Gustl22 2018-08-23 22:54:25 +02:00 committed by Emux
parent 334a5e3fdb
commit 2a0ec3d82e
No known key found for this signature in database
GPG Key ID: 64ED9980896038C3
2 changed files with 10 additions and 5 deletions

View File

@ -52,8 +52,10 @@ public class BuildingLayer extends Layer implements TileLoaderThemeHook, ZoomLim
public static boolean POST_AA = false; public static boolean POST_AA = false;
/** /**
* Don't draw extrusions which are covered by others. * Let vanish extrusions / meshes which are covered by others.
* Especially if the side of extrusion is translucent. * {@link org.oscim.renderer.bucket.RenderBucket#EXTRUSION}: roofs are always translucent.
* <p>
* To better notice the difference, reduce the alpha value of extrusion colors in themes.
*/ */
public static boolean TRANSLUCENT = true; public static boolean TRANSLUCENT = true;
@ -98,9 +100,7 @@ public class BuildingLayer extends Layer implements TileLoaderThemeHook, ZoomLim
// Use zoomMin as zoomLimit to render buildings only once // Use zoomMin as zoomLimit to render buildings only once
mZoomLimiter = new ZoomLimiter(tileLayer.getManager(), zoomMin, zoomMax, zoomMin); mZoomLimiter = new ZoomLimiter(tileLayer.getManager(), zoomMin, zoomMax, zoomMin);
// Covered extrusions must be drawn for mesh renderer mRenderer = new BuildingRenderer(tileLayer.tileRenderer(), mZoomLimiter, mesh, TRANSLUCENT);
mRenderer = new BuildingRenderer(tileLayer.tileRenderer(), mZoomLimiter,
mesh, !mesh && TRANSLUCENT);
if (POST_AA) if (POST_AA)
mRenderer = new OffscreenRenderer(Mode.SSAO_FXAA, mRenderer); mRenderer = new OffscreenRenderer(Mode.SSAO_FXAA, mRenderer);
} }

View File

@ -232,6 +232,11 @@ public abstract class ExtrusionRenderer extends LayerRenderer {
/* draw triangle meshes (mMesh == true) */ /* draw triangle meshes (mMesh == true) */
if (eb.idx[4] > 0) { if (eb.idx[4] > 0) {
if (mTranslucent) {
gl.depthFunc(GL.EQUAL);
setMatrix(s, v, ebs[i]);
}
gl.drawElements(GL.TRIANGLES, eb.idx[4], gl.drawElements(GL.TRIANGLES, eb.idx[4],
GL.UNSIGNED_SHORT, eb.off[4]); GL.UNSIGNED_SHORT, eb.off[4]);
} }