77 lines
2.5 KiB
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());
|
|
});
|
|
}
|
|
}
|