S3DBLayer: use transparency of extrusion style (#556)

This commit is contained in:
Gustl22 2018-06-21 21:50:32 +02:00 committed by Emux
parent c0efc78d37
commit 981af11011
No known key found for this signature in database
GPG Key ID: 64ED9980896038C3
3 changed files with 57 additions and 4 deletions

View File

@ -1,5 +1,6 @@
/* /*
* Copyright 2013 Hannes Janetzek * Copyright 2013 Hannes Janetzek
* Copyright 2018 Gustl22
* *
* This file is part of the OpenScienceMap project (http://www.opensciencemap.org). * This file is part of the OpenScienceMap project (http://www.opensciencemap.org).
* *
@ -115,6 +116,22 @@ public final class Color {
return ((color) & 0xff); return ((color) & 0xff);
} }
public static int setA(int color, int a) {
return ((a << 24) | (color & 0xffffff));
}
public static int setR(int color, int r) {
return ((r << 16) | (color & 0xff00ffff));
}
public static int setG(int color, int g) {
return ((g << 8) | (color & 0xffff00ff));
}
public static int setB(int color, int b) {
return (b | (color & 0xffffff00));
}
public static int parseColorComponents(String str) { public static int parseColorComponents(String str) {
int numComponents = 4; int numComponents = 4;
int cur = 5; int cur = 5;

View File

@ -15,6 +15,7 @@
*/ */
package org.oscim.layers.tile.buildings; package org.oscim.layers.tile.buildings;
import org.oscim.backend.canvas.Color;
import org.oscim.core.Box; import org.oscim.core.Box;
import org.oscim.core.GeometryBuffer; import org.oscim.core.GeometryBuffer;
import org.oscim.core.MapElement; import org.oscim.core.MapElement;
@ -45,6 +46,7 @@ public class S3DBLayer extends BuildingLayer {
private final float TILE_SCALE = (ExtrusionUtils.REF_TILE_SIZE / (Tile.SIZE * COORD_SCALE)); private final float TILE_SCALE = (ExtrusionUtils.REF_TILE_SIZE / (Tile.SIZE * COORD_SCALE));
private boolean mColored = true; private boolean mColored = true;
private boolean mTransparent = true;
public S3DBLayer(Map map, VectorTileLayer tileLayer) { public S3DBLayer(Map map, VectorTileLayer tileLayer) {
this(map, tileLayer, MIN_ZOOM, map.viewport().getMaxZoomLevel()); this(map, tileLayer, MIN_ZOOM, map.viewport().getMaxZoomLevel());
@ -62,6 +64,17 @@ public class S3DBLayer extends BuildingLayer {
mColored = colored; mColored = colored;
} }
public boolean isTransparent() {
return mTransparent;
}
/**
* @param transparent if true it adopts transparency of extrusion styles
*/
public void setTransparent(boolean transparent) {
mTransparent = transparent;
}
@Override @Override
public void complete(MapTile tile, boolean success) { public void complete(MapTile tile, boolean success) {
super.complete(tile, success); super.complete(tile, success);
@ -137,6 +150,9 @@ public class S3DBLayer extends BuildingLayer {
if (bColor == null) { if (bColor == null) {
bColor = extrusion.colorTop; bColor = extrusion.colorTop;
} else if (mTransparent) {
// Multiply alpha channel of extrusion style
bColor = ExtrusionStyle.blendAlpha(bColor, Color.aToFloat(extrusion.colorTop));
} }
// Scale x, y and z axis // Scale x, y and z axis
@ -238,9 +254,14 @@ public class S3DBLayer extends BuildingLayer {
GeometryBuffer gElement = new GeometryBuffer(element); GeometryBuffer gElement = new GeometryBuffer(element);
GeometryBuffer specialParts = null; GeometryBuffer specialParts = null;
if (roofColor == null) roofColor = buildingColor; if (roofColor == null)
boolean success = false; roofColor = buildingColor;
else if (mTransparent) {
// For simplicity use transparency of building, which is identical in nearly all cases
roofColor = ExtrusionStyle.blendAlpha(roofColor, Color.aToFloat(buildingColor));
}
boolean success;
switch (v) { switch (v) {
case Tag.VALUE_DOME: case Tag.VALUE_DOME:
case Tag.VALUE_ONION: case Tag.VALUE_ONION:

View File

@ -1,6 +1,7 @@
/* /*
* Copyright 2013 Hannes Janetzek * Copyright 2013 Hannes Janetzek
* Copyright 2016-2017 devemux86 * Copyright 2016-2017 devemux86
* Copyright 2018 Gustl22
* *
* This file is part of the OpenScienceMap project (http://www.opensciencemap.org). * This file is part of the OpenScienceMap project (http://www.opensciencemap.org).
* *
@ -56,6 +57,20 @@ public class ExtrusionStyle extends RenderStyle<ExtrusionStyle> {
this.defaultHeight = b.defaultHeight; this.defaultHeight = b.defaultHeight;
} }
public static int blendAlpha(int color, float alpha) {
if (alpha == 1.0f)
return color;
return Color.setA(color, (int) (Color.a(color) * alpha));
}
public static void blendAlpha(float colors[], float alpha) {
if (alpha == 1.0f)
return;
for (int i = 0; i < colors.length; i++) {
colors[i] = alpha * colors[i];
}
}
public static void fillColors(int side, int top, int line, float[] colors) { public static void fillColors(int side, int top, int line, float[] colors) {
float a = Color.aToFloat(top); float a = Color.aToFloat(top);
colors[0] = a * Color.rToFloat(top); colors[0] = a * Color.rToFloat(top);