use of ru.bclib.sdf.operator.SDFSmoothUnion in project EdenRing by paulevsGitch.
the class IslandTypes method makeSimpleIsland.
private static BiFunction<LayerOptions, Random, SDF> makeSimpleIsland() {
SDF cone1 = makeCone(0, 0.4F, 0.2F, -0.3F);
SDF cone2 = makeCone(0.4F, 0.5F, 0.1F, -0.1F);
SDF cone3 = makeCone(0.5F, 0.45F, 0.03F, 0.0F);
SDF cone4 = makeCone(0.45F, 0, 0.02F, 0.03F);
SDF coneBottom = new SDFSmoothUnion().setRadius(0.02F).setSourceA(cone1).setSourceB(cone2);
SDF coneTop = new SDFSmoothUnion().setRadius(0.02F).setSourceA(cone3).setSourceB(cone4);
final SDF defaultIsland = new SDFSmoothUnion().setRadius(0.01F).setSourceA(coneTop).setSourceB(coneBottom);
return (options, random) -> {
final OpenSimplexNoise noise1 = new OpenSimplexNoise(random.nextInt());
final OpenSimplexNoise noise2 = new OpenSimplexNoise(random.nextInt());
final float scale1 = options.scale * 0.0125F;
final float scale2 = options.scale * 0.025F;
final float scale3 = options.scale * 0.05F;
final float scale4 = Mth.clamp((options.scale - 50) / 50F, 0.3F, 1.0F) / options.scale;
final float islandScale = random.nextFloat() + 0.5F;
SDF island = new SDFScale().setScale(islandScale).setSource(defaultIsland);
island = new SDFCoordModify().setFunction(pos -> {
float x1 = pos.x() * scale1;
float z1 = pos.z() * scale1;
float x2 = pos.x() * scale2;
float z2 = pos.z() * scale2;
float x3 = pos.x() * scale3;
float z3 = pos.z() * scale3;
float dx = (float) noise1.eval(x1, z1) * 20 + (float) noise2.eval(x2, z2) * 10;
float dy = (float) noise1.eval(x3, z3) * 6 + (float) noise2.eval(x3, z3) * 3;
float dz = (float) noise2.eval(x1, z1) * 20 + (float) noise1.eval(x2, z2) * 10;
// float scaleY = 1.0F - MHelper.length(pos.x(), pos.z()) / islandScale;
pos.set(pos.x() + dx * scale4, pos.y() + dy * scale4, /* * scaleY*/
pos.z() + dz * scale4);
}).setSource(island);
return island;
};
}
use of ru.bclib.sdf.operator.SDFSmoothUnion 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;
}
use of ru.bclib.sdf.operator.SDFSmoothUnion in project EdenRing by paulevsGitch.
the class IslandTypes method makeDoubleConeIsland.
private static BiFunction<LayerOptions, Random, SDF> makeDoubleConeIsland() {
SDF cone1 = makeCone(0, 0.4F, 0.2F, -0.3F);
SDF cone2 = makeCone(0.4F, 0.5F, 0.1F, -0.1F);
SDF cone3 = makeCone(0.5F, 0.45F, 0.03F, 0.0F);
SDF cone4 = makeCone(0.45F, 0, 0.02F, 0.03F);
SDF cone5 = makeCone(0.35F, 0.12F, 0.15F, 0.03F);
SDF cone6 = makeCone(0.12F, 0.0F, 0.15F, 0.18F);
SDF coneBottom = new SDFSmoothUnion().setRadius(0.02F).setSourceA(cone1).setSourceB(cone2);
SDF coneTop = new SDFSmoothUnion().setRadius(0.02F).setSourceA(cone3).setSourceB(cone4);
final SDF merged = new SDFSmoothUnion().setRadius(0.02F).setSourceA(coneTop).setSourceB(coneBottom);
final SDF mountain = new SDFSmoothUnion().setRadius(0.02F).setSourceA(cone5).setSourceB(cone6);
return (options, random) -> {
final OpenSimplexNoise noise1 = new OpenSimplexNoise(random.nextInt());
final OpenSimplexNoise noise2 = new OpenSimplexNoise(random.nextInt());
final float scale1 = options.scale * 0.0125F;
final float scale2 = options.scale * 0.025F;
final float scale3 = options.scale * 0.05F;
final float scale4 = options.scale * 0.1F;
final float islandScale = random.nextFloat() + 0.5F;
SDF islandBottom = new SDFScale().setScale(islandScale).setSource(merged);
islandBottom = new SDFCoordModify().setFunction(pos -> {
float x1 = pos.x() * scale1;
float z1 = pos.z() * scale1;
float x2 = pos.x() * scale2;
float z2 = pos.z() * scale2;
float x3 = pos.x() * scale3;
float z3 = pos.z() * scale3;
float dx = (float) noise1.eval(x1, z1) * 20 + (float) noise2.eval(x2, z2) * 10;
float dy = (float) noise1.eval(x3, z3) * 6 + (float) noise2.eval(x3, z3) * 3;
float dz = (float) noise2.eval(x1, z1) * 20 + (float) noise1.eval(x2, z2) * 10;
// float scaleY = 1.0F - MHelper.length(pos.x(), pos.z()) / islandScale;
pos.set(pos.x() + dx / options.scale, pos.y() + dy / /* * scaleY*/
options.scale, pos.z() + dz / options.scale);
}).setSource(islandBottom);
SDF islandTop = new SDFScale().setScale(islandScale).setSource(mountain);
islandTop = new SDFCoordModify().setFunction(pos -> {
float x1 = pos.x() * scale1;
float z1 = pos.z() * scale1;
float x2 = pos.x() * scale2;
float z2 = pos.z() * scale2;
float x3 = pos.x() * scale3;
float z3 = pos.z() * scale3;
float x4 = pos.x() * scale4;
float z4 = pos.z() * scale4;
float dx = (float) noise1.eval(x1, z1) * 20 + (float) noise2.eval(x2, z2) * 10;
float dy = (float) noise1.eval(x3, z3) * 15 + (float) noise2.eval(x3, z3) * 8 + (float) noise1.eval(x4, z4) * 3;
float dz = (float) noise2.eval(x1, z1) * 20 + (float) noise1.eval(x2, z2) * 10;
pos.set(pos.x() + dx / options.scale, pos.y() + dy / options.scale, pos.z() + dz / options.scale);
}).setSource(islandTop);
return new SDFSmoothUnion().setRadius(0.02F).setSourceA(islandBottom).setSourceB(islandTop);
};
}
Aggregations