From d01ef3654fede3d5b52ffadd362a1a54dc63a063 Mon Sep 17 00:00:00 2001 From: OLEGSHA Date: Sun, 22 Aug 2021 22:18:42 +0300 Subject: [PATCH] Added grasses and flowers - Added CROSimple to optimize simple non-Surface textures - Added TileRenderCross - Added Low, Medium and Tall grass - Added Blue, Purple and White flat flowers - Added Bushes - Added tiny Dandelions and tiny Lavanders - Improved grass and log textures --- .../world/cro/ChunkRenderOptimizerSimple.java | 99 ++++++++++ .../client/world/tile/TileRenderCross.java | 170 ++++++++++++++++++ .../progressia/common/util/VectorUtil.java | 19 ++ .../impl/DefaultServerContextImpl.java | 2 +- .../surface/context/SurfaceContextImpl.java | 9 + .../ru/windcorp/progressia/test/Rocks.java | 4 + .../windcorp/progressia/test/TestContent.java | 48 ++++- .../progressia/test/TileRenderHerb.java | 89 +++++++++ .../progressia/test/TileRenderTinyFlower.java | 48 +++++ .../windcorp/progressia/test/gen/Fields.java | 8 +- .../test/gen/TestFlowerFeature.java | 95 ++++++++++ .../test/gen/TestGenerationConfig.java | 27 ++- .../progressia/test/gen/TestGrassFeature.java | 80 +++++---- .../progressia/test/gen/TestHeightMap.java | 4 +- .../assets/textures/blocks/LogSide.png | Bin 1964 -> 7213 bytes .../assets/textures/blocks/LogTop.png | Bin 1779 -> 8247 bytes .../assets/textures/tiles/BlueFlowers.png | Bin 0 -> 481 bytes .../resources/assets/textures/tiles/Bush.png | Bin 0 -> 2015 bytes .../assets/textures/tiles/GrassSide.png | Bin 4624 -> 4482 bytes .../assets/textures/tiles/GrassTop.png | Bin 7859 -> 7074 bytes .../assets/textures/tiles/LowGrass.png | Bin 0 -> 448 bytes .../assets/textures/tiles/MediumGrass.png | Bin 0 -> 690 bytes .../assets/textures/tiles/PurpleFlowers.png | Bin 0 -> 519 bytes .../assets/textures/tiles/TallGrass.png | Bin 0 -> 8990 bytes .../textures/tiles/TinyDandelionFlowers.png | Bin 0 -> 4380 bytes .../textures/tiles/TinyLavanderFlowers.png | Bin 0 -> 5104 bytes .../assets/textures/tiles/WhiteFlowers.png | Bin 0 -> 586 bytes 27 files changed, 649 insertions(+), 53 deletions(-) create mode 100644 src/main/java/ru/windcorp/progressia/client/world/cro/ChunkRenderOptimizerSimple.java create mode 100644 src/main/java/ru/windcorp/progressia/client/world/tile/TileRenderCross.java create mode 100644 src/main/java/ru/windcorp/progressia/test/TileRenderHerb.java create mode 100644 src/main/java/ru/windcorp/progressia/test/TileRenderTinyFlower.java create mode 100644 src/main/java/ru/windcorp/progressia/test/gen/TestFlowerFeature.java create mode 100644 src/main/resources/assets/textures/tiles/BlueFlowers.png create mode 100644 src/main/resources/assets/textures/tiles/Bush.png create mode 100644 src/main/resources/assets/textures/tiles/LowGrass.png create mode 100644 src/main/resources/assets/textures/tiles/MediumGrass.png create mode 100644 src/main/resources/assets/textures/tiles/PurpleFlowers.png create mode 100644 src/main/resources/assets/textures/tiles/TallGrass.png create mode 100644 src/main/resources/assets/textures/tiles/TinyDandelionFlowers.png create mode 100644 src/main/resources/assets/textures/tiles/TinyLavanderFlowers.png create mode 100644 src/main/resources/assets/textures/tiles/WhiteFlowers.png diff --git a/src/main/java/ru/windcorp/progressia/client/world/cro/ChunkRenderOptimizerSimple.java b/src/main/java/ru/windcorp/progressia/client/world/cro/ChunkRenderOptimizerSimple.java new file mode 100644 index 0000000..3d34549 --- /dev/null +++ b/src/main/java/ru/windcorp/progressia/client/world/cro/ChunkRenderOptimizerSimple.java @@ -0,0 +1,99 @@ +/* + * 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 . + */ +package ru.windcorp.progressia.client.world.cro; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.function.Consumer; + +import glm.vec._3.i.Vec3i; +import ru.windcorp.progressia.client.graphics.backend.Usage; +import ru.windcorp.progressia.client.graphics.model.Renderable; +import ru.windcorp.progressia.client.graphics.model.Shape; +import ru.windcorp.progressia.client.graphics.model.ShapePart; +import ru.windcorp.progressia.client.graphics.world.WorldRenderProgram; +import ru.windcorp.progressia.client.world.block.BlockRender; +import ru.windcorp.progressia.client.world.tile.TileRender; +import ru.windcorp.progressia.common.world.DefaultChunkData; +import ru.windcorp.progressia.common.world.rels.RelFace; + +public class ChunkRenderOptimizerSimple extends ChunkRenderOptimizer { + + public interface BlockOptimizedSimple { + + void getShapeParts( + DefaultChunkData chunk, + Vec3i relBlockInChunk, + Consumer output + ); + + } + + public interface TileOptimizedCustom { + + void getShapeParts( + DefaultChunkData chunk, + Vec3i relBlockInChunk, + RelFace blockFace, + Consumer output + ); + + } + + private final Collection parts = new ArrayList<>(); + private final Consumer partAdder = parts::add; + + public ChunkRenderOptimizerSimple(String id) { + super(id); + } + + @Override + public void startRender() { + parts.clear(); + } + + @Override + public void addBlock(BlockRender block, Vec3i relBlockInChunk) { + if (block instanceof BlockOptimizedSimple) { + ((BlockOptimizedSimple) block).getShapeParts(chunk.getData(), relBlockInChunk, partAdder); + } + } + + @Override + public void addTile(TileRender tile, Vec3i relBlockInChunk, RelFace blockFace) { + if (tile instanceof TileOptimizedCustom) { + ((TileOptimizedCustom) tile).getShapeParts(chunk.getData(), relBlockInChunk, blockFace, partAdder); + } + } + + @Override + public Renderable endRender() { + + if (parts.isEmpty()) { + return null; + } + + return new Shape( + Usage.STATIC, + WorldRenderProgram.getDefault(), + parts.toArray(new ShapePart[parts.size()]) + ); + + } + +} diff --git a/src/main/java/ru/windcorp/progressia/client/world/tile/TileRenderCross.java b/src/main/java/ru/windcorp/progressia/client/world/tile/TileRenderCross.java new file mode 100644 index 0000000..01af8f6 --- /dev/null +++ b/src/main/java/ru/windcorp/progressia/client/world/tile/TileRenderCross.java @@ -0,0 +1,170 @@ +/* + * 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 . + */ +package ru.windcorp.progressia.client.world.tile; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.function.Consumer; + +import glm.mat._3.Mat3; +import glm.mat._4.Mat4; +import glm.vec._3.Vec3; +import glm.vec._3.i.Vec3i; +import glm.vec._4.Vec4; +import ru.windcorp.progressia.client.graphics.Colors; +import ru.windcorp.progressia.client.graphics.backend.Usage; +import ru.windcorp.progressia.client.graphics.model.Renderable; +import ru.windcorp.progressia.client.graphics.model.Shape; +import ru.windcorp.progressia.client.graphics.model.ShapePart; +import ru.windcorp.progressia.client.graphics.model.ShapeParts; +import ru.windcorp.progressia.client.graphics.texture.Texture; +import ru.windcorp.progressia.client.graphics.world.WorldRenderProgram; +import ru.windcorp.progressia.client.world.cro.ChunkRenderOptimizerSimple.TileOptimizedCustom; +import ru.windcorp.progressia.common.util.Matrices; +import ru.windcorp.progressia.common.util.VectorUtil; +import ru.windcorp.progressia.common.util.Vectors; +import ru.windcorp.progressia.common.world.DefaultChunkData; +import ru.windcorp.progressia.common.world.rels.AbsFace; +import ru.windcorp.progressia.common.world.rels.AxisRotations; +import ru.windcorp.progressia.common.world.rels.RelFace; + +public class TileRenderCross extends TileRender implements TileOptimizedCustom { + + private static final float SQRT_2_OVER_2 = (float) Math.sqrt(2) / 2; + private static final float[] ONE_AND_NEGATIVE_ONE = new float[] { 1, -1 }; + + private final Texture texture; + private final float width; + + public TileRenderCross(String id, Texture texture, boolean allowStretching) { + super(id); + this.texture = texture; + this.width = allowStretching ? 1 : SQRT_2_OVER_2; + } + + public Texture getTexture(RelFace blockFace) { + return texture; + } + + public Vec4 getColorMultiplier(RelFace blockFace) { + return Colors.WHITE; + } + + @Override + public void getShapeParts( + DefaultChunkData chunk, + Vec3i bic, + RelFace blockFace, + Consumer output + ) { + Mat4 transform = Matrices.grab4(); + Vec3 origin = Vectors.grab3(); + Vec3 width = Vectors.grab3(); + Vec3 height = Vectors.grab3(); + + Mat3 resolutionMatrix = AxisRotations.getResolutionMatrix3(blockFace.resolve(AbsFace.POS_Z)); + + Vec4 color = getColorMultiplier(blockFace); + Texture texture = getTexture(blockFace); + float originOffset = (1 - this.width) / 2; + + WorldRenderProgram program = WorldRenderProgram.getDefault(); + + for (int i = 0; getTransform(chunk, bic, blockFace, i, transform); i++) { + + for (float flip : ONE_AND_NEGATIVE_ONE) { + origin.set(flip * (originOffset - 0.5f), originOffset - 0.5f, 0); + width.set(flip * this.width, this.width, 0); + height.set(0, 0, 1); + + VectorUtil.applyMat4(origin, transform); + VectorUtil.rotateOnly(width, transform); + VectorUtil.rotateOnly(height, transform); + + origin.z += 1 - 0.5f; + + if (blockFace != RelFace.UP) { + resolutionMatrix.mul(origin); + resolutionMatrix.mul(width); + resolutionMatrix.mul(height); + } + + origin.add(bic.x, bic.y, bic.z); + + output.accept( + ShapeParts.createRectangle( + program, + texture, + color, + origin, + width, + height, + false + ) + ); + output.accept( + ShapeParts.createRectangle( + program, + texture, + color, + origin, + width, + height, + true + ) + ); + } + + } + + Matrices.release(transform); + Vectors.release(origin); + Vectors.release(width); + Vectors.release(height); + } + + protected boolean getTransform( + DefaultChunkData chunk, + Vec3i relBlockInChunk, + RelFace blockFace, + int count, + Mat4 output + ) { + output.identity(); + return count == 0; + } + + @Override + public Renderable createRenderable(DefaultChunkData chunk, Vec3i blockInChunk, RelFace blockFace) { + Collection parts = new ArrayList<>(4); + + getShapeParts(chunk, blockInChunk, blockFace, parts::add); + + return new Shape( + Usage.STATIC, + WorldRenderProgram.getDefault(), + parts.toArray(new ShapePart[parts.size()]) + ); + } + + @Override + public boolean needsOwnRenderable() { + return false; + } + +} diff --git a/src/main/java/ru/windcorp/progressia/common/util/VectorUtil.java b/src/main/java/ru/windcorp/progressia/common/util/VectorUtil.java index f25368f..3f33e50 100644 --- a/src/main/java/ru/windcorp/progressia/common/util/VectorUtil.java +++ b/src/main/java/ru/windcorp/progressia/common/util/VectorUtil.java @@ -180,6 +180,25 @@ public class VectorUtil { return applyMat4(inOut, mat, inOut); } + public static Vec3 rotateOnly(Vec3 in, Mat4 mat, Vec3 out) { + if (out == null) { + out = new Vec3(); + } + + Mat3 mat3 = Matrices.grab3(); + mat3.set(mat); + + mat3.mul(in, out); + + Matrices.release(mat3); + + return out; + } + + public static Vec3 rotateOnly(Vec3 inOut, Mat4 mat) { + return rotateOnly(inOut, mat, inOut); + } + public static Vec3 rotate(Vec3 in, Vec3 axis, float angle, Vec3 out) { if (out == null) { out = new Vec3(); diff --git a/src/main/java/ru/windcorp/progressia/server/world/context/impl/DefaultServerContextImpl.java b/src/main/java/ru/windcorp/progressia/server/world/context/impl/DefaultServerContextImpl.java index b4dfedc..09e4ff1 100644 --- a/src/main/java/ru/windcorp/progressia/server/world/context/impl/DefaultServerContextImpl.java +++ b/src/main/java/ru/windcorp/progressia/server/world/context/impl/DefaultServerContextImpl.java @@ -405,7 +405,7 @@ class DefaultServerContextImpl extends DefaultServerContext @Override public int getTileCount(Vec3i location, RelFace face) { - assert requireContextRole(Role.TILE_STACK); + assert requireContextRole(Role.WORLD); TileDataStack stack = world.getTilesOrNull(location, face.resolve(AbsFace.POS_Z)); if (stack == null) return 0; diff --git a/src/main/java/ru/windcorp/progressia/server/world/generation/surface/context/SurfaceContextImpl.java b/src/main/java/ru/windcorp/progressia/server/world/generation/surface/context/SurfaceContextImpl.java index 6050c49..2ec6636 100644 --- a/src/main/java/ru/windcorp/progressia/server/world/generation/surface/context/SurfaceContextImpl.java +++ b/src/main/java/ru/windcorp/progressia/server/world/generation/surface/context/SurfaceContextImpl.java @@ -20,7 +20,9 @@ package ru.windcorp.progressia.server.world.generation.surface.context; import java.util.Random; import glm.vec._3.i.Vec3i; +import ru.windcorp.progressia.common.world.generic.TileGenericStackRO; import ru.windcorp.progressia.common.world.rels.RelFace; +import ru.windcorp.progressia.common.world.tile.TileData; import ru.windcorp.progressia.server.world.context.ServerTileContext; import ru.windcorp.progressia.server.world.context.impl.RotatingServerContext; import ru.windcorp.progressia.server.world.generation.surface.Surface; @@ -110,5 +112,12 @@ public class SurfaceContextImpl extends RotatingServerContext implements Surface super.push(location, face, layer); return this; } + + @Override + public void addTile(Vec3i userLocation, RelFace userFace, TileData tile) { + if (getTileCount(userLocation, userFace) < TileGenericStackRO.TILES_PER_FACE) { + super.addTile(userLocation, userFace, tile); + } + } } diff --git a/src/main/java/ru/windcorp/progressia/test/Rocks.java b/src/main/java/ru/windcorp/progressia/test/Rocks.java index ebf31fe..d137376 100644 --- a/src/main/java/ru/windcorp/progressia/test/Rocks.java +++ b/src/main/java/ru/windcorp/progressia/test/Rocks.java @@ -82,6 +82,10 @@ public class Rocks { public BlockData getBlock(RockVariant variant) { return blocks.get(variant); } + + public Collection getBlocks() { + return blocks.values(); + } private void register() { for (RockVariant variant : RockVariant.values()) { diff --git a/src/main/java/ru/windcorp/progressia/test/TestContent.java b/src/main/java/ru/windcorp/progressia/test/TestContent.java index 1244560..3be2c7e 100644 --- a/src/main/java/ru/windcorp/progressia/test/TestContent.java +++ b/src/main/java/ru/windcorp/progressia/test/TestContent.java @@ -38,6 +38,7 @@ import ru.windcorp.progressia.client.graphics.input.KeyMatcher; import ru.windcorp.progressia.client.graphics.world.Selection; import ru.windcorp.progressia.client.world.block.*; import ru.windcorp.progressia.client.world.cro.ChunkRenderOptimizerRegistry; +import ru.windcorp.progressia.client.world.cro.ChunkRenderOptimizerSimple; import ru.windcorp.progressia.client.world.cro.ChunkRenderOptimizerSurface; import ru.windcorp.progressia.client.world.entity.*; import ru.windcorp.progressia.client.world.tile.*; @@ -174,9 +175,20 @@ public class TestContent { register(new TileRenderTransparentSurface("Test:Stones", getTileTexture("Stones"))); register(new HangingTileLogic("Test:Stones")); - register(new TileData("Test:YellowFlowers")); - register(new TileRenderTransparentSurface("Test:YellowFlowers", getTileTexture("YellowFlowers"))); - register(new HangingTileLogic("Test:YellowFlowers")); + for (String color : new String[] { + "Yellow", + "White", + "Purple", + "Blue" + }) { + + String fullName = color + "Flowers"; + String id = "Test:" + fullName; + + register(new TileData(id)); + register(new TileRenderTransparentSurface(id, getTileTexture(fullName))); + register(new HangingTileLogic(id)); + } register(new TileData("Test:Sand")); register(new TileRenderTransparentSurface("Test:Sand", getTileTexture("Sand"))); @@ -241,6 +253,32 @@ public class TestContent { register(new TileData("Test:TilesSmall")); register(new TileRenderOpaqueSurface("Test:TilesSmall", getTileTexture("TilesSmall"))); register(new HangingTileLogic("Test:TilesSmall")); + + for (String variant : new String[] { + "Low", "Medium", "Tall" + }) { + String fullName = variant + "Grass"; + String id = "Test:" + fullName; + + register(new TileData(id)); + register(new TileRenderHerb(id, getTileTexture(fullName), 6)); + register(new HangingTileLogic(id)); + } + + for (String variant : new String[] { + "Dandelion", "Lavander" + }) { + String fullName = "Tiny" + variant + "Flowers"; + String id = "Test:" + fullName; + + register(new TileData(id)); + register(new TileRenderTinyFlower(id, getTileTexture(fullName), 8, 0.5f)); + register(new HangingTileLogic(id)); + } + + register(new TileData("Test:Bush")); + register(new TileRenderHerb("Test:Bush", getTileTexture("Bush"), 1)); + register(new HangingTileLogic("Test:Bush")); TileDataRegistry.getInstance().values().forEach(PLACEABLE_TILES::add); PLACEABLE_TILES.removeIf(b -> placeableBlacklist.contains(b.getId())); @@ -285,6 +323,7 @@ public class TestContent { i -> isAnythingSelected() && TestPlayerControls.getInstance().isBlockSelected() ) ); + logic.register(ControlLogic.of("Test:PlaceBlock", TestContent::onBlockPlaceReceived)); data.register("Test:PlaceTile", ControlPlaceTileData::new); @@ -442,7 +481,10 @@ public class TestContent { private static void registerMisc() { ChunkIO.registerCodec(new TestChunkCodec()); + ChunkRenderOptimizerRegistry.getInstance().register("Core:SurfaceOptimizer", ChunkRenderOptimizerSurface::new); + ChunkRenderOptimizerRegistry.getInstance().register("Core:SimpleOptimizer", ChunkRenderOptimizerSimple::new); + GravityModelRegistry.getInstance().register("Test:TheGravityModel", TestGravityModel::new); GravityModelRegistry.getInstance().register("Test:PlanetGravityModel", PlanetGravityModel::new); } diff --git a/src/main/java/ru/windcorp/progressia/test/TileRenderHerb.java b/src/main/java/ru/windcorp/progressia/test/TileRenderHerb.java new file mode 100644 index 0000000..866d803 --- /dev/null +++ b/src/main/java/ru/windcorp/progressia/test/TileRenderHerb.java @@ -0,0 +1,89 @@ +/* + * 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 . + */ +package ru.windcorp.progressia.test; + +import glm.mat._4.Mat4; +import glm.vec._3.i.Vec3i; +import ru.windcorp.progressia.client.graphics.texture.Texture; +import ru.windcorp.progressia.client.world.tile.TileRenderCross; +import ru.windcorp.progressia.common.world.DefaultChunkData; +import ru.windcorp.progressia.common.world.rels.RelFace; + +public class TileRenderHerb extends TileRenderCross { + + /* + * Stolen from OpenJDK's Random implementation + * *evil cackling* + */ + private static final long MULTIPLIER = 0x5DEECE66DL; + private static final long ADDEND = 0xBL; + private static final long MASK = (1L << 48) - 1; + private static final double DOUBLE_UNIT = 0x1.0p-53; // 1.0 / (1L << 53) + + private static long permute(long seed) { + return (seed * MULTIPLIER + ADDEND) & MASK; + } + + private static double getDouble(long seed) { + final int mask26bits = (1 << 26) - 1; + final int mask27bits = (1 << 27) - 1; + + int randomBitsX26 = (int) (seed & 0xFFFFFFFF); + int randomBitsX27 = (int) ((seed >>> Integer.SIZE) & 0xFFFFFFFF); + + randomBitsX26 = randomBitsX26 & mask26bits; + randomBitsX27 = randomBitsX27 & mask27bits; + + return (((long) (randomBitsX26) << 27) + randomBitsX27) * DOUBLE_UNIT; + } + + private final int maxCount; + + public TileRenderHerb(String id, Texture texture, int maxCount) { + super(id, texture, true); + this.maxCount = maxCount; + } + + @Override + protected boolean getTransform( + DefaultChunkData chunk, + Vec3i relBlockInChunk, + RelFace blockFace, + int count, + Mat4 output + ) { + + long seed = permute(count ^ getId().hashCode()); + seed = permute(seed + relBlockInChunk.x); + seed = permute(seed + relBlockInChunk.y); + seed = permute(seed + relBlockInChunk.z); + seed = permute(seed + blockFace.getId()); + + float x = (float) getDouble(seed) * 0.8f - 0.4f; + seed = permute(seed); + float y = (float) getDouble(seed) * 0.8f - 0.4f; + seed = permute(seed); + float size = (float) getDouble(seed) * 0.5f + 0.5f; + seed = permute(seed); + double rotation = getDouble(seed) * Math.PI / 8; + + output.identity().translate(x, y, 0).scale(size).rotateZ(rotation); + return (count == 0) || ((count < maxCount) && (seed % 3 != 0)); + } + +} diff --git a/src/main/java/ru/windcorp/progressia/test/TileRenderTinyFlower.java b/src/main/java/ru/windcorp/progressia/test/TileRenderTinyFlower.java new file mode 100644 index 0000000..28985b9 --- /dev/null +++ b/src/main/java/ru/windcorp/progressia/test/TileRenderTinyFlower.java @@ -0,0 +1,48 @@ +/* + * 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 . + */ +package ru.windcorp.progressia.test; + +import glm.mat._4.Mat4; +import glm.vec._3.i.Vec3i; +import ru.windcorp.progressia.client.graphics.texture.Texture; +import ru.windcorp.progressia.common.world.DefaultChunkData; +import ru.windcorp.progressia.common.world.rels.RelFace; + +public class TileRenderTinyFlower extends TileRenderHerb { + + private final float size; + + public TileRenderTinyFlower(String id, Texture texture, int maxCount, float size) { + super(id, texture, maxCount); + this.size = size; + } + + @Override + protected boolean getTransform( + DefaultChunkData chunk, + Vec3i relBlockInChunk, + RelFace blockFace, + int count, + Mat4 output + ) { + boolean result = super.getTransform(chunk, relBlockInChunk, blockFace, count, output); + output.scale(size); + return result; + } + +} diff --git a/src/main/java/ru/windcorp/progressia/test/gen/Fields.java b/src/main/java/ru/windcorp/progressia/test/gen/Fields.java index 86741df..26ccdca 100644 --- a/src/main/java/ru/windcorp/progressia/test/gen/Fields.java +++ b/src/main/java/ru/windcorp/progressia/test/gen/Fields.java @@ -214,6 +214,10 @@ public class Fields { public static Field bias(Field f, double bias) { return tweak(f, 1, 1, bias); } + + public static Field anti(Field f) { + return tweak(f, 1, -1, 1); + } public static Field octaves(Field f, double scaleFactor, double amplitudeFactor, int octaves) { return (x, y) -> { @@ -221,14 +225,16 @@ public class Fields { double scale = 1; double amplitude = 1; + double cumulativeAmplitude = 0; for (int i = 0; i < octaves; ++i) { result += f.compute(x * scale, y * scale) * amplitude; + cumulativeAmplitude += amplitude; scale *= scaleFactor; amplitude /= amplitudeFactor; } - return result; + return result / cumulativeAmplitude; }; } diff --git a/src/main/java/ru/windcorp/progressia/test/gen/TestFlowerFeature.java b/src/main/java/ru/windcorp/progressia/test/gen/TestFlowerFeature.java new file mode 100644 index 0000000..33460a1 --- /dev/null +++ b/src/main/java/ru/windcorp/progressia/test/gen/TestFlowerFeature.java @@ -0,0 +1,95 @@ +/* + * 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 . + */ +package ru.windcorp.progressia.test.gen; + +import java.util.Set; +import java.util.function.Function; + +import com.google.common.collect.ImmutableSet; + +import ru.windcorp.progressia.common.world.rels.RelFace; +import ru.windcorp.progressia.common.world.tile.TileData; +import ru.windcorp.progressia.common.world.tile.TileDataRegistry; +import ru.windcorp.progressia.server.world.generation.surface.SurfaceFloatField; +import ru.windcorp.progressia.server.world.generation.surface.SurfaceTopLayerFeature; +import ru.windcorp.progressia.server.world.generation.surface.context.SurfaceBlockContext; +import ru.windcorp.progressia.test.TestContent; + +public class TestFlowerFeature extends SurfaceTopLayerFeature { + + private static class FlowerGenerator { + private final TileData tile; + private final SurfaceFloatField floweriness; + + public FlowerGenerator(TileData tile, Function flowerinessGenerator) { + this.tile = tile; + this.floweriness = flowerinessGenerator.apply(tile.getName()); + } + + public void generate(SurfaceBlockContext context) { + if (context.getRandom().nextDouble() < floweriness.get(context)) { + context.addTile(RelFace.UP, tile); + } + } + } + + private final Set soilWhitelist; + { + ImmutableSet.Builder b = ImmutableSet.builder(); + b.add("Test:Dirt", "Test:Stone"); + TestContent.ROCKS.getRocks().forEach(rock -> rock.getBlocks().forEach(block -> b.add(block.getId()))); + soilWhitelist = b.build(); + } + + private final FlowerGenerator[] flowers; + + public TestFlowerFeature(String id, Function flowerinessGenerator) { + super(id); + + this.flowers = TileDataRegistry.getInstance().values().stream() + .filter(tile -> tile.getName().endsWith("Flowers")) + .map(tile -> new FlowerGenerator(tile, flowerinessGenerator)) + .toArray(FlowerGenerator[]::new); + } + + @Override + protected void processTopBlock(SurfaceBlockContext context) { + if (context.getLocation().z < 0) { + return; + } + if (!soilWhitelist.contains(context.getBlock().getId())) { + return; + } + + if (!context.pushRelative(RelFace.UP).logic().getBlock().isTransparent()) { + context.pop(); + return; + } + context.pop(); + + for (FlowerGenerator flower : flowers) { + flower.generate(context); + } + } + + @Override + protected boolean isSolid(SurfaceBlockContext context) { + return context.logic().getBlock().isSolid(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 cc1ff8b..9837831 100644 --- a/src/main/java/ru/windcorp/progressia/test/gen/TestGenerationConfig.java +++ b/src/main/java/ru/windcorp/progressia/test/gen/TestGenerationConfig.java @@ -76,7 +76,7 @@ public class TestGenerationConfig { BlockData dirt = BlockDataRegistry.getInstance().get("Test:Dirt"); BlockData air = BlockDataRegistry.getInstance().get("Test:Air"); - SurfaceFloatField cliffs = FIELDS.get("Test:CliffSelector"); + SurfaceFloatField cliffs = FIELDS.get("Test:Cliff"); WorleyProceduralNoise.Builder builder = WorleyProceduralNoise.builder(); TestContent.ROCKS.getRocks().forEach(rock -> { @@ -108,21 +108,32 @@ public class TestGenerationConfig { private static void registerFeatures(List features) { SurfaceFloatField forestiness = FIELDS.register( - "Test:Forestiness", + "Test:Forest", () -> squash(scale(FIELDS.primitive(), 200), 5) ); - - SurfaceFloatField floweriness = FIELDS.register( - "Test:Floweriness", + + SurfaceFloatField grassiness = FIELDS.register( + "Test:Grass", f -> multiply( - scale(octaves(FIELDS.primitive(), 2, 2), 40), - tweak(FIELDS.get("Test:Forestiness", f), 1, -1, 1.1) + tweak(octaves(FIELDS.primitive(), 2, 2), 40, 0.5, 1.2), + squash(tweak(FIELDS.get("Test:Forest", f), 1, -0.7, 1), 10), + anti(squash(FIELDS.get("Test:Cliff", f), 10)) + ) + ); + + Function floweriness = flowerName -> FIELDS.register( + "Test:Flower" + flowerName, + f -> multiply( + selectPositive(squash(scale(octaves(FIELDS.primitive(), 2, 3), 100), 2), 1, 0.5), + tweak(FIELDS.get("Test:Forest", f), 1, -1, 1.1), + anti(squash(FIELDS.get("Test:Cliff", f), 10)) ) ); features.add(new TestBushFeature("Test:BushFeature", forestiness)); features.add(new TestTreeFeature("Test:TreeFeature", forestiness)); - features.add(new TestGrassFeature("Test:GrassFeature", FIELDS.get("Test:CliffSelector"), floweriness)); + features.add(new TestGrassFeature("Test:GrassFeature", grassiness)); + features.add(new TestFlowerFeature("Test:FlowerFeature", floweriness)); } } 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 d1d73e5..ca36cee 100644 --- a/src/main/java/ru/windcorp/progressia/test/gen/TestGrassFeature.java +++ b/src/main/java/ru/windcorp/progressia/test/gen/TestGrassFeature.java @@ -23,40 +23,47 @@ import java.util.Set; import com.google.common.collect.ImmutableList; 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.rels.RelFace; import ru.windcorp.progressia.common.world.tile.TileData; import ru.windcorp.progressia.common.world.tile.TileDataRegistry; import ru.windcorp.progressia.server.world.generation.surface.SurfaceFloatField; import ru.windcorp.progressia.server.world.generation.surface.SurfaceTopLayerFeature; import ru.windcorp.progressia.server.world.generation.surface.context.SurfaceBlockContext; +import ru.windcorp.progressia.test.TestContent; public class TestGrassFeature extends SurfaceTopLayerFeature { - - private static final Set WHITELIST = ImmutableSet.of( - "Test:Dirt", - "Test:Stone", - "Test:GraniteMonolith", - "Test:GraniteCracked", - "Test:GraniteGravel" - ); - + + private final Set soilWhitelist; + { + ImmutableSet.Builder b = ImmutableSet.builder(); + b.add("Test:Dirt", "Test:Stone"); + TestContent.ROCKS.getRocks().forEach(rock -> rock.getBlocks().forEach(block -> b.add(block.getId()))); + soilWhitelist = b.build(); + } + private final SurfaceFloatField grassiness; - private final SurfaceFloatField floweriness; - private final double scatterDensity = 1.0 / (3*3); - + private final double scatterDensity = 1.0 / (3 * 3); + private final TileData grass = TileDataRegistry.getInstance().get("Test:Grass"); - private final List flowers = ImmutableList.of( - TileDataRegistry.getInstance().get("Test:YellowFlowers") - ); + + private final FloatRangeMap grasses = 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")); + } + private final List scatter = ImmutableList.of( TileDataRegistry.getInstance().get("Test:Stones"), - TileDataRegistry.getInstance().get("Test:Sand") + TileDataRegistry.getInstance().get("Test:Sand"), + TileDataRegistry.getInstance().get("Test:Bush") ); - public TestGrassFeature(String id, SurfaceFloatField grassiness, SurfaceFloatField floweriness) { + public TestGrassFeature(String id, SurfaceFloatField grassiness) { super(id); this.grassiness = grassiness; - this.floweriness = floweriness; } @Override @@ -64,26 +71,22 @@ public class TestGrassFeature extends SurfaceTopLayerFeature { if (context.getLocation().z < 0) { return; } - if (!WHITELIST.contains(context.getBlock().getId())) { + if (!soilWhitelist.contains(context.getBlock().getId())) { return; } - + if (!context.pushRelative(RelFace.UP).logic().getBlock().isTransparent()) { context.pop(); return; } context.pop(); - + double grassiness = this.grassiness.get(context); - if (grassiness < 0.2) { - growGrass(context); + if (grassiness > 0.1) { + growGrass(context, grassiness); } - + placeScatter(context); - - if (grassiness < 0.2) { - growFlowers(context); - } } private void placeScatter(SurfaceBlockContext context) { @@ -93,24 +96,25 @@ public class TestGrassFeature extends SurfaceTopLayerFeature { } } - private void growGrass(SurfaceBlockContext context) { + private void growGrass(SurfaceBlockContext context, double grassiness) { for (RelFace face : RelFace.getFaces()) { - if (face == RelFace.DOWN) continue; - + if (face == RelFace.DOWN) + continue; + if (context.pushRelative(face).logic().getBlock().isTransparent()) { context.pop(); context.addTile(face, grass); } else { context.pop(); } - - } - } - private void growFlowers(SurfaceBlockContext context) { - if (context.getRandom().nextDouble() < floweriness.get(context)) { - TileData tile = pickRandom(context, flowers); - context.addTile(RelFace.UP, tile); + } + + if (context.getRandom().nextDouble() < grassiness) { + TileData herbGrass = grasses.get((float) grassiness); + if (herbGrass != null) { + context.addTile(RelFace.UP, herbGrass); + } } } diff --git a/src/main/java/ru/windcorp/progressia/test/gen/TestHeightMap.java b/src/main/java/ru/windcorp/progressia/test/gen/TestHeightMap.java index c09aec1..24a0e5c 100644 --- a/src/main/java/ru/windcorp/progressia/test/gen/TestHeightMap.java +++ b/src/main/java/ru/windcorp/progressia/test/gen/TestHeightMap.java @@ -54,9 +54,9 @@ public class TestHeightMap implements SurfaceFloatField { tweak(octaves(fields.primitive(), 2, 3), 50, 0.2) ); - fields.register("Test:CliffSelector", face, multiply( + fields.register("Test:Cliff", face, multiply( shoreCliffSelector, - bias(select(shoreCliffs, 0, 0.07), 0) + select(shoreCliffs, 0, 0.07) )); fields.register("Test:Height", face, cutoff(add( diff --git a/src/main/resources/assets/textures/blocks/LogSide.png b/src/main/resources/assets/textures/blocks/LogSide.png index e1765194e0d963a41a9b2d3e17833ba0419ff224..c4d7ca131bdc161b74b008a50af90757723adc76 100644 GIT binary patch delta 7179 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 N002ovPDHLkV1i01tttQj delta 1889 zcmV-n2cGz?IIItlBYy#eX+uL$Nkc;*aB^>EX>4Tx04R}tkv&MmP!xqvQ>9WWf)){R z$WWauh>AE$6^me@v=v%)FnQ@8G-*guTpR`0f`dPcRRD%0G~)a$8^IY-XNaYv~yF6ykH@af2>M{K$3L|nWrS;tqs!_g>by?xO#aXS?SnHnrg`vE*lIA+C5yY{C1d2eE>2vtK}Qu;1C!qQueyXyAgXj=k{+;YkofrDsp~RsK)q{ zH5MNU0SXct3YXfAo|9b`D1VkoL_t(Y$32x>a~n4jMh_Yoa5x%?nYl4ZrDWr`XOF&JF-VO)L&sv7vZ&uR6q-_CN331c)zvzq06!Jijb z#F)@pcz%9{_nuGd4Jl>{qgl?Ugb>*7TSN(c2%H?v@!qrkc1K|hDSst?fBhQqePA)0 z;<}FeW{(d6TNtz!PUcfY1Q9_iA%s9oi4YQ1RnhkW*LgySl*V$pTr#a|QcC2U*)}_5 zKCRgw4pe2y)AKW|F(@Sf)K$f(C;E zm^hx#k$rpMzS(o=Jbxi1%F>c^=6E{g{q+s=x<(iZE@o3wO0;c@HHH`?B7!lRlcNPG zCHff1Kw%93{^P$$-v>svfSj4uH7*1?@A=j=#1v`T7F!x(OoR{+r4WX=LWrcCAcFwL z7~Z^kL5PtMhhLkj8sqz($!Nswc8iFR$@sp<76o-ZA*IY{WPgb(DDB2nv@b%Ii~A8t#iyLH6kMHnjIp-+lxz#5kx8a5b(a|x7R-t zQ^Iu~=RI{@@t~eCpH_$neTZlgL=^Msl(HOw8X~Kz66w6>uZwE{LLb;QEq#m_ZJ1PJ z8rSl8wFF>fG=F`(WZxbT5kepEp(l~)x}MGLmZohWXMe0IhM}m+l99EHtYx{FQQDGb zzsGeQt#cSLRO1qb;-CL`gS7>(etJx0OSI8U>j_3{PEU>i*xog~d~#0bJq(ZvN-4be zkP_eS?|Cqppilrf=V=ZtDJR~2yukY&=RL-n0lq#^7{j!#u-35twk3o>N|}@ba&R3Y z3avGpU4KL8Jz8s&Vi?n^WV_pAjNxW|OU{{_^@d$DM3Gabb&g%ra&_~ClrtZ$Zzu{) zX-g!;p_(y_{C^UyHS!&x7tfyX^mIjx5v?`8@2SQm z&mTYHe&6DKKx@sr%L`;=Et6`DF^13UTUN_sVvKa&^W@=*vMkwbw*c6};QOAd>l>W+ z6h%Sb_ZXvxb8AUCp^f0Wj)zCf0W{wSa?bRj=l#_+o%bvkGZJY~g9x4XgqVmaQCAh` zXMd-VhiDInVdAVYh*Gqz8`MEU+QR|oI+Rj8d;I8!AqC;)>o=@5I3F07CFD$uk+&Z& z*)=V*2NT+ZLqt(m6;0cswPsR{0R~l!MCWj!b5Ce9US!z;fR-eE9Sk$T;UPMl-Sn zg*F_`W@xQBTbM#C4w4Vu2W~Nhzap#yQW?Y|8oRikvfLS#tIF z8Zy-7h!7+9`-bP|XZ+{ScLt|1})&dHp1Y?A=lVeuPB{3zsuE&^R>j8|*5zcweAD$ozHRN^smBMI@ z5o}Q)B9x;Mug=f$Az;M7_eJD=0N{`Recx*afA@J$TW{6EGMe7`b zusU8qg8kuusKG^bU15yj(`L=%)i#pC818oWw9XMz;`8Q~aXF%@N^aI0-hTLqa~`D> bWm)on@?SY-!Vx*c00000NkvXXu0mjf1*Vgz diff --git a/src/main/resources/assets/textures/blocks/LogTop.png b/src/main/resources/assets/textures/blocks/LogTop.png index 44d89fb80d4d222cd8a40aabd94573295ae01d87..fb61de591b093117c175c363f463e61dfa1db4ab 100644 GIT binary patch delta 8221 zcmV+&AmZQi4Yxp$BYzszdQ@0+Qek%>aB^>EX>4U6ba`-PAZ2)IW&i+q+O3;ulI^&1 zr2k_Ty#!(gmV?nuJJ9m`bAab$X1ynw+FCcQa^N9BAO?4j0LrZY{Euz^5C2m2#e|qk zswqAE3pG^N_@zAeUpwFJ6VCVh$LBNq_qzFh;JD=Z>F=KAZp?|zr{q+0UtC5-p}{eFJTz<);H zg3m6+WOLwqa8J&u@_TVl$k=UaqIp$xoKMUU- zpZ{EW_#XT&LGD{lEWi=H@f?*X4g)`u)xR7uSDz+8l#^KJfqWQ2PG- zx7Tg_xo&>D^!V-9n^XF}`Ooz>KgRg+ocXwK?^*UD<7T!*H?SjOqq1 zwYZcoyIuCxPu%YOARIhb-FGhbytba#4N`1A(-uQ?SO&9-lmDMD^FO(1ZzYtqPx;!4 zc{ybovykVkHIL;sJYx52)OZa1`TFNS`PJjWc+6Z_V0*eo!2LbipWyPx(ViP4KW_rt zJl_E@5q~p?OvZXV@FeS_P4>yonQSeFEI6n!b?1ZYxW&fkCX;l*`-F4I0^ZFt*`8Zn zboVkqh$Es;#%Fv}eZyHHMB*ohLJYO&V~8=Pm}7}Gw&asCETx=;s4e>(a?B~`Tyo9L z6kkG#C6!!Csijp{J%}4C`B+P>wKZPa7`gFu<9~+My6e7&9((G!mtK1t&I~`oh$D?W z%BZ7FH~l1!XPSAIS!Y{z5lSnpxYEk2th(AJ)VAMY$DMZGWmmJ?*K4m^|K;od!E5&Q znmeA-jrr>}uIBt1!U|5Je1^wdusA%+1J)bo|i#lu;i~_Tl>aY$lSn zUz2ssCxH^0}80Tqz@44q&pGZee}Tu6$-1&3)N;f2~okO8e z{n~li(0c)7p+BsfH);X|OAGpIRThF{D>fT;ZQ`}d12v3crnA{GXYgeZ@T@enGJo(~ zS%g|&c(+L><>+lc_FPax$Gc8%5to2Cv6|R(aJlv9`x*nkPT8i_5N&B95HNMvoyVT8 zjTm!JD+N5yBR!BUHSi$ZpIh6D*M%_LoB=!Gx3Mj89dpHKWfS8h6Y(}%soRlcHrBk- z=$nO1-}6k>Ozd3t)Q@NEP%_WT>VG!6#UER^fG_wN$JpE3*mrzp4}<0L{_LYhm}X+o zv19Q+0}M>QdXEu?BwGW)*rGrp{m6B=aXxL;SSpS*UfHmBiGc@7&3?~a`u68h zl89MPUhAI~^n-i)pL+s%^sH4);Rc+w5)*Sh{<- z*&ScAijjA%Tr`a!@@wq{u}nM0@D+beNs4TLzj@i_=ST$Gi1%5^lG=F8)$PrhbHdIo z!~tz>KO#B*zL~#gWgsGz%o#F4Mz`6$+Q3(Yz~|j)$laMe- zi?QMR2@*D;=Sn*$o-LR=>TZlPLfmEo^4xdUy?P}=lFZhIq~YVHuJK{Spb*tuVw8fQqmO#si2m3>1Cd z8GUrFVWEkPilfU%7@xtX6BdV(b_!uVq}C!p3aM8WC3o?o#u>ohY}VoiMur;ZcXRko#eDON5jMDJjGqgrXpd@D5Gl+}T z%)1ERfl_#&VN_47pk970nol;O=huYVU@1%|A}ofMYe@Xh6efb80t1aGMEr288v@r8 zu04(V`fK`{pnnJlj6odN0nyCk+vd9@&=M-23MpeNAOO-smcSKg9FK9yqCvLyasqn_ z>0o3~dm18TN;~cu3t0{?ERS>C1m=GOm>0cP@>U!UeWWf;hFu2n5p6KdQKqh^;zxi4 zE`@g(dbyPPL_3zBsAeW$b!!vt21cQ5&!TsfnT=WjAb&gxPl2CM5FPB<&0?CqiOj(S z?C!V*=|!IU3_5inrsERwq_mPUvL@=Si)_eKJcF^)(j9oqA}_HiWT!t0EW+q zlZ+^MM}LT1h&Dgn*3?@b1JIA(;TM#lcvyroquOrBu2edj_C|}9Ai*|*iKj;76u0AP zl-ChLAZ{YGVhKoVjiSg<4 z3K=iK1MCrv4m}?w?V%e4)Vc0@AfrJPN{EURh>JtfNSU0fry_wzi7BEN+h-Es1U@K? z5L_oG{z(JbphO8prb@ze6b?dT)D!eOYJ5yEO6$6w$QsI7VpjrEIS{&-i~RFYcE^c< zX@3!ClN77Z1T@^-`8oOw7p6cYlEJ9Ih96si5rvpihBw5~oMwUMVA?<~gZW{#N6>aG z1OY=eX&y{(V9e(Alr)gI>SRWl{c9_OET+(lzIFR46S6YFPf=^6+L@_S5TdE6!3hwA zHma?7l|G5|ZPuZui-{jhFn_24j9M`*5e?W2N#Ijq z_ykBG7gq(U#OomjPpy6G4JW)eC@RB90$!cThC=ug#bQYtBvBBB9~t!zjdFDd6|YXB%Y%B zP+wnuDmMJ-SAV=D5R?8D$+Nz7A(E^uT#Kv$ARdPAQis?O%^FU=LUMdYRh{rRqOcY) zfVX%D7)}v<6m+8j1ve=FOa@TFNPpN;0ar|h`g7zbvJz#h*c#;WSQr(Fs<{y$n%m`s z$>L)-aE>a6{Ir7x6^y_ZkK`kICf1p+a^mL;1P)VKrgS zByUS%9h5?s$u5yKCxm{y0e`Jo1NFvZ*5K5Va9s54GSmmqInrB1O%FAjOlwzkl~Gwd0*F3M6*x zPRLpkhNr3v9=$P};eCV%&@~Ts4Jt$`iP#YAe$BDRsR?2@>9C}AmCn(A)PGDUjQD_% ze?SA6f*lvrv_HnKY58P<@=H9Q^@Br{DF~z`(-=TS-69wmSZ!4D!$Ob(QUYI;gg*MT zlElEZ_Oa}EG#r?U@qfVzLf!Q8n!zU7-x>Ch1AM@&BzzN5H-P{w|+6S%Y)Dyj>*1L@|i5&(^65NXmOMCzC) zf)%e`@!b?J)a(7cqLy2L#w)!}PYUx^s-8v0d*doKpvPc<<9{rEu3Cs9)I751gAoUZ zx)d4o0(7}Pn5+{crxr>haw1js66O`Lls|-wFz1bwRY9FS-HlD=>6ei#JvsN6_ccsN zMv<1En*b#s^n5tl=#I_R^O@9y#DAiwNN5QE&4FBppu8ATAxPcFi&puNAy}8zX`?AN zC;Fg|pqe$;pMUZIC5g4RDoQ*A9g!lScS)%ID&#-|AuCZQB?cJ4F%HNBK*5+=TOKRi zwv~TV!Gonn8h=qS{a5U8$f3XlzyQd-wT%Q7&ecR+Oy`Ku8cg)gmNen`y2w+t4H6>} z{1G%@X{szqY@{dBLqIb>W)=ycL=so1*V=C?)*@J`N`Jtun>DdG7eRp-4*QQ2uI7?& zEug>5jrf_M+kr4-s>Bc`=|>?^gn+5}v(?uVIpGHv zaNm_!OPHV$;K;7jWb{o1f7V2B-P?)k1)0Y=+S%|`x0nJP@*|V@KrIc$2Gs6d=x_zg zepJ`sV}B4es}UrcGCSf5m*{yywSCbSDZa@(VAgjt(G=X?>Vi)6B3>IbEo zI?zXCAXm^Q8#$$>%NR#zz;{FF57grEUmrwO0)ObC0VJc=)CVB!sAU?m7G2n>y$||B zi4|K222R{_3)e7y=?^Q#Pq2Pyzd zM6h&(eUYfCr0xHd`XF=rMTh3{p&%b{54V?xI^zD;siV)eXc6V=ilBa$RJQ={XGjEJ z8h?hsK!Ck3N0h8}Bvu5zp#wD#AZ)bu*wVj}>JCw9ExMB=NMK($5M+)j5{ZsNo=_oC zRXMoC`9=8wXu5g&tn-3jy_OQD8J2D(40!QUpyLAV3F01UqyoUmO_U=VKd%SkT92%&@>FVS)ZDp1@tFkqkmc2 z?FiQAD}SCxiRctQ)M)r?|0o);fXWZwP$t)Z?oXI^gMvz4Ju~70pJ-c8K8oWg^tXLw zsg194V_osfTco4hYM5~w5Q$plgv05uMh34I7m|UeM18TQT&zJ=q^am7XFHUVRGOIy zd-xY`oR7EHPrY+lR)`?ioJu`kH~QnU!vpU(|6HP>UbwFys2GN0@Fh61NL!SAYE%08YL^ zicR(Wx12w9X+Il~2hfoKcKVNu%?7ppm7QO{)vnKqAhbt;qi8MO0~z{hFB1pdu1_yd zatOAj7J+d3xC*9|cf=DqNjqHr${SJ)!@U9MB&D^1kqX>s)#eew4p_t^OtyBP>&`(< zPzPVDjq92sXre#W5W#_i#edyRI|wbD7(3qx7vjI)ICmW>>ns2;#nb({aKri@75;D;Gtf*9kjQ9X2cQ;pcc@m zFZ%XQNu-POntK0THuzx`?XWhLZzv`1_uLQ&d*vZ-{D0jo5jOp5@}Fis zD`1Lm3*HE{hPnk-+fE8&F1+2Nu7-}~P5JlJXRAW3eoRS`@wVd4?Zq#6m}+BCi7?jb z<8*DQp-u_y1)o1bTS`@>Tsa?~PI}#+R=K%ggLdPwpG9h$M{wm-d8-NF$%6XSZgY4$ zIzL?q@~|h2Eb7oeFC))b$H|${&b`Bnv=8K|uxkB<-m;^J$Es z%Mq~q(ayzGv*vVsG`EXT?H57`@hQr5Lj@xZzsMWo@+L_tanTOgIm-x33yLS`8S@oj=NR)UVo0v+9!ymg!;D@HdFxh z2l{=MXw%ki8rl~9)V0^5YDwTE_app>xC*XCUri0iDzH+Wb-#TxRJw59W*f1oS}C3h z>!_raOVC!8BH{Fh`lD^@T+L7KeT}nEbNbg;M)aj!$9_SsdNcpQ*MG0~D?HwTw&M6A2Tbqqa-Av_v3L>CI$AQoeWPlackrKBzj|M8U#!kX( zG>}1!GUlY?Y<5L+Bzy%N6T}buV`xOMU;kE`Yd^%3r+-fMgy2U7B4t}RTRwmD<_O5} z-6fI;7$9U(p%H+fd}5a>X4pUd8gukb9k3?kiE`Vno#Ucb;!d9s9hE$%dQ5!R?mn;t zn{3DtGbJ@R@tZ*%^2C#LMCfIT`J*OO4iztwgvNmXf=GQ8*b$w6Q5aFEud}_XEm(?b zYLhZV@qg*INF{oQP6%NIVw7xiMLoQ%12aT48HhV{97H_>bGHb(jldTiB(RStt?JZ2 zN*5&0p@vcVMM)@?h$-{+z2s$Z(fr=C1dgV5XI^kSr*0WKw`y#J1MG@TXsP5s7upyxL)_-z=IGzsqvx@23OozMnX{W#Ag-D&y z9w3T3MMoG(tbI3mDcNxwUUt|`dEK;KoxBm@ot@OFO-RJi!DNVc{@VQ3_M`={|FLtN zYJVH7zL}<@Hvn7y_1Mbj>!R_z9G1>oax4WRmYg*@st+zUUL)lYZ z{C|Z}$Sa{o()oyD)ewR*PCk&VhNY0mpxD9ub<1DW)bF}g&A{})edty6mu&WF?R(hP zRmw=?eh$PqDj;fE9UJi3O5K#gh=_-@!SQ@5q9CFZ``Yo zc$$#??N0O>r}WjIR(Ss$Xz<+vL50XZ^?#4`V4+ai+bb^w>4>g?j*ea@r+n6i){++c zgOe^}A!L~~cRNua_HHLS_3Bc#?|$fu-d(#S+H;%l9_l=ahy-`{HnSge=TKev?ut?h z<(D4Yc}8a#er;$-WyT0(Gn}4dS zD5PQw)pc2-m!Zu9@~7(P`MbLc_LFKpeW)Y4&(^i}_~N-sd~vpQ@ASE?OK^O6O?#o| zOy5~a5Q$Ml`nx$T_+p~hyxJ0g@V}=$&frda#^z^qu7T?I{@G4>sCFunV-PV^6l(?h z#7x-7MUY@Ew2IJ83~Gi;hYC*5MSr`pt&Ve8;0UmVF&<+3N}In8`=+Kp^2R$1lg!YT zEc33%lJ~fow$;k~1-gKo)yarKZFEm4d=BJ%kK>U2V5=iN5@rjdQb{6D(Ddkjah^D> zpMy<5SZlFn8t33((AfxOjX7zvxUr|iOL)PHnL5Z5b?i}9vRhrO0UVRK7Jn1^X7ABP z3fx)4UPA=*G_?N)aCudhTCw{C*sB7QedEfnhY)VP>j z6NEdo11?+KsS3`8Q$Lpq+@I_i$b!~{CtKxDB3;r_=MS7_J+ECTrGR-Lr|bCTK5cUV zu|H%ow;LPPJn8k1Il~$1sDH<-lWXq@B~LNogaCZ$U<2c3?Ud=A=I5o_1IuZ39bZ}Y zyHrw#IfK`dsjS;;Vmh$nKKEz^(|q3RzVC%{-u0gIR-o!ovx8sI^6H({1)RM0!XR>O zCLk+OcE*3hRNrJpoAp)NR|?UO2ZE7rq3HxO7}ne>7S4whXCs3PR7-zsC5~~Imj2CIo*2~ zY(DD9Q_LT+r?!4Mg3VHZkzFWcs#P^yd(SJvZO2BGvq`%I)wm>`dCO`2-z;5wTu!GE z9QGyoRjbyD(KgVF`hO$d;kZNjzt7yEAp<2m#ecD|Cfuy;UlP%$yJLLHCFMNwn*we% z6{=1R`D&wfg5R3noL$(EwZDOJ!*XSNWYROeK;-rbC$)b5Zk4)_9}sMjxRY7ELdZ}^ zA%L_EfE6sx)W`95zR$te@8JVXkx70Yw$MwA7sR%|pO@FI!$P8D!2E1`r2HQIo zd4cEUG~By|7OQsRXV7e?<>xhaW6TX9T@WiAD0Kq zlLl%D%8{hKtrfIl&sHnq7|g3Iu!E=PnbIu>l_m2o@3mDUwf&VUyVbD1XpN zL_t(I%PrB%k{m}B0MMKFky($fn(3Yy$(Ag_5wamz-~|glfZ#v)S@r~h2_OPvBy5eO znV#uKRp;wwCL7K#9P`KDe^*MimSargX4I^u6e7|FMfK%&uC=VG#29NSWGx{3PuuO5 z(6rVZ0q<^h`@`W6zxxd{8Dm()UoJ=(V?tvP>2y9_Utgm!06Y6{(W<59tU2p+eSa&$Ip>GR#~7ml5D^g}L~HHP55Q8iun-PIe|K}+cb$1W zAe!Cv^$$ONOeu}yXs!M5@UN6oGcff1`_E67<+fI5ZELM_?sB$(3Ne27tG6+R)*w3E47YCB9G)I{JN@UwXQmm6#$hC}U_269B7Y7(gb)otiYdgH zQ?kxZ(-c#DcmHUNc|IJjudV=~*82K(8&a&TdhgH6ImQh@+YG(G1YQeto$H73`S2vf z&&T69j_b0}i>tffBCJ(RaM{L?^$@a-3m*}u>tr?=({fZXbf;KoK?NQwARMW zxScxH(g0G*F-EQBFMr?v&5Hf% zb)9qbJUeSkEv1&@=@fjZt<_S`%MwB~#?)H1sI_8+SyT1~#df8X)*65zB4N=|&gb*S z;R2o34gPX0gdT8x2&Jy)D8V` zzdsU@wbnU@h@})^i7{Ght+l7azSb(j*{|GpoguPT$k5eh&P8i1L~O0>2yfzsQy z?nPu-7S}l>M1P{?ybxhj<#k!T55^c`&YB5FH0JA9cgz$+wC;`&&+B5vI%gMw7!nb7 z*2Sl@@YOuehj*V_YfRSNbS~$dbMCtSi&t-+_n%Wr%v@TnwdS1AVAiavR_xf1DJL*s zjLE71Ktx6hpPrw0yX~ttUmy0Lj(-2wzyBlWTx(@!Fn=%(V~S~>=l#=u+DuO$??t4x zN`{DOy51f356AO@L@dIkmY?7MXvN-LjUt><9)>>nU=UT6Hyt9*uU{B28;3+_ty5J1 zI3M=bO5gWFh}PNTXzERQ}sqn|epTef#Bk zId6vXYIF_Ex~_NItFd$1004*)0Yt?65VH~?5uu2d7A}|D?ZnU;fHw0#V)q`ie0W5( P00000NkvXXu0mjf9vv`| delta 1728 zcmV;x20!_?K=TcdBYy#eX+uL$Nkc;*aB^>EX>4Tx04R}tkv&MmP!xqvQ>9WWf)){R z$WWauh>AE$6^me@v=v%)FnQ@8G-*guTpR`0f`dPcRRD%0G~)a$8^IY-XNaYv~yF6ykH@af2>M{K$3L|nWrS;tqs!_g>by?xO#aXS?SnHnrg`vE*lIA+C5yY{C1d2eE>2vtK}Qu;1C!qQueyXyE%J0=k{+;YkofrDsp~RsK)pJ z000SaNLh0L04^f{04^f|c%?sf00007bV*G`2ju|@5(_bP2uG@uDjO(&-AP12R5;5e z)X8pSNfm(MI739-DMzPW?yl~l8iAN376=Jmf;BJ89>lU2AX-#4^kAxN=itnn_r`Ee z1dDow|C4_B^B=xaEzWU>X)*LUi>eZlR3jpw5pmhrVz3sSV@g?oXf^bUzE3&TTGyT9 z+nepv@${!Z{)U+Vz*?TB83{v72tY`u^Le{jBY-i6m_mr96e2365Mr%&fBWaRsS>`N zFNf31I8CZ*tu3X-lvGRKwg6y^`TW(Ls)m@DIHgQP&bus9N{KmtRa3olPp20?PoZs^ zT5H#}-~8|~gk+gRIst&SHipzRu9PaG-j5+9Vq~P4GBf`2&1aYK`r&vXBwj6sqOw^n zFXJ`E{PupMqHVh+#8RsMjnrRN+Sy6re;c&i;Y^iG+wv1V%*81Ovhb$tc zfPpDQl_FYlmYijOyIwoXDd&$*&ml$tW39E;5~BC6Z#!TsqU;F!uD!q6b!`JrFNm<) ztpD}>$C%R4ciy@09#1Ld3Z`${!^fjzex;@HuGZRkf1RfBdPP%tx9kpMK*Fqoh=>$( znnV2kuYMY0sMQ3Ii+}m{RiI zt(HSb@!i870QSezcD*vjlv3X8)^m)dlxdpJ<2c2kn!4=TX$m|lw2kk&ZhtyD=Kbkq z(f60}O0PEFxi5Fi-~Hn49HWT5f7n~cyY0qV8*{A2OxMu0O_(Eq;m&dvndZ5cIt=~I z(o5EAOiDR_#3)7o`t>*7*|+ywV#+zkn7nsLz%(+GYSB^*7#!!Bm@KokcA96)3;#QjtF4c@nSK5oUhaVcygAf5D=hg{Q3GA7ERx_ zKRlm_$UED3kBA~_*@h6Eciy?f>7-h$$4-Cb~|uV^%4MI87nt+<0%9jWLKoL|SycT!?%EL1RpbHUgGKN%Knr?RD{?1P(pwOP)M@GHKN2hKQ}iuuY|$5C^fMpHASI3 zvm`^o-P1Q9ypd0wfq~J})5S5wYVFCHdwSB7M9J@IV+AuseVO$)V6`#CD=KB<%uzmM)n9^lt z#7@e$%1{kfkt@HnF`55qj^|3#WfOhe{Y4XmzfGTYyTY|?=c09SN>PvU&h6Qb`9v_7m2R7&zQv==+1c`#`k!$sfyF4pnI z@@3&CTsFP`wPao@M`Phs=OzXQm-Rfq)h>OP@!TAw7pVM4SpW8hKaouZA{VY}2sC$; zFDjpKM8vaKLSa(P@e}JapFYVKW7*8mHGl12R%!L4 Vkr{i8+JGU?;OXk;vd$@?2>|EyyqW+2 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/textures/tiles/Bush.png b/src/main/resources/assets/textures/tiles/Bush.png new file mode 100644 index 0000000000000000000000000000000000000000..0922df3d30e45d70d47fbd758e127dc49663d326 GIT binary patch literal 2015 zcmV<52O#)~P)rLI|>fmta1PV2W&}1 zK~zY`CDi$EoAm*};m`NAU%$SO*iLNh*g2f$B5Bf+bhLp+2vo*|1QLT)n>I0t{WNJ3 zLxX95z@$yu#H48xsu0t}5aQ6L9h74*NUIW>W@!?VG|u5%b{yMDe7&|`AMbwH^G7^l z=F871t=&TDA7somMb%y7v!xY+$rwTV3cd~>uYdh#e)__1nZNr5szcJHLrH{2JhTxe zvva~xDai*Pe85HjWt`_N{Qjd4dF$nuxju6Pq3b%IX7;)D+MkF-BE;iyLZJ{IkB6aw zVX9gMm&?WKy}PtJ4EkyIn1#hv`UiR#?>Hw!Mqz({58tSZbFIrb9)jOp`vc~%%;@8n zFaoqr>r72eF*i3y(o$fgYk;wyaT1MfegDpZD46qlPk#?nk&EIcH}vuG5q#}lqINIq zmIBef`-rtafVHi~*MI?qPCZEZ-${(6g;f?mTjNJBJcgy>=JAL`U27tQAeYKgEEegC z_)$+3=CkuWICfFowa)7uwgEAlp3w(f6JmC*jC1UDOy;Zn^OHC6X$D3|M+t>Oh*w{H ziMB^C;;b7O8X6)Ni}CjD>qJc>Y@d9tYxNe$TXy$icIGxZ3eNejVpFVb^Adx^)wJv5t5VzC(Sz4snId7loa#&l#-gd+i3 zh6?3en$9jScEwA%ROTpiL_s;!lhqA<;OsC%Q%_SW6zLo|$F+B_>6InH%xycyg@pyS zH@6rZ9wMpgT)A?Exl$ZMeu*zn8@l4P(KxR2%=Gi(t%Y475Pn4sh zXhDr=`vqp^X7%;}SS%Jq?yrdD*Y2_6xXZ78^Gkm4;xFjC-=-UE5`}aTm&b){Fw&$& zHl4+6GGTK&I7+A4jqjnBR7QuR~E1)i}yn z;%;+OQ7agYMryShS~89BwUOIu(Xt-1dUu7hlV?%PW)g`e_nVGIG3eDLgTVlRQ8q(C z<>a_Xty;sRm}nY}>~3t6JgAaR=CCxNR;|%&G|_A}HsgoXjXCnWP3}KGg45+B7!F{! z=UEpmz27k)q_NRadgNZAC<>A+=ux7=X18H58ptOzsFfnAofRBT3pg!gkFu!Q5`l04 zHQONE8)V>O2i<*L7-b{5qZ}rKfvcASg0A6FoEB)5>!g~;G>8usaix&LRnR5^LZ#0%18zSR-2Vuo4W+em+16&A?p>E=I>zjd+6;P z=19v@QQP^?{yX}8=}|GaGKaMGm52LUA)%dGj41+TBEYBAmZ?K@90$ zu3o*0^z5_Ws4q3%y^nx&_jA&gBPWRkMmaxpDUK0@!;9r0Iil@83DblBDmY25p z=))OGwHncJ7XiDAidrF`%i&WL(gztf*S46uImh3we|I4m)t#oU~dkmhLPuI6BA|AI;FL zYdkW3MfiMeTu>%>KmHfO(KC2F9&X>hjiibl5`T{~_S{3*2ZvCE&ermZuxC!hKrqbd zVVYFs5M`}Srn1G2k8d#az&I8wOg=Qh;N*FVhOEBx>ANh}XIQzHz`VLi-yV#H?MU+< zXUU9fl#_XE^;4dI{)c$2VVX~WhleMg5ao>mr&0ssm>cpAg8ptCRuk2#U~F(wcwIK0 xn*O$U_UFGQ+&jX^$Oxtjgmi<$o5-Yp=o;?W6zz002ovPDHLkV1h$z(l`JB literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/textures/tiles/GrassSide.png b/src/main/resources/assets/textures/tiles/GrassSide.png index 7c0a724ae442c57824d408ba22ef400001fa9c3f..7a128f6e979ec41297f8c8c0d62417c8614c9a6e 100644 GIT binary patch delta 4399 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 diff --git a/src/main/resources/assets/textures/tiles/GrassTop.png b/src/main/resources/assets/textures/tiles/GrassTop.png index edab970a67c036702d4f70ddb76d7e5555e95430..ae6039de72d3a5c2f527d30707a32a61f627c475 100644 GIT binary patch delta 7018 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 YKjn_o4iOM9H2?qr07*qoM6N<$f}58l2mk;8 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/textures/tiles/PurpleFlowers.png b/src/main/resources/assets/textures/tiles/PurpleFlowers.png new file mode 100644 index 0000000000000000000000000000000000000000..e118fdd8758a9431ba97926565e0c1b3517a2c77 GIT binary patch literal 519 zcmV+i0{H!jP)oN6DoX>PZae zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00D1FL_t(Y$K_SQPQp+SoWDdP zAfzM}NJ`@8croh12vQOy9zAKI2ctj%krp8qL|$xOIe=j4dQ&lNp%9J6J-uW$yV;r9 zx4@iXDlvRpm<dJJ$M$+C3IJu z7uOdPniYiix7KRX!G=lzz;DCLyQo`^f%TXp*3w#dyb0l-N4FgG#C_?Im)gGV`B{e} zuN~sm`NYbKnq!eYK_O;5Q#RQohvE^82V?Nka*jwRJQ!ft!Jij+II(C~DAH0z1g*;eG5;0)}GO-~B=tl#lZgzT_@_P~aE zF?|Iyk~bTUBFdspBkPsqFL!|5O>>@;8q{NKF~=Py+w?1`eFIBm(DO4478?Kn002ov JPDHLkV1i7;(&YdE literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/textures/tiles/TallGrass.png b/src/main/resources/assets/textures/tiles/TallGrass.png new file mode 100644 index 0000000000000000000000000000000000000000..ce41bcf0ba8f10dac05529d4c65d57a0396393bd GIT binary patch literal 8990 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 Ef(NEM*Z=?k literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/textures/tiles/TinyDandelionFlowers.png b/src/main/resources/assets/textures/tiles/TinyDandelionFlowers.png new file mode 100644 index 0000000000000000000000000000000000000000..35f651c32d37762df94046375ee0face811ec567 GIT binary patch literal 4380 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 W7`x7?IKtlm0000dQ@0+Qek%> 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 Sl+9ZJ0000FI7 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/textures/tiles/WhiteFlowers.png b/src/main/resources/assets/textures/tiles/WhiteFlowers.png new file mode 100644 index 0000000000000000000000000000000000000000..84a987aa64d0caec484ecaf20d637ad8f28e7492 GIT binary patch literal 586 zcmV-Q0=4~#P)oN5GGye zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00FW|L_t(Y$Hi4^OXE-wJ^#`b ze1QdZcd-f)f0!sJYO&U$3(IP)Rx!0yOInjQ-lVmTQhNNb1fzMh#)|VTcbIeUIcH`9 z3>i)_g)a-|dJeAbqO>~}$Z0tl9;kLY4o3t(*X%&f)>G(7hyJsbU4e1;dO_RJ842Df z=GcGiL)#92QMXwmNt)+*#~eI1^0X zR|=uvzc*hQtz-u4tqRl0jJ8f@Ki4S>YY)->oTXry*8i^g6VE~mW4U-Ba78e`-ij?= z%?d1A5avUtQHeDl>8;`V+4G@!_4f@RNjkR|Oe9~oWyBV$i>c(^v<;mkV=t(dtEeAO z4hB=D$*OqyJu$+&lugVeY#9PJwm-*MW3fqnmL6Y^t zUXbCaG)+9s9#j8!zuSkl|G}HjS*Y&fV}g5`{iW*DD4_W}A#hk|d7 Y7d)&d7qy-G;{X5v07*qoM6N<$f+jHjWB>pF literal 0 HcmV?d00001