Added _UNFINISHED_ water, beaches and mantle
- Refactored terrain generation - Added PiecewiseLinearFunction - Added some placeholder content - Added Test:Water, the solid, opaque water - Added beaches - Added Test:Mantle - Tweaked rock distribution parameters
This commit is contained in:
parent
711e4a2bb4
commit
a85fc27f8b
@ -0,0 +1,25 @@
|
||||
/*
|
||||
* Progressia
|
||||
* Copyright (C) 2020-2021 Wind Corporation and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package ru.windcorp.progressia.common.util.math;
|
||||
|
||||
@FunctionalInterface
|
||||
public interface FloatFunction {
|
||||
|
||||
float apply(float x);
|
||||
|
||||
}
|
@ -0,0 +1,24 @@
|
||||
/*
|
||||
* Progressia
|
||||
* Copyright (C) 2020-2021 Wind Corporation and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package ru.windcorp.progressia.common.util.math;
|
||||
|
||||
public interface FloatFunction2D {
|
||||
|
||||
float apply(float x, float y);
|
||||
|
||||
}
|
@ -0,0 +1,24 @@
|
||||
/*
|
||||
* Progressia
|
||||
* Copyright (C) 2020-2021 Wind Corporation and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package ru.windcorp.progressia.common.util.math;
|
||||
|
||||
public interface FloatFunction3D {
|
||||
|
||||
float apply(float x, float y, float z);
|
||||
|
||||
}
|
@ -0,0 +1,124 @@
|
||||
/*
|
||||
* Progressia
|
||||
* Copyright (C) 2020-2021 Wind Corporation and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package ru.windcorp.progressia.common.util.math;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
|
||||
import glm.vec._2.Vec2;
|
||||
|
||||
public class PiecewiseLinearFunction implements FloatFunction {
|
||||
|
||||
public static class Builder {
|
||||
|
||||
private final List<Vec2> points = new ArrayList<>();
|
||||
private float slopeAtNegInf = 0;
|
||||
private float slopeAtPosInf = 0;
|
||||
|
||||
public Builder add(float x, float y) {
|
||||
points.add(new Vec2(x, y));
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder setNegativeSlope(float slope) {
|
||||
slopeAtNegInf = slope;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder setPositiveSlope(float slope) {
|
||||
slopeAtPosInf = slope;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder setDefaultUndefined() {
|
||||
slopeAtPosInf = Float.NaN;
|
||||
slopeAtNegInf = Float.NaN;
|
||||
return this;
|
||||
}
|
||||
|
||||
public PiecewiseLinearFunction build() {
|
||||
float[] pointXs = new float[points.size()];
|
||||
float[] pointYs = new float[points.size()];
|
||||
|
||||
points.sort(Comparator.comparingDouble(v -> v.x));
|
||||
for (int i = 0; i < points.size(); ++i) {
|
||||
pointXs[i] = points.get(i).x;
|
||||
pointYs[i] = points.get(i).y;
|
||||
}
|
||||
|
||||
return new PiecewiseLinearFunction(pointXs, pointYs, slopeAtNegInf, slopeAtPosInf);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static Builder builder() {
|
||||
return new Builder();
|
||||
}
|
||||
|
||||
/**
|
||||
* The set of the X coordinates of all defining points, sorted in increasing order
|
||||
*/
|
||||
private final float[] pointXs;
|
||||
|
||||
/**
|
||||
* The set of the Y coordinates of all defining points, sorted to match the order of {@link #pointXs}
|
||||
*/
|
||||
private final float[] pointYs;
|
||||
|
||||
/**
|
||||
* Slope of the segment (-inf; x[0]), or NaN to exclude the segment from the function
|
||||
*/
|
||||
private final float slopeAtNegInf;
|
||||
|
||||
/**
|
||||
* Slope of the segment (x[x.length - 1]; +inf), or NaN to exclude the segment from the function
|
||||
*/
|
||||
private final float slopeAtPosInf;
|
||||
|
||||
protected PiecewiseLinearFunction(float[] pointXs, float[] pointYs, float slopeAtNegInf, float slopeAtPosInf) {
|
||||
this.pointXs = pointXs;
|
||||
this.pointYs = pointYs;
|
||||
this.slopeAtNegInf = slopeAtNegInf;
|
||||
this.slopeAtPosInf = slopeAtPosInf;
|
||||
}
|
||||
|
||||
@Override
|
||||
public float apply(float x) {
|
||||
int index = Arrays.binarySearch(pointXs, x);
|
||||
|
||||
if (index >= 0) {
|
||||
// Wow, exact match, me surprised
|
||||
return pointYs[index];
|
||||
}
|
||||
|
||||
int bigger = -index - 1;
|
||||
int smaller = bigger - 1;
|
||||
|
||||
if (smaller == -1) {
|
||||
return pointYs[bigger] + (x - pointXs[bigger]) * slopeAtNegInf;
|
||||
} else if (bigger == pointXs.length) {
|
||||
return pointYs[smaller] + (x - pointXs[smaller]) * slopeAtPosInf;
|
||||
} else {
|
||||
float t = (x - pointXs[smaller]) / (pointXs[bigger] - pointXs[smaller]);
|
||||
return pointYs[smaller] * (1 - t) + pointYs[bigger] * t;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -24,7 +24,6 @@ import java.util.List;
|
||||
|
||||
import glm.vec._3.Vec3;
|
||||
import glm.vec._3.i.Vec3i;
|
||||
import ru.windcorp.progressia.common.util.FloatRangeMap;
|
||||
import ru.windcorp.progressia.common.util.VectorUtil;
|
||||
import ru.windcorp.progressia.common.world.DefaultChunkData;
|
||||
import ru.windcorp.progressia.common.world.DecodingException;
|
||||
@ -32,7 +31,7 @@ import ru.windcorp.progressia.server.Server;
|
||||
import ru.windcorp.progressia.server.world.generation.AbstractWorldGenerator;
|
||||
import ru.windcorp.progressia.server.world.generation.surface.SurfaceFeature;
|
||||
import ru.windcorp.progressia.server.world.generation.surface.SurfaceFloatField;
|
||||
import ru.windcorp.progressia.server.world.generation.surface.TerrainLayer;
|
||||
import ru.windcorp.progressia.server.world.generation.surface.TerrainSupplier;
|
||||
|
||||
public class PlanetGenerator extends AbstractWorldGenerator<Boolean> {
|
||||
|
||||
@ -46,7 +45,7 @@ public class PlanetGenerator extends AbstractWorldGenerator<Boolean> {
|
||||
Server server,
|
||||
Planet planet,
|
||||
SurfaceFloatField heightMap,
|
||||
FloatRangeMap<TerrainLayer> layers,
|
||||
TerrainSupplier terrain,
|
||||
List<SurfaceFeature> features
|
||||
) {
|
||||
super(id, server, Boolean.class, "Test:PlanetGravityModel");
|
||||
@ -56,7 +55,7 @@ public class PlanetGenerator extends AbstractWorldGenerator<Boolean> {
|
||||
PlanetGravityModel model = (PlanetGravityModel) this.getGravityModel();
|
||||
model.configure(planet.getGravityModelSettings());
|
||||
|
||||
this.terrainGenerator = new PlanetTerrainGenerator(this, heightMap, layers);
|
||||
this.terrainGenerator = new PlanetTerrainGenerator(this, heightMap, terrain);
|
||||
this.featureGenerator = new PlanetFeatureGenerator(this, features);
|
||||
}
|
||||
|
||||
|
@ -21,7 +21,6 @@ import java.util.Map;
|
||||
|
||||
import glm.vec._3.Vec3;
|
||||
import glm.vec._3.i.Vec3i;
|
||||
import ru.windcorp.progressia.common.util.FloatRangeMap;
|
||||
import ru.windcorp.progressia.common.util.VectorUtil;
|
||||
import ru.windcorp.progressia.common.world.DefaultChunkData;
|
||||
import ru.windcorp.progressia.common.world.Coordinates;
|
||||
@ -33,7 +32,7 @@ import ru.windcorp.progressia.server.Server;
|
||||
import ru.windcorp.progressia.server.world.generation.surface.Surface;
|
||||
import ru.windcorp.progressia.server.world.generation.surface.SurfaceFloatField;
|
||||
import ru.windcorp.progressia.server.world.generation.surface.SurfaceTerrainGenerator;
|
||||
import ru.windcorp.progressia.server.world.generation.surface.TerrainLayer;
|
||||
import ru.windcorp.progressia.server.world.generation.surface.TerrainSupplier;
|
||||
|
||||
class PlanetTerrainGenerator {
|
||||
|
||||
@ -43,7 +42,7 @@ class PlanetTerrainGenerator {
|
||||
public PlanetTerrainGenerator(
|
||||
PlanetGenerator generator,
|
||||
SurfaceFloatField heightMap,
|
||||
FloatRangeMap<TerrainLayer> layers
|
||||
TerrainSupplier terrain
|
||||
) {
|
||||
this.parent = generator;
|
||||
|
||||
@ -53,7 +52,7 @@ class PlanetTerrainGenerator {
|
||||
face -> new SurfaceTerrainGenerator(
|
||||
new Surface(face, seaLevel),
|
||||
heightMap,
|
||||
layers
|
||||
terrain
|
||||
)
|
||||
);
|
||||
}
|
||||
|
@ -19,7 +19,6 @@ package ru.windcorp.progressia.server.world.generation.surface;
|
||||
|
||||
import glm.vec._3.Vec3;
|
||||
import glm.vec._3.i.Vec3i;
|
||||
import ru.windcorp.progressia.common.util.FloatRangeMap;
|
||||
import ru.windcorp.progressia.common.util.Vectors;
|
||||
import ru.windcorp.progressia.common.world.DefaultChunkData;
|
||||
import ru.windcorp.progressia.common.world.block.BlockData;
|
||||
@ -33,12 +32,12 @@ public class SurfaceTerrainGenerator {
|
||||
private final Surface surface;
|
||||
|
||||
private final SurfaceFloatField heightMap;
|
||||
private final FloatRangeMap<TerrainLayer> layers;
|
||||
private final TerrainSupplier terrain;
|
||||
|
||||
public SurfaceTerrainGenerator(Surface surface, SurfaceFloatField heightMap, FloatRangeMap<TerrainLayer> layers) {
|
||||
public SurfaceTerrainGenerator(Surface surface, SurfaceFloatField heightMap, TerrainSupplier terrain) {
|
||||
this.surface = surface;
|
||||
this.heightMap = heightMap;
|
||||
this.layers = layers;
|
||||
this.terrain = terrain;
|
||||
}
|
||||
|
||||
public void generateTerrain(Server server, DefaultChunkData chunk) {
|
||||
@ -74,7 +73,7 @@ public class SurfaceTerrainGenerator {
|
||||
location.set(north, west, altitude);
|
||||
SurfaceBlockContext blockContext = context.push(location);
|
||||
|
||||
BlockData block = layers.get(depth).get(blockContext, depth);
|
||||
BlockData block = terrain.get(blockContext, depth);
|
||||
|
||||
blockContext.pop();
|
||||
|
||||
|
@ -21,7 +21,7 @@ import ru.windcorp.progressia.common.world.block.BlockData;
|
||||
import ru.windcorp.progressia.server.world.generation.surface.context.SurfaceBlockContext;
|
||||
|
||||
@FunctionalInterface
|
||||
public interface TerrainLayer {
|
||||
public interface TerrainSupplier {
|
||||
|
||||
BlockData get(SurfaceBlockContext context, float depth);
|
||||
|
@ -104,6 +104,8 @@ public class TestContent {
|
||||
registerSimplestBlock("Dirt");
|
||||
registerSimplestBlock("Chernozem");
|
||||
registerSimplestBlock("Stone");
|
||||
registerSimplestBlock("Mantle");
|
||||
registerSimplestBlock("Water");
|
||||
registerSimplestBlock("Brick");
|
||||
registerSimplestBlock("BrickWhite");
|
||||
registerSimplestBlock("Sand");
|
||||
|
@ -24,21 +24,18 @@ import java.util.List;
|
||||
import java.util.function.Function;
|
||||
|
||||
import ru.windcorp.progressia.common.Units;
|
||||
import ru.windcorp.progressia.common.util.ArrayFloatRangeMap;
|
||||
import ru.windcorp.progressia.common.util.FloatRangeMap;
|
||||
import ru.windcorp.progressia.common.util.noise.discrete.WorleyProceduralNoise;
|
||||
import ru.windcorp.progressia.common.world.Coordinates;
|
||||
import ru.windcorp.progressia.common.world.block.BlockData;
|
||||
import ru.windcorp.progressia.common.world.block.BlockDataRegistry;
|
||||
import ru.windcorp.progressia.server.Server;
|
||||
import ru.windcorp.progressia.server.world.generation.WorldGenerator;
|
||||
import ru.windcorp.progressia.server.world.generation.planet.Planet;
|
||||
import ru.windcorp.progressia.server.world.generation.planet.PlanetGenerator;
|
||||
import ru.windcorp.progressia.server.world.generation.surface.SurfaceFeature;
|
||||
import ru.windcorp.progressia.server.world.generation.surface.SurfaceFloatField;
|
||||
import ru.windcorp.progressia.server.world.generation.surface.TerrainLayer;
|
||||
import ru.windcorp.progressia.test.Rocks.RockVariant;
|
||||
import ru.windcorp.progressia.test.Rocks.Rock;
|
||||
import ru.windcorp.progressia.test.TestContent;
|
||||
import ru.windcorp.progressia.test.gen.feature.*;
|
||||
import ru.windcorp.progressia.test.gen.terrain.*;
|
||||
|
||||
public class TestGenerationConfig {
|
||||
|
||||
@ -62,47 +59,45 @@ public class TestGenerationConfig {
|
||||
|
||||
TestHeightMap heightMap = new TestHeightMap(planet, planet.getRadius() / 4, FIELDS);
|
||||
|
||||
FloatRangeMap<TerrainLayer> layers = new ArrayFloatRangeMap<>();
|
||||
registerTerrainLayers(layers);
|
||||
LayeredTerrain terrain = new LayeredTerrain();
|
||||
registerTerrainLayers(terrain);
|
||||
|
||||
List<SurfaceFeature> features = new ArrayList<>();
|
||||
registerFeatures(features);
|
||||
|
||||
return server -> new PlanetGenerator("Test:PlanetGenerator", server, planet, heightMap, layers, features);
|
||||
return server -> new PlanetGenerator("Test:PlanetGenerator", server, planet, heightMap, terrain, features);
|
||||
|
||||
}
|
||||
|
||||
private static void registerTerrainLayers(FloatRangeMap<TerrainLayer> layers) {
|
||||
BlockData dirt = BlockDataRegistry.getInstance().get("Test:Dirt");
|
||||
BlockData air = BlockDataRegistry.getInstance().get("Test:Air");
|
||||
|
||||
private static void registerTerrainLayers(LayeredTerrain terrain) {
|
||||
SurfaceFloatField cliffs = FIELDS.get("Test:Cliff");
|
||||
SurfaceFloatField beaches = FIELDS.register(
|
||||
"Test:Beach",
|
||||
f -> multiply(
|
||||
anti(FIELDS.get("Test:Cliff", f))
|
||||
)
|
||||
);
|
||||
RockStrata rockStrata = createStrata();
|
||||
|
||||
terrain.addLayer(new AirLayer("Test:Air"));
|
||||
terrain.addLayer(new MantleLayer("Test:Mantle"));
|
||||
terrain.addLayer(new CrustLayer("Test:Crust", rockStrata));
|
||||
terrain.addLayer(new WaterLayer("Test:Water"));
|
||||
terrain.addLayer(new SoilLayer("Test:Soil"));
|
||||
terrain.addLayer(new CliffLayer("Test:Cliffs", cliffs, rockStrata));
|
||||
terrain.addLayer(new BeachLayer("Test:Beaches", beaches, rockStrata));
|
||||
}
|
||||
|
||||
private static RockStrata createStrata() {
|
||||
WorleyProceduralNoise.Builder<Rock> builder = WorleyProceduralNoise.builder();
|
||||
TestContent.ROCKS.getRocks().forEach(rock -> builder.add(rock, 1));
|
||||
|
||||
WorleyProceduralNoise.Builder<TerrainLayer> builder = WorleyProceduralNoise.builder();
|
||||
TestContent.ROCKS.getRocks().forEach(rock -> {
|
||||
builder.add((c, d) -> {
|
||||
if (c.getRandom().nextInt(3) == 0) {
|
||||
return rock.getBlock(RockVariant.CRACKED);
|
||||
} else {
|
||||
return rock.getBlock(RockVariant.MONOLITH);
|
||||
}
|
||||
}, 1);
|
||||
});
|
||||
SurfaceFloatField rockDepthOffsets = FIELDS.register(
|
||||
"Test:RockDepthOffsets",
|
||||
() -> tweak(FIELDS.primitive(), 40, 5)
|
||||
);
|
||||
RockLayer rockLayer = new RockLayer(builder.build(SEED), rockDepthOffsets);
|
||||
|
||||
layers.put(Float.NEGATIVE_INFINITY, 0, (c, d) -> air);
|
||||
layers.put(0, 4, (c, d) -> {
|
||||
if (cliffs.get(c.getSurface().getUp(), c.getLocation().x, c.getLocation().y) > 0) {
|
||||
return rockLayer.get(c, d);
|
||||
} else {
|
||||
return dirt;
|
||||
}
|
||||
});
|
||||
layers.put(4, Float.POSITIVE_INFINITY, rockLayer);
|
||||
return new RockStrata(builder.build(SEED), rockDepthOffsets);
|
||||
}
|
||||
|
||||
private static void registerFeatures(List<SurfaceFeature> features) {
|
||||
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package ru.windcorp.progressia.test.gen;
|
||||
package ru.windcorp.progressia.test.gen.feature;
|
||||
|
||||
import java.util.Set;
|
||||
import java.util.function.Consumer;
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package ru.windcorp.progressia.test.gen;
|
||||
package ru.windcorp.progressia.test.gen.feature;
|
||||
|
||||
import glm.vec._3.i.Vec3i;
|
||||
import ru.windcorp.progressia.common.world.block.BlockData;
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package ru.windcorp.progressia.test.gen;
|
||||
package ru.windcorp.progressia.test.gen.feature;
|
||||
|
||||
import java.util.Set;
|
||||
import java.util.function.Function;
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package ru.windcorp.progressia.test.gen;
|
||||
package ru.windcorp.progressia.test.gen.feature;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
@ -104,7 +104,17 @@ public class TestGrassFeature extends SurfaceTopLayerFeature {
|
||||
}
|
||||
|
||||
private void growGrass(SurfaceBlockContext context, double grassiness) {
|
||||
TileData flatGrass = flatGrasses.get((float) grassiness);
|
||||
|
||||
double flatGrassiness = grassiness;
|
||||
BlockData soil = context.getBlock();
|
||||
if (soil.getId().endsWith("Sand")) {
|
||||
flatGrassiness = flatGrassiness / 2 - 0.2;
|
||||
if (flatGrassiness < 0) {
|
||||
flatGrassiness = 0;
|
||||
}
|
||||
}
|
||||
|
||||
TileData flatGrass = flatGrasses.get((float) flatGrassiness);
|
||||
if (flatGrass != null) {
|
||||
for (RelFace face : RelFace.getFaces()) {
|
||||
if (face == RelFace.DOWN)
|
@ -15,7 +15,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package ru.windcorp.progressia.test.gen;
|
||||
package ru.windcorp.progressia.test.gen.feature;
|
||||
|
||||
import glm.vec._3.i.Vec3i;
|
||||
import ru.windcorp.progressia.common.world.block.BlockData;
|
@ -0,0 +1,42 @@
|
||||
/*
|
||||
* Progressia
|
||||
* Copyright (C) 2020-2021 Wind Corporation and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package ru.windcorp.progressia.test.gen.terrain;
|
||||
|
||||
import ru.windcorp.progressia.common.world.block.BlockData;
|
||||
import ru.windcorp.progressia.common.world.block.BlockDataRegistry;
|
||||
import ru.windcorp.progressia.server.world.generation.surface.context.SurfaceBlockContext;
|
||||
|
||||
public class AirLayer extends TerrainLayer {
|
||||
|
||||
private final BlockData air = BlockDataRegistry.getInstance().get("Test:Air");
|
||||
|
||||
public AirLayer(String id) {
|
||||
super(id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public BlockData generate(SurfaceBlockContext context, float depth, float intensity) {
|
||||
return air;
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getIntensity(SurfaceBlockContext context, float depth) {
|
||||
return depth <= 0 ? 1 : 0;
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,55 @@
|
||||
/*
|
||||
* Progressia
|
||||
* Copyright (C) 2020-2021 Wind Corporation and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package ru.windcorp.progressia.test.gen.terrain;
|
||||
|
||||
import ru.windcorp.progressia.common.world.block.BlockData;
|
||||
import ru.windcorp.progressia.server.world.generation.surface.SurfaceFloatField;
|
||||
import ru.windcorp.progressia.server.world.generation.surface.context.SurfaceBlockContext;
|
||||
import ru.windcorp.progressia.test.Rocks.RockVariant;
|
||||
|
||||
public class BeachLayer extends TerrainLayer {
|
||||
|
||||
private final SurfaceFloatField beachSelector;
|
||||
private final RockStrata strata;
|
||||
|
||||
public BeachLayer(String id, SurfaceFloatField beachSelector, RockStrata strata) {
|
||||
super(id);
|
||||
this.beachSelector = beachSelector;
|
||||
this.strata = strata;
|
||||
}
|
||||
|
||||
@Override
|
||||
public BlockData generate(SurfaceBlockContext context, float depth, float intensity) {
|
||||
return strata.get(context, depth).getBlock(RockVariant.SAND);
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getIntensity(SurfaceBlockContext context, float depth) {
|
||||
if (depth < 0 || depth > 3) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
float altitude = context.getLocation().z;
|
||||
if (altitude < -5| altitude > 1) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 3 * beachSelector.get(context);
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,64 @@
|
||||
/*
|
||||
* Progressia
|
||||
* Copyright (C) 2020-2021 Wind Corporation and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package ru.windcorp.progressia.test.gen.terrain;
|
||||
|
||||
import ru.windcorp.progressia.common.world.block.BlockData;
|
||||
import ru.windcorp.progressia.server.world.generation.surface.SurfaceFloatField;
|
||||
import ru.windcorp.progressia.server.world.generation.surface.context.SurfaceBlockContext;
|
||||
import ru.windcorp.progressia.test.Rocks.RockVariant;
|
||||
|
||||
public class CliffLayer extends TerrainLayer {
|
||||
|
||||
private final SurfaceFloatField cliffSelector;
|
||||
private final RockStrata strata;
|
||||
|
||||
public CliffLayer(String id, SurfaceFloatField cliffSelector, RockStrata strata) {
|
||||
super(id);
|
||||
this.cliffSelector = cliffSelector;
|
||||
this.strata = strata;
|
||||
}
|
||||
|
||||
@Override
|
||||
public BlockData generate(SurfaceBlockContext context, float depth, float intensity) {
|
||||
|
||||
RockVariant variant;
|
||||
switch (context.getRandom().nextInt(4)) {
|
||||
case 0:
|
||||
variant = RockVariant.GRAVEL;
|
||||
break;
|
||||
case 1:
|
||||
variant = RockVariant.MONOLITH;
|
||||
break;
|
||||
default:
|
||||
variant = RockVariant.CRACKED;
|
||||
break;
|
||||
}
|
||||
|
||||
return strata.get(context, depth).getBlock(variant);
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getIntensity(SurfaceBlockContext context, float depth) {
|
||||
if (depth < 0 || depth > 7) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 100 * cliffSelector.get(context);
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,69 @@
|
||||
/*
|
||||
* Progressia
|
||||
* Copyright (C) 2020-2021 Wind Corporation and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package ru.windcorp.progressia.test.gen.terrain;
|
||||
|
||||
import ru.windcorp.progressia.common.util.ArrayFloatRangeMap;
|
||||
import ru.windcorp.progressia.common.util.FloatRangeMap;
|
||||
import ru.windcorp.progressia.common.world.block.BlockData;
|
||||
import ru.windcorp.progressia.server.world.generation.surface.context.SurfaceBlockContext;
|
||||
import ru.windcorp.progressia.test.Rocks.RockVariant;
|
||||
|
||||
public class CrustLayer extends TerrainLayer {
|
||||
|
||||
private static final FloatRangeMap<RockVariant> WEAR_TABLE = new ArrayFloatRangeMap<>();
|
||||
static {
|
||||
WEAR_TABLE.put(Float.NEGATIVE_INFINITY, 0.25f, RockVariant.MONOLITH);
|
||||
WEAR_TABLE.put(0.25f, 0.5f, RockVariant.CRACKED);
|
||||
WEAR_TABLE.put(0.5f, 0.75f, RockVariant.GRAVEL);
|
||||
WEAR_TABLE.put(0.75f, Float.POSITIVE_INFINITY, RockVariant.SAND);
|
||||
}
|
||||
|
||||
private final RockStrata strata;
|
||||
|
||||
public CrustLayer(String id, RockStrata strata) {
|
||||
super(id);
|
||||
this.strata = strata;
|
||||
}
|
||||
|
||||
@Override
|
||||
public BlockData generate(SurfaceBlockContext context, float depth, float intensity) {
|
||||
|
||||
RockVariant variant;
|
||||
if (depth < 8) {
|
||||
float wear = 1 - depth / 8;
|
||||
float offset = (context.getRandom().nextFloat() * 2 - 1) * 0.5f;
|
||||
variant = WEAR_TABLE.get(wear + offset);
|
||||
} else {
|
||||
variant = RockVariant.MONOLITH;
|
||||
}
|
||||
|
||||
return strata.get(context, depth).getBlock(variant);
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getIntensity(SurfaceBlockContext context, float depth) {
|
||||
if (depth < 0) {
|
||||
return 0;
|
||||
} else if (context.getLocation().z > -100) {
|
||||
return 1;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,61 @@
|
||||
/*
|
||||
* Progressia
|
||||
* Copyright (C) 2020-2021 Wind Corporation and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package ru.windcorp.progressia.test.gen.terrain;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import ru.windcorp.progressia.common.world.block.BlockData;
|
||||
import ru.windcorp.progressia.server.world.generation.surface.TerrainSupplier;
|
||||
import ru.windcorp.progressia.server.world.generation.surface.context.SurfaceBlockContext;
|
||||
|
||||
public class LayeredTerrain implements TerrainSupplier {
|
||||
|
||||
private final List<TerrainLayer> layers = new ArrayList<>();
|
||||
|
||||
public void addLayer(TerrainLayer layer) {
|
||||
this.layers.add(layer);
|
||||
}
|
||||
|
||||
@Override
|
||||
public BlockData get(SurfaceBlockContext context, float depth) {
|
||||
TerrainLayer layer = null;
|
||||
float intensity = 0;
|
||||
|
||||
for (int i = 0; i < layers.size(); ++i) {
|
||||
TerrainLayer currentLayer = layers.get(i);
|
||||
|
||||
float currentIntensity = currentLayer.getIntensity(context, depth);
|
||||
if (currentIntensity <= 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (intensity < currentIntensity) {
|
||||
intensity = currentIntensity;
|
||||
layer = currentLayer;
|
||||
}
|
||||
}
|
||||
|
||||
if (layer == null) {
|
||||
layer = layers.get(0);
|
||||
}
|
||||
|
||||
return layer.generate(context, depth, intensity);
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,42 @@
|
||||
/*
|
||||
* Progressia
|
||||
* Copyright (C) 2020-2021 Wind Corporation and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package ru.windcorp.progressia.test.gen.terrain;
|
||||
|
||||
import ru.windcorp.progressia.common.world.block.BlockData;
|
||||
import ru.windcorp.progressia.common.world.block.BlockDataRegistry;
|
||||
import ru.windcorp.progressia.server.world.generation.surface.context.SurfaceBlockContext;
|
||||
|
||||
public class MantleLayer extends TerrainLayer {
|
||||
|
||||
private final BlockData material = BlockDataRegistry.getInstance().get("Test:Mantle");
|
||||
|
||||
public MantleLayer(String id) {
|
||||
super(id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public BlockData generate(SurfaceBlockContext context, float depth, float intensity) {
|
||||
return material;
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getIntensity(SurfaceBlockContext context, float depth) {
|
||||
return context.getLocation().z <= -100 ? 1 : 0;
|
||||
}
|
||||
|
||||
}
|
@ -15,43 +15,38 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package ru.windcorp.progressia.test.gen;
|
||||
package ru.windcorp.progressia.test.gen.terrain;
|
||||
|
||||
import ru.windcorp.progressia.common.util.noise.discrete.DiscreteNoise;
|
||||
import ru.windcorp.progressia.common.world.block.BlockData;
|
||||
import ru.windcorp.progressia.server.world.generation.surface.SurfaceFloatField;
|
||||
import ru.windcorp.progressia.server.world.generation.surface.TerrainLayer;
|
||||
import ru.windcorp.progressia.server.world.generation.surface.context.SurfaceBlockContext;
|
||||
import ru.windcorp.progressia.test.Rocks.Rock;
|
||||
|
||||
public class RockLayer implements TerrainLayer {
|
||||
public class RockStrata {
|
||||
|
||||
private final DiscreteNoise<TerrainLayer> strata;
|
||||
private final DiscreteNoise<Rock> distribution;
|
||||
private final SurfaceFloatField depthOffsets;
|
||||
|
||||
private final double horizontalScale = 200;
|
||||
private final double verticalScale = 10;
|
||||
private final double depthInfluense = 0.1;
|
||||
private final double horizontalScale = 800;
|
||||
private final double verticalScale = 20;
|
||||
private final double depthInfluence = 0.1;
|
||||
|
||||
public RockLayer(DiscreteNoise<TerrainLayer> strata, SurfaceFloatField depthOffsets) {
|
||||
this.strata = strata;
|
||||
public RockStrata(DiscreteNoise<Rock> distribution, SurfaceFloatField depthOffsets) {
|
||||
this.distribution = distribution;
|
||||
this.depthOffsets = depthOffsets;
|
||||
}
|
||||
|
||||
@Override
|
||||
public BlockData get(SurfaceBlockContext context, float depth) {
|
||||
|
||||
public Rock get(SurfaceBlockContext context, float depth) {
|
||||
double z = context.getLocation().z;
|
||||
z -= depth * depthInfluense;
|
||||
z -= depth * depthInfluence;
|
||||
z += depthOffsets.get(context);
|
||||
z /= verticalScale;
|
||||
|
||||
return strata
|
||||
.get(
|
||||
return distribution.get(
|
||||
context.getLocation().x / horizontalScale,
|
||||
context.getLocation().y / horizontalScale,
|
||||
z
|
||||
)
|
||||
.get(context, depth);
|
||||
);
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,59 @@
|
||||
/*
|
||||
* Progressia
|
||||
* Copyright (C) 2020-2021 Wind Corporation and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package ru.windcorp.progressia.test.gen.terrain;
|
||||
|
||||
import ru.windcorp.progressia.common.Units;
|
||||
import ru.windcorp.progressia.common.util.math.PiecewiseLinearFunction;
|
||||
import ru.windcorp.progressia.common.world.block.BlockData;
|
||||
import ru.windcorp.progressia.common.world.block.BlockDataRegistry;
|
||||
import ru.windcorp.progressia.server.world.generation.surface.context.SurfaceBlockContext;
|
||||
|
||||
public class SoilLayer extends TerrainLayer {
|
||||
|
||||
private static final PiecewiseLinearFunction THICKNESS = PiecewiseLinearFunction.builder()
|
||||
.add(Units.get("-5 m"), Units.get("1 m"))
|
||||
.add(Units.get("0 m"), Units.get("4 m"))
|
||||
.add(Units.get("5 km"), Units.get("0 m"))
|
||||
.build();
|
||||
|
||||
private final BlockData soil = BlockDataRegistry.getInstance().get("Test:Dirt");
|
||||
|
||||
public SoilLayer(String id) {
|
||||
super(id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public BlockData generate(SurfaceBlockContext context, float depth, float intensity) {
|
||||
return soil;
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getIntensity(SurfaceBlockContext context, float depth) {
|
||||
if (depth < 0) return 0;
|
||||
|
||||
float altitude = context.getLocation().z;
|
||||
float thickness = THICKNESS.apply(altitude);
|
||||
|
||||
if (depth < thickness) {
|
||||
return 2;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,34 @@
|
||||
/*
|
||||
* Progressia
|
||||
* Copyright (C) 2020-2021 Wind Corporation and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package ru.windcorp.progressia.test.gen.terrain;
|
||||
|
||||
import ru.windcorp.progressia.common.util.namespaces.Namespaced;
|
||||
import ru.windcorp.progressia.common.world.block.BlockData;
|
||||
import ru.windcorp.progressia.server.world.generation.surface.context.SurfaceBlockContext;
|
||||
|
||||
public abstract class TerrainLayer extends Namespaced {
|
||||
|
||||
public TerrainLayer(String id) {
|
||||
super(id);
|
||||
}
|
||||
|
||||
public abstract BlockData generate(SurfaceBlockContext context, float depth, float intensity);
|
||||
|
||||
public abstract float getIntensity(SurfaceBlockContext context, float depth);
|
||||
|
||||
}
|
@ -0,0 +1,45 @@
|
||||
/*
|
||||
* Progressia
|
||||
* Copyright (C) 2020-2021 Wind Corporation and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package ru.windcorp.progressia.test.gen.terrain;
|
||||
|
||||
import ru.windcorp.progressia.common.world.block.BlockData;
|
||||
import ru.windcorp.progressia.common.world.block.BlockDataRegistry;
|
||||
import ru.windcorp.progressia.server.world.generation.surface.context.SurfaceBlockContext;
|
||||
|
||||
public class WaterLayer extends TerrainLayer {
|
||||
|
||||
private final BlockData water = BlockDataRegistry.getInstance().get("Test:Water");
|
||||
|
||||
public WaterLayer(String id) {
|
||||
super(id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public BlockData generate(SurfaceBlockContext context, float depth, float intensity) {
|
||||
return water;
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getIntensity(SurfaceBlockContext context, float depth) {
|
||||
if (depth <= 0 && context.getLocation().z <= 0) {
|
||||
return 2;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
}
|
BIN
src/main/resources/assets/textures/blocks/Mantle.png
Normal file
BIN
src/main/resources/assets/textures/blocks/Mantle.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.5 KiB |
BIN
src/main/resources/assets/textures/blocks/Water.png
Normal file
BIN
src/main/resources/assets/textures/blocks/Water.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.6 KiB |
Reference in New Issue
Block a user