use of org.terasology.math.geom.BaseVector2i in project Terasology by MovingBlocks.
the class AbstractSpawner method findSpawnPosition.
/**
* Tries to find a suitable spawning point based on {@link SurfaceHeightFacet} and {@link SeaLevelFacet}.
* @param searchRadius the radius within a suitable spawning point will be searched
* @param world the facet-based world
* @param pos the desired 2D position in that world
* @return a 3D position above the surface and sea level or <code>null</code> if none was found
* @throws IllegalStateException if no SurfaceHeightFacet can be created.
*/
protected Vector3f findSpawnPosition(World world, Vector2i pos, int searchRadius) {
Vector3i ext = new Vector3i(searchRadius, 1, searchRadius);
Vector3i desiredPos = new Vector3i(pos.getX(), 1, pos.getY());
// try and find somewhere in this region a spot to land
Region3i spawnArea = Region3i.createFromCenterExtents(desiredPos, ext);
Region worldRegion = world.getWorldData(spawnArea);
// check if generation uses sea level and surface height facets
SurfaceHeightFacet surfaceHeightFacet = worldRegion.getFacet(SurfaceHeightFacet.class);
if (surfaceHeightFacet == null) {
throw new IllegalStateException("surface height facet not found");
}
SeaLevelFacet seaLevelFacet = worldRegion.getFacet(SeaLevelFacet.class);
int seaLevel = (seaLevelFacet != null) ? seaLevelFacet.getSeaLevel() : 0;
int spiralRad = searchRadius / 2 - 1;
SpiralIterable spiral = SpiralIterable.clockwise(pos).maxRadius(spiralRad).scale(2).build();
for (BaseVector2i test : spiral) {
float val = surfaceHeightFacet.getWorld(test.getX(), test.getY());
int height = TeraMath.floorToInt(val);
if (height >= seaLevel) {
return new Vector3f(test.getX(), height, test.getY());
}
}
// nothing above sea level found
float y = surfaceHeightFacet.getWorld(pos.getX(), pos.getY());
return new Vector3f(pos.getX(), y, pos.getY());
}
use of org.terasology.math.geom.BaseVector2i in project Terasology by MovingBlocks.
the class SurfaceToDensityProvider method process.
@Override
public void process(GeneratingRegion region) {
SurfaceHeightFacet surfaceHeight = region.getRegionFacet(SurfaceHeightFacet.class);
DensityFacet facet = new DensityFacet(region.getRegion(), region.getBorderForFacet(DensityFacet.class));
Region3i area = region.getRegion();
Rect2i rect = Rect2i.createFromMinAndMax(facet.getRelativeRegion().minX(), facet.getRelativeRegion().minZ(), facet.getRelativeRegion().maxX(), facet.getRelativeRegion().maxZ());
for (BaseVector2i pos : rect.contents()) {
float height = surfaceHeight.get(pos);
for (int y = facet.getRelativeRegion().minY(); y <= facet.getRelativeRegion().maxY(); ++y) {
facet.set(pos.x(), y, pos.y(), height - area.minY() - y);
}
}
region.setRegionFacet(DensityFacet.class, facet);
}
use of org.terasology.math.geom.BaseVector2i in project Terasology by MovingBlocks.
the class LayeredZoneRegionFunctionTest method setup.
@Before
public void setup() {
parent.addZone(new Zone("Medium sky", new LayeredZoneRegionFunction(new MinMaxLayerThickness(100, 100), MEDIUM_SKY))).addZone(new Zone("Low sky", new LayeredZoneRegionFunction(new MinMaxLayerThickness(100, 100), LOW_SKY))).addZone(new Zone("Above ground", new LayeredZoneRegionFunction(new MinMaxLayerThickness(100, 100), ABOVE_GROUND))).addZone(new Zone("Ground", new LayeredZoneRegionFunction(new MinMaxLayerThickness(100, 100), GROUND))).addZone(new Zone("Shallow underground", new LayeredZoneRegionFunction(new MinMaxLayerThickness(100, 100), SHALLOW_UNDERGROUND))).addZone(new Zone("Medium underground", new LayeredZoneRegionFunction(new MinMaxLayerThickness(100, 100), MEDIUM_UNDERGROUND)));
parent.setSeed(12345);
parent.initialize();
ListMultimap<Class<? extends WorldFacet>, FacetProvider> facetProviderChains = ArrayListMultimap.create();
facetProviderChains.put(SurfaceHeightFacet.class, (generatingRegion) -> {
SurfaceHeightFacet facet = new SurfaceHeightFacet(generatingRegion.getRegion(), generatingRegion.getBorderForFacet(SurfaceHeightFacet.class));
for (BaseVector2i pos : facet.getRelativeRegion().contents()) {
facet.set(pos, 100);
}
generatingRegion.setRegionFacet(SurfaceHeightFacet.class, facet);
});
Map<Class<? extends WorldFacet>, Border3D> borders = new HashMap<>();
borders.put(SurfaceHeightFacet.class, new Border3D(0, 0, 0));
region = new RegionImpl(Region3i.createFromCenterExtents(new Vector3i(0, 0, 0), 4), facetProviderChains, borders);
}
use of org.terasology.math.geom.BaseVector2i in project Terasology by MovingBlocks.
the class PlayerFactory method findSpawnPos.
private Optional<Vector3f> findSpawnPos(Vector3f targetPos, float entityHeight) {
int targetBlockX = TeraMath.floorToInt(targetPos.x);
int targetBlockY = TeraMath.floorToInt(targetPos.y);
int targetBlockZ = TeraMath.floorToInt(targetPos.z);
Vector2i center = new Vector2i(targetBlockX, targetBlockZ);
for (BaseVector2i pos : SpiralIterable.clockwise(center).maxRadius(32).scale(2).build()) {
Vector3i testPos = new Vector3i(pos.getX(), targetBlockY, pos.getY());
Vector3i spawnPos = findOpenVerticalPosition(testPos, entityHeight);
if (spawnPos != null) {
return Optional.of(new Vector3f(spawnPos.getX(), spawnPos.getY() + entityHeight, spawnPos.getZ()));
}
}
return Optional.empty();
}
use of org.terasology.math.geom.BaseVector2i in project Terasology by MovingBlocks.
the class SurfaceProvider method process.
@Override
public void process(GeneratingRegion region) {
// Create our surface height facet (we will get into borders later)
Border3D border = region.getBorderForFacet(SurfaceHeightFacet.class);
SurfaceHeightFacet facet = new SurfaceHeightFacet(region.getRegion(), border);
// loop through every position on our 2d array
Rect2i processRegion = facet.getWorldRegion();
for (BaseVector2i position : processRegion.contents()) {
facet.setWorld(position, surfaceNoise.noise(position.x(), position.y()) * 20);
}
// give our newly created and populated facet to the region
region.setRegionFacet(SurfaceHeightFacet.class, facet);
}
Aggregations