Search in sources :

Example 1 with SDFDisplacement

use of ru.bclib.sdf.operator.SDFDisplacement in project EdenRing by paulevsGitch.

the class IslandTypes method makeTallSphereIsland.

private static BiFunction<LayerOptions, Random, SDF> makeTallSphereIsland() {
    SDF sphere = new SDFSphere().setRadius(1.0F);
    sphere = new SDFScale3D().setScale(0.25F, 1.0F, 0.25F).setSource(sphere);
    final SDF defaultIsland = sphere;
    return (options, random) -> {
        float scale = random.nextFloat() + 0.5F;
        if (options.scale > 60) {
            scale = 60 * scale / options.scale;
        } else if (options.scale < 30) {
            scale = 30 * scale / options.scale;
        }
        SDF island = new SDFScale().setScale(scale).setSource(defaultIsland);
        if (options.scale > 35) {
            float distance = scale * 0.6F;
            float offset = random.nextFloat() * MHelper.PI2;
            byte count = (byte) MHelper.randRange(3, 5, random);
            for (byte i = 0; i < count; i++) {
                float angle = (float) i / count * MHelper.PI2 + offset;
                float px = (float) Math.sin(angle) * distance;
                float pz = (float) Math.cos(angle) * distance;
                SDF part = new SDFScale().setScale(scale * MHelper.randRange(0.3F, 0.6F, random)).setSource(defaultIsland);
                part = new SDFTranslate().setTranslate(px, MHelper.randRange(-0.25F, 0.25F, random) * distance, pz).setSource(part);
                island = new SDFUnion().setSourceA(island).setSourceB(part);
            }
        }
        final OpenSimplexNoise noise1 = new OpenSimplexNoise(random.nextInt());
        final float scale1 = 0.5F * options.scale;
        final float noiseScale = Mth.clamp((options.scale - 30) / 30F, 0.1F, 1.0F);
        final float scale2 = 20F / options.scale * noiseScale;
        island = new SDFDisplacement().setFunction(pos -> (float) noise1.eval(pos.x() * scale1, pos.y() * scale1, pos.z() * scale1) * scale2).setSource(island);
        return island;
    };
}
Also used : SDFScale(ru.bclib.sdf.operator.SDFScale) SDFUnion(ru.bclib.sdf.operator.SDFUnion) BiFunction(java.util.function.BiFunction) Random(java.util.Random) SDFCoordModify(ru.bclib.sdf.operator.SDFCoordModify) SDFSphere(ru.bclib.sdf.primitive.SDFSphere) List(java.util.List) SDFSmoothUnion(ru.bclib.sdf.operator.SDFSmoothUnion) SDFCappedCone(ru.bclib.sdf.primitive.SDFCappedCone) SDFDisplacement(ru.bclib.sdf.operator.SDFDisplacement) SDFTranslate(ru.bclib.sdf.operator.SDFTranslate) SDFScale3D(ru.bclib.sdf.operator.SDFScale3D) Builder(com.google.common.collect.ImmutableList.Builder) Mth(net.minecraft.util.Mth) SDF(ru.bclib.sdf.SDF) OpenSimplexNoise(ru.bclib.noise.OpenSimplexNoise) MHelper(ru.bclib.util.MHelper) SDFSphere(ru.bclib.sdf.primitive.SDFSphere) SDF(ru.bclib.sdf.SDF) SDFDisplacement(ru.bclib.sdf.operator.SDFDisplacement) SDFUnion(ru.bclib.sdf.operator.SDFUnion) SDFScale(ru.bclib.sdf.operator.SDFScale) SDFTranslate(ru.bclib.sdf.operator.SDFTranslate) OpenSimplexNoise(ru.bclib.noise.OpenSimplexNoise) SDFScale3D(ru.bclib.sdf.operator.SDFScale3D)

Example 2 with SDFDisplacement

use of ru.bclib.sdf.operator.SDFDisplacement in project EdenRing by paulevsGitch.

the class StonePillar method place.

@Override
public boolean place(FeaturePlaceContext<NoneFeatureConfiguration> featurePlaceContext) {
    WorldGenLevel level = featurePlaceContext.level();
    BlockPos center = featurePlaceContext.origin();
    Random random = featurePlaceContext.random();
    center = getPosOnSurface(level, center);
    if (center.getY() < 5) {
        return false;
    }
    float height = MHelper.randRange(1.5F, 3.5F, random);
    center = center.above(Mth.floor(height));
    float r1 = MHelper.randRange(2.5F, 3.5F, random);
    float r2 = MHelper.randRange(1.5F, 2.5F, random);
    SDF sdf = new SDFCappedCone().setHeight(height * 2).setRadius1(r1).setRadius2(r2).setBlock(Blocks.STONE);
    int count = random.nextInt(3);
    float radius = r2 * MHelper.randRange(1.5F, 2F, random);
    for (int i = 0; i < count; i++) {
        height += radius * 0.7F;
        SDF sphere = new SDFSphere().setRadius(MHelper.randRange(2F, 4F, random)).setBlock(Blocks.STONE);
        sphere = new SDFScale3D().setScale(MHelper.randRange(2F, 3F, random), 1, MHelper.randRange(2F, 3F, random)).setSource(sphere);
        sphere = new SDFTranslate().setTranslate(0, height, 0).setSource(sphere);
        sdf = new SDFSmoothUnion().setRadius(4f).setSourceA(sdf).setSourceB(sphere);
        height += radius;
        radius += MHelper.randRange(0.75F, 1.5F, random);
    }
    OpenSimplexNoise noise = new OpenSimplexNoise(random.nextInt());
    sdf = new SDFDisplacement().setFunction(pos -> {
        float disp = (float) noise.eval(pos.x() * 0.06F, pos.y() * 0.06F, pos.z() * 0.06F) * 2.0F;
        disp += (float) noise.eval(pos.x() * 0.1F, pos.y() * 0.1F, pos.z() * 0.1F) * 0.35F;
        return disp;
    }).setSource(sdf);
    BlockState bottom = EdenBlocks.EDEN_VINE.defaultBlockState().setValue(BlockProperties.TRIPLE_SHAPE, TripleShape.BOTTOM);
    BlockState middle = EdenBlocks.EDEN_VINE.defaultBlockState().setValue(BlockProperties.TRIPLE_SHAPE, TripleShape.MIDDLE);
    BlockState top = EdenBlocks.EDEN_VINE.defaultBlockState().setValue(BlockProperties.TRIPLE_SHAPE, TripleShape.TOP);
    BlockState roots = Blocks.HANGING_ROOTS.defaultBlockState();
    sdf.addPostProcess(info -> {
        if (info.getState().is(EdenBlocks.EDEN_VINE) || info.getState().is(Blocks.HANGING_ROOTS)) {
            return info.getState();
        }
        if (info.getPos().getY() > 3 && info.getStateDown().isAir() && random.nextInt(8) == 0) {
            if (random.nextBoolean()) {
                info.setBlockPos(info.getPos().below(), roots);
            } else {
                int h = MHelper.randRange(1, 3, random);
                for (int i = 0; i < h; i++) {
                    int p = i + 1;
                    info.setBlockPos(info.getPos().below(p), i == 0 ? top : i == p ? bottom : middle);
                }
            }
        }
        if (info.getStateUp().isAir() && noise.eval(info.getPos().getX() * 0.4F, info.getPos().getY() * 0.4F, info.getPos().getZ() * 0.4F) > 0.1) {
            if (random.nextInt(5) == 0) {
                info.setBlockPos(info.getPos().above(), Blocks.GRASS.defaultBlockState());
            }
            return EdenBlocks.MOSSY_STONE.defaultBlockState();
        } else if (noise.eval(info.getPos().getX() * 0.4F, info.getPos().getY() * 0.4F + 50, info.getPos().getZ() * 0.4F) > 0.3) {
            return Blocks.MOSSY_COBBLESTONE.defaultBlockState();
        } else if (noise.eval(info.getPos().getX() * 0.4F, info.getPos().getY() * 0.4F + 100, info.getPos().getZ() * 0.4F) > 0.3) {
            return Blocks.COBBLESTONE.defaultBlockState();
        } else if (noise.eval(info.getPos().getX() * 0.4F, info.getPos().getY() * 0.4F + 150, info.getPos().getZ() * 0.4F) > 0.3) {
            if (info.getStateUp().isAir() && random.nextInt(5) == 0) {
                info.setBlockPos(info.getPos().above(), Blocks.GRASS.defaultBlockState());
            }
            return Blocks.MOSS_BLOCK.defaultBlockState();
        }
        return info.getState();
    });
    sdf.setReplaceFunction(state -> {
        return state.isAir() || state.getBlock() instanceof EdenGrassBlock || state.is(Blocks.DIRT);
    }).fillRecursive(level, center);
    return true;
}
Also used : FeaturePlaceContext(net.minecraft.world.level.levelgen.feature.FeaturePlaceContext) NoneFeatureConfiguration(net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration) BlockState(net.minecraft.world.level.block.state.BlockState) Random(java.util.Random) DefaultFeature(ru.bclib.world.features.DefaultFeature) Blocks(net.minecraft.world.level.block.Blocks) TripleShape(ru.bclib.blocks.BlockProperties.TripleShape) SDFSphere(ru.bclib.sdf.primitive.SDFSphere) EdenGrassBlock(paulevs.edenring.blocks.EdenGrassBlock) SDFSmoothUnion(ru.bclib.sdf.operator.SDFSmoothUnion) SDFCappedCone(ru.bclib.sdf.primitive.SDFCappedCone) WorldGenLevel(net.minecraft.world.level.WorldGenLevel) BlockPos(net.minecraft.core.BlockPos) SDFDisplacement(ru.bclib.sdf.operator.SDFDisplacement) SDFTranslate(ru.bclib.sdf.operator.SDFTranslate) SDFScale3D(ru.bclib.sdf.operator.SDFScale3D) Mth(net.minecraft.util.Mth) BlockProperties(ru.bclib.blocks.BlockProperties) SDF(ru.bclib.sdf.SDF) EdenBlocks(paulevs.edenring.registries.EdenBlocks) OpenSimplexNoise(ru.bclib.noise.OpenSimplexNoise) MHelper(ru.bclib.util.MHelper) SDFSmoothUnion(ru.bclib.sdf.operator.SDFSmoothUnion) EdenGrassBlock(paulevs.edenring.blocks.EdenGrassBlock) SDFCappedCone(ru.bclib.sdf.primitive.SDFCappedCone) SDFScale3D(ru.bclib.sdf.operator.SDFScale3D) SDFSphere(ru.bclib.sdf.primitive.SDFSphere) BlockState(net.minecraft.world.level.block.state.BlockState) Random(java.util.Random) SDF(ru.bclib.sdf.SDF) SDFDisplacement(ru.bclib.sdf.operator.SDFDisplacement) SDFTranslate(ru.bclib.sdf.operator.SDFTranslate) BlockPos(net.minecraft.core.BlockPos) OpenSimplexNoise(ru.bclib.noise.OpenSimplexNoise) WorldGenLevel(net.minecraft.world.level.WorldGenLevel)

Aggregations

Random (java.util.Random)2 Mth (net.minecraft.util.Mth)2 OpenSimplexNoise (ru.bclib.noise.OpenSimplexNoise)2 SDF (ru.bclib.sdf.SDF)2 SDFDisplacement (ru.bclib.sdf.operator.SDFDisplacement)2 SDFScale3D (ru.bclib.sdf.operator.SDFScale3D)2 SDFSmoothUnion (ru.bclib.sdf.operator.SDFSmoothUnion)2 SDFTranslate (ru.bclib.sdf.operator.SDFTranslate)2 SDFCappedCone (ru.bclib.sdf.primitive.SDFCappedCone)2 SDFSphere (ru.bclib.sdf.primitive.SDFSphere)2 MHelper (ru.bclib.util.MHelper)2 Builder (com.google.common.collect.ImmutableList.Builder)1 List (java.util.List)1 BiFunction (java.util.function.BiFunction)1 BlockPos (net.minecraft.core.BlockPos)1 WorldGenLevel (net.minecraft.world.level.WorldGenLevel)1 Blocks (net.minecraft.world.level.block.Blocks)1 BlockState (net.minecraft.world.level.block.state.BlockState)1 FeaturePlaceContext (net.minecraft.world.level.levelgen.feature.FeaturePlaceContext)1 NoneFeatureConfiguration (net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration)1