use of ru.bclib.sdf.SDF in project BCLib by paulevsGitch.
the class SplineHelper method buildSDF.
public static SDF buildSDF(List<Vector3f> spline, Function<Float, Float> radiusFunction, Function<BlockPos, BlockState> placerFunction) {
int count = spline.size();
float max = count - 2;
SDF result = null;
Vector3f start = spline.get(0);
for (int i = 1; i < count; i++) {
Vector3f pos = spline.get(i);
float delta = (float) (i - 1) / max;
SDF line = new SDFLine().setRadius(radiusFunction.apply(delta)).setStart(start.x(), start.y(), start.z()).setEnd(pos.x(), pos.y(), pos.z()).setBlock(placerFunction);
result = result == null ? line : new SDFUnion().setSourceA(result).setSourceB(line);
start = pos;
}
return result;
}
use of ru.bclib.sdf.SDF 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.SDF 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;
};
}
use of ru.bclib.sdf.SDF 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.SDF in project BCLib by paulevsGitch.
the class SplineHelper method buildSDF.
public static SDF buildSDF(List<Vector3f> spline, float radius1, float radius2, Function<BlockPos, BlockState> placerFunction) {
int count = spline.size();
float max = count - 2;
SDF result = null;
Vector3f start = spline.get(0);
for (int i = 1; i < count; i++) {
Vector3f pos = spline.get(i);
float delta = (float) (i - 1) / max;
SDF line = new SDFLine().setRadius(Mth.lerp(delta, radius1, radius2)).setStart(start.x(), start.y(), start.z()).setEnd(pos.x(), pos.y(), pos.z()).setBlock(placerFunction);
result = result == null ? line : new SDFUnion().setSourceA(result).setSourceB(line);
start = pos;
}
return result;
}
Aggregations