TerraForged/TerraForgedCore/src/main/java/com/terraforged/core/util/points/Poisson.java

77 lines
2.5 KiB
Java

package com.terraforged.core.util.points;
import com.terraforged.core.cell.Cell;
import com.terraforged.core.region.Region;
import me.dags.noise.Module;
import me.dags.noise.Source;
import me.dags.noise.util.Vec2i;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
public class Poisson {
public static void main(String[] args) {
Region region = new Region(0, 0, 5, 2);
BufferedImage image = new BufferedImage(region.getBlockSize().size, region.getBlockSize().size, BufferedImage.TYPE_INT_RGB);
points(region, 123,8, 20F, 0.8F);
render(region, image);
JFrame frame = new JFrame();
frame.add(new JLabel(new ImageIcon(image)));
frame.pack();
frame.setVisible(true);
frame.setResizable(false);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
private static void points(Region region, int seed, int scale, float radius, float threshold) {
region.generate(chunk -> chunk.generate((cell, dx, dz) -> {}));
Module noise = Source.simplex(seed, scale, 1);
int gridSize = (int) Math.ceil(region.getBlockSize().size / radius);
Vec2i[][] grid = new Vec2i[gridSize][gridSize];
for (int dz = 0; dz < region.getBlockSize().size; dz++) {
for (int dx = 0; dx < region.getBlockSize().size; dx++) {
int x = region.getBlockX() + dx;
int z = region.getBlockZ() + dz;
float value = noise.getValue(x, z);
region.getCell(dx, dz).value = value;
if (true) continue;
if (value > threshold) {
continue;
}
int gridX = (int) (dx / radius);
int gridZ = (int) (dz / radius);
Vec2i point = grid[gridZ][gridX];
if (point != null) {
Cell<?> current = region.getCell(point.x, point.y);
if (current.value > value) {
continue;
}
}
region.getCell(dx, dz).value = value;
grid[gridZ][gridX] = new Vec2i(dx, dz);
}
}
}
private static void render(Region region, BufferedImage image) {
region.iterate((cell, dx, dz) -> {
if (cell.value == 0) {
return;
}
int w = (int) (cell.value * 255);
image.setRGB(dx, dz, new Color(w, w, w).getRGB());
});
}
}