Fixed leaves cascade update, basic structure classes separation

This commit is contained in:
paulevsGitch 2020-11-07 12:57:07 +03:00
parent d87b98fcd7
commit d0135e83e9
16 changed files with 136 additions and 53 deletions

View file

@ -20,6 +20,7 @@ import net.minecraft.world.gen.feature.FeatureConfig;
import net.minecraft.world.gen.feature.OreFeatureConfig;
import ru.betterend.BetterEnd;
import ru.betterend.blocks.complex.StoneMaterial;
import ru.betterend.world.features.terrain.OreLayerFeature;
public class EndFeature {
protected Feature<?> feature;

View file

@ -1,4 +1,4 @@
package ru.betterend.world.features;
package ru.betterend.world.features.bushes;
import java.util.Random;
import java.util.function.Function;
@ -17,6 +17,7 @@ import ru.betterend.util.sdf.operator.SDFScale3D;
import ru.betterend.util.sdf.operator.SDFSubtraction;
import ru.betterend.util.sdf.operator.SDFTranslate;
import ru.betterend.util.sdf.primitive.SDFSphere;
import ru.betterend.world.features.FullHeightScatterFeature;
public class CaveBushFeature extends FullHeightScatterFeature {
public CaveBushFeature(int radius) {

View file

@ -1,4 +1,4 @@
package ru.betterend.world.features;
package ru.betterend.world.features.bushes;
import java.util.Random;
import java.util.function.Function;
@ -18,6 +18,7 @@ import ru.betterend.util.sdf.operator.SDFScale3D;
import ru.betterend.util.sdf.operator.SDFSubtraction;
import ru.betterend.util.sdf.operator.SDFTranslate;
import ru.betterend.util.sdf.primitive.SDFSphere;
import ru.betterend.world.features.InvertedScatterFeature;
public class CaveBushFeatureCeil extends InvertedScatterFeature {
public CaveBushFeatureCeil(int radius) {

View file

@ -1,4 +1,4 @@
package ru.betterend.world.features;
package ru.betterend.world.features.bushes;
import java.util.Random;
import java.util.function.Function;
@ -21,6 +21,7 @@ import ru.betterend.util.sdf.operator.SDFScale3D;
import ru.betterend.util.sdf.operator.SDFSubtraction;
import ru.betterend.util.sdf.operator.SDFTranslate;
import ru.betterend.util.sdf.primitive.SDFSphere;
import ru.betterend.world.features.DefaultFeature;
public class DragonTreeBushFeature extends DefaultFeature {
private static final Function<BlockState, Boolean> REPLACE;

View file

@ -1,4 +1,4 @@
package ru.betterend.world.features;
package ru.betterend.world.features.bushes;
import java.util.Random;
import java.util.function.Function;
@ -20,6 +20,7 @@ import ru.betterend.util.sdf.operator.SDFScale3D;
import ru.betterend.util.sdf.operator.SDFSubtraction;
import ru.betterend.util.sdf.operator.SDFTranslate;
import ru.betterend.util.sdf.primitive.SDFSphere;
import ru.betterend.world.features.DefaultFeature;
public class PythadendronBushFeature extends DefaultFeature {
private static final Function<BlockState, Boolean> REPLACE;

View file

@ -1,4 +1,4 @@
package ru.betterend.world.features;
package ru.betterend.world.features.terrain;
import java.util.Random;
@ -16,6 +16,7 @@ import ru.betterend.registry.EndBlocks;
import ru.betterend.registry.EndTags;
import ru.betterend.util.BlocksHelper;
import ru.betterend.util.MHelper;
import ru.betterend.world.features.DefaultFeature;
public class EndLakeFeature extends DefaultFeature {
private static final BlockState END_STONE = Blocks.END_STONE.getDefaultState();

View file

@ -1,4 +1,4 @@
package ru.betterend.world.features;
package ru.betterend.world.features.terrain;
import java.util.Random;
@ -14,6 +14,7 @@ import ru.betterend.util.sdf.SDF;
import ru.betterend.util.sdf.operator.SDFCoordModify;
import ru.betterend.util.sdf.operator.SDFScale3D;
import ru.betterend.util.sdf.primitive.SDFSphere;
import ru.betterend.world.features.DefaultFeature;
public class OreLayerFeature extends DefaultFeature {
private static final SDFSphere SPHERE;

View file

@ -1,4 +1,4 @@
package ru.betterend.world.features;
package ru.betterend.world.features.terrain;
import java.util.Random;
import java.util.Set;
@ -29,6 +29,7 @@ import ru.betterend.util.sdf.operator.SDFSubtraction;
import ru.betterend.util.sdf.operator.SDFTranslate;
import ru.betterend.util.sdf.primitive.SDFHexPrism;
import ru.betterend.util.sdf.primitive.SDFSphere;
import ru.betterend.world.features.DefaultFeature;
public class RoundCaveFeature extends DefaultFeature {
private static final BlockState CAVE_AIR = Blocks.CAVE_AIR.getDefaultState();

View file

@ -1,4 +1,4 @@
package ru.betterend.world.features;
package ru.betterend.world.features.trees;
import java.util.List;
import java.util.Random;
@ -11,6 +11,7 @@ import net.minecraft.block.LeavesBlock;
import net.minecraft.block.Material;
import net.minecraft.client.util.math.Vector3f;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.BlockPos.Mutable;
import net.minecraft.util.math.Direction;
import net.minecraft.world.StructureWorldAccess;
import net.minecraft.world.gen.chunk.ChunkGenerator;
@ -29,6 +30,7 @@ import ru.betterend.util.sdf.operator.SDFScale3D;
import ru.betterend.util.sdf.operator.SDFSubtraction;
import ru.betterend.util.sdf.operator.SDFTranslate;
import ru.betterend.util.sdf.primitive.SDFSphere;
import ru.betterend.world.features.DefaultFeature;
public class DragonTreeFeature extends DefaultFeature {
private static final Function<BlockState, Boolean> REPLACE;
@ -111,13 +113,14 @@ public class DragonTreeFeature extends DefaultFeature {
}
private void leavesBall(StructureWorldAccess world, BlockPos pos, float radius, Random random, OpenSimplexNoise noise) {
SDF sphere = new SDFSphere().setRadius(radius).setBlock(EndBlocks.DRAGON_TREE_LEAVES.getDefaultState().with(LeavesBlock.DISTANCE, 1));
SDF sphere = new SDFSphere().setRadius(radius).setBlock(EndBlocks.DRAGON_TREE_LEAVES.getDefaultState().with(LeavesBlock.DISTANCE, 6));
SDF sub = new SDFScale().setScale(5).setSource(sphere);
sub = new SDFTranslate().setTranslate(0, -radius * 5, 0).setSource(sub);
sphere = new SDFSubtraction().setSourceA(sphere).setSourceB(sub);
sphere = new SDFScale3D().setScale(1, 0.5F, 1).setSource(sphere);
sphere = new SDFDisplacement().setFunction((vec) -> { return (float) noise.eval(vec.getX() * 0.2, vec.getY() * 0.2, vec.getZ() * 0.2) * 1.5F; }).setSource(sphere);
sphere = new SDFDisplacement().setFunction((vec) -> { return random.nextFloat() * 3F - 1.5F; }).setSource(sphere);
Mutable mut = new Mutable();
sphere.setPostProcess((info) -> {
if (random.nextInt(5) == 0) {
for (Direction dir: Direction.values()) {
@ -126,11 +129,43 @@ public class DragonTreeFeature extends DefaultFeature {
return info.getState();
}
}
return EndBlocks.DRAGON_TREE.bark.getDefaultState();
info.setState(EndBlocks.DRAGON_TREE.bark.getDefaultState());
for (int x = -6; x < 7; x++) {
int ax = Math.abs(x);
mut.setX(x + info.getPos().getX());
for (int z = -6; z < 7; z++) {
int az = Math.abs(z);
mut.setZ(z + info.getPos().getZ());
for (int y = -6; y < 7; y++) {
int ay = Math.abs(y);
int d = ax + ay + az;
if (d < 7) {
mut.setY(y + info.getPos().getY());
BlockState state = info.getState(mut);
if (state.getBlock() instanceof LeavesBlock) {
int distance = state.get(LeavesBlock.DISTANCE);
if (d < distance) {
info.setState(mut, state.with(LeavesBlock.DISTANCE, d));
}
}
}
}
}
}
}
return info.getState();
});
sphere.fillRecursiveIgnore(world, pos, IGNORE);
/*Collection<PosInfo> list = sphere.fillRecursiveIgnore(world, pos, IGNORE);
list.forEach((info) -> {
if (info.getState().getBlock() instanceof LeavesBlock && info.getState().get(LeavesBlock.DISTANCE) == 6) {
BlockState state = BlocksHelper.getLeavesState(info.getState(), world, info.getPos());
if (!state.equals(info.getState())) {
BlocksHelper.setWithoutUpdate(world, info.getPos(), state);
}
}
});*/
if (radius > 5) {
int count = (int) (radius * 2.5F);

View file

@ -1,4 +1,4 @@
package ru.betterend.world.features;
package ru.betterend.world.features.trees;
import java.util.List;
import java.util.Random;
@ -26,6 +26,7 @@ import ru.betterend.util.sdf.operator.SDFDisplacement;
import ru.betterend.util.sdf.operator.SDFSubtraction;
import ru.betterend.util.sdf.operator.SDFTranslate;
import ru.betterend.util.sdf.primitive.SDFSphere;
import ru.betterend.world.features.DefaultFeature;
public class LacugroveFeature extends DefaultFeature {
private static final Function<BlockState, Boolean> REPLACE;
@ -108,6 +109,7 @@ public class LacugroveFeature extends DefaultFeature {
sphere = new SDFDisplacement().setFunction((vec) -> { return (float) noise.eval(vec.getX() * 0.2, vec.getY() * 0.2, vec.getZ() * 0.2) * 3; }).setSource(sphere);
sphere = new SDFDisplacement().setFunction((vec) -> { return random.nextFloat() * 3F - 1.5F; }).setSource(sphere);
sphere = new SDFSubtraction().setSourceA(sphere).setSourceB(new SDFTranslate().setTranslate(0, -radius - 2, 0).setSource(sphere));
Mutable mut = new Mutable();
sphere.setPostProcess((info) -> {
if (random.nextInt(5) == 0) {
for (Direction dir: Direction.values()) {
@ -116,7 +118,29 @@ public class LacugroveFeature extends DefaultFeature {
return info.getState();
}
}
return EndBlocks.LACUGROVE.bark.getDefaultState();
info.setState(EndBlocks.LACUGROVE.bark.getDefaultState());
for (int x = -6; x < 7; x++) {
int ax = Math.abs(x);
mut.setX(x + info.getPos().getX());
for (int z = -6; z < 7; z++) {
int az = Math.abs(z);
mut.setZ(z + info.getPos().getZ());
for (int y = -6; y < 7; y++) {
int ay = Math.abs(y);
int d = ax + ay + az;
if (d < 7) {
mut.setY(y + info.getPos().getY());
BlockState state = info.getState(mut);
if (state.getBlock() instanceof LeavesBlock) {
int distance = state.get(LeavesBlock.DISTANCE);
if (d < distance) {
info.setState(mut, state.with(LeavesBlock.DISTANCE, d));
}
}
}
}
}
}
}
return info.getState();
});

View file

@ -1,4 +1,4 @@
package ru.betterend.world.features;
package ru.betterend.world.features.trees;
import java.util.List;
import java.util.Random;
@ -33,6 +33,7 @@ import ru.betterend.util.sdf.operator.SDFUnion;
import ru.betterend.util.sdf.primitive.SDFCapedCone;
import ru.betterend.util.sdf.primitive.SDFPrimitive;
import ru.betterend.util.sdf.primitive.SDFSphere;
import ru.betterend.world.features.DefaultFeature;
public class MossyGlowshroomFeature extends DefaultFeature {
private static final Function<BlockState, Boolean> REPLACE;

View file

@ -1,4 +1,4 @@
package ru.betterend.world.features;
package ru.betterend.world.features.trees;
import java.util.List;
import java.util.Random;
@ -9,6 +9,7 @@ import net.minecraft.block.LeavesBlock;
import net.minecraft.block.Material;
import net.minecraft.client.util.math.Vector3f;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.BlockPos.Mutable;
import net.minecraft.util.math.Direction;
import net.minecraft.world.StructureWorldAccess;
import net.minecraft.world.gen.chunk.ChunkGenerator;
@ -26,6 +27,7 @@ import ru.betterend.util.sdf.operator.SDFScale3D;
import ru.betterend.util.sdf.operator.SDFSubtraction;
import ru.betterend.util.sdf.operator.SDFTranslate;
import ru.betterend.util.sdf.primitive.SDFSphere;
import ru.betterend.world.features.DefaultFeature;
public class PythadendronTreeFeature extends DefaultFeature {
private static final Function<BlockState, Boolean> REPLACE;
@ -112,6 +114,7 @@ public class PythadendronTreeFeature extends DefaultFeature {
sphere = new SDFDisplacement().setFunction((vec) -> { return (float) noise.eval(vec.getX() * 0.2, vec.getY() * 0.2, vec.getZ() * 0.2) * 3; }).setSource(sphere);
sphere = new SDFDisplacement().setFunction((vec) -> { return random.nextFloat() * 3F - 1.5F; }).setSource(sphere);
sphere = new SDFSubtraction().setSourceA(sphere).setSourceB(new SDFTranslate().setTranslate(0, -radius, 0).setSource(sphere));
Mutable mut = new Mutable();
sphere.setPostProcess((info) -> {
if (random.nextInt(5) == 0) {
for (Direction dir: Direction.values()) {
@ -120,7 +123,29 @@ public class PythadendronTreeFeature extends DefaultFeature {
return info.getState();
}
}
return EndBlocks.PYTHADENDRON.bark.getDefaultState();
info.setState(EndBlocks.PYTHADENDRON.bark.getDefaultState());
for (int x = -6; x < 7; x++) {
int ax = Math.abs(x);
mut.setX(x + info.getPos().getX());
for (int z = -6; z < 7; z++) {
int az = Math.abs(z);
mut.setZ(z + info.getPos().getZ());
for (int y = -6; y < 7; y++) {
int ay = Math.abs(y);
int d = ax + ay + az;
if (d < 7) {
mut.setY(y + info.getPos().getY());
BlockState state = info.getState(mut);
if (state.getBlock() instanceof LeavesBlock) {
int distance = state.get(LeavesBlock.DISTANCE);
if (d < distance) {
info.setState(mut, state.with(LeavesBlock.DISTANCE, d));
}
}
}
}
}
}
}
return info.getState();
});