feat: Replace SurfaceHeightFacet with SurfacesFacet and ElevationFacet (#28)
parent
ce3f43006f
commit
1d50c4c104
|
@ -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))
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
Loading…
Reference in New Issue