ERADICATE V1

This commit is contained in:
Daniel Mills
2020-11-10 01:07:28 -05:00
parent 4fc8a5ad0c
commit 9ba47c1b6a
57 changed files with 85 additions and 9837 deletions

View File

@@ -1,37 +1,22 @@
package com.volmit.iris.object;
import java.awt.Color;
import org.bukkit.block.Biome;
import com.volmit.iris.Iris;
import com.volmit.iris.generator.legacy.ContextualTerrainProvider;
import com.volmit.iris.generator.legacy.atomics.AtomicCache;
import com.volmit.iris.scaffold.data.DataProvider;
import com.volmit.iris.manager.IrisDataManager;
import com.volmit.iris.generator.noise.CNG;
import com.volmit.iris.util.ArrayType;
import com.volmit.iris.util.B;
import com.volmit.iris.util.DependsOn;
import com.volmit.iris.util.Desc;
import com.volmit.iris.util.DontObfuscate;
import com.volmit.iris.util.IRare;
import com.volmit.iris.util.KList;
import com.volmit.iris.util.KMap;
import com.volmit.iris.util.KSet;
import com.volmit.iris.util.MaxNumber;
import com.volmit.iris.util.MinNumber;
import com.volmit.iris.util.RNG;
import com.volmit.iris.util.RegistryListBiome;
import com.volmit.iris.util.Required;
import com.volmit.iris.manager.IrisDataManager;
import com.volmit.iris.scaffold.data.DataProvider;
import com.volmit.iris.scaffold.engine.IrisAccess;
import com.volmit.iris.util.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import org.bukkit.block.Biome;
import org.bukkit.block.data.BlockData;
import java.awt.*;
@Accessors(chain = true)
@NoArgsConstructor
@AllArgsConstructor
@@ -47,11 +32,6 @@ public class IrisBiome extends IrisRegistrant implements IRare
@Desc("This is the human readable name for this biome. This can and should be different than the file name. This is not used for loading biomes in other objects.")
private String name = "A Biome";
@DontObfuscate
@Desc("Place text on terrain. Iris will render text into block schematics and randomly place them in this biome.")
@ArrayType(min = 1, type = IrisTextPlacement.class)
private KList<IrisTextPlacement> text = new KList<>();
@DontObfuscate
@Desc("The type of fluid if this biome is underwater. To 'defer' this value to whatever the parent dimension fluid type is, use an emtpy string.")
private String fluidType = "";
@@ -329,7 +309,7 @@ public class IrisBiome extends IrisRegistrant implements IRare
});
}
public double getHeight(ContextualTerrainProvider xg, double x, double z, long seed)
public double getHeight(IrisAccess xg, double x, double z, long seed)
{
double height = 0;

View File

@@ -1,28 +1,14 @@
package com.volmit.iris.object;
import org.bukkit.Material;
import org.bukkit.block.data.BlockData;
import org.bukkit.generator.ChunkGenerator.ChunkData;
import org.bukkit.util.BlockVector;
import com.volmit.iris.generator.legacy.TopographicTerrainProvider;
import com.volmit.iris.generator.legacy.atomics.AtomicCache;
import com.volmit.iris.manager.IrisDataManager;
import com.volmit.iris.util.ArrayType;
import com.volmit.iris.util.B;
import com.volmit.iris.util.Desc;
import com.volmit.iris.util.DontObfuscate;
import com.volmit.iris.util.HeightMap;
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 com.volmit.iris.util.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import org.bukkit.block.data.BlockData;
import org.bukkit.util.BlockVector;
@Accessors(chain = true)
@NoArgsConstructor
@@ -160,92 +146,4 @@ public class IrisDepositGenerator
return blockData;
});
}
public void generate(ChunkData data, RNG rng, TopographicTerrainProvider g, int cx, int cz, boolean safe)
{
generate(data, rng, g, cx, cz, safe, null);
}
public void generate(ChunkData data, RNG rng, TopographicTerrainProvider g, int cx, int cz, boolean safe, HeightMap he)
{
for(int l = 0; l < rng.i(getMinPerChunk(), getMaxPerChunk()); l++)
{
IrisObject clump = getClump(rng, g.getData());
int af = (int) Math.ceil(clump.getW() / 2D);
int bf = (int) Math.floor(16D - (clump.getW() / 2D));
if(af > bf || af < 0 || bf > 15 || af > 15 || bf < 0)
{
af = 6;
bf = 9;
}
int x = rng.i(af, bf);
int z = rng.i(af, bf);
int height = (he != null ? he.getHeight((cx << 4) + x, (cz << 4) + z) : (int) (Math.round(g.getCarvedWaterHeight((cx << 4) + x, (cz << 4) + z)))) - 7;
if(height <= 0)
{
return;
}
int i = Math.max(0, minHeight);
int a = Math.min(height, Math.min(256, maxHeight));
if(i >= a)
{
return;
}
int h = rng.i(i, a);
if(h > maxHeight || h < minHeight || h > height - 2)
{
return;
}
for(BlockVector j : clump.getBlocks().keySet())
{
int nx = j.getBlockX() + x;
int ny = j.getBlockY() + h;
int nz = j.getBlockZ() + z;
if(ny > height - 2 || nx > 15 || nx < 0 || ny > 255 || ny < 0 || nz < 0 || nz > 15)
{
continue;
}
boolean allow = !safe;
if(!allow)
{
BlockData b = data.getBlockData(nx, ny, nz);
for(BlockData f : g.getDimension().getRockPalette().getBlockData(g.getData()))
{
if(f.getMaterial().equals(b.getMaterial()))
{
allow = true;
break;
}
}
}
if(!safe && allow)
{
BlockData b = data.getBlockData(nx, ny, nz);
if(b.getMaterial().equals(Material.ICE) || b.getMaterial().equals(Material.PACKED_ICE) || b.getMaterial().equals(B.mat("BLUE_ICE").getMaterial()) || b.getMaterial().equals(B.mat("FROSTED_ICE").getMaterial()) || b.getMaterial().equals(Material.SAND) || b.getMaterial().equals(Material.RED_SAND) || !B.isSolid(b.getMaterial()))
{
allow = false;
}
}
if(allow)
{
data.setBlock(nx, ny, nz, clump.getBlocks().get(j));
}
}
}
}
}

View File

@@ -1,37 +1,18 @@
package com.volmit.iris.object;
import org.bukkit.Material;
import org.bukkit.World.Environment;
import org.bukkit.block.data.BlockData;
import org.bukkit.util.BlockVector;
import com.volmit.iris.Iris;
import com.volmit.iris.generator.legacy.ContextualTerrainProvider;
import com.volmit.iris.generator.legacy.ParallelTerrainProvider;
import com.volmit.iris.generator.legacy.atomics.AtomicCache;
import com.volmit.iris.generator.noise.CNG;
import com.volmit.iris.util.ArrayType;
import com.volmit.iris.util.ChunkPosition;
import com.volmit.iris.util.Desc;
import com.volmit.iris.util.DontObfuscate;
import com.volmit.iris.util.Form;
import com.volmit.iris.util.IrisLock;
import com.volmit.iris.util.IrisPostBlockFilter;
import com.volmit.iris.util.KList;
import com.volmit.iris.util.KSet;
import com.volmit.iris.util.MaxNumber;
import com.volmit.iris.util.MinNumber;
import com.volmit.iris.util.O;
import com.volmit.iris.util.RNG;
import com.volmit.iris.util.RegistryListBiome;
import com.volmit.iris.util.RegistryListRegion;
import com.volmit.iris.util.Required;
import com.volmit.iris.scaffold.engine.GeneratorAccess;
import com.volmit.iris.util.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import org.bukkit.Material;
import org.bukkit.World.Environment;
import org.bukkit.block.data.BlockData;
@Accessors(chain = true)
@AllArgsConstructor
@@ -70,11 +51,6 @@ public class IrisDimension extends IrisRegistrant
@Desc("Upon joining this world, Iris will send a resource pack request to the client. If they have previously selected yes, it will auto-switch depending on which dimension they go to.")
private String resourcePack = "";
@DontObfuscate
@Desc("Place text on terrain")
@ArrayType(min = 1, type = IrisTextPlacement.class)
private KList<IrisTextPlacement> text = new KList<>();
@DontObfuscate
@Desc("Entity spawns to override or add to this dimension")
@ArrayType(min = 1, type = IrisEntitySpawnOverride.class)
@@ -348,7 +324,6 @@ public class IrisDimension extends IrisRegistrant
private transient boolean skyDimension = false;
private final transient AtomicCache<ChunkPosition> parallaxSize = new AtomicCache<>();
private final transient AtomicCache<KList<IrisPostBlockFilter>> cacheFilters = new AtomicCache<>();
private final transient AtomicCache<CNG> rockLayerGenerator = new AtomicCache<>();
private final transient AtomicCache<CNG> fluidLayerGenerator = new AtomicCache<>();
private final transient AtomicCache<CNG> coordFracture = new AtomicCache<>();
@@ -402,19 +377,19 @@ public class IrisDimension extends IrisRegistrant
return cosr.aquire(() -> Math.cos(getDimensionAngle()));
}
public KList<IrisRegion> getAllRegions(ContextualTerrainProvider g)
public KList<IrisRegion> getAllRegions(GeneratorAccess g)
{
KList<IrisRegion> r = new KList<>();
for(String i : getRegions())
{
r.add(g != null ? g.loadRegion(i) : Iris.globaldata.getRegionLoader().load(i));
r.add(g != null ? g.getData().getRegionLoader().load(i) : Iris.globaldata.getRegionLoader().load(i));
}
return r;
}
public KList<IrisBiome> getAllBiomes(ContextualTerrainProvider g)
public KList<IrisBiome> getAllBiomes(GeneratorAccess g)
{
KList<IrisBiome> r = new KList<>();
@@ -426,114 +401,6 @@ public class IrisDimension extends IrisRegistrant
return r;
}
public ChunkPosition getParallaxSize(ParallelTerrainProvider g)
{
return parallaxSize.aquire(() ->
{
Iris.verbose("Calculating the Parallax Size in Parallel");
O<Integer> xg = new O<>();
O<Integer> zg = new O<>();
xg.set(0);
zg.set(0);
KSet<String> objects = new KSet<>();
KList<IrisRegion> r = getAllRegions(g);
KList<IrisBiome> b = getAllBiomes(g);
for(IrisBiome i : b)
{
for(IrisObjectPlacement j : i.getObjects())
{
objects.addAll(j.getPlace());
}
}
IrisLock t = new IrisLock("t");
Iris.verbose("Checking sizes for " + Form.f(objects.size()) + " referenced objects.");
for(String i : objects)
{
g.getAccelerant().queue("tx-psize", () ->
{
try
{
BlockVector bv = IrisObject.sampleSize(g.getData().getObjectLoader().findFile(i));
t.lock();
xg.set(bv.getBlockX() > xg.get() ? bv.getBlockX() : xg.get());
zg.set(bv.getBlockZ() > zg.get() ? bv.getBlockZ() : zg.get());
t.unlock();
}
catch(Throwable e)
{
}
});
}
g.getAccelerant().waitFor("tx-psize");
int x = xg.get();
int z = zg.get();
for(IrisDepositGenerator i : getDeposits())
{
int max = i.getMaxDimension();
x = max > x ? max : x;
z = max > z ? max : z;
}
for(IrisTextPlacement i : getText())
{
int max = i.maxDimension();
x = max > x ? max : x;
z = max > z ? max : z;
}
for(IrisRegion v : r)
{
for(IrisDepositGenerator i : v.getDeposits())
{
int max = i.getMaxDimension();
x = max > x ? max : x;
z = max > z ? max : z;
}
for(IrisTextPlacement i : v.getText())
{
int max = i.maxDimension();
x = max > x ? max : x;
z = max > z ? max : z;
}
}
for(IrisBiome v : b)
{
for(IrisDepositGenerator i : v.getDeposits())
{
int max = i.getMaxDimension();
x = max > x ? max : x;
z = max > z ? max : z;
}
for(IrisTextPlacement i : v.getText())
{
int max = i.maxDimension();
x = max > x ? max : x;
z = max > z ? max : z;
}
}
x = (Math.max(x, 16) + 16) >> 4;
z = (Math.max(z, 16) + 16) >> 4;
x = x % 2 == 0 ? x + 1 : x;
z = z % 2 == 0 ? z + 1 : z;
x = Math.max(x, z);
z = x;
Iris.verbose("Done! Parallax Size: " + x + ", " + z);
return new ChunkPosition(x, z);
});
}
public BlockData resolveBlock(String bd)
{
return Iris.compat.getBlock(bd);

View File

@@ -1,5 +1,13 @@
package com.volmit.iris.object;
import com.volmit.iris.Iris;
import com.volmit.iris.generator.legacy.atomics.AtomicCache;
import com.volmit.iris.scaffold.engine.GeneratorAccess;
import com.volmit.iris.util.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import org.bukkit.Location;
import org.bukkit.Particle;
import org.bukkit.Sound;
@@ -7,23 +15,6 @@ import org.bukkit.entity.Player;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;
import com.volmit.iris.Iris;
import com.volmit.iris.generator.legacy.IrisTerrainProvider;
import com.volmit.iris.generator.legacy.atomics.AtomicCache;
import com.volmit.iris.util.ChronoLatch;
import com.volmit.iris.util.DependsOn;
import com.volmit.iris.util.Desc;
import com.volmit.iris.util.DontObfuscate;
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.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
@Accessors(chain = true)
@NoArgsConstructor
@AllArgsConstructor
@@ -222,7 +213,7 @@ public class IrisEffect
});
}
public void apply(Player p, IrisTerrainProvider g)
public void apply(Player p, GeneratorAccess g)
{
if(!canTick())
{
@@ -244,7 +235,7 @@ public class IrisEffect
{
Location part = p.getLocation().clone().add(p.getLocation().getDirection().clone().multiply(RNG.r.i(particleDistance) + particleAway)).clone().add(p.getLocation().getDirection().clone().rotateAroundY(Math.toRadians(90)).multiply(RNG.r.d(-particleDistanceWidth, particleDistanceWidth)));
part.setY(Math.round(g.getCarvedHeight(part.getBlockX(), part.getBlockZ(), true)) + 1);
part.setY(Math.round(g.getHeight(part.getBlockX(), part.getBlockZ())) + 1);
part.add(RNG.r.d(), 0, RNG.r.d());
if(extra != 0)
{

View File

@@ -59,11 +59,6 @@ public class IrisRegion extends IrisRegistrant implements IRare
@Desc("The rarity of the region")
private int rarity = 1;
@DontObfuscate
@Desc("Place text on terrain")
@ArrayType(min = 1, type = IrisTextPlacement.class)
private KList<IrisTextPlacement> text = new KList<>();
@ArrayType(min = 1, type = IrisBlockDrops.class)
@DontObfuscate
@Desc("Define custom block drops for this region")

View File

@@ -1,20 +1,10 @@
package com.volmit.iris.object;
import com.volmit.iris.Iris;
import com.volmit.iris.generator.legacy.ParallaxTerrainProvider;
import com.volmit.iris.generator.legacy.atomics.AtomicCache;
import com.volmit.iris.generator.noise.CellGenerator;
import com.volmit.iris.util.ChunkPosition;
import com.volmit.iris.util.Desc;
import com.volmit.iris.util.DontObfuscate;
import com.volmit.iris.util.KSet;
import com.volmit.iris.util.MaxNumber;
import com.volmit.iris.util.MinNumber;
import com.volmit.iris.util.RNG;
import com.volmit.iris.util.RegistryListStructure;
import com.volmit.iris.util.Required;
import com.volmit.iris.scaffold.data.DataProvider;
import com.volmit.iris.util.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@@ -67,97 +57,6 @@ public class IrisStructurePlacement
private final transient AtomicCache<IrisStructure> structure = new AtomicCache<>();
private final transient AtomicCache<IrisObjectPlacement> config = new AtomicCache<>();
public void place(ParallaxTerrainProvider g, RNG rngno, int cx, int cz)
{
try
{
RNG rng = g.getMasterRandom().nextParallelRNG(-88738456 + rngno.nextInt());
RNG rnp = rng.nextParallelRNG(cx - (cz * cz << 3) + rngno.nextInt());
int s = gridSize(g) - (getStructure(g).isMergeEdges() ? 1 : 0);
int sh = gridHeight(g) - (getStructure(g).isMergeEdges() ? 1 : 0);
KSet<ChunkPosition> m = new KSet<>();
for(int i = cx << 4; i <= (cx << 4) + 15; i += 1)
{
if(Math.floorDiv(i, s) * s >> 4 < cx)
{
continue;
}
for(int j = cz << 4; j <= (cz << 4) + 15; j += 1)
{
if(Math.floorDiv(j, s) * s >> 4 < cz)
{
continue;
}
ChunkPosition p = new ChunkPosition(Math.floorDiv(i, s) * s, Math.floorDiv(j, s) * s);
if(m.contains(p))
{
continue;
}
m.add(p);
if(getStructure(g).getMaxLayers() <= 1)
{
placeLayer(g, rng, rnp, i, 0, j, s, sh);
continue;
}
for(int k = 0; k < s * getStructure(g).getMaxLayers(); k += Math.max(sh, 1))
{
placeLayer(g, rng, rnp, i, k, j, s, sh);
}
}
}
}
catch(Throwable e)
{
e.printStackTrace();
}
}
public void placeLayer(ParallaxTerrainProvider g, RNG rng, RNG rnp, int i, int k, int j, int s, int sh)
{
if(!hasStructure(g, rng, i, k, j))
{
return;
}
int h = (height == -1 ? 0 : height) + (Math.floorDiv(k, sh) * sh);
TileResult t = getStructure(g).getTile(rng, Math.floorDiv(i, s) * s, h, Math.floorDiv(j, s) * s);
if(t != null)
{
IrisObject o = null;
for(IrisRareObject l : t.getTile().getRareObjects())
{
if(rnp.i(1, l.getRarity()) == 1)
{
o = load(g, l.getObject());
break;
}
}
o = o != null ? o : load(g, t.getTile().getObjects().get(rnp.nextInt(t.getTile().getObjects().size())));
o.place(
Math.floorDiv(i, s) * s,
height == -1 ? -1 : h,
Math.floorDiv(j, s) * s,
g,
t.getPlacement(),
rng,
(gg) -> g.getParallaxChunk(gg.getChunkX(), gg.getChunkZ()).setStructure(gg.getY(), t.getStructure(), t.getTile()),
null,
g.getData()
);
}
}
private IrisObjectPlacement getConfig()
{
return config.aquire(() ->
@@ -188,32 +87,6 @@ public class IrisStructurePlacement
return structure.aquire(() -> (g == null ? Iris.globaldata : g.getData()).getStructureLoader().load(getTileset()));
}
public boolean hasStructure(ParallaxTerrainProvider g, RNG random, double x, double y, double z)
{
if(g.getGlCarve().isCarved((int) x, (int) y, (int) z))
{
return false;
}
if(getChanceGenerator(g, random).getIndex(x / zoom, y / zoom, z / zoom, getRarity()) == getRarity() / 2)
{
return ratio > 0 ? getChanceGenerator(g, random).getDistance(x / zoom, z / zoom) > ratio : getChanceGenerator(g, random).getDistance(x / zoom, z / zoom) < Math.abs(ratio);
}
return false;
}
public CellGenerator getChanceGenerator(ParallaxTerrainProvider g, RNG random)
{
return chanceCell.aquire(() ->
{
CellGenerator chanceCell = new CellGenerator(g.getMasterRandom().nextParallelRNG(-72346).nextParallelRNG((height + 10000) * rarity));
chanceCell.setCellScale(1D);
chanceCell.setShuffle(getShuffle());
return chanceCell;
});
}
public CellGenerator getChanceGenerator(RNG g)
{
return chanceCell.aquire(() ->

View File

@@ -1,124 +0,0 @@
package com.volmit.iris.object;
import com.volmit.iris.generator.legacy.ParallaxTerrainProvider;
import com.volmit.iris.generator.legacy.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.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
@Accessors(chain = true)
@NoArgsConstructor
@AllArgsConstructor
@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 final 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 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(ParallaxTerrainProvider 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);
}
}
}

View File

@@ -1,147 +0,0 @@
package com.volmit.iris.object;
import java.awt.Canvas;
import java.awt.Font;
import java.awt.FontMetrics;
import com.volmit.iris.generator.legacy.ParallaxTerrainProvider;
import com.volmit.iris.generator.legacy.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.RegistryListFont;
import com.volmit.iris.util.Required;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
@Accessors(chain = true)
@NoArgsConstructor
@AllArgsConstructor
@Desc("A text renderer to place text on terrain")
@Data
public class IrisTextRenderer
{
@RegistryListFont
@Required
@DontObfuscate
@Desc("The font to use for this renderer")
private String font = "default";
@MinNumber(4)
@MaxNumber(48)
@DontObfuscate
@Desc("The font scale 1 = 1pt = ~1-2 blocks high per character")
private int size = 18;
@DontObfuscate
@Desc("The font style to use while rendering text")
private FontStyle fontStyle = FontStyle.PLAIN;
@Required
@DontObfuscate
@Desc("The lines of text to randomly pick from")
@ArrayType(min = 1, type = String.class)
private KList<String> text = new KList<>();
@Required
@DontObfuscate
@Desc("The palette of blocks to use when drawing text")
private IrisMaterialPalette blockPalette = new IrisMaterialPalette();
private final transient AtomicCache<KList<IrisObject>> objects = new AtomicCache<>();
private final transient AtomicCache<Font> fontData = new AtomicCache<>();
private final transient AtomicCache<FontMetrics> fontMetrics = new AtomicCache<>();
private final transient AtomicCache<Double> maxLength = new AtomicCache<>();
private final transient AtomicCache<Integer> fontStyleData = new AtomicCache<>();
public KList<IrisObject> getObjects(ParallaxTerrainProvider g, RNG rng)
{
return objects.aquire(() ->
{
KList<IrisObject> o = new KList<>();
for(String i : text)
{
o.add(g.getGlText().createTextObject(rng, i, (int) getLength(i), getFontData(), getBlockPalette()));
}
return o;
});
}
public String getText(RNG rng)
{
return text.get(rng.nextInt(text.size()));
}
public double getMaxLength()
{
return maxLength.aquire(() ->
{
String l = "";
for(String i : text)
{
if(i.length() > l.length())
{
l = i;
}
}
return getLength(l);
});
}
public double getLength(String str)
{
return getFontMetrics().stringWidth(str);
}
public double getHeight(String str)
{
return getSize() * 1.2;
}
public Font getFontData()
{
return fontData.aquire(() ->
{
return new Font(getFont(), fontStyleData.aquire(() ->
{
if(getFontStyle().equals(FontStyle.ITALIC))
{
return Font.ITALIC;
}
if(getFontStyle().equals(FontStyle.BOLD))
{
return Font.BOLD;
}
return Font.PLAIN;
}), getSize());
});
}
public FontMetrics getFontMetrics()
{
return fontMetrics.aquire(() ->
{
Canvas c = new Canvas();
return c.getFontMetrics(getFontData());
});
}
public void place(ParallaxTerrainProvider g, RNG rng, IrisObjectPlacement config, int xb, int zb)
{
getObjects(g, rng).get(rng.nextInt(getObjects(g, rng).size())).place(xb, zb, g, config, rng, g.getData());
}
}