forked from mirror/BlueMap
Add map config for having a different void colour (#477)
* Added global webapp option for not having a void * Fix for non-default lighting conditions * Replace `isVoid` with whole `voidColor` feature! * Default void colour should be black * And now the default sky colour can also be set back to what it was * Fix the low-res void colour * Add config option for the new void colour setting! (I hope I haven't forgotten any place to add it, but it does work, so I don't think so..?)
This commit is contained in:
parent
e087f17564
commit
48445db7b5
@ -363,6 +363,7 @@ private ConfigTemplate createOverworldMapTemplate(String name, Path worldFolder,
|
||||
.setVariable("sorting", "" + index)
|
||||
.setVariable("world", formatPath(worldFolder))
|
||||
.setVariable("sky-color", "#7dabff")
|
||||
.setVariable("void-color", "#000000")
|
||||
.setVariable("ambient-light", "0.1")
|
||||
.setVariable("world-sky-light", "15")
|
||||
.setVariable("remove-caves-below-y", "55")
|
||||
@ -376,6 +377,7 @@ private ConfigTemplate createNetherMapTemplate(String name, Path worldFolder, in
|
||||
.setVariable("sorting", "" + (100 + index))
|
||||
.setVariable("world", formatPath(worldFolder))
|
||||
.setVariable("sky-color", "#290000")
|
||||
.setVariable("void-color", "#000000")
|
||||
.setVariable("ambient-light", "0.6")
|
||||
.setVariable("world-sky-light", "0")
|
||||
.setVariable("remove-caves-below-y", "-10000")
|
||||
@ -389,6 +391,7 @@ private ConfigTemplate createEndMapTemplate(String name, Path worldFolder, int i
|
||||
.setVariable("sorting", "" + (200 + index))
|
||||
.setVariable("world", formatPath(worldFolder))
|
||||
.setVariable("sky-color", "#080010")
|
||||
.setVariable("void-color", "#000000")
|
||||
.setVariable("ambient-light", "0.6")
|
||||
.setVariable("world-sky-light", "0")
|
||||
.setVariable("remove-caves-below-y", "-10000")
|
||||
|
@ -49,6 +49,7 @@ public class MapConfig implements MapSettings {
|
||||
private Vector2i startPos = null;
|
||||
|
||||
private String skyColor = "#7dabff";
|
||||
private String voidColor = "#000000";
|
||||
|
||||
private float ambientLight = 0;
|
||||
|
||||
@ -112,6 +113,11 @@ public String getSkyColor() {
|
||||
return skyColor;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getVoidColor() {
|
||||
return voidColor;
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getAmbientLight() {
|
||||
return ambientLight;
|
||||
|
@ -24,11 +24,16 @@ sorting: ${sorting}
|
||||
# This defaults to the world-spawn if you don't set it.
|
||||
#start-pos: {x:500, z:-820}
|
||||
|
||||
# The color of thy sky as a hex-color
|
||||
# The color of the sky as a hex-color
|
||||
# You can change this at any time.
|
||||
# Default is "#7dabff"
|
||||
sky-color: "${sky-color}"
|
||||
|
||||
# The color of the void as a hex-color
|
||||
# You can change this at any time.
|
||||
# Default is "#000000"
|
||||
void-color: "${void-color}"
|
||||
|
||||
# Defines the ambient light-strength that every block is receiving, regardless of the sunlight/blocklight.
|
||||
# 0 is no ambient light, 1 is fully lighted.
|
||||
# You can change this at any time.
|
||||
|
@ -60,6 +60,7 @@ export class MapViewer {
|
||||
sunlightStrength: { value: 1 },
|
||||
ambientLight: { value: 0 },
|
||||
skyColor: { value: new Color(0.5, 0.5, 1) },
|
||||
voidColor: { value: new Color(0, 0, 0) },
|
||||
hiresTileMap: {
|
||||
value: {
|
||||
map: null,
|
||||
@ -393,6 +394,7 @@ export class MapViewer {
|
||||
|
||||
this.data.uniforms.distance.value = this.controlsManager.distance;
|
||||
this.data.uniforms.skyColor.value = map.data.skyColor;
|
||||
this.data.uniforms.voidColor.value = map.data.voidColor;
|
||||
this.data.uniforms.ambientLight.value = map.data.ambientLight;
|
||||
this.data.uniforms.hiresTileMap.value.map = map.hiresTileManager.tileMap.texture;
|
||||
this.data.uniforms.hiresTileMap.value.scale.set(map.data.hires.tileSize.x, map.data.hires.tileSize.z);
|
||||
|
@ -63,6 +63,7 @@ export class Map {
|
||||
name: id,
|
||||
startPos: {x: 0, z: 0},
|
||||
skyColor: new Color(),
|
||||
voidColor: new Color(),
|
||||
ambientLight: 0,
|
||||
hires: {
|
||||
tileSize: {x: 32, z: 32},
|
||||
@ -150,6 +151,14 @@ export class Map {
|
||||
);
|
||||
}
|
||||
|
||||
if (worldSettings.voidColor && worldSettings.voidColor.length >= 3) {
|
||||
this.data.voidColor.setRGB(
|
||||
worldSettings.voidColor[0],
|
||||
worldSettings.voidColor[1],
|
||||
worldSettings.voidColor[2]
|
||||
);
|
||||
}
|
||||
|
||||
this.data.ambientLight = worldSettings.ambientLight ? worldSettings.ambientLight : this.data.ambientLight;
|
||||
|
||||
if (worldSettings.hires === undefined) worldSettings.hires = {};
|
||||
|
@ -50,6 +50,7 @@ uniform vec2 tileSize;
|
||||
uniform vec2 textureSize;
|
||||
uniform float lod;
|
||||
uniform float lodScale;
|
||||
uniform vec3 voidColor;
|
||||
|
||||
varying vec3 vPosition;
|
||||
varying vec3 vWorldPosition;
|
||||
@ -76,14 +77,16 @@ vec2 posToMetaUV(vec2 pos) {
|
||||
return vec2(pos.x / textureSize.x, pos.y / textureSize.y + 0.5);
|
||||
}
|
||||
|
||||
vec3 adjustColor(vec3 color) {
|
||||
return vec3(color * max(sunlightStrength * sunlightStrength, ambientLight));
|
||||
}
|
||||
|
||||
void main() {
|
||||
//discard if hires tile is loaded at that position
|
||||
if (distance < 1000.0 && texture(hiresTileMap.map, ((vWorldPosition.xz - hiresTileMap.translate) / hiresTileMap.scale - hiresTileMap.pos) / hiresTileMap.size + 0.5).r > 0.75) discard;
|
||||
|
||||
vec4 color = texture(textureImage, posToColorUV(vPosition.xz));
|
||||
color.a = 1.0; // don't use alpha channel
|
||||
|
||||
|
||||
vec4 meta = texture(textureImage, posToMetaUV(vPosition.xz));
|
||||
|
||||
float height = metaToHeight(meta);
|
||||
@ -119,7 +122,12 @@ void main() {
|
||||
float blockLight = metaToLight(meta);
|
||||
float light = mix(blockLight, 15.0, sunlightStrength);
|
||||
color.rgb *= mix(ambientLight, 1.0, light / 15.0);
|
||||
|
||||
|
||||
vec3 adjustedVoidColor = adjustColor(voidColor);
|
||||
//where there's transparency, there is void that needs to be coloured
|
||||
color.rgb = mix(adjustedVoidColor, color.rgb, color.a);
|
||||
color.a = 1.0; //but don't actually display the transparency
|
||||
|
||||
gl_FragColor = color;
|
||||
|
||||
${ShaderChunk.logdepthbuf_fragment}
|
||||
|
@ -26,17 +26,23 @@ export const SKY_FRAGMENT_SHADER = `
|
||||
uniform float sunlightStrength;
|
||||
uniform float ambientLight;
|
||||
uniform vec3 skyColor;
|
||||
uniform vec3 voidColor;
|
||||
|
||||
varying vec3 vPosition;
|
||||
|
||||
vec3 adjustColor(vec3 color) {
|
||||
return vec3(color * max(sunlightStrength * sunlightStrength, ambientLight));
|
||||
}
|
||||
|
||||
void main() {
|
||||
float horizonWidth = 0.005;
|
||||
float horizonHeight = 0.0;
|
||||
|
||||
vec4 color = vec4(skyColor * max(sunlightStrength * sunlightStrength, ambientLight), 1.0);
|
||||
vec3 adjustedSkyColor = adjustColor(skyColor);
|
||||
vec3 adjustedVoidColor = adjustColor(voidColor);
|
||||
float voidMultiplier = (clamp(vPosition.y - horizonHeight, -horizonWidth, horizonWidth) + horizonWidth) / (horizonWidth * 2.0);
|
||||
color.rgb *= voidMultiplier;
|
||||
vec3 color = mix(adjustedVoidColor, adjustedSkyColor, voidMultiplier);
|
||||
|
||||
gl_FragColor = color;
|
||||
gl_FragColor = vec4(color, 1.0);
|
||||
}
|
||||
`;
|
||||
|
@ -37,6 +37,8 @@ public interface MapSettings extends RenderSettings {
|
||||
|
||||
String getSkyColor();
|
||||
|
||||
String getVoidColor();
|
||||
|
||||
long getMinInhabitedTime();
|
||||
|
||||
int getMinInhabitedTimeRadius();
|
||||
|
@ -74,6 +74,10 @@ public JsonElement serialize(BmMap map, Type typeOfSrc, JsonSerializationContext
|
||||
Color skyColor = new Color().parse(map.getMapSettings().getSkyColor());
|
||||
root.add("skyColor", context.serialize(skyColor));
|
||||
|
||||
// voidColor
|
||||
Color voidColor = new Color().parse(map.getMapSettings().getVoidColor());
|
||||
root.add("voidColor", context.serialize(voidColor));
|
||||
|
||||
// ambientLight
|
||||
root.addProperty("ambientLight", map.getMapSettings().getAmbientLight());
|
||||
|
||||
|
@ -70,7 +70,7 @@ public void render(World world, Vector3i modelMin, Vector3i modelMax, HiresTileM
|
||||
maxHeight = 0;
|
||||
topBlockLight = 0f;
|
||||
|
||||
columnColor.set(0, 0, 0, 1, true);
|
||||
columnColor.set(0, 0, 0, 0, true);
|
||||
|
||||
if (renderSettings.isInsideRenderBoundaries(x, z)) {
|
||||
minY = Math.max(min.getY(), world.getMinY(x, z));
|
||||
|
Loading…
Reference in New Issue
Block a user