From ebb73d12358c726d0ba7efa814e8a21684e416ac Mon Sep 17 00:00:00 2001 From: 4Denthusiast <25589515+4Denthusiast@users.noreply.github.com> Date: Mon, 1 Feb 2021 03:18:39 +0000 Subject: [PATCH 1/3] Enable scalable generation --- .../facetProviders/BiomeProvider.java | 5 ++- .../facetProviders/DensityNoiseProvider.java | 9 +++-- .../facetProviders/SeaLevelProvider.java | 5 ++- .../SimplexBaseSurfaceProvider.java | 7 ++-- .../SimplexHumidityProvider.java | 7 ++-- .../facetProviders/SimplexRiverProvider.java | 11 ++++-- .../SimplexRoughnessProvider.java | 7 ++-- .../SimplexSurfaceTemperatureProvider.java | 7 ++-- .../SurfaceToDensityProvider.java | 9 +++-- .../rasterizers/SolidRasterizer.java | 33 ++++++++++------ .../rasterizers/SunlightRasterizer.java | 38 +++++++++++++++++++ .../SimplexFacetedWorldGenerator.java | 4 +- 12 files changed, 103 insertions(+), 39 deletions(-) create mode 100644 src/main/java/org/terasology/core/world/generator/rasterizers/SunlightRasterizer.java diff --git a/src/main/java/org/terasology/core/world/generator/facetProviders/BiomeProvider.java b/src/main/java/org/terasology/core/world/generator/facetProviders/BiomeProvider.java index 7d41af0..1aaa323 100644 --- a/src/main/java/org/terasology/core/world/generator/facetProviders/BiomeProvider.java +++ b/src/main/java/org/terasology/core/world/generator/facetProviders/BiomeProvider.java @@ -26,6 +26,7 @@ import org.terasology.world.generation.GeneratingRegion; import org.terasology.world.generation.Produces; import org.terasology.world.generation.Requires; +import org.terasology.world.generation.ScalableFacetProvider; import org.terasology.world.generation.facets.ElevationFacet; import org.terasology.world.generation.facets.SeaLevelFacet; import org.terasology.world.generation.facets.SurfaceHumidityFacet; @@ -41,14 +42,14 @@ @Facet(SurfaceRoughnessFacet.class), @Facet(SurfaceTemperatureFacet.class), @Facet(SurfaceHumidityFacet.class)}) -public class BiomeProvider implements FacetProvider { +public class BiomeProvider implements ScalableFacetProvider { @Override public void setSeed(long seed) { } @Override - public void process(GeneratingRegion region) { + public void process(GeneratingRegion region, float scale) { SeaLevelFacet seaLevelFacet = region.getRegionFacet(SeaLevelFacet.class); ElevationFacet elevationFacet = region.getRegionFacet(ElevationFacet.class); SurfaceRoughnessFacet roughnessFacet = region.getRegionFacet(SurfaceRoughnessFacet.class); diff --git a/src/main/java/org/terasology/core/world/generator/facetProviders/DensityNoiseProvider.java b/src/main/java/org/terasology/core/world/generator/facetProviders/DensityNoiseProvider.java index 1315fb5..6a118c1 100644 --- a/src/main/java/org/terasology/core/world/generator/facetProviders/DensityNoiseProvider.java +++ b/src/main/java/org/terasology/core/world/generator/facetProviders/DensityNoiseProvider.java @@ -17,6 +17,7 @@ import org.terasology.world.generation.FacetProvider; import org.terasology.world.generation.GeneratingRegion; import org.terasology.world.generation.Requires; +import org.terasology.world.generation.ScalableFacetProvider; import org.terasology.world.generation.Updates; import org.terasology.world.generation.facets.DensityFacet; import org.terasology.world.generation.facets.SurfacesFacet; @@ -31,7 +32,7 @@ @Facet(value = DensityFacet.class, border = @FacetBorder(top = 1)), @Facet(SurfacesFacet.class) }) -public class DensityNoiseProvider implements FacetProvider { +public class DensityNoiseProvider implements ScalableFacetProvider { private SubSampledNoise largeNoise; private SubSampledNoise smallNoise; @@ -44,14 +45,14 @@ public void setSeed(long seed) { } @Override - public void process(GeneratingRegion region) { + public void process(GeneratingRegion region, float scale) { SurfaceRoughnessFacet surfaceRoughnessFacet = region.getRegionFacet(SurfaceRoughnessFacet.class); DensityFacet densityFacet = region.getRegionFacet(DensityFacet.class); SurfacesFacet surfacesFacet = region.getRegionFacet(SurfacesFacet.class); BlockRegion densityRegion = densityFacet.getWorldRegion(); - float[] smallNoiseValues = smallNoise.noise(densityRegion); - float[] largeNoiseValues = largeNoise.noise(densityRegion); + float[] smallNoiseValues = smallNoise.noise(densityRegion, scale); + float[] largeNoiseValues = largeNoise.noise(densityRegion, scale); float[] densityValues = densityFacet.getInternal(); int x = densityRegion.minX(); diff --git a/src/main/java/org/terasology/core/world/generator/facetProviders/SeaLevelProvider.java b/src/main/java/org/terasology/core/world/generator/facetProviders/SeaLevelProvider.java index 886bb9f..8aa04e9 100644 --- a/src/main/java/org/terasology/core/world/generator/facetProviders/SeaLevelProvider.java +++ b/src/main/java/org/terasology/core/world/generator/facetProviders/SeaLevelProvider.java @@ -19,12 +19,13 @@ import org.terasology.world.generation.FacetProvider; import org.terasology.world.generation.GeneratingRegion; import org.terasology.world.generation.Produces; +import org.terasology.world.generation.ScalableFacetProvider; import org.terasology.world.generation.facets.SeaLevelFacet; /** */ @Produces(SeaLevelFacet.class) -public class SeaLevelProvider implements FacetProvider { +public class SeaLevelProvider implements ScalableFacetProvider { private int seaLevel; @@ -41,7 +42,7 @@ public void setSeed(long seed) { } @Override - public void process(GeneratingRegion region) { + public void process(GeneratingRegion region, float scale) { Border3D border = region.getBorderForFacet(SeaLevelFacet.class); SeaLevelFacet facet = new SeaLevelFacet(region.getRegion(), border); facet.setSeaLevel(seaLevel); diff --git a/src/main/java/org/terasology/core/world/generator/facetProviders/SimplexBaseSurfaceProvider.java b/src/main/java/org/terasology/core/world/generator/facetProviders/SimplexBaseSurfaceProvider.java index 640a0aa..ac07781 100644 --- a/src/main/java/org/terasology/core/world/generator/facetProviders/SimplexBaseSurfaceProvider.java +++ b/src/main/java/org/terasology/core/world/generator/facetProviders/SimplexBaseSurfaceProvider.java @@ -27,6 +27,7 @@ import org.terasology.world.generation.GeneratingRegion; import org.terasology.world.generation.Produces; import org.terasology.world.generation.Requires; +import org.terasology.world.generation.ScalableFacetProvider; import org.terasology.world.generation.facets.ElevationFacet; import org.terasology.world.generation.facets.SeaLevelFacet; @@ -34,7 +35,7 @@ */ @Produces(ElevationFacet.class) @Requires(@Facet(SeaLevelFacet.class)) -public class SimplexBaseSurfaceProvider implements FacetProvider { +public class SimplexBaseSurfaceProvider implements ScalableFacetProvider { private static final int SAMPLE_RATE = 4; private static final float BEACH_STEEPNESS = 0.05f; private static final float OCEAN_FLOOR_CUTOFF = 0.1f; @@ -54,12 +55,12 @@ public void setSeed(long seed) { } @Override - public void process(GeneratingRegion region) { + public void process(GeneratingRegion region, float scale) { Border3D border = region.getBorderForFacet(ElevationFacet.class); ElevationFacet facet = new ElevationFacet(region.getRegion(), border); SeaLevelFacet seaLevelFacet = region.getRegionFacet(SeaLevelFacet.class); float seaLevel = seaLevelFacet.getSeaLevel(); - float[] noise = surfaceNoise.noise(facet.getWorldArea()); + float[] noise = surfaceNoise.noise(facet.getWorldArea(), scale); for (int i = 0; i < noise.length; ++i) { if (noise[i] > 0) { diff --git a/src/main/java/org/terasology/core/world/generator/facetProviders/SimplexHumidityProvider.java b/src/main/java/org/terasology/core/world/generator/facetProviders/SimplexHumidityProvider.java index 32c3728..1136a6d 100644 --- a/src/main/java/org/terasology/core/world/generator/facetProviders/SimplexHumidityProvider.java +++ b/src/main/java/org/terasology/core/world/generator/facetProviders/SimplexHumidityProvider.java @@ -26,13 +26,14 @@ import org.terasology.world.generation.ConfigurableFacetProvider; import org.terasology.world.generation.GeneratingRegion; import org.terasology.world.generation.Produces; +import org.terasology.world.generation.ScalableFacetProvider; import org.terasology.world.generation.facets.SurfaceHumidityFacet; /** * Defines surface humidity in the range [0..1] based on random noise. */ @Produces(SurfaceHumidityFacet.class) -public class SimplexHumidityProvider implements ConfigurableFacetProvider { +public class SimplexHumidityProvider implements ConfigurableFacetProvider, ScalableFacetProvider { private static final int SAMPLE_RATE = 4; private SubSampledNoise humidityNoise; @@ -59,11 +60,11 @@ public void setSeed(long seed) { } @Override - public void process(GeneratingRegion region) { + public void process(GeneratingRegion region, float scale) { Border3D border = region.getBorderForFacet(SurfaceHumidityFacet.class); SurfaceHumidityFacet facet = new SurfaceHumidityFacet(region.getRegion(), border); - float[] noise = humidityNoise.noise(facet.getWorldArea()); + float[] noise = humidityNoise.noise(facet.getWorldArea(), scale); for (int i = 0; i < noise.length; ++i) { noise[i] = TeraMath.clamp((noise[i] * 2.11f + 1f) * 0.5f); } diff --git a/src/main/java/org/terasology/core/world/generator/facetProviders/SimplexRiverProvider.java b/src/main/java/org/terasology/core/world/generator/facetProviders/SimplexRiverProvider.java index 921d500..b8db349 100644 --- a/src/main/java/org/terasology/core/world/generator/facetProviders/SimplexRiverProvider.java +++ b/src/main/java/org/terasology/core/world/generator/facetProviders/SimplexRiverProvider.java @@ -26,6 +26,7 @@ import org.terasology.world.generation.Facet; import org.terasology.world.generation.FacetProvider; import org.terasology.world.generation.GeneratingRegion; +import org.terasology.world.generation.ScalableFacetProvider; import org.terasology.world.generation.Updates; import org.terasology.world.generation.facets.ElevationFacet; @@ -33,7 +34,7 @@ * Applies an amount of the max depth for regions that are rivers */ @Updates(@Facet(ElevationFacet.class)) -public class SimplexRiverProvider implements FacetProvider, ConfigurableFacetProvider { +public class SimplexRiverProvider implements ScalableFacetProvider, ConfigurableFacetProvider { private static final int SAMPLE_RATE = 4; private SubSampledNoise riverNoise; @@ -45,9 +46,13 @@ public void setSeed(long seed) { } @Override - public void process(GeneratingRegion region) { + public void process(GeneratingRegion region, float scale) { + if (scale > 20) { + // The scale is so large that rivers wouldn't be visible anyway. + return; + } ElevationFacet facet = region.getRegionFacet(ElevationFacet.class); - float[] noise = riverNoise.noise(facet.getWorldArea()); + float[] noise = riverNoise.noise(facet.getWorldArea(), scale); float[] surfaceHeights = facet.getInternal(); for (int i = 0; i < noise.length; ++i) { diff --git a/src/main/java/org/terasology/core/world/generator/facetProviders/SimplexRoughnessProvider.java b/src/main/java/org/terasology/core/world/generator/facetProviders/SimplexRoughnessProvider.java index 79bd46e..b5d88b1 100644 --- a/src/main/java/org/terasology/core/world/generator/facetProviders/SimplexRoughnessProvider.java +++ b/src/main/java/org/terasology/core/world/generator/facetProviders/SimplexRoughnessProvider.java @@ -13,6 +13,7 @@ import org.terasology.world.generation.GeneratingRegion; import org.terasology.world.generation.Produces; import org.terasology.world.generation.Requires; +import org.terasology.world.generation.ScalableFacetProvider; import org.terasology.world.generation.facets.ElevationFacet; import org.terasology.world.generation.facets.SeaLevelFacet; @@ -24,7 +25,7 @@ @Facet(ElevationFacet.class), @Facet(SeaLevelFacet.class) }) -public class SimplexRoughnessProvider implements FacetProvider { +public class SimplexRoughnessProvider implements ScalableFacetProvider { private static final int SAMPLE_RATE = 4; private Noise noise; @@ -35,14 +36,14 @@ public void setSeed(long seed) { } @Override - public void process(GeneratingRegion region) { + public void process(GeneratingRegion region, float scale) { ElevationFacet elevationFacet = region.getRegionFacet(ElevationFacet.class); SeaLevelFacet seaLevelFacet = region.getRegionFacet(SeaLevelFacet.class); SurfaceRoughnessFacet facet = new SurfaceRoughnessFacet(region.getRegion(), region.getBorderForFacet(SurfaceRoughnessFacet.class)); for (Vector2ic pos : facet.getWorldArea()) { float height = elevationFacet.getWorld(pos) - seaLevelFacet.getSeaLevel(); - float value = 0.25f + height * 0.007f + noise.noise(pos.x() / 500f, pos.y() / 500f) * 1.5f; + float value = 0.25f + height * 0.007f + noise.noise(pos.x() * scale / 500f, pos.y() * scale / 500f) * 1.5f; facet.setWorld(pos, value); } diff --git a/src/main/java/org/terasology/core/world/generator/facetProviders/SimplexSurfaceTemperatureProvider.java b/src/main/java/org/terasology/core/world/generator/facetProviders/SimplexSurfaceTemperatureProvider.java index 26dcbfa..84b8c51 100644 --- a/src/main/java/org/terasology/core/world/generator/facetProviders/SimplexSurfaceTemperatureProvider.java +++ b/src/main/java/org/terasology/core/world/generator/facetProviders/SimplexSurfaceTemperatureProvider.java @@ -23,12 +23,13 @@ import org.terasology.world.generation.FacetProvider; import org.terasology.world.generation.GeneratingRegion; import org.terasology.world.generation.Produces; +import org.terasology.world.generation.ScalableFacetProvider; import org.terasology.world.generation.facets.SurfaceTemperatureFacet; /** */ @Produces(SurfaceTemperatureFacet.class) -public class SimplexSurfaceTemperatureProvider implements FacetProvider { +public class SimplexSurfaceTemperatureProvider implements ScalableFacetProvider { private static final int SAMPLE_RATE = 4; private SubSampledNoise temperatureNoise; @@ -39,9 +40,9 @@ public void setSeed(long seed) { } @Override - public void process(GeneratingRegion region) { + public void process(GeneratingRegion region, float scale) { SurfaceTemperatureFacet facet = new SurfaceTemperatureFacet(region.getRegion(), region.getBorderForFacet(SurfaceTemperatureFacet.class)); - float[] noise = this.temperatureNoise.noise(facet.getWorldArea()); + float[] noise = this.temperatureNoise.noise(facet.getWorldArea(), scale); for (int i = 0; i < noise.length; ++i) { noise[i] = TeraMath.clamp((noise[i] * 2.11f + 1f) * 0.5f); diff --git a/src/main/java/org/terasology/core/world/generator/facetProviders/SurfaceToDensityProvider.java b/src/main/java/org/terasology/core/world/generator/facetProviders/SurfaceToDensityProvider.java index 0d27036..78f00b7 100644 --- a/src/main/java/org/terasology/core/world/generator/facetProviders/SurfaceToDensityProvider.java +++ b/src/main/java/org/terasology/core/world/generator/facetProviders/SurfaceToDensityProvider.java @@ -26,6 +26,7 @@ import org.terasology.world.generation.GeneratingRegion; import org.terasology.world.generation.Produces; import org.terasology.world.generation.Requires; +import org.terasology.world.generation.ScalableFacetProvider; import org.terasology.world.generation.facets.SurfacesFacet; import org.terasology.world.generation.facets.DensityFacet; import org.terasology.world.generation.facets.ElevationFacet; @@ -36,7 +37,7 @@ */ @Requires(@Facet(ElevationFacet.class)) @Produces({DensityFacet.class, SurfacesFacet.class}) -public class SurfaceToDensityProvider implements FacetProvider { +public class SurfaceToDensityProvider implements ScalableFacetProvider { @Override public void setSeed(long seed) { @@ -44,7 +45,7 @@ public void setSeed(long seed) { } @Override - public void process(GeneratingRegion region) { + public void process(GeneratingRegion region, float scale) { ElevationFacet elevation = region.getRegionFacet(ElevationFacet.class); DensityFacet densityFacet = new DensityFacet(region.getRegion(), region.getBorderForFacet(DensityFacet.class)); SurfacesFacet surfacesFacet = new SurfacesFacet(region.getRegion(), region.getBorderForFacet(SurfacesFacet.class)); @@ -55,7 +56,7 @@ public void process(GeneratingRegion region) { for (Vector2ic pos : densityRect) { float height = elevation.get(pos); for (int y = densityFacet.getRelativeRegion().minY(); y <= densityFacet.getRelativeRegion().maxY(); ++y) { - densityFacet.set(pos.x(), y, pos.y(), height - area.minY() - y); + densityFacet.set(pos.x(), y, pos.y(), height - (area.minY() + y) * scale); } } region.setRegionFacet(DensityFacet.class, densityFacet); @@ -64,7 +65,7 @@ public void process(GeneratingRegion region) { surfacesFacet.getWorldRegion().maxX(), surfacesFacet.getWorldRegion().maxZ()); for (Vector2ic pos : surfaceRect) { // Round in this odd way because if the elevation is precisely an integer, the block at that level has density 0, so it's air. - int height = (int) Math.ceil(elevation.getWorld(pos)) - 1; + int height = (int) Math.ceil(elevation.getWorld(pos) / scale) - 1; if (height >= surfacesFacet.getWorldRegion().minY() && height <= surfacesFacet.getWorldRegion().maxY()) { surfacesFacet.setWorld(pos.x(), height, pos.y(), true); } diff --git a/src/main/java/org/terasology/core/world/generator/rasterizers/SolidRasterizer.java b/src/main/java/org/terasology/core/world/generator/rasterizers/SolidRasterizer.java index 4f87acb..9e642fc 100644 --- a/src/main/java/org/terasology/core/world/generator/rasterizers/SolidRasterizer.java +++ b/src/main/java/org/terasology/core/world/generator/rasterizers/SolidRasterizer.java @@ -27,14 +27,23 @@ import org.terasology.world.chunks.ChunkConstants; import org.terasology.world.chunks.Chunks; import org.terasology.world.chunks.CoreChunk; +import org.terasology.world.generation.Facet; import org.terasology.world.generation.Region; +import org.terasology.world.generation.Requires; +import org.terasology.world.generation.ScalableWorldRasterizer; import org.terasology.world.generation.WorldRasterizer; import org.terasology.world.generation.facets.SurfacesFacet; import org.terasology.world.generation.facets.DensityFacet; import org.terasology.world.generation.facets.SeaLevelFacet; import org.terasology.world.generation.facets.SurfaceDepthFacet; -public class SolidRasterizer implements WorldRasterizer { +@Requires({ + @Facet(DensityFacet.class), + @Facet(SurfacesFacet.class), + @Facet(BiomeFacet.class), + @Facet(SeaLevelFacet.class) +}) +public class SolidRasterizer implements ScalableWorldRasterizer { private Block water; private Block ice; @@ -59,7 +68,7 @@ public void initialize() { } @Override - public void generateChunk(CoreChunk chunk, Region chunkRegion) { + public void generateChunk(CoreChunk chunk, Region chunkRegion, float scale) { DensityFacet solidityFacet = chunkRegion.getFacet(DensityFacet.class); SurfacesFacet surfacesFacet = chunkRegion.getFacet(SurfacesFacet.class); SurfaceDepthFacet surfaceDepthFacet = chunkRegion.getFacet(SurfaceDepthFacet.class); @@ -70,7 +79,9 @@ public void generateChunk(CoreChunk chunk, Region chunkRegion) { Vector2i pos2d = new Vector2i(); for (Vector3ic pos : Chunks.CHUNK_REGION) { pos2d.set(pos.x(), pos.z()); - int posY = pos.y() + chunk.getChunkWorldOffsetY(); + float density = solidityFacet.get(pos); + float basePosY = (pos.y() + chunk.getChunkWorldOffsetY()) * scale; + float posY = basePosY + Math.max(0, Math.min(scale, density)); // Check for an optional depth for this layer - if defined stop generating below that level if (surfaceDepthFacet != null && posY < surfaceDepthFacet.get(pos2d)) { @@ -80,24 +91,24 @@ public void generateChunk(CoreChunk chunk, Region chunkRegion) { Biome biome = biomeFacet.get(pos2d); biomeRegistry.setBiome(biome, chunk, pos.x(), pos.y(), pos.z()); - float density = solidityFacet.get(pos); - - if (density > 0 && surfacesFacet.get(pos)) { + if (posY < seaLevel && basePosY + scale > seaLevel && seaLevel < scale) { + // ensure that the ocean is at least 1 block thick. + chunk.setBlock(pos, water); + } else if (density > 0 && surfacesFacet.get(pos)) { chunk.setBlock(pos, getSurfaceBlock(biome, posY - seaLevel)); } else if (density > 0) { chunk.setBlock(pos, getBelowSurfaceBlock(density, biome)); - } else { - // fill up terrain up to sealevel height with water or ice - if (posY == seaLevel && CoreBiome.SNOW == biome) { + } else if (posY <= seaLevel) { // either OCEAN or SNOW + if (posY + scale > seaLevel && CoreBiome.SNOW == biome) { chunk.setBlock(pos, ice); - } else if (posY <= seaLevel) { // either OCEAN or SNOW + } else { chunk.setBlock(pos, water); } } } } - private Block getSurfaceBlock(Biome type, int heightAboveSea) { + private Block getSurfaceBlock(Biome type, float heightAboveSea) { if (type instanceof CoreBiome) { switch ((CoreBiome) type) { case FOREST: diff --git a/src/main/java/org/terasology/core/world/generator/rasterizers/SunlightRasterizer.java b/src/main/java/org/terasology/core/world/generator/rasterizers/SunlightRasterizer.java new file mode 100644 index 0000000..e5fc32a --- /dev/null +++ b/src/main/java/org/terasology/core/world/generator/rasterizers/SunlightRasterizer.java @@ -0,0 +1,38 @@ +// Copyright 2021 The Terasology Foundation +// SPDX-License-Identifier: Apache-2.0 + +package org.terasology.core.world.generator.rasterizers; + +import org.terasology.world.block.Block; +import org.terasology.world.chunks.Chunk; +import org.terasology.world.chunks.Chunks; +import org.terasology.world.chunks.CoreChunk; +import org.terasology.world.generation.Facet; +import org.terasology.world.generation.Region; +import org.terasology.world.generation.Requires; +import org.terasology.world.generation.ScalableWorldRasterizer; +import org.terasology.world.generation.WorldRasterizer; +import org.terasology.world.generation.facets.ElevationFacet; + +@Requires(@Facet(ElevationFacet.class)) +public class SunlightRasterizer implements ScalableWorldRasterizer { + @Override + public void initialize() { + } + + @Override + public void generateChunk(CoreChunk chunk, Region chunkRegion, float scale) { + ElevationFacet elevationFacet = chunkRegion.getFacet(ElevationFacet.class); + int topHeight = chunk.getChunkWorldOffsetY() + Chunks.SIZE_Y - 1; + for (int x = 0; x < Chunks.SIZE_X; x++) { + for (int z = 0; z < Chunks.SIZE_Z; z++) { + if (elevationFacet.get(x, z) - 20 < topHeight * scale) { + Block block = chunk.getBlock(x, Chunks.SIZE_Y - 1, z); + if (block.isTranslucent() && !block.isLiquid()) { + ((Chunk) chunk).setSunlightRegen(x, Chunks.SIZE_Y - 1, z, Chunks.MAX_SUNLIGHT_REGEN); + } + } + } + } + } +} diff --git a/src/main/java/org/terasology/core/world/generator/worldGenerators/SimplexFacetedWorldGenerator.java b/src/main/java/org/terasology/core/world/generator/worldGenerators/SimplexFacetedWorldGenerator.java index 4f98082..05848c0 100644 --- a/src/main/java/org/terasology/core/world/generator/worldGenerators/SimplexFacetedWorldGenerator.java +++ b/src/main/java/org/terasology/core/world/generator/worldGenerators/SimplexFacetedWorldGenerator.java @@ -19,6 +19,7 @@ import org.terasology.core.world.generator.facetProviders.SurfaceToDensityProvider; import org.terasology.core.world.generator.rasterizers.FloraRasterizer; import org.terasology.core.world.generator.rasterizers.SolidRasterizer; +import org.terasology.core.world.generator.rasterizers.SunlightRasterizer; import org.terasology.core.world.generator.rasterizers.TreeRasterizer; import org.terasology.engine.SimpleUri; import org.terasology.entitySystem.entity.EntityRef; @@ -71,6 +72,7 @@ protected WorldBuilder createWorld() { .addRasterizer(new SolidRasterizer()) .addPlugins() .addRasterizer(new FloraRasterizer()) - .addRasterizer(new TreeRasterizer()); + .addRasterizer(new TreeRasterizer()) + .addRasterizer(new SunlightRasterizer()); } } From 62965eed68c68a9cb049e68dcea387b5b3ea3e74 Mon Sep 17 00:00:00 2001 From: 4Denthusiast <25589515+4Denthusiast@users.noreply.github.com> Date: Tue, 2 Feb 2021 15:16:23 +0000 Subject: [PATCH 2/3] Make the SunlightRasterizer configurable. --- .../generator/rasterizers/SunlightRasterizer.java | 11 ++++++++++- .../worldGenerators/SimplexFacetedWorldGenerator.java | 2 +- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/terasology/core/world/generator/rasterizers/SunlightRasterizer.java b/src/main/java/org/terasology/core/world/generator/rasterizers/SunlightRasterizer.java index e5fc32a..ebc6e3e 100644 --- a/src/main/java/org/terasology/core/world/generator/rasterizers/SunlightRasterizer.java +++ b/src/main/java/org/terasology/core/world/generator/rasterizers/SunlightRasterizer.java @@ -16,6 +16,15 @@ @Requires(@Facet(ElevationFacet.class)) public class SunlightRasterizer implements ScalableWorldRasterizer { + private final float offset; + + /** + * @param offset How high above the (ElevationFacet) surface the sunlight should be assumed to stop. + */ + public SunlightRasterizer(float offset) { + this.offset = offset; + } + @Override public void initialize() { } @@ -26,7 +35,7 @@ public void generateChunk(CoreChunk chunk, Region chunkRegion, float scale) { int topHeight = chunk.getChunkWorldOffsetY() + Chunks.SIZE_Y - 1; for (int x = 0; x < Chunks.SIZE_X; x++) { for (int z = 0; z < Chunks.SIZE_Z; z++) { - if (elevationFacet.get(x, z) - 20 < topHeight * scale) { + if (elevationFacet.get(x, z) + offset < topHeight * scale) { Block block = chunk.getBlock(x, Chunks.SIZE_Y - 1, z); if (block.isTranslucent() && !block.isLiquid()) { ((Chunk) chunk).setSunlightRegen(x, Chunks.SIZE_Y - 1, z, Chunks.MAX_SUNLIGHT_REGEN); diff --git a/src/main/java/org/terasology/core/world/generator/worldGenerators/SimplexFacetedWorldGenerator.java b/src/main/java/org/terasology/core/world/generator/worldGenerators/SimplexFacetedWorldGenerator.java index 05848c0..8de4404 100644 --- a/src/main/java/org/terasology/core/world/generator/worldGenerators/SimplexFacetedWorldGenerator.java +++ b/src/main/java/org/terasology/core/world/generator/worldGenerators/SimplexFacetedWorldGenerator.java @@ -73,6 +73,6 @@ protected WorldBuilder createWorld() { .addPlugins() .addRasterizer(new FloraRasterizer()) .addRasterizer(new TreeRasterizer()) - .addRasterizer(new SunlightRasterizer()); + .addRasterizer(new SunlightRasterizer(-20)); } } From 9b4cb0feff7727130862137fe3692e8d745c8a3a Mon Sep 17 00:00:00 2001 From: Tobias Nett Date: Tue, 2 Feb 2021 19:03:35 +0100 Subject: [PATCH 3/3] trigger CI