This commit is contained in:
Dan Macbook 2020-08-14 08:18:10 -04:00
parent 31bd6a0c0d
commit a1d6431348
9 changed files with 163 additions and 66 deletions

View File

@ -23,9 +23,12 @@ import javax.swing.JLayeredPane;
import javax.swing.JPanel; import javax.swing.JPanel;
import javax.swing.JViewport; import javax.swing.JViewport;
import com.volmit.iris.gen.IrisChunkGenerator;
import com.volmit.iris.noise.CNG; import com.volmit.iris.noise.CNG;
import com.volmit.iris.object.NoiseStyle; import com.volmit.iris.object.NoiseStyle;
import com.volmit.iris.util.Function2;
import com.volmit.iris.util.GroupedExecutor; import com.volmit.iris.util.GroupedExecutor;
import com.volmit.iris.util.KList;
import com.volmit.iris.util.M; import com.volmit.iris.util.M;
import com.volmit.iris.util.PrecisionStopwatch; import com.volmit.iris.util.PrecisionStopwatch;
import com.volmit.iris.util.RNG; import com.volmit.iris.util.RNG;
@ -35,8 +38,8 @@ public class NoiseView extends JPanel implements MouseWheelListener {
private static final long serialVersionUID = 2094606939770332040L; private static final long serialVersionUID = 2094606939770332040L;
static JComboBox<NoiseStyle> combo; static JComboBox<String> combo;
RollingSequence r = new RollingSequence(60); RollingSequence r = new RollingSequence(20);
boolean colorMode = true; boolean colorMode = true;
double scale = 1; double scale = 1;
static boolean hd = false; static boolean hd = false;
@ -48,6 +51,7 @@ public class NoiseView extends JPanel implements MouseWheelListener {
int[][] co; int[][] co;
int w = 0; int w = 0;
int h = 0; int h = 0;
static Function2<Double, Double, Color> renderer;
double oxp = 0; double oxp = 0;
double ozp = 0; double ozp = 0;
double ox = 0; double ox = 0;
@ -131,7 +135,9 @@ public class NoiseView extends JPanel implements MouseWheelListener {
} }
PrecisionStopwatch p = PrecisionStopwatch.start(); PrecisionStopwatch p = PrecisionStopwatch.start();
int accuracy = hd ? 1 : M.clip((r.getAverage() / 13D) + 1, 1D, 128D).intValue(); int accuracy = hd ? 1 : M.clip((r.getAverage() / 8D) + 1, 1D, 128D).intValue();
accuracy = down ? accuracy * 4 : accuracy;
int v = 150;
if (g instanceof Graphics2D) { if (g instanceof Graphics2D) {
Graphics2D gg = (Graphics2D) g; Graphics2D gg = (Graphics2D) g;
@ -148,26 +154,45 @@ public class NoiseView extends JPanel implements MouseWheelListener {
for (int x = 0; x < getParent().getWidth(); x += accuracy) { for (int x = 0; x < getParent().getWidth(); x += accuracy) {
int xx = x; int xx = x;
gx.queue("a", () -> {
for (int z = 0; z < getParent().getHeight(); z += accuracy) { for (int z = 0; z < getParent().getHeight(); z += accuracy) {
double n = cng.noise((xx * ascale) + oxp, tz, (z * ascale) + ozp); int zz = z;
gx.queue("a", () -> {
if (renderer != null) {
co[xx][zz] = renderer.apply((xx * ascale) + oxp, (zz * ascale) + ozp).getRGB();
}
else {
double n = cng.noise((xx * ascale) + oxp, tz, (zz * ascale) + ozp);
if (n > 1 || n < 0) { if (n > 1 || n < 0) {
System.out.println("EXCEEDED " + n); System.out.println("EXCEEDED " + n);
break; return;
} }
Color color = colorMode Color color = colorMode
? Color.getHSBColor((float) (n), 1f - (float) (n * n * n * n * n * n), 1f - (float) n) ? Color.getHSBColor((float) (n), 1f - (float) (n * n * n * n * n * n),
1f - (float) n)
: Color.getHSBColor(0f, 0f, (float) n); : Color.getHSBColor(0f, 0f, (float) n);
int rgb = color.getRGB(); int rgb = color.getRGB();
co[xx][z] = rgb; co[xx][zz] = rgb;
} }
}); });
} }
gx.waitFor("a"); gx.waitFor("a");
if (p.getMilliseconds() > v) {
v += 50;
accuracy++;
}
}
if (down && renderer != null) {
Iris.proj.getCurrentProject().getCache().targetChunk(0, 0);
}
for (int x = 0; x < getParent().getWidth(); x += accuracy) { for (int x = 0; x < getParent().getWidth(); x += accuracy) {
for (int z = 0; z < getParent().getHeight(); z += accuracy) { for (int z = 0; z < getParent().getHeight(); z += accuracy) {
gg.setColor(new Color(co[x][z])); gg.setColor(new Color(co[x][z]));
@ -180,22 +205,46 @@ public class NoiseView extends JPanel implements MouseWheelListener {
t += 1D; t += 1D;
r.put(p.getMilliseconds()); r.put(p.getMilliseconds());
if (!isVisible()) {
return;
}
if (!getParent().isVisible()) {
return;
}
if (!getParent().getParent().isVisible()) {
return;
}
EventQueue.invokeLater(() -> { EventQueue.invokeLater(() -> {
repaint(); repaint();
}); });
} }
private static void createAndShowGUI() { private static void createAndShowGUI(IrisChunkGenerator g) {
JFrame frame = new JFrame("Iris"); JFrame frame = new JFrame("Iris");
NoiseView nv = new NoiseView(); NoiseView nv = new NoiseView();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
combo = new JComboBox<NoiseStyle>(NoiseStyle.values()); KList<String> li = new KList<NoiseStyle>(NoiseStyle.values()).toStringList().qadd("PROJECT");
combo = new JComboBox<String>(li.toArray(new String[li.size()]));
combo.setSelectedItem(g != null ? "PROJECT" : "STATIC");
if (g != null) {
renderer = Iris.proj.getCurrentProject().createRenderer();
}
combo.addActionListener(new ActionListener() { combo.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
NoiseStyle s = (NoiseStyle) (((JComboBox<NoiseStyle>) e.getSource()).getSelectedItem()); String b = (String) (((JComboBox<String>) e.getSource()).getSelectedItem());
if (b.equals("PROJECT")) {
renderer = Iris.proj.getCurrentProject().createRenderer();
return;
}
renderer = null;
NoiseStyle s = NoiseStyle.valueOf(b);
nv.cng = s.create(RNG.r.nextParallelRNG(RNG.r.imax())); nv.cng = s.create(RNG.r.nextParallelRNG(RNG.r.imax()));
} }
}); });
@ -210,10 +259,10 @@ public class NoiseView extends JPanel implements MouseWheelListener {
frame.setVisible(true); frame.setVisible(true);
} }
public static void main(String[] args) { public static void launch(IrisChunkGenerator g) {
EventQueue.invokeLater(new Runnable() { EventQueue.invokeLater(new Runnable() {
public void run() { public void run() {
createAndShowGUI(); createAndShowGUI(g);
} }
}); });
} }

View File

@ -0,0 +1,29 @@
package com.volmit.iris.command;
import com.volmit.iris.Iris;
import com.volmit.iris.NoiseView;
import com.volmit.iris.gen.IrisChunkGenerator;
import com.volmit.iris.util.MortarCommand;
import com.volmit.iris.util.MortarSender;
public class CommandIrisMap extends MortarCommand {
public CommandIrisMap() {
super("map", "render");
setDescription("Render a map (gui outside of mc)");
requiresPermission(Iris.perm.studio);
setCategory("World");
}
@Override
public boolean handle(MortarSender sender, String[] args) {
IrisChunkGenerator g = Iris.proj.getCurrentProject();
NoiseView.launch(g);
sender.sendMessage("Opening Map!");
return true;
}
@Override
protected String getArgsUsage() {
return "";
}
}

View File

@ -24,6 +24,9 @@ public class CommandIrisStudio extends MortarCommand {
@Command @Command
private CommandIrisStudioUpdate update; private CommandIrisStudioUpdate update;
@Command
private CommandIrisMap map;
@Command @Command
private CommandIrisStudioList list; private CommandIrisStudioList list;

View File

@ -51,6 +51,7 @@ public abstract class BiomeChunkGenerator extends DimensionChunkGenerator {
public void onHotload() { public void onHotload() {
super.onHotload(); super.onHotload();
loadGenerators(); loadGenerators();
glBiome = new GenLayerBiome(this, masterRandom.nextParallelRNG(1));
} }
public void registerGenerator(IrisGenerator g, IrisDimension dim) { public void registerGenerator(IrisGenerator g, IrisDimension dim) {

View File

@ -1,5 +1,6 @@
package com.volmit.iris.gen; package com.volmit.iris.gen;
import java.awt.Color;
import java.io.IOException; import java.io.IOException;
import java.lang.reflect.Method; import java.lang.reflect.Method;
@ -16,6 +17,7 @@ import com.volmit.iris.object.IrisBiome;
import com.volmit.iris.object.IrisEffect; import com.volmit.iris.object.IrisEffect;
import com.volmit.iris.object.IrisRegion; import com.volmit.iris.object.IrisRegion;
import com.volmit.iris.util.BiomeResult; import com.volmit.iris.util.BiomeResult;
import com.volmit.iris.util.Function2;
import com.volmit.iris.util.IrisLock; import com.volmit.iris.util.IrisLock;
import com.volmit.iris.util.KMap; import com.volmit.iris.util.KMap;
import com.volmit.iris.util.RNG; import com.volmit.iris.util.RNG;
@ -203,4 +205,23 @@ public class IrisChunkGenerator extends CeilingChunkGenerator implements IrisCon
return getDimension().isVanillaStructures(); return getDimension().isVanillaStructures();
} }
public Function2<Double, Double, Color> createRenderer() {
return (x, z) -> render(x, z);
}
private Color render(double x, double z) {
int ix = (int) x;
int iz = (int) z;
double height = getTerrainHeight(ix, iz);
IrisRegion region = sampleRegion(ix, iz);
IrisBiome biome = sampleTrueBiome(ix, iz, height).getBiome();
float shift = (biome.hashCode() % 32)/32f/14f;
float shift2 = (region.hashCode() % 9)/9f/14f;
shift-= shift2;
return Color.getHSBColor((biome.isLand() ? 0.233f : 0.644f)-shift, 0.25f+shift,
(float) (Math.max(0, Math.min(height + getFluidHeight(), 255)) / 255));
}
} }

View File

@ -131,14 +131,7 @@ public abstract class PostBlockChunkGenerator extends ParallaxChunkGenerator imp
@Override @Override
public void updateHeight(int x, int z, int h) { public void updateHeight(int x, int z, int h) {
if (x >> 4 == currentPostX && z >> 4 == currentPostZ) { getCache().updateHeight(x, z, h);
//cacheHeight(x, z, h);
}
else {
Iris.error("Invalid Heightmap set! Chunk Currently at " + currentPostX + "," + currentPostZ
+ ". Attempted to place at " + (x >> 4) + " " + (z >> 4) + " which is bad.");
}
} }
@Override @Override

View File

@ -3,10 +3,8 @@ package com.volmit.iris.gen.atomics;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Supplier; import java.util.function.Supplier;
import com.volmit.iris.Iris;
import com.volmit.iris.object.IrisRegion; import com.volmit.iris.object.IrisRegion;
import com.volmit.iris.util.BiomeResult; import com.volmit.iris.util.BiomeResult;
import com.volmit.iris.util.Form;
import com.volmit.iris.util.KMap; import com.volmit.iris.util.KMap;
public class AtomicMulticache { public class AtomicMulticache {
@ -32,12 +30,10 @@ public class AtomicMulticache {
public void targetChunk(int x, int z) { public void targetChunk(int x, int z) {
this.x.set(x); this.x.set(x);
this.z.set(z); this.z.set(z);
Iris.info("R: " + Form.f(r) + " W: " + Form.f(w) + " M: " + Form.f(m) + " (" + Form.pc(r / (double) (r + m), 1)
+ "), SIZE: " + Form.f(height.size() + biome.size() + region.size()));
height.clear(); height.clear();
region.size(); region.clear();
biome.size(); biome.clear();
rawBiome.clear();
r = 0; r = 0;
w = 0; w = 0;
m = 0; m = 0;
@ -102,4 +98,8 @@ public class AtomicMulticache {
private long pos(int x, int z) { private long pos(int x, int z) {
return (((long) x) << 32) | (z & 0xffffffffL); return (((long) x) << 32) | (z & 0xffffffffL);
} }
public void updateHeight(int x, int z, int h) {
height.put(pos(x, z), (double) h);
}
} }

View File

@ -184,45 +184,47 @@ public class CNG {
return this; return this;
} }
public <T extends IRare> T fitRarity(List<T> l, double... dim) { public <T extends IRare> T fitRarity(KList<T> b, double... dim) {
if (l.isEmpty()) { if (b.size() == 0) {
return null; return null;
} }
if (l.size() == 1) { if (b.size() == 1) {
return l.get(0); return b.get(0);
} }
int total = 0; KList<T> rarityMapped = new KList<>();
boolean allOne = true; boolean o = false;
int max = 1;
for (T i : l) { for (T i : b) {
int r = i.getRarity(); if (i.getRarity() > max) {
max = i.getRarity();
if (r > 1) { }
allOne = false;
} }
total += r; max++;
for (T i : b) {
for (int j = 0; j < max - i.getRarity(); j++) {
if (o = !o) {
rarityMapped.add(i);
} }
int m = fit(0, total - 1, dim); else {
rarityMapped.add(0, i);
if (m == 0) { }
return l.get(0); }
} }
if (allOne) { if (rarityMapped.size() == 1) {
return l.get(m); return rarityMapped.get(0);
} }
T c = l.get(0); if (rarityMapped.isEmpty()) {
throw new RuntimeException("BAD RARITY MAP! RELATED TO: " + b.toString(", or possibly "));
while (m > 0) {
m -= c.getRarity();
} }
return c; return fit(rarityMapped, dim);
} }
public <T> T fit(T[] v, double... dim) { public <T> T fit(T[] v, double... dim) {

View File

@ -1,6 +1,5 @@
package com.volmit.iris.util; package com.volmit.iris.util;
public interface IRare public interface IRare {
{
public int getRarity(); public int getRarity();
} }