From ad046615332150c38c3c67fd457209ae4a083a82 Mon Sep 17 00:00:00 2001 From: austin Date: Sat, 6 Nov 2021 23:35:03 -0400 Subject: [PATCH] In game ui --- assets/Audio/Footstep1.ogg | Bin 0 -> 4981 bytes assets/Config/keybinds.json | 5 + assets/Data/creatures.json | 4 +- assets/Shaders/font/bitmapchar/bitmapchar.vs | 6 +- assets/Shaders/plane/plane.fs | 6 +- assets/Shaders/plane/plane.vs | 2 +- .../java/electrosphere/audio/AudioEngine.java | 5 + .../controls/ControlHandler.java | 148 ++++++++++++++++++ .../electrosphere/engine/LoadingThread.java | 17 +- .../game/collision/PhysicsUtils.java | 3 +- src/main/java/electrosphere/main/Globals.java | 19 ++- src/main/java/electrosphere/main/Main.java | 10 +- src/main/java/electrosphere/menu/Menu.java | 5 +- .../electrosphere/menu/MenuTransition.java | 22 +++ .../java/electrosphere/menu/MenuUtils.java | 39 +++++ .../framebuffer/FramebufferUtils.java | 3 +- .../renderer/ui/WidgetUtils.java | 43 ++++- .../electrosphere/renderer/ui/Window.java | 6 +- .../renderer/ui/font/FontUtils.java | 20 +++ .../ui/font/bitmapchar/BitmapCharacter.java | 4 +- .../renderer/ui/label/Label.java | 66 ++++++++ .../renderer/ui/widgets/ImagePanel.java | 45 ++---- 22 files changed, 422 insertions(+), 56 deletions(-) create mode 100644 assets/Audio/Footstep1.ogg create mode 100644 src/main/java/electrosphere/renderer/ui/label/Label.java diff --git a/assets/Audio/Footstep1.ogg b/assets/Audio/Footstep1.ogg new file mode 100644 index 0000000000000000000000000000000000000000..7ba9ddc06aefeae5aea511ee6391280a697c3539 GIT binary patch literal 4981 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 aL%H3jV_u*8=|1%IMe56uTnjTRtN#F>DHojp literal 0 HcmV?d00001 diff --git a/assets/Config/keybinds.json b/assets/Config/keybinds.json index 4dc63c2a..61f3b7e9 100644 --- a/assets/Config/keybinds.json +++ b/assets/Config/keybinds.json @@ -116,6 +116,11 @@ "isKey": false, "isMouse": true, "keyValue": 0 + }, + "inGameMainMenu" : { + "isKey": true, + "isMouse": false, + "keyValue": 256 } } } \ No newline at end of file diff --git a/assets/Data/creatures.json b/assets/Data/creatures.json index 865eacbe..2dbd9e14 100644 --- a/assets/Data/creatures.json +++ b/assets/Data/creatures.json @@ -89,8 +89,8 @@ "movementSystems" : [ { "type" : "GROUND", - "acceleration" : 1.0, - "maxVelocity" : 4.0 + "acceleration" : 16.0, + "maxVelocity" : 3.0 } ], "collidable" : { diff --git a/assets/Shaders/font/bitmapchar/bitmapchar.vs b/assets/Shaders/font/bitmapchar/bitmapchar.vs index a7c67d99..439f8516 100644 --- a/assets/Shaders/font/bitmapchar/bitmapchar.vs +++ b/assets/Shaders/font/bitmapchar/bitmapchar.vs @@ -15,7 +15,9 @@ void main(){ vec2 finalPos = vec2( ((aPos.x + 1)/2 * mDimension.x + mPosition.x) * 2 - 1, - ((1-(aPos.y + 1)/2) * mDimension.y + mPosition.y) * 2 - 1 + ((((aPos.y + 1)/2) * mDimension.y + mPosition.y) * 2 - 1) + // (aPos.y * mDimension.y + mPosition.y) + // -((((aPos.y + 1)/2) * mDimension.y + mPosition.y) * 2 - 1) // aPos.y * mDimension.y + (mPosition.y) + (1 - mDimension.y) ); gl_Position = vec4(finalPos.x, finalPos.y, 0.0, 1.0); @@ -23,7 +25,7 @@ void main(){ vec2 finalTex = vec2( aTexCoords.x * tDimension.x + tPosition.x, - aTexCoords.y * tDimension.y + tPosition.y + (1-aTexCoords.y) * tDimension.y + tPosition.y ); TexCoords = finalTex; } \ No newline at end of file diff --git a/assets/Shaders/plane/plane.fs b/assets/Shaders/plane/plane.fs index 232dc842..21c738d3 100644 --- a/assets/Shaders/plane/plane.fs +++ b/assets/Shaders/plane/plane.fs @@ -6,5 +6,9 @@ in vec2 TexCoords; uniform sampler2D screenTexture; void main(){ - FragColor = texture(screenTexture, TexCoords); + vec4 textureColor = texture(screenTexture, TexCoords); + if(textureColor.a < 0.1){ + discard; + } + FragColor = textureColor; } \ No newline at end of file diff --git a/assets/Shaders/plane/plane.vs b/assets/Shaders/plane/plane.vs index 0a408dd3..dff87427 100644 --- a/assets/Shaders/plane/plane.vs +++ b/assets/Shaders/plane/plane.vs @@ -12,7 +12,7 @@ uniform vec3 tDimension; void main(){ vec2 finalPos = vec2( ((aPos.x + 1)/2 * mDimension.x + mPosition.x) * 2 - 1, - ((1-(aPos.y + 1)/2) * mDimension.y + mPosition.y) * 2 - 1 + -((((aPos.y + 1)/2) * mDimension.y + mPosition.y) * 2 - 1) // aPos.y * mDimension.y + (mPosition.y) + (1 - mDimension.y) ); gl_Position = vec4(finalPos.x, finalPos.y, 0.0, 1.0); diff --git a/src/main/java/electrosphere/audio/AudioEngine.java b/src/main/java/electrosphere/audio/AudioEngine.java index b57cdbb5..f5c7becd 100644 --- a/src/main/java/electrosphere/audio/AudioEngine.java +++ b/src/main/java/electrosphere/audio/AudioEngine.java @@ -66,5 +66,10 @@ public class AudioEngine { return engineGain; } + public void shutdown(){ + ALC10.alcDestroyContext​(context); + ALC10.alcCloseDevice​(device); + } + } diff --git a/src/main/java/electrosphere/controls/ControlHandler.java b/src/main/java/electrosphere/controls/ControlHandler.java index 4f020acc..ff7ff80d 100644 --- a/src/main/java/electrosphere/controls/ControlHandler.java +++ b/src/main/java/electrosphere/controls/ControlHandler.java @@ -12,7 +12,9 @@ import electrosphere.entity.types.collision.CollisionObjUtils; import electrosphere.entity.types.item.ItemUtils; import electrosphere.main.Globals; import electrosphere.menu.MenuTransition; +import electrosphere.menu.MenuUtils; import electrosphere.net.parser.net.message.EntityMessage; +import electrosphere.renderer.ui.Widget; import electrosphere.util.Utilities; import java.util.HashMap; import java.util.List; @@ -39,6 +41,7 @@ public class ControlHandler { public static final String DATA_STRING_INPUT_CODE_MOVEMENT_FALL = "fall"; public static final String DATA_STRING_INPUT_CODE_ATTACK_PRIMARY = "attackPrimary"; public static final String DATA_STRING_INPUT_CODE_DEBUG_SPAWN_ITEM = "debugSpawnItem"; + public static final String DATA_STRING_INPUT_CODE_IN_GAME_MAIN_MENU = "inGameMainMenu"; public static final String DATA_STRING_INPUT_CODE_MENU_INCREMENT = "menuIncrement"; public static final String DATA_STRING_INPUT_CODE_MENU_DECREMENT = "menuDecrement"; @@ -91,6 +94,7 @@ public class ControlHandler { TITLE_PAGE, TITLE_MENU, MAIN_GAME, + IN_GAME_MAIN_MENU, NO_INPUT, } @@ -120,6 +124,7 @@ public class ControlHandler { handler.addControl(DATA_STRING_INPUT_CODE_MOVEMENT_JUMP, new Control(true,false,GLFW_KEY_SPACE)); handler.addControl(DATA_STRING_INPUT_CODE_MOVEMENT_FALL, new Control(true,false,GLFW_KEY_LEFT_CONTROL)); handler.addControl(DATA_STRING_INPUT_CODE_ATTACK_PRIMARY, new Control(false,true,GLFW_MOUSE_BUTTON_LEFT)); + handler.addControl(DATA_STRING_INPUT_CODE_IN_GAME_MAIN_MENU, new Control(true,false,GLFW_KEY_ESCAPE)); /* Map the menu navigation controls @@ -216,6 +221,10 @@ public class ControlHandler { pollTypingControls(); break; + case IN_GAME_MAIN_MENU: + pollMenuNavigationControls(); + break; + case NO_INPUT: break; @@ -367,6 +376,27 @@ public class ControlHandler { controls.get(DATA_STRING_INPUT_CODE_ATTACK_PRIMARY).setState(false); } } + + + /* + Main menu dialog toggle + */ + if(controls.containsKey(DATA_STRING_INPUT_CODE_IN_GAME_MAIN_MENU)){ + if(controls.get(DATA_STRING_INPUT_CODE_IN_GAME_MAIN_MENU).isIsKey() && glfwGetKey(Globals.window, controls.get(DATA_STRING_INPUT_CODE_IN_GAME_MAIN_MENU).getKeyValue()) == GLFW_PRESS){ + controls.get(DATA_STRING_INPUT_CODE_IN_GAME_MAIN_MENU).setState(true); + } else { + if(controls.get(DATA_STRING_INPUT_CODE_IN_GAME_MAIN_MENU).isState() == true){ + //make menu dialog visible + //change control scheme to in game main menu scheme + System.out.println("Press main menu"); + Globals.currentMenu = MenuUtils.createInGameMainMenu(); + MenuUtils.makeMenuDrawable(Globals.currentMenu); + Globals.controlHandler.setHandlerState(ControlsState.IN_GAME_MAIN_MENU); + } + controls.get(DATA_STRING_INPUT_CODE_IN_GAME_MAIN_MENU).setState(false); + } + } + //DATA_STRING_INPUT_CODE_IN_GAME_MAIN_MENU } } @@ -502,6 +532,124 @@ public class ControlHandler { return rVal; } + public static String convertKeycodeToName(int code){ + String rVal = ""; + switch(code){ + case 48: + rVal = "0"; + break; + case 49: + rVal = "1"; + break; + case 50: + rVal = "2"; + break; + case 51: + rVal = "3"; + break; + case 52: + rVal = "4"; + break; + case 53: + rVal = "5"; + break; + case 54: + rVal = "6"; + break; + case 55: + rVal = "7"; + break; + case 56: + rVal = "8"; + break; + case 57: + rVal = "9"; + break; + case 65: + rVal = "A"; + break; + case 66: + rVal = "B"; + break; + case 67: + rVal = "C"; + break; + case 68: + rVal = "D"; + break; + case 69: + rVal = "E"; + break; + case 70: + rVal = "F"; + break; + case 71: + rVal = "G"; + break; + case 72: + rVal = "H"; + break; + case 73: + rVal = "I"; + break; + case 74: + rVal = "J"; + break; + case 75: + rVal = "K"; + break; + case 76: + rVal = "L"; + break; + case 77: + rVal = "M"; + break; + case 78: + rVal = "N"; + break; + case 79: + rVal = "O"; + break; + case 80: + rVal = "P"; + break; + case 81: + rVal = "Q"; + break; + case 82: + rVal = "R"; + break; + case 83: + rVal = "S"; + break; + case 84: + rVal = "T"; + break; + case 85: + rVal = "U"; + break; + case 86: + rVal = "V"; + break; + case 87: + rVal = "W"; + break; + case 88: + rVal = "X"; + break; + case 89: + rVal = "Y"; + break; + case 90: + rVal = "Z"; + break; + case 256: + rVal = "Escape"; + break; + } + return rVal; + } + } diff --git a/src/main/java/electrosphere/engine/LoadingThread.java b/src/main/java/electrosphere/engine/LoadingThread.java index ef057bc8..1fddd415 100644 --- a/src/main/java/electrosphere/engine/LoadingThread.java +++ b/src/main/java/electrosphere/engine/LoadingThread.java @@ -46,6 +46,8 @@ import electrosphere.game.client.targeting.crosshair.Crosshair; import electrosphere.game.server.pathfinding.NavMeshPathfinder; import electrosphere.game.server.pathfinding.navmesh.NavCube; import electrosphere.game.server.pathfinding.navmesh.NavMesh; +import electrosphere.renderer.ui.Widget; +import electrosphere.renderer.ui.WidgetUtils; import java.util.Random; import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit; @@ -181,6 +183,9 @@ public class LoadingThread extends Thread { //hide cursor Globals.controlHandler.hideMouse(); + //create in game ui + showInGameUI(); + loadingBox.setVisible(false); @@ -266,6 +271,9 @@ public class LoadingThread extends Thread { //hide cursor Globals.controlHandler.hideMouse(); + //create in game ui + showInGameUI(); + loadingBox.setVisible(false); RenderUtils.recaptureScreen(); @@ -513,6 +521,13 @@ public class LoadingThread extends Thread { Globals.microSimulation = new MicroSimulation(); } + static void showInGameUI(){ + for(Widget widget : Globals.inGameUI){ +// System.out.println("Set widget visible"); + widget.setVisible(true); + } + } + static void setSimulationsToReady(){ Globals.microSimulation.setReady(true); if(Globals.macroSimulation != null){ @@ -600,7 +615,7 @@ public class LoadingThread extends Thread { // //attach ai to evil goblin // MindlessAttacker.attachToCreature(goblin); - StructureUtils.spawnBasicStructure("building1", new Vector3f(5,2.4f,5), new Quaternionf()); +// StructureUtils.spawnBasicStructure("building1", new Vector3f(5,2.4f,5), new Quaternionf()); Entity bow = ItemUtils.spawnBasicItem("Bow"); EntityUtils.getPosition(bow).set(1, 1, 2); diff --git a/src/main/java/electrosphere/game/collision/PhysicsUtils.java b/src/main/java/electrosphere/game/collision/PhysicsUtils.java index 5e0f67f6..33067d61 100644 --- a/src/main/java/electrosphere/game/collision/PhysicsUtils.java +++ b/src/main/java/electrosphere/game/collision/PhysicsUtils.java @@ -141,7 +141,8 @@ public class PhysicsUtils { true // "useQuantizedAabbCompression" -- apparently means better memory usage ( http://jbullet.advel.cz/javadoc/com/bulletphysics/collision/shapes/BvhTriangleMeshShape.html ) ); - terrainShape.setMargin(0.08f); + //uncomment if we start falling through things again +// terrainShape.setMargin(0.08f); // terrainShape.localGetSupportingVertex(new javax.vecmath.Vector3f(1,0,0), aabbMin); // terrainShape.recalcLocalAabb(); diff --git a/src/main/java/electrosphere/main/Globals.java b/src/main/java/electrosphere/main/Globals.java index f9fb2c34..f048cc07 100644 --- a/src/main/java/electrosphere/main/Globals.java +++ b/src/main/java/electrosphere/main/Globals.java @@ -47,6 +47,7 @@ import electrosphere.renderer.ShaderProgram; import electrosphere.engine.assetmanager.AssetDataStrings; import electrosphere.engine.assetmanager.AssetManager; import electrosphere.game.server.pathfinding.NavMeshManager; +import electrosphere.renderer.ui.Widget; import electrosphere.renderer.ui.WidgetManager; import electrosphere.renderer.ui.WidgetUtils; import electrosphere.renderer.ui.font.FontUtils; @@ -64,6 +65,7 @@ import org.joml.Vector3f; import electrosphere.util.ModelLoader; import electrosphere.util.Utilities; import java.util.HashMap; +import java.util.LinkedList; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; import org.lwjgl.glfw.GLFWErrorCallback; @@ -90,6 +92,12 @@ public class Globals { public static AudioEngine audioEngine; + // + //Core Engine signals + // + public static boolean ENGINE_SHUTDOWN_FLAG = false; + + // //Client connection to server // @@ -206,6 +214,8 @@ public class Globals { public static Menu currentMenu; + public static List inGameUI = new LinkedList(); + public static String particleBillboardModel; @@ -300,8 +310,8 @@ public class Globals { public static boolean RENDER_FLAG_RENDER_SHADOW_MAP = false; public static boolean RENDER_FLAG_RENDER_SCREEN_FRAMEBUFFER_CONTENT = false; public static boolean RENDER_FLAG_RENDER_SCREEN_FRAMEBUFFER = false; - public static boolean RENDER_FLAG_RENDER_BLACK_BACKGROUND = true; - public static boolean RENDER_FLAG_RENDER_WHITE_BACKGROUND = false; + public static boolean RENDER_FLAG_RENDER_BLACK_BACKGROUND = false; + public static boolean RENDER_FLAG_RENDER_WHITE_BACKGROUND = true; public static boolean RENDER_FLAG_RENDER_UI = true; @@ -394,7 +404,10 @@ public class Globals { testingTexture = "Textures/Testing1.png"; Globals.assetManager.addTexturePathtoQueue(testingTexture); - assetManager.addModelPathToQueue("Models/deer1.fbx"); + //in game ui stuff + inGameUI.add(WidgetUtils.createInGameMainMenuButton()); + + //as these assets are required for the renderer to work, we go ahead and //load them into memory now. The loading time penalty is worth it I think. diff --git a/src/main/java/electrosphere/main/Main.java b/src/main/java/electrosphere/main/Main.java index 8339bf3b..112b24ac 100644 --- a/src/main/java/electrosphere/main/Main.java +++ b/src/main/java/electrosphere/main/Main.java @@ -234,9 +234,9 @@ public class Main { /// I N P U T C O N T R O L S /// cameraSpeed = 2.5f * deltaTime; - if (glfwGetKey(Globals.window, GLFW_KEY_ESCAPE) == GLFW_PRESS && Globals.RENDER_FLAG_RENDER_SCREEN_FRAMEBUFFER_CONTENT) { - break; - } +// if (glfwGetKey(Globals.window, GLFW_KEY_ESCAPE) == GLFW_PRESS && Globals.RENDER_FLAG_RENDER_SCREEN_FRAMEBUFFER_CONTENT) { +// break; +// } //cell tracking values Vector3d oldPlayerCharacterPosition = new Vector3d(); @@ -332,7 +332,7 @@ public class Main { Globals.renderingEngine.drawScreen(); - if(glfwWindowShouldClose(Globals.window)){ + if(glfwWindowShouldClose(Globals.window) || Globals.ENGINE_SHUTDOWN_FLAG){ running = false; } @@ -346,6 +346,8 @@ public class Main { Globals.server.close(); Globals.serverThread.interrupt(); } + //shut down audio engine + Globals.audioEngine.shutdown(); } static void sleep(int i) { diff --git a/src/main/java/electrosphere/menu/Menu.java b/src/main/java/electrosphere/menu/Menu.java index 29a1823b..15431ded 100644 --- a/src/main/java/electrosphere/menu/Menu.java +++ b/src/main/java/electrosphere/menu/Menu.java @@ -25,6 +25,7 @@ public class Menu { MULTIPLAYER_MENU, IP_MENU, OPTIONS_MAIN_MENU, + IN_GAME_MAIN_MENU, TEST, } @@ -87,7 +88,9 @@ public class Menu { } public void setMenuOptionColor(int option, Vector3f color){ - ((TextBox)optionList.get(option)).setColor(color); + if(optionList.get(option) instanceof TextBox){ + ((TextBox)optionList.get(option)).setColor(color); + } } public List getOptions(){ diff --git a/src/main/java/electrosphere/menu/MenuTransition.java b/src/main/java/electrosphere/menu/MenuTransition.java index 8ce5e2b5..348d50b2 100644 --- a/src/main/java/electrosphere/menu/MenuTransition.java +++ b/src/main/java/electrosphere/menu/MenuTransition.java @@ -3,6 +3,7 @@ package electrosphere.menu; import electrosphere.audio.AudioSource; import electrosphere.audio.AudioUtils; import electrosphere.controls.ControlHandler; +import electrosphere.controls.ControlHandler.ControlsState; import electrosphere.engine.LoadingThread; import electrosphere.game.server.saves.SaveUtils; import electrosphere.main.Globals; @@ -11,6 +12,7 @@ import electrosphere.net.NetUtils; import electrosphere.net.client.ClientNetworking; import electrosphere.renderer.ui.Widget; import electrosphere.renderer.ui.font.TextBox; +import electrosphere.renderer.ui.label.Label; import org.joml.Vector3f; /** @@ -139,6 +141,21 @@ public class MenuTransition { break; } break; + case IN_GAME_MAIN_MENU: + switch(((Label)m.getCurrentOption()).getText()){ + //connect + case "QUIT": + //TODO: actually shut down program + Globals.ENGINE_SHUTDOWN_FLAG = true; + break; + //back + case "BACK": + MenuUtils.makeMenuUndrawable(Globals.currentMenu); + Globals.currentMenu.dispose(); + Globals.controlHandler.setHandlerState(ControlsState.MAIN_GAME); + break; + } + break; } } @@ -184,6 +201,11 @@ public class MenuTransition { m.dispose(); Globals.currentMenu = MenuUtils.createTitleMenu(); break; + case IN_GAME_MAIN_MENU: + MenuUtils.makeMenuUndrawable(Globals.currentMenu); + Globals.currentMenu.dispose(); + Globals.controlHandler.setHandlerState(ControlsState.MAIN_GAME); + break; } } diff --git a/src/main/java/electrosphere/menu/MenuUtils.java b/src/main/java/electrosphere/menu/MenuUtils.java index e657ed56..d046d20d 100644 --- a/src/main/java/electrosphere/menu/MenuUtils.java +++ b/src/main/java/electrosphere/menu/MenuUtils.java @@ -7,6 +7,9 @@ import electrosphere.net.NetUtils; import electrosphere.net.server.Server; import electrosphere.renderer.ui.Widget; import electrosphere.renderer.ui.WidgetUtils; +import electrosphere.renderer.ui.Window; +import electrosphere.renderer.ui.label.Label; +import electrosphere.renderer.ui.widgets.ImagePanel; import java.util.List; import org.joml.Vector3f; @@ -116,6 +119,42 @@ public class MenuUtils { return rVal; } + public static Menu createInGameMainMenu(){ + Menu rVal = new Menu(MenuType.IN_GAME_MAIN_MENU); + int screenTop = Globals.WINDOW_HEIGHT - 150; + int width = 500; + int height = 500; + int screenLeft = (Globals.WINDOW_WIDTH - width)/2; + Window menuWindow = new Window(100, 100, 500, 500); + + //black texture background + ImagePanel imagePanel = new ImagePanel(0,0,width,height); + imagePanel.setWidth(width); + imagePanel.setHeight(height); + imagePanel.setTexture(Globals.assetManager.fetchTexture(Globals.blackTexture)); + menuWindow.addWidget(imagePanel); + + //label 1 (back) + Label backLabel = new Label(100,50,1.0f); + backLabel.setText("BACK"); + menuWindow.addWidget(backLabel); + rVal.addOption(backLabel); + + + //label 2 (quit) + Label quitLabel = new Label(100,150,1.0f); + quitLabel.setText("QUIT"); + menuWindow.addWidget(quitLabel); + rVal.addOption(quitLabel); + + + rVal.addElement(menuWindow); + Globals.widgetManager.registerWidget(menuWindow); +// rVal.addElement(WidgetUtils.createVerticallyAlignedMinSizeTextBoxFromCharCount(40, 40, screenTop - 50, "BACK", true)); +// rVal.addOption( WidgetUtils.createVerticallyAlignedMinSizeTextBoxFromCharCount(40, 40, screenTop - 275, "QUIT", true)); + return rVal; + } + public static Menu createTestMainMenu(){ Menu rVal = new Menu(MenuType.TEST); rVal.addElement(WidgetUtils.createWindowTEST()); diff --git a/src/main/java/electrosphere/renderer/framebuffer/FramebufferUtils.java b/src/main/java/electrosphere/renderer/framebuffer/FramebufferUtils.java index 4661e577..64b69e18 100644 --- a/src/main/java/electrosphere/renderer/framebuffer/FramebufferUtils.java +++ b/src/main/java/electrosphere/renderer/framebuffer/FramebufferUtils.java @@ -12,6 +12,7 @@ import static org.lwjgl.opengl.GL11.GL_NEAREST; import static org.lwjgl.opengl.GL11.GL_NONE; import static org.lwjgl.opengl.GL11.GL_REPEAT; import static org.lwjgl.opengl.GL11.GL_RGB; +import static org.lwjgl.opengl.GL11.GL_RGBA; import static org.lwjgl.opengl.GL11.GL_TEXTURE_2D; import static org.lwjgl.opengl.GL11.GL_TEXTURE_BORDER_COLOR; import static org.lwjgl.opengl.GL11.GL_TEXTURE_MAG_FILTER; @@ -85,7 +86,7 @@ public class FramebufferUtils { //texture int texture = glGenTextures(); glBindTexture(GL_TEXTURE_2D,texture); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); //these make sure the texture actually clamps to the borders of the quad diff --git a/src/main/java/electrosphere/renderer/ui/WidgetUtils.java b/src/main/java/electrosphere/renderer/ui/WidgetUtils.java index 2f801276..d8eec8a7 100644 --- a/src/main/java/electrosphere/renderer/ui/WidgetUtils.java +++ b/src/main/java/electrosphere/renderer/ui/WidgetUtils.java @@ -1,8 +1,11 @@ package electrosphere.renderer.ui; +import electrosphere.controls.ControlHandler; import electrosphere.main.Globals; +import electrosphere.renderer.ui.font.FontUtils; import electrosphere.renderer.ui.font.TextBox; import electrosphere.renderer.ui.font.bitmapchar.BitmapCharacter; +import electrosphere.renderer.ui.label.Label; import electrosphere.renderer.ui.layout.LayoutSchemeListScrollable; import electrosphere.renderer.ui.widgets.ImagePanel; import electrosphere.renderer.ui.widgets.TextInput; @@ -95,8 +98,12 @@ public class WidgetUtils { // rVal.addWidget(textInput); - BitmapCharacter characterDisp = new BitmapCharacter(0,0,500,500,'A'); - rVal.addWidget(characterDisp); +// BitmapCharacter characterDisp = new BitmapCharacter(0,0,500,500,'A'); +// rVal.addWidget(characterDisp); + + Label label = new Label(100,100,1); + label.setText("TESTING"); + rVal.addWidget(label); // TextInput textInput2 = new TextInput(); // textInput2.setText("TESTESTE$STESTET\nTESTESTE$STESTET\nTESTESTE$STESTET\nTESTESTE$STESTET\nTESTESTE$STESTET\n"); @@ -114,5 +121,37 @@ public class WidgetUtils { return rVal; } + public static Widget createInGameMainMenuButton(){ + int width = (int)(Globals.WINDOW_WIDTH * 0.05); + int height = (int)(Globals.WINDOW_HEIGHT * 0.05); + int x = Globals.WINDOW_WIDTH - width; + int y = Globals.WINDOW_HEIGHT - height; +// Window rVal = new Window(x, 10, 100, 20); + Window rVal = new Window(x,y,width,height); +// Window rVal = new Window(100,100,100,100); +// System.out.println(x + " " + y + " " + width + " " + height); +// LayoutSchemeListScrollable rVal = new LayoutSchemeListScrollable(x, y, width, height, true); +//// rVal.addWidget(createVerticallyAlignedMinSizeTextBoxFromCharCount(25, 25, 0, "TESTESTESTEST", true)); +// rVal.addWidget(WidgetUtils.createTextBox(0, 0, width, height, 1, 4, "MENU", true)); +// Widget rVal = WidgetUtils.createTextBox(x, y, width, height, 4, 1, "MENU", true); + + //the actual "menu" label + Label menuLabel = new Label(0,0,0.3f); + menuLabel.setText("Menu"); + menuLabel.setVisible(true); + rVal.addWidget(menuLabel); + + //label telling player what key they have their menu bound to + Label keyCodeLabel = new Label(0,10,0.3f); + keyCodeLabel.setText(ControlHandler.convertKeycodeToName(Globals.controlHandler.getControl(ControlHandler.DATA_STRING_INPUT_CODE_IN_GAME_MAIN_MENU).getKeyValue())); + keyCodeLabel.setVisible(true); + rVal.addWidget(keyCodeLabel); + + rVal.setVisible(false); +// Globals.inGameUI.add(rVal); + Globals.widgetManager.registerWidget(rVal); + return rVal; + } + } diff --git a/src/main/java/electrosphere/renderer/ui/Window.java b/src/main/java/electrosphere/renderer/ui/Window.java index ebd4acaf..8f191e1f 100644 --- a/src/main/java/electrosphere/renderer/ui/Window.java +++ b/src/main/java/electrosphere/renderer/ui/Window.java @@ -27,8 +27,8 @@ public class Window extends Widget { public Window(int positionX, int positionY, int width, int height){ //TODO: figure out why this has to be 1920x1080 -// widgetBuffer = FramebufferUtils.generateTextureFramebuffer(width, height); - widgetBuffer = FramebufferUtils.generateScreensizeTextureFramebuffer(); + widgetBuffer = FramebufferUtils.generateTextureFramebuffer(width, height); +// widgetBuffer = FramebufferUtils.generateScreensizeTextureFramebuffer(); customMat.setTexturePointer(widgetBuffer.getTexturePointer()); // customMat.setTexturePointer(Globals.assetManager.fetchTexture("Textures/Testing1.png").getTexturePointer()); float ndcX = (float)positionX/Globals.WINDOW_WIDTH; @@ -47,7 +47,7 @@ public class Window extends Widget { widgetBuffer.bind(); // Globals.renderingEngine.setViewportSize(width, height); - glClearColor(0.0f, 0.0f, 0.0f, 1.0f); + glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); for(Widget child : widgetList){ diff --git a/src/main/java/electrosphere/renderer/ui/font/FontUtils.java b/src/main/java/electrosphere/renderer/ui/font/FontUtils.java index ec42b523..614062f0 100644 --- a/src/main/java/electrosphere/renderer/ui/font/FontUtils.java +++ b/src/main/java/electrosphere/renderer/ui/font/FontUtils.java @@ -11,6 +11,7 @@ import electrosphere.renderer.ui.font.RawFontMap.Glyph; import java.util.HashMap; import org.joml.Quaternionf; import org.joml.Vector3f; +import org.joml.Vector3i; /** * @@ -23,6 +24,9 @@ public class FontUtils { static HashMap positionMap = new HashMap(); static HashMap dimensionMap = new HashMap(); + static int width = 10; + static int height = 10; + public static Vector3f getPositionOfCharacter(char character){ Vector3f position; if((position = positionMap.get(character))!=null){ @@ -47,8 +51,24 @@ public class FontUtils { return dimension; } + public static Vector3f getDimensionOfCharacterDiscrete(char character){ + Vector3f dimension; + if((dimension = dimensionMap.get(character))!=null){ + dimension = new Vector3f(dimension); + } else { + dimension = new Vector3f(12,14,0f); + } + return dimension; + } + + public static int getFontHeight(){ + return height; + } + public static void setFontDataMap(RawFontMap map){ rawFontMap = map; + width = map.imageWidth; + height = map.imageHeight; //fill position map positionMap.clear(); for(Glyph glyph : rawFontMap.glyphs){ diff --git a/src/main/java/electrosphere/renderer/ui/font/bitmapchar/BitmapCharacter.java b/src/main/java/electrosphere/renderer/ui/font/bitmapchar/BitmapCharacter.java index edfd0555..ee136014 100644 --- a/src/main/java/electrosphere/renderer/ui/font/bitmapchar/BitmapCharacter.java +++ b/src/main/java/electrosphere/renderer/ui/font/bitmapchar/BitmapCharacter.java @@ -51,11 +51,9 @@ public class BitmapCharacter extends Widget { Globals.renderingEngine.bindFramebuffer(parentFramebufferPointer); Globals.renderingEngine.setViewportSize(parentWidth, parentHeight); float ndcX = (float)positionX/parentWidth; - float ndcY = (float)positionY/parentHeight + (float)Globals.WINDOW_TITLE_BAR_HEIGHT/parentHeight; + float ndcY = (float)positionY/parentHeight;// + (float)Globals.WINDOW_TITLE_BAR_HEIGHT/parentHeight; float ndcWidth = (float)width/parentWidth; float ndcHeight = (float)height/parentHeight; -// System.out.println(ndcX + " " + ndcY + " " + ndcWidth + " " + ndcHeight); - //monowidth for the moment // float charWidth = ndcWidth/cols; // float charHeight = ndcHeight/rows; char toDraw = text.charAt(0); diff --git a/src/main/java/electrosphere/renderer/ui/label/Label.java b/src/main/java/electrosphere/renderer/ui/label/Label.java new file mode 100644 index 00000000..9c3fefcf --- /dev/null +++ b/src/main/java/electrosphere/renderer/ui/label/Label.java @@ -0,0 +1,66 @@ +package electrosphere.renderer.ui.label; + +import electrosphere.main.Globals; +import electrosphere.renderer.Model; +import electrosphere.renderer.ui.Widget; +import electrosphere.renderer.ui.font.FontUtils; +import electrosphere.renderer.ui.font.bitmapchar.BitmapCharacter; +import java.util.LinkedList; +import java.util.List; +import org.joml.Vector3f; + +/** + * + * @author amaterasu + */ +public class Label extends Widget{ + + String text = ""; + int textPixelWidth = 0; + + float fontSize = 1.0f; + + List childrenElements = new LinkedList(); + + public Label(int x, int y, float fontSize){ + this.positionX = x; + this.positionY = y; + this.width = 0; + this.height = (int)(FontUtils.getFontHeight() * fontSize); + this.fontSize = fontSize; + } + + void generateLetters(){ + childrenElements.clear(); + int rollingOffset = 0; + for(int i = 0; i < text.length(); i++){ + char toDraw = text.charAt(i); + Vector3f bitMapDimension = FontUtils.getDimensionOfCharacterDiscrete(toDraw); + Widget newLetter = new BitmapCharacter((int)(rollingOffset * fontSize) + positionX, positionY, (int)(bitMapDimension.x * fontSize), this.height, toDraw); + rollingOffset += (int)bitMapDimension.x; + childrenElements.add(newLetter); + } + } + + public void setText(String text){ + this.text = text; + textPixelWidth = 0; + for(int i = 0; i < text.length(); i++){ + Vector3f bitMapDimension = FontUtils.getDimensionOfCharacterDiscrete(text.charAt(i)); + textPixelWidth = textPixelWidth + (int)bitMapDimension.x; + } + generateLetters(); + } + + public String getText(){ + return text; + } + + @Override + public void draw(int parentFramebufferPointer, int parentWidth, int parentHeight) { + for(Widget child : childrenElements){ + child.draw(parentFramebufferPointer, parentWidth, parentHeight); + } + } + +} diff --git a/src/main/java/electrosphere/renderer/ui/widgets/ImagePanel.java b/src/main/java/electrosphere/renderer/ui/widgets/ImagePanel.java index 98b29eaf..bf92dd67 100644 --- a/src/main/java/electrosphere/renderer/ui/widgets/ImagePanel.java +++ b/src/main/java/electrosphere/renderer/ui/widgets/ImagePanel.java @@ -24,14 +24,17 @@ public class ImagePanel extends Widget { Material customMat = new Material(); Texture texture = null; - Vector3f boxPosition = new Vector3f(0,0,0); - Vector3f boxDimensions = new Vector3f(1,1,0); + Vector3f texPosition = new Vector3f(0,0,0); Vector3f texScale = new Vector3f(1,1,0); - public ImagePanel(){ + public ImagePanel(int x, int y, int width, int height){ texture = Globals.assetManager.fetchTexture("Textures/default_diffuse.png"); customMat.setTexturePointer(texture.getTexturePointer()); + this.positionX = x; + this.positionY = y; + this.width = width; + this.height = height; } public void setTexture(Texture texture){ @@ -41,34 +44,6 @@ public class ImagePanel extends Widget { public Texture getTexture(){ return texture; } - - @Override - public void setPositionY(int positionY) { - float ndcY = (float)positionY/Globals.WINDOW_HEIGHT; - boxPosition.y = ndcY; - super.setPositionY(positionY); - } - - @Override - public void setPositionX(int positionX) { - float ndcX = (float)positionX/Globals.WINDOW_WIDTH; - boxPosition.x = ndcX; - super.setPositionX(positionX); - } - - @Override - public void setHeight(int height) { - float ndcHeight = (float)height/Globals.WINDOW_HEIGHT; - boxDimensions.y = ndcHeight; - super.setHeight(height); - } - - @Override - public void setWidth(int width) { - float ndcWidth = (float)width/Globals.WINDOW_WIDTH; - boxDimensions.x = ndcWidth; - super.setWidth(width); - } @@ -78,6 +53,14 @@ public class ImagePanel extends Widget { //have to call before actually rendering glBindFramebuffer(GL_FRAMEBUFFER, parentFramebufferPointer); + float ndcX = (float)positionX/parentWidth; + float ndcY = (float)positionY/parentHeight; + float ndcWidth = (float)width/parentWidth; + float ndcHeight = (float)height/parentHeight; + + Vector3f boxPosition = new Vector3f(ndcX,ndcY,0); + Vector3f boxDimensions = new Vector3f(ndcWidth,ndcHeight,0); + Model planeModel = Globals.assetManager.fetchModel(Globals.planeModelID); planeModel.pushUniformToMesh("plane", "mPosition", boxPosition); planeModel.pushUniformToMesh("plane", "mDimension", boxDimensions);