Iris/src/main/java/com/volmit/iris/object/IrisTextPlacement.java
2020-08-31 16:48:12 -04:00

123 lines
3.0 KiB
Java

package com.volmit.iris.object;
import com.volmit.iris.gen.ParallaxChunkGenerator;
import com.volmit.iris.gen.atomics.AtomicCache;
import com.volmit.iris.util.ArrayType;
import com.volmit.iris.util.Desc;
import com.volmit.iris.util.DontObfuscate;
import com.volmit.iris.util.KList;
import com.volmit.iris.util.MaxNumber;
import com.volmit.iris.util.MinNumber;
import com.volmit.iris.util.RNG;
import com.volmit.iris.util.Required;
import lombok.Data;
@Desc("A text renderer to place text on terrain")
@Data
public class IrisTextPlacement
{
@MinNumber(0)
@MaxNumber(1)
@DontObfuscate
@Desc("The chance to place this font per chunk")
private double chance = 0.1;
@MinNumber(0)
@DontObfuscate
@Desc("The amount of times to place randomly in a chunk if the chance passes")
private int density = 1;
@DontObfuscate
@Desc("The rotation for this text placement")
private IrisObjectRotation rotation = new IrisObjectRotation();
@DontObfuscate
@Desc("The mode to place this text")
private ObjectPlaceMode mode = ObjectPlaceMode.PAINT;
@DontObfuscate
@Desc("The translation for this text placement")
private IrisObjectTranslate translate = new IrisObjectTranslate();
@DontObfuscate
@Desc("The clamp for this text placement")
private IrisObjectLimit clamp = new IrisObjectLimit();
@Required
@DontObfuscate
@Desc("The text renderers to pick from")
@ArrayType(min = 1, type = IrisTextRenderer.class)
private KList<IrisTextRenderer> render = new KList<>();
@DontObfuscate
@Desc("If set to true, objects will place on the terrain height, ignoring the water surface.")
private boolean underwater = false;
@DontObfuscate
@Desc("If set to true, Blocks placed underwater that could be waterlogged are waterlogged.")
private boolean waterloggable = true;
@DontObfuscate
@Desc("If set to true, objects will place on the fluid height level Such as boats.")
private boolean onwater = false;
private AtomicCache<IrisObjectPlacement> config = new AtomicCache<>();
public IrisObjectPlacement getConfig()
{
return config.aquire(() ->
{
IrisObjectPlacement p = new IrisObjectPlacement();
p.setRotation(getRotation());
p.setBore(false);
p.setDensity(getDensity());
p.setChance(getChance());
p.setTranslate(getTranslate());
p.setClamp(getClamp());
p.setOnwater(isOnwater());
p.setUnderwater(isUnderwater());
p.setWaterloggable(isWaterloggable());
p.setMode(getMode());
return p;
});
}
public IrisTextPlacement()
{
}
public int maxDimension()
{
int m = 0;
for(IrisTextRenderer i : getRender())
{
int g = (int) Math.ceil(i.getMaxLength());
if(g > m)
{
m = g;
}
}
return m;
}
public void place(ParallaxChunkGenerator g, RNG rng, int x, int z)
{
int tr = getConfig().getTriesForChunk(rng);
for(int i = 0; i < tr; i++)
{
rng = rng.nextParallelRNG((i * 3 + 8) - 23040);
int xb = (x * 16) + rng.nextInt(16);
int zb = (z * 16) + rng.nextInt(16);
getRender().get(rng.nextInt(getRender().size())).place(g, rng, getConfig(), xb, zb);
}
}
}