From 28735cea4eee822dfe2554fa32e5d234f6aaa427 Mon Sep 17 00:00:00 2001 From: austin Date: Sun, 30 Mar 2025 22:07:24 -0400 Subject: [PATCH] seed saved per world and ui input for seed --- .../ui/menu/mainmenu/MenuWorldSelect.java | 20 +++++++++++++++++-- .../loadingthreads/DebugSPWorldLoading.java | 2 +- .../engine/loadingthreads/ServerLoading.java | 2 +- .../electrosphere/entity/scene/SceneFile.java | 13 ++++++++++++ .../entity/scene/SceneGenerator.java | 6 ++++-- .../electrosphere/server/saves/SaveUtils.java | 2 +- .../TestGenerationChunkGenerator.java | 6 ++++++ .../continentphase/TerrainGenerator.java | 2 +- .../generation/heightmap/EmptySkyGen.java | 10 ++++++++++ .../heightmap/HeightmapGenerator.java | 6 ++++++ .../heightmap/HeightmapNoiseGen.java | 10 ++++++++++ .../generation/heightmap/HillsGen.java | 10 ++++++++++ .../generation/heightmap/MountainGen.java | 9 +++++++++ .../generation/heightmap/PlainsGen.java | 10 ++++++++++ .../generation/heightmap/SeaFloorGen.java | 10 ++++++++++ .../macro/DefaultMacroGenerator.java | 1 + .../voxelphase/AnimeMountainsGen.java | 10 ++++++++++ .../generation/voxelphase/HillsVoxelGen.java | 10 ++++++++++ .../voxelphase/MountainVoxelGen.java | 9 +++++++++ .../generation/voxelphase/NoiseVoxelGen.java | 10 ++++++++++ .../generation/voxelphase/VoxelGenerator.java | 6 ++++++ .../terrain/manager/ServerTerrainManager.java | 2 +- .../server/terrain/models/TerrainModel.java | 3 ++- 23 files changed, 159 insertions(+), 10 deletions(-) diff --git a/src/main/java/electrosphere/client/ui/menu/mainmenu/MenuWorldSelect.java b/src/main/java/electrosphere/client/ui/menu/mainmenu/MenuWorldSelect.java index 7c473ff5..cc5f6c59 100644 --- a/src/main/java/electrosphere/client/ui/menu/mainmenu/MenuWorldSelect.java +++ b/src/main/java/electrosphere/client/ui/menu/mainmenu/MenuWorldSelect.java @@ -11,6 +11,7 @@ import electrosphere.entity.scene.SceneGenerator; import electrosphere.renderer.ui.elements.Button; import electrosphere.renderer.ui.elements.Div; import electrosphere.renderer.ui.elements.FormElement; +import electrosphere.renderer.ui.elements.Label; import electrosphere.renderer.ui.elements.TextInput; import electrosphere.renderer.ui.elementtypes.ContainerElement.YogaAlignment; import electrosphere.renderer.ui.elementtypes.ContainerElement.YogaJustification; @@ -89,23 +90,37 @@ public class MenuWorldSelect { public static Element createWorldCreationMenu(){ FormElement rVal = new FormElement(); - //text entry (address) + //text entry (world name) Div worldNameInputContainer = Div.createRow(); worldNameInputContainer.setMarginBottom(20); + Label worldNameLabel = Label.createLabel("Input Name: "); + worldNameInputContainer.addChild(worldNameLabel); TextInput worldNameInput = TextInput.createTextInput(); worldNameInput.setMinWidth(100); worldNameInput.setMaxWidthPercent(50); worldNameInput.setText("World name"); worldNameInputContainer.addChild(worldNameInput); + //text entry (world seed) + Div worldSeedInputContainer = Div.createRow(); + worldSeedInputContainer.setMarginBottom(20); + Label worldSeedLabel = Label.createLabel("Input Seed: "); + worldSeedInputContainer.addChild(worldSeedLabel); + TextInput worldSeedInput = TextInput.createTextInput(); + worldSeedInput.setMinWidth(100); + worldSeedInput.setMaxWidthPercent(50); + worldSeedInput.setText(System.currentTimeMillis() + ""); + worldSeedInputContainer.addChild(worldSeedInput); + //button (create) Div createButtonContainer = Div.createCol(); createButtonContainer.setMarginTop(20); createButtonContainer.addChild(Button.createButton("Create", () -> { String saveName = worldNameInput.getText(); + String seed = worldSeedInput.getText(); //create save dir - SaveUtils.createOrOverwriteSave(saveName, SceneGenerator.createProceduralSceneFile(saveName)); + SaveUtils.createOrOverwriteSave(saveName, SceneGenerator.createProceduralSceneFile(saveName, seed)); WindowUtils.replaceMainMenuContents(MenuWorldSelect.createWorldSelectMenu()); })); @@ -113,6 +128,7 @@ public class MenuWorldSelect { //layout content Div mainLayout = Div.createCol( worldNameInputContainer, + worldSeedInputContainer, createButtonContainer ); mainLayout.setMarginTop(300); diff --git a/src/main/java/electrosphere/engine/loadingthreads/DebugSPWorldLoading.java b/src/main/java/electrosphere/engine/loadingthreads/DebugSPWorldLoading.java index 11b84fd9..695efdb5 100644 --- a/src/main/java/electrosphere/engine/loadingthreads/DebugSPWorldLoading.java +++ b/src/main/java/electrosphere/engine/loadingthreads/DebugSPWorldLoading.java @@ -33,7 +33,7 @@ public class DebugSPWorldLoading { //the juicy server GENERATION part // //init save structure - SaveUtils.createOrOverwriteSave(saveName, SceneGenerator.createProceduralSceneFile(saveName)); + SaveUtils.createOrOverwriteSave(saveName, SceneGenerator.createProceduralSceneFile(saveName, "")); } //load just-created save SaveUtils.loadSave(saveName, false); diff --git a/src/main/java/electrosphere/engine/loadingthreads/ServerLoading.java b/src/main/java/electrosphere/engine/loadingthreads/ServerLoading.java index 52df1606..e5128d3f 100644 --- a/src/main/java/electrosphere/engine/loadingthreads/ServerLoading.java +++ b/src/main/java/electrosphere/engine/loadingthreads/ServerLoading.java @@ -37,7 +37,7 @@ public class ServerLoading { //the juicy server GENERATION part // //init save structure - SaveUtils.createOrOverwriteSave(saveName, SceneGenerator.createProceduralSceneFile(saveName)); + SaveUtils.createOrOverwriteSave(saveName, SceneGenerator.createProceduralSceneFile(saveName, "")); } //load just-created save SaveUtils.loadSave(saveName, false); diff --git a/src/main/java/electrosphere/entity/scene/SceneFile.java b/src/main/java/electrosphere/entity/scene/SceneFile.java index 0df5b530..2e428950 100644 --- a/src/main/java/electrosphere/entity/scene/SceneFile.java +++ b/src/main/java/electrosphere/entity/scene/SceneFile.java @@ -38,6 +38,11 @@ public class SceneFile { */ boolean loadAllCells; + /** + * The seed for the random number generator + */ + long seed = 0; + /** * Private constructor @@ -117,4 +122,12 @@ public class SceneFile { return loadAllCells; } + /** + * Gets the seed of the scene file + * @return The seed + */ + public long getSeed(){ + return seed; + } + } diff --git a/src/main/java/electrosphere/entity/scene/SceneGenerator.java b/src/main/java/electrosphere/entity/scene/SceneGenerator.java index 5bb40e42..40f53a66 100644 --- a/src/main/java/electrosphere/entity/scene/SceneGenerator.java +++ b/src/main/java/electrosphere/entity/scene/SceneGenerator.java @@ -1,5 +1,7 @@ package electrosphere.entity.scene; +import java.util.Objects; + import electrosphere.server.datacell.gridded.GriddedDataCellManager; import electrosphere.server.terrain.generation.TestGenerationChunkGenerator; @@ -13,7 +15,7 @@ public class SceneGenerator { * @param gridSize The size of the terrain grid of the scene * @return The scene file */ - public static SceneFile createProceduralSceneFile(String saveName){ + public static SceneFile createProceduralSceneFile(String saveName, String seed){ //base file stuff SceneFile file = SceneFile.createSceneFile(); //realm descriptor stuff @@ -21,7 +23,7 @@ public class SceneGenerator { file.realmDescriptor.griddedRealmSize = GriddedDataCellManager.MAX_GRID_SIZE; file.createSaveInstance = true; //won't have a predefined scene to load, so must create one in the save file.loadAllCells = false; // do not load all cells on init - + file.seed = Objects.hash(seed); return file; } diff --git a/src/main/java/electrosphere/server/saves/SaveUtils.java b/src/main/java/electrosphere/server/saves/SaveUtils.java index b1c51688..83a7af31 100644 --- a/src/main/java/electrosphere/server/saves/SaveUtils.java +++ b/src/main/java/electrosphere/server/saves/SaveUtils.java @@ -115,7 +115,7 @@ public class SaveUtils { ServerWorldData serverWorldData = ServerWorldData.createGriddedRealmWorldData(ServerWorldData.PROCEDURAL_WORLD_SIZE); FileUtils.serializeObjectToSavePath(saveName, "./world.json", serverWorldData); //terrain manager - ServerTerrainManager serverTerrainManager = new ServerTerrainManager(serverWorldData, 0, new TestGenerationChunkGenerator(serverWorldData, false)); + ServerTerrainManager serverTerrainManager = new ServerTerrainManager(serverWorldData, sceneFile.getSeed(), new TestGenerationChunkGenerator(serverWorldData, false)); serverTerrainManager.generate(); serverTerrainManager.save(saveName); //fluid manager diff --git a/src/main/java/electrosphere/server/terrain/generation/TestGenerationChunkGenerator.java b/src/main/java/electrosphere/server/terrain/generation/TestGenerationChunkGenerator.java index 7f770f3b..4cc15fca 100644 --- a/src/main/java/electrosphere/server/terrain/generation/TestGenerationChunkGenerator.java +++ b/src/main/java/electrosphere/server/terrain/generation/TestGenerationChunkGenerator.java @@ -395,6 +395,12 @@ public class TestGenerationChunkGenerator implements ChunkGenerator { @Override public void setModel(TerrainModel model) { this.terrainModel = model; + for(HeightmapGenerator generator : this.tagHeightmapMap.values()){ + generator.setSeed(model.getSeed()); + } + for(VoxelGenerator generator : this.tagVoxelMap.values()){ + generator.setSeed(model.getSeed()); + } } } diff --git a/src/main/java/electrosphere/server/terrain/generation/continentphase/TerrainGenerator.java b/src/main/java/electrosphere/server/terrain/generation/continentphase/TerrainGenerator.java index eb52d08a..f1b524c0 100644 --- a/src/main/java/electrosphere/server/terrain/generation/continentphase/TerrainGenerator.java +++ b/src/main/java/electrosphere/server/terrain/generation/continentphase/TerrainGenerator.java @@ -169,7 +169,7 @@ public class TerrainGenerator { // MOUNTAIN_THRESHOLD * verticalInterpolationRatio, // dynamicInterpRatio // ); - rVal = TerrainModel.create(); + rVal = TerrainModel.create(0); //create internal renderer diff --git a/src/main/java/electrosphere/server/terrain/generation/heightmap/EmptySkyGen.java b/src/main/java/electrosphere/server/terrain/generation/heightmap/EmptySkyGen.java index a30955d3..f6c59798 100644 --- a/src/main/java/electrosphere/server/terrain/generation/heightmap/EmptySkyGen.java +++ b/src/main/java/electrosphere/server/terrain/generation/heightmap/EmptySkyGen.java @@ -2,6 +2,11 @@ package electrosphere.server.terrain.generation.heightmap; public class EmptySkyGen implements HeightmapGenerator { + /** + * The seed of the generator + */ + long seed = 0; + @Override public float getHeight(long SEED, double x, double y) { return 0; @@ -11,5 +16,10 @@ public class EmptySkyGen implements HeightmapGenerator { public String getTag() { return "empty"; } + + @Override + public void setSeed(long seed){ + this.seed = seed; + } } diff --git a/src/main/java/electrosphere/server/terrain/generation/heightmap/HeightmapGenerator.java b/src/main/java/electrosphere/server/terrain/generation/heightmap/HeightmapGenerator.java index 4989ff10..32088a7f 100644 --- a/src/main/java/electrosphere/server/terrain/generation/heightmap/HeightmapGenerator.java +++ b/src/main/java/electrosphere/server/terrain/generation/heightmap/HeightmapGenerator.java @@ -20,4 +20,10 @@ public interface HeightmapGenerator { */ public String getTag(); + /** + * Sets the seed of the generator + * @param seed The seed + */ + public void setSeed(long seed); + } diff --git a/src/main/java/electrosphere/server/terrain/generation/heightmap/HeightmapNoiseGen.java b/src/main/java/electrosphere/server/terrain/generation/heightmap/HeightmapNoiseGen.java index efd0ddc7..46c0db72 100644 --- a/src/main/java/electrosphere/server/terrain/generation/heightmap/HeightmapNoiseGen.java +++ b/src/main/java/electrosphere/server/terrain/generation/heightmap/HeightmapNoiseGen.java @@ -13,6 +13,11 @@ public class HeightmapNoiseGen implements HeightmapGenerator { */ String tag; + /** + * The seed of the generator + */ + long seed = 0; + /** * The sampler to pull from when allocating voxels */ @@ -36,5 +41,10 @@ public class HeightmapNoiseGen implements HeightmapGenerator { public String getTag() { return tag; } + + @Override + public void setSeed(long seed){ + this.seed = seed; + } } diff --git a/src/main/java/electrosphere/server/terrain/generation/heightmap/HillsGen.java b/src/main/java/electrosphere/server/terrain/generation/heightmap/HillsGen.java index e168b67d..aefd7163 100644 --- a/src/main/java/electrosphere/server/terrain/generation/heightmap/HillsGen.java +++ b/src/main/java/electrosphere/server/terrain/generation/heightmap/HillsGen.java @@ -40,6 +40,11 @@ public class HillsGen implements HeightmapGenerator { //param for controlling how pointer the initial layers are public static float GRAD_INFLUENCE_DROPOFF = 0.35f; + /** + * The seed of the generator + */ + long seed = 0; + /** * Gets the height at a given position for this generation approach @@ -95,5 +100,10 @@ public class HillsGen implements HeightmapGenerator { public String getTag() { return "hills"; } + + @Override + public void setSeed(long seed){ + this.seed = seed; + } } diff --git a/src/main/java/electrosphere/server/terrain/generation/heightmap/MountainGen.java b/src/main/java/electrosphere/server/terrain/generation/heightmap/MountainGen.java index 398fb411..31434148 100644 --- a/src/main/java/electrosphere/server/terrain/generation/heightmap/MountainGen.java +++ b/src/main/java/electrosphere/server/terrain/generation/heightmap/MountainGen.java @@ -46,6 +46,10 @@ public class MountainGen implements HeightmapGenerator { {0.3, 0.2}, }; + /** + * The seed of the generator + */ + long seed = 0; /** * Gets the height at a given position for this generation approach @@ -94,4 +98,9 @@ public class MountainGen implements HeightmapGenerator { public String getTag() { return "mountains"; } + + @Override + public void setSeed(long seed){ + this.seed = seed; + } } diff --git a/src/main/java/electrosphere/server/terrain/generation/heightmap/PlainsGen.java b/src/main/java/electrosphere/server/terrain/generation/heightmap/PlainsGen.java index fae93bad..0f9afcb0 100644 --- a/src/main/java/electrosphere/server/terrain/generation/heightmap/PlainsGen.java +++ b/src/main/java/electrosphere/server/terrain/generation/heightmap/PlainsGen.java @@ -17,6 +17,11 @@ public class PlainsGen implements HeightmapGenerator { */ static final float GEN_SCALE = 0.2f; + /** + * The seed of the generator + */ + long seed = 0; + //the different scales of noise to sample from static final double[][] NOISE_SCALES = new double[][]{ {0.01, 3.0}, @@ -61,5 +66,10 @@ public class PlainsGen implements HeightmapGenerator { public String getTag() { return "plains"; } + + @Override + public void setSeed(long seed){ + this.seed = seed; + } } diff --git a/src/main/java/electrosphere/server/terrain/generation/heightmap/SeaFloorGen.java b/src/main/java/electrosphere/server/terrain/generation/heightmap/SeaFloorGen.java index 0e9e863e..edf0a3b4 100644 --- a/src/main/java/electrosphere/server/terrain/generation/heightmap/SeaFloorGen.java +++ b/src/main/java/electrosphere/server/terrain/generation/heightmap/SeaFloorGen.java @@ -7,6 +7,11 @@ import electrosphere.util.noise.OpenSimplex2S; */ public class SeaFloorGen implements HeightmapGenerator { + /** + * The seed of the generator + */ + long seed = 0; + /** * The scale of the noise */ @@ -22,5 +27,10 @@ public class SeaFloorGen implements HeightmapGenerator { public String getTag() { return "seafloor"; } + + @Override + public void setSeed(long seed){ + this.seed = seed; + } } diff --git a/src/main/java/electrosphere/server/terrain/generation/macro/DefaultMacroGenerator.java b/src/main/java/electrosphere/server/terrain/generation/macro/DefaultMacroGenerator.java index fd6fb2a3..ed781bf3 100644 --- a/src/main/java/electrosphere/server/terrain/generation/macro/DefaultMacroGenerator.java +++ b/src/main/java/electrosphere/server/terrain/generation/macro/DefaultMacroGenerator.java @@ -17,6 +17,7 @@ public class DefaultMacroGenerator implements MacroGenerator { int DIM = model.getDiscreteArrayDimension(); float[][] elevation = model.getElevation(); short[][] biome = model.getBiome(); + long seed = model.getSeed(); for(int x = 0; x < DIM; x++){ for(int y = 0; y < DIM; y++){ diff --git a/src/main/java/electrosphere/server/terrain/generation/voxelphase/AnimeMountainsGen.java b/src/main/java/electrosphere/server/terrain/generation/voxelphase/AnimeMountainsGen.java index a180168e..0fb97ff5 100644 --- a/src/main/java/electrosphere/server/terrain/generation/voxelphase/AnimeMountainsGen.java +++ b/src/main/java/electrosphere/server/terrain/generation/voxelphase/AnimeMountainsGen.java @@ -57,11 +57,21 @@ public class AnimeMountainsGen implements VoxelGenerator { */ public static final double VERTICAL_ROTATION_OFFSET_VARIANCE = 0.2; + /** + * The seed for the generator + */ + long seed = 0; + @Override public String getTag() { return "animeMountain"; } + @Override + public void setSeed(long seed){ + this.seed = seed; + } + @Override public void getVoxel( GeneratedVoxel voxel, diff --git a/src/main/java/electrosphere/server/terrain/generation/voxelphase/HillsVoxelGen.java b/src/main/java/electrosphere/server/terrain/generation/voxelphase/HillsVoxelGen.java index 6c6722dd..a97bf35e 100644 --- a/src/main/java/electrosphere/server/terrain/generation/voxelphase/HillsVoxelGen.java +++ b/src/main/java/electrosphere/server/terrain/generation/voxelphase/HillsVoxelGen.java @@ -15,12 +15,22 @@ public class HillsVoxelGen implements VoxelGenerator { */ public static final int SURFACE_VOXEL_WIDTH = 2; + /** + * The seed of the generator + */ + long seed; + @Override public String getTag(){ return "hills"; } + @Override + public void setSeed(long seed){ + this.seed = seed; + } + @Override public void getVoxel( GeneratedVoxel voxel, diff --git a/src/main/java/electrosphere/server/terrain/generation/voxelphase/MountainVoxelGen.java b/src/main/java/electrosphere/server/terrain/generation/voxelphase/MountainVoxelGen.java index df2d88d1..b4c1f3c4 100644 --- a/src/main/java/electrosphere/server/terrain/generation/voxelphase/MountainVoxelGen.java +++ b/src/main/java/electrosphere/server/terrain/generation/voxelphase/MountainVoxelGen.java @@ -22,12 +22,21 @@ public class MountainVoxelGen implements VoxelGenerator { */ public static final float GRADIENT_DIRT_CUTOFF = 0.1f; + /** + * The seed of the generator + */ + long seed; @Override public String getTag(){ return "mountains"; } + @Override + public void setSeed(long seed){ + this.seed = seed; + } + @Override public void getVoxel( GeneratedVoxel voxel, diff --git a/src/main/java/electrosphere/server/terrain/generation/voxelphase/NoiseVoxelGen.java b/src/main/java/electrosphere/server/terrain/generation/voxelphase/NoiseVoxelGen.java index 7b32a794..8c1ba27b 100644 --- a/src/main/java/electrosphere/server/terrain/generation/voxelphase/NoiseVoxelGen.java +++ b/src/main/java/electrosphere/server/terrain/generation/voxelphase/NoiseVoxelGen.java @@ -31,6 +31,11 @@ public class NoiseVoxelGen implements VoxelGenerator { */ NoiseSampler sampler; + /** + * The seed of the generator + */ + long seed; + /** * Constructor * @param samplerDefinitionFile The file to model this generator off of @@ -45,6 +50,11 @@ public class NoiseVoxelGen implements VoxelGenerator { return tag; } + @Override + public void setSeed(long seed){ + this.seed = seed; + } + @Override public void getVoxel( GeneratedVoxel voxel, diff --git a/src/main/java/electrosphere/server/terrain/generation/voxelphase/VoxelGenerator.java b/src/main/java/electrosphere/server/terrain/generation/voxelphase/VoxelGenerator.java index f289bdf9..0c54e3d4 100644 --- a/src/main/java/electrosphere/server/terrain/generation/voxelphase/VoxelGenerator.java +++ b/src/main/java/electrosphere/server/terrain/generation/voxelphase/VoxelGenerator.java @@ -17,6 +17,12 @@ public interface VoxelGenerator { */ public String getTag(); + /** + * Sets the seed of the generator + * @param seed The seed + */ + public void setSeed(long seed); + /** * Gets the value for a chunk diff --git a/src/main/java/electrosphere/server/terrain/manager/ServerTerrainManager.java b/src/main/java/electrosphere/server/terrain/manager/ServerTerrainManager.java index 8bb94681..c5728471 100644 --- a/src/main/java/electrosphere/server/terrain/manager/ServerTerrainManager.java +++ b/src/main/java/electrosphere/server/terrain/manager/ServerTerrainManager.java @@ -100,7 +100,7 @@ public class ServerTerrainManager { * Generates a terrain model for the manager */ public void generate(){ - this.model = TerrainModel.create(); + this.model = TerrainModel.create(this.seed); DefaultMacroGenerator generator = new DefaultMacroGenerator(); generator.generate(this.model); this.chunkGenerator.setModel(this.model); diff --git a/src/main/java/electrosphere/server/terrain/models/TerrainModel.java b/src/main/java/electrosphere/server/terrain/models/TerrainModel.java index 191e4139..fbc43402 100644 --- a/src/main/java/electrosphere/server/terrain/models/TerrainModel.java +++ b/src/main/java/electrosphere/server/terrain/models/TerrainModel.java @@ -83,10 +83,11 @@ public class TerrainModel { * Creates the default terrain model * @return The default terrain model */ - public static TerrainModel create(){ + public static TerrainModel create(long seed){ TerrainModel rVal = new TerrainModel(); rVal.elevation = new float[rVal.discreteArrayDimension][rVal.discreteArrayDimension]; rVal.biome = new short[rVal.discreteArrayDimension][rVal.discreteArrayDimension]; + rVal.seed = seed; return rVal; }