From 0e073689c4f3ffb54662ceba957aa643343b6f44 Mon Sep 17 00:00:00 2001 From: austin Date: Thu, 17 Mar 2022 01:38:57 -0400 Subject: [PATCH] Light font improvements --- assets/Textures/Fonts/myFont2Map.json | 483 ++++++++++++++++++ assets/Textures/Fonts/myfont2.png | Bin 0 -> 26717 bytes .../controls/ControlHandler.java | 1 + src/main/java/electrosphere/main/Globals.java | 2 +- .../electrosphere/menu/MenuGenerators.java | 30 +- .../electrosphere/renderer/RenderUtils.java | 6 +- .../renderer/ui/elements/TextInput.java | 38 +- 7 files changed, 549 insertions(+), 11 deletions(-) create mode 100644 assets/Textures/Fonts/myFont2Map.json create mode 100644 assets/Textures/Fonts/myfont2.png diff --git a/assets/Textures/Fonts/myFont2Map.json b/assets/Textures/Fonts/myFont2Map.json new file mode 100644 index 00000000..d41782e3 --- /dev/null +++ b/assets/Textures/Fonts/myFont2Map.json @@ -0,0 +1,483 @@ +{ + "imageWidth": 3864, + "imageHeight": 60, + "glyphs": +[ + { + "symbol": "A", + "startX": 1, + "startY": 1, + "width": 40, + "height": 58 + }, + { + "symbol": "B", + "startX": 43, + "startY": 1, + "width": 40, + "height": 58 + }, + { + "symbol": "C", + "startX": 85, + "startY": 1, + "width": 40, + "height": 58 + }, + { + "symbol": "D", + "startX": 127, + "startY": 1, + "width": 40, + "height": 58 + }, + { + "symbol": "E", + "startX": 169, + "startY": 1, + "width": 40, + "height": 58 + }, + { + "symbol": "F", + "startX": 211, + "startY": 1, + "width": 40, + "height": 58 + }, + { + "symbol": "G", + "startX": 253, + "startY": 1, + "width": 40, + "height": 58 + }, + { + "symbol": "H", + "startX": 295, + "startY": 1, + "width": 40, + "height": 58 + }, + { + "symbol": "I", + "startX": 337, + "startY": 1, + "width": 40, + "height": 58 + }, + { + "symbol": "J", + "startX": 379, + "startY": 1, + "width": 40, + "height": 58 + }, + { + "symbol": "K", + "startX": 421, + "startY": 1, + "width": 40, + "height": 58 + }, + { + "symbol": "L", + "startX": 463, + "startY": 1, + "width": 40, + "height": 58 + }, + { + "symbol": "M", + "startX": 505, + "startY": 1, + "width": 40, + "height": 58 + }, + { + "symbol": "N", + "startX": 547, + "startY": 1, + "width": 40, + "height": 58 + }, + { + "symbol": "O", + "startX": 589, + "startY": 1, + "width": 40, + "height": 58 + }, + { + "symbol": "P", + "startX": 631, + "startY": 1, + "width": 40, + "height": 58 + }, + { + "symbol": "Q", + "startX": 673, + "startY": 1, + "width": 40, + "height": 58 + }, + { + "symbol": "R", + "startX": 715, + "startY": 1, + "width": 40, + "height": 58 + }, + { + "symbol": "S", + "startX": 757, + "startY": 1, + "width": 40, + "height": 58 + }, + { + "symbol": "T", + "startX": 799, + "startY": 1, + "width": 40, + "height": 58 + }, + { + "symbol": "U", + "startX": 841, + "startY": 1, + "width": 40, + "height": 58 + }, + { + "symbol": "V", + "startX": 883, + "startY": 1, + "width": 40, + "height": 58 + }, + { + "symbol": "W", + "startX": 925, + "startY": 1, + "width": 40, + "height": 58 + }, + { + "symbol": "X", + "startX": 967, + "startY": 1, + "width": 40, + "height": 58 + }, + { + "symbol": "Y", + "startX": 1009, + "startY": 1, + "width": 40, + "height": 58 + }, + { + "symbol": "Z", + "startX": 1051, + "startY": 1, + "width": 40, + "height": 58 + }, + { + "symbol": "a", + "startX": 1093, + "startY": 1, + "width": 40, + "height": 58 + }, + { + "symbol": "b", + "startX": 1135, + "startY": 1, + "width": 40, + "height": 58 + }, + { + "symbol": "c", + "startX": 1177, + "startY": 1, + "width": 40, + "height": 58 + }, + { + "symbol": "d", + "startX": 1219, + "startY": 1, + "width": 40, + "height": 58 + }, + { + "symbol": "e", + "startX": 1261, + "startY": 1, + "width": 40, + "height": 58 + }, + { + "symbol": "f", + "startX": 1303, + "startY": 1, + "width": 40, + "height": 58 + }, + { + "symbol": "g", + "startX": 1345, + "startY": 1, + "width": 40, + "height": 58 + }, + { + "symbol": "h", + "startX": 1387, + "startY": 1, + "width": 40, + "height": 58 + }, + { + "symbol": "i", + "startX": 1429, + "startY": 1, + "width": 40, + "height": 58 + }, + { + "symbol": "j", + "startX": 1471, + "startY": 1, + "width": 40, + "height": 58 + }, + { + "symbol": "k", + "startX": 1513, + "startY": 1, + "width": 40, + "height": 58 + }, + { + "symbol": "l", + "startX": 1555, + "startY": 1, + "width": 40, + "height": 58 + }, + { + "symbol": "m", + "startX": 1597, + "startY": 1, + "width": 40, + "height": 58 + }, + { + "symbol": "n", + "startX": 1639, + "startY": 1, + "width": 40, + "height": 58 + }, + { + "symbol": "o", + "startX": 1681, + "startY": 1, + "width": 40, + "height": 58 + }, + { + "symbol": "p", + "startX": 1723, + "startY": 1, + "width": 40, + "height": 58 + }, + { + "symbol": "q", + "startX": 1765, + "startY": 1, + "width": 40, + "height": 58 + }, + { + "symbol": "r", + "startX": 1807, + "startY": 1, + "width": 40, + "height": 58 + }, + { + "symbol": "s", + "startX": 1849, + "startY": 1, + "width": 40, + "height": 58 + }, + { + "symbol": "t", + "startX": 1891, + "startY": 1, + "width": 40, + "height": 58 + }, + { + "symbol": "u", + "startX": 1933, + "startY": 1, + "width": 40, + "height": 58 + }, + { + "symbol": "v", + "startX": 1975, + "startY": 1, + "width": 40, + "height": 58 + }, + { + "symbol": "w", + "startX": 2017, + "startY": 1, + "width": 40, + "height": 58 + }, + { + "symbol": "x", + "startX": 2059, + "startY": 1, + "width": 40, + "height": 58 + }, + { + "symbol": "y", + "startX": 2101, + "startY": 1, + "width": 40, + "height": 58 + }, + { + "symbol": "z", + "startX": 2143, + "startY": 1, + "width": 40, + "height": 58 + }, + { + "symbol": "1", + "startX": 2185, + "startY": 1, + "width": 40, + "height": 58 + }, + { + "symbol": "2", + "startX": 2227, + "startY": 1, + "width": 40, + "height": 58 + }, + { + "symbol": "3", + "startX": 2269, + "startY": 1, + "width": 40, + "height": 58 + }, + { + "symbol": "4", + "startX": 2311, + "startY": 1, + "width": 40, + "height": 58 + }, + { + "symbol": "5", + "startX": 2353, + "startY": 1, + "width": 40, + "height": 58 + }, + { + "symbol": "6", + "startX": 2395, + "startY": 1, + "width": 40, + "height": 58 + }, + { + "symbol": "7", + "startX": 2437, + "startY": 1, + "width": 40, + "height": 58 + }, + { + "symbol": "8", + "startX": 2479, + "startY": 1, + "width": 40, + "height": 58 + }, + { + "symbol": "9", + "startX": 2521, + "startY": 1, + "width": 40, + "height": 58 + }, + { + "symbol": "0", + "startX": 2563, + "startY": 1, + "width": 40, + "height": 58 + }, + { + "symbol": ".", + "startX": 2605, + "startY": 1, + "width": 40, + "height": 58 + }, + { + "symbol": "!", + "startX": 2647, + "startY": 1, + "width": 40, + "height": 58 + }, + { + "symbol": "?", + "startX": 2689, + "startY": 1, + "width": 40, + "height": 58 + }, + { + "symbol": "\"", + "startX": 2731, + "startY": 1, + "width": 40, + "height": 58 + }, + { + "symbol": "'", + "startX": 2773, + "startY": 1, + "width": 40, + "height": 58 + }, + { + "symbol": ",", + "startX": 2815, + "startY": 1, + "width": 40, + "height": 58 + } +] +} \ No newline at end of file diff --git a/assets/Textures/Fonts/myfont2.png b/assets/Textures/Fonts/myfont2.png new file mode 100644 index 0000000000000000000000000000000000000000..4af3caf8d32382062091b679feeaf4522274ea71 GIT binary patch literal 26717 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 literal 0 HcmV?d00001 diff --git a/src/main/java/electrosphere/controls/ControlHandler.java b/src/main/java/electrosphere/controls/ControlHandler.java index c3f2e9e5..9d7895b9 100644 --- a/src/main/java/electrosphere/controls/ControlHandler.java +++ b/src/main/java/electrosphere/controls/ControlHandler.java @@ -300,6 +300,7 @@ public class ControlHandler { case IN_GAME_MAIN_MENU: runHandlers(menuNavigationControlList); + runHandlers(typingControlList); // pollMenuNavigationControls(); break; diff --git a/src/main/java/electrosphere/main/Globals.java b/src/main/java/electrosphere/main/Globals.java index ecf6f258..d598e54d 100644 --- a/src/main/java/electrosphere/main/Globals.java +++ b/src/main/java/electrosphere/main/Globals.java @@ -370,7 +370,7 @@ public class Globals { //create default lights assetManager.registerModelToSpecificString(RenderUtils.createBitmapDisplay(), AssetDataStrings.ASSET_STRING_BITMAP_FONT); assetManager.registerModelToSpecificString(RenderUtils.createBitmapCharacter(), AssetDataStrings.BITMAP_CHARACTER_MODEL); - RawFontMap fontMap = FileUtils.loadObjectFromAssetPath("Textures/Fonts/myFontMap.json", RawFontMap.class); + RawFontMap fontMap = FileUtils.loadObjectFromAssetPath("Textures/Fonts/myFont2Map.json", RawFontMap.class); FontUtils.setFontDataMap(fontMap); //particle billboard model particleBillboardModel = assetManager.registerModel(RenderUtils.createParticleModel()); diff --git a/src/main/java/electrosphere/menu/MenuGenerators.java b/src/main/java/electrosphere/menu/MenuGenerators.java index f03b4d13..7230ca96 100644 --- a/src/main/java/electrosphere/menu/MenuGenerators.java +++ b/src/main/java/electrosphere/menu/MenuGenerators.java @@ -13,6 +13,7 @@ import electrosphere.game.server.saves.SaveUtils; import electrosphere.main.Globals; import electrosphere.main.Main; import electrosphere.net.NetUtils; +import electrosphere.renderer.Model; import electrosphere.renderer.RenderingEngine; import electrosphere.renderer.ui.ClickableElement; import electrosphere.renderer.ui.DrawableElement; @@ -537,21 +538,42 @@ public class MenuGenerators { return false; }}); + + //text entry (port) + TextInput modelDebugInput = new TextInput(100,150, 40*5, 40); + scrollable.addChild(modelDebugInput); + modelDebugInput.setText("Model path goes here"); + modelDebugInput.setOnFocus(new FocusEventCallback() {public boolean execute(FocusEvent event) { + return false; + }}); + modelDebugInput.setOnLoseFocus(new FocusEventCallback() {public boolean execute(FocusEvent event) { + return false; + }}); //label 2 (quit) Button quitButton = new Button(); - Label quitLabel = new Label(100,150,fontSize); - quitLabel.setText("debug or smthn"); + Label quitLabel = new Label(100,250,fontSize); + quitLabel.setText("Print Model Debug Info"); quitButton.addChild(quitLabel); scrollable.addChild(quitButton); quitButton.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; }}); - for(int i = 0; i < 10; i++){ + for(int i = 0; i < 9; i++){ Button someButton = new Button(); - Label someLabel = new Label(100,250 + i * 100,fontSize); + Label someLabel = new Label(100,350 + i * 100,fontSize); someLabel.setText("aaaaaa" + i); someButton.addChild(someLabel); scrollable.addChild(someButton); diff --git a/src/main/java/electrosphere/renderer/RenderUtils.java b/src/main/java/electrosphere/renderer/RenderUtils.java index b53d8dec..6d67b9bb 100644 --- a/src/main/java/electrosphere/renderer/RenderUtils.java +++ b/src/main/java/electrosphere/renderer/RenderUtils.java @@ -797,9 +797,9 @@ public class RenderUtils { m.nodeID = AssetDataStrings.ASSET_STRING_BITMAP_FONT_MESH_NAME; Material uiMat = new Material(); - Globals.assetManager.addTexturePathtoQueue("/Textures/Fonts/myfont1-harsher.png"); - uiMat.set_diffuse("/Textures/Fonts/myfont1-harsher.png"); - uiMat.set_specular("/Textures/Fonts/myfont1-harsher.png"); + Globals.assetManager.addTexturePathtoQueue("/Textures/Fonts/myfont2.png"); + uiMat.set_diffuse("/Textures/Fonts/myfont2.png"); + uiMat.set_specular("/Textures/Fonts/myfont2.png"); m.setMaterial(uiMat); rVal.materials = new ArrayList(); rVal.materials.add(uiMat); diff --git a/src/main/java/electrosphere/renderer/ui/elements/TextInput.java b/src/main/java/electrosphere/renderer/ui/elements/TextInput.java index 4a379cf2..38d981d1 100644 --- a/src/main/java/electrosphere/renderer/ui/elements/TextInput.java +++ b/src/main/java/electrosphere/renderer/ui/elements/TextInput.java @@ -8,7 +8,9 @@ import electrosphere.renderer.framebuffer.Framebuffer; import electrosphere.renderer.framebuffer.FramebufferUtils; import electrosphere.renderer.texture.Texture; import electrosphere.renderer.ui.DrawableElement; +import electrosphere.renderer.ui.FocusableElement; import electrosphere.renderer.ui.events.Event; +import electrosphere.renderer.ui.events.FocusEvent; import electrosphere.renderer.ui.font.FontUtils; import org.joml.Vector3f; import static org.lwjgl.opengl.GL30.GL_FRAMEBUFFER; @@ -18,7 +20,7 @@ import static org.lwjgl.opengl.GL30.glBindFramebuffer; * * @author amaterasu */ -public class TextInput implements DrawableElement { +public class TextInput implements DrawableElement, FocusableElement { Framebuffer widgetBuffer; Material customMat = new Material(); @@ -35,6 +37,10 @@ public class TextInput implements DrawableElement { int linePaddingHorizonal = 2; int linePaddingVertical = 5; + + boolean focused = false; + FocusEventCallback onFocusCallback = null; + FocusEventCallback onLoseFocusCallback = null; Vector3f color = new Vector3f(0,0,0); @@ -82,7 +88,6 @@ public class TextInput implements DrawableElement { public void setWidth(int width) { float ndcWidth = (float)width/(float)parentWidth; boxDimensions.x = ndcWidth; - System.out.println(ndcWidth); Framebuffer newBuffer = FramebufferUtils.generateTextureFramebuffer(width, height); Framebuffer oldBuffer = widgetBuffer; widgetBuffer = newBuffer; @@ -217,7 +222,34 @@ public class TextInput implements DrawableElement { } public boolean handleEvent(Event event){ - return true; + boolean propagate = true; + if(event instanceof FocusEvent){ + this.focused = ((FocusEvent)event).isFocused(); + if(this.focused && onFocusCallback != null){ + propagate = onFocusCallback.execute((FocusEvent)event); + } else if(!this.focused && onLoseFocusCallback != null){ + propagate = onLoseFocusCallback.execute((FocusEvent)event); + } + } + return propagate; + } + + @Override + public boolean isFocused() { + // TODO Auto-generated method stub + return focused; + } + + @Override + public void setOnFocus(FocusEventCallback callback) { + // TODO Auto-generated method stub + onFocusCallback = callback; + } + + @Override + public void setOnLoseFocus(FocusEventCallback callback) { + // TODO Auto-generated method stub + onLoseFocusCallback = callback; } }