ability to select voxel for basic level
All checks were successful
studiorailgun/Renderer/pipeline/head This commit looks good

This commit is contained in:
austin 2024-09-10 20:00:10 -04:00
parent 3fd97d415a
commit e099fa9429
6 changed files with 108 additions and 20 deletions

View File

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

View File

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

View File

@ -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<VoxelType> 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<VoxelType> onSelectType){
scrollable.clearChildren();
VoxelData voxelData = Globals.gameConfigCurrent.getVoxelData();
List<VoxelType> 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);
}
}

View File

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

View File

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

View File

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