mirror of
https://github.com/PolyhedralDev/Terra.git
synced 2026-04-23 16:49:10 +00:00
Implement DerivateNoiseFunction
This commit is contained in:
@@ -7,7 +7,7 @@ import com.dfsek.terra.addons.noise.config.templates.SamplerTemplate;
|
|||||||
import com.dfsek.terra.addons.noise.samplers.noise.simplex.DerivativeFractal;
|
import com.dfsek.terra.addons.noise.samplers.noise.simplex.DerivativeFractal;
|
||||||
|
|
||||||
|
|
||||||
public class DerivativeFractalTemplate extends SamplerTemplate<DerivativeFractal> {
|
public class DerivativeFractalTemplate extends DerivativeNoiseTemplate<DerivativeFractal> {
|
||||||
|
|
||||||
@Value("octaves")
|
@Value("octaves")
|
||||||
@Default
|
@Default
|
||||||
@@ -21,12 +21,11 @@ public class DerivativeFractalTemplate extends SamplerTemplate<DerivativeFractal
|
|||||||
@Default
|
@Default
|
||||||
private double lacunarity = 2.0;
|
private double lacunarity = 2.0;
|
||||||
|
|
||||||
@Value("frequency")
|
|
||||||
@Default
|
|
||||||
private double frequency = 0.02;
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public DerivativeFractal get() {
|
public DerivativeFractal get() {
|
||||||
return new DerivativeFractal(octaves, gain, lacunarity, frequency);
|
DerivativeFractal derivativeFractal = new DerivativeFractal(octaves, gain, lacunarity);
|
||||||
|
derivativeFractal.setFrequency(frequency);
|
||||||
|
derivativeFractal.setSalt(salt);
|
||||||
|
return derivativeFractal;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,8 @@
|
|||||||
|
package com.dfsek.terra.addons.noise.config.templates.noise;
|
||||||
|
|
||||||
|
import com.dfsek.terra.addons.noise.samplers.noise.DerivativeNoiseFunction;
|
||||||
|
|
||||||
|
|
||||||
|
public abstract class DerivativeNoiseTemplate<T extends DerivativeNoiseFunction> extends NoiseTemplate<T> {
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
package com.dfsek.terra.addons.noise.samplers.noise;
|
||||||
|
|
||||||
|
import com.dfsek.terra.api.noise.DerivativeNoiseSampler;
|
||||||
|
|
||||||
|
public abstract class DerivativeNoiseFunction extends NoiseFunction implements DerivativeNoiseSampler {
|
||||||
|
@Override
|
||||||
|
public boolean isDifferentiable() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public double[] noised(long seed, double x, double y) {
|
||||||
|
return getNoiseDerivativeRaw(seed + salt, x * frequency, y * frequency);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public double[] noised(long seed, double x, double y, double z) {
|
||||||
|
return getNoiseDerivativeRaw(seed + salt, x * frequency, y * frequency, z * frequency);
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract double[] getNoiseDerivativeRaw(long seed, double x, double y);
|
||||||
|
|
||||||
|
public abstract double[] getNoiseDerivativeRaw(long seed, double x, double y, double z);
|
||||||
|
}
|
||||||
@@ -1,29 +1,49 @@
|
|||||||
package com.dfsek.terra.addons.noise.samplers.noise.simplex;
|
package com.dfsek.terra.addons.noise.samplers.noise.simplex;
|
||||||
|
|
||||||
import com.dfsek.terra.api.noise.DerivativeNoiseSampler;
|
import com.dfsek.terra.addons.noise.samplers.noise.DerivativeNoiseFunction;
|
||||||
|
|
||||||
import static com.dfsek.terra.addons.noise.samplers.noise.simplex.PseudoErosion.dot;
|
import static com.dfsek.terra.addons.noise.samplers.noise.simplex.PseudoErosion.dot;
|
||||||
import static com.dfsek.terra.addons.noise.samplers.noise.simplex.PseudoErosion.hash;
|
|
||||||
import static com.dfsek.terra.addons.noise.samplers.noise.simplex.PseudoErosion.hashX;
|
|
||||||
import static com.dfsek.terra.addons.noise.samplers.noise.simplex.PseudoErosion.hashY;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Temporary sampler that provides derivatives to test pseudoerosion, should be replaced with
|
* Temporary sampler that provides derivatives to test pseudoerosion, should be replaced with
|
||||||
* derivative versions of existing samplers
|
* derivative versions of existing samplers
|
||||||
*/
|
*/
|
||||||
public class DerivativeFractal implements DerivativeNoiseSampler {
|
public class DerivativeFractal extends DerivativeNoiseFunction {
|
||||||
|
|
||||||
private final int heightOctaves;
|
private final int heightOctaves;
|
||||||
private final double heightGain;
|
private final double heightGain;
|
||||||
private final double heightLacunarity;
|
private final double heightLacunarity;
|
||||||
private final double frequency;
|
private static final float HASH_X = 0.3183099f;
|
||||||
|
private static final float HASH_Y = 0.3678794f;
|
||||||
|
|
||||||
public DerivativeFractal(int octaves, double gain, double lacunarity, double frequency) {
|
public DerivativeFractal(int octaves, double gain, double lacunarity) {
|
||||||
this.heightOctaves = octaves;
|
this.heightOctaves = octaves;
|
||||||
this.heightGain = gain;
|
this.heightGain = gain;
|
||||||
this.heightLacunarity = lacunarity;
|
this.heightLacunarity = lacunarity;
|
||||||
this.frequency = frequency;
|
}
|
||||||
|
|
||||||
|
public static float hash(float x, float y) {
|
||||||
|
float xx = x * HASH_X + HASH_Y;
|
||||||
|
float yy = y * HASH_Y + HASH_X;
|
||||||
|
|
||||||
|
// Swapped the components here
|
||||||
|
return 16 * (xx * yy * (xx + yy));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static float hashX(float n) {
|
||||||
|
// Swapped the components here
|
||||||
|
float nx = HASH_X * n;
|
||||||
|
return -1.0f + 2.0f * fract(nx);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static float hashY(float n) {
|
||||||
|
float ny = HASH_Y * n;
|
||||||
|
return -1.0f + 2.0f * fract(ny);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static float fract(float x) {
|
||||||
|
return (x - (float)Math.floor(x));
|
||||||
}
|
}
|
||||||
|
|
||||||
private static float[] baseNoise(float px, float py) {
|
private static float[] baseNoise(float px, float py) {
|
||||||
@@ -65,14 +85,7 @@ public class DerivativeFractal implements DerivativeNoiseSampler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isDifferentiable() {
|
public double[] getNoiseDerivativeRaw(long seed, double x, double y) {
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public double[] noised(long seed, double x, double y) {
|
|
||||||
x *= frequency;
|
|
||||||
y *= frequency;
|
|
||||||
double[] out = { 0.0f, 0.0f, 0.0f };
|
double[] out = { 0.0f, 0.0f, 0.0f };
|
||||||
float heightFreq = 1.0f;
|
float heightFreq = 1.0f;
|
||||||
float heightAmp = 1f;
|
float heightAmp = 1f;
|
||||||
@@ -93,17 +106,17 @@ public class DerivativeFractal implements DerivativeNoiseSampler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double[] noised(long seed, double x, double y, double z) {
|
public double[] getNoiseDerivativeRaw(long seed, double x, double y, double z) {
|
||||||
return noised(seed, x, z);
|
return getNoiseDerivativeRaw(seed, x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double noise(long seed, double x, double y) {
|
public double getNoiseRaw(long seed, double x, double y) {
|
||||||
return noised(seed, x, y)[0];
|
return getNoiseDerivativeRaw(seed, x, y)[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double noise(long seed, double x, double y, double z) {
|
public double getNoiseRaw(long seed, double x, double y, double z) {
|
||||||
return noised(seed, x, y, z)[0];
|
return getNoiseRaw(seed, x, y);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user