ability to select voxel for basic level
All checks were successful
studiorailgun/Renderer/pipeline/head This commit looks good
All checks were successful
studiorailgun/Renderer/pipeline/head This commit looks good
This commit is contained in:
parent
3fd97d415a
commit
e099fa9429
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -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();
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -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);
|
||||
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user