bare minimum working ui update
All checks were successful
studiorailgun/Renderer/pipeline/head This commit looks good

This commit is contained in:
austin 2024-04-04 18:15:10 -04:00
parent cec82a6c67
commit 7c8e536f80
61 changed files with 1971 additions and 1927 deletions

View File

@ -14,18 +14,15 @@ void main(){
vec2 finalPos = vec2(
((aPos.x + 1)/2 * mDimension.x + mPosition.x) * 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)
);
((aPos.x + 1)/2 * mDimension.x + mPosition.x) * 2 - 1,
((aPos.y + 1)/2 * -mDimension.y + mPosition.y) * 2 - 1
);
gl_Position = vec4(finalPos.x, finalPos.y, 0.0, 1.0);
vec2 finalTex = vec2(
aTexCoords.x * tDimension.x + tPosition.x,
(1-aTexCoords.y) * tDimension.y + tPosition.y
);
aTexCoords.x * tDimension.x + tPosition.x,
(1 - aTexCoords.y) * tDimension.y + tPosition.y
);
TexCoords = finalTex;
}

View File

@ -1,4 +1,4 @@
#version 330 core
#version 430 core
out vec4 FragColor;
in vec2 TexCoords;

View File

@ -1,4 +1,4 @@
#version 330 core
#version 430 core
layout (location = 0) in vec3 aPos;
layout (location = 4) in vec2 aTexCoords;
@ -10,17 +10,19 @@ uniform vec3 tPosition;
uniform vec3 tDimension;
void main(){
vec2 finalPos = vec2(
((aPos.x + 1)/2 * mDimension.x + mPosition.x) * 2 - 1,
((((aPos.y + 1)/2) * mDimension.y + (1 - 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)
);
((aPos.x + 1)/2 * mDimension.x + mPosition.x) * 2 - 1,
((aPos.y + 1)/2 * mDimension.y + (1 - 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);
vec2 finalTex = vec2(
aTexCoords.x * tDimension.x + tPosition.x,
1 - (aTexCoords.y * tDimension.y + tPosition.y)
aTexCoords.y * tDimension.y + tPosition.y
);
// vec2 finalTex = aTexCoords;
// vec2 finalTex = vec2(

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

View File

@ -1,3 +1,3 @@
#maven.buildNumber.plugin properties file
#Sun Mar 24 15:51:37 EDT 2024
buildNumber=83
#Thu Apr 04 18:08:22 EDT 2024
buildNumber=94

View File

@ -0,0 +1,4 @@
@page creatureideas Creature Ideas
Leaf Sheep
Jellyfish

View File

@ -1,4 +1,5 @@
@page creaturesindex Creatures
[TOC]
- @subpage creatureideas
- @subpage creaturemechanicsideas

View File

@ -4,3 +4,5 @@ If/when fluidsim is a part of the engine, have a creature that constantly keeps
Ocean-faring monsters that create voids that push away liquid (thus making them challenging to fight on a boat)
Scary creatures that, when entering a chunk, gradually reduce environment volume to zero (ie crickets stop chirping because it's so scary) Like a demon scarecrow or devil
Custom cursors per playable race (ie gauntlet for humans, claw for demons, etc)

View File

@ -203,6 +203,12 @@ Level loading/saving + Basic Editor
# TODO
UI Work
- Make ui feel more responsive, whatever that means (answer is make hover-over styling work lol)
- Frames for windows (WIP)
- Need to figure out style-wise what we want to do here (generally minimalist)
- Fix scrollable handling
Level loading/saving + Basic Editor
- Basic editor functionality
- Menu of types of entities to spawn

14
pom.xml
View File

@ -256,6 +256,20 @@
<scope>runtime</scope>
</dependency>
<!--Yoga-->
<!--License: ???-->
<dependency>
<groupId>org.lwjgl</groupId>
<artifactId>lwjgl-yoga</artifactId>
<version>${lwjgl.version}</version>
</dependency>
<dependency>
<groupId>org.lwjgl</groupId>
<artifactId>lwjgl-yoga</artifactId>
<version>${lwjgl.version}</version>
<classifier>${lwjgl.natives}</classifier>
</dependency>
</dependencies>

View File

@ -6,7 +6,6 @@ import org.joml.Vector3f;
import electrosphere.client.targeting.crosshair.Crosshair;
import electrosphere.engine.Globals;
import electrosphere.engine.Main;
import electrosphere.entity.EntityUtils;
import electrosphere.entity.types.camera.CameraEntityUtils;
import electrosphere.renderer.ui.events.MouseEvent;

View File

@ -1,13 +1,18 @@
package electrosphere.controls;
import electrosphere.renderer.ui.events.MouseEvent;
import electrosphere.renderer.ui.events.ScrollEvent;
/**
* A low level control inside the engine
*/
public class Control {
public static enum ControlType {
KEY,
MOUSE_BUTTON,
MOUSE_MOVEMENT,
MOUSE_SCROLL,
}
ControlType type;
@ -18,6 +23,7 @@ public class Control {
ControlMethod onRepeat;
ControlMethod onClick;
MouseCallback onMove;
ScrollCallback onScroll;
float pressFrame = 0;
float repeatTimeout = 0;
@ -72,6 +78,10 @@ public class Control {
onClick = method;
}
public void setOnScroll(ScrollCallback callback){
onScroll = callback;
}
public void onPress(){
if(onPress != null){
onPress.execute();
@ -102,6 +112,12 @@ public class Control {
}
}
public void onScroll(ScrollEvent event){
if(onScroll != null){
onScroll.execute(event);
}
}
public float getPressFrame(){
return this.pressFrame;
}
@ -127,4 +143,8 @@ public class Control {
public void execute(MouseEvent event);
}
public interface ScrollCallback {
public void execute(ScrollEvent event);
}
}

View File

@ -58,8 +58,6 @@ import static org.lwjgl.glfw.GLFW.GLFW_MOUSE_BUTTON_2;
import static org.lwjgl.glfw.GLFW.GLFW_MOUSE_BUTTON_LEFT;
import static org.lwjgl.glfw.GLFW.GLFW_MOUSE_BUTTON_RIGHT;
import static org.lwjgl.glfw.GLFW.glfwGetCursorPos;
import static org.lwjgl.glfw.GLFW.glfwMakeContextCurrent;
import static org.lwjgl.glfw.GLFW.glfwMaximizeWindow;
import static org.lwjgl.glfw.GLFW.glfwSetInputMode;
import java.util.HashMap;
@ -69,9 +67,7 @@ import java.util.List;
import org.joml.Vector2f;
import org.joml.Vector3d;
import org.joml.Vector3f;
import org.lwjgl.glfw.GLFW;
import electrosphere.audio.AudioUtils;
import electrosphere.audio.VirtualAudioSourceManager.VirtualAudioSourceType;
import electrosphere.client.targeting.crosshair.Crosshair;
import electrosphere.client.terrain.editing.TerrainEditing;
@ -96,7 +92,6 @@ import electrosphere.entity.state.movement.groundmove.GroundMovementTree.Movemen
import electrosphere.entity.types.camera.CameraEntityUtils;
import electrosphere.entity.types.creature.CreatureUtils;
import electrosphere.logger.LoggerInterface;
import electrosphere.menu.MenuGenerators;
import electrosphere.menu.WindowStrings;
import electrosphere.menu.WindowUtils;
import electrosphere.menu.ingame.MenuGeneratorsInGame;
@ -108,6 +103,7 @@ import electrosphere.renderer.ui.events.KeyboardEvent;
import electrosphere.renderer.ui.events.MenuEvent;
import electrosphere.renderer.ui.events.MenuEvent.MenuEventType;
import electrosphere.renderer.ui.events.MouseEvent;
import electrosphere.renderer.ui.events.ScrollEvent;
/**
*
@ -145,6 +141,7 @@ public class ControlHandler {
public static final String INPUT_CODE_MENU_MOUSE_PRIMARY = "menuMousePrimary";
public static final String DATA_STRING_INPUT_CODE_MENU_BACKOUT = "menuBackout";
public static final String MENU_MOUSE_MOVE = "menuMouseMove";
public static final String MENU_SCROLL = "menuScroll";
@ -288,6 +285,7 @@ public class ControlHandler {
handler.addControl(DATA_STRING_INPUT_CODE_MENU_BACKOUT, new Control(ControlType.KEY,GLFW_KEY_ESCAPE));
handler.addControl(MENU_MOUSE_MOVE, new Control(ControlType.MOUSE_MOVEMENT,0));
handler.addControl(INPUT_CODE_MENU_MOUSE_PRIMARY, new Control(ControlType.MOUSE_BUTTON,GLFW_MOUSE_BUTTON_LEFT));
handler.addControl(MENU_SCROLL, new Control(ControlType.MOUSE_SCROLL,0));
/*
Map the typing controls
@ -437,6 +435,7 @@ public class ControlHandler {
break;
}
Globals.scrollCallback.clear();
}
@ -1099,6 +1098,12 @@ public class ControlHandler {
Globals.elementManager.updateHover(mouseEvent.getCurrentX(), mouseEvent.getCurrentY());
}});
//scrolling the mouse
menuNavigationControlList.add(controls.get(MENU_SCROLL));
controls.get(MENU_SCROLL).setOnScroll(new Control.ScrollCallback() {public void execute(ScrollEvent scrollEvent){
Globals.elementManager.fireEvent(scrollEvent, GLFW_KEY_X, GLFW_KEY_Z);
}});
//Decrementing a menu element
@ -1125,8 +1130,8 @@ public class ControlHandler {
menuNavigationControlList.add(controls.get(DATA_STRING_INPUT_CODE_MENU_SELECT));
controls.get(DATA_STRING_INPUT_CODE_MENU_SELECT).setOnPress(new ControlMethod(){public void execute(){
Globals.elementManager.click(new ClickEvent(
Globals.elementManager.getFocusedElement().getPositionX(),
Globals.elementManager.getFocusedElement().getPositionY(),
Globals.elementManager.getFocusedElement().getInternalX() + 1,
Globals.elementManager.getFocusedElement().getInternalY() + 1,
true,
Globals.mouseCallback.getButton(GLFW_MOUSE_BUTTON_2)
));
@ -1249,8 +1254,8 @@ public class ControlHandler {
controls.get(currentKey).setOnPress(new ControlMethod(){public void execute(){
Globals.elementManager.fireEvent(
new KeyboardEvent(convertKeycodeToName(controls.get(currentKey).keyValue)),
Globals.elementManager.getFocusedElement().getPositionX(),
Globals.elementManager.getFocusedElement().getPositionY()
Globals.elementManager.getFocusedElement().getInternalX() + 1,
Globals.elementManager.getFocusedElement().getInternalY() + 1
);
// MenuCallbacks.menuHandleKeypress(Globals.currentMenu,currentKey);
}});
@ -1329,60 +1334,67 @@ public class ControlHandler {
for(Control control : controls){
switch(control.getType()){
case KEY:
if(Globals.controlCallback.getKey(control.getKeyValue())){
if(!control.isState()){
//on press
control.onPress();
control.setPressFrame((float)Globals.timekeeper.getMostRecentRawFrametime());
case KEY: {
if(Globals.controlCallback.getKey(control.getKeyValue())){
if(!control.isState()){
//on press
control.onPress();
control.setPressFrame((float)Globals.timekeeper.getMostRecentRawFrametime());
} else {
//on repeat
if((float)Globals.timekeeper.getMostRecentRawFrametime() - control.getPressFrame() > control.getRepeatTimeout()){
control.onRepeat();
}
}
control.setState(true);
} else {
//on repeat
if((float)Globals.timekeeper.getMostRecentRawFrametime() - control.getPressFrame() > control.getRepeatTimeout()){
if(control.isState()){
//on release
control.onRelease();
//on click
if((float)Globals.timekeeper.getMostRecentRawFrametime() - control.getPressFrame() < control.getRepeatTimeout()){
control.onClick();
}
} else {
}
control.setState(false);
}
} break;
case MOUSE_BUTTON: {
if(Globals.mouseCallback.getButton(control.getKeyValue())){
if(!control.isState()){
//on press
control.onPress();
control.setPressFrame((float)Globals.timekeeper.getMostRecentRawFrametime());
} else {
//on repeat
control.onRepeat();
}
}
control.setState(true);
} else {
if(control.isState()){
//on release
control.onRelease();
//on click
if((float)Globals.timekeeper.getMostRecentRawFrametime() - control.getPressFrame() < control.getRepeatTimeout()){
control.onClick();
control.setState(true);
} else {
if(control.isState()){
//on release
control.onRelease();
if((float)Globals.timekeeper.getMostRecentRawFrametime() - control.getPressFrame() < control.getRepeatTimeout()){
control.onClick();
}
} else {
}
} else {
control.setState(false);
}
control.setState(false);
}
break;
case MOUSE_BUTTON:
if(Globals.mouseCallback.getButton(control.getKeyValue())){
if(!control.isState()){
//on press
control.onPress();
control.setPressFrame((float)Globals.timekeeper.getMostRecentRawFrametime());
} else {
//on repeat
control.onRepeat();
} break;
case MOUSE_MOVEMENT: {
if(mouseMoveEvent){
control.onMove(currentMouseEvent);
}
control.setState(true);
} else {
if(control.isState()){
//on release
control.onRelease();
if((float)Globals.timekeeper.getMostRecentRawFrametime() - control.getPressFrame() < control.getRepeatTimeout()){
control.onClick();
}
} else {
} break;
case MOUSE_SCROLL: {
double yScroll = Globals.scrollCallback.getOffsetY();
if(yScroll != 0){
ScrollEvent event = new ScrollEvent(xpos,ypos,yScroll);
control.onScroll(event);
}
control.setState(false);
}
break;
case MOUSE_MOVEMENT:
if(mouseMoveEvent){
control.onMove(currentMouseEvent);
}
break;
} break;
}
}
}

View File

@ -5,10 +5,15 @@ import org.lwjgl.glfw.GLFWMouseButtonCallback;
import electrosphere.logger.LoggerInterface;
/**
* A callback for mouse functions
*/
public class MouseCallback extends GLFWMouseButtonCallback {
//the number of buttons available
static final short KEY_VALUE_ARRAY_SIZE = 512;
//current value of all buttons pressed
boolean[] buttonValues = new boolean[KEY_VALUE_ARRAY_SIZE];
@Override
@ -23,9 +28,9 @@ public class MouseCallback extends GLFWMouseButtonCallback {
}
/**
* !!!WARNING!!!, will silently fail if opengl elementsn ot defined or keycode is outside of key value array size or is not in main rendering thread
* @param keycode
* @return
* !!!WARNING!!!, will silently fail if opengl elements not defined or keycode is outside of key value array size or is not in main rendering thread
* @param keycode The keycode
* @return The button's pressed state
*/
public boolean getButton(int keycode){
if(keycode >= 0 && keycode < KEY_VALUE_ARRAY_SIZE){

View File

@ -0,0 +1,44 @@
package electrosphere.controls;
import org.lwjgl.glfw.GLFWScrollCallback;
/**
* A callback for scroll events from the mouse
*/
public class ScrollCallback extends GLFWScrollCallback {
//the offsets from the most recent scroll event
double offsetX = 0;
double offsetY = 0;
@Override
public void invoke(long window, double xoffset, double yoffset) {
offsetX = xoffset;
offsetY = yoffset;
}
/**
* The x offset from the scroll, !!setting the stored value to 0 in the process!!
* @return The x scroll offset
*/
public double getOffsetX(){
return offsetX;
}
/**
* The y offset from the scroll, !!setting the stored value to 0 in the process!!
* @return The y scroll offset
*/
public double getOffsetY(){
return offsetY;
}
/**
* Clears the data cached in the callback
*/
public void clear(){
offsetX = 0;
offsetY = 0;
}
}

View File

@ -27,6 +27,7 @@ import electrosphere.controls.CameraHandler;
import electrosphere.controls.ControlCallback;
import electrosphere.controls.ControlHandler;
import electrosphere.controls.MouseCallback;
import electrosphere.controls.ScrollCallback;
import electrosphere.engine.assetmanager.AssetDataStrings;
import electrosphere.engine.assetmanager.AssetManager;
import electrosphere.engine.loadingthreads.LoadingThread;
@ -121,7 +122,9 @@ public class Globals {
//
//Garbage Collection
//
public static boolean EXPLICIT_GC = true;
//set to true to trigger full GC every frame
//a full GC includes collecting old generations as well -- likely very laggy!!
public static boolean EXPLICIT_GC = false;
//
@ -151,6 +154,7 @@ public class Globals {
public static boolean updateCamera = true;
public static ControlCallback controlCallback = new ControlCallback();
public static MouseCallback mouseCallback = new MouseCallback();
public static ScrollCallback scrollCallback = new ScrollCallback();
//
@ -513,10 +517,12 @@ public class Globals {
solidPlaneModelID = assetManager.registerModel(RenderUtils.createInWindowPanel("Shaders/ui/plainBox/plainBox.vs", "Shaders/ui/plainBox/plainBox.fs"));
//image panel
ImagePanel.imagePanelModelPath = assetManager.registerModel(RenderUtils.createPlaneModel("Shaders/font/bitmapchar/bitmapchar.vs", "Shaders/font/bitmapchar/bitmapchar.fs"));
ImagePanel.imagePanelModelPath = assetManager.registerModel(RenderUtils.createPlaneModel("Shaders/plane/plane.vs", "Shaders/plane/plane.fs"));
//init ui images
assetManager.addTexturePathtoQueue("Textures/ui/WindowBorder.png");
assetManager.addTexturePathtoQueue("Textures/ui/uiFrame1.png");
assetManager.addTexturePathtoQueue("Textures/ui/uiFrame2.png");
testingTexture = "Textures/Testing1.png";
Globals.assetManager.addTexturePathtoQueue(testingTexture);

View File

@ -19,6 +19,7 @@ public class LoggerInterface {
public static Logger loggerAuth;
public static Logger loggerDB;
public static Logger loggerAudio;
public static Logger loggerUI;
public static void initLoggers(){
loggerStartup = new Logger(LogLevel.WARNING);
@ -30,6 +31,7 @@ public class LoggerInterface {
loggerAuth = new Logger(LogLevel.WARNING);
loggerDB = new Logger(LogLevel.WARNING);
loggerAudio = new Logger(LogLevel.WARNING);
loggerUI = new Logger(LogLevel.INFO);
loggerStartup.INFO("Initialized loggers");
}
}

View File

@ -27,6 +27,7 @@ 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.FormElement;
import electrosphere.renderer.ui.elements.ImagePanel;
import electrosphere.renderer.ui.elements.Label;
import electrosphere.renderer.ui.elements.ScrollableContainer;
@ -39,7 +40,6 @@ import electrosphere.renderer.ui.elementtypes.ValueElement.ValueChangeEventCallb
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.generation.OverworldChunkGenerator;
import electrosphere.server.terrain.manager.ServerTerrainManager;
@ -66,7 +66,7 @@ public class MenuGenerators {
//button (select save)
Button selectButton = new Button();
Label selectLabel = new Label(100,125 + verticalPosition,1.0f);
Label selectLabel = new Label(1.0f);
selectLabel.setText(saveName.toUpperCase());
selectButton.addChild(selectLabel);
rVal.addChild(selectButton);
@ -97,7 +97,7 @@ public class MenuGenerators {
//button (create)
Button createButton = new Button();
Label createLabel = new Label(100,125 + verticalPosition + 200,1.0f);
Label createLabel = new Label(1.0f);
createLabel.setText("Create World");
createButton.addChild(createLabel);
rVal.addChild(createButton);
@ -123,7 +123,7 @@ public class MenuGenerators {
//button (create)
Button createButton = new Button();
Label createLabel = new Label(100,screenTop + verticalPosition,1.0f);
Label createLabel = new Label(1.0f);
createLabel.setText("Create");
createButton.addChild(createLabel);
rVal.addChild(createButton);
@ -148,7 +148,7 @@ public class MenuGenerators {
//button (save)
Button saveButton = new Button();
Label saveLabel = new Label(100,screenTop + 125,1.0f);
Label saveLabel = new Label(1.0f);
saveLabel.setText("Save");
saveButton.addChild(saveLabel);
rVal.addChild(saveButton);
@ -160,7 +160,7 @@ public class MenuGenerators {
//button (cancel)
Button cancelButton = new Button();
Label cancelLabel = new Label(100,screenTop + 200,1.0f);
Label cancelLabel = new Label(1.0f);
cancelLabel.setText("Cancel");
cancelButton.addChild(cancelLabel);
rVal.addChild(cancelButton);
@ -182,7 +182,7 @@ public class MenuGenerators {
//button (create)
Button createButton = new Button();
Label createLabel = new Label(100,screenTop + verticalPosition,1.0f);
Label createLabel = new Label(1.0f);
createLabel.setText("Create World");
createButton.addChild(createLabel);
rVal.addChild(createButton);
@ -201,7 +201,7 @@ public class MenuGenerators {
//button (create)
Button createButton = new Button();
Label createLabel = new Label(100,screenTop + verticalPosition,1.0f);
Label createLabel = new Label(1.0f);
createLabel.setText("Create World");
createButton.addChild(createLabel);
rVal.addChild(createButton);
@ -215,7 +215,7 @@ public class MenuGenerators {
//button (host)
Button hostButton = new Button();
Label hostLabel = new Label(100,screenTop + 125,1.0f);
Label hostLabel = new Label(1.0f);
hostLabel.setText("Host");
hostButton.addChild(hostLabel);
rVal.addChild(hostButton);
@ -233,7 +233,7 @@ public class MenuGenerators {
//button (join)
Button joinButton = new Button();
Label joinLabel = new Label(100,screenTop + 200,1.0f);
Label joinLabel = new Label(1.0f);
joinLabel.setText("Join");
joinButton.addChild(joinLabel);
rVal.addChild(joinButton);
@ -245,7 +245,7 @@ public class MenuGenerators {
//button (back)
Button connectButton = new Button();
Label connectLabel = new Label(100,screenTop + 275,1.0f);
Label connectLabel = new Label(1.0f);
connectLabel.setText("Back");
connectButton.addChild(connectLabel);
rVal.addChild(connectButton);
@ -262,7 +262,7 @@ public class MenuGenerators {
int screenTop = 150;
//label (address)
Label addressLabel = new Label(100,screenTop + 50,1.0f);
Label addressLabel = new Label(1.0f);
addressLabel.setText("IP Address");
rVal.addChild(addressLabel);
@ -272,7 +272,7 @@ public class MenuGenerators {
rVal.addChild(addressInput);
//label (port)
Label portLabel = new Label(100,screenTop + 200,1.0f);
Label portLabel = new Label(1.0f);
portLabel.setText("Port");
rVal.addChild(portLabel);
@ -282,7 +282,7 @@ public class MenuGenerators {
rVal.addChild(portInput);
//label (address)
Label usernameLabel = new Label(100,screenTop + 350,1.0f);
Label usernameLabel = new Label(1.0f);
usernameLabel.setText("Username");
rVal.addChild(usernameLabel);
@ -292,7 +292,7 @@ public class MenuGenerators {
rVal.addChild(usernameInput);
//label (port)
Label passwordLabel = new Label(100,screenTop + 500,1.0f);
Label passwordLabel = new Label(1.0f);
passwordLabel.setText("Password");
rVal.addChild(passwordLabel);
@ -303,7 +303,7 @@ public class MenuGenerators {
//button (connect)
Button connectButton = new Button();
Label connectLabel = new Label(100,screenTop + 650,1.0f);
Label connectLabel = new Label(1.0f);
connectLabel.setText("Connect");
connectButton.addChild(connectLabel);
rVal.addChild(connectButton);
@ -322,7 +322,7 @@ public class MenuGenerators {
//button (back)
Button backButton = new Button();
Label backLabel = new Label(100,screenTop + 725,1.0f);
Label backLabel = new Label(1.0f);
backLabel.setText("Back");
backButton.addChild(backLabel);
rVal.addChild(backButton);
@ -336,16 +336,15 @@ public class MenuGenerators {
public static Element createOptionsMainMenu(){
FormElement rVal = new FormElement();
int screenTop = 150;
//label (options)
Label optionsLabel = new Label(100,screenTop + 50,1.0f);
Label optionsLabel = new Label(1.0f);
optionsLabel.setText("Options");
rVal.addChild(optionsLabel);
//button (back)
Button backButton = new Button();
Label backLabel = new Label(100,screenTop + 275,1.0f);
Label backLabel = new Label(1.0f);
backLabel.setText("Back");
backButton.addChild(backLabel);
rVal.addChild(backButton);
@ -357,61 +356,6 @@ public class MenuGenerators {
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;
}
}

View File

@ -19,8 +19,9 @@ public class WindowUtils {
if(mainMenuEl != null && mainMenuEl instanceof Window){
Window mainMenu = (Window) mainMenuEl;
//todo: destroy elements as well
mainMenu.getChildren().clear();
mainMenu.clear();
mainMenu.addChild(newMenu);
mainMenu.applyYoga();
Globals.elementManager.focusFirstElement();
}
}
@ -107,16 +108,17 @@ public class WindowUtils {
}
static void initLoadingWindow(){
Window loadingWindow = new Window(0, 0, Globals.WINDOW_WIDTH, Globals.WINDOW_HEIGHT);
Label loadingLabel = new Label(100,50,1.0f);
Window loadingWindow = new Window(0, 0, Globals.WINDOW_WIDTH, Globals.WINDOW_HEIGHT,false);
Label loadingLabel = new Label(1.0f);
loadingLabel.setText("LOADING");
loadingWindow.addChild(loadingLabel);
loadingWindow.applyYoga();
Globals.elementManager.registerWindow(WindowStrings.WINDOW_LOADING, loadingWindow);
WindowUtils.recursiveSetVisible(loadingWindow, true);
}
static void initMainMenuWindow(){
Window mainMenuWindow = new Window(0, 0, Globals.WINDOW_WIDTH, Globals.WINDOW_HEIGHT);
Window mainMenuWindow = new Window(0, 0, Globals.WINDOW_WIDTH, Globals.WINDOW_HEIGHT,false);
Globals.elementManager.registerWindow(WindowStrings.WINDOW_MENU_MAIN, mainMenuWindow);
WindowUtils.replaceMainMenuContents(MenuGeneratorsTitleMenu.createTitleMenu());
}
@ -126,7 +128,7 @@ public class WindowUtils {
}
static void initItemDragContainerWindow(){
Window itemDragContainerWindow = new Window(0,0,Globals.WINDOW_WIDTH,Globals.WINDOW_HEIGHT);
Window itemDragContainerWindow = new Window(0,0,Globals.WINDOW_WIDTH,Globals.WINDOW_HEIGHT,true);
Globals.elementManager.registerWindow(WindowStrings.WINDOW_ITEM_DRAG_CONTAINER, itemDragContainerWindow);
}

View File

@ -1,6 +1,7 @@
package electrosphere.menu.ingame;
import org.joml.Vector3f;
import org.lwjgl.util.yoga.Yoga;
import electrosphere.controls.ControlHandler.ControlsState;
import electrosphere.engine.Globals;
@ -25,6 +26,7 @@ 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.elements.VirtualScrollable;
import electrosphere.renderer.ui.elementtypes.ClickableElement;
import electrosphere.renderer.ui.elementtypes.NavigableElement.NavigationEventCallback;
import electrosphere.renderer.ui.elementtypes.ValueElement.ValueChangeEventCallback;
@ -42,7 +44,7 @@ public class MenuGeneratorsInGame {
// int screenTop = Globals.WINDOW_HEIGHT - 150;
int width = 500;
int height = 500;
Window rVal = new Window(0,0,width,height);
Window rVal = new Window(0,0,width,height,true);
// int screenLeft = (Globals.WINDOW_WIDTH - width)/2;
Div div = new Div();
rVal.addChild(div);
@ -59,15 +61,15 @@ public class MenuGeneratorsInGame {
}});
//black texture background
ImagePanel imagePanel = new ImagePanel(0,0,width,height,Globals.blackTexture);
// 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);
// div.addChild(imagePanel);
//label 1 (back)
Button backButton = new Button();
Label backLabel = new Label(100,50,1.0f);
Label backLabel = new Label(1.0f);
backLabel.setText("Back");
backButton.addChild(backLabel);
div.addChild(backButton);
@ -86,7 +88,7 @@ public class MenuGeneratorsInGame {
//label 2 (quit)
Button saveButton = new Button();
Label saveLabel = new Label(100,150,1.0f);
Label saveLabel = new Label(1.0f);
saveLabel.setText("Save");
saveButton.addChild(saveLabel);
div.addChild(saveButton);
@ -99,7 +101,7 @@ public class MenuGeneratorsInGame {
//label 3 (quit)
Button quitButton = new Button();
Label quitLabel = new Label(100,250,1.0f);
Label quitLabel = new Label(1.0f);
quitLabel.setText("Quit");
quitButton.addChild(quitLabel);
div.addChild(quitButton);
@ -112,7 +114,7 @@ public class MenuGeneratorsInGame {
// if(Globals.server != null && Globals.macroData == null){
//label 4 (debug)
Button debugButton = new Button();
Label debugLabel = new Label(100,350,1.0f);
Label debugLabel = new Label(1.0f);
debugLabel.setText("Debug");
debugButton.addChild(debugLabel);
div.addChild(debugButton);
@ -122,6 +124,8 @@ public class MenuGeneratorsInGame {
}});
// }
rVal.applyYoga();
return rVal;
}
@ -136,15 +140,15 @@ public class MenuGeneratorsInGame {
// int screenTop = Globals.WINDOW_HEIGHT - 150;
int width = 500;
int height = 500;
float fontSize = 0.4f;
Window rVal = new Window(0,0,width,height);
float fontSize = 1.0f;
Window rVal = new Window(0,0,width,height,true);
// 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);
VirtualScrollable scrollable = new VirtualScrollable(width, height);
rVal.addChild(scrollable);
// scrollable.addChild(div);
rVal.setOnNavigationCallback(new NavigationEventCallback() {public boolean execute(NavigationEvent event){
@ -153,15 +157,15 @@ public class MenuGeneratorsInGame {
}});
//black texture background
ImagePanel imagePanel = new ImagePanel(0,0,width,height + 1000,Globals.blackTexture);
// 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);
// scrollable.addChild(imagePanel);
//label 1 (back)
Button backButton = new Button();
Label backLabel = new Label(100,50,fontSize);
Label backLabel = new Label(fontSize);
backLabel.setText("Back");
backButton.addChild(backLabel);
scrollable.addChild(backButton);
@ -178,7 +182,7 @@ public class MenuGeneratorsInGame {
//label 3 (load model and debug)
Button debugModelButton = new Button();
Label debugModelLabel = new Label(100,250,fontSize);
Label debugModelLabel = new Label(fontSize);
debugModelLabel.setText("Print Model Debug Info");
debugModelButton.addChild(debugModelLabel);
scrollable.addChild(debugModelButton);
@ -199,7 +203,7 @@ public class MenuGeneratorsInGame {
//label 4 (reload all shaders)
Button reloadShaderButton = new Button();
Label reloadShaderLabel = new Label(100,350,fontSize);
Label reloadShaderLabel = new Label(fontSize);
reloadShaderLabel.setText("Reload all shaders");
reloadShaderButton.addChild(reloadShaderLabel);
scrollable.addChild(reloadShaderButton);
@ -211,7 +215,7 @@ public class MenuGeneratorsInGame {
//reload all models
Button reloadModelButton = new Button();
Label reloadModelLabel = new Label(100,450,fontSize);
Label reloadModelLabel = new Label(fontSize);
reloadModelLabel.setText("Reload all models");
reloadModelButton.addChild(reloadModelLabel);
scrollable.addChild(reloadModelButton);
@ -223,7 +227,7 @@ public class MenuGeneratorsInGame {
//disable drawing player character
Button toggleDrawPlayerButton = new Button();
Label toggleDrawPlayerLabel = new Label(100,550,fontSize);
Label toggleDrawPlayerLabel = new Label(fontSize);
toggleDrawPlayerLabel.setText("Toggle draw character");
toggleDrawPlayerButton.addChild(toggleDrawPlayerLabel);
scrollable.addChild(toggleDrawPlayerButton);
@ -244,7 +248,7 @@ public class MenuGeneratorsInGame {
//pull up character editor
Button characterSliderMenuButton = new Button();
Label characterSliderMenuLabel = new Label(100,650,fontSize);
Label characterSliderMenuLabel = new Label(fontSize);
characterSliderMenuLabel.setText("Character slider menu");
characterSliderMenuButton.addChild(characterSliderMenuLabel);
scrollable.addChild(characterSliderMenuButton);
@ -253,21 +257,9 @@ public class MenuGeneratorsInGame {
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);
Label switchFramebufferLabel = new Label(fontSize);
switchFramebufferLabel.setText("Switch Active Framebuffer");
switchFramebufferButton.addChild(switchFramebufferLabel);
scrollable.addChild(switchFramebufferButton);
@ -279,7 +271,7 @@ public class MenuGeneratorsInGame {
//label (toggle draw collision spheres)
Button toggleCollisionSpheresButton = new Button();
Label toggleCollisionSpheresLabel = new Label(100,1350,fontSize);
Label toggleCollisionSpheresLabel = new Label(fontSize);
toggleCollisionSpheresLabel.setText("Toggle draw collision spheres");
toggleCollisionSpheresButton.addChild(toggleCollisionSpheresLabel);
scrollable.addChild(toggleCollisionSpheresButton);
@ -291,7 +283,7 @@ public class MenuGeneratorsInGame {
//label (toggle draw physics objects)
Button togglePhysicsObjectsButton = new Button();
Label togglePhysicsObjectsLabel = new Label(100,1450,fontSize);
Label togglePhysicsObjectsLabel = new Label(fontSize);
togglePhysicsObjectsLabel.setText("Toggle draw physics objects");
togglePhysicsObjectsButton.addChild(togglePhysicsObjectsLabel);
scrollable.addChild(togglePhysicsObjectsButton);
@ -303,7 +295,7 @@ public class MenuGeneratorsInGame {
//label (toggle draw movement vectors)
Button toggleMovementVectorsButton = new Button();
Label toggleMovementVectorsLabel = new Label(100,1550,fontSize);
Label toggleMovementVectorsLabel = new Label(fontSize);
toggleMovementVectorsLabel.setText("Toggle draw movement vectors");
toggleMovementVectorsButton.addChild(toggleMovementVectorsLabel);
scrollable.addChild(toggleMovementVectorsButton);
@ -315,7 +307,7 @@ public class MenuGeneratorsInGame {
//label (toggle draw navmesh)
Button toggleNavmeshButton = new Button();
Label toggleNavmeshLabel = new Label(100,1650,fontSize);
Label toggleNavmeshLabel = new Label(fontSize);
toggleNavmeshLabel.setText("Toggle draw navmesh");
toggleNavmeshButton.addChild(toggleNavmeshLabel);
scrollable.addChild(toggleNavmeshButton);
@ -325,6 +317,8 @@ public class MenuGeneratorsInGame {
return false;
}});
rVal.applyYoga();
return rVal;
}
@ -332,7 +326,7 @@ public class MenuGeneratorsInGame {
int width = 500;
int height = 500;
float fontSize = 0.4f;
Window rVal = new Window(0,0,width,height);
Window rVal = new Window(0,0,width,height,true);
// int screenLeft = (Globals.WINDOW_WIDTH - width)/2;
// Div div = new Div();
// div.setPositionX(0);
@ -356,7 +350,7 @@ public class MenuGeneratorsInGame {
//label 1 (back)
Button backButton = new Button();
Label backLabel = new Label(200,50,fontSize);
Label backLabel = new Label(fontSize);
backLabel.setText("Back");
backButton.addChild(backLabel);
scrollable.addChild(backButton);
@ -388,6 +382,8 @@ public class MenuGeneratorsInGame {
}
}
rVal.applyYoga();
return rVal;
}

View File

@ -36,7 +36,7 @@ public class MenuGeneratorsInventory {
int width = 500;
int height = 500;
Window rVal = new Window(0,0,Globals.WINDOW_WIDTH,Globals.WINDOW_HEIGHT);
Window rVal = new Window(0,0,Globals.WINDOW_WIDTH,Globals.WINDOW_HEIGHT,true);
Div div = new Div();
rVal.addChild(div);
@ -200,7 +200,7 @@ public class MenuGeneratorsInventory {
int width = 500;
int height = 500;
// int screenLeft = (Globals.WINDOW_WIDTH - width)/2;
Window rVal = new Window(0,0,Globals.WINDOW_WIDTH,Globals.WINDOW_HEIGHT);
Window rVal = new Window(0,0,Globals.WINDOW_WIDTH,Globals.WINDOW_HEIGHT,true);
Div div = new Div();
div.setPositionX(1000);
@ -367,7 +367,7 @@ public class MenuGeneratorsInventory {
}
public static Element worldItemDropCaptureWindow(){
Window rVal = new Window(0,0,Globals.WINDOW_WIDTH,Globals.WINDOW_HEIGHT);
Window rVal = new Window(0,0,Globals.WINDOW_WIDTH,Globals.WINDOW_HEIGHT,true);
Div div = new Div();
div.setOnDragRelease(new DragEventCallback() {public boolean execute(DragEvent event){
if(Globals.draggedItem != null){

View File

@ -3,14 +3,13 @@ package electrosphere.menu.mainmenu;
import electrosphere.auth.AuthenticationManager;
import electrosphere.engine.Globals;
import electrosphere.engine.loadingthreads.LoadingThread;
import electrosphere.net.NetUtils;
import electrosphere.renderer.ui.elements.Button;
import electrosphere.renderer.ui.elements.FormElement;
import electrosphere.renderer.ui.elements.Label;
import electrosphere.renderer.ui.elements.TextInput;
import electrosphere.renderer.ui.elementtypes.ClickableElement;
import electrosphere.renderer.ui.elementtypes.Element;
import electrosphere.renderer.ui.events.ClickEvent;
import electrosphere.renderer.ui.form.FormElement;
public class MenuGeneratorsArena {
@ -19,28 +18,32 @@ public class MenuGeneratorsArena {
int screenTop = 150;
//label (address)
Label usernameLabel = new Label(100,screenTop + 50,1.0f);
Label usernameLabel = new Label(1.0f);
usernameLabel.setText("Username");
rVal.addChild(usernameLabel);
//text entry (address)
TextInput usernameInput = new TextInput(100,screenTop + 125,1.0f);
usernameInput.setText("");
usernameInput.setMinWidth(200);
usernameInput.setMaxWidth(200);
rVal.addChild(usernameInput);
//label (port)
Label passwordLabel = new Label(100,screenTop + 200,1.0f);
Label passwordLabel = new Label(1.0f);
passwordLabel.setText("Password");
rVal.addChild(passwordLabel);
//text entry (port)
TextInput passwordInput = new TextInput(100,screenTop + 275,1.0f);
passwordInput.setText("");
passwordInput.setMinWidth(200);
passwordInput.setMaxWidth(200);
rVal.addChild(passwordInput);
//button (connect)
Button connectButton = new Button();
Label connectLabel = new Label(100,screenTop + 350,1.0f);
Label connectLabel = new Label(1.0f);
connectLabel.setText("Login");
connectButton.addChild(connectLabel);
rVal.addChild(connectButton);

View File

@ -25,10 +25,10 @@ public class MenuGeneratorsDebug {
static final int X_OFFSET = 1000;
public static Window createTopLevelDebugMenu(){
Window rVal = new Window(X_OFFSET,100,800,800);
Window rVal = new Window(X_OFFSET,100,800,800,true);
//label (title)
Label titleLabel = new Label(100,50,1.0f);
Label titleLabel = new Label(1.0f);
titleLabel.setText("DEBUG");
rVal.addChild(titleLabel);
@ -73,7 +73,7 @@ public class MenuGeneratorsDebug {
}
static int recursivelyAppendElementTree(List<Element> toAddList, int verticalOffset, int horizontalOffset, Element child){
Label currentWindowLabel = new Label(100 + horizontalOffset * 25,100 + verticalOffset * 50,0.5f);
Label currentWindowLabel = new Label(0.5f);
currentWindowLabel.setText(child.toString());
toAddList.add(currentWindowLabel);
if(child instanceof ContainerElement){

View File

@ -2,17 +2,19 @@ package electrosphere.menu.mainmenu;
import java.util.List;
import org.lwjgl.util.yoga.Yoga;
import electrosphere.engine.Globals;
import electrosphere.engine.loadingthreads.LoadingThread;
import electrosphere.menu.MenuGenerators;
import electrosphere.menu.WindowUtils;
import electrosphere.renderer.ui.elements.Button;
import electrosphere.renderer.ui.elements.Div;
import electrosphere.renderer.ui.elements.FormElement;
import electrosphere.renderer.ui.elements.Label;
import electrosphere.renderer.ui.elements.TextInput;
import electrosphere.renderer.ui.elementtypes.ClickableElement;
import electrosphere.renderer.ui.elementtypes.Element;
import electrosphere.renderer.ui.events.ClickEvent;
import electrosphere.renderer.ui.form.FormElement;
import electrosphere.server.saves.SaveUtils;
/**
@ -26,17 +28,16 @@ public class MenuGeneratorsLevelEditor {
*/
public static Element createLevelEditorTopMenu(){
FormElement rVal = new FormElement();
int screenTop = 150;
//label (address)
Label usernameLabel = new Label(100,screenTop + 50,1.0f);
Label usernameLabel = new Label(1.0f);
usernameLabel.setText("Select Level");
rVal.addChild(usernameLabel);
//button (back)
{
Button backButton = new Button();
Label backLabel = new Label(100,screenTop + 150,1.0f);
Label backLabel = new Label(1.0f);
backLabel.setText("Back");
backButton.addChild(backLabel);
rVal.addChild(backButton);
@ -49,7 +50,7 @@ public class MenuGeneratorsLevelEditor {
//button (create level)
{
Button createLevelButton = new Button();
Label createLevelLabel = new Label(100,screenTop + 225,1.0f);
Label createLevelLabel = new Label(1.0f);
createLevelLabel.setText("Create Level");
createLevelButton.addChild(createLevelLabel);
rVal.addChild(createLevelButton);
@ -62,29 +63,31 @@ public class MenuGeneratorsLevelEditor {
//the buttons to load existing levels
List<String> saveNames = SaveUtils.getSaves();
int i = 0;
for(String saveName : saveNames){
i++;
//containing div
Div div = new Div();
div.setFlexDirection(Yoga.YGFlexDirectionRow);
div.setMaxHeight(30);
//delete level button
Button deleteButton = new Button();
Label deleteLabel = new Label(100,screenTop + 225 + 75 * i,1.0f);
deleteLabel.setText("[X]");
Label deleteLabel = new Label(1.0f);
deleteLabel.setText(" X ");
deleteButton.addChild(deleteLabel);
rVal.addChild(deleteButton);
deleteButton.setMarginRight(10);
deleteButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){
SaveUtils.deleteSave(saveName);
WindowUtils.replaceMainMenuContents(MenuGeneratorsLevelEditor.createLevelEditorTopMenu());
return false;
}});
div.addChild(deleteButton);
//button (launch level)
Button launchButton = new Button();
Label launchLabel = new Label(200,screenTop + 225 + 75 * i,1.0f);
Label launchLabel = new Label(1.0f);
launchLabel.setText(saveName);
launchButton.addChild(launchLabel);
rVal.addChild(launchButton);
launchButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){
//launch level
Globals.currentSaveName = saveName;
@ -95,6 +98,9 @@ public class MenuGeneratorsLevelEditor {
loadingThread.start();
return false;
}});
div.addChild(launchButton);
rVal.addChild(div);
}
return rVal;
@ -110,14 +116,14 @@ public class MenuGeneratorsLevelEditor {
int screenTop = 150;
//label (address)
Label usernameLabel = new Label(100,screenTop + 50,1.0f);
Label usernameLabel = new Label(1.0f);
usernameLabel.setText("Create Level");
rVal.addChild(usernameLabel);
//button (back)
{
Button backButton = new Button();
Label backLabel = new Label(100,screenTop + 150,1.0f);
Label backLabel = new Label(1.0f);
backLabel.setText("Back");
backButton.addChild(backLabel);
rVal.addChild(backButton);
@ -129,7 +135,7 @@ public class MenuGeneratorsLevelEditor {
//label for text input for level name
{
Label levelNameLabel = new Label(100,screenTop + 225,1.0f);
Label levelNameLabel = new Label(1.0f);
levelNameLabel.setText("Level Name:");
rVal.addChild(levelNameLabel);
}
@ -140,6 +146,7 @@ public class MenuGeneratorsLevelEditor {
String defaultSaveName = "defaultLevel_" + i;
while(saveNames.contains(defaultSaveName)){
i++;
defaultSaveName = "defaultLevel_" + i;
}
//get level name
@ -150,7 +157,7 @@ public class MenuGeneratorsLevelEditor {
//button (create level)
{
Button createLevelButton = new Button();
Label createLevelLabel = new Label(100,screenTop + 375,1.0f);
Label createLevelLabel = new Label(1.0f);
createLevelLabel.setText("Create Level");
createLevelButton.addChild(createLevelLabel);
rVal.addChild(createLevelButton);

View File

@ -3,8 +3,8 @@ package electrosphere.menu.mainmenu;
import java.util.LinkedList;
import java.util.List;
import org.joml.Quaternionf;
import org.joml.Vector3f;
import org.lwjgl.util.yoga.Yoga;
import electrosphere.engine.Globals;
import electrosphere.entity.types.camera.CameraEntityUtils;
@ -15,16 +15,14 @@ import electrosphere.game.data.creature.type.visualattribute.VisualAttribute;
import electrosphere.menu.MenuGenerators;
import electrosphere.menu.WindowUtils;
import electrosphere.net.parser.net.message.CharacterMessage;
import electrosphere.renderer.RenderingEngine;
import electrosphere.renderer.actor.Actor;
import electrosphere.renderer.actor.ActorStaticMorph;
import electrosphere.renderer.actor.ActorUtils;
import electrosphere.renderer.actor.ActorStaticMorph.StaticMorphTransforms;
import electrosphere.renderer.anim.Animation;
import electrosphere.renderer.model.Model;
import electrosphere.renderer.ui.elements.ActorPanel;
import electrosphere.renderer.ui.elements.Button;
import electrosphere.renderer.ui.elements.ImagePanel;
import electrosphere.renderer.ui.elements.Div;
import electrosphere.renderer.ui.elements.FormElement;
import electrosphere.renderer.ui.elements.Label;
import electrosphere.renderer.ui.elements.ScrollableContainer;
import electrosphere.renderer.ui.elements.Slider;
@ -34,19 +32,16 @@ import electrosphere.renderer.ui.elementtypes.Element;
import electrosphere.renderer.ui.elementtypes.ValueElement.ValueChangeEventCallback;
import electrosphere.renderer.ui.events.ClickEvent;
import electrosphere.renderer.ui.events.ValueChangeEvent;
import electrosphere.renderer.ui.form.FormElement;
import electrosphere.util.Utilities;
public class MenuGeneratorsMultiplayer {
public static Element createMultiplayerCharacterSelectionWindow(){
FormElement rVal = new FormElement();
// int screenTop = Globals.WINDOW_HEIGHT - 150;
int verticalPosition = 125;
//button (create)
Button createButton = new Button();
Label createLabel = new Label(100,125 + verticalPosition + 200,1.0f);
Label createLabel = new Label(1.0f);
createLabel.setText("Create Character");
createButton.addChild(createLabel);
rVal.addChild(createButton);
@ -61,8 +56,6 @@ public class MenuGeneratorsMultiplayer {
static String selectedRace = "";
public static Element createMultiplayerCharacterCreationWindow(){
FormElement rVal = new FormElement();
// int screenTop = Globals.WINDOW_HEIGHT - 150;
int verticalPosition = 125;
//select race
StringCarousel raceCarousel = new StringCarousel(100, 125, 1.0f);
@ -76,7 +69,7 @@ public class MenuGeneratorsMultiplayer {
//button (create)
Button createButton = new Button();
Label createLabel = new Label(100,275,1.0f);
Label createLabel = new Label(1.0f);
createLabel.setText("Select Race");
createButton.addChild(createLabel);
rVal.addChild(createButton);
@ -121,7 +114,7 @@ public class MenuGeneratorsMultiplayer {
for(VisualAttribute attribute : selectedRaceType.getVisualAttributes()){
if(attribute.getType().equals(VisualAttribute.TYPE_BONE)){
//add label for slider
Label sliderName = new Label(20, verticalPosition, 0.6f);
Label sliderName = new Label(0.6f);
sliderName.setText(attribute.getAttributeId());
controlsToAdd.add(sliderName);
//add a slider
@ -155,7 +148,7 @@ public class MenuGeneratorsMultiplayer {
}});
} else if(attribute.getType().equals(VisualAttribute.TYPE_REMESH)){
//add label for carousel
Label sliderName = new Label(20, verticalPosition, 0.6f);
Label sliderName = new Label(0.6f);
sliderName.setText(attribute.getAttributeId());
controlsToAdd.add(sliderName);
//for adding the value to the creature template
@ -198,7 +191,7 @@ public class MenuGeneratorsMultiplayer {
//add button to actually create the character
Button createCharacterButton = new Button();
Label createCharacterLabel = new Label(horizontalPosition,verticalPosition,1.0f);
Label createCharacterLabel = new Label(1.0f);
createCharacterLabel.setText("Create");
createCharacterButton.addChild(createCharacterLabel);
controlsToAdd.add(createCharacterButton);
@ -210,13 +203,18 @@ public class MenuGeneratorsMultiplayer {
int width = 1800;
int height = verticalPosition + 300;
Div rVal = new Div();
rVal.setFlexDirection(Yoga.YGFlexDirectionRow);
ScrollableContainer scrollable = new ScrollableContainer(0, 0, width, height);
for(Element newControl : controlsToAdd){
scrollable.addChild(newControl);
}
scrollable.addChild(actorPanel);
rVal.addChild(scrollable);
rVal.addChild(actorPanel);
// rVal.addChild(scrollable);
// Label testLabel = new Label(100,215,1.0f);
@ -227,7 +225,7 @@ public class MenuGeneratorsMultiplayer {
// ImagePanel imagePanel = new ImagePanel(0,0,width,height + 1000,Globals.blackTexture);
// scrollable.addChild(imagePanel);
return scrollable;
return rVal;
}

View File

@ -1,28 +1,35 @@
package electrosphere.menu.mainmenu;
import org.lwjgl.util.yoga.Yoga;
import electrosphere.engine.Globals;
import electrosphere.engine.loadingthreads.LoadingThread;
import electrosphere.menu.MenuGenerators;
import electrosphere.menu.WindowUtils;
import electrosphere.renderer.ui.elements.Button;
import electrosphere.renderer.ui.elements.FormElement;
import electrosphere.renderer.ui.elements.Label;
import electrosphere.renderer.ui.elementtypes.ClickableElement;
import electrosphere.renderer.ui.elementtypes.Element;
import electrosphere.renderer.ui.events.ClickEvent;
import electrosphere.renderer.ui.form.FormElement;
public class MenuGeneratorsTitleMenu {
public static Element createTitleMenu(){
FormElement rVal = new FormElement();
//top-bottom
rVal.setJustifyContent(Yoga.YGJustifyCenter);
//left-right
rVal.setAlignItems(Yoga.YGAlignCenter);
rVal.setAlignContent(Yoga.YGAlignFlexStart);
//label (title)
Label titleLabel = new Label(100,150,1.0f);
Label titleLabel = new Label(1.0f);
titleLabel.setText("ORPG");
rVal.addChild(titleLabel);
//button (multiplayer)
Button singleplayerButton = new Button();
Label singleplayerLabel = new Label(100,275,1.0f);
Label singleplayerLabel = new Label(1.0f);
singleplayerLabel.setText("Singleplayer");
singleplayerButton.addChild(singleplayerLabel);
rVal.addChild(singleplayerButton);
@ -38,7 +45,7 @@ public class MenuGeneratorsTitleMenu {
//button (multiplayer)
Button multiplayerButton = new Button();
Label multiplayerLabel = new Label(100,350,1.0f);
Label multiplayerLabel = new Label(1.0f);
multiplayerLabel.setText("Multiplayer");
multiplayerButton.addChild(multiplayerLabel);
rVal.addChild(multiplayerButton);
@ -49,7 +56,7 @@ public class MenuGeneratorsTitleMenu {
//button (arena)
Button arenaButton = new Button();
Label arenaLabel = new Label(100,425,1.0f);
Label arenaLabel = new Label(1.0f);
arenaLabel.setText("Arena");
arenaButton.addChild(arenaLabel);
rVal.addChild(arenaButton);
@ -65,7 +72,7 @@ public class MenuGeneratorsTitleMenu {
//button (static level)
Button staticLevelButton = new Button();
Label staticLevelLabel = new Label(100,500,1.0f);
Label staticLevelLabel = new Label(1.0f);
staticLevelLabel.setText("Level Editor");
staticLevelButton.addChild(staticLevelLabel);
rVal.addChild(staticLevelButton);
@ -76,7 +83,7 @@ public class MenuGeneratorsTitleMenu {
//button (options)
Button optionsButton = new Button();
Label optionsLabel = new Label(100,575,1.0f);
Label optionsLabel = new Label(1.0f);
optionsLabel.setText("Options");
optionsButton.addChild(optionsLabel);
rVal.addChild(optionsButton);
@ -87,7 +94,7 @@ public class MenuGeneratorsTitleMenu {
//button (sp debug)
Button uiDebugSPQuickstartButton = new Button();
Label uiDebugSPQuickstartLabel = new Label(100,650,1.0f);
Label uiDebugSPQuickstartLabel = new Label(1.0f);
uiDebugSPQuickstartLabel.setText("Debug SP Quickstart");
uiDebugSPQuickstartButton.addChild(uiDebugSPQuickstartLabel);
rVal.addChild(uiDebugSPQuickstartButton);
@ -102,12 +109,12 @@ public class MenuGeneratorsTitleMenu {
//button (ui testing)
Button uiTestingButton = new Button();
Label uiTestingLabel = new Label(100,725,1.0f);
Label uiTestingLabel = new Label(1.0f);
uiTestingLabel.setText("UI Testing");
uiTestingButton.addChild(uiTestingLabel);
rVal.addChild(uiTestingButton);
uiTestingButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){
WindowUtils.replaceMainMenuContents(MenuGenerators.createUITestMenu());
WindowUtils.replaceMainMenuContents(MenuGeneratorsUITesting.createUITestMenu());
return false;
}});

View File

@ -0,0 +1,68 @@
package electrosphere.menu.mainmenu;
import org.joml.Vector3f;
import electrosphere.engine.Globals;
import electrosphere.entity.types.camera.CameraEntityUtils;
import electrosphere.menu.WindowUtils;
import electrosphere.renderer.actor.ActorUtils;
import electrosphere.renderer.ui.elements.ActorPanel;
import electrosphere.renderer.ui.elements.Button;
import electrosphere.renderer.ui.elements.FormElement;
import electrosphere.renderer.ui.elements.Label;
import electrosphere.renderer.ui.elements.Slider;
import electrosphere.renderer.ui.elements.VirtualScrollable;
import electrosphere.renderer.ui.elementtypes.ClickableElement;
import electrosphere.renderer.ui.elementtypes.Element;
import electrosphere.renderer.ui.events.ClickEvent;
/**
* Menu generators for creating test visualizations for ui elements
*/
public class MenuGeneratorsUITesting {
/**
* Title menu ui testing window
* @return
*/
public static Element createUITestMenu(){
FormElement rVal = new FormElement();
//button (back)
Button backButton = new Button();
Label backLabel = new Label(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);
//
//Virtual scrollable test
VirtualScrollable virtualScrollable = new VirtualScrollable(300, 75);
//add a ton of children
for(int i = 0; i < 10; i++){
Button testButton = new Button();
Label testLabel = new Label(1.0f);
testLabel.setText("Test button " + i);
testButton.addChild(testLabel);
virtualScrollable.addChild(testButton);
}
rVal.addChild(virtualScrollable);
return rVal;
}
}

View File

@ -69,6 +69,8 @@ public class Server implements Runnable{
ServerConnectionHandler newClient = new ServerConnectionHandler(newSocket);
clientMap.put(newSocket.getInetAddress().getHostAddress(), newClient);
new Thread(newClient).start();
} catch (SocketException ex){
LoggerInterface.loggerNetworking.ERROR("Socket closed!",ex);
} catch (IOException ex) {
LoggerInterface.loggerNetworking.ERROR("Socket error on client socket!",ex);
}

View File

@ -306,13 +306,12 @@ public class RenderingEngine {
Globals.WINDOW_HEIGHT = bufferHeight;
//
// Attack controls callbacks
// Attach controls callbacks
//
//set key callback
GLFW.glfwSetKeyCallback(Globals.window, Globals.controlCallback);
//set mouse callback
GLFW.glfwSetMouseButtonCallback(Globals.window, Globals.mouseCallback);
GLFW.glfwSetScrollCallback(Globals.window, Globals.scrollCallback);
//get title bar dimensions
// setTitleBarDimensions();

View File

@ -34,11 +34,22 @@ public class DebugRendering {
public static void drawUIBoundsWireframe(){
glDisable(GL_DEPTH_TEST);
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
int parentPosX = 0;
int parentPosY = 0;
for(Element currentElement : Globals.elementManager.getWindowList()){
if(currentElement instanceof DrawableElement){
DrawableElement drawable = (DrawableElement) currentElement;
if(drawable.getVisible()){
drawable.draw(Globals.renderingEngine.getRenderPipelineState(),Globals.renderingEngine.getOpenGLState(),RenderingEngine.GL_DEFAULT_FRAMEBUFFER, Globals.WINDOW_WIDTH, Globals.WINDOW_HEIGHT);
drawable.draw(
Globals.renderingEngine.getRenderPipelineState(),
Globals.renderingEngine.getOpenGLState(),
RenderingEngine.GL_DEFAULT_FRAMEBUFFER,
parentPosX,
parentPosY,
Globals.WINDOW_WIDTH,
Globals.WINDOW_HEIGHT
);
}
}
}

View File

@ -7,6 +7,7 @@ import electrosphere.renderer.OpenGLState;
import electrosphere.renderer.RenderPipelineState;
import electrosphere.renderer.RenderingEngine;
import electrosphere.renderer.texture.Texture;
import electrosphere.renderer.ui.Window;
import electrosphere.renderer.ui.elementtypes.DrawableElement;
import electrosphere.renderer.ui.elementtypes.Element;
@ -63,12 +64,16 @@ public class UIPipeline implements RenderPipeline {
renderPipelineState.setUseBones(false);
renderPipelineState.setUseLight(false);
//the initial parent position values
int parentPosX = 0;
int parentPosY = 0;
openGLState.glDepthTest(false);
for(Element currentElement : Globals.elementManager.getWindowList()){
if(currentElement instanceof DrawableElement){
DrawableElement drawable = (DrawableElement) currentElement;
if(drawable.getVisible()){
drawable.draw(renderPipelineState, openGLState, RenderingEngine.GL_DEFAULT_FRAMEBUFFER, Globals.WINDOW_WIDTH, Globals.WINDOW_HEIGHT);
drawable.draw(renderPipelineState, openGLState, RenderingEngine.GL_DEFAULT_FRAMEBUFFER, parentPosX, parentPosY, Globals.WINDOW_WIDTH, Globals.WINDOW_HEIGHT);
}
}
}

View File

@ -1,6 +1,5 @@
package electrosphere.renderer.ui;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;
@ -19,7 +18,6 @@ import electrosphere.renderer.ui.events.DragEvent;
import electrosphere.renderer.ui.events.Event;
import electrosphere.renderer.ui.events.FocusEvent;
import electrosphere.renderer.ui.events.HoverEvent;
import electrosphere.renderer.ui.events.MouseEvent;
import electrosphere.renderer.ui.events.NavigationEvent;
import electrosphere.renderer.ui.events.DragEvent.DragEventType;
import electrosphere.renderer.ui.events.NavigationEvent.NavigationEventType;
@ -52,6 +50,10 @@ public class ElementManager {
return elementMap.get(name);
}
/**
* Gets the list of all registered windows
* @return The list of all registered windows
*/
public List<Element> getWindowList(){
return elementList;
}
@ -137,6 +139,24 @@ public class ElementManager {
}
}
/**
* Sets a specific element to be focused
* @param focusableElement The focusable element
*/
public void focusElement(FocusableElement focusableElement){
if(currentFocusedElement != null){
currentFocusedElement.handleEvent(new FocusEvent(false));
}
this.currentFocusedElement = focusableElement;
focusableElement.handleEvent(new FocusEvent(true));
}
/**
* Fires an event at a given position
* @param event The event
* @param x the x coordinate of the position
* @param y the y coordinate of the position
*/
public void fireEvent(Event event, int x, int y){
boolean propagate = true;
ListIterator<Element> windowIterator = elementList.listIterator(elementList.size());
@ -149,18 +169,32 @@ public class ElementManager {
propagate = currentElement.handleEvent(event);
}
if(!propagate){
currentWindow.applyYoga();
break;
}
}
}
/**
* Recursively uilds a stack of elements at a given position based on their depth into the tree
* @param inputStack The empty stack to fill
* @param current The current element
* @param x the x position to query
* @param y the y position to query
* @param offsetX the x offset accumulated
* @param offsetY the y offset accumulated
* @return the stack, filled with all relevant elements
*/
Stack<Element> buildElementPositionalStack(Stack<Element> inputStack, Element current, int x, int y, int offsetX, int offsetY){
inputStack.push(current);
if(current instanceof ContainerElement){
ContainerElement container = (ContainerElement)current;
int xLoc = x - container.getInternalX() - container.getChildOffsetX();
int yLoc = y - container.getInternalY() - container.getChildOffsetY();
for(Element el : ((ContainerElement)current).getChildren()){
//if contains x,y, call function on el
if(elementContainsPoint(el,x,y)){
buildElementPositionalStack(inputStack, el, x, y, offsetX + el.getPositionX(), offsetY + el.getPositionY());
if(elementContainsPoint(el,xLoc,yLoc,offsetX,offsetY)){
buildElementPositionalStack(inputStack, el, xLoc, yLoc, offsetX, offsetY);
}
}
}
@ -212,12 +246,12 @@ public class ElementManager {
* @param y the y component of the coordinate
* @return True if it contains that point, false otherwise
*/
boolean elementContainsPoint(Element el, int x, int y){
boolean elementContainsPoint(Element el, int x, int y, int offsetX, int offsetY){
return
x >= el.getPositionX() &&
x <= el.getPositionX() + el.getWidth() &&
y >= el.getPositionY() &&
y <= el.getPositionY() + el.getHeight();
x >= el.getInternalX() + offsetX &&
x <= el.getInternalX() + offsetX + el.getInternalWidth() &&
y >= el.getInternalY() + offsetY &&
y <= el.getInternalY() + offsetY + el.getInternalHeight();
}
// public void click(MouseEvent event){

View File

@ -124,7 +124,7 @@ public class WidgetUtils {
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(x,y,width,height,true);
// Window rVal = new Window(100,100,100,100);
// System.out.println(x + " " + y + " " + width + " " + height);
// LayoutSchemeListScrollable rVal = new LayoutSchemeListScrollable(x, y, width, height, true);
@ -133,13 +133,13 @@ public class WidgetUtils {
// Widget rVal = WidgetUtils.createTextBox(x, y, width, height, 4, 1, "MENU", true);
//the actual "menu" label
Label menuLabel = new Label(0,0,0.3f);
Label menuLabel = new Label(0.3f);
menuLabel.setText("Menu");
menuLabel.setVisible(true);
rVal.addChild(menuLabel);
//label telling player what key they have their menu bound to
Label keyCodeLabel = new Label(0,10,0.3f);
Label keyCodeLabel = new Label(0.3f);
keyCodeLabel.setText(ControlHandler.convertKeycodeToName(Globals.controlHandler.getControl(ControlHandler.DATA_STRING_INPUT_CODE_IN_GAME_MAIN_MENU).getKeyValue()));
keyCodeLabel.setVisible(true);
rVal.addChild(keyCodeLabel);
@ -152,7 +152,9 @@ public class WidgetUtils {
public static Button createLabelButton(String label, int posX, int posY, float fontSize, ClickableElement.ClickEventCallback callback){
Button rVal = new Button();
Label buttonLabel = new Label(posX,posY,fontSize);
Label buttonLabel = new Label(fontSize);
rVal.setPositionX(posX);
rVal.setPositionY(posY);
buttonLabel.setText(label);
rVal.addChild(buttonLabel);
rVal.setOnClick(callback);

View File

@ -11,6 +11,9 @@ import java.util.LinkedList;
import java.util.List;
import org.joml.Vector3f;
import org.lwjgl.util.yoga.YGLayout;
import org.lwjgl.util.yoga.YGNode;
import org.lwjgl.util.yoga.Yoga;
import electrosphere.engine.Globals;
import electrosphere.logger.LoggerInterface;
@ -21,6 +24,7 @@ import electrosphere.renderer.framebuffer.Framebuffer;
import electrosphere.renderer.framebuffer.FramebufferUtils;
import electrosphere.renderer.model.Material;
import electrosphere.renderer.model.Model;
import electrosphere.renderer.texture.Texture;
import electrosphere.renderer.ui.elementtypes.ContainerElement;
import electrosphere.renderer.ui.elementtypes.DrawableElement;
import electrosphere.renderer.ui.elementtypes.Element;
@ -29,8 +33,7 @@ import electrosphere.renderer.ui.events.Event;
import electrosphere.renderer.ui.events.NavigationEvent;
/**
*
* @author amaterasu
* A window
*/
public class Window implements DrawableElement, ContainerElement, NavigableElement {
List<Element> childList = new LinkedList<Element>();
@ -46,24 +49,43 @@ public class Window implements DrawableElement, ContainerElement, NavigableEleme
static final Vector3f windowDrawDebugColor = new Vector3f(1.0f,0.0f,0.0f);
public Window(int positionX, int positionY, int width, int height){
//TODO: figure out why this has to be 1920x1080
//controls whether to show window decorations (ie the frame)
boolean showDecorations = true;
/**
* Constructor
* @param showDecorations
* @param positionX
* @param positionY
* @param width
* @param height
*/
public Window(int positionX, int positionY, int width, int height, boolean showDecorations){
widgetBuffer = FramebufferUtils.generateTextureFramebuffer(width, height);
// widgetBuffer = FramebufferUtils.generateScreensizeTextureFramebuffer();
customMat.setTexturePointer(widgetBuffer.getTexturePointer());
// customMat.setTexturePointer(Globals.assetManager.fetchTexture("Textures/Testing1.png").getTexturePointer());
float ndcWidth = (float)width/Globals.WINDOW_WIDTH;
float ndcHeight = (float)height/Globals.WINDOW_HEIGHT;
float ndcX = (float)positionX/Globals.WINDOW_WIDTH;
float ndcY = (float)positionY/Globals.WINDOW_HEIGHT;
this.width = width;
this.height = height;
boxPosition = new Vector3f(ndcX,ndcY,0);
boxDimensions = new Vector3f(ndcWidth,ndcHeight,0);
this.showDecorations = showDecorations;
this.yogaNode = Yoga.YGNodeNew();
this.layout = YGNode.create(this.yogaNode).layout();
this.setWidth(width);
this.setHeight(height);
}
@Override
public void draw(RenderPipelineState renderPipelineState, OpenGLState openGLState, int parentFramebufferPointer, int parentWidth, int parentHeight) {
public void draw(
RenderPipelineState renderPipelineState,
OpenGLState openGLState,
int parentFramebufferPointer,
int parentPosX,
int parentPosY,
int parentWidth,
int parentHeight
) {
widgetBuffer.bind();
openGLState.glViewport(width, height);
@ -71,10 +93,14 @@ public class Window implements DrawableElement, ContainerElement, NavigableEleme
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//grab assets required to render window
Model planeModel = Globals.assetManager.fetchModel(Globals.imagePlaneModelID);
Texture windowFrame = Globals.assetManager.fetchTexture("Textures/ui/uiFrame1.png");
for(Element child : childList){
if(child instanceof DrawableElement){
DrawableElement drawableChild = (DrawableElement) child;
drawableChild.draw(renderPipelineState,openGLState,widgetBuffer.getFramebufferPointer(),width,height);
drawableChild.draw(renderPipelineState,openGLState,widgetBuffer.getFramebufferPointer(),parentPosX,parentPosY,width,height);
}
}
//this call binds the screen as the "texture" we're rendering to
@ -82,16 +108,31 @@ public class Window implements DrawableElement, ContainerElement, NavigableEleme
glBindFramebuffer(GL_FRAMEBUFFER, parentFramebufferPointer);
openGLState.glViewport(parentWidth, parentHeight);
Model planeModel = Globals.assetManager.fetchModel(Globals.imagePlaneModelID);
//error if assets are null
if(planeModel == null || windowFrame == null){
LoggerInterface.loggerRenderer.ERROR("Window unable to find plane model or window frame!!", new Exception());
}
//render background of window
if(planeModel != null && windowFrame != null && showDecorations){
planeModel.pushUniformToMesh("plane", "mPosition", boxPosition);
planeModel.pushUniformToMesh("plane", "mDimension", boxDimensions);
planeModel.pushUniformToMesh("plane", "tPosition", texPosition);
planeModel.pushUniformToMesh("plane", "tDimension", texScale);
customMat.setTexturePointer(windowFrame.getTexturePointer());
planeModel.getMeshes().get(0).setMaterial(customMat);
planeModel.drawUI();
}
//render content of window
if(planeModel != null){
planeModel.pushUniformToMesh("plane", "mPosition", boxPosition);
planeModel.pushUniformToMesh("plane", "mDimension", boxDimensions);
planeModel.pushUniformToMesh("plane", "tPosition", texPosition);
planeModel.pushUniformToMesh("plane", "tDimension", texScale);
customMat.setTexturePointer(widgetBuffer.getTexturePointer());
planeModel.getMeshes().get(0).setMaterial(customMat);
planeModel.drawUI();
} else {
LoggerInterface.loggerRenderer.ERROR("Window unable to find plane model!!", new Exception());
}
if(Globals.RENDER_FLAG_RENDER_UI_BOUNDS && DebugRendering.RENDER_DEBUG_OUTLINE_WINDOW){
@ -99,13 +140,30 @@ public class Window implements DrawableElement, ContainerElement, NavigableEleme
}
}
public void pack() {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
/**
* Destroys the element
*/
public void destroy(){
for(Element el : getChildren()){
el.destroy();
}
}
/**
* clears all children
*/
public void clear(){
for(Element el : getChildren()){
Yoga.YGNodeRemoveChild(this.yogaNode,el.getYogaNode());
el.destroy();
}
getChildren().clear();
}
@Override
public void setWidth(int width){
this.width = width;
Yoga.YGNodeStyleSetWidth(this.yogaNode, width);
for(Element child : childList){
if(child instanceof DrawableElement){
DrawableElement drawableChild = (DrawableElement) child;
@ -118,6 +176,7 @@ public class Window implements DrawableElement, ContainerElement, NavigableEleme
@Override
public void setHeight(int height){
this.height = height;
Yoga.YGNodeStyleSetHeight(this.yogaNode, height);
for(Element child : childList){
if(child instanceof DrawableElement){
DrawableElement drawableChild = (DrawableElement) child;
@ -127,6 +186,26 @@ public class Window implements DrawableElement, ContainerElement, NavigableEleme
}
}
@Override
public void setMaxWidth(int width) {
Yoga.YGNodeStyleSetMaxWidth(yogaNode, width);
}
@Override
public void setMaxHeight(int height) {
Yoga.YGNodeStyleSetMaxHeight(yogaNode, height);
}
@Override
public void setMinWidth(int width) {
Yoga.YGNodeStyleSetMinWidth(yogaNode, width);
}
@Override
public void setMinHeight(int height) {
Yoga.YGNodeStyleSetMinHeight(yogaNode, height);
}
// public void setTextureCoord(int x, int y){
// float ndcX = (float)x/Globals.WINDOW_WIDTH;
// float ndcY = (float)y/Globals.WINDOW_HEIGHT;
@ -148,6 +227,11 @@ public class Window implements DrawableElement, ContainerElement, NavigableEleme
public int parentWidth = 1;
public int parentHeight = 1;
int marginTop = 0;
int marginRight = 0;
int marginBottom = 0;
int marginLeft = 0;
public boolean visible = false;
public int getWidth() {
@ -184,6 +268,38 @@ public class Window implements DrawableElement, ContainerElement, NavigableEleme
this.positionY = positionY;
}
public int getMarginTop(){
return marginTop;
}
public int getMarginRight(){
return marginRight;
}
public int getMarginBottom(){
return marginBottom;
}
public int getMarginLeft(){
return marginLeft;
}
public void setMarginTop(int marginTop){
this.marginTop = marginTop;
}
public void setMarginRight(int marginRight){
this.marginRight = marginRight;
}
public void setMarginBottom(int marginBottom){
this.marginBottom = marginBottom;
}
public void setMarginLeft(int marginLeft){
this.marginLeft = marginLeft;
}
@Override
public void setParentWidth(int width) {
this.width = width;
@ -194,6 +310,62 @@ public class Window implements DrawableElement, ContainerElement, NavigableEleme
this.height = height;
}
//the yoga node id
long yogaNode = -1;
//the layout object
YGLayout layout;
@Override
public long getYogaNode() {
return yogaNode;
}
@Override
public void applyYoga() {
//calculate yoga layout
Yoga.YGNodeCalculateLayout(yogaNode, width, height, Yoga.YGFlexDirectionColumn);
//apply yoga values to all children
LoggerInterface.loggerUI.INFO("==Apply yoga to windoow==");
for(Element child : this.getChildren()){
child.applyYoga();
}
// //get the values from yoga
// float leftRaw = layout.positions(Yoga.YGEdgeLeft);
// float topRaw = layout.positions(Yoga.YGEdgeTop);
// float widthRaw = layout.dimensions(Yoga.YGDimensionWidth);
// float heightRaw = layout.dimensions(Yoga.YGDimensionHeight);
// //apply the values to this component
// this.setPositionX((int)leftRaw + this.getMarginLeft());
// this.setPositionY((int)topRaw + this.getMarginTop());
// this.setWidth((int)widthRaw - this.getMarginLeft() - this.getMarginRight());
// this.setHeight((int)heightRaw - this.getMarginTop() - this.getMarginBottom());
}
@Override
public void setDirection(int layout) {
Yoga.YGNodeStyleSetDirection(yogaNode, Yoga.YGFlexDirectionColumn);
}
@Override
public void setFlexDirection(int layout){
Yoga.YGNodeStyleSetFlexDirection(yogaNode, layout);
}
@Override
public void setJustifyContent(int justification){
Yoga.YGNodeStyleSetJustifyContent(this.yogaNode, justification);
}
@Override
public void setAlignItems(int alignment){
Yoga.YGNodeStyleSetAlignItems(this.yogaNode, alignment);
}
@Override
public void setAlignContent(int alignment){
Yoga.YGNodeStyleSetAlignContent(this.yogaNode, alignment);
}
@Override
public void addChild(Element child) {
childList.add(child);
@ -202,6 +374,7 @@ public class Window implements DrawableElement, ContainerElement, NavigableEleme
drawableChild.setParentWidth(width);
drawableChild.setParentHeight(height);
drawableChild.setVisible(false);
Yoga.YGNodeInsertChild(yogaNode, drawableChild.getYogaNode(), childList.size() - 1);
}
}
@ -213,6 +386,7 @@ public class Window implements DrawableElement, ContainerElement, NavigableEleme
@Override
public void removeChild(Element child) {
childList.remove(child);
Yoga.YGNodeRemoveChild(yogaNode, child.getYogaNode());
}
public boolean handleEvent(Event event){
@ -230,4 +404,44 @@ public class Window implements DrawableElement, ContainerElement, NavigableEleme
navCallback = callback;
}
@Override
public int getInternalX() {
return positionX;
}
@Override
public int getInternalY() {
return positionY;
}
@Override
public int getInternalWidth() {
return width;
}
@Override
public int getInternalHeight() {
return height;
}
@Override
public int getChildOffsetX(){
return 0;
}
@Override
public int getChildOffsetY(){
return 0;
}
@Override
public float getChildScaleX(){
return 1;
}
@Override
public float getChildScaleY(){
return 1;
}
}

View File

@ -2,20 +2,14 @@ package electrosphere.renderer.ui.elements;
import static org.lwjgl.opengl.GL11.GL_COLOR_BUFFER_BIT;
import static org.lwjgl.opengl.GL11.GL_DEPTH_BUFFER_BIT;
import static org.lwjgl.opengl.GL11.GL_DEPTH_TEST;
import static org.lwjgl.opengl.GL11.GL_LESS;
import static org.lwjgl.opengl.GL11.glClear;
import static org.lwjgl.opengl.GL11.glClearColor;
import static org.lwjgl.opengl.GL11.glDepthFunc;
import static org.lwjgl.opengl.GL11.glDepthMask;
import static org.lwjgl.opengl.GL11.glDisable;
import static org.lwjgl.opengl.GL11.glEnable;
import static org.lwjgl.opengl.GL11.glViewport;
import static org.lwjgl.opengl.GL30.GL_FRAMEBUFFER;
import static org.lwjgl.opengl.GL30.glBindFramebuffer;
import org.joml.Matrix4d;
import org.joml.Matrix4f;
import org.joml.Quaterniond;
import org.joml.Vector3d;
import org.joml.Vector3f;
@ -37,7 +31,7 @@ import electrosphere.renderer.ui.events.DragEvent;
import electrosphere.renderer.ui.events.DragEvent.DragEventType;
import electrosphere.renderer.ui.events.Event;
public class ActorPanel implements DrawableElement, DraggableElement {
public class ActorPanel extends StandardElement implements DrawableElement, DraggableElement {
Material customMat = new Material();
Framebuffer elementBuffer;
@ -62,6 +56,7 @@ public class ActorPanel implements DrawableElement, DraggableElement {
static final Vector3f windowDrawDebugColor = new Vector3f(0.0f,0.0f,1.0f);
public ActorPanel(int x, int y, int width, int height, Actor actor){
super();
elementBuffer = FramebufferUtils.generateTextureFramebuffer(width, height);
customMat.setTexturePointer(elementBuffer.getTexturePointer());
this.actor = actor;
@ -76,7 +71,15 @@ public class ActorPanel implements DrawableElement, DraggableElement {
@Override
public void draw(RenderPipelineState renderPipelineState, OpenGLState openGLState, int parentFramebufferPointer, int parentWidth, int parentHeight) {
public void draw(
RenderPipelineState renderPipelineState,
OpenGLState openGLState,
int parentFramebufferPointer,
int parentPosX,
int parentPosY,
int parentWidth,
int parentHeight
) {
elementBuffer.bind();
// Globals.renderingEngine.setViewportSize(width, height);
@ -144,10 +147,6 @@ public class ActorPanel implements DrawableElement, DraggableElement {
Vector3f boxPosition = new Vector3f(ndcX,ndcY,0);
Vector3f boxDimensions = new Vector3f(ndcWidth,ndcHeight,0);
openGLState.setActiveShader(
renderPipelineState,
Globals.assetManager.fetchShader("Shaders/ui/windowContent/windowContent.vs", null, "Shaders/ui/windowContent/windowContent.fs")
);
@ -156,7 +155,7 @@ public class ActorPanel implements DrawableElement, DraggableElement {
//
// Set rendering engine state
//
renderPipelineState.setUseMeshShader(false);
renderPipelineState.setUseMeshShader(true);
renderPipelineState.setBufferStandardUniforms(false);
renderPipelineState.setBufferNonStandardUniforms(true);
renderPipelineState.setUseMaterial(true);
@ -185,63 +184,16 @@ public class ActorPanel implements DrawableElement, DraggableElement {
}
}
public int width = 1;
public int height = 1;
public int positionX = 0;
public int positionY = 0;
public int parentWidth = 1;
public int parentHeight = 1;
public boolean visible = false;
public int getWidth() {
return width;
}
public int getHeight() {
return height;
}
public int getPositionX() {
return positionX;
}
public int getPositionY() {
return positionY;
}
public boolean getVisible() {
return visible;
}
public void setWidth(int width) {
this.width = width;
}
public void setHeight(int height) {
this.height = height;
}
public void setPositionX(int positionX) {
this.positionX = positionX;
}
public void setPositionY(int positionY) {
this.positionY = positionY;
}
public void setVisible(boolean draw) {
this.visible = draw;
}
public void setParentWidth(int width){
parentWidth = width;
}
public void setParentHeight(int height){
this.parentHeight = height;
public boolean getVisible(){
return this.visible;
}
public void setAnimation(String animation){

View File

@ -1,4 +1,4 @@
package electrosphere.renderer.ui.font.bitmapchar;
package electrosphere.renderer.ui.elements;
import electrosphere.engine.Globals;
import electrosphere.engine.assetmanager.AssetDataStrings;
@ -11,12 +11,12 @@ import electrosphere.renderer.ui.events.Event;
import electrosphere.renderer.ui.font.Font;
// import electrosphere.renderer.ui.font.FontUtils;
import org.joml.Vector3f;
import org.lwjgl.util.yoga.Yoga;
/**
*
* @author satellite
* A single character
*/
public class BitmapCharacter implements DrawableElement {
public class BitmapCharacter extends StandardElement implements DrawableElement {
String text;
@ -25,12 +25,19 @@ public class BitmapCharacter implements DrawableElement {
Font font;
public BitmapCharacter(Font font, int posX, int posY, int width, int height, char toDraw){
this.positionX = posX;
this.positionY = posY;
this.width = width;
this.height = height;
/**
* Constructor
* @param font
* @param posX
* @param posY
* @param width
* @param height
* @param toDraw
*/
public BitmapCharacter(Font font, int width, int height, char toDraw){
super();
setWidth(width);
setHeight(height);
this.text = "" + toDraw;
this.font = font;
}
@ -51,13 +58,21 @@ public class BitmapCharacter implements DrawableElement {
@Override
public void draw(RenderPipelineState renderPipelineState, OpenGLState openGLState, int parentFramebufferPointer, int parentWidth, int parentHeight){
public void draw(
RenderPipelineState renderPipelineState,
OpenGLState openGLState,
int parentFramebufferPointer,
int parentPosX,
int parentPosY,
int parentWidth,
int parentHeight
){
Globals.renderingEngine.bindFramebuffer(parentFramebufferPointer);
openGLState.glViewport(parentWidth, parentHeight);
float ndcX = (float)positionX/parentWidth;
float ndcY = (float)positionY/parentHeight;// + (float)Globals.WINDOW_TITLE_BAR_HEIGHT/parentHeight;
float ndcWidth = (float)width/parentWidth;
float ndcHeight = (float)height/parentHeight;
float ndcX = (float)(internalPositionX + parentPosX)/parentWidth;
float ndcY = (float)(parentHeight - (internalPositionY + parentPosY))/parentHeight;
float ndcWidth = (float)internalWidth/parentWidth;
float ndcHeight = (float)internalHeight/parentHeight;
// float charWidth = ndcWidth/cols;
// float charHeight = ndcHeight/rows;
char toDraw = text.charAt(0);
@ -83,67 +98,28 @@ public class BitmapCharacter implements DrawableElement {
}
}
public int width = 1;
public int height = 1;
public int positionX = 0;
public int positionY = 0;
public int parentWidth = 1;
public int parentHeight = 1;
public boolean visible = false;
public int getWidth() {
return width;
}
public int getHeight() {
return height;
}
public int getPositionX() {
return positionX;
}
public int getPositionY() {
return positionY;
}
public boolean getVisible() {
return visible;
}
public void setWidth(int width) {
this.width = width;
}
public void setHeight(int height) {
this.height = height;
}
public void setPositionX(int positionX) {
this.positionX = positionX;
}
public void setPositionY(int positionY) {
this.positionY = positionY;
}
public void setVisible(boolean draw) {
this.visible = draw;
}
public void setParentWidth(int width){
parentWidth = width;
}
public void setParentHeight(int height){
this.parentHeight = height;
}
public boolean handleEvent(Event event){
return true;
}
@Override
public void applyYoga() {
//get the values from yoga
float leftRaw = Yoga.YGNodeLayoutGetLeft(yogaNode);
float topRaw = Yoga.YGNodeLayoutGetTop(yogaNode);
//apply the values to this component
this.internalPositionX = (int)leftRaw;
this.internalPositionY = (int)topRaw;
}
}

View File

@ -1,16 +1,17 @@
package electrosphere.renderer.ui.elements;
import java.util.LinkedList;
import java.util.List;
import org.joml.Vector3f;
import org.lwjgl.opengl.GL30;
import electrosphere.engine.Globals;
import electrosphere.logger.LoggerInterface;
import electrosphere.renderer.OpenGLState;
import electrosphere.renderer.RenderPipelineState;
import electrosphere.renderer.debug.DebugRendering;
import electrosphere.renderer.model.Material;
import electrosphere.renderer.model.Model;
import electrosphere.renderer.texture.Texture;
import electrosphere.renderer.ui.elementtypes.ClickableElement;
import electrosphere.renderer.ui.elementtypes.ContainerElement;
import electrosphere.renderer.ui.elementtypes.DrawableElement;
import electrosphere.renderer.ui.elementtypes.Element;
import electrosphere.renderer.ui.elementtypes.FocusableElement;
@ -21,18 +22,13 @@ import electrosphere.renderer.ui.events.FocusEvent;
import electrosphere.renderer.ui.events.HoverEvent;
import electrosphere.renderer.ui.events.MouseEvent;
public class Button implements DrawableElement, FocusableElement, ContainerElement, ClickableElement, HoverableElement {
public class Button extends StandardContainerElement implements DrawableElement, FocusableElement, ClickableElement, HoverableElement {
List<Element> childList = new LinkedList<Element>();
int width = -1;
int height = -1;
int positionX = -1;
int positionY = -1;
int parentWidth = 1;
int parentHeight = 1;
Vector3f boxPosition = new Vector3f();
Vector3f boxDimensions = new Vector3f();
Vector3f texPosition = new Vector3f(0,0,0);
Vector3f texScale = new Vector3f(1,1,0);
Material customMat = new Material();
boolean visible = false;
boolean focused = false;
@ -44,140 +40,18 @@ public class Button implements DrawableElement, FocusableElement, ContainerEleme
static final Vector3f windowDrawDebugColor = new Vector3f(1.0f,1.0f,1.0f);
public int getWidth() {
if(width == -1){
int minX = -1;
int maxX = -1;
for(Element child : childList){
if(minX == -1){
minX = child.getPositionX();
} else if(child.getPositionX() < minX){
minX = child.getPositionX();
}
if(maxX == -1){
maxX = child.getPositionX() + child.getWidth();
} else if(child.getPositionX() + child.getWidth() > maxX){
maxX = child.getPositionX() + child.getWidth();
}
}
if(minX == -1){
minX = 0;
}
if(maxX == -1){
maxX = 0;
}
return maxX - minX;
} else {
return width;
}
}
public int getHeight() {
if(height == -1){
int minY = -1;
int maxY = -1;
for(Element child : childList){
if(minY == -1){
minY = child.getPositionY();
} else if(child.getPositionY() < minY){
minY = child.getPositionY();
}
if(maxY == -1){
maxY = child.getPositionY() + child.getHeight();
} else if(child.getPositionY() + child.getHeight() > maxY){
maxY = child.getPositionY() + child.getHeight();
}
}
if(minY == -1){
minY = 0;
}
if(maxY == -1){
maxY = 0;
}
return maxY - minY;
} else {
return height;
}
}
public int getPositionX() {
if(positionX == -1){
int minX = -1;
for(Element child : childList){
if(minX == -1){
minX = child.getPositionX();
} else if(child.getPositionX() < minX){
minX = child.getPositionX();
}
}
if(minX == -1){
minX = 0;
}
return minX;
} else {
return positionX;
}
}
public int getPositionY() {
if(positionY == -1){
int minY = -1;
for(Element child : childList){
if(minY == -1){
minY = child.getPositionY();
} else if(child.getPositionY() < minY){
minY = child.getPositionY();
}
}
if(minY == -1){
minY = 0;
}
return minY;
} else {
return positionY;
}
public Button(){
super();
}
public boolean getVisible() {
return visible;
}
public void setWidth(int width) {
this.width = width;
}
public void setHeight(int height) {
this.height = height;
}
public void setPositionX(int posX) {
int deltaX = posX - getPositionX();
this.positionX = posX;
for(Element child : childList){
child.setPositionX(child.getPositionX() + deltaX);
}
}
public void setPositionY(int posY) {
int deltaY = posY - getPositionY();
this.positionY = posY;
for(Element child : childList){
child.setPositionY(child.getPositionY() + deltaY);
}
}
public void setVisible(boolean draw) {
this.visible = draw;
}
public void setParentWidth(int width){
parentWidth = width;
}
public void setParentHeight(int height){
this.parentHeight = height;
}
@Override
public boolean isFocused() {
return focused;
@ -231,46 +105,81 @@ public class Button implements DrawableElement, FocusableElement, ContainerEleme
}
}
public void draw(RenderPipelineState renderPipelineState, OpenGLState openGLState, int parentFramebufferPointer, int parentWidth, int parentHeight) {
public void draw(
RenderPipelineState renderPipelineState,
OpenGLState openGLState,
int parentFramebufferPointer,
int parentPosX,
int parentPosY,
int parentWidth,
int parentHeight
) {
//
//Draw decorations
float ndcWidth = (float)getWidth()/parentWidth;
float ndcHeight = (float)getHeight()/parentHeight;
float ndcX = (float)(getInternalX() + parentPosX)/parentWidth;
float ndcY = (float)(getInternalY() + parentPosY)/parentHeight;
boxPosition = new Vector3f(ndcX,ndcY,0);
boxDimensions = new Vector3f(ndcWidth,ndcHeight,0);
Model planeModel = Globals.assetManager.fetchModel(Globals.imagePlaneModelID);
Texture windowFrame = null;
if(this.isFocused()){
windowFrame = Globals.assetManager.fetchTexture("Textures/ui/uiFrame2.png");
} else {
windowFrame = Globals.assetManager.fetchTexture("Textures/ui/uiFrame1.png");
}
//this call binds the screen as the "texture" we're rendering to
//have to call before actually rendering
GL30.glBindFramebuffer(GL30.GL_FRAMEBUFFER, parentFramebufferPointer);
openGLState.glViewport(parentWidth, parentHeight);
//error if assets are null
if(planeModel == null || windowFrame == null){
LoggerInterface.loggerRenderer.ERROR("Window unable to find plane model or window frame!!", new Exception());
}
//render background of window
if(planeModel != null && windowFrame != null){
planeModel.pushUniformToMesh("plane", "mPosition", boxPosition);
planeModel.pushUniformToMesh("plane", "mDimension", boxDimensions);
planeModel.pushUniformToMesh("plane", "tPosition", texPosition);
planeModel.pushUniformToMesh("plane", "tDimension", texScale);
customMat.setTexturePointer(windowFrame.getTexturePointer());
planeModel.getMeshes().get(0).setMaterial(customMat);
planeModel.drawUI();
}
//
//Draw children elements
for(Element child : childList){
if(child instanceof DrawableElement){
DrawableElement drawableChild = (DrawableElement) child;
drawableChild.draw(renderPipelineState,openGLState,parentFramebufferPointer,parentWidth,parentHeight);
child.setPositionX(this.internalPositionX);
child.setPositionY(this.internalPositionY);
drawableChild.draw(
renderPipelineState,
openGLState,
parentFramebufferPointer,
parentPosX + this.internalPositionX,
parentPosY + this.internalPositionY,
parentWidth,
parentHeight
);
}
}
if(Globals.RENDER_FLAG_RENDER_UI_BOUNDS && DebugRendering.RENDER_DEBUG_OUTLINE_BUTTON){
float ndcX = (float)positionX/parentWidth;
float ndcY = (float)positionY/parentHeight;
float ndcWidth = (float)getWidth()/parentWidth;
float ndcHeight = (float)getHeight()/parentHeight;
Vector3f boxPosition = new Vector3f(ndcX,ndcY,0);
Vector3f boxDimensions = new Vector3f(ndcWidth,ndcHeight,0);
DebugRendering.drawUIBounds(parentFramebufferPointer, boxPosition, boxDimensions, windowDrawDebugColor);
}
}
@Override
public void addChild(Element child) {
childList.add(child);
if(child instanceof DrawableElement){
DrawableElement drawableChild = (DrawableElement) child;
drawableChild.setParentWidth(width);
drawableChild.setParentHeight(height);
drawableChild.setVisible(false);
}
}
@Override
public List<Element> getChildren() {
return childList;
}
@Override
public void removeChild(Element child) {
childList.remove(child);
}
@Override
public void setOnFocus(FocusEventCallback callback) {
onFocusCallback = callback;

View File

@ -1,256 +1,47 @@
package electrosphere.renderer.ui.elements;
import java.util.LinkedList;
import java.util.List;
import org.joml.Vector3f;
import org.lwjgl.util.yoga.Yoga;
import electrosphere.engine.Globals;
import electrosphere.renderer.OpenGLState;
import electrosphere.renderer.RenderPipelineState;
import electrosphere.renderer.debug.DebugRendering;
import electrosphere.renderer.ui.elementtypes.ClickableElement;
import electrosphere.renderer.ui.elementtypes.ContainerElement;
import electrosphere.renderer.ui.elementtypes.DraggableElement;
import electrosphere.renderer.ui.elementtypes.DrawableElement;
import electrosphere.renderer.ui.elementtypes.Element;
import electrosphere.renderer.ui.elementtypes.FocusableElement;
import electrosphere.renderer.ui.elementtypes.NavigableElement;
import electrosphere.renderer.ui.events.ClickEvent;
import electrosphere.renderer.ui.events.DragEvent;
import electrosphere.renderer.ui.events.DragEvent.DragEventType;
import electrosphere.renderer.ui.events.Event;
import electrosphere.renderer.ui.events.FocusEvent;
import electrosphere.renderer.ui.events.NavigationEvent;
public class Div implements ClickableElement,ContainerElement,DraggableElement,FocusableElement,DrawableElement,NavigableElement {
public class Div extends StandardContainerElement implements ClickableElement,DraggableElement,DrawableElement,NavigableElement {
ClickEventCallback onClick;
FocusEventCallback onFocus;
FocusEventCallback onLoseFocus;
DragEventCallback onDragStart;
DragEventCallback onDrag;
DragEventCallback onDragRelease;
NavigationEventCallback onNavigate;
boolean focused = false;
List<Element> childList = new LinkedList<Element>();
public int width = -1;
public int height = -1;
public int positionX = -1;
public int positionY = -1;
public int parentWidth = 1;
public int parentHeight = 1;
public boolean visible = false;
static final Vector3f windowDrawDebugColor = new Vector3f(1.0f,1.0f,1.0f);
@Override
public int getWidth() {
if(width == -1){
if(childList.size() > 0){
int minX = -1;
int maxX = -1;
for(Element child : childList){
if(minX == -1){
minX = child.getPositionX();
} else if(child.getPositionX() < minX){
minX = child.getPositionX();
}
if(maxX == -1){
maxX = child.getPositionX() + child.getWidth();
} else if(child.getPositionX() + child.getWidth() > maxX){
maxX = child.getPositionX() + child.getWidth();
}
}
if(minX == -1){
minX = 0;
}
if(maxX == -1){
maxX = 0;
}
return maxX - minX;
} else {
return 1;
}
} else {
return width;
}
public Div(){
super();
Yoga.YGNodeStyleSetFlex(yogaNode, 1.0f);
}
@Override
public int getHeight() {
if(height == -1){
if(childList.size() > 0){
int minY = -1;
int maxY = -1;
for(Element child : childList){
if(minY == -1){
minY = child.getPositionY();
} else if(child.getPositionY() < minY){
minY = child.getPositionY();
}
if(maxY == -1){
maxY = child.getPositionY() + child.getHeight();
} else if(child.getPositionY() + child.getHeight() > maxY){
maxY = child.getPositionY() + child.getHeight();
}
}
if(minY == -1){
minY = 0;
}
if(maxY == -1){
maxY = 0;
}
return maxY - minY;
} else {
return 1;
}
} else {
return height;
}
}
@Override
public int getPositionX() {
if(positionX == -1){
if(childList.size() > 0){
int minX = -1;
for(Element child : childList){
if(minX == -1){
minX = child.getPositionX();
} else if(child.getPositionX() < minX){
minX = child.getPositionX();
}
}
if(minX == -1){
minX = 0;
}
return minX;
} else {
return 0;
}
} else {
return positionX;
}
}
@Override
public int getPositionY() {
if(positionY == -1){
if(childList.size() > 0){
int minY = -1;
for(Element child : childList){
if(minY == -1){
minY = child.getPositionY();
} else if(child.getPositionY() < minY){
minY = child.getPositionY();
}
}
if(minY == -1){
minY = 0;
}
return minY;
} else {
return 0;
}
} else {
return positionY;
}
}
@Override
public void setWidth(int width) {
this.width = width;
}
@Override
public void setHeight(int height) {
this.height = height;
}
@Override
public void setPositionX(int posX) {
int deltaX = posX - getPositionX();
this.positionX = posX;
for(Element child : childList){
child.setPositionX(child.getPositionX() + deltaX);
}
}
@Override
public void setPositionY(int posY) {
int deltaY = posY - getPositionY();
this.positionY = posY;
for(Element child : childList){
child.setPositionY(child.getPositionY() + deltaY);
}
}
@Override
public void setParentWidth(int width) {
this.parentWidth = width;
}
@Override
public void setParentHeight(int height) {
this.parentHeight = height;
}
@Override
public void addChild(Element child) {
childList.add(child);
if(child instanceof DrawableElement){
DrawableElement drawableChild = (DrawableElement) child;
drawableChild.setParentWidth(width);
drawableChild.setParentHeight(height);
drawableChild.setVisible(false);
}
}
@Override
public List<Element> getChildren() {
return childList;
}
@Override
public void removeChild(Element child) {
childList.remove(child);
}
public void setFocus(boolean focus){
this.focused = focus;
}
@Override
public boolean isFocused() {
return focused;
}
@Override
public void setOnFocus(FocusEventCallback callback) {
this.onFocus = callback;
}
@Override
public void setOnLoseFocus(FocusEventCallback callback) {
this.onLoseFocus = callback;
}
@Override
public void setOnDragStart(DragEventCallback callback) {
this.onDragStart = callback;
@ -284,20 +75,6 @@ public class Div implements ClickableElement,ContainerElement,DraggableElement,F
}
}
}
if(onFocus != null){
if(event instanceof FocusEvent){
if(!onFocus.execute((FocusEvent)event)){
propagate = false;
}
}
}
if(onLoseFocus != null){
if(event instanceof FocusEvent){
if(!onLoseFocus.execute((FocusEvent)event)){
propagate = false;
}
}
}
if(event instanceof DragEvent){
if(onDragStart != null && ((DragEvent)event).getType() == DragEventType.START){
if(!onDragStart.execute((DragEvent)event)){
@ -336,11 +113,19 @@ public class Div implements ClickableElement,ContainerElement,DraggableElement,F
}
@Override
public void draw(RenderPipelineState renderPipelineState, OpenGLState openGLState, int parentFramebufferPointer, int parentWidth, int parentHeight) {
public void draw(
RenderPipelineState renderPipelineState,
OpenGLState openGLState,
int parentFramebufferPointer,
int parentPosX,
int parentPosY,
int parentWidth,
int parentHeight
) {
for(Element child : childList){
if(child instanceof DrawableElement){
DrawableElement drawableChild = (DrawableElement) child;
drawableChild.draw(renderPipelineState,openGLState,parentFramebufferPointer,parentWidth,parentHeight);
drawableChild.draw(renderPipelineState,openGLState,parentFramebufferPointer,parentPosX + this.internalPositionX,parentPosY + this.internalPositionY,parentWidth,parentHeight);
}
}

View File

@ -0,0 +1,68 @@
package electrosphere.renderer.ui.elements;
import org.lwjgl.util.yoga.Yoga;
import electrosphere.renderer.OpenGLState;
import electrosphere.renderer.RenderPipelineState;
import electrosphere.renderer.ui.elementtypes.DrawableElement;
import electrosphere.renderer.ui.elementtypes.Element;
import electrosphere.renderer.ui.events.Event;
public class FormElement extends StandardContainerElement implements DrawableElement {
public boolean visible = false;
public boolean focused = false;
public FormElement(){
super();
Yoga.YGNodeStyleSetFlex(yogaNode, 1.0f);
}
public void draw(
RenderPipelineState renderPipelineState,
OpenGLState openGLState,
int parentFramebufferPointer,
int parentPosX,
int parentPosY,
int parentWidth,
int parentHeight
) {
for(Element child : childList){
if(child instanceof DrawableElement){
DrawableElement drawableChild = (DrawableElement) child;
drawableChild.draw(renderPipelineState,openGLState,parentFramebufferPointer,parentPosX + this.internalPositionX,parentPosY + this.internalPositionY,parentWidth,parentHeight);
}
}
}
public void onFocus(){
}
public boolean getVisible() {
return visible;
}
public boolean isFocused(){
return focused;
}
public void setVisible(boolean draw) {
this.visible = draw;
for(Element child : childList){
if(child instanceof DrawableElement){
DrawableElement drawableChild = (DrawableElement) child;
drawableChild.setVisible(draw);
}
}
}
public void setFocused(boolean focused){
this.focused = focused;
}
public boolean handleEvent(Event event){
return true;
}
}

View File

@ -23,7 +23,7 @@ import electrosphere.renderer.ui.events.Event;
*
* @author amaterasu
*/
public class ImagePanel implements DrawableElement, DraggableElement {
public class ImagePanel extends StandardElement implements DrawableElement, DraggableElement {
public static String imagePanelModelPath;
@ -43,6 +43,7 @@ public class ImagePanel implements DrawableElement, DraggableElement {
static final Vector3f windowDrawDebugColor = new Vector3f(0.0f,0.5f,1.0f);
public ImagePanel(int x, int y, int width, int height, String texturePath){
super();
this.texturePath = texturePath;
texture = Globals.assetManager.fetchTexture(this.texturePath);
if(texture != null){
@ -68,7 +69,15 @@ public class ImagePanel implements DrawableElement, DraggableElement {
@Override
public void draw(RenderPipelineState renderPipelineState, OpenGLState openGLState, int parentFramebufferPointer, int parentWidth, int parentHeight) {
public void draw(
RenderPipelineState renderPipelineState,
OpenGLState openGLState,
int parentFramebufferPointer,
int parentPosX,
int parentPosY,
int parentWidth,
int parentHeight
) {
if(!hasLoadedTexture){
texture = Globals.assetManager.fetchTexture(this.texturePath);
if(texture != null){
@ -105,65 +114,16 @@ public class ImagePanel implements DrawableElement, DraggableElement {
}
}
public int width = 1;
public int height = 1;
public int positionX = 0;
public int positionY = 0;
public int parentWidth = 1;
public int parentHeight = 1;
public boolean visible = false;
public int getWidth() {
return width;
}
public int getHeight() {
return height;
}
public int getPositionX() {
return positionX;
}
public int getPositionY() {
return positionY;
}
public boolean getVisible() {
return visible;
}
public void setWidth(int width) {
this.width = width;
}
public void setHeight(int height) {
this.height = height;
}
public void setPositionX(int positionX) {
this.positionX = positionX;
}
public void setPositionY(int positionY) {
this.positionY = positionY;
}
public void setVisible(boolean draw) {
this.visible = draw;
}
public void setParentWidth(int width){
parentWidth = width;
}
public void setParentHeight(int height){
this.parentHeight = height;
}
public boolean handleEvent(Event event){
boolean propagate = true;
if(event instanceof DragEvent){

View File

@ -1,9 +1,7 @@
package electrosphere.renderer.ui.elements;
import java.util.LinkedList;
import java.util.List;
import org.joml.Vector3f;
import org.lwjgl.util.yoga.Yoga;
import electrosphere.engine.Globals;
import electrosphere.renderer.OpenGLState;
@ -13,23 +11,12 @@ import electrosphere.renderer.ui.elementtypes.DrawableElement;
import electrosphere.renderer.ui.elementtypes.Element;
import electrosphere.renderer.ui.events.Event;
import electrosphere.renderer.ui.font.Font;
import electrosphere.renderer.ui.font.FontUtils;
import electrosphere.renderer.ui.font.bitmapchar.BitmapCharacter;
/**
*
* @author amaterasu
*/
public class Label implements DrawableElement {
public int width = 1;
public int height = 1;
public int positionX = 0;
public int positionY = 0;
public int parentWidth = 1;
public int parentHeight = 1;
public class Label extends StandardContainerElement implements DrawableElement {
public boolean visible = false;
@ -39,31 +26,44 @@ public class Label implements DrawableElement {
float fontSize = 1.0f;
List<BitmapCharacter> childrenElements = new LinkedList<BitmapCharacter>();
static final Vector3f windowDrawDebugColor = new Vector3f(1.0f,1.0f,1.0f);
Font font;
public Label(int x, int y, float fontSize){
this.positionX = x;
this.positionY = y;
this.width = 0;
public Label(float fontSize){
super();
this.font = Globals.fontManager.getFont("default");
this.height = (int)(font.getFontHeight() * fontSize);
setHeight((int)(font.getFontHeight() * fontSize));
this.fontSize = fontSize;
Yoga.YGNodeStyleSetFlexDirection(this.yogaNode, Yoga.YGFlexDirectionRow);
}
public Label(int x, int y, float fontSize){
super();
this.setPositionX(x);
this.setPositionY(y);
this.font = Globals.fontManager.getFont("default");
setHeight((int)(font.getFontHeight() * fontSize));
this.fontSize = fontSize;
Yoga.YGNodeStyleSetFlexDirection(this.yogaNode, Yoga.YGFlexDirectionRow);
}
void generateLetters(){
childrenElements.clear();
int rollingOffset = 0;
//free children
for(Element child : childList){
Yoga.YGNodeFree(child.getYogaNode());
}
childList.clear();
int accumulatingWidth = 0;
for(int i = 0; i < text.length(); i++){
char toDraw = text.charAt(i);
Vector3f bitMapDimension = this.font.getDimensionOfCharacterDiscrete(toDraw);
BitmapCharacter newLetter = new BitmapCharacter(this.font,(int)(rollingOffset * fontSize) + positionX, positionY, (int)(bitMapDimension.x * fontSize), this.height, toDraw);
rollingOffset += (int)bitMapDimension.x;
childrenElements.add(newLetter);
BitmapCharacter newLetter = new BitmapCharacter(this.font,(int)(bitMapDimension.x * fontSize), this.height, toDraw);
accumulatingWidth += bitMapDimension.x * fontSize;
childList.add(newLetter);
Yoga.YGNodeInsertChild(yogaNode, newLetter.getYogaNode(), childList.size() - 1);
}
Yoga.YGNodeStyleSetWidth(yogaNode, accumulatingWidth);
}
public void setText(String text){
@ -77,8 +77,8 @@ public class Label implements DrawableElement {
}
public void setColor(Vector3f color){
for(BitmapCharacter character : childrenElements){
character.setColor(color);
for(Element character : childList){
((BitmapCharacter)character).setColor(color);
}
}
@ -87,140 +87,46 @@ public class Label implements DrawableElement {
}
@Override
public void draw(RenderPipelineState renderPipelineState, OpenGLState openGLState, int parentFramebufferPointer, int parentWidth, int parentHeight) {
for(DrawableElement child : childrenElements){
child.draw(renderPipelineState,openGLState,parentFramebufferPointer, parentWidth, parentHeight);
public void draw(
RenderPipelineState renderPipelineState,
OpenGLState openGLState,
int parentFramebufferPointer,
int parentPosX,
int parentPosY,
int parentWidth,
int parentHeight
) {
for(Element child : childList){
((DrawableElement)child).draw(
renderPipelineState,
openGLState,
parentFramebufferPointer,
parentPosX + this.internalPositionX,
parentPosY + this.internalPositionY,
parentWidth,
parentHeight
);
}
if(Globals.RENDER_FLAG_RENDER_UI_BOUNDS && DebugRendering.RENDER_DEBUG_OUTLINE_LABEL){
float ndcX = (float)positionX/parentWidth;
float ndcY = (float)positionY/parentHeight;
float ndcWidth = (float)getWidth()/parentWidth;
float ndcHeight = (float)getHeight()/parentHeight;
float ndcX = (float)(positionX)/parentWidth;
float ndcY = (float)(positionY)/parentHeight;
float ndcWidth = (float)internalWidth/parentWidth;
float ndcHeight = (float)internalHeight/parentHeight;
Vector3f boxPosition = new Vector3f(ndcX,ndcY,0);
Vector3f boxDimensions = new Vector3f(ndcWidth,ndcHeight,0);
DebugRendering.drawUIBounds(parentFramebufferPointer, boxPosition, boxDimensions, windowDrawDebugColor);
}
}
public int getWidth() {
int minX = -1;
int maxX = -1;
for(BitmapCharacter child : childrenElements){
if(minX == -1){
minX = child.getPositionX();
} else if(child.getPositionX() < minX){
minX = child.getPositionX();
}
if(maxX == -1){
maxX = child.getPositionX() + child.getWidth();
} else if(child.getPositionX() + child.getWidth() > maxX){
maxX = child.getPositionX() + child.getWidth();
}
}
if(minX == -1){
minX = 0;
}
if(maxX == -1){
maxX = 0;
}
return maxX - minX;
}
public int getHeight() {
int minY = -1;
int maxY = -1;
for(BitmapCharacter child : childrenElements){
if(minY == -1){
minY = child.getPositionY();
} else if(child.getPositionY() < minY){
minY = child.getPositionY();
}
if(maxY == -1){
maxY = child.getPositionY() + child.getHeight();
} else if(child.getPositionY() + child.getHeight() > maxY){
maxY = child.getPositionY() + child.getHeight();
}
}
if(minY == -1){
minY = 0;
}
if(maxY == -1){
maxY = 0;
}
return maxY - minY;
}
public int getPositionX() {
int minX = -1;
for(BitmapCharacter child : childrenElements){
if(minX == -1){
minX = child.getPositionX();
} else if(child.getPositionX() < minX){
minX = child.getPositionX();
}
}
if(minX == -1){
minX = 0;
}
return minX;
}
public int getPositionY() {
int minY = -1;
for(BitmapCharacter child : childrenElements){
if(minY == -1){
minY = child.getPositionY();
} else if(child.getPositionY() < minY){
minY = child.getPositionY();
}
}
if(minY == -1){
minY = 0;
}
return minY;
}
public boolean getVisible() {
return visible;
}
public void setWidth(int width) {
this.width = width;
}
public void setHeight(int height) {
this.height = height;
}
public void setPositionX(int posX) {
int deltaX = posX - this.positionX;
this.positionX = posX;
for(Element child : childrenElements){
child.setPositionX(child.getPositionX() + deltaX);
}
}
public void setPositionY(int posY) {
int deltaY = posY - this.positionY;
this.positionY = posY;
for(Element child : childrenElements){
child.setPositionY(child.getPositionY() + deltaY);
}
}
public void setVisible(boolean draw) {
this.visible = draw;
}
public void setParentWidth(int width){
parentWidth = width;
}
public void setParentHeight(int height){
this.parentHeight = height;
}
public boolean handleEvent(Event event){
return true;
}

View File

@ -1,9 +1,5 @@
package electrosphere.renderer.ui.elements;
import java.util.LinkedList;
import java.util.List;
import org.joml.Vector2f;
import org.joml.Vector3f;
import electrosphere.engine.Globals;
@ -14,6 +10,7 @@ import electrosphere.renderer.framebuffer.Framebuffer;
import electrosphere.renderer.framebuffer.FramebufferUtils;
import electrosphere.renderer.model.Material;
import electrosphere.renderer.model.Model;
import electrosphere.renderer.texture.Texture;
import electrosphere.renderer.ui.elementtypes.ContainerElement;
import electrosphere.renderer.ui.elementtypes.DrawableElement;
import electrosphere.renderer.ui.elementtypes.Element;
@ -22,19 +19,9 @@ import electrosphere.renderer.ui.events.Event;
import static org.lwjgl.opengl.GL11.*;
import static org.lwjgl.opengl.GL30.*;
public class ScrollableContainer implements DrawableElement, ContainerElement {
public class ScrollableContainer extends StandardContainerElement implements DrawableElement {
boolean focused = false;
List<Element> childList = new LinkedList<Element>();
public int width = 1;
public int height = 1;
public int positionX = 0;
public int positionY = 0;
public int parentWidth = 1;
public int parentHeight = 1;
public boolean visible = false;
@ -42,11 +29,12 @@ public class ScrollableContainer implements DrawableElement, ContainerElement {
Material customMat = new Material();
Vector3f boxPosition = new Vector3f();
Vector3f boxDimensions = new Vector3f();
Vector3f texPosition = new Vector3f(0,1,0);
Vector3f texScale = new Vector3f(1,-1,0);
Vector3f texPosition = new Vector3f(0,0,0);
Vector3f texScale = new Vector3f(1,1,0);
public ScrollableContainer(int positionX, int positionY, int width, int height){
super();
widgetBuffer = FramebufferUtils.generateTextureFramebuffer(width, height);
// widgetBuffer = FramebufferUtils.generateScreensizeTextureFramebuffer();
customMat.setTexturePointer(widgetBuffer.getTexturePointer());
@ -55,108 +43,14 @@ public class ScrollableContainer implements DrawableElement, ContainerElement {
float ndcY = (float)positionY/Globals.WINDOW_HEIGHT;
float ndcWidth = (float)width/Globals.WINDOW_WIDTH;
float ndcHeight = (float)height/Globals.WINDOW_HEIGHT;
this.width = width;
this.height = height;
setWidth(width);
setHeight(height);
boxPosition = new Vector3f(ndcX,ndcY,0);
boxDimensions = new Vector3f(ndcWidth,ndcHeight,0);
}
@Override
public int getWidth() {
return width;
}
@Override
public int getHeight() {
return height;
}
@Override
public int getPositionX() {
return positionX;
}
@Override
public int getPositionY() {
return positionY;
}
@Override
public void setWidth(int width) {
this.width = width;
}
@Override
public void setHeight(int height) {
this.height = height;
}
@Override
public void setPositionX(int positionX) {
this.positionX = positionX;
}
@Override
public void setPositionY(int positionY) {
this.positionY = positionY;
}
@Override
public void setParentWidth(int width) {
parentWidth = width;
float ndcX = (float)positionX/parentWidth;
float ndcY = (float)positionY/parentHeight;
float ndcWidth = (float)width/parentWidth;
float ndcHeight = (float)height/parentHeight;
boxPosition = new Vector3f(ndcX,ndcY,0);
boxDimensions = new Vector3f(ndcWidth,ndcHeight,0);
}
@Override
public void setParentHeight(int height) {
parentHeight = height;
float ndcX = (float)positionX/parentWidth;
float ndcY = (float)positionY/parentHeight;
float ndcWidth = (float)width/parentWidth;
float ndcHeight = (float)height/parentHeight;
boxPosition = new Vector3f(ndcX,ndcY,0);
boxDimensions = new Vector3f(ndcWidth,ndcHeight,0);
}
@Override
public void addChild(Element child) {
childList.add(child);
if(child instanceof DrawableElement){
DrawableElement drawableChild = (DrawableElement) child;
drawableChild.setParentWidth(width);
drawableChild.setParentHeight(height);
drawableChild.setVisible(false);
}
}
@Override
public List<Element> getChildren() {
return childList;
}
@Override
public void removeChild(Element child) {
childList.remove(child);
}
@Override
public boolean handleEvent(Event event) {
return false;
@ -189,7 +83,15 @@ public class ScrollableContainer implements DrawableElement, ContainerElement {
}
@Override
public void draw(RenderPipelineState renderPipelineState, OpenGLState openGLState, int parentFramebufferPointer, int parentWidth, int parentHeight) {
public void draw(
RenderPipelineState renderPipelineState,
OpenGLState openGLState,
int parentFramebufferPointer,
int parentPosX,
int parentPosY,
int parentWidth,
int parentHeight
) {
//figure out if currently focused element is a child or subchild of this container
if(containsFocusedElement(this)){
//if it is, if it is offscreen, calculate offset to put it onscreen
@ -235,9 +137,20 @@ public class ScrollableContainer implements DrawableElement, ContainerElement {
}
}
float ndcX = (float)internalPositionX/parentWidth;
float ndcY = (float)internalPositionY/parentHeight;
float ndcWidth = (float)internalWidth/parentWidth;
float ndcHeight = (float)internalHeight/parentHeight;
boxPosition = new Vector3f(ndcX,ndcY,0);
boxDimensions = new Vector3f(ndcWidth,ndcHeight,0);
//grab assets required to render window
Model planeModel = Globals.assetManager.fetchModel(Globals.imagePlaneModelID);
Texture windowFrame = Globals.assetManager.fetchTexture("Textures/ui/uiFrame1.png");
widgetBuffer.bind();
// Globals.renderingEngine.setViewportSize(width, height);
openGLState.glViewport(width, height);
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
@ -245,7 +158,7 @@ public class ScrollableContainer implements DrawableElement, ContainerElement {
for(Element child : childList){
if(child instanceof DrawableElement){
DrawableElement drawableChild = (DrawableElement) child;
drawableChild.draw(renderPipelineState,openGLState,widgetBuffer.getFramebufferPointer(),width,height);
drawableChild.draw(renderPipelineState,openGLState,widgetBuffer.getFramebufferPointer(),0,0,width,height);
}
}
//this call binds the screen as the "texture" we're rendering to
@ -253,12 +166,23 @@ public class ScrollableContainer implements DrawableElement, ContainerElement {
glBindFramebuffer(GL_FRAMEBUFFER, parentFramebufferPointer);
openGLState.glViewport(parentWidth, parentHeight);
Model planeModel = Globals.assetManager.fetchModel(Globals.imagePlaneModelID);
//render background of window
if(planeModel != null && windowFrame != null){
planeModel.pushUniformToMesh("plane", "mPosition", boxPosition);
planeModel.pushUniformToMesh("plane", "mDimension", boxDimensions);
planeModel.pushUniformToMesh("plane", "tPosition", texPosition);
planeModel.pushUniformToMesh("plane", "tDimension", texScale);
customMat.setTexturePointer(windowFrame.getTexturePointer());
planeModel.getMeshes().get(0).setMaterial(customMat);
planeModel.drawUI();
}
if(planeModel != null){
planeModel.pushUniformToMesh("plane", "mPosition", boxPosition);
planeModel.pushUniformToMesh("plane", "mDimension", boxDimensions);
planeModel.pushUniformToMesh("plane", "tPosition", texPosition);
planeModel.pushUniformToMesh("plane", "tDimension", texScale);
customMat.setTexturePointer(widgetBuffer.getTexturePointer());
planeModel.getMeshes().get(0).setMaterial(customMat);
planeModel.drawUI();
} else {

View File

@ -22,16 +22,7 @@ import electrosphere.renderer.ui.events.FocusEvent;
import electrosphere.renderer.ui.events.MenuEvent;
import electrosphere.renderer.ui.events.ValueChangeEvent;
public class Slider implements ClickableElement, DraggableElement, FocusableElement, DrawableElement, MenuEventElement, ValueElement {
public int width = 1;
public int height = 1;
public int positionX = 0;
public int positionY = 0;
public int parentWidth = 1;
public int parentHeight = 1;
public class Slider extends StandardElement implements ClickableElement, DraggableElement, FocusableElement, DrawableElement, MenuEventElement, ValueElement {
public boolean visible = false;
@ -61,6 +52,7 @@ public class Slider implements ClickableElement, DraggableElement, FocusableElem
public Slider(int positionX, int positionY, int width, int height, Vector3f colorBackground, Vector3f colorForeground){
super();
this.positionX = positionX;
this.positionY = positionY;
this.width = width;
@ -72,7 +64,15 @@ public class Slider implements ClickableElement, DraggableElement, FocusableElem
@Override
public void draw(RenderPipelineState renderPipelineState, OpenGLState openGLState, int parentFramebufferPointer, int parentWidth, int parentHeight) {
public void draw(
RenderPipelineState renderPipelineState,
OpenGLState openGLState,
int parentFramebufferPointer,
int parentPosX,
int parentPosY,
int parentWidth,
int parentHeight
) {
Globals.renderingEngine.bindFramebuffer(parentFramebufferPointer);
openGLState.glViewport(parentWidth, parentHeight);
@ -153,58 +153,18 @@ public class Slider implements ClickableElement, DraggableElement, FocusableElem
this.value = value;
}
public int getWidth() {
return width;
}
float getValueAsPercentage(){
return (value - min) / (max - min);
}
public int getHeight() {
return height;
}
public int getPositionX() {
return positionX;
}
public int getPositionY() {
return positionY;
}
public boolean getVisible() {
return visible;
}
public void setWidth(int width) {
this.width = width;
}
public void setHeight(int height) {
this.height = height;
}
public void setPositionX(int posX) {
this.positionX = posX;
}
public void setPositionY(int posY) {
this.positionY = posY;
}
public void setVisible(boolean draw) {
this.visible = draw;
}
public void setParentWidth(int width){
parentWidth = width;
}
public void setParentHeight(int height){
this.parentHeight = height;
}
@Override
public boolean isFocused() {
return focused;

View File

@ -0,0 +1,260 @@
package electrosphere.renderer.ui.elements;
import java.util.LinkedList;
import java.util.List;
import org.lwjgl.util.yoga.Yoga;
import electrosphere.logger.LoggerInterface;
import electrosphere.renderer.ui.elementtypes.ContainerElement;
import electrosphere.renderer.ui.elementtypes.DrawableElement;
import electrosphere.renderer.ui.elementtypes.Element;
/**
* An element that contains other elements
*/
public class StandardContainerElement extends StandardElement implements ContainerElement {
List<Element> childList = new LinkedList<Element>();
@Override
public int getWidth() {
if(width == -1){
if(childList.size() > 0){
int minX = -1;
int maxX = -1;
for(Element child : childList){
if(minX == -1){
minX = child.getPositionX();
} else if(child.getPositionX() < minX){
minX = child.getPositionX();
}
if(maxX == -1){
maxX = child.getPositionX() + child.getWidth();
} else if(child.getPositionX() + child.getWidth() > maxX){
maxX = child.getPositionX() + child.getWidth();
}
}
if(minX == -1){
minX = 0;
}
if(maxX == -1){
maxX = 0;
}
return maxX - minX;
} else {
return 1;
}
} else {
return width;
}
}
@Override
public int getHeight() {
if(height == -1){
if(childList.size() > 0){
int minY = -1;
int maxY = -1;
for(Element child : childList){
if(minY == -1){
minY = child.getPositionY();
} else if(child.getPositionY() < minY){
minY = child.getPositionY();
}
if(maxY == -1){
maxY = child.getPositionY() + child.getHeight();
} else if(child.getPositionY() + child.getHeight() > maxY){
maxY = child.getPositionY() + child.getHeight();
}
}
if(minY == -1){
minY = 0;
}
if(maxY == -1){
maxY = 0;
}
return maxY - minY;
} else {
return 1;
}
} else {
return height;
}
}
@Override
public int getPositionX() {
if(positionX == -1){
if(childList.size() > 0){
int minX = -1;
for(Element child : childList){
if(minX == -1){
minX = child.getPositionX();
} else if(child.getPositionX() < minX){
minX = child.getPositionX();
}
}
if(minX == -1){
minX = 0;
}
return minX;
} else {
return internalPositionX;
}
} else {
return internalPositionX;
}
}
@Override
public int getPositionY() {
if(positionY == -1){
if(childList.size() > 0){
int minY = -1;
for(Element child : childList){
if(minY == -1){
minY = child.getPositionY();
} else if(child.getPositionY() < minY){
minY = child.getPositionY();
}
}
if(minY == -1){
minY = 0;
}
return minY;
} else {
return internalPositionY;
}
} else {
return internalPositionY;
}
}
@Override
public void setWidth(int width) {
this.width = width;
}
@Override
public void setHeight(int height) {
this.height = height;
}
@Override
public void setPositionX(int posX) {
int deltaX = posX - getPositionX();
this.positionX = posX;
for(Element child : childList){
child.setPositionX(child.getPositionX() + deltaX);
}
}
@Override
public void setPositionY(int posY) {
int deltaY = posY - getPositionY();
this.positionY = posY;
for(Element child : childList){
child.setPositionY(child.getPositionY() + deltaY);
}
}
@Override
public void setDirection(int layout) {
Yoga.YGNodeStyleSetDirection(yogaNode, layout);
}
@Override
public void setFlexDirection(int layout){
Yoga.YGNodeStyleSetFlexDirection(yogaNode, layout);
}
@Override
public void addChild(Element child) {
childList.add(child);
if(child instanceof DrawableElement){
DrawableElement drawableChild = (DrawableElement) child;
drawableChild.setParentWidth(width);
drawableChild.setParentHeight(height);
drawableChild.setVisible(true);
Yoga.YGNodeInsertChild(yogaNode, drawableChild.getYogaNode(), childList.size() - 1);
}
}
@Override
public List<Element> getChildren() {
return childList;
}
@Override
public void removeChild(Element child) {
childList.remove(child);
}
@Override
public int getChildOffsetX(){
return 0;
}
@Override
public int getChildOffsetY(){
return 0;
}
@Override
public float getChildScaleX(){
return 1;
}
@Override
public float getChildScaleY(){
return 1;
}
@Override
public void destroy(){
for(Element child : childList){
child.destroy();
}
Yoga.YGNodeFree(this.yogaNode);
}
@Override
public void applyYoga() {
//apply yoga values to all children
for(Element child : this.getChildren()){
child.applyYoga();
}
//get the values from yoga
float leftRaw = Yoga.YGNodeLayoutGetLeft(yogaNode);
float topRaw = Yoga.YGNodeLayoutGetTop(yogaNode);
float widthRaw = Yoga.YGNodeLayoutGetWidth(yogaNode);
float heightRaw = Yoga.YGNodeLayoutGetHeight(yogaNode);
LoggerInterface.loggerUI.INFO("" + this);
LoggerInterface.loggerUI.INFO(topRaw + " " + leftRaw + " " + heightRaw + " " + widthRaw);
//apply the values to this component
this.internalPositionX = (int)leftRaw;
this.internalPositionY = (int)topRaw;
this.internalWidth = (int)widthRaw;
this.internalHeight = (int)heightRaw;
}
@Override
public void setJustifyContent(int justification){
Yoga.YGNodeStyleSetJustifyContent(this.yogaNode, justification);
}
@Override
public void setAlignItems(int alignment){
Yoga.YGNodeStyleSetAlignItems(this.yogaNode, alignment);
}
@Override
public void setAlignContent(int alignment){
Yoga.YGNodeStyleSetAlignContent(this.yogaNode, alignment);
}
}

View File

@ -0,0 +1,180 @@
package electrosphere.renderer.ui.elements;
import org.lwjgl.util.yoga.Yoga;
import electrosphere.renderer.ui.elementtypes.Element;
import electrosphere.renderer.ui.events.Event;
/**
* An implementation of element
*/
public class StandardElement implements Element {
//these are set by the
public int width = -1;
public int height = -1;
public int positionX = -1;
public int positionY = -1;
public int parentWidth = 1;
public int parentHeight = 1;
int internalWidth;
int internalHeight;
int internalPositionX;
int internalPositionY;
public boolean visible = false;
//the yoga node id
long yogaNode = -1;
/**
* Constructor
*/
protected StandardElement(){
this.yogaNode = Yoga.YGNodeNew();
}
@Override
public int getWidth() {
return width;
}
@Override
public int getHeight() {
return height;
}
@Override
public int getPositionX() {
return internalPositionX;
}
@Override
public int getPositionY() {
return internalPositionY;
}
@Override
public void setWidth(int width) {
this.internalWidth = width;
this.width = width;
Yoga.YGNodeStyleSetWidth(this.yogaNode, width);
}
@Override
public void setHeight(int height) {
this.internalHeight = height;
this.height = height;
Yoga.YGNodeStyleSetHeight(this.yogaNode, height);
}
@Override
public void setPositionX(int posX) {
this.positionX = posX;
}
@Override
public void setPositionY(int posY) {
this.positionY = posY;
}
@Override
public void setParentWidth(int width) {
this.parentWidth = width;
}
@Override
public void setParentHeight(int height) {
this.parentHeight = height;
}
public void setMarginTop(int marginTop){
Yoga.YGNodeStyleSetMargin(this.yogaNode, Yoga.YGEdgeTop, marginTop);
}
public void setMarginRight(int marginRight){
Yoga.YGNodeStyleSetMargin(this.yogaNode, Yoga.YGEdgeRight, marginRight);
}
public void setMarginBottom(int marginBottom){
Yoga.YGNodeStyleSetMargin(this.yogaNode, Yoga.YGEdgeBottom, marginBottom);
}
public void setMarginLeft(int marginLeft){
Yoga.YGNodeStyleSetMargin(this.yogaNode, Yoga.YGEdgeLeft, marginLeft);
}
public int getInternalX(){
return internalPositionX;
}
public int getInternalY(){
return internalPositionY;
}
public int getInternalWidth(){
return internalWidth;
}
public int getInternalHeight(){
return internalHeight;
}
@Override
public void destroy(){
Yoga.YGNodeFree(this.yogaNode);
}
@Override
public long getYogaNode() {
return yogaNode;
}
@Override
public void applyYoga() {
//get the values from yoga
float leftRaw = Yoga.YGNodeLayoutGetLeft(yogaNode);
float topRaw = Yoga.YGNodeLayoutGetTop(yogaNode);
float widthRaw = Yoga.YGNodeLayoutGetWidth(yogaNode);
float heightRaw = Yoga.YGNodeLayoutGetHeight(yogaNode);
//apply the values to this component
this.internalPositionX = (int)leftRaw;
this.internalPositionY = (int)topRaw;
this.internalWidth = (int)widthRaw;
this.internalHeight = (int)heightRaw;
}
@Override
public boolean handleEvent(Event event) {
boolean propagate = true;
return propagate;
}
@Override
public void setMaxWidth(int width) {
Yoga.YGNodeStyleSetMaxWidth(yogaNode, width);
}
@Override
public void setMaxHeight(int height) {
Yoga.YGNodeStyleSetMaxHeight(yogaNode, height);
}
@Override
public void setMinWidth(int width) {
Yoga.YGNodeStyleSetMinWidth(yogaNode, width);
}
@Override
public void setMinHeight(int height) {
Yoga.YGNodeStyleSetMinHeight(yogaNode, height);
}
}

View File

@ -4,6 +4,7 @@ import java.util.LinkedList;
import java.util.List;
import org.joml.Vector3f;
import org.lwjgl.util.yoga.Yoga;
import electrosphere.engine.Globals;
import electrosphere.renderer.OpenGLState;
@ -19,19 +20,8 @@ import electrosphere.renderer.ui.events.MenuEvent;
import electrosphere.renderer.ui.events.ValueChangeEvent;
import electrosphere.renderer.ui.events.MenuEvent.MenuEventType;
import electrosphere.renderer.ui.font.Font;
import electrosphere.renderer.ui.font.FontUtils;
import electrosphere.renderer.ui.font.bitmapchar.BitmapCharacter;
public class StringCarousel implements DrawableElement, MenuEventElement, FocusableElement, ValueElement {
public int width = 1;
public int height = 1;
public int positionX = 0;
public int positionY = 0;
public int parentWidth = 1;
public int parentHeight = 1;
public class StringCarousel extends StandardContainerElement implements DrawableElement, MenuEventElement, FocusableElement, ValueElement {
public boolean visible = false;
@ -49,17 +39,14 @@ public class StringCarousel implements DrawableElement, MenuEventElement, Focusa
float fontSize = 1.0f;
List<BitmapCharacter> childrenElements = new LinkedList<BitmapCharacter>();
Font font;
public StringCarousel(int x, int y, float fontSize){
this.positionX = x;
this.positionY = y;
this.width = 0;
super();
this.font = Globals.fontManager.getFont("default");
this.height = (int)(font.getFontHeight() * fontSize);
this.fontSize = fontSize;
Yoga.YGNodeStyleSetMinHeight(this.yogaNode, font.imageHeight * fontSize);
Yoga.YGNodeStyleSetMinWidth(this.yogaNode, 1);
}
public void addOption(String option){
@ -85,14 +72,16 @@ public class StringCarousel implements DrawableElement, MenuEventElement, Focusa
}
void generateLetters(){
childrenElements.clear();
int rollingOffset = 0;
for(Element el : getChildren()){
Yoga.YGNodeRemoveChild(this.yogaNode,el.getYogaNode());
el.destroy();
}
childList.clear();
for(int i = 0; i < textCurrent.length(); i++){
char toDraw = textCurrent.charAt(i);
Vector3f bitMapDimension = this.font.getDimensionOfCharacterDiscrete(toDraw);
BitmapCharacter newLetter = new BitmapCharacter(this.font,(int)(rollingOffset * fontSize) + positionX, positionY, (int)(bitMapDimension.x * fontSize), this.height, toDraw);
rollingOffset += (int)bitMapDimension.x;
childrenElements.add(newLetter);
BitmapCharacter newLetter = new BitmapCharacter(this.font,(int)(bitMapDimension.x * fontSize), this.height, toDraw);
addChild(newLetter);
}
}
@ -110,8 +99,8 @@ public class StringCarousel implements DrawableElement, MenuEventElement, Focusa
}
public void setColor(Vector3f color){
for(BitmapCharacter character : childrenElements){
character.setColor(color);
for(Element character : childList){
((BitmapCharacter)character).setColor(color);
}
}
@ -120,130 +109,28 @@ public class StringCarousel implements DrawableElement, MenuEventElement, Focusa
}
@Override
public void draw(RenderPipelineState renderPipelineState, OpenGLState openGLState, int parentFramebufferPointer, int parentWidth, int parentHeight) {
for(DrawableElement child : childrenElements){
child.draw(renderPipelineState, openGLState, parentFramebufferPointer, parentWidth, parentHeight);
public void draw(
RenderPipelineState renderPipelineState,
OpenGLState openGLState,
int parentFramebufferPointer,
int parentPosX,
int parentPosY,
int parentWidth,
int parentHeight
) {
for(Element child : childList){
((DrawableElement)child).draw(renderPipelineState, openGLState, parentFramebufferPointer, parentPosX + this.internalPositionX, parentPosY + this.internalPositionY, parentWidth, parentHeight);
}
}
public int getWidth() {
int minX = -1;
int maxX = -1;
for(BitmapCharacter child : childrenElements){
if(minX == -1){
minX = child.getPositionX();
} else if(child.getPositionX() < minX){
minX = child.getPositionX();
}
if(maxX == -1){
maxX = child.getPositionX() + child.getWidth();
} else if(child.getPositionX() + child.getWidth() > maxX){
maxX = child.getPositionX() + child.getWidth();
}
}
if(minX == -1){
minX = 0;
}
if(maxX == -1){
maxX = 0;
}
return maxX - minX;
}
public int getHeight() {
int minY = -1;
int maxY = -1;
for(BitmapCharacter child : childrenElements){
if(minY == -1){
minY = child.getPositionY();
} else if(child.getPositionY() < minY){
minY = child.getPositionY();
}
if(maxY == -1){
maxY = child.getPositionY() + child.getHeight();
} else if(child.getPositionY() + child.getHeight() > maxY){
maxY = child.getPositionY() + child.getHeight();
}
}
if(minY == -1){
minY = 0;
}
if(maxY == -1){
maxY = 0;
}
return maxY - minY;
}
public int getPositionX() {
int minX = -1;
for(BitmapCharacter child : childrenElements){
if(minX == -1){
minX = child.getPositionX();
} else if(child.getPositionX() < minX){
minX = child.getPositionX();
}
}
if(minX == -1){
minX = 0;
}
return minX;
}
public int getPositionY() {
int minY = -1;
for(BitmapCharacter child : childrenElements){
if(minY == -1){
minY = child.getPositionY();
} else if(child.getPositionY() < minY){
minY = child.getPositionY();
}
}
if(minY == -1){
minY = 0;
}
return minY;
}
public boolean getVisible() {
return visible;
}
public void setWidth(int width) {
this.width = width;
}
public void setHeight(int height) {
this.height = height;
}
public void setPositionX(int posX) {
int deltaX = posX - this.positionX;
this.positionX = posX;
for(Element child : childrenElements){
child.setPositionX(child.getPositionX() + deltaX);
}
}
public void setPositionY(int posY) {
int deltaY = posY - this.positionY;
this.positionY = posY;
for(Element child : childrenElements){
child.setPositionY(child.getPositionY() + deltaY);
}
}
public void setVisible(boolean draw) {
this.visible = draw;
}
public void setParentWidth(int width){
parentWidth = width;
}
public void setParentHeight(int height){
this.parentHeight = height;
}
public boolean handleEvent(Event event){
boolean propagate = true;
if(event instanceof MenuEvent){

View File

@ -1,16 +1,12 @@
package electrosphere.renderer.ui.elements;
import electrosphere.engine.Globals;
import electrosphere.engine.assetmanager.AssetDataStrings;
import electrosphere.renderer.OpenGLState;
import electrosphere.renderer.RenderPipelineState;
import electrosphere.renderer.model.Model;
import electrosphere.renderer.ui.elementtypes.DrawableElement;
import electrosphere.renderer.ui.events.Event;
import electrosphere.renderer.ui.font.FontUtils;
import org.joml.Vector3f;
public class TextBox implements DrawableElement {
public class TextBox extends StandardContainerElement implements DrawableElement {
String text;
@ -19,19 +15,13 @@ public class TextBox implements DrawableElement {
Vector3f scalar;
public TextBox(int positionX, int positionY, int width, int height, String text, boolean render, boolean editable) {
this.positionX = positionX;
this.positionY = positionY;
this.width = width;
this.height = height;
super();
this.text = text;
scalar = new Vector3f(1,1,1);
}
public TextBox(int positionX, int positionY, int width, int height, String text, boolean render, boolean editable, Vector3f scalar) {
this.positionX = positionX;
this.positionY = positionY;
this.width = width;
this.height = height;
super();
this.text = text;
this.scalar = scalar;
}
@ -54,7 +44,15 @@ public class TextBox implements DrawableElement {
@Override
public void draw(RenderPipelineState renderPipelineState, OpenGLState openGLState, int parentFramebufferPointer, int parentWidth, int parentHeight){
public void draw(
RenderPipelineState renderPipelineState,
OpenGLState openGLState,
int parentFramebufferPointer,
int parentPosX,
int parentPosY,
int parentWidth,
int parentHeight
){
throw new UnsupportedOperationException("Transparent Text box draw function not implemented yet oop");
// float ndcX = (float)positionX/Globals.WINDOW_WIDTH;
// float ndcY = (float)positionY/Globals.WINDOW_HEIGHT;
@ -86,65 +84,14 @@ public class TextBox implements DrawableElement {
// }
}
public int width = 1;
public int height = 1;
public int positionX = 0;
public int positionY = 0;
public int parentWidth = 1;
public int parentHeight = 1;
public boolean visible = false;
public int getWidth() {
return width;
}
public int getHeight() {
return height;
}
public int getPositionX() {
return positionX;
}
public int getPositionY() {
return positionY;
}
public boolean getVisible() {
return visible;
}
public void setWidth(int width) {
this.width = width;
}
public void setHeight(int height) {
this.height = height;
}
public void setPositionX(int positionX) {
this.positionX = positionX;
}
public void setPositionY(int positionY) {
this.positionY = positionY;
}
public void setVisible(boolean draw) {
this.visible = draw;
}
public void setParentWidth(int width){
parentWidth = width;
}
public void setParentHeight(int height){
this.parentHeight = height;
}
public boolean handleEvent(Event event){
return true;
}

View File

@ -1,47 +1,39 @@
package electrosphere.renderer.ui.elements;
import electrosphere.engine.Globals;
import electrosphere.engine.assetmanager.AssetDataStrings;
import electrosphere.logger.LoggerInterface;
import electrosphere.renderer.OpenGLState;
import electrosphere.renderer.RenderPipelineState;
import electrosphere.renderer.framebuffer.Framebuffer;
import electrosphere.renderer.framebuffer.FramebufferUtils;
import electrosphere.renderer.model.Material;
import electrosphere.renderer.model.Model;
import electrosphere.renderer.texture.Texture;
import electrosphere.renderer.ui.elementtypes.ClickableElement;
import electrosphere.renderer.ui.elementtypes.DrawableElement;
import electrosphere.renderer.ui.elementtypes.Element;
import electrosphere.renderer.ui.elementtypes.FocusableElement;
import electrosphere.renderer.ui.elementtypes.KeyEventElement;
import electrosphere.renderer.ui.events.ClickEvent;
import electrosphere.renderer.ui.events.Event;
import electrosphere.renderer.ui.events.FocusEvent;
import electrosphere.renderer.ui.events.KeyboardEvent;
import electrosphere.renderer.ui.font.Font;
import electrosphere.renderer.ui.font.FontUtils;
import electrosphere.renderer.ui.font.bitmapchar.BitmapCharacter;
import org.joml.Vector3f;
import static org.lwjgl.opengl.GL30.GL_FRAMEBUFFER;
import static org.lwjgl.opengl.GL30.glBindFramebuffer;
import org.lwjgl.opengl.GL30;
import org.lwjgl.util.yoga.Yoga;
import java.util.LinkedList;
import java.util.List;
import java.util.regex.Pattern;
/**
*
* @author amaterasu
* A Text input
*/
public class TextInput implements DrawableElement, FocusableElement, KeyEventElement {
public class TextInput extends StandardContainerElement implements DrawableElement, FocusableElement, KeyEventElement, ClickableElement {
public int width = 1;
public int height = 1;
public int positionX = 0;
public int positionY = 0;
public int parentWidth = 1;
public int parentHeight = 1;
Vector3f boxPosition = new Vector3f();
Vector3f boxDimensions = new Vector3f();
Vector3f texPosition = new Vector3f(0,0,0);
Vector3f texScale = new Vector3f(1,1,0);
Material customMat = new Material();
public boolean visible = false;
@ -49,6 +41,7 @@ public class TextInput implements DrawableElement, FocusableElement, KeyEventEle
FocusEventCallback onFocusCallback;
FocusEventCallback onLoseFocusCallback;
KeyboardEventCallback onKeyPressCallback;
ClickEventCallback onClickCallback;
Vector3f color;
String text = "";
@ -56,30 +49,38 @@ public class TextInput implements DrawableElement, FocusableElement, KeyEventEle
float fontSize = 1.0f;
List<BitmapCharacter> childrenElements = new LinkedList<BitmapCharacter>();
Font font;
/**
* Constructor
* @param x
* @param y
* @param fontSize
*/
public TextInput(int x, int y, float fontSize){
this.positionX = x;
this.positionY = y;
this.width = 0;
super();
this.font = Globals.fontManager.getFont("default");
this.height = (int)(this.font.getFontHeight() * fontSize);
this.fontSize = fontSize;
this.color = new Vector3f(1,1,1);
setHeight((int)(font.getFontHeight() * fontSize));
Yoga.YGNodeStyleSetFlexDirection(this.yogaNode, Yoga.YGFlexDirectionRow);
Yoga.YGNodeStyleSetMinHeight(this.yogaNode, font.imageHeight * fontSize);
Yoga.YGNodeStyleSetMinWidth(this.yogaNode, 1);
}
void generateLetters(){
childrenElements.clear();
int rollingOffset = 0;
for(Element el : getChildren()){
Yoga.YGNodeRemoveChild(this.yogaNode,el.getYogaNode());
el.destroy();
}
childList.clear();
for(int i = 0; i < text.length(); i++){
char toDraw = text.charAt(i);
Vector3f bitMapDimension = this.font.getDimensionOfCharacterDiscrete(toDraw);
BitmapCharacter newLetter = new BitmapCharacter(this.font,(int)(rollingOffset * fontSize) + positionX, positionY, (int)(bitMapDimension.x * fontSize), this.height, toDraw);
BitmapCharacter newLetter = new BitmapCharacter(this.font,(int)(bitMapDimension.x * fontSize), this.height, toDraw);
newLetter.setColor(color);
rollingOffset += (int)bitMapDimension.x;
childrenElements.add(newLetter);
this.addChild(newLetter);
}
}
@ -95,8 +96,8 @@ public class TextInput implements DrawableElement, FocusableElement, KeyEventEle
public void setColor(Vector3f color){
this.color.set(color);
for(BitmapCharacter character : childrenElements){
character.setColor(color);
for(Element character : childList){
((BitmapCharacter)character).setColor(color);
}
}
@ -105,138 +106,70 @@ public class TextInput implements DrawableElement, FocusableElement, KeyEventEle
}
@Override
public void draw(RenderPipelineState renderPipelineState, OpenGLState openGLState, int parentFramebufferPointer, int parentWidth, int parentHeight) {
for(DrawableElement child : childrenElements){
child.draw(renderPipelineState, openGLState, parentFramebufferPointer, parentWidth, parentHeight);
}
}
public void draw(
RenderPipelineState renderPipelineState,
OpenGLState openGLState,
int parentFramebufferPointer,
int parentPosX,
int parentPosY,
int parentWidth,
int parentHeight
) {
//
//Draw decorations
public int getWidth() {
int minX = -1;
int maxX = -1;
for(BitmapCharacter child : childrenElements){
if(minX == -1){
minX = child.getPositionX();
} else if(child.getPositionX() < minX){
minX = child.getPositionX();
}
if(maxX == -1){
maxX = child.getPositionX() + child.getWidth();
} else if(child.getPositionX() + child.getWidth() > maxX){
maxX = child.getPositionX() + child.getWidth();
}
}
if(minX == -1){
minX = 0;
}
if(maxX == -1){
maxX = 0;
}
return maxX - minX;
}
float ndcWidth = (float)getInternalWidth()/parentWidth;
float ndcHeight = (float)getInternalHeight()/parentHeight;
float ndcX = (float)(getInternalX() + parentPosX)/parentWidth;
float ndcY = (float)(getInternalY() + parentPosY)/parentHeight;
boxPosition = new Vector3f(ndcX,ndcY,0);
boxDimensions = new Vector3f(ndcWidth,ndcHeight,0);
public int getHeight() {
int minY = -1;
int maxY = -1;
for(BitmapCharacter child : childrenElements){
if(minY == -1){
minY = child.getPositionY();
} else if(child.getPositionY() < minY){
minY = child.getPositionY();
}
if(maxY == -1){
maxY = child.getPositionY() + child.getHeight();
} else if(child.getPositionY() + child.getHeight() > maxY){
maxY = child.getPositionY() + child.getHeight();
}
Model planeModel = Globals.assetManager.fetchModel(Globals.imagePlaneModelID);
Texture windowFrame = null;
if(this.isFocused()){
windowFrame = Globals.assetManager.fetchTexture("Textures/ui/uiFrame2.png");
} else {
windowFrame = Globals.assetManager.fetchTexture("Textures/ui/uiFrame1.png");
}
if(minY == -1){
minY = 0;
}
if(maxY == -1){
maxY = 0;
}
return maxY - minY;
}
public int getPositionX() {
int minX = -1;
for(BitmapCharacter child : childrenElements){
if(minX == -1){
minX = child.getPositionX();
} else if(child.getPositionX() < minX){
minX = child.getPositionX();
}
}
if(minX == -1){
if(positionX == 0){
minX = 0;
} else {
minX = positionX;
}
}
return minX;
}
//this call binds the screen as the "texture" we're rendering to
//have to call before actually rendering
GL30.glBindFramebuffer(GL30.GL_FRAMEBUFFER, parentFramebufferPointer);
openGLState.glViewport(parentWidth, parentHeight);
public int getPositionY() {
int minY = -1;
for(BitmapCharacter child : childrenElements){
if(minY == -1){
minY = child.getPositionY();
} else if(child.getPositionY() < minY){
minY = child.getPositionY();
}
//error if assets are null
if(planeModel == null || windowFrame == null){
LoggerInterface.loggerRenderer.ERROR("Window unable to find plane model or window frame!!", new Exception());
}
if(minY == -1){
if(positionY == 0){
minY = 0;
} else {
minY = positionY;
}
//render background of window
if(planeModel != null && windowFrame != null){
planeModel.pushUniformToMesh("plane", "mPosition", boxPosition);
planeModel.pushUniformToMesh("plane", "mDimension", boxDimensions);
planeModel.pushUniformToMesh("plane", "tPosition", texPosition);
planeModel.pushUniformToMesh("plane", "tDimension", texScale);
customMat.setTexturePointer(windowFrame.getTexturePointer());
planeModel.getMeshes().get(0).setMaterial(customMat);
planeModel.drawUI();
}
//
//Draw children elements
for(Element child : childList){
((DrawableElement)child).draw(renderPipelineState, openGLState, parentFramebufferPointer, parentPosX + this.internalPositionX, parentPosY + this.internalPositionY, parentWidth, parentHeight);
}
return minY;
}
public boolean getVisible() {
return visible;
}
public void setWidth(int width) {
this.width = width;
}
public void setHeight(int height) {
this.height = height;
}
public void setPositionX(int posX) {
int deltaX = posX - this.positionX;
this.positionX = posX;
for(Element child : childrenElements){
child.setPositionX(child.getPositionX() + deltaX);
}
}
public void setPositionY(int posY) {
int deltaY = posY - this.positionY;
this.positionY = posY;
for(Element child : childrenElements){
child.setPositionY(child.getPositionY() + deltaY);
}
}
public void setVisible(boolean draw) {
this.visible = draw;
}
public void setParentWidth(int width){
parentWidth = width;
}
public void setParentHeight(int height){
this.parentHeight = height;
}
public boolean handleEvent(Event event){
boolean propagate = true;
if(event instanceof FocusEvent){
@ -245,6 +178,7 @@ public class TextInput implements DrawableElement, FocusableElement, KeyEventEle
if(this.onFocusCallback != null){
this.onFocusCallback.execute(focusEvent);
} else {
this.focused = true;
this.setColor(new Vector3f(1,0,0));
propagate = false;
}
@ -252,6 +186,7 @@ public class TextInput implements DrawableElement, FocusableElement, KeyEventEle
if(this.onLoseFocusCallback != null){
this.onLoseFocusCallback.execute(focusEvent);
} else {
this.focused = false;
this.setColor(new Vector3f(1,1,1));
propagate = false;
}
@ -270,6 +205,14 @@ public class TextInput implements DrawableElement, FocusableElement, KeyEventEle
}
propagate = false;
}
} else if(event instanceof ClickEvent){
ClickEvent clickEvent = (ClickEvent)event;
if(onClickCallback != null){
onClickCallback.execute(clickEvent);
} else {
Globals.elementManager.focusElement(this);
propagate = false;
}
}
return propagate;
}
@ -294,4 +237,9 @@ public class TextInput implements DrawableElement, FocusableElement, KeyEventEle
onKeyPressCallback = callback;
}
@Override
public void setOnClick(ClickEventCallback callback) {
onClickCallback = callback;
}
}

View File

@ -0,0 +1,151 @@
package electrosphere.renderer.ui.elements;
import org.lwjgl.util.yoga.Yoga;
import electrosphere.renderer.OpenGLState;
import electrosphere.renderer.RenderPipelineState;
import electrosphere.renderer.ui.elementtypes.DrawableElement;
import electrosphere.renderer.ui.elementtypes.Element;
import electrosphere.renderer.ui.elementtypes.ScrollableElement;
import electrosphere.renderer.ui.events.Event;
import electrosphere.renderer.ui.events.ScrollEvent;
/**
* A scrollable container that renders to it's parent framebuffer instead of a dedicated one
*/
public class VirtualScrollable extends StandardContainerElement implements DrawableElement, ScrollableElement {
//the current amount of scroll applied to this element
double scroll = 0;
//the scrollable callback
ScrollEventCallback callback;
//should we draw this element
boolean visible = true;
/**
* Constructor
*/
public VirtualScrollable(int width, int height){
super();
setWidth(width);
setHeight(height);
Yoga.YGNodeStyleSetOverflow(this.yogaNode, Yoga.YGOverflowScroll);
}
@Override
public void draw(
RenderPipelineState renderPipelineState,
OpenGLState openGLState,
int parentFramebufferPointer,
int parentPosX,
int parentPosY,
int parentWidth,
int parentHeight
) {
for(Element child : childList){
if(child instanceof DrawableElement){
DrawableElement drawableChild = (DrawableElement) child;
if(childIsInBounds(drawableChild)){
drawableChild.draw(
renderPipelineState,
openGLState,
parentFramebufferPointer,
parentPosX + internalPositionX,
(int)(parentPosY + internalPositionY + scroll),
parentWidth,
parentHeight
);
}
}
}
}
/**
* Checks if a given child element should be visible
* @param element the element
* @return true if visible, false otherwise
*/
private boolean childIsInBounds(DrawableElement element){
boolean rVal = true;
if(element.getInternalY() + scroll < 0 ||element.getInternalY() + scroll > this.height){
return false;
}
return rVal;
}
@Override
public boolean getVisible() {
return visible;
}
@Override
public void setVisible(boolean draw) {
this.visible = draw;
}
@Override
public void setWidth(int width) {
this.internalWidth = width;
this.width = width;
Yoga.YGNodeStyleSetWidth(this.yogaNode, width);
}
@Override
public void setHeight(int height) {
this.internalHeight = height;
this.height = height;
Yoga.YGNodeStyleSetHeight(this.yogaNode, height);
}
@Override
public int getChildOffsetY(){
return (int)scroll;
}
@Override
public void setOnScrollCallback(ScrollEventCallback callback) {
this.callback = callback;
}
/**
* Default handling for the scroll event
* @param event The scroll event
*/
private void defaultScrollHandling(ScrollEvent event){
scroll = scroll + event.getScrollAmount();
if(scroll > 0){
scroll = 0;
}
//calculate max scroll
double maxScroll = 0;
for(Element child : this.getChildren()){
if(child.getInternalY() + child.getInternalHeight() > maxScroll){
maxScroll = child.getInternalY() + child.getInternalHeight() - this.internalHeight;
}
}
if(scroll < - maxScroll){
scroll = -maxScroll;
}
for(Element childElement : this.getChildren()){
childElement.setPositionX((int)(childElement.getInternalX() + scroll));
}
}
@Override
public boolean handleEvent(Event event){
boolean propagate = true;
if(event instanceof ScrollEvent){
ScrollEvent scrollEvent = (ScrollEvent)event;
if(callback != null){
propagate = callback.execute(scrollEvent);
} else {
defaultScrollHandling(scrollEvent);
propagate = false;
}
}
return propagate;
}
}

View File

@ -2,12 +2,66 @@ package electrosphere.renderer.ui.elementtypes;
import java.util.List;
/**
* An element that can contain other elements (label, button, div, etc)
*/
public interface ContainerElement extends Element {
/**
* Add a child element to this element
* @param child The child element
*/
public void addChild(Element child);
/**
* Gets the list of children elements
* @return The list of child elements
*/
public List<Element> getChildren();
/**
* Removes a child from this element
* @param child The child
*/
public void removeChild(Element child);
//gets the offset applied to all children
//ie if you scrolled up, how much are the children offset by that
public int getChildOffsetX();
public int getChildOffsetY();
//Gets the scaling applied to all children
public float getChildScaleX();
public float getChildScaleY();
/**
* Sets the flex layout order of this component
* @param layout The order
*/
public void setDirection(int layout);
/**
* Sets the flex direction
* @param layout the flex direction
*/
public void setFlexDirection(int layout);
/**
* Sets the content justification of the container
* @param justification The spacing value
*/
public void setJustifyContent(int justification);
/**
* Sets the item alignment
* @param alignment The alignment style
*/
public void setAlignItems(int alignment);
/**
* Sets the content alignment
* @param alignment the alignment style
*/
public void setAlignContent(int alignment);
}

View File

@ -4,16 +4,33 @@ import electrosphere.renderer.OpenGLState;
import electrosphere.renderer.RenderPipelineState;
/**
*
* @author amaterasu
* A UI Element that is actually drawable to the screen
*/
public interface DrawableElement extends Element {
/**
* Gets if the drawable is currently set to visible
* @return true if visible, false otherwise
*/
public boolean getVisible();
/**
* Sets the visibility status of the element
* @param draw true for visible, false otherwise
*/
public void setVisible(boolean draw);
public abstract void draw(RenderPipelineState renderPipelineState, OpenGLState openGLState, int parentFramebufferPointer, int parentWidth, int parentHeight);
/**
* Draws the element
* @param renderPipelineState The render pipeline state
* @param openGLState The opengl state
* @param parentFramebufferPointer The parent's framebuffer pointer
* @param parentPosX the parent's position x
* @param parentPosY the parent's position y
* @param parentWidth the parent's width
* @param parentHeight the parent's height
*/
public abstract void draw(RenderPipelineState renderPipelineState, OpenGLState openGLState, int parentFramebufferPointer, int parentPosX, int parentPosY, int parentWidth, int parentHeight);
}

View File

@ -4,26 +4,83 @@ import electrosphere.renderer.ui.events.Event;
public interface Element {
//width and height
public int getWidth();
public int getHeight();
public int getPositionX();
public int getPositionY();
public void setWidth(int width);
public void setHeight(int height);
public void setMaxWidth(int width);
public void setMaxHeight(int height);
public void setMinWidth(int width);
public void setMinHeight(int height);
//position
public int getPositionX();
public int getPositionY();
public void setPositionX(int positionX);
public void setPositionY(int positionY);
//parent data
public void setParentWidth(int width);
public void setParentHeight(int height);
//margin
public void setMarginTop(int marginTop);
public void setMarginRight(int marginRight);
public void setMarginBottom(int marginBottom);
public void setMarginLeft(int marginLeft);
//
// I N T E R N A L
//
/**
* Gets the internal x position. This is the position x value used by the layout manager. It corresponds to what is actually displayed.
* @return The internal position x coordinate
*/
public int getInternalX();
/**
* Gets the internal y position. This is the position y value used by the layout manager. It corresponds to what is actually displayed.
* @return The internal position y coordinate
*/
public int getInternalY();
/**
* Gets the internal width. This is the width value used by the layout manager. It corresponds to what is actually displayed.
* @return The internal width
*/
public int getInternalWidth();
/**
* Gets the internal height. This is the height value used by the layout manager. It corresponds to what is actually displayed.
* @return The internal height
*/
public int getInternalHeight();
//
//Maintenance related
//
public void destroy();
//
// Y O G A
//
/**
* Gets the yoga node id
* @return the yoga node id
*/
public long getYogaNode();
/**
* Applies the yoga values to this component
*/
public void applyYoga();
//
// E V E N T S
//
/**
*
* @param event the even to handle

View File

@ -0,0 +1,30 @@
package electrosphere.renderer.ui.elementtypes;
import electrosphere.renderer.ui.events.ScrollEvent;
/**
* An element that accepts scroll event
*/
public interface ScrollableElement extends Element {
/**
* Sets the scroll event handler for the element
* @param callback
*/
public void setOnScrollCallback(ScrollEventCallback callback);
/**
* A callback that handles scroll events
*/
public interface ScrollEventCallback {
/**
*
* @param event
* @return
*/
public boolean execute(ScrollEvent event);
}
}

View File

@ -1,5 +1,8 @@
package electrosphere.renderer.ui.events;
/**
* A UI Event
*/
public interface Event {
}

View File

@ -0,0 +1,49 @@
package electrosphere.renderer.ui.events;
/**
* Fired when the user scrolls the mouse wheel
*/
public class ScrollEvent implements Event {
//the amount scrolled by
double scrollAmount;
double mouseX;
double mouseY;
/**
* Constructor
* @param scrollAmount
*/
public ScrollEvent(double mouseX, double mouseY, double scrollAmount){
this.scrollAmount = scrollAmount;
this.mouseX = mouseX;
this.mouseY = mouseY;
}
/**
* Gets the amount scrolled by
* @return
*/
public double getScrollAmount(){
return this.scrollAmount;
}
/**
* Gets the x position of the mouse
* @return
*/
public double getMouseX(){
return mouseX;
}
/**
* Gets the y position of the mouse
* @return
*/
public double getMouseY(){
return mouseY;
}
}

View File

@ -6,7 +6,6 @@ import java.util.HashMap;
import java.util.Map;
import electrosphere.logger.LoggerInterface;
import electrosphere.renderer.model.Material;
import electrosphere.util.FileUtils;
/**

View File

@ -93,7 +93,7 @@ public class FontUtils {
imageHeight = Math.max(imageHeight, ch.getHeight());
}
int fontHeight = imageHeight;
// int fontHeight = imageHeight;
//create font bitmap
BufferedImage image = new BufferedImage(imageWidth, imageHeight, BufferedImage.TYPE_INT_ARGB);

View File

@ -1,203 +0,0 @@
package electrosphere.renderer.ui.form;
import java.util.LinkedList;
import java.util.List;
import electrosphere.renderer.OpenGLState;
import electrosphere.renderer.RenderPipelineState;
import electrosphere.renderer.ui.elementtypes.ContainerElement;
import electrosphere.renderer.ui.elementtypes.DrawableElement;
import electrosphere.renderer.ui.elementtypes.Element;
import electrosphere.renderer.ui.events.Event;
public class FormElement implements DrawableElement, ContainerElement {
List<Element> childList = new LinkedList<Element>();
public void draw(RenderPipelineState renderPipelineState, OpenGLState openGLState, int parentFramebufferPointer, int parentWidth, int parentHeight) {
for(Element child : childList){
if(child instanceof DrawableElement){
DrawableElement drawableChild = (DrawableElement) child;
drawableChild.draw(renderPipelineState,openGLState,parentFramebufferPointer,parentWidth,parentHeight);
}
}
}
public int width = 1;
public int height = 1;
public int positionX = 0;
public int positionY = 0;
public int parentWidth = 1;
public int parentHeight = 1;
public boolean visible = false;
public boolean focused = false;
public void onFocus(){
}
public int getWidth() {
int minX = -1;
int maxX = -1;
for(Element child : childList){
if(minX == -1){
minX = child.getPositionX();
} else if(child.getPositionX() < minX){
minX = child.getPositionX();
}
if(maxX == -1){
maxX = child.getPositionX() + child.getWidth();
} else if(child.getPositionX() + child.getWidth() > maxX){
maxX = child.getPositionX() + child.getWidth();
}
}
if(minX == -1){
minX = 0;
}
if(maxX == -1){
maxX = 0;
}
return maxX - minX;
}
public int getHeight() {
int minY = -1;
int maxY = -1;
for(Element child : childList){
if(minY == -1){
minY = child.getPositionY();
} else if(child.getPositionY() < minY){
minY = child.getPositionY();
}
if(maxY == -1){
maxY = child.getPositionY() + child.getHeight();
} else if(child.getPositionY() + child.getHeight() > maxY){
maxY = child.getPositionY() + child.getHeight();
}
}
if(minY == -1){
minY = 0;
}
if(maxY == -1){
maxY = 0;
}
return maxY - minY;
}
public int getPositionX() {
int minX = -1;
for(Element child : childList){
if(minX == -1){
minX = child.getPositionX();
} else if(child.getPositionX() < minX){
minX = child.getPositionX();
}
}
if(minX == -1){
minX = 0;
}
return minX;
}
public int getPositionY() {
int minY = -1;
for(Element child : childList){
if(minY == -1){
minY = child.getPositionY();
} else if(child.getPositionY() < minY){
minY = child.getPositionY();
}
}
if(minY == -1){
minY = 0;
}
return minY;
}
public boolean getVisible() {
return visible;
}
public boolean isFocused(){
return focused;
}
public void setWidth(int width) {
this.width = width;
}
public void setHeight(int height) {
this.height = height;
}
public void setPositionX(int positionX) {
this.positionX = positionX;
}
public void setPositionY(int positionY) {
this.positionY = positionY;
}
public void setVisible(boolean draw) {
this.visible = draw;
for(Element child : childList){
if(child instanceof DrawableElement){
DrawableElement drawableChild = (DrawableElement) child;
drawableChild.setVisible(draw);
}
}
}
public void setParentWidth(int width){
parentWidth = width;
for(Element child : childList){
if(child instanceof DrawableElement){
DrawableElement drawableChild = (DrawableElement) child;
drawableChild.setParentWidth(width);
}
}
}
public void setParentHeight(int height){
this.parentHeight = height;
for(Element child : childList){
if(child instanceof DrawableElement){
DrawableElement drawableChild = (DrawableElement) child;
drawableChild.setParentWidth(width);
}
}
}
public void setFocused(boolean focused){
this.focused = focused;
}
@Override
public void addChild(Element child) {
childList.add(child);
if(child instanceof DrawableElement){
DrawableElement drawableChild = (DrawableElement) child;
drawableChild.setParentWidth(width);
drawableChild.setParentHeight(height);
drawableChild.setVisible(false);
}
}
@Override
public List<Element> getChildren() {
return childList;
}
@Override
public void removeChild(Element child) {
childList.remove(child);
}
public boolean handleEvent(Event event){
return true;
}
}

View File

@ -1,10 +1,7 @@
package electrosphere.renderer.ui.layout;
import java.util.LinkedList;
import java.util.List;
import electrosphere.renderer.ui.elementtypes.ContainerElement;
import electrosphere.renderer.ui.elementtypes.DrawableElement;
/**
*

View File

@ -1,178 +0,0 @@
package electrosphere.renderer.ui.layout;
import static org.lwjgl.opengl.GL11.GL_COLOR_BUFFER_BIT;
import static org.lwjgl.opengl.GL11.GL_DEPTH_BUFFER_BIT;
import static org.lwjgl.opengl.GL11.glClear;
import static org.lwjgl.opengl.GL11.glClearColor;
import static org.lwjgl.opengl.GL30.GL_FRAMEBUFFER;
import static org.lwjgl.opengl.GL30.glBindFramebuffer;
import java.util.LinkedList;
import java.util.List;
import org.joml.Vector3f;
import electrosphere.engine.Globals;
import electrosphere.renderer.OpenGLState;
import electrosphere.renderer.RenderPipelineState;
import electrosphere.renderer.debug.DebugRendering;
import electrosphere.renderer.framebuffer.Framebuffer;
import electrosphere.renderer.framebuffer.FramebufferUtils;
import electrosphere.renderer.model.Material;
import electrosphere.renderer.model.Model;
import electrosphere.renderer.ui.elementtypes.DrawableElement;
import electrosphere.renderer.ui.elementtypes.Element;
import electrosphere.renderer.ui.events.Event;
/**
*
* @author amaterasu
*/
public class LayoutSchemeListScrollable implements DrawableElement,LayoutScheme {
List<Element> childList = new LinkedList<Element>();
Framebuffer widgetBuffer = FramebufferUtils.generateScreensizeTextureFramebuffer();
Material customMat = new Material();
Vector3f boxPosition = new Vector3f();
Vector3f boxDimensions = new Vector3f();
Vector3f texPosition = new Vector3f(0,0,0);
Vector3f texScale = new Vector3f(1,1,0);
static final Vector3f windowDrawDebugColor = new Vector3f(0.0f,1.0f,0.0f);
public LayoutSchemeListScrollable(int positionX, int positionY, int width, int height, boolean draw){
customMat.setTexturePointer(widgetBuffer.getTexturePointer());
// customMat.setTexturePointer(Globals.assetManager.fetchTexture("Textures/Branch.png").getTexturePointer());
float ndcX = (float)positionX/Globals.WINDOW_WIDTH;
float ndcY = (float)positionY/Globals.WINDOW_HEIGHT;
float ndcWidth = (float)width/Globals.WINDOW_WIDTH;
float ndcHeight = (float)height/Globals.WINDOW_HEIGHT;
boxPosition = new Vector3f(ndcX,ndcY,0);
boxDimensions = new Vector3f(ndcWidth,ndcHeight,0);
}
static float aaaa = 0;
@Override
public void draw(RenderPipelineState renderPipelineState, OpenGLState openGLState, int parentFramebufferPointer, int parentWidth, int parentHeight) {
widgetBuffer.bind();
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
for(Element child : childList){
if(child instanceof DrawableElement){
DrawableElement drawableChild = (DrawableElement) child;
drawableChild.draw(renderPipelineState,openGLState,widgetBuffer.getFramebufferPointer(),width,height);
}
}
//this call binds the screen as the "texture" we're rendering to
//have to call before actually rendering
glBindFramebuffer(GL_FRAMEBUFFER, 0);
aaaa = aaaa + 0.0005f;
if(aaaa > 1){
aaaa = -1;
}
texPosition.y = aaaa;
Model planeModel = Globals.assetManager.fetchModel(Globals.imagePlaneModelID);
planeModel.pushUniformToMesh("plane", "mPosition", boxPosition);
planeModel.pushUniformToMesh("plane", "mDimension", boxDimensions);
planeModel.pushUniformToMesh("plane", "tPosition", texPosition);
planeModel.pushUniformToMesh("plane", "tDimension", texScale);
planeModel.getMeshes().get(0).setMaterial(customMat);
planeModel.drawUI();
if(Globals.RENDER_FLAG_RENDER_UI_BOUNDS){
DebugRendering.drawUIBounds(parentFramebufferPointer, boxPosition, boxDimensions, windowDrawDebugColor);
}
}
public void pack() {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
public int width = 1;
public int height = 1;
public int positionX = 0;
public int positionY = 0;
public int parentWidth = 1;
public int parentHeight = 1;
public boolean visible = false;
public int getWidth() {
return width;
}
public int getHeight() {
return height;
}
public int getPositionX() {
return positionX;
}
public int getPositionY() {
return positionY;
}
public boolean getVisible() {
return visible;
}
public void setWidth(int width) {
this.width = width;
}
public void setHeight(int height) {
this.height = height;
}
public void setPositionX(int positionX) {
this.positionX = positionX;
}
public void setPositionY(int positionY) {
this.positionY = positionY;
}
public void setVisible(boolean draw) {
this.visible = draw;
}
public void setParentWidth(int width){
parentWidth = width;
}
public void setParentHeight(int height){
this.parentHeight = height;
}
@Override
public void addChild(Element child) {
childList.add(child);
if(child instanceof DrawableElement){
DrawableElement drawableChild = (DrawableElement) child;
drawableChild.setParentWidth(width);
drawableChild.setParentHeight(height);
drawableChild.setVisible(false);
}
}
@Override
public List<Element> getChildren() {
return childList;
}
@Override
public void removeChild(Element child) {
childList.remove(child);
}
public boolean handleEvent(Event event){
return true;
}
}