seed saved per world and ui input for seed
All checks were successful
studiorailgun/Renderer/pipeline/head This commit looks good

This commit is contained in:
austin 2025-03-30 22:07:24 -04:00
parent 32641d0035
commit 28735cea4e
23 changed files with 159 additions and 10 deletions

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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;
}
}

View File

@ -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;
}

View File

@ -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

View File

@ -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());
}
}
}

View File

@ -169,7 +169,7 @@ public class TerrainGenerator {
// MOUNTAIN_THRESHOLD * verticalInterpolationRatio,
// dynamicInterpRatio
// );
rVal = TerrainModel.create();
rVal = TerrainModel.create(0);
//create internal renderer

View File

@ -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;
@ -12,4 +17,9 @@ public class EmptySkyGen implements HeightmapGenerator {
return "empty";
}
@Override
public void setSeed(long seed){
this.seed = seed;
}
}

View File

@ -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);
}

View File

@ -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
*/
@ -37,4 +42,9 @@ public class HeightmapNoiseGen implements HeightmapGenerator {
return tag;
}
@Override
public void setSeed(long seed){
this.seed = seed;
}
}

View File

@ -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
@ -96,4 +101,9 @@ public class HillsGen implements HeightmapGenerator {
return "hills";
}
@Override
public void setSeed(long seed){
this.seed = seed;
}
}

View File

@ -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;
}
}

View File

@ -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},
@ -62,4 +67,9 @@ public class PlainsGen implements HeightmapGenerator {
return "plains";
}
@Override
public void setSeed(long seed){
this.seed = seed;
}
}

View File

@ -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
*/
@ -23,4 +28,9 @@ public class SeaFloorGen implements HeightmapGenerator {
return "seafloor";
}
@Override
public void setSeed(long seed){
this.seed = seed;
}
}

View File

@ -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++){

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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

View File

@ -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);

View File

@ -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;
}