diff --git a/src/main/java/electrosphere/entity/scene/RealmDescriptor.java b/src/main/java/electrosphere/entity/scene/RealmDescriptor.java index 4542df8d..d2648ed9 100644 --- a/src/main/java/electrosphere/entity/scene/RealmDescriptor.java +++ b/src/main/java/electrosphere/entity/scene/RealmDescriptor.java @@ -10,6 +10,11 @@ public class RealmDescriptor { */ public static final String REALM_DESCRIPTOR_GRIDDED = "gridded"; public static final String REALM_DESCRIPTOR_PROCEDURAL = "procedural"; + + /** + * The dirt voxel type's id + */ + public static final int VOXEL_DIRT_ID = 1; /** * The type of realm @@ -21,6 +26,11 @@ public class RealmDescriptor { */ int griddedRealmSize; + /** + * The base voxel type to generate with + */ + Integer baseVoxel = VOXEL_DIRT_ID; + /** * Gets the type of realm @@ -54,4 +64,20 @@ public class RealmDescriptor { this.griddedRealmSize = size; } + /** + * Gets the id of the base voxel type + * @return the id of the base voxel type + */ + public Integer getBaseVoxel(){ + return this.baseVoxel; + } + + /** + * Sets the base voxel type + * @param voxelId The voxel type's id + */ + public void setBaseVoxel(int voxelId){ + this.baseVoxel = voxelId; + } + } diff --git a/src/main/java/electrosphere/entity/scene/SceneLoader.java b/src/main/java/electrosphere/entity/scene/SceneLoader.java index fef04988..29df2b24 100644 --- a/src/main/java/electrosphere/entity/scene/SceneLoader.java +++ b/src/main/java/electrosphere/entity/scene/SceneLoader.java @@ -12,6 +12,7 @@ import electrosphere.game.server.world.ServerWorldData; import electrosphere.server.content.ServerContentManager; import electrosphere.server.datacell.GriddedDataCellManager; import electrosphere.server.datacell.Realm; +import electrosphere.server.terrain.generation.DefaultChunkGenerator; import electrosphere.util.FileUtils; /** @@ -69,6 +70,12 @@ public class SceneLoader { if(file.loadAllCells()){ ((GriddedDataCellManager)realm.getDataCellManager()).loadAllCells(); } + if(file.getRealmDescriptor() != null && file.getRealmDescriptor().getType().equals(RealmDescriptor.REALM_DESCRIPTOR_GRIDDED)){ + if(serverWorldData.getServerTerrainManager().getChunkGenerator() instanceof DefaultChunkGenerator){ + DefaultChunkGenerator chunkGenerator = (DefaultChunkGenerator)serverWorldData.getServerTerrainManager().getChunkGenerator(); + chunkGenerator.setBaseVoxelId(file.getRealmDescriptor().getBaseVoxel()); + } + } } break; case RealmDescriptor.REALM_DESCRIPTOR_PROCEDURAL: { realm = Globals.realmManager.createRealm(); diff --git a/src/main/java/electrosphere/menu/ingame/MenuGeneratorsTerrainEditing.java b/src/main/java/electrosphere/menu/ingame/MenuGeneratorsTerrainEditing.java index 2bc993b2..a82b4535 100644 --- a/src/main/java/electrosphere/menu/ingame/MenuGeneratorsTerrainEditing.java +++ b/src/main/java/electrosphere/menu/ingame/MenuGeneratorsTerrainEditing.java @@ -1,6 +1,7 @@ package electrosphere.menu.ingame; import java.util.List; +import java.util.function.Consumer; import electrosphere.engine.Globals; import electrosphere.engine.signal.Signal.SignalType; @@ -9,6 +10,7 @@ import electrosphere.game.data.voxel.VoxelType; import electrosphere.menu.WindowStrings; import electrosphere.menu.WindowUtils; import electrosphere.renderer.ui.elements.Button; +import electrosphere.renderer.ui.elements.Div; import electrosphere.renderer.ui.elements.ImagePanel; import electrosphere.renderer.ui.elements.Label; import electrosphere.renderer.ui.elements.TextInput; @@ -29,7 +31,7 @@ import electrosphere.renderer.ui.events.NavigationEvent; */ public class MenuGeneratorsTerrainEditing { - static Window rVal; + static Window terrainEditingSidePanelWindow; //text input static final int TEXT_INPUT_HEIGHT = 50; @@ -49,17 +51,46 @@ public class MenuGeneratorsTerrainEditing { static final int WINDOW_WIDTH = VOXEL_SCROLLABLE_WIDTH; static final int WINDOW_HEIGHT = VOXEL_SCROLLABLE_HEIGHT + TEXT_INPUT_HEIGHT; + /** + * Creates the level editor side panel window + * @return + */ + public static Window createVoxelTypeSelectionPanel(){ + //setup window + terrainEditingSidePanelWindow = new Window(Globals.renderingEngine.getOpenGLState(),0,0,WINDOW_WIDTH,WINDOW_HEIGHT,true); + terrainEditingSidePanelWindow.setParentAlignContent(YogaAlignment.Center); + terrainEditingSidePanelWindow.setParentJustifyContent(YogaJustification.Center); + terrainEditingSidePanelWindow.setParentAlignItem(YogaAlignment.Center); + terrainEditingSidePanelWindow.setAlignContent(YogaAlignment.Center); + terrainEditingSidePanelWindow.setAlignItems(YogaAlignment.Center); + terrainEditingSidePanelWindow.setJustifyContent(YogaJustification.Center); + terrainEditingSidePanelWindow.setFlexDirection(YogaFlexDirection.Column); + + //nav logic + terrainEditingSidePanelWindow.setOnNavigationCallback(new NavigationEventCallback() {public boolean execute(NavigationEvent event){ + WindowUtils.closeWindow(WindowStrings.VOXEL_TYPE_SELECTION); + MenuGeneratorsLevelEditor.voxelWindowOpen = false; + return false; + }}); + + //attach scrollable after search input for organzation purposes + terrainEditingSidePanelWindow.addChild(createVoxelTypeSelectionPanel((VoxelType type) -> { + Globals.clientSelectedVoxelType = type; + })); + + Globals.signalSystem.post(SignalType.YOGA_APPLY,terrainEditingSidePanelWindow); + + return terrainEditingSidePanelWindow; + } + /** * Creates the level editor side panel top view * @return */ - public static Window createVoxelTypeSelectionPanel(){ + public static Div createVoxelTypeSelectionPanel(Consumer onSelectType){ //setup window - rVal = new Window(Globals.renderingEngine.getOpenGLState(),0,0,WINDOW_WIDTH,WINDOW_HEIGHT,true); - rVal.setParentAlignContent(YogaAlignment.Center); - rVal.setParentJustifyContent(YogaJustification.Center); - rVal.setParentAlignItem(YogaAlignment.Center); + Div rVal = Div.createDiv(); rVal.setAlignContent(YogaAlignment.Center); rVal.setAlignItems(YogaAlignment.Center); rVal.setJustifyContent(YogaJustification.Center); @@ -69,11 +100,6 @@ public class MenuGeneratorsTerrainEditing { VirtualScrollable scrollable = new VirtualScrollable(VOXEL_SCROLLABLE_WIDTH, VOXEL_SCROLLABLE_HEIGHT); scrollable.setFlexDirection(YogaFlexDirection.Row); scrollable.setAlignItems(YogaAlignment.Start); - rVal.setOnNavigationCallback(new NavigationEventCallback() {public boolean execute(NavigationEvent event){ - WindowUtils.closeWindow(WindowStrings.VOXEL_TYPE_SELECTION); - MenuGeneratorsLevelEditor.voxelWindowOpen = false; - return false; - }}); //search input TextInput searchInput = TextInput.createTextInput(); @@ -82,7 +108,7 @@ public class MenuGeneratorsTerrainEditing { searchInput.setMinHeight(20); searchInput.setOnPress(new KeyboardEventCallback() {public boolean execute(KeyboardEvent event){ boolean rVal = searchInput.defaultKeyHandling(event); - fillInVoxelSelectors(scrollable, searchInput.getText()); + fillInVoxelSelectors(scrollable, searchInput.getText(), onSelectType); return rVal; }}); rVal.addChild(searchInput); @@ -92,11 +118,8 @@ public class MenuGeneratorsTerrainEditing { rVal.addChild(scrollable); //final step - fillInVoxelSelectors(scrollable, searchInput.getText()); + fillInVoxelSelectors(scrollable, searchInput.getText(), onSelectType); - - Globals.signalSystem.post(SignalType.YOGA_APPLY,rVal); - return rVal; } @@ -105,7 +128,7 @@ public class MenuGeneratorsTerrainEditing { * @param scrollable the scrollable to drop selection buttons in to * @param searchString the string to search based on */ - static void fillInVoxelSelectors(VirtualScrollable scrollable, String searchString){ + static void fillInVoxelSelectors(VirtualScrollable scrollable, String searchString, Consumer onSelectType){ scrollable.clearChildren(); VoxelData voxelData = Globals.gameConfigCurrent.getVoxelData(); List matchingVoxels = voxelData.getTypes().stream().filter((type)->type.getName().toLowerCase().contains(searchString.toLowerCase())).toList(); @@ -138,13 +161,12 @@ public class MenuGeneratorsTerrainEditing { newButton.addChild(voxelLabel); newButton.setOnClick(new ClickEventCallback() {public boolean execute(ClickEvent event){ //set voxel type to this type + onSelectType.accept(type); Globals.clientSelectedVoxelType = type; return false; }}); scrollable.addChild(newButton); } - - Globals.signalSystem.post(SignalType.YOGA_APPLY,rVal); } } diff --git a/src/main/java/electrosphere/menu/mainmenu/MenuGeneratorsLevelEditor.java b/src/main/java/electrosphere/menu/mainmenu/MenuGeneratorsLevelEditor.java index 66002ddf..08ec578b 100644 --- a/src/main/java/electrosphere/menu/mainmenu/MenuGeneratorsLevelEditor.java +++ b/src/main/java/electrosphere/menu/mainmenu/MenuGeneratorsLevelEditor.java @@ -6,7 +6,9 @@ import electrosphere.engine.Globals; import electrosphere.engine.loadingthreads.LoadingThread; import electrosphere.engine.loadingthreads.LoadingThread.LoadingThreadType; import electrosphere.entity.scene.SceneFile; +import electrosphere.game.data.voxel.VoxelType; import electrosphere.menu.WindowUtils; +import electrosphere.menu.ingame.MenuGeneratorsTerrainEditing; import electrosphere.renderer.ui.elements.Button; import electrosphere.renderer.ui.elements.Div; import electrosphere.renderer.ui.elements.FormElement; @@ -189,6 +191,9 @@ public class MenuGeneratorsLevelEditor { }, DEFAULT_GRID_SIZE / (float)GriddedDataCellManager.MAX_GRID_SIZE) ); sceneFile.getRealmDescriptor().setGriddedRealmSize(DEFAULT_GRID_SIZE); + griddedRealmControls.addChild(MenuGeneratorsTerrainEditing.createVoxelTypeSelectionPanel((VoxelType type) -> { + sceneFile.getRealmDescriptor().setBaseVoxel(type.getId()); + })); } rVal.addChild(griddedRealmControls); diff --git a/src/main/java/electrosphere/server/terrain/generation/DefaultChunkGenerator.java b/src/main/java/electrosphere/server/terrain/generation/DefaultChunkGenerator.java index 6b046f24..c3c2518b 100644 --- a/src/main/java/electrosphere/server/terrain/generation/DefaultChunkGenerator.java +++ b/src/main/java/electrosphere/server/terrain/generation/DefaultChunkGenerator.java @@ -1,5 +1,6 @@ package electrosphere.server.terrain.generation; +import electrosphere.entity.scene.RealmDescriptor; import electrosphere.server.terrain.generation.interfaces.ChunkGenerator; import electrosphere.server.terrain.manager.ServerTerrainChunk; import electrosphere.server.terrain.models.TerrainModel; @@ -9,6 +10,17 @@ import electrosphere.server.terrain.models.TerrainModel; */ public class DefaultChunkGenerator implements ChunkGenerator { + /** + * The id to generate the floor with + */ + int baseVoxelId = RealmDescriptor.VOXEL_DIRT_ID; + + /** + * Constructor + */ + public DefaultChunkGenerator(){ + } + @Override public ServerTerrainChunk generateChunk(int worldX, int worldY, int worldZ) { //Each chunk also needs custody of the next chunk's first values so that they can perfectly overlap. @@ -27,7 +39,7 @@ public class DefaultChunkGenerator implements ChunkGenerator { for(int weightX = 0; weightX < ServerTerrainChunk.CHUNK_DIMENSION; weightX++){ for(int weightZ = 0; weightZ < ServerTerrainChunk.CHUNK_DIMENSION; weightZ++){ weights[weightX][0][weightZ] = 0.1f; - values[weightX][0][weightZ] = 1; + values[weightX][0][weightZ] = baseVoxelId; } } } @@ -39,5 +51,13 @@ public class DefaultChunkGenerator implements ChunkGenerator { public void setModel(TerrainModel model) { //Does nothing as the arena is not based on a terrain model } + + /** + * Sets the base voxel id of the chunk generator + * @param baseVoxelId The base voxel id + */ + public void setBaseVoxelId(int baseVoxelId){ + this.baseVoxelId = baseVoxelId; + } } diff --git a/src/main/java/electrosphere/server/terrain/manager/ServerTerrainManager.java b/src/main/java/electrosphere/server/terrain/manager/ServerTerrainManager.java index 0ad76a49..49bc9ff8 100644 --- a/src/main/java/electrosphere/server/terrain/manager/ServerTerrainManager.java +++ b/src/main/java/electrosphere/server/terrain/manager/ServerTerrainManager.java @@ -282,5 +282,13 @@ public class ServerTerrainManager { public void setParent(ServerWorldData serverWorldData){ this.parent = serverWorldData; } + + /** + * Gets the chunk generator of the terrain manager + * @return The chunk generator + */ + public ChunkGenerator getChunkGenerator(){ + return chunkGenerator; + } }