mirror of
https://github.com/VolmitSoftware/Iris.git
synced 2025-07-19 18:55:18 +00:00
Mapping
This commit is contained in:
parent
31bd6a0c0d
commit
a1d6431348
@ -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,25 +154,44 @@ 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) {
|
|
||||||
double n = cng.noise((xx * ascale) + oxp, tz, (z * ascale) + ozp);
|
|
||||||
|
|
||||||
if (n > 1 || n < 0) {
|
for (int z = 0; z < getParent().getHeight(); z += accuracy) {
|
||||||
System.out.println("EXCEEDED " + n);
|
int zz = z;
|
||||||
break;
|
gx.queue("a", () -> {
|
||||||
|
if (renderer != null) {
|
||||||
|
co[xx][zz] = renderer.apply((xx * ascale) + oxp, (zz * ascale) + ozp).getRGB();
|
||||||
}
|
}
|
||||||
|
|
||||||
Color color = colorMode
|
else {
|
||||||
? Color.getHSBColor((float) (n), 1f - (float) (n * n * n * n * n * n), 1f - (float) n)
|
double n = cng.noise((xx * ascale) + oxp, tz, (zz * ascale) + ozp);
|
||||||
: Color.getHSBColor(0f, 0f, (float) n);
|
|
||||||
int rgb = color.getRGB();
|
if (n > 1 || n < 0) {
|
||||||
co[xx][z] = rgb;
|
System.out.println("EXCEEDED " + n);
|
||||||
}
|
return;
|
||||||
});
|
}
|
||||||
|
|
||||||
|
Color color = colorMode
|
||||||
|
? Color.getHSBColor((float) (n), 1f - (float) (n * n * n * n * n * n),
|
||||||
|
1f - (float) n)
|
||||||
|
: Color.getHSBColor(0f, 0f, (float) n);
|
||||||
|
int rgb = color.getRGB();
|
||||||
|
co[xx][zz] = rgb;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
gx.waitFor("a");
|
||||||
|
|
||||||
|
if (p.getMilliseconds() > v) {
|
||||||
|
v += 50;
|
||||||
|
accuracy++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
gx.waitFor("a");
|
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) {
|
||||||
@ -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);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
29
src/main/java/com/volmit/iris/command/CommandIrisMap.java
Normal file
29
src/main/java/com/volmit/iris/command/CommandIrisMap.java
Normal 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 "";
|
||||||
|
}
|
||||||
|
}
|
@ -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;
|
||||||
|
|
||||||
|
@ -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) {
|
||||||
|
@ -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));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int m = fit(0, total - 1, dim);
|
max++;
|
||||||
|
|
||||||
if (m == 0) {
|
for (T i : b) {
|
||||||
return l.get(0);
|
for (int j = 0; j < max - i.getRarity(); j++) {
|
||||||
|
if (o = !o) {
|
||||||
|
rarityMapped.add(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
else {
|
||||||
|
rarityMapped.add(0, i);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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) {
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user