diff --git a/src/main/java/ru/betterend/blocks/BlockHelixTreeLeaves.java b/src/main/java/ru/betterend/blocks/BlockHelixTreeLeaves.java index eca5f605..7555ae70 100644 --- a/src/main/java/ru/betterend/blocks/BlockHelixTreeLeaves.java +++ b/src/main/java/ru/betterend/blocks/BlockHelixTreeLeaves.java @@ -25,11 +25,13 @@ import net.minecraft.state.property.IntProperty; import net.minecraft.util.math.MathHelper; import ru.betterend.blocks.basis.BlockBase; import ru.betterend.interfaces.IColorProvider; +import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; import ru.betterend.util.MHelper; public class BlockHelixTreeLeaves extends BlockBase implements IColorProvider { public static final IntProperty COLOR = IntProperty.of("color", 0, 7); + private static final OpenSimplexNoise NOISE = new OpenSimplexNoise(0); public BlockHelixTreeLeaves() { super(FabricBlockSettings.of(Material.LEAVES) @@ -61,7 +63,10 @@ public class BlockHelixTreeLeaves extends BlockBase implements IColorProvider { @Override public BlockState getPlacementState(ItemPlacementContext ctx) { - return this.getDefaultState().with(COLOR, MHelper.randRange(3, 5, ctx.getWorld().getRandom())); + double px = ctx.getBlockPos().getX() * 0.1; + double py = ctx.getBlockPos().getY() * 0.1; + double pz = ctx.getBlockPos().getZ() * 0.1; + return this.getDefaultState().with(COLOR, MHelper.floor(NOISE.eval(px, py, pz) * 3.5 + 4)); } private int getGreen(int color) { diff --git a/src/main/java/ru/betterend/blocks/BlockUmbrellaTreeMembrane.java b/src/main/java/ru/betterend/blocks/BlockUmbrellaTreeMembrane.java index 97772b79..1f4a4a98 100644 --- a/src/main/java/ru/betterend/blocks/BlockUmbrellaTreeMembrane.java +++ b/src/main/java/ru/betterend/blocks/BlockUmbrellaTreeMembrane.java @@ -5,25 +5,51 @@ import java.util.List; import com.google.common.collect.Lists; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.block.AbstractGlassBlock; +import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; +import net.minecraft.item.ItemPlacementContext; import net.minecraft.item.ItemStack; import net.minecraft.loot.context.LootContext; +import net.minecraft.state.StateManager; +import net.minecraft.state.property.IntProperty; import net.minecraft.util.Identifier; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; import net.minecraft.util.registry.Registry; +import net.minecraft.world.BlockView; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; +import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.patterns.BlockPatterned; import ru.betterend.patterns.Patterns; -import ru.betterend.registry.EndItems; +import ru.betterend.util.MHelper; public class BlockUmbrellaTreeMembrane extends AbstractGlassBlock implements IRenderTypeable, BlockPatterned { + public static final IntProperty COLOR = IntProperty.of("color", 0, 7); + private static final OpenSimplexNoise NOISE = new OpenSimplexNoise(0); + public BlockUmbrellaTreeMembrane() { super(FabricBlockSettings.copyOf(Blocks.SLIME_BLOCK)); } + @Override + public BlockState getPlacementState(ItemPlacementContext ctx) { + double px = ctx.getBlockPos().getX() * 0.1; + double py = ctx.getBlockPos().getY() * 0.1; + double pz = ctx.getBlockPos().getZ() * 0.1; + return this.getDefaultState().with(COLOR, MHelper.floor(NOISE.eval(px, py, pz) * 3.5 + 4)); + } + + @Override + protected void appendProperties(StateManager.Builder stateManager) { + stateManager.add(COLOR); + } + @Override public ERenderLayer getRenderLayer() { return ERenderLayer.TRANSLUCENT; @@ -31,7 +57,7 @@ public class BlockUmbrellaTreeMembrane extends AbstractGlassBlock implements IRe @Override public List getDroppedStacks(BlockState state, LootContext.Builder builder) { - return Lists.newArrayList(new ItemStack(EndItems.CRYSTAL_SHARDS)); + return Lists.newArrayList(new ItemStack(this)); } @Override @@ -50,4 +76,19 @@ public class BlockUmbrellaTreeMembrane extends AbstractGlassBlock implements IRe public Identifier statePatternId() { return Patterns.STATE_SIMPLE; } + + @Override + public boolean isTranslucent(BlockState state, BlockView world, BlockPos pos) { + return state.get(COLOR) > 0; + } + + @Environment(EnvType.CLIENT) + public boolean isSideInvisible(BlockState state, BlockState stateFrom, Direction direction) { + if (state.get(COLOR) > 0) { + return super.isSideInvisible(state, stateFrom, direction); + } + else { + return false; + } + } } diff --git a/src/main/java/ru/betterend/util/MHelper.java b/src/main/java/ru/betterend/util/MHelper.java index 3b6aa1a7..f7f89835 100644 --- a/src/main/java/ru/betterend/util/MHelper.java +++ b/src/main/java/ru/betterend/util/MHelper.java @@ -101,6 +101,10 @@ public class MHelper { return (float) Math.sqrt(lengthSqr(x, y, z)); } + public static double length(double x, double y, double z) { + return Math.sqrt(lengthSqr(x, y, z)); + } + public static float lengthSqr(float x, float y) { return x * x + y * y; } diff --git a/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java b/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java index f50e3a78..5bcc87d7 100644 --- a/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java @@ -10,14 +10,15 @@ import net.minecraft.block.BlockState; import net.minecraft.block.Material; import net.minecraft.client.util.math.Vector3f; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import ru.betterend.blocks.BlockUmbrellaTreeMembrane; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; import ru.betterend.util.MHelper; import ru.betterend.util.SplineHelper; -import ru.betterend.util.sdf.PosInfo; import ru.betterend.util.sdf.SDF; import ru.betterend.util.sdf.operator.SDFFlatWave; import ru.betterend.util.sdf.operator.SDFScale3D; @@ -31,7 +32,6 @@ import ru.betterend.world.features.DefaultFeature; public class UmbrellaTreeFeature extends DefaultFeature { private static final Function REPLACE; private static final Function IGNORE; - private static final Function POST; private static final List SPLINE; private static final List ROOT; @@ -40,14 +40,15 @@ public class UmbrellaTreeFeature extends DefaultFeature { if (!world.getBlockState(pos.down()).getBlock().isIn(EndTags.END_GROUND)) return false; BlockState wood = EndBlocks.UMBRELLA_TREE.bark.getDefaultState(); - BlockState membrane = EndBlocks.UMBRELLA_TREE_MEMBRANE.getDefaultState(); - BlockState center = EndBlocks.UMBRELLA_TREE.planks.getDefaultState(); + BlockState membrane = EndBlocks.UMBRELLA_TREE_MEMBRANE.getDefaultState().with(BlockUmbrellaTreeMembrane.COLOR, 1); + BlockState center = EndBlocks.UMBRELLA_TREE_MEMBRANE.getDefaultState().with(BlockUmbrellaTreeMembrane.COLOR, 0); float size = MHelper.randRange(10, 20, random); int count = (int) (size * 0.15F); float var = MHelper.PI2 / (float) (count * 3); float start = MHelper.randRange(0, MHelper.PI2, random); SDF sdf = null; + List
centers = Lists.newArrayList(); for (int i = 0; i < count; i++) { float angle = (float) i / (float) count * MHelper.PI2 + MHelper.randRange(0, var, random) + start; List spline = SplineHelper.copySpline(SPLINE); @@ -73,6 +74,10 @@ public class UmbrellaTreeFeature extends DefaultFeature { float pz = MHelper.floor(vec.getZ()) + 0.5F; mem = new SDFTranslate().setTranslate(px, py, pz).setSource(mem); sdf = new SDFSmoothUnion().setRadius(2).setSourceA(sdf).setSourceB(mem); + centers.add(new Center(pos.getX() + (double) px, pos.getZ() + (double) pz, radius)); + + vec = spline.get(0); + makeRoots(world, pos.add(vec.getX(), vec.getY() + 2, vec.getZ()), size * 0.3F + 3, random, wood); } } @@ -80,8 +85,27 @@ public class UmbrellaTreeFeature extends DefaultFeature { return false; } - sdf.setReplaceFunction(REPLACE).setPostProcess(POST).fillRecursiveIgnore(world, pos, IGNORE); - makeRoots(world, pos.add(0, 2, 0), size * 0.3F + 3, random, wood); + sdf.setReplaceFunction(REPLACE).setPostProcess((info) -> { + if (EndBlocks.UMBRELLA_TREE.isTreeLog(info.getStateUp()) && EndBlocks.UMBRELLA_TREE.isTreeLog(info.getStateDown())) { + return EndBlocks.UMBRELLA_TREE.log.getDefaultState(); + } + else if (info.getState().equals(membrane)) { + Center min = centers.get(0); + double d = Double.MAX_VALUE; + BlockPos bpos = info.getPos(); + for (Center c: centers) { + double d2 = c.distance(bpos.getX(), bpos.getZ()); + if (d2 < d) { + d = d2; + min = c; + } + } + int color = MHelper.floor(d / min.radius * 7); + color = MathHelper.clamp(color, 1, 7); + return info.getState().with(BlockUmbrellaTreeMembrane.COLOR, color); + } + return info.getState(); + }).fillRecursiveIgnore(world, pos, IGNORE); return true; } @@ -132,7 +156,7 @@ public class UmbrellaTreeFeature extends DefaultFeature { new Vector3f(0.50F, 1.00F, 0.00F) ); - ROOT = Lists.newArrayList(new Vector3f(0F, 1F, 0), + ROOT = Lists.newArrayList( new Vector3f(0.1F, 0.70F, 0), new Vector3f(0.3F, 0.30F, 0), new Vector3f(0.7F, 0.05F, 0), @@ -150,12 +174,21 @@ public class UmbrellaTreeFeature extends DefaultFeature { IGNORE = (state) -> { return EndBlocks.UMBRELLA_TREE.isTreeLog(state); }; + } + + private class Center { + final double px; + final double pz; + final float radius; - POST = (info) -> { - if (EndBlocks.UMBRELLA_TREE.isTreeLog(info.getStateUp()) && EndBlocks.UMBRELLA_TREE.isTreeLog(info.getStateDown())) { - return EndBlocks.UMBRELLA_TREE.log.getDefaultState(); - } - return info.getState(); - }; + Center(double x, double z, float radius) { + this.px = x; + this.pz = z; + this.radius = radius; + } + + double distance(float x, float z) { + return MHelper.length(px - x, pz - z); + } } } diff --git a/src/main/resources/assets/betterend/blockstates/umbrella_tree_membrane.json b/src/main/resources/assets/betterend/blockstates/umbrella_tree_membrane.json new file mode 100644 index 00000000..67205565 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/umbrella_tree_membrane.json @@ -0,0 +1,12 @@ +{ + "variants": { + "color=0": { "model": "betterend:block/umbrella_tree_membrane_0" }, + "color=1": { "model": "betterend:block/umbrella_tree_membrane_1" }, + "color=2": { "model": "betterend:block/umbrella_tree_membrane_2" }, + "color=3": { "model": "betterend:block/umbrella_tree_membrane_3" }, + "color=4": { "model": "betterend:block/umbrella_tree_membrane_4" }, + "color=5": { "model": "betterend:block/umbrella_tree_membrane_5" }, + "color=6": { "model": "betterend:block/umbrella_tree_membrane_6" }, + "color=7": { "model": "betterend:block/umbrella_tree_membrane_7" } + } +} diff --git a/src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_0.json b/src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_0.json new file mode 100644 index 00000000..c97a7fd7 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_0.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "betterend:block/umbrella_tree_membrane_0" + } +} diff --git a/src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_1.json b/src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_1.json new file mode 100644 index 00000000..d2bf8c26 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_1.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "betterend:block/umbrella_tree_membrane_1" + } +} diff --git a/src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_2.json b/src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_2.json new file mode 100644 index 00000000..e0ef2166 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_2.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "betterend:block/umbrella_tree_membrane_2" + } +} diff --git a/src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_3.json b/src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_3.json new file mode 100644 index 00000000..a2e17b5f --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_3.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "betterend:block/umbrella_tree_membrane_3" + } +} diff --git a/src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_4.json b/src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_4.json new file mode 100644 index 00000000..27bb5dbd --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_4.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "betterend:block/umbrella_tree_membrane_4" + } +} diff --git a/src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_5.json b/src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_5.json new file mode 100644 index 00000000..93e86f87 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_5.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "betterend:block/umbrella_tree_membrane_5" + } +} diff --git a/src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_6.json b/src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_6.json new file mode 100644 index 00000000..02690946 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_6.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "betterend:block/umbrella_tree_membrane_6" + } +} diff --git a/src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_7.json b/src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_7.json new file mode 100644 index 00000000..25254adf --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/umbrella_tree_membrane_7.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "betterend:block/umbrella_tree_membrane_7" + } +} diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_0.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_0.png new file mode 100644 index 00000000..900a7fd2 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_0.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_1.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_1.png new file mode 100644 index 00000000..7a54cb96 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_1.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_2.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_2.png new file mode 100644 index 00000000..1b9bae91 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_2.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_3.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_3.png new file mode 100644 index 00000000..129be486 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_3.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_4.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_4.png new file mode 100644 index 00000000..8f441907 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_4.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_5.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_5.png new file mode 100644 index 00000000..108b2e03 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_5.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_6.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_6.png new file mode 100644 index 00000000..517133b0 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_6.png differ diff --git a/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_7.png b/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_7.png new file mode 100644 index 00000000..c2a73695 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/umbrella_tree_membrane_7.png differ