package electrosphere.menu; import java.util.List; import org.joml.Vector3f; import electrosphere.auth.AuthenticationManager; import electrosphere.controls.ControlHandler.ControlsState; import electrosphere.engine.Globals; import electrosphere.engine.Main; import electrosphere.engine.loadingthreads.LoadingThread; import electrosphere.entity.Entity; import electrosphere.entity.EntityDataStrings; import electrosphere.entity.EntityUtils; import electrosphere.entity.types.camera.CameraEntityUtils; import electrosphere.entity.types.creature.CreatureUtils; import electrosphere.game.data.creature.type.CreatureType; import electrosphere.game.data.creature.type.visualattribute.VisualAttribute; import electrosphere.net.NetUtils; import electrosphere.renderer.Model; import electrosphere.renderer.RenderingEngine; import electrosphere.renderer.actor.Actor; import electrosphere.renderer.actor.ActorStaticMorph; import electrosphere.renderer.actor.ActorUtils; import electrosphere.renderer.ui.ClickableElement; import electrosphere.renderer.ui.Element; import electrosphere.renderer.ui.NavigableElement.NavigationEventCallback; import electrosphere.renderer.ui.ValueElement.ValueChangeEventCallback; import electrosphere.renderer.ui.Window; import electrosphere.renderer.ui.elements.ActorPanel; 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.ScrollableContainer; import electrosphere.renderer.ui.elements.Slider; import electrosphere.renderer.ui.elements.TextInput; import electrosphere.renderer.ui.events.ClickEvent; import electrosphere.renderer.ui.events.NavigationEvent; import electrosphere.renderer.ui.events.ValueChangeEvent; import electrosphere.renderer.ui.form.FormElement; import electrosphere.server.saves.SaveUtils; import electrosphere.server.terrain.manager.ServerTerrainManager; /** * * @author amaterasu */ public class MenuGenerators { //Used when we're displaying loading window to make main menu invisible public static Element createEmptyMainMenu(){ Div rVal = new Div(); return rVal; } public static Element createWorldSelectMenu(){ FormElement rVal = new FormElement(); // int screenTop = Globals.WINDOW_HEIGHT - 150; List saveNames = SaveUtils.getSaves(); int verticalPosition = 125; for(String saveName : saveNames){ if(!saveName.startsWith(".")){ //button (select save) Button selectButton = new Button(); Label selectLabel = new Label(100,125 + verticalPosition,1.0f); selectLabel.setText(saveName.toUpperCase()); selectButton.addChild(selectLabel); rVal.addChild(selectButton); selectButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){ if(SaveUtils.worldHasSave(saveName.toLowerCase())){ //need to log client in Globals.clientUsername = "username"; Globals.clientPassword = AuthenticationManager.getHashedString("password"); LoadingThread clientThread = new LoadingThread(LoadingThread.LOAD_CHARACTER_SERVER); Globals.loadingThreadsList.add(clientThread); LoadingThread serverThread = new LoadingThread(LoadingThread.LOAD_MAIN_GAME); Globals.loadingThreadsList.add(serverThread); Globals.RUN_CLIENT = true; Globals.RUN_SERVER = true; serverThread.start(); clientThread.start(); } else { Globals.currentSaveName = saveName.toLowerCase(); SaveUtils.loadTerrainAndCreateWorldData(saveName.toLowerCase()); WindowUtils.replaceMainMenuContents(MenuGenerators.createSaveCreationMenu()); } return false; }}); verticalPosition = verticalPosition + 75; } } //button (create) Button createButton = new Button(); Label createLabel = new Label(100,125 + verticalPosition + 200,1.0f); createLabel.setText("Create World"); createButton.addChild(createLabel); rVal.addChild(createButton); createButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){ WindowUtils.replaceMainMenuContents(MenuGenerators.createWorldCreationMenu()); return false; }}); return rVal; } public static Element createWorldCreationMenu(){ FormElement rVal = new FormElement(); int screenTop = 150; // List saveNames = SaveUtils.getSaves(); int verticalPosition = 125; //TODO: add text input to name world //text entry (address) TextInput worldNameInput = new TextInput(100,screenTop + 125,1.0f); worldNameInput.setText("World name"); rVal.addChild(worldNameInput); //button (create) Button createButton = new Button(); Label createLabel = new Label(100,screenTop + verticalPosition,1.0f); createLabel.setText("Create"); createButton.addChild(createLabel); rVal.addChild(createButton); createButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){ String saveName = worldNameInput.getText(); //create save dir SaveUtils.createOrOverwriteSave(saveName); //create and save terrain ServerTerrainManager terrainManager = new ServerTerrainManager(2000,50,0.0f,0); terrainManager.generate(); terrainManager.save(SaveUtils.deriveSaveDirectoryPath(saveName)); WindowUtils.replaceMainMenuContents(MenuGenerators.createWorldSelectMenu()); return false; }}); return rVal; } public static Element createSaveCreationMenu(){ FormElement rVal = new FormElement(); int screenTop = 150; //button (save) Button saveButton = new Button(); Label saveLabel = new Label(100,screenTop + 125,1.0f); saveLabel.setText("Save"); saveButton.addChild(saveLabel); rVal.addChild(saveButton); saveButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){ SaveUtils.saveWorldDataToSave(Globals.currentSaveName); WindowUtils.replaceMainMenuContents(MenuGenerators.createWorldSelectMenu()); return false; }}); //button (cancel) Button cancelButton = new Button(); Label cancelLabel = new Label(100,screenTop + 200,1.0f); cancelLabel.setText("Cancel"); cancelButton.addChild(cancelLabel); rVal.addChild(cancelButton); saveButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){ WindowUtils.replaceMainMenuContents(MenuGenerators.createWorldSelectMenu()); return false; }}); return rVal; } public static Element createCharacterCreationMenu(){ FormElement rVal = new FormElement(); int screenTop = 150; // List saveNames = SaveUtils.getSaves(); int verticalPosition = 125; //TODO: add text input to name world //button (create) Button createButton = new Button(); Label createLabel = new Label(100,screenTop + verticalPosition,1.0f); createLabel.setText("Create World"); createButton.addChild(createLabel); rVal.addChild(createButton); return rVal; } public static Element createFinalizeSaveCreationMenu(){ FormElement rVal = new FormElement(); int screenTop = 150; // List saveNames = SaveUtils.getSaves(); int verticalPosition = 125; //TODO: add text input to name world //button (create) Button createButton = new Button(); Label createLabel = new Label(100,screenTop + verticalPosition,1.0f); createLabel.setText("Create World"); createButton.addChild(createLabel); rVal.addChild(createButton); return rVal; } public static Element createMultiplayerMenu(){ FormElement rVal = new FormElement(); int screenTop = 150; //button (host) Button hostButton = new Button(); Label hostLabel = new Label(100,screenTop + 125,1.0f); hostLabel.setText("Host"); hostButton.addChild(hostLabel); rVal.addChild(hostButton); hostButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){ LoadingThread clientThread = new LoadingThread(LoadingThread.LOAD_CHARACTER_SERVER); Globals.loadingThreadsList.add(clientThread); LoadingThread serverThread = new LoadingThread(LoadingThread.LOAD_MAIN_GAME); Globals.loadingThreadsList.add(serverThread); Globals.RUN_CLIENT = true; Globals.RUN_SERVER = true; clientThread.start(); serverThread.start(); return false; }}); //button (join) Button joinButton = new Button(); Label joinLabel = new Label(100,screenTop + 200,1.0f); joinLabel.setText("Join"); joinButton.addChild(joinLabel); rVal.addChild(joinButton); joinButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){ WindowUtils.replaceMainMenuContents(MenuGenerators.createIPMenu()); return false; }}); //button (back) Button connectButton = new Button(); Label connectLabel = new Label(100,screenTop + 275,1.0f); connectLabel.setText("Back"); connectButton.addChild(connectLabel); rVal.addChild(connectButton); connectButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){ WindowUtils.replaceMainMenuContents(MenuGeneratorsTitleMenu.createTitleMenu()); return false; }}); return rVal; } public static Element createIPMenu(){ FormElement rVal = new FormElement(); int screenTop = 150; //label (address) Label addressLabel = new Label(100,screenTop + 50,1.0f); addressLabel.setText("IP Address"); rVal.addChild(addressLabel); //text entry (address) TextInput addressInput = new TextInput(100,screenTop + 125,1.0f); addressInput.setText(NetUtils.getAddress()); rVal.addChild(addressInput); //label (port) Label portLabel = new Label(100,screenTop + 200,1.0f); portLabel.setText("Port"); rVal.addChild(portLabel); //text entry (port) TextInput portInput = new TextInput(100,screenTop + 275,1.0f); portInput.setText(NetUtils.getPort() + ""); rVal.addChild(portInput); //label (address) Label usernameLabel = new Label(100,screenTop + 350,1.0f); usernameLabel.setText("Username"); rVal.addChild(usernameLabel); //text entry (address) TextInput usernameInput = new TextInput(100,screenTop + 425,1.0f); usernameInput.setText(""); rVal.addChild(usernameInput); //label (port) Label passwordLabel = new Label(100,screenTop + 500,1.0f); passwordLabel.setText("Password"); rVal.addChild(passwordLabel); //text entry (port) TextInput passwordInput = new TextInput(100,screenTop + 575,1.0f); passwordInput.setText(""); rVal.addChild(passwordInput); //button (connect) Button connectButton = new Button(); Label connectLabel = new Label(100,screenTop + 650,1.0f); connectLabel.setText("Connect"); connectButton.addChild(connectLabel); rVal.addChild(connectButton); connectButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){ NetUtils.setAddress(addressInput.getText()); NetUtils.setPort(Integer.parseInt(portInput.getText())); Globals.clientUsername = usernameInput.getText(); Globals.clientPassword = AuthenticationManager.getHashedString(passwordInput.getText()); LoadingThread clientThread = new LoadingThread(LoadingThread.LOAD_CHARACTER_SERVER); Globals.loadingThreadsList.add(clientThread); Globals.RUN_CLIENT = true; Globals.RUN_SERVER = false; clientThread.start(); return false; }}); //button (back) Button backButton = new Button(); Label backLabel = new Label(100,screenTop + 725,1.0f); backLabel.setText("Back"); backButton.addChild(backLabel); rVal.addChild(backButton); backButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){ WindowUtils.replaceMainMenuContents(MenuGenerators.createMultiplayerMenu()); return false; }}); return rVal; } public static Element createOptionsMainMenu(){ FormElement rVal = new FormElement(); int screenTop = 150; //label (options) Label optionsLabel = new Label(100,screenTop + 50,1.0f); optionsLabel.setText("Options"); rVal.addChild(optionsLabel); //button (back) Button backButton = new Button(); Label backLabel = new Label(100,screenTop + 275,1.0f); backLabel.setText("Back"); backButton.addChild(backLabel); rVal.addChild(backButton); backButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){ WindowUtils.replaceMainMenuContents(MenuGeneratorsTitleMenu.createTitleMenu()); return false; }}); return rVal; } public static Element createUITestMenu(){ FormElement rVal = new FormElement(); int screenTop = 150; //button (back) Button backButton = new Button(); Label backLabel = new Label(100,screenTop + 275,1.0f); backLabel.setText("Back"); backButton.addChild(backLabel); rVal.addChild(backButton); backButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){ WindowUtils.replaceMainMenuContents(MenuGeneratorsTitleMenu.createTitleMenu()); return false; }}); //slider test Slider slider = new Slider(0, 0, 500, 100, new Vector3f(0.1f,0.1f,0.1f), new Vector3f(1,0,0)); rVal.addChild(slider); ActorPanel actorPanel = new ActorPanel(500, 100, 500, 500, ActorUtils.createActorFromModelPath("Models/deer1.fbx")); if(Globals.playerCamera == null){ Globals.playerCamera = CameraEntityUtils.spawnBasicCameraEntity(new Vector3f(0,0,0), new Vector3f(-1,0,0)); } rVal.addChild(actorPanel); // slider = new Slider(0, 100, 500, 100, new Vector3f(0.1f,0.1f,0.1f), new Vector3f(1,0,0)); // rVal.addChild(slider); // slider = new Slider(0, 200, 500, 100, new Vector3f(0.1f,0.1f,0.1f), new Vector3f(1,0,0)); // rVal.addChild(slider); // slider = new Slider(0, 300, 500, 100, new Vector3f(0.1f,0.1f,0.1f), new Vector3f(1,0,0)); // rVal.addChild(slider); // slider = new Slider(0, 400, 500, 100, new Vector3f(0.1f,0.1f,0.1f), new Vector3f(1,0,0)); // rVal.addChild(slider); // slider = new Slider(0, 500, 500, 100, new Vector3f(0.1f,0.1f,0.1f), new Vector3f(1,0,0)); // rVal.addChild(slider); // slider = new Slider(0, 600, 500, 100, new Vector3f(0.1f,0.1f,0.1f), new Vector3f(1,0,0)); // rVal.addChild(slider); // slider = new Slider(0, 700, 500, 100, new Vector3f(0.1f,0.1f,0.1f), new Vector3f(1,0,0)); // rVal.addChild(slider); // slider = new Slider(0, 800, 500, 100, new Vector3f(0.1f,0.1f,0.1f), new Vector3f(1,0,0)); // rVal.addChild(slider); // slider = new Slider(0, 900, 500, 100, new Vector3f(0.1f,0.1f,0.1f), new Vector3f(1,0,0)); // rVal.addChild(slider); return rVal; } public static Window createInGameMainMenu(){ // int screenTop = Globals.WINDOW_HEIGHT - 150; int width = 500; int height = 500; Window rVal = new Window(0,0,width,height); // int screenLeft = (Globals.WINDOW_WIDTH - width)/2; Div div = new Div(); rVal.addChild(div); div.setOnNavigationCallback(new NavigationEventCallback() {public boolean execute(NavigationEvent event){ WindowUtils.recursiveSetVisible(Globals.elementManager.getWindow(WindowStrings.WINDOW_MENU_INGAME_MAIN), false); Globals.elementManager.unregisterWindow(WindowStrings.WINDOW_MENU_INGAME_MAIN); Globals.controlHandler.setHandlerState(ControlsState.MAIN_GAME); Globals.controlHandler.hideMouse(); return false; }}); //black texture background ImagePanel imagePanel = new ImagePanel(0,0,width,height,Globals.blackTexture); // imagePanel.setWidth(width); // imagePanel.setHeight(height); // imagePanel.setTexture(Globals.assetManager.fetchTexture(Globals.blackTexture)); div.addChild(imagePanel); //label 1 (back) Button backButton = new Button(); Label backLabel = new Label(100,50,1.0f); backLabel.setText("Back"); backButton.addChild(backLabel); div.addChild(backButton); backButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){ WindowUtils.recursiveSetVisible(Globals.elementManager.getWindow(WindowStrings.WINDOW_MENU_INGAME_MAIN), false); Globals.elementManager.unregisterWindow(WindowStrings.WINDOW_MENU_INGAME_MAIN); Globals.controlHandler.setHandlerState(ControlsState.MAIN_GAME); Globals.controlHandler.hideMouse(); return false; }}); //label 2 (quit) Button quitButton = new Button(); Label quitLabel = new Label(100,150,1.0f); quitLabel.setText("Quit"); quitButton.addChild(quitLabel); div.addChild(quitButton); quitButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){ Main.running = false; return false; }}); //checking macro data is a poor man's check for whether we're arena or full gamemode // if(Globals.server != null && Globals.macroData == null){ //label 3 (debug) Button debugButton = new Button(); Label debugLabel = new Label(100,250,1.0f); debugLabel.setText("Debug"); debugButton.addChild(debugLabel); div.addChild(debugButton); debugButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){ WindowUtils.replaceWindow(WindowStrings.WINDOW_MENU_INGAME_MAIN, createInGameDebugMainMenu()); return false; }}); // } return rVal; } public static Window createInGameDebugMainMenu(){ // int screenTop = Globals.WINDOW_HEIGHT - 150; int width = 500; int height = 500; float fontSize = 0.4f; Window rVal = new Window(0,0,width,height); // int screenLeft = (Globals.WINDOW_WIDTH - width)/2; // Div div = new Div(); // div.setPositionX(0); // div.setPositionY(0); // div.setWidth(500); // div.setHeight(500); ScrollableContainer scrollable = new ScrollableContainer(0, 0, width, height); rVal.addChild(scrollable); // scrollable.addChild(div); rVal.setOnNavigationCallback(new NavigationEventCallback() {public boolean execute(NavigationEvent event){ WindowUtils.replaceWindow(WindowStrings.WINDOW_MENU_INGAME_MAIN, createInGameMainMenu()); return false; }}); //black texture background ImagePanel imagePanel = new ImagePanel(0,0,width,height + 1000,Globals.blackTexture); // imagePanel.setWidth(width); // imagePanel.setHeight(height); // imagePanel.setTexture(Globals.assetManager.fetchTexture(Globals.blackTexture)); scrollable.addChild(imagePanel); //label 1 (back) Button backButton = new Button(); Label backLabel = new Label(100,50,fontSize); backLabel.setText("Back"); backButton.addChild(backLabel); scrollable.addChild(backButton); backButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){ WindowUtils.replaceWindow(WindowStrings.WINDOW_MENU_INGAME_MAIN, createInGameMainMenu()); return false; }}); //text entry (port) TextInput modelDebugInput = new TextInput(100,150,fontSize); scrollable.addChild(modelDebugInput); modelDebugInput.setText("Model path goes here"); //label 3 (load model and debug) Button debugModelButton = new Button(); Label debugModelLabel = new Label(100,250,fontSize); debugModelLabel.setText("Print Model Debug Info"); debugModelButton.addChild(debugModelLabel); scrollable.addChild(debugModelButton); debugModelButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){ // Main.running = false; Model targetModel = null; if((targetModel = Globals.assetManager.fetchModel(modelDebugInput.getText())) != null){ targetModel.describeHighLevel(); } else { Globals.assetManager.addModelPathToQueue(modelDebugInput.getText()); Globals.assetManager.loadAssetsInQueue(); if((targetModel = Globals.assetManager.fetchModel(modelDebugInput.getText())) != null){ targetModel.describeHighLevel(); } } return false; }}); //label 4 (reload all shaders) Button reloadShaderButton = new Button(); Label reloadShaderLabel = new Label(100,350,fontSize); reloadShaderLabel.setText("Reload all shaders"); reloadShaderButton.addChild(reloadShaderLabel); scrollable.addChild(reloadShaderButton); reloadShaderButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){ // Main.running = false; Globals.assetManager.forceReloadAllShaders(); return false; }}); //reload all models Button reloadModelButton = new Button(); Label reloadModelLabel = new Label(100,450,fontSize); reloadModelLabel.setText("Reload all models"); reloadModelButton.addChild(reloadModelLabel); scrollable.addChild(reloadModelButton); reloadModelButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){ // Main.running = false; Globals.assetManager.forceReloadAllModels(); return false; }}); //disable drawing player character Button toggleDrawPlayerButton = new Button(); Label toggleDrawPlayerLabel = new Label(100,550,fontSize); toggleDrawPlayerLabel.setText("Toggle draw character"); toggleDrawPlayerButton.addChild(toggleDrawPlayerLabel); scrollable.addChild(toggleDrawPlayerButton); toggleDrawPlayerButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){ // Main.running = false; if(Globals.playerEntity != null){ if(Globals.playerEntity.containsKey(EntityDataStrings.DATA_STRING_DRAW)){ boolean draw = (boolean)Globals.playerEntity.getData(EntityDataStrings.DATA_STRING_DRAW); Globals.playerEntity.putData(EntityDataStrings.DATA_STRING_DRAW, !draw); } if(Globals.playerEntity.containsKey(EntityDataStrings.DRAW_CAST_SHADOW)){ boolean drawShadow = (boolean)Globals.playerEntity.getData(EntityDataStrings.DRAW_CAST_SHADOW); Globals.playerEntity.putData(EntityDataStrings.DRAW_CAST_SHADOW, !drawShadow); } } return false; }}); //pull up character editor Button characterSliderMenuButton = new Button(); Label characterSliderMenuLabel = new Label(100,650,fontSize); characterSliderMenuLabel.setText("Character slider menu"); characterSliderMenuButton.addChild(characterSliderMenuLabel); scrollable.addChild(characterSliderMenuButton); characterSliderMenuButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){ WindowUtils.replaceWindow(WindowStrings.WINDOW_MENU_INGAME_MAIN, createInGameCharacterSliderMenu()); return false; }}); for(int i = 0; i < 5; i++){ Button someButton = new Button(); Label someLabel = new Label(100,750 + i * 100,fontSize); someLabel.setText("aaaaaa" + i); someButton.addChild(someLabel); scrollable.addChild(someButton); someButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){ // Main.running = false; return false; }}); } //label (switch framebuffer) Button switchFramebufferButton = new Button(); Label switchFramebufferLabel = new Label(100,1250,fontSize); switchFramebufferLabel.setText("Switch Active Framebuffer"); switchFramebufferButton.addChild(switchFramebufferLabel); scrollable.addChild(switchFramebufferButton); switchFramebufferButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){ // Main.running = false; RenderingEngine.incrementOutputFramebuffer(); return false; }}); //label (toggle draw collision spheres) Button toggleCollisionSpheresButton = new Button(); Label toggleCollisionSpheresLabel = new Label(100,1350,fontSize); toggleCollisionSpheresLabel.setText("Toggle draw collision spheres"); toggleCollisionSpheresButton.addChild(toggleCollisionSpheresLabel); scrollable.addChild(toggleCollisionSpheresButton); toggleCollisionSpheresButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){ // Main.running = false; Globals.userSettings.setGraphicsDebugDrawCollisionSpheres(!Globals.userSettings.graphicsDebugDrawCollisionSpheres()); return false; }}); //label (toggle draw physics objects) Button togglePhysicsObjectsButton = new Button(); Label togglePhysicsObjectsLabel = new Label(100,1450,fontSize); togglePhysicsObjectsLabel.setText("Toggle draw physics objects"); togglePhysicsObjectsButton.addChild(togglePhysicsObjectsLabel); scrollable.addChild(togglePhysicsObjectsButton); togglePhysicsObjectsButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){ // Main.running = false; Globals.userSettings.setGraphicsDebugDrawPhysicsObjects(!Globals.userSettings.graphicsDebugDrawPhysicsObjects()); return false; }}); //label (toggle draw movement vectors) Button toggleMovementVectorsButton = new Button(); Label toggleMovementVectorsLabel = new Label(100,1550,fontSize); toggleMovementVectorsLabel.setText("Toggle draw movement vectors"); toggleMovementVectorsButton.addChild(toggleMovementVectorsLabel); scrollable.addChild(toggleMovementVectorsButton); toggleMovementVectorsButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){ // Main.running = false; Globals.userSettings.setGraphicsDebugDrawMovementVectors(!Globals.userSettings.graphicsDebugDrawMovementVectors()); return false; }}); //label (toggle draw navmesh) Button toggleNavmeshButton = new Button(); Label toggleNavmeshLabel = new Label(100,1650,fontSize); toggleNavmeshLabel.setText("Toggle draw navmesh"); toggleNavmeshButton.addChild(toggleNavmeshLabel); scrollable.addChild(toggleNavmeshButton); toggleNavmeshButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){ // Main.running = false; Globals.userSettings.setGraphicsDebugDrawNavmesh(!Globals.userSettings.graphicsDebugDrawNavmesh()); return false; }}); return rVal; } public static Window createInGameCharacterSliderMenu(){ int width = 500; int height = 500; float fontSize = 0.4f; Window rVal = new Window(0,0,width,height); // int screenLeft = (Globals.WINDOW_WIDTH - width)/2; // Div div = new Div(); // div.setPositionX(0); // div.setPositionY(0); // div.setWidth(500); // div.setHeight(500); ScrollableContainer scrollable = new ScrollableContainer(0, 0, width, height); rVal.addChild(scrollable); // scrollable.addChild(div); rVal.setOnNavigationCallback(new NavigationEventCallback() {public boolean execute(NavigationEvent event){ WindowUtils.replaceWindow(WindowStrings.WINDOW_MENU_INGAME_MAIN, createInGameDebugMainMenu()); return false; }}); //black texture background ImagePanel imagePanel = new ImagePanel(0,0,width,height + 1000,Globals.blackTexture); // imagePanel.setWidth(width); // imagePanel.setHeight(height); // imagePanel.setTexture(Globals.assetManager.fetchTexture(Globals.blackTexture)); scrollable.addChild(imagePanel); //label 1 (back) Button backButton = new Button(); Label backLabel = new Label(200,50,fontSize); backLabel.setText("Back"); backButton.addChild(backLabel); scrollable.addChild(backButton); backButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){ WindowUtils.replaceWindow(WindowStrings.WINDOW_MENU_INGAME_MAIN, createInGameDebugMainMenu()); return false; }}); Entity playerEntity = Globals.playerEntity; Actor playerActor = EntityUtils.getActor(playerEntity); ActorStaticMorph staticMorph = playerActor.getStaticMorph(); CreatureType playeCreatureType = Globals.gameConfigCurrent.getCreatureTypeLoader().getCreature(CreatureUtils.getType(playerEntity)); int offset = 0; for(VisualAttribute attribute : playeCreatureType.getVisualAttributes()){ int posY = offset * 350 + 100; if(attribute.getType().equals("bone")){ Slider attributeSlider = new Slider(50,posY,400,100,new Vector3f(0.1f,0.1f,0.1f),new Vector3f(1.0f,0,0)); attributeSlider.setOnValueChangeCallback(new ValueChangeEventCallback() {public void execute(ValueChangeEvent event) { float value = event.getAsFloat(); float minVal = attribute.getMinValue(); float range = attribute.getMaxValue() - minVal; float actualValue = minVal + range * value; staticMorph.updateValue(attribute.getSubtype(), attribute.getPrimaryBone(), event.getAsFloat()); if(attribute.getMirrorBone() != null){ staticMorph.updateValue(attribute.getSubtype(), attribute.getMirrorBone(), event.getAsFloat()); } }}); scrollable.addChild(attributeSlider); } } return rVal; } }