feat: Replace SurfaceHeightFacet with SurfacesFacet and ElevationFacet (#28)

develop
4Denthusiast 2020-11-17 17:08:41 +00:00 committed by GitHub
parent ce3f43006f
commit 1d50c4c104
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 45 additions and 57 deletions

View File

@ -16,6 +16,7 @@
package org.terasology.polyworld;
import org.terasology.core.world.generator.facetProviders.SeaLevelProvider;
import org.terasology.core.world.generator.facetProviders.SurfaceToDensityProvider;
import org.terasology.core.world.generator.rasterizers.FloraRasterizer;
import org.terasology.core.world.generator.rasterizers.TreeRasterizer;
import org.terasology.engine.SimpleUri;
@ -73,6 +74,7 @@ public class IslandWorldGenerator extends BaseFacetedWorldGenerator {
.addProvider(new WaterModelFacetProvider(maxCacheSize))
.addProvider(new ElevationModelFacetProvider(maxCacheSize))
.addProvider(new ElevationProvider())
.addProvider(new SurfaceToDensityProvider())
.addProvider(new RiverModelFacetProvider(maxCacheSize))
.addProvider(new FlatLakeProvider())
.addProvider(new MoistureModelFacetProvider(maxCacheSize))

View File

@ -16,13 +16,11 @@
package org.terasology.polyworld.elevation;
import java.util.concurrent.TimeUnit;
import com.google.common.base.Stopwatch;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.terasology.math.geom.BaseVector2i;
import org.terasology.math.geom.Vector2f;
import org.terasology.math.geom.Vector2i;
import org.terasology.polyworld.graph.Graph;
import org.terasology.polyworld.graph.GraphFacet;
import org.terasology.polyworld.graph.Triangle;
@ -32,16 +30,16 @@ import org.terasology.world.generation.FacetProvider;
import org.terasology.world.generation.GeneratingRegion;
import org.terasology.world.generation.Produces;
import org.terasology.world.generation.Requires;
import org.terasology.world.generation.facets.ElevationFacet;
import org.terasology.world.generation.facets.SeaLevelFacet;
import org.terasology.world.generation.facets.SurfaceHeightFacet;
import com.google.common.base.Stopwatch;
import java.util.concurrent.TimeUnit;
/**
* Converts graph-based elevation information of the {@link ElevationModelFacet}
* into a continuous area.
*/
@Produces(SurfaceHeightFacet.class)
@Produces(ElevationFacet.class)
@Requires({
@Facet(SeaLevelFacet.class),
@Facet(ElevationModelFacet.class),
@ -64,8 +62,8 @@ public class ElevationProvider implements FacetProvider {
@Override
public void process(GeneratingRegion region) {
Border3D border = region.getBorderForFacet(SurfaceHeightFacet.class);
SurfaceHeightFacet facet = new SurfaceHeightFacet(region.getRegion(), border);
Border3D border = region.getBorderForFacet(ElevationFacet.class);
ElevationFacet facet = new ElevationFacet(region.getRegion(), border);
ElevationModelFacet elevationModelFacet = region.getRegionFacet(ElevationModelFacet.class);
SeaLevelFacet seaLevelFacet = region.getRegionFacet(SeaLevelFacet.class);
@ -116,7 +114,7 @@ public class ElevationProvider implements FacetProvider {
logger.trace("Created elevation facet for {} in {}ms.", facet.getWorldRegion(), sw.elapsed(TimeUnit.MILLISECONDS));
}
region.setRegionFacet(SurfaceHeightFacet.class, facet);
region.setRegionFacet(ElevationFacet.class, facet);
}
private float convertModelElevation(float seaLevel, float seaFloor, float maxHeight, float ele) {

View File

@ -15,9 +15,9 @@
*/
package org.terasology.polyworld.flora;
import java.util.List;
import java.util.Map;
import com.google.common.base.Predicate;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Lists;
import org.terasology.biomesAPI.Biome;
import org.terasology.core.world.generator.facetProviders.PositionFilters;
import org.terasology.core.world.generator.facetProviders.SurfaceObjectProvider;
@ -25,28 +25,28 @@ import org.terasology.core.world.generator.facets.FloraFacet;
import org.terasology.core.world.generator.rasterizers.FloraType;
import org.terasology.entitySystem.Component;
import org.terasology.math.geom.Vector3i;
import org.terasology.nui.properties.Range;
import org.terasology.polyworld.biome.WhittakerBiome;
import org.terasology.polyworld.biome.WhittakerBiomeFacet;
import org.terasology.nui.properties.Range;
import org.terasology.utilities.procedural.Noise;
import org.terasology.utilities.procedural.WhiteNoise;
import org.terasology.world.generation.ConfigurableFacetProvider;
import org.terasology.world.generation.Facet;
import org.terasology.world.generation.FacetBorder;
import org.terasology.world.generation.GeneratingRegion;
import org.terasology.world.generation.Produces;
import org.terasology.world.generation.Requires;
import org.terasology.world.generation.facets.SeaLevelFacet;
import org.terasology.world.generation.facets.SurfaceHeightFacet;
import org.terasology.world.generation.facets.SurfacesFacet;
import com.google.common.base.Predicate;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Lists;
import java.util.List;
import java.util.Map;
/**
* Determines where plants can be placed. Will put plants one block above the surface if it is in the correct biome.
*/
@Produces(FloraFacet.class)
@Requires({@Facet(SurfaceHeightFacet.class), @Facet(WhittakerBiomeFacet.class)})
@Requires({@Facet(value = SurfacesFacet.class, border = @FacetBorder(bottom = 1)), @Facet(WhittakerBiomeFacet.class)})
public class FloraProvider extends SurfaceObjectProvider<Biome, FloraType> implements ConfigurableFacetProvider {
private Noise densityNoiseGen;
@ -96,7 +96,7 @@ public class FloraProvider extends SurfaceObjectProvider<Biome, FloraType> imple
@Override
public void process(GeneratingRegion region) {
SurfaceHeightFacet surface = region.getRegionFacet(SurfaceHeightFacet.class);
SurfacesFacet surface = region.getRegionFacet(SurfacesFacet.class);
WhittakerBiomeFacet biomeFacet = region.getRegionFacet(WhittakerBiomeFacet.class);
SeaLevelFacet seaLevel = region.getRegionFacet(SeaLevelFacet.class);

View File

@ -15,8 +15,8 @@
*/
package org.terasology.polyworld.flora;
import java.util.List;
import com.google.common.base.Predicate;
import com.google.common.collect.Lists;
import org.terasology.core.world.generator.facetProviders.PositionFilters;
import org.terasology.core.world.generator.facetProviders.SurfaceObjectProvider;
import org.terasology.core.world.generator.facets.TreeFacet;
@ -24,9 +24,9 @@ import org.terasology.core.world.generator.trees.TreeGenerator;
import org.terasology.core.world.generator.trees.Trees;
import org.terasology.entitySystem.Component;
import org.terasology.math.geom.Vector3i;
import org.terasology.nui.properties.Range;
import org.terasology.polyworld.biome.WhittakerBiome;
import org.terasology.polyworld.biome.WhittakerBiomeFacet;
import org.terasology.nui.properties.Range;
import org.terasology.utilities.procedural.Noise;
import org.terasology.utilities.procedural.WhiteNoise;
import org.terasology.world.generation.Border3D;
@ -37,10 +37,9 @@ import org.terasology.world.generation.GeneratingRegion;
import org.terasology.world.generation.Produces;
import org.terasology.world.generation.Requires;
import org.terasology.world.generation.facets.SeaLevelFacet;
import org.terasology.world.generation.facets.SurfaceHeightFacet;
import org.terasology.world.generation.facets.SurfacesFacet;
import com.google.common.base.Predicate;
import com.google.common.collect.Lists;
import java.util.List;
/**
* Determines where trees can be placed. Will put trees one block above the surface.
@ -48,7 +47,7 @@ import com.google.common.collect.Lists;
@Produces(TreeFacet.class)
@Requires({
@Facet(value = SeaLevelFacet.class, border = @FacetBorder(sides = 12)),
@Facet(value = SurfaceHeightFacet.class, border = @FacetBorder(sides = 12 + 1)),
@Facet(value = SurfacesFacet.class, border = @FacetBorder(sides = 12 + 1, bottom = 1)),
@Facet(value = WhittakerBiomeFacet.class, border = @FacetBorder(sides = 12))
})
public class TreeProvider extends SurfaceObjectProvider<WhittakerBiome, TreeGenerator> implements ConfigurableFacetProvider {
@ -96,7 +95,7 @@ public class TreeProvider extends SurfaceObjectProvider<WhittakerBiome, TreeGene
@Override
public void process(GeneratingRegion region) {
SurfaceHeightFacet surface = region.getRegionFacet(SurfaceHeightFacet.class);
SurfacesFacet surface = region.getRegionFacet(SurfacesFacet.class);
WhittakerBiomeFacet biome = region.getRegionFacet(WhittakerBiomeFacet.class);
SeaLevelFacet seaLevel = region.getRegionFacet(SeaLevelFacet.class);

View File

@ -34,8 +34,8 @@ import org.terasology.world.chunks.ChunkConstants;
import org.terasology.world.chunks.CoreChunk;
import org.terasology.world.generation.Region;
import org.terasology.world.generation.WorldRasterizer;
import org.terasology.world.generation.facets.ElevationFacet;
import org.terasology.world.generation.facets.SeaLevelFacet;
import org.terasology.world.generation.facets.SurfaceHeightFacet;
import java.util.Collection;
import java.util.EnumSet;
@ -63,7 +63,7 @@ public class RiverRasterizer implements WorldRasterizer {
GraphFacet graphFacet = chunkRegion.getFacet(GraphFacet.class);
SeaLevelFacet seaLevelFacet = chunkRegion.getFacet(SeaLevelFacet.class);
RiverModelFacet riverModelFacet = chunkRegion.getFacet(RiverModelFacet.class);
SurfaceHeightFacet surfaceHeightData = chunkRegion.getFacet(SurfaceHeightFacet.class);
ElevationFacet elevationFacet = chunkRegion.getFacet(ElevationFacet.class);
Region3i region = chunkRegion.getRegion();
int seaLevel = seaLevelFacet.getSeaLevel();
@ -91,7 +91,7 @@ public class RiverRasterizer implements WorldRasterizer {
if (p.getX() >= region.minX() && p.getX() <= region.maxX() && p.getY() >= region.minZ() && p.getY() <= region.maxZ()) {
int x = ChunkMath.calcRelativeBlockPos(p.getX(), ChunkConstants.INNER_CHUNK_POS_FILTER.x());
int z = ChunkMath.calcRelativeBlockPos(p.getY(), ChunkConstants.INNER_CHUNK_POS_FILTER.z());
int y = TeraMath.floorToInt(surfaceHeightData.get(x, z));
int y = TeraMath.floorToInt(elevationFacet.get(x, z));
Vector3i worldPos = new Vector3i(p.getX(), y, p.getY());
placeWaterBody(chunk, region, worldPos, structElem, seaLevel);

View File

@ -16,7 +16,6 @@
package org.terasology.polyworld.raster;
import org.terasology.biomesAPI.BiomeRegistry;
import org.terasology.math.TeraMath;
import org.terasology.math.geom.Vector3i;
import org.terasology.polyworld.biome.WhittakerBiome;
import org.terasology.polyworld.biome.WhittakerBiomeFacet;
@ -26,8 +25,9 @@ import org.terasology.world.block.BlockManager;
import org.terasology.world.chunks.CoreChunk;
import org.terasology.world.generation.Region;
import org.terasology.world.generation.WorldRasterizer;
import org.terasology.world.generation.facets.DensityFacet;
import org.terasology.world.generation.facets.SeaLevelFacet;
import org.terasology.world.generation.facets.SurfaceHeightFacet;
import org.terasology.world.generation.facets.SurfacesFacet;
/**
*/
@ -57,7 +57,8 @@ public class WhittakerRasterizer implements WorldRasterizer {
@Override
public void generateChunk(CoreChunk chunk, Region chunkRegion) {
SurfaceHeightFacet surfaceHeightData = chunkRegion.getFacet(SurfaceHeightFacet.class);
SurfacesFacet surfacesFacet = chunkRegion.getFacet(SurfacesFacet.class);
DensityFacet densityFacet = chunkRegion.getFacet(DensityFacet.class);
SeaLevelFacet seaLevelFacet = chunkRegion.getFacet(SeaLevelFacet.class);
WhittakerBiomeFacet biomeFacet = chunkRegion.getFacet(WhittakerBiomeFacet.class);
int seaLevel = seaLevelFacet.getSeaLevel();
@ -66,21 +67,21 @@ public class WhittakerRasterizer implements WorldRasterizer {
for (int x = 0; x < chunk.getChunkSizeX(); ++x) {
for (int z = 0; z < chunk.getChunkSizeZ(); ++z) {
float surfaceHeight = surfaceHeightData.get(x, z);
int surfaceHeightInt = TeraMath.floorToInt(surfaceHeight);
WhittakerBiome biome = biomeFacet.get(x, z);
for (int y = 0; y < chunk.getChunkSizeY(); ++y) {
biomeRegistry.setBiome(biome, chunk, x, y, z);
int depth = surfaceHeightInt - y - chunk.getChunkWorldOffsetY();
if (depth >= 0) {
Block block = getSurfaceBlock(depth, biome);
chunk.setBlock(x, y, z, block);
} else
if (y + chunkOffset.y <= seaLevel) {
float density = densityFacet.get(x, y, z);
if (surfacesFacet.get(x, y, z)) {
chunk.setBlock(x, y, z, getSurfaceBlock(biome));
} else if (density > 8) {
chunk.setBlock(x, y, z, stone);
} else if (density > 0) {
chunk.setBlock(x, y, z, dirt);
} else if (y + chunkOffset.y <= seaLevel) {
chunk.setBlock(x, y, z, water);
}
}
@ -88,21 +89,15 @@ public class WhittakerRasterizer implements WorldRasterizer {
}
}
private Block getSurfaceBlock(int depth, WhittakerBiome type) {
if (depth > 8) {
return stone;
}
if (depth > 1) {
return dirt;
}
private Block getSurfaceBlock(WhittakerBiome type) {
switch (type) {
case TROPICAL_RAIN_FOREST:
case TROPICAL_SEASONAL_FOREST:
case GRASSLAND:
case MARSH:
case SHRUBLAND:
case TEMPERATE_DECIDUOUS_FOREST:
case TEMPERATE_RAIN_FOREST:
return grass;
case TAIGA:
@ -111,10 +106,6 @@ public class WhittakerRasterizer implements WorldRasterizer {
case SNOW:
return snow;
case TEMPERATE_DECIDUOUS_FOREST:
case TEMPERATE_RAIN_FOREST:
return grass;
case TUNDRA:
case SCORCHED:
case BARE:
@ -125,8 +116,6 @@ public class WhittakerRasterizer implements WorldRasterizer {
case LAKESHORE:
case SUBTROPICAL_DESERT:
case TEMPERATE_DESERT:
return sand;
case ICE:
return sand;