@Override public void process(GeneratingRegion region) { Region3i reg = region.getRegion(); Rect2i rc = Rect2i.createFromMinAndMax(reg.minX(), reg.minZ(), reg.maxX(), reg.maxZ()); if (rc.distanceSquared(centerPos.x(), centerPos.y()) <= outerRadius * outerRadius) { SurfaceHeightFacet facet = region.getRegionFacet(SurfaceHeightFacet.class); // update the surface height for (BaseVector2i pos : facet.getWorldRegion().contents()) { float originalValue = facet.getWorld(pos); int distSq = pos.distanceSquared(centerPos); if (distSq <= innerRadius * innerRadius) { facet.setWorld(pos, targetHeight); } else if (distSq <= outerRadius * outerRadius) { double dist = pos.distance(centerPos) - innerRadius; float norm = (float) dist / (outerRadius - innerRadius); facet.setWorld(pos, TeraMath.lerp(targetHeight, originalValue, norm)); } } } } }
switch (configuration.wrapMode) { case CLAMP: mapX0 = TeraMath.clamp(pos.getX(), 0, mapWidth * xzScale - 1) / xzScale; mapZ0 = TeraMath.clamp(pos.getY(), 0, mapHeight * xzScale - 1) / xzScale; mapX1 = TeraMath.clamp(mapX0 + 1, 0, mapWidth - 1); mapZ1 = TeraMath.clamp(mapZ0 + 1, 0, mapHeight - 1); break; case REPEAT: mapX0 = IntMath.mod(pos.getX(), mapWidth * xzScale) / xzScale; mapZ0 = IntMath.mod(pos.getY(), mapHeight * xzScale) / xzScale; mapX1 = IntMath.mod(mapX0 + 1, mapWidth); mapZ1 = IntMath.mod(mapZ0 + 1, mapHeight); double p01 = heightmap[mapX0][mapZ1]; float relX = IntMath.mod(pos.getX(), xzScale) / (float) xzScale; float relZ = IntMath.mod(pos.getY(), xzScale) / (float) xzScale;
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(); }
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());
@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); } }
@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); } }