diff --git a/src/main/java/ru/windcorp/progressia/server/world/generation/planet/PlanetTerrainGenerator.java b/src/main/java/ru/windcorp/progressia/server/world/generation/planet/PlanetTerrainGenerator.java index dba3b8a..a43ad9f 100644 --- a/src/main/java/ru/windcorp/progressia/server/world/generation/planet/PlanetTerrainGenerator.java +++ b/src/main/java/ru/windcorp/progressia/server/world/generation/planet/PlanetTerrainGenerator.java @@ -48,12 +48,11 @@ class PlanetTerrainGenerator { this.parent = generator; int seaLevel = (int) parent.getPlanet().getRadius(); - SurfaceFloatField adjustedHeightMap = (f, n, w) -> heightMap.get(f, n, w) + generator.getPlanet().getRadius(); this.surfaceGenerators = AbsFace.mapToFaces( face -> new SurfaceTerrainGenerator( new Surface(face, seaLevel), - adjustedHeightMap, + heightMap, layers ) ); diff --git a/src/main/java/ru/windcorp/progressia/server/world/generation/surface/SurfaceTerrainGenerator.java b/src/main/java/ru/windcorp/progressia/server/world/generation/surface/SurfaceTerrainGenerator.java index 35b4a58..ea7cb9b 100644 --- a/src/main/java/ru/windcorp/progressia/server/world/generation/surface/SurfaceTerrainGenerator.java +++ b/src/main/java/ru/windcorp/progressia/server/world/generation/surface/SurfaceTerrainGenerator.java @@ -47,6 +47,7 @@ public class SurfaceTerrainGenerator { Vec3 offset = new Vec3(chunk.getMinX(), chunk.getMinY(), chunk.getMinZ()); AxisRotations.relativize(offset, chunk.getUp(), offset); + offset.z -= surface.getSeaLevel(); SurfaceWorldContext context = surface.createContext(server, chunk, 0); diff --git a/src/main/java/ru/windcorp/progressia/test/TestContent.java b/src/main/java/ru/windcorp/progressia/test/TestContent.java index 3be2c7e..6c2b0c3 100644 --- a/src/main/java/ru/windcorp/progressia/test/TestContent.java +++ b/src/main/java/ru/windcorp/progressia/test/TestContent.java @@ -100,6 +100,10 @@ public class TestContent { register(new BlockData("Test:Dirt")); register(new BlockRenderOpaqueCube("Test:Dirt", getBlockTexture("Dirt"))); register(new BlockLogic("Test:Dirt")); + + register(new BlockData("Test:Chernozem")); + register(new BlockRenderOpaqueCube("Test:Chernozem", getBlockTexture("Chernozem"))); + register(new BlockLogic("Test:Chernozem")); register(new BlockData("Test:Stone")); register(new BlockRenderOpaqueCube("Test:Stone", getBlockTexture("Stone"))); @@ -167,9 +171,19 @@ public class TestContent { private static void registerTiles() { Set placeableBlacklist = new HashSet<>(); - register(new TileData("Test:Grass")); - register(new TestTileRenderGrass("Test:Grass", getTileTexture("GrassTop"), getTileTexture("GrassSide"))); - register(new TestTileLogicGrass("Test:Grass")); + for (String variant : new String[] { + "Opaque", + "Patches", + "Web", + "Threads" + }) { + String fullName = "Grass" + variant; + String id = "Test:" + fullName; + + register(new TileData(id)); + register(new TestTileRenderGrass(id, getTileTexture(fullName + "Top"), getTileTexture(fullName + "Side"), variant.equals("Opaque"))); + register(new TestTileLogicGrass(id)); + } register(new TileData("Test:Stones")); register(new TileRenderTransparentSurface("Test:Stones", getTileTexture("Stones"))); diff --git a/src/main/java/ru/windcorp/progressia/test/TestTileRenderGrass.java b/src/main/java/ru/windcorp/progressia/test/TestTileRenderGrass.java index 14b56c7..f78d6c3 100644 --- a/src/main/java/ru/windcorp/progressia/test/TestTileRenderGrass.java +++ b/src/main/java/ru/windcorp/progressia/test/TestTileRenderGrass.java @@ -26,15 +26,18 @@ public class TestTileRenderGrass extends TileRenderSurface { private final Texture topTexture; private final Texture sideTexture; + private final boolean isOpaque; public TestTileRenderGrass( String id, Texture top, - Texture side + Texture side, + boolean isOpaque ) { super(id); this.topTexture = top; this.sideTexture = side; + this.isOpaque = isOpaque; } @Override @@ -44,7 +47,7 @@ public class TestTileRenderGrass extends TileRenderSurface { @Override public boolean isOpaque(RelFace face) { - return face == RelFace.UP; + return isOpaque && face == RelFace.UP; } } diff --git a/src/main/java/ru/windcorp/progressia/test/gen/TestGenerationConfig.java b/src/main/java/ru/windcorp/progressia/test/gen/TestGenerationConfig.java index 9837831..ee0f312 100644 --- a/src/main/java/ru/windcorp/progressia/test/gen/TestGenerationConfig.java +++ b/src/main/java/ru/windcorp/progressia/test/gen/TestGenerationConfig.java @@ -116,7 +116,7 @@ public class TestGenerationConfig { "Test:Grass", f -> multiply( tweak(octaves(FIELDS.primitive(), 2, 2), 40, 0.5, 1.2), - squash(tweak(FIELDS.get("Test:Forest", f), 1, -0.7, 1), 10), + squash(tweak(FIELDS.get("Test:Forest", f), 1, -1, 1), 10), anti(squash(FIELDS.get("Test:Cliff", f), 10)) ) ); diff --git a/src/main/java/ru/windcorp/progressia/test/gen/TestGrassFeature.java b/src/main/java/ru/windcorp/progressia/test/gen/TestGrassFeature.java index ca36cee..8a4ce80 100644 --- a/src/main/java/ru/windcorp/progressia/test/gen/TestGrassFeature.java +++ b/src/main/java/ru/windcorp/progressia/test/gen/TestGrassFeature.java @@ -25,6 +25,8 @@ import com.google.common.collect.ImmutableSet; 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.common.world.block.BlockDataRegistry; import ru.windcorp.progressia.common.world.rels.RelFace; import ru.windcorp.progressia.common.world.tile.TileData; import ru.windcorp.progressia.common.world.tile.TileDataRegistry; @@ -45,14 +47,22 @@ public class TestGrassFeature extends SurfaceTopLayerFeature { private final SurfaceFloatField grassiness; private final double scatterDensity = 1.0 / (3 * 3); + + private final BlockData chernozem = BlockDataRegistry.getInstance().get("Test:Chernozem"); - private final TileData grass = TileDataRegistry.getInstance().get("Test:Grass"); - - private final FloatRangeMap grasses = new ArrayFloatRangeMap<>(); + private final FloatRangeMap flatGrasses = new ArrayFloatRangeMap<>(); { - grasses.put(0.6f, 1, TileDataRegistry.getInstance().get("Test:TallGrass")); - grasses.put(0.4f, 0.6f, TileDataRegistry.getInstance().get("Test:MediumGrass")); - grasses.put(0.1f, 0.4f, TileDataRegistry.getInstance().get("Test:LowGrass")); + flatGrasses.put(0.4f, Float.POSITIVE_INFINITY, TileDataRegistry.getInstance().get("Test:GrassOpaque")); + flatGrasses.put(0.2f, 0.4f, TileDataRegistry.getInstance().get("Test:GrassPatches")); + flatGrasses.put(0.1f, 0.2f, TileDataRegistry.getInstance().get("Test:GrassWeb")); + flatGrasses.put(0.05f, 0.1f, TileDataRegistry.getInstance().get("Test:GrassThreads")); + } + + private final FloatRangeMap herbGrasses = new ArrayFloatRangeMap<>(); + { + herbGrasses.put(0.6f, 1, TileDataRegistry.getInstance().get("Test:TallGrass")); + herbGrasses.put(0.4f, 0.6f, TileDataRegistry.getInstance().get("Test:MediumGrass")); + herbGrasses.put(0.1f, 0.4f, TileDataRegistry.getInstance().get("Test:LowGrass")); } private final List scatter = ImmutableList.of( @@ -81,11 +91,7 @@ public class TestGrassFeature extends SurfaceTopLayerFeature { } context.pop(); - double grassiness = this.grassiness.get(context); - if (grassiness > 0.1) { - growGrass(context, grassiness); - } - + growGrass(context, this.grassiness.get(context)); placeScatter(context); } @@ -97,21 +103,28 @@ public class TestGrassFeature extends SurfaceTopLayerFeature { } private void growGrass(SurfaceBlockContext context, double grassiness) { - for (RelFace face : RelFace.getFaces()) { - if (face == RelFace.DOWN) - continue; + TileData flatGrass = flatGrasses.get((float) grassiness); + if (flatGrass != null) { + for (RelFace face : RelFace.getFaces()) { + if (face == RelFace.DOWN) + continue; + + if (context.pushRelative(face).logic().getBlock().isTransparent()) { + context.pop(); + context.addTile(face, flatGrass); + } else { + context.pop(); + } - if (context.pushRelative(face).logic().getBlock().isTransparent()) { - context.pop(); - context.addTile(face, grass); - } else { - context.pop(); } - + + if (grassiness > 0.8 && context.getBlock().getId().equals("Test:Dirt")) { + context.setBlock(chernozem); + } } if (context.getRandom().nextDouble() < grassiness) { - TileData herbGrass = grasses.get((float) grassiness); + TileData herbGrass = herbGrasses.get((float) grassiness); if (herbGrass != null) { context.addTile(RelFace.UP, herbGrass); } diff --git a/src/main/resources/assets/textures/blocks/Chernozem.png b/src/main/resources/assets/textures/blocks/Chernozem.png new file mode 100644 index 0000000..fcc4646 Binary files /dev/null and b/src/main/resources/assets/textures/blocks/Chernozem.png differ diff --git a/src/main/resources/assets/textures/tiles/GrassSide.png b/src/main/resources/assets/textures/tiles/GrassOpaqueSide.png similarity index 100% rename from src/main/resources/assets/textures/tiles/GrassSide.png rename to src/main/resources/assets/textures/tiles/GrassOpaqueSide.png diff --git a/src/main/resources/assets/textures/tiles/GrassTop.png b/src/main/resources/assets/textures/tiles/GrassOpaqueTop.png similarity index 100% rename from src/main/resources/assets/textures/tiles/GrassTop.png rename to src/main/resources/assets/textures/tiles/GrassOpaqueTop.png diff --git a/src/main/resources/assets/textures/tiles/GrassPatchesSide.png b/src/main/resources/assets/textures/tiles/GrassPatchesSide.png new file mode 100644 index 0000000..cfe131a Binary files /dev/null and b/src/main/resources/assets/textures/tiles/GrassPatchesSide.png differ diff --git a/src/main/resources/assets/textures/tiles/GrassPatchesTop.png b/src/main/resources/assets/textures/tiles/GrassPatchesTop.png new file mode 100644 index 0000000..d587374 Binary files /dev/null and b/src/main/resources/assets/textures/tiles/GrassPatchesTop.png differ diff --git a/src/main/resources/assets/textures/tiles/GrassThreadsSide.png b/src/main/resources/assets/textures/tiles/GrassThreadsSide.png new file mode 100644 index 0000000..97d6e34 Binary files /dev/null and b/src/main/resources/assets/textures/tiles/GrassThreadsSide.png differ diff --git a/src/main/resources/assets/textures/tiles/GrassThreadsTop.png b/src/main/resources/assets/textures/tiles/GrassThreadsTop.png new file mode 100644 index 0000000..0e1a1d2 Binary files /dev/null and b/src/main/resources/assets/textures/tiles/GrassThreadsTop.png differ diff --git a/src/main/resources/assets/textures/tiles/GrassWebSide.png b/src/main/resources/assets/textures/tiles/GrassWebSide.png new file mode 100644 index 0000000..b00f54d Binary files /dev/null and b/src/main/resources/assets/textures/tiles/GrassWebSide.png differ diff --git a/src/main/resources/assets/textures/tiles/GrassWebTop.png b/src/main/resources/assets/textures/tiles/GrassWebTop.png new file mode 100644 index 0000000..6fbc6ac Binary files /dev/null and b/src/main/resources/assets/textures/tiles/GrassWebTop.png differ