rework image stuff

This commit is contained in:
dfsek 2021-01-07 22:04:35 -07:00
parent 308ba887a3
commit 28b6fe49bb
28 changed files with 1025 additions and 1028 deletions

View File

@ -1,6 +1,6 @@
package com.dfsek.terra.api.math;
import com.dfsek.terra.api.math.noise.FastNoiseLite;
import com.dfsek.terra.api.math.noise.samplers.NoiseSampler;
import com.dfsek.terra.api.world.biome.NormalizationUtil;
import java.util.HashSet;
@ -35,7 +35,7 @@ public class ProbabilityCollection<E> {
return (E) array[r.nextInt(array.length)];
}
public E get(FastNoiseLite n, double x, double z) {
public E get(NoiseSampler n, double x, double z) {
if(array.length == 0) return null;
return (E) array[NormalizationUtil.normalize(n.getNoise(x, z), array.length, 1)];
}

View File

@ -1,5 +1,6 @@
package com.dfsek.terra.api.math.noise;
import com.dfsek.terra.api.math.noise.samplers.NoiseSampler;
import com.dfsek.terra.generation.config.NoiseBuilder;
import com.dfsek.terra.util.hash.HashMapDoubleDouble;
import parsii.eval.Expression;
@ -7,7 +8,7 @@ import parsii.eval.Expression;
import java.util.List;
public class NoiseFunction2 implements NoiseFunction {
private final FastNoiseLite gen;
private final NoiseSampler gen;
private final Cache cache = new Cache();
public NoiseFunction2(long seed, NoiseBuilder builder) {
@ -43,7 +44,7 @@ public class NoiseFunction2 implements NoiseFunction {
private static final long serialVersionUID = 8915092734723467010L;
private static final int cacheSize = 384;
public double get(FastNoiseLite noise, double x, double z) {
public double get(NoiseSampler noise, double x, double z) {
double xx = x >= 0 ? x * 2 : x * -2 - 1;
double zz = z >= 0 ? z * 2 : z * -2 - 1;
double key = (xx >= zz) ? (xx * xx + xx + zz) : (zz * zz + xx);

View File

@ -1,12 +1,13 @@
package com.dfsek.terra.api.math.noise;
import com.dfsek.terra.api.math.noise.samplers.NoiseSampler;
import com.dfsek.terra.generation.config.NoiseBuilder;
import parsii.eval.Expression;
import java.util.List;
public class NoiseFunction3 implements NoiseFunction {
private final FastNoiseLite gen;
private final NoiseSampler gen;
public NoiseFunction3(long seed, NoiseBuilder builder) {
this.gen = builder.build((int) seed);

View File

@ -0,0 +1,28 @@
package com.dfsek.terra.api.math.noise.samplers;
import com.dfsek.terra.api.math.vector.Vector2;
import com.dfsek.terra.api.math.vector.Vector3;
public interface NoiseSampler {
/**
* 2D noise at given position using current settings
* <p>
* Noise output bounded between -1...1
*/
double getNoise(/*FNLdouble*/ double x, /*FNLdouble*/ double y);
/**
* 3D noise at given position using current settings
* <p>
* Noise output bounded between -1...1
*/
double getNoise(/*FNLdouble*/ double x, /*FNLdouble*/ double y, /*FNLdouble*/ double z);
default double getNoise(Vector3 vector3) {
return getNoise(vector3.getX(), vector3.getY(), vector3.getZ());
}
default double getNoise(Vector2 vector2) {
return getNoise(vector2.getX(), vector2.getZ());
}
}

View File

@ -0,0 +1,21 @@
package com.dfsek.terra.api.math.noise.samplers;
public abstract class Normalizer implements NoiseSampler {
private final NoiseSampler sampler;
protected Normalizer(NoiseSampler sampler) {
this.sampler = sampler;
}
public abstract double normalize(double in);
@Override
public double getNoise(double x, double y) {
return normalize(sampler.getNoise(x, y));
}
@Override
public double getNoise(double x, double y, double z) {
return normalize(sampler.getNoise(x, y, z));
}
}

View File

@ -172,6 +172,12 @@ public class Vector2 implements Cloneable {
}
}
public Vector2 add(double x, double z) {
this.x += x;
this.z += z;
return this;
}
@Override
public String toString() {
return "(" + x + ", " + z + ")";

View File

@ -1,10 +1,10 @@
package com.dfsek.terra.api.math.voxel;
import com.dfsek.terra.api.math.noise.FastNoiseLite;
import com.dfsek.terra.api.math.noise.samplers.NoiseSampler;
import com.dfsek.terra.api.math.vector.Vector3;
public class DeformedSphere extends VoxelGeometry {
public DeformedSphere(Vector3 start, int rad, double deform, FastNoiseLite noise) {
public DeformedSphere(Vector3 start, int rad, double deform, NoiseSampler noise) {
for(int x = -rad; x <= rad; x++) {
for(int y = -rad; y <= rad; y++) {
for(int z = -rad; z <= rad; z++) {

View File

@ -1,6 +1,6 @@
package com.dfsek.terra.api.world.biome;
import com.dfsek.terra.api.math.noise.FastNoiseLite;
import com.dfsek.terra.api.math.noise.samplers.FastNoiseLite;
import com.dfsek.terra.api.math.vector.Location;
import com.dfsek.terra.api.world.generation.GenerationPhase;

View File

@ -1,7 +1,7 @@
package com.dfsek.terra.api.world.palette;
import com.dfsek.terra.api.math.ProbabilityCollection;
import com.dfsek.terra.api.math.noise.FastNoiseLite;
import com.dfsek.terra.api.math.noise.samplers.NoiseSampler;
import com.dfsek.terra.api.util.GlueList;
import java.util.List;
@ -104,7 +104,7 @@ public abstract class Palette<E> {
return m;
}
public E get(FastNoiseLite random, int x, int z) {
public E get(NoiseSampler random, int x, int z) {
if(col) return this.collection.get(random, x, z);
return m;
}

View File

@ -1,13 +1,13 @@
package com.dfsek.terra.api.world.palette;
import com.dfsek.terra.api.math.noise.FastNoiseLite;
import com.dfsek.terra.api.math.noise.samplers.NoiseSampler;
import java.util.List;
public class SimplexPalette<E> extends Palette<E> {
private final FastNoiseLite r;
private final NoiseSampler r;
public SimplexPalette(FastNoiseLite r) {
public SimplexPalette(NoiseSampler r) {
this.r = r;
}

View File

@ -1,6 +1,6 @@
package com.dfsek.terra.biome;
import com.dfsek.terra.api.math.noise.FastNoiseLite;
import com.dfsek.terra.api.math.noise.samplers.FastNoiseLite;
import com.dfsek.terra.api.world.biome.BiomeGrid;
import com.dfsek.terra.api.world.biome.NormalizationUtil;
import com.dfsek.terra.config.base.ConfigPack;
@ -42,7 +42,7 @@ public class BiomeZone {
* @return BiomeGrid at coordinates.
*/
public BiomeGrid getGrid(int x, int z) {
return grids[NormalizationUtil.normalize(useImage ? Objects.requireNonNull(imageLoader).getNoiseVal(x, z, channel) : noise.getNoise(x, z), grids.length, 4)];
return grids[getNoise(x, z)];
}
/**
@ -62,7 +62,7 @@ public class BiomeZone {
* @return Normalized noise at coordinates
*/
public int getNoise(int x, int z) {
return NormalizationUtil.normalize(useImage ? Objects.requireNonNull(imageLoader).getNoiseVal(x, z, channel) : noise.getNoise(x, z), grids.length, 4);
return useImage ? Objects.requireNonNull(imageLoader).getNoiseVal(x, z, getSize() - 1, channel) : NormalizationUtil.normalize(noise.getNoise(x, z), grids.length, 4);
}
/**
@ -73,6 +73,6 @@ public class BiomeZone {
* @return Raw noise at coordinates
*/
public double getRawNoise(int x, int z) {
return useImage ? Objects.requireNonNull(imageLoader).getNoiseVal(x, z, channel) : noise.getNoise(x, z);
return useImage ? Objects.requireNonNull(imageLoader).getNoiseVal(x, z, getSize() - 1, channel) : noise.getNoise(x, z);
}
}

View File

@ -3,7 +3,6 @@ package com.dfsek.terra.biome.grid;
import com.dfsek.terra.api.math.vector.Location;
import com.dfsek.terra.api.world.biome.Biome;
import com.dfsek.terra.api.world.biome.BiomeGrid;
import com.dfsek.terra.api.world.biome.NormalizationUtil;
import com.dfsek.terra.api.world.generation.GenerationPhase;
import com.dfsek.terra.config.base.ConfigPack;
import com.dfsek.terra.config.base.ConfigPackTemplate;
@ -28,9 +27,9 @@ public class UserDefinedGrid extends BiomeGrid {
@Override
public Biome getBiome(int x, int z, GenerationPhase phase) {
if(fromImage) {
double xi = imageLoader.getNoiseVal(x, z, channelX);
double zi = imageLoader.getNoiseVal(x, z, channelZ);
return super.getGrid()[NormalizationUtil.normalize(xi, getSizeX(), 4)][NormalizationUtil.normalize(zi, getSizeZ(), 4)];
int xi = imageLoader.getNoiseVal(x, z, getSizeX() - 1, channelX);
int zi = imageLoader.getNoiseVal(x, z, getSizeZ() - 1, channelZ);
return super.getGrid()[xi][zi];
}
return super.getBiome(x, z, phase);
}

View File

@ -1,6 +1,6 @@
package com.dfsek.terra.biome.postprocessing;
import com.dfsek.terra.api.math.noise.FastNoiseLite;
import com.dfsek.terra.api.math.noise.samplers.FastNoiseLite;
import com.dfsek.terra.api.math.vector.Vector2;
/**

View File

@ -1,6 +1,7 @@
package com.dfsek.terra.biome.postprocessing;
import com.dfsek.terra.api.math.noise.FastNoiseLite;
import com.dfsek.terra.api.math.noise.samplers.FastNoiseLite;
import com.dfsek.terra.api.math.noise.samplers.NoiseSampler;
import net.jafama.FastMath;
/**
@ -8,7 +9,7 @@ import net.jafama.FastMath;
*/
public class ErosionNoise {
private final double thresh;
private final FastNoiseLite noise;
private final NoiseSampler noise;
public ErosionNoise(double freq1, double thresh, int octaves, long seed) {
FastNoiseLite main = new FastNoiseLite((int) (seed + 1));

View File

@ -1,6 +1,6 @@
package com.dfsek.terra.config.factories;
import com.dfsek.terra.api.math.noise.FastNoiseLite;
import com.dfsek.terra.api.math.noise.samplers.FastNoiseLite;
import com.dfsek.terra.api.platform.TerraPlugin;
import com.dfsek.terra.api.platform.block.BlockData;
import com.dfsek.terra.api.util.FastRandom;

View File

@ -5,7 +5,7 @@ import com.dfsek.tectonic.loading.ConfigLoader;
import com.dfsek.tectonic.loading.TypeLoader;
import com.dfsek.terra.api.math.ProbabilityCollection;
import com.dfsek.terra.api.math.Range;
import com.dfsek.terra.api.math.noise.FastNoiseLite;
import com.dfsek.terra.api.math.noise.samplers.FastNoiseLite;
import com.dfsek.terra.api.world.flora.Flora;
import com.dfsek.terra.config.loaders.Types;
import com.dfsek.terra.population.items.flora.FloraLayer;

View File

@ -5,7 +5,7 @@ import com.dfsek.tectonic.exception.ConfigException;
import com.dfsek.tectonic.exception.LoadException;
import com.dfsek.tectonic.loading.ConfigLoader;
import com.dfsek.tectonic.loading.TypeLoader;
import com.dfsek.terra.api.math.noise.FastNoiseLite;
import com.dfsek.terra.api.math.noise.samplers.FastNoiseLite;
import com.dfsek.terra.generation.config.NoiseBuilder;
import java.lang.reflect.Type;

View File

@ -5,7 +5,7 @@ import com.dfsek.tectonic.loading.ConfigLoader;
import com.dfsek.tectonic.loading.TypeLoader;
import com.dfsek.terra.api.math.ProbabilityCollection;
import com.dfsek.terra.api.math.Range;
import com.dfsek.terra.api.math.noise.FastNoiseLite;
import com.dfsek.terra.api.math.noise.samplers.FastNoiseLite;
import com.dfsek.terra.api.world.tree.Tree;
import com.dfsek.terra.config.loaders.Types;
import com.dfsek.terra.population.items.tree.TreeLayer;

View File

@ -3,7 +3,8 @@ package com.dfsek.terra.generation.config;
import com.dfsek.tectonic.annotations.Default;
import com.dfsek.tectonic.annotations.Value;
import com.dfsek.tectonic.config.ConfigTemplate;
import com.dfsek.terra.api.math.noise.FastNoiseLite;
import com.dfsek.terra.api.math.noise.samplers.FastNoiseLite;
import com.dfsek.terra.api.math.noise.samplers.NoiseSampler;
public class NoiseBuilder implements ConfigTemplate {
@Value("type")
@ -70,7 +71,7 @@ public class NoiseBuilder implements ConfigTemplate {
@Default
private int dimensions = 2;
public FastNoiseLite build(int seed) {
public NoiseSampler build(int seed) {
FastNoiseLite noise = new FastNoiseLite(seed + seedOffset);
if(!fractalType.equals(FastNoiseLite.FractalType.None)) {
noise.setFractalType(fractalType);

View File

@ -15,7 +15,6 @@ import java.io.File;
import java.io.IOException;
public class ImageLoader {
private static final double INVERSE_ROOT_2 = 0.7071067811865475;
private final BufferedImage image;
private final Align align;
@ -35,7 +34,7 @@ public class ImageLoader {
private static BufferedImage redrawStepped(BufferedImage original, World w, Align align, TerraPlugin main) {
BufferedImage newImg = copyImage(original);
TerraBiomeGrid tb = main.getWorld(w).getGrid();
BiomeZone z = main.getWorld(w).getZone();
BiomeZone zone = main.getWorld(w).getZone();
for(int x = 0; x < newImg.getWidth(); x++) {
for(int y = 0; y < newImg.getHeight(); y++) {
double[] noise;
@ -44,13 +43,17 @@ public class ImageLoader {
else noise = tb.getGrid(x, y).getRawNoise(x, y);
newImg.setRGB(x, y, new Color((int) (NormalizationUtil.normalize(noise[0], tb.getGrid(x, y).getSizeX(), 4) * ((double) 255 / tb.getGrid(x, y).getSizeX())),
(int) (NormalizationUtil.normalize(noise[1], tb.getGrid(x, y).getSizeZ(), 4) * ((double) 255 / tb.getGrid(x, y).getSizeZ())),
(int) (NormalizationUtil.normalize(z.getNoise(x, y), z.getSize(), 4) * ((double) 255 / z.getSize())))
(int) (NormalizationUtil.normalize(zone.getNoise(x, y), zone.getSize(), 4) * ((double) 255 / zone.getSize())))
.getRGB());
}
}
return newImg;
}
private static int normal(double val) {
return FastMath.floorToInt(FastMath.min(FastMath.max(val, 255), 0));
}
private static BufferedImage copyImage(BufferedImage source) {
BufferedImage b = new BufferedImage(source.getWidth(), source.getHeight(), source.getType());
Graphics g = b.getGraphics();
@ -69,8 +72,8 @@ public class ImageLoader {
debugGUI.start();
}
public double getNoiseVal(int x, int y, Channel channel) {
return ((double) (getChannel(x, y, channel) - 128) / 128) * INVERSE_ROOT_2;
public int getNoiseVal(int x, int y, int size, Channel channel) {
return (size * getChannel(x, y, channel)) / 255;
}
public int getChannel(int x, int y, Channel channel) {

View File

@ -2,7 +2,7 @@ package com.dfsek.terra.population.items;
import com.dfsek.terra.api.math.ProbabilityCollection;
import com.dfsek.terra.api.math.Range;
import com.dfsek.terra.api.math.noise.FastNoiseLite;
import com.dfsek.terra.api.math.noise.samplers.NoiseSampler;
import com.dfsek.terra.api.math.vector.Vector2;
import com.dfsek.terra.api.platform.world.Chunk;
@ -12,16 +12,16 @@ public abstract class PlaceableLayer<T> {
protected final double density;
protected final Range level;
protected final ProbabilityCollection<T> layer;
protected final FastNoiseLite noise;
protected final NoiseSampler noise;
public PlaceableLayer(double density, Range level, ProbabilityCollection<T> layer, FastNoiseLite noise) {
public PlaceableLayer(double density, Range level, ProbabilityCollection<T> layer, NoiseSampler noise) {
this.density = density;
this.level = level;
this.layer = layer;
this.noise = noise;
}
public FastNoiseLite getNoise() {
public NoiseSampler getNoise() {
return noise;
}

View File

@ -2,7 +2,7 @@ package com.dfsek.terra.population.items.flora;
import com.dfsek.terra.api.math.ProbabilityCollection;
import com.dfsek.terra.api.math.Range;
import com.dfsek.terra.api.math.noise.FastNoiseLite;
import com.dfsek.terra.api.math.noise.samplers.NoiseSampler;
import com.dfsek.terra.api.math.vector.Vector2;
import com.dfsek.terra.api.platform.world.Chunk;
import com.dfsek.terra.api.world.flora.Flora;
@ -12,7 +12,7 @@ import java.util.Random;
public class FloraLayer extends PlaceableLayer<Flora> {
public FloraLayer(double density, Range level, ProbabilityCollection<Flora> layer, FastNoiseLite noise) {
public FloraLayer(double density, Range level, ProbabilityCollection<Flora> layer, NoiseSampler noise) {
super(density, level, layer, noise);
}

View File

@ -1,7 +1,7 @@
package com.dfsek.terra.population.items.ores;
import com.dfsek.terra.api.math.Range;
import com.dfsek.terra.api.math.noise.FastNoiseLite;
import com.dfsek.terra.api.math.noise.samplers.FastNoiseLite;
import com.dfsek.terra.api.math.vector.Vector3;
import com.dfsek.terra.api.platform.TerraPlugin;
import com.dfsek.terra.api.platform.block.Block;

View File

@ -2,7 +2,7 @@ package com.dfsek.terra.population.items.tree;
import com.dfsek.terra.api.math.ProbabilityCollection;
import com.dfsek.terra.api.math.Range;
import com.dfsek.terra.api.math.noise.FastNoiseLite;
import com.dfsek.terra.api.math.noise.samplers.NoiseSampler;
import com.dfsek.terra.api.math.vector.Vector2;
import com.dfsek.terra.api.platform.block.Block;
import com.dfsek.terra.api.platform.block.BlockFace;
@ -14,7 +14,7 @@ import java.util.Random;
public class TreeLayer extends PlaceableLayer<Tree> {
public TreeLayer(double density, Range level, ProbabilityCollection<Tree> layer, FastNoiseLite noise) {
public TreeLayer(double density, Range level, ProbabilityCollection<Tree> layer, NoiseSampler noise) {
super(density, level, layer, noise);
}

View File

@ -1,6 +1,6 @@
package com.dfsek.terra.bukkit.command.command.geometry;
import com.dfsek.terra.api.math.noise.FastNoiseLite;
import com.dfsek.terra.api.math.noise.samplers.FastNoiseLite;
import com.dfsek.terra.api.math.vector.Vector3;
import com.dfsek.terra.api.math.voxel.DeformedSphere;
import com.dfsek.terra.bukkit.BukkitCommandSender;

View File

@ -1,6 +1,9 @@
package com.dfsek.terra.bukkit.command.command.image.gui;
import com.dfsek.terra.bukkit.command.DebugCommand;
import com.dfsek.terra.bukkit.command.WorldCommand;
import com.dfsek.terra.bukkit.world.BukkitAdapter;
import com.dfsek.terra.image.ImageLoader;
import org.bukkit.World;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
@ -10,23 +13,16 @@ import org.jetbrains.annotations.NotNull;
import java.util.Collections;
import java.util.List;
public class RawGUICommand extends WorldCommand {
public class RawGUICommand extends WorldCommand implements DebugCommand {
public RawGUICommand(com.dfsek.terra.bukkit.command.Command parent) {
super(parent);
}
@Override
public boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String label, @NotNull String[] args, World world) {
/*
if(!getMain().isDebug()) {
LangUtil.send("command.image.gui.debug", sender);
return true;
}
ImageLoader loader = ((TerraBukkitPlugin) getMain()).getWorld(world).getConfig().getTemplate().getImageLoader();
if(loader != null) loader.debug(false, sender.getWorld(), (TerraBukkitPlugin) getMain());
else ImageLoader.debugWorld(false, world, (TerraBukkitPlugin) getMain());
*/
ImageLoader loader = getMain().getWorld(BukkitAdapter.adapt(world)).getConfig().getTemplate().getImageLoader();
if(loader != null) loader.debug(false, BukkitAdapter.adapt(sender.getWorld()), getMain());
else ImageLoader.debugWorld(false, BukkitAdapter.adapt(world), getMain());
return true;
}

View File

@ -1,6 +1,9 @@
package com.dfsek.terra.bukkit.command.command.image.gui;
import com.dfsek.terra.bukkit.command.DebugCommand;
import com.dfsek.terra.bukkit.command.WorldCommand;
import com.dfsek.terra.bukkit.world.BukkitAdapter;
import com.dfsek.terra.image.ImageLoader;
import org.bukkit.World;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
@ -10,23 +13,16 @@ import org.jetbrains.annotations.NotNull;
import java.util.Collections;
import java.util.List;
public class StepGUICommand extends WorldCommand {
public class StepGUICommand extends WorldCommand implements DebugCommand {
public StepGUICommand(com.dfsek.terra.bukkit.command.Command parent) {
super(parent);
}
@Override
public boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String label, @NotNull String[] args, World world) {
/*
if(!getMain().isDebug()) {
LangUtil.send("command.image.gui.debug", sender);
return true;
}
ImageLoader loader = ((TerraBukkitPlugin) getMain()).getWorld(world).getConfig().getTemplate().getImageLoader();
if(loader != null) loader.debug(true, sender.getWorld(), (TerraBukkitPlugin) getMain());
else ImageLoader.debugWorld(true, world, (TerraBukkitPlugin) getMain());
*/
ImageLoader loader = (getMain()).getWorld(BukkitAdapter.adapt(world)).getConfig().getTemplate().getImageLoader();
if(loader != null) loader.debug(true, BukkitAdapter.adapt(sender.getWorld()), getMain());
else ImageLoader.debugWorld(true, BukkitAdapter.adapt(world), getMain());
return true;
}