Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 8 additions & 25 deletions src/main/java/lemon/evolution/Game.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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<int[]> pairer = (b) -> (int) SzudzikIntPair.pair(b[0], b[1], b[2]);
var noise2d = new PerlinNoise<Vector2D>(2, MurmurHash::createWithSeed, (b) -> SzudzikIntPair.pair(b[0], b[1]), x -> 1f, 6);
PerlinNoise<Vector3D> noise = new PerlinNoise<>(3, MurmurHash::createWithSeed, pairer, x -> 1f, 6);
ScalarField<Vector3D> 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) -> {});
Expand Down
55 changes: 54 additions & 1 deletion src/main/java/lemon/evolution/Menu.java
Original file line number Diff line number Diff line change
@@ -1,24 +1,34 @@
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;
import org.lwjgl.glfw.GLFW;

import java.util.ArrayList;
import java.util.List;
import java.util.function.ToIntFunction;

public enum Menu implements Screen {
INSTANCE;
private GLFWWindow window;
private List<Quad2D> buttons;
private final Disposables disposables = new Disposables();
private Histogram histogram;


@Override
public void onLoad(GLFWWindow window) {
Expand All @@ -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<int[]> pairer = (b) -> (int) SzudzikIntPair.pair(b[0], b[1], b[2]);
var noise2d = new PerlinNoise<Vector2D>(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<Vector3D> 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<int[]> pairer = (b) -> (int) SzudzikIntPair.pair(b[0], b[1], b[2]);
var noise2d = new PerlinNoise<Vector2D>(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<Vector3D> 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);
}
}
Expand Down