mirror of
https://github.com/VolmitSoftware/Iris.git
synced 2025-07-18 18:23:06 +00:00
Positional iris features
This commit is contained in:
parent
f7e379c83f
commit
38d0894c36
164
src/main/java/com/volmit/iris/object/IrisFeaturePositional.java
Normal file
164
src/main/java/com/volmit/iris/object/IrisFeaturePositional.java
Normal file
@ -0,0 +1,164 @@
|
||||
package com.volmit.iris.object;
|
||||
|
||||
import com.google.gson.Gson;
|
||||
import com.volmit.iris.scaffold.cache.AtomicCache;
|
||||
import com.volmit.iris.util.*;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.io.DataInputStream;
|
||||
import java.io.DataOutputStream;
|
||||
import java.io.IOException;
|
||||
|
||||
@Data
|
||||
@DontObfuscate
|
||||
@NoArgsConstructor
|
||||
@Desc("Represents an Iris zone")
|
||||
public class IrisFeaturePositional {
|
||||
public IrisFeaturePositional(int x, int z, IrisFeature feature)
|
||||
{
|
||||
this.x = x;
|
||||
this.z = z;
|
||||
this.feature = feature;
|
||||
}
|
||||
|
||||
@Required
|
||||
@DontObfuscate
|
||||
@Desc("The x coordinate of this zone")
|
||||
private int x;
|
||||
|
||||
@Required
|
||||
@DontObfuscate
|
||||
@Desc("The z coordinate of this zone")
|
||||
private int z;
|
||||
|
||||
@Required
|
||||
@DontObfuscate
|
||||
@Desc("The Terrain Feature to apply")
|
||||
private IrisFeature feature;
|
||||
|
||||
private transient AtomicCache<NoiseProvider> provider = new AtomicCache<>();
|
||||
private transient AtomicCache<Double> actualRadius = new AtomicCache<>();
|
||||
private static double BLOCK = 1D / 256D;
|
||||
|
||||
public static IrisFeaturePositional read(DataInputStream s) throws IOException
|
||||
{
|
||||
return new Gson().fromJson(s.readUTF(), IrisFeaturePositional.class);
|
||||
}
|
||||
|
||||
public void write(DataOutputStream s) throws IOException {
|
||||
s.writeUTF(new Gson().toJson(this));
|
||||
}
|
||||
|
||||
public boolean shouldFilter(double x, double z)
|
||||
{
|
||||
double actualRadius = IrisInterpolation.getRealRadius(getFeature().getInterpolator(), (int)x, (int)z, getFeature().getInterpolationRadius());
|
||||
double dist2 = distance2(x, z);
|
||||
|
||||
if(getFeature().isInvertZone()) {
|
||||
if (dist2 < Math.pow(getFeature().getBlockRadius() - actualRadius, 2)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if(dist2 > Math.pow(getFeature().getBlockRadius() + actualRadius, 2))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public double getStrength(double x, double z)
|
||||
{
|
||||
double actualRadius = IrisInterpolation.getRealRadius(getFeature().getInterpolator(), (int)x, (int)z, getFeature().getInterpolationRadius());
|
||||
double dist2 = distance2(x, z);
|
||||
|
||||
if(getFeature().isInvertZone())
|
||||
{
|
||||
if (dist2 < Math.pow(getFeature().getBlockRadius() - actualRadius, 2))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
NoiseProvider d = provider.aquire(this::getNoiseProvider);
|
||||
double s = IrisInterpolation.getNoise(getFeature().getInterpolator(), (int)x, (int)z, getFeature().getInterpolationRadius(), d);
|
||||
|
||||
if(s <= 0)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
return getFeature().getStrength() * s;
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
if(dist2 > Math.pow(getFeature().getBlockRadius() + actualRadius, 2))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
NoiseProvider d = provider.aquire(this::getNoiseProvider);
|
||||
double s = IrisInterpolation.getNoise(getFeature().getInterpolator(), (int)x, (int)z, getFeature().getInterpolationRadius(), d);
|
||||
|
||||
if(s <= 0)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
return getFeature().getStrength() * s;
|
||||
}
|
||||
}
|
||||
|
||||
public double getObjectChanceModifier(double x, double z)
|
||||
{
|
||||
if(getFeature().getObjectChance()>=1)
|
||||
{
|
||||
return getFeature().getObjectChance();
|
||||
}
|
||||
|
||||
return M.lerp(1, getFeature().getObjectChance(), getStrength(x, z));
|
||||
}
|
||||
|
||||
public double filter(double x, double z, double noise) {
|
||||
double s = getStrength(x, z);
|
||||
|
||||
if(s <= 0)
|
||||
{
|
||||
return noise;
|
||||
}
|
||||
|
||||
double fx = noise;
|
||||
|
||||
if(getFeature().getConvergeToHeight() >= 0)
|
||||
{
|
||||
fx = getFeature().getConvergeToHeight();
|
||||
}
|
||||
|
||||
fx *= getFeature().getMultiplyHeight();
|
||||
fx += getFeature().getShiftHeight();
|
||||
|
||||
return M.lerp(noise, fx, s);
|
||||
}
|
||||
|
||||
public double distance(double x, double z) {
|
||||
return Math.sqrt(Math.pow(this.x - x, 2) + Math.pow(this.z - z, 2));
|
||||
}
|
||||
|
||||
public double distance2(double x, double z) {
|
||||
return Math.pow(this.x - x, 2) + Math.pow(this.z - z, 2);
|
||||
}
|
||||
|
||||
private NoiseProvider getNoiseProvider() {
|
||||
if(getFeature().isInvertZone())
|
||||
{
|
||||
return (x, z) -> distance(x, z) > getFeature().getBlockRadius() ? 1D : 0D;
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
return (x, z) -> distance(x, z) < getFeature().getBlockRadius() ? 1D : 0D;
|
||||
}
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user