diff --git a/src/main/java/lemon/evolution/Game.java b/src/main/java/lemon/evolution/Game.java index cd03b14..5717f3a 100644 --- a/src/main/java/lemon/evolution/Game.java +++ b/src/main/java/lemon/evolution/Game.java @@ -72,8 +72,7 @@ import java.util.logging.Level; import java.util.logging.Logger; -public enum Game implements Screen { - INSTANCE; +public class Game implements Screen { private static final Logger logger = Logger.getLogger(Game.class.getName()); private GLFWWindow window; @@ -110,30 +109,14 @@ public enum Game implements Screen { private final Disposables disposables = new Disposables(); - @Override + private ScalarField scalarField; + + public Game(ScalarField scalarField){ + this.scalarField = scalarField; + } + public void onLoad(GLFWWindow window) { - if (!loaded) { - // Prepare loaders - ToIntFunction pairer = (b) -> (int) SzudzikIntPair.pair(b[0], b[1], b[2]); - var noise2d = new PerlinNoise(2, MurmurHash::createWithSeed, (b) -> SzudzikIntPair.pair(b[0], b[1]), x -> 1f, 6); - PerlinNoise noise = new PerlinNoise<>(3, MurmurHash::createWithSeed, pairer, x -> 1f, 6); - ScalarField scalarField = vector -> vector.y() < -30f ? 0f : -(vector.y() + noise.apply(vector.divide(100f)) * 5f); - histogram = new Histogram(0.1f); - scalarField = vector -> { - if (vector.y() < 0f) { - return 0f; - } - float distanceSquared = vector.x() * vector.x() + vector.z() * vector.z(); - float cylinder = (float) (50.0 - Math.sqrt(distanceSquared)); - if (cylinder < -100f) { - return cylinder; - } - float terrain = (float) (-Math.tanh(vector.y() / 100.0) * 100.0 + - Math.pow(2f, noise2d.apply(vector.toXZVector().divide(300f))) * 5.0 + - Math.pow(2.5f, noise.apply(vector.divide(500f))) * 2.5); - histogram.add(terrain); - return Math.min(cylinder, terrain); - }; + if(!loaded){ pool = (ThreadPoolExecutor) Executors.newFixedThreadPool(3); pool2 = (ThreadPoolExecutor) Executors.newFixedThreadPool(1); pool.setRejectedExecutionHandler((runnable, executor) -> {}); diff --git a/src/main/java/lemon/evolution/Menu.java b/src/main/java/lemon/evolution/Menu.java index 861d9c7..56a311f 100644 --- a/src/main/java/lemon/evolution/Menu.java +++ b/src/main/java/lemon/evolution/Menu.java @@ -1,11 +1,18 @@ package lemon.evolution; import lemon.engine.control.GLFWWindow; +import lemon.engine.function.MurmurHash; +import lemon.engine.function.PerlinNoise; +import lemon.engine.function.SzudzikIntPair; import lemon.engine.game2d.Quad2D; import lemon.engine.math.Box2D; import lemon.engine.math.Matrix; +import lemon.engine.math.Vector2D; +import lemon.engine.math.Vector3D; import lemon.engine.toolbox.Color; import lemon.engine.toolbox.Disposables; +import lemon.engine.toolbox.Histogram; +import lemon.evolution.destructible.beta.ScalarField; import lemon.evolution.screen.beta.Screen; import lemon.evolution.setup.CommonProgramsSetup; import lemon.evolution.util.CommonPrograms2D; @@ -13,12 +20,15 @@ import java.util.ArrayList; import java.util.List; +import java.util.function.ToIntFunction; public enum Menu implements Screen { INSTANCE; private GLFWWindow window; private List buttons; private final Disposables disposables = new Disposables(); + private Histogram histogram; + @Override public void onLoad(GLFWWindow window) { @@ -36,7 +46,50 @@ public void onLoad(GLFWWindow window) { for (int i = 0; i < buttons.size(); ++i) { if (buttons.get(i).getBox2D().intersect(mouseX, mouseY)) { switch (i) { - case 0, 1 -> start(Game.INSTANCE); + case 0 -> { + ToIntFunction pairer = (b) -> (int) SzudzikIntPair.pair(b[0], b[1], b[2]); + var noise2d = new PerlinNoise(2, MurmurHash::createWithSeed, (b) -> SzudzikIntPair.pair(b[0], b[1]), x -> 1f, 6); + PerlinNoise noise = new PerlinNoise<>(3, MurmurHash::createWithSeed, pairer, x -> 1f, 6); + ScalarField scalarField = vector -> vector.y() < -30f ? 0f : -(vector.y() + noise.apply(vector.divide(100f)) * 5f); + histogram = new Histogram(0.1f); + scalarField = vector -> { + if (vector.y() < 0f) { + return 0f; + } + float distanceSquared = vector.x() * vector.x() + vector.z() * vector.z(); + float cylinder = (float) (50.0 - Math.sqrt(distanceSquared)); + if (cylinder < -100f) { + return cylinder; + } + float terrain = (float) (-Math.tanh(vector.y() / 100.0) * 100.0 + + Math.pow(2f, noise2d.apply(vector.toXZVector().divide(300f))) * 5.0 + + Math.pow(2.5f, noise.apply(vector.divide(500f))) * 2.5); + histogram.add(terrain); + return Math.min(cylinder, terrain);}; + start(new Game(scalarField)); + } + case 1 -> { + ToIntFunction pairer = (b) -> (int) SzudzikIntPair.pair(b[0], b[1], b[2]); + var noise2d = new PerlinNoise(2, MurmurHash::createWithSeed, (b) -> SzudzikIntPair.pair(b[0], b[1]), x -> 1f, 4); + PerlinNoise noise = new PerlinNoise<>(3, MurmurHash::createWithSeed, pairer, x -> 1f, 7); + ScalarField scalarField = vector -> vector.y() < -30f ? 0f : -(vector.y() + noise.apply(vector.divide(100f)) * 5f); + histogram = new Histogram(0.1f); + scalarField = vector -> { + if (vector.y() < 0f) { + return 0f; + } + float distanceSquared = vector.x() * vector.x() + vector.z() * vector.z(); + float cylinder = (float) (50.0 - Math.sqrt(distanceSquared)); + if (cylinder < -100f) { + return cylinder; + } + float terrain = (float) (-Math.tanh(vector.y() / 100.0) * 20.0 + + Math.pow(2.75f, noise2d.apply(vector.toXZVector().divide(300f))) * 3.0 + + Math.pow(3.75f, noise.apply(vector.divide(500f))) * 3.5); + histogram.add(terrain); + return Math.min(cylinder, terrain);}; + start(new Game(scalarField)); + } case 2 -> start(FontTest.INSTANCE); } }