diff --git a/pom.xml b/pom.xml
index eb0cd0ea..c6be2534 100644
--- a/pom.xml
+++ b/pom.xml
@@ -7,8 +7,8 @@
jar
UTF-8
- 11
- 11
+ 17
+ 17
3.2.3
1.9.19
diff --git a/src/main/java/electrosphere/controls/Control.java b/src/main/java/electrosphere/controls/Control.java
index 47943eae..df22a535 100644
--- a/src/main/java/electrosphere/controls/Control.java
+++ b/src/main/java/electrosphere/controls/Control.java
@@ -1,26 +1,39 @@
package electrosphere.controls;
+import electrosphere.renderer.ui.events.MouseEvent;
+
public class Control {
- boolean isKey;
- boolean isMouse;
+
+ public static enum ControlType {
+ KEY,
+ MOUSE_BUTTON,
+ MOUSE_MOVEMENT,
+ }
+
+ ControlType type;
boolean state;
int keyValue;
ControlMethod onPress;
ControlMethod onRelease;
ControlMethod onRepeat;
+ MouseCallback onMove;
public boolean isIsKey() {
- return isKey;
+ return type == ControlType.KEY;
}
public boolean isIsMouse() {
- return isMouse;
+ return type == ControlType.MOUSE_BUTTON;
}
public boolean isState() {
return state;
}
+ public ControlType getType(){
+ return type;
+ }
+
public int getKeyValue() {
return keyValue;
}
@@ -29,9 +42,8 @@ public class Control {
this.state = state;
}
- public Control(boolean isKey, boolean isMouse, int keyValue) {
- this.isKey = isKey;
- this.isMouse = isMouse;
+ public Control(ControlType type, int keyValue) {
+ this.type = type;
this.keyValue = keyValue;
this.state = false;
}
@@ -48,6 +60,10 @@ public class Control {
onRepeat = method;
}
+ public void setOnMove(MouseCallback method){
+ onMove = method;
+ }
+
public void onPress(){
if(onPress != null){
onPress.execute();
@@ -65,10 +81,20 @@ public class Control {
onRepeat.execute();
}
}
+
+ public void onMove(MouseEvent event){
+ if(onMove != null){
+ onMove.execute(event);
+ }
+ }
public interface ControlMethod {
public void execute();
}
+
+ public interface MouseCallback {
+ public void execute(MouseEvent event);
+ }
}
diff --git a/src/main/java/electrosphere/controls/ControlHandler.java b/src/main/java/electrosphere/controls/ControlHandler.java
index c3a80db4..70867ff5 100644
--- a/src/main/java/electrosphere/controls/ControlHandler.java
+++ b/src/main/java/electrosphere/controls/ControlHandler.java
@@ -1,7 +1,7 @@
package electrosphere.controls;
import electrosphere.controls.Control.ControlMethod;
-import electrosphere.entity.CameraEntityUtils;
+import electrosphere.controls.Control.ControlType;
import electrosphere.entity.Entity;
import electrosphere.entity.EntityDataStrings;
import electrosphere.entity.types.creature.CreatureUtils;
@@ -14,12 +14,24 @@ import electrosphere.entity.state.movement.GroundMovementTree;
import electrosphere.entity.state.movement.GroundMovementTree.MovementRelativeFacing;
import electrosphere.entity.state.movement.GroundMovementTree.MovementTreeState;
import electrosphere.entity.state.movement.SprintTree;
+import electrosphere.entity.types.camera.CameraEntityUtils;
import electrosphere.entity.types.collision.CollisionObjUtils;
import electrosphere.entity.types.item.ItemUtils;
import electrosphere.game.client.targeting.crosshair.Crosshair;
import electrosphere.main.Globals;
-import electrosphere.menu.MenuTransition;
-import electrosphere.menu.MenuUtils;
+import electrosphere.main.Main;
+import electrosphere.menu.WindowStrings;
+import electrosphere.menu.WindowUtils;
+import electrosphere.menu.MenuCallbacks;
+import electrosphere.menu.MenuGenerators;
+import electrosphere.renderer.ui.DrawableElement;
+import electrosphere.renderer.ui.Element;
+import electrosphere.renderer.ui.Window;
+import electrosphere.renderer.ui.events.ClickEvent;
+import electrosphere.renderer.ui.events.DragEvent;
+import electrosphere.renderer.ui.events.KeyboardEvent;
+import electrosphere.renderer.ui.events.MouseEvent;
+
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
@@ -38,6 +50,7 @@ import static org.lwjgl.glfw.GLFW.glfwSetInputMode;
*/
public class ControlHandler {
+ public static final String INPUT_CODE_CAMERA_ROTATION = "cameraRotation";
public static final String DATA_STRING_INPUT_CODE_MOVEMENT_FORWARD = "moveForward";
public static final String DATA_STRING_INPUT_CODE_MOVEMENT_BACKWARD = "moveBackward";
public static final String DATA_STRING_INPUT_CODE_MOVEMENT_LEFT = "moveLeft";
@@ -103,6 +116,7 @@ public class ControlHandler {
public static final String INPUT_CODE_INVENTORY_CLOSE = "inventoryClose";
public static final String INPUT_CODE_INVENTORY_ITEM_MANIPULATE = "inventoryItemManipulate";
+ public static final String INPUT_CODE_INVENTORY_ITEM_DRAG = "inventoryDrag";
public static enum ControlsState {
@@ -117,6 +131,20 @@ public class ControlHandler {
ControlsState state = ControlsState.TITLE_MENU;
boolean mouseIsVisible = true;
+
+
+ /*
+ Mouse event parsing related stuff
+ */
+ float mouse_lastX = 400;
+ float mouse_lastY = 300;
+ double xpos = 400;
+ double ypos = 300;
+ double mouse_X_Buffer[] = new double[1];
+ double mouse_Y_Buffer[] = new double[1];
+ boolean dragging = false;
+
+
HashMap controls;
@@ -139,77 +167,79 @@ public class ControlHandler {
/*
Map the controls
*/
- handler.addControl(DATA_STRING_INPUT_CODE_MOVEMENT_FORWARD, new Control(true,false,GLFW_KEY_W));
- handler.addControl(DATA_STRING_INPUT_CODE_MOVEMENT_BACKWARD, new Control(true,false,GLFW_KEY_S));
- handler.addControl(DATA_STRING_INPUT_CODE_MOVEMENT_LEFT, new Control(true,false,GLFW_KEY_A));
- handler.addControl(DATA_STRING_INPUT_CODE_MOVEMENT_RIGHT, new Control(true,false,GLFW_KEY_D));
- handler.addControl(DATA_STRING_INPUT_CODE_STRAFE_LEFT, new Control(true,false,GLFW_KEY_F24));
- handler.addControl(DATA_STRING_INPUT_CODE_STRAFE_RIGHT, new Control(true,false,GLFW_KEY_F24));
- handler.addControl(DATA_STRING_INPUT_CODE_MOVEMENT_JUMP, new Control(true,false,GLFW_KEY_SPACE));
- handler.addControl(DATA_STRING_INPUT_CODE_MOVEMENT_FALL, new Control(true,false,GLFW_KEY_LEFT_CONTROL));
- handler.addControl(DATA_STRING_INPUT_CODE_ATTACK_PRIMARY, new Control(false,true,GLFW_MOUSE_BUTTON_LEFT));
- handler.addControl(DATA_STRING_INPUT_CODE_IN_GAME_MAIN_MENU, new Control(true,false,GLFW_KEY_ESCAPE));
- handler.addControl(DATA_STRING_INPUT_CODE_LOCK_CROSSHAIR, new Control(false,true,GLFW_MOUSE_BUTTON_RIGHT));
- handler.addControl(INPUT_CODE_SPRINT, new Control(true,false,GLFW_KEY_LEFT_SHIFT));
- handler.addControl(INPUT_CODE_INTERACT, new Control(true,false,GLFW_KEY_E));
- handler.addControl(INPUT_CODE_DROP, new Control(true,false,GLFW_KEY_Y));
- handler.addControl(INPUT_CODE_INVENTORY_OPEN, new Control(true,false,GLFW_KEY_I));
+ handler.addControl(INPUT_CODE_CAMERA_ROTATION, new Control(ControlType.MOUSE_MOVEMENT,0));
+ handler.addControl(DATA_STRING_INPUT_CODE_MOVEMENT_FORWARD, new Control(ControlType.KEY,GLFW_KEY_W));
+ handler.addControl(DATA_STRING_INPUT_CODE_MOVEMENT_BACKWARD, new Control(ControlType.KEY,GLFW_KEY_S));
+ handler.addControl(DATA_STRING_INPUT_CODE_MOVEMENT_LEFT, new Control(ControlType.KEY,GLFW_KEY_A));
+ handler.addControl(DATA_STRING_INPUT_CODE_MOVEMENT_RIGHT, new Control(ControlType.KEY,GLFW_KEY_D));
+ handler.addControl(DATA_STRING_INPUT_CODE_STRAFE_LEFT, new Control(ControlType.KEY,GLFW_KEY_F24));
+ handler.addControl(DATA_STRING_INPUT_CODE_STRAFE_RIGHT, new Control(ControlType.KEY,GLFW_KEY_F24));
+ handler.addControl(DATA_STRING_INPUT_CODE_MOVEMENT_JUMP, new Control(ControlType.KEY,GLFW_KEY_SPACE));
+ handler.addControl(DATA_STRING_INPUT_CODE_MOVEMENT_FALL, new Control(ControlType.KEY,GLFW_KEY_LEFT_CONTROL));
+ handler.addControl(DATA_STRING_INPUT_CODE_ATTACK_PRIMARY, new Control(ControlType.MOUSE_BUTTON,GLFW_MOUSE_BUTTON_LEFT));
+ handler.addControl(DATA_STRING_INPUT_CODE_IN_GAME_MAIN_MENU, new Control(ControlType.KEY,GLFW_KEY_ESCAPE));
+ handler.addControl(DATA_STRING_INPUT_CODE_LOCK_CROSSHAIR, new Control(ControlType.MOUSE_BUTTON,GLFW_MOUSE_BUTTON_RIGHT));
+ handler.addControl(INPUT_CODE_SPRINT, new Control(ControlType.KEY,GLFW_KEY_LEFT_SHIFT));
+ handler.addControl(INPUT_CODE_INTERACT, new Control(ControlType.KEY,GLFW_KEY_E));
+ handler.addControl(INPUT_CODE_DROP, new Control(ControlType.KEY,GLFW_KEY_Y));
+ handler.addControl(INPUT_CODE_INVENTORY_OPEN, new Control(ControlType.KEY,GLFW_KEY_I));
/*
Map the menu navigation controls
*/
- handler.addControl(DATA_STRING_INPUT_CODE_MENU_INCREMENT, new Control(true,false,GLFW_KEY_DOWN));
- handler.addControl(DATA_STRING_INPUT_CODE_MENU_DECREMENT, new Control(true,false,GLFW_KEY_UP));
- handler.addControl(DATA_STRING_INPUT_CODE_MENU_SELECT, new Control(true,false,GLFW_KEY_ENTER));
- handler.addControl(DATA_STRING_INPUT_CODE_MENU_BACKOUT, new Control(true,false,GLFW_KEY_ESCAPE));
+ handler.addControl(DATA_STRING_INPUT_CODE_MENU_INCREMENT, new Control(ControlType.KEY,GLFW_KEY_DOWN));
+ handler.addControl(DATA_STRING_INPUT_CODE_MENU_DECREMENT, new Control(ControlType.KEY,GLFW_KEY_UP));
+ handler.addControl(DATA_STRING_INPUT_CODE_MENU_SELECT, new Control(ControlType.KEY,GLFW_KEY_ENTER));
+ handler.addControl(DATA_STRING_INPUT_CODE_MENU_BACKOUT, new Control(ControlType.KEY,GLFW_KEY_ESCAPE));
/*
Map the typing controls
*/
- handler.addControl(DATA_STRING_INPUT_CODE_MENU_TYPE_BACKSPACE, new Control(true,false,GLFW_KEY_BACKSPACE));
- handler.addControl(DATA_STRING_INPUT_CODE_MENU_TYPE_0, new Control(true,false,GLFW_KEY_0));
- handler.addControl(DATA_STRING_INPUT_CODE_MENU_TYPE_1, new Control(true,false,GLFW_KEY_1));
- handler.addControl(DATA_STRING_INPUT_CODE_MENU_TYPE_2, new Control(true,false,GLFW_KEY_2));
- handler.addControl(DATA_STRING_INPUT_CODE_MENU_TYPE_3, new Control(true,false,GLFW_KEY_3));
- handler.addControl(DATA_STRING_INPUT_CODE_MENU_TYPE_4, new Control(true,false,GLFW_KEY_4));
- handler.addControl(DATA_STRING_INPUT_CODE_MENU_TYPE_5, new Control(true,false,GLFW_KEY_5));
- handler.addControl(DATA_STRING_INPUT_CODE_MENU_TYPE_6, new Control(true,false,GLFW_KEY_6));
- handler.addControl(DATA_STRING_INPUT_CODE_MENU_TYPE_7, new Control(true,false,GLFW_KEY_7));
- handler.addControl(DATA_STRING_INPUT_CODE_MENU_TYPE_8, new Control(true,false,GLFW_KEY_8));
- handler.addControl(DATA_STRING_INPUT_CODE_MENU_TYPE_9, new Control(true,false,GLFW_KEY_9));
- handler.addControl(DATA_STRING_INPUT_CODE_MENU_TYPE_PERIOD, new Control(true,false,GLFW_KEY_PERIOD));
- handler.addControl(DATA_STRING_INPUT_CODE_MENU_TYPE_A, new Control(true,false,GLFW_KEY_A));
- handler.addControl(DATA_STRING_INPUT_CODE_MENU_TYPE_B, new Control(true,false,GLFW_KEY_B));
- handler.addControl(DATA_STRING_INPUT_CODE_MENU_TYPE_C, new Control(true,false,GLFW_KEY_C));
- handler.addControl(DATA_STRING_INPUT_CODE_MENU_TYPE_D, new Control(true,false,GLFW_KEY_D));
- handler.addControl(DATA_STRING_INPUT_CODE_MENU_TYPE_E, new Control(true,false,GLFW_KEY_E));
- handler.addControl(DATA_STRING_INPUT_CODE_MENU_TYPE_F, new Control(true,false,GLFW_KEY_F));
- handler.addControl(DATA_STRING_INPUT_CODE_MENU_TYPE_G, new Control(true,false,GLFW_KEY_G));
- handler.addControl(DATA_STRING_INPUT_CODE_MENU_TYPE_H, new Control(true,false,GLFW_KEY_H));
- handler.addControl(DATA_STRING_INPUT_CODE_MENU_TYPE_I, new Control(true,false,GLFW_KEY_I));
- handler.addControl(DATA_STRING_INPUT_CODE_MENU_TYPE_J, new Control(true,false,GLFW_KEY_J));
- handler.addControl(DATA_STRING_INPUT_CODE_MENU_TYPE_K, new Control(true,false,GLFW_KEY_K));
- handler.addControl(DATA_STRING_INPUT_CODE_MENU_TYPE_L, new Control(true,false,GLFW_KEY_L));
- handler.addControl(DATA_STRING_INPUT_CODE_MENU_TYPE_M, new Control(true,false,GLFW_KEY_M));
- handler.addControl(DATA_STRING_INPUT_CODE_MENU_TYPE_N, new Control(true,false,GLFW_KEY_N));
- handler.addControl(DATA_STRING_INPUT_CODE_MENU_TYPE_O, new Control(true,false,GLFW_KEY_O));
- handler.addControl(DATA_STRING_INPUT_CODE_MENU_TYPE_P, new Control(true,false,GLFW_KEY_P));
- handler.addControl(DATA_STRING_INPUT_CODE_MENU_TYPE_Q, new Control(true,false,GLFW_KEY_Q));
- handler.addControl(DATA_STRING_INPUT_CODE_MENU_TYPE_R, new Control(true,false,GLFW_KEY_R));
- handler.addControl(DATA_STRING_INPUT_CODE_MENU_TYPE_S, new Control(true,false,GLFW_KEY_S));
- handler.addControl(DATA_STRING_INPUT_CODE_MENU_TYPE_T, new Control(true,false,GLFW_KEY_T));
- handler.addControl(DATA_STRING_INPUT_CODE_MENU_TYPE_U, new Control(true,false,GLFW_KEY_U));
- handler.addControl(DATA_STRING_INPUT_CODE_MENU_TYPE_V, new Control(true,false,GLFW_KEY_V));
- handler.addControl(DATA_STRING_INPUT_CODE_MENU_TYPE_W, new Control(true,false,GLFW_KEY_W));
- handler.addControl(DATA_STRING_INPUT_CODE_MENU_TYPE_X, new Control(true,false,GLFW_KEY_X));
- handler.addControl(DATA_STRING_INPUT_CODE_MENU_TYPE_Y, new Control(true,false,GLFW_KEY_Y));
- handler.addControl(DATA_STRING_INPUT_CODE_MENU_TYPE_Z, new Control(true,false,GLFW_KEY_Z));
+ handler.addControl(DATA_STRING_INPUT_CODE_MENU_TYPE_BACKSPACE, new Control(ControlType.KEY,GLFW_KEY_BACKSPACE));
+ handler.addControl(DATA_STRING_INPUT_CODE_MENU_TYPE_0, new Control(ControlType.KEY,GLFW_KEY_0));
+ handler.addControl(DATA_STRING_INPUT_CODE_MENU_TYPE_1, new Control(ControlType.KEY,GLFW_KEY_1));
+ handler.addControl(DATA_STRING_INPUT_CODE_MENU_TYPE_2, new Control(ControlType.KEY,GLFW_KEY_2));
+ handler.addControl(DATA_STRING_INPUT_CODE_MENU_TYPE_3, new Control(ControlType.KEY,GLFW_KEY_3));
+ handler.addControl(DATA_STRING_INPUT_CODE_MENU_TYPE_4, new Control(ControlType.KEY,GLFW_KEY_4));
+ handler.addControl(DATA_STRING_INPUT_CODE_MENU_TYPE_5, new Control(ControlType.KEY,GLFW_KEY_5));
+ handler.addControl(DATA_STRING_INPUT_CODE_MENU_TYPE_6, new Control(ControlType.KEY,GLFW_KEY_6));
+ handler.addControl(DATA_STRING_INPUT_CODE_MENU_TYPE_7, new Control(ControlType.KEY,GLFW_KEY_7));
+ handler.addControl(DATA_STRING_INPUT_CODE_MENU_TYPE_8, new Control(ControlType.KEY,GLFW_KEY_8));
+ handler.addControl(DATA_STRING_INPUT_CODE_MENU_TYPE_9, new Control(ControlType.KEY,GLFW_KEY_9));
+ handler.addControl(DATA_STRING_INPUT_CODE_MENU_TYPE_PERIOD, new Control(ControlType.KEY,GLFW_KEY_PERIOD));
+ handler.addControl(DATA_STRING_INPUT_CODE_MENU_TYPE_A, new Control(ControlType.KEY,GLFW_KEY_A));
+ handler.addControl(DATA_STRING_INPUT_CODE_MENU_TYPE_B, new Control(ControlType.KEY,GLFW_KEY_B));
+ handler.addControl(DATA_STRING_INPUT_CODE_MENU_TYPE_C, new Control(ControlType.KEY,GLFW_KEY_C));
+ handler.addControl(DATA_STRING_INPUT_CODE_MENU_TYPE_D, new Control(ControlType.KEY,GLFW_KEY_D));
+ handler.addControl(DATA_STRING_INPUT_CODE_MENU_TYPE_E, new Control(ControlType.KEY,GLFW_KEY_E));
+ handler.addControl(DATA_STRING_INPUT_CODE_MENU_TYPE_F, new Control(ControlType.KEY,GLFW_KEY_F));
+ handler.addControl(DATA_STRING_INPUT_CODE_MENU_TYPE_G, new Control(ControlType.KEY,GLFW_KEY_G));
+ handler.addControl(DATA_STRING_INPUT_CODE_MENU_TYPE_H, new Control(ControlType.KEY,GLFW_KEY_H));
+ handler.addControl(DATA_STRING_INPUT_CODE_MENU_TYPE_I, new Control(ControlType.KEY,GLFW_KEY_I));
+ handler.addControl(DATA_STRING_INPUT_CODE_MENU_TYPE_J, new Control(ControlType.KEY,GLFW_KEY_J));
+ handler.addControl(DATA_STRING_INPUT_CODE_MENU_TYPE_K, new Control(ControlType.KEY,GLFW_KEY_K));
+ handler.addControl(DATA_STRING_INPUT_CODE_MENU_TYPE_L, new Control(ControlType.KEY,GLFW_KEY_L));
+ handler.addControl(DATA_STRING_INPUT_CODE_MENU_TYPE_M, new Control(ControlType.KEY,GLFW_KEY_M));
+ handler.addControl(DATA_STRING_INPUT_CODE_MENU_TYPE_N, new Control(ControlType.KEY,GLFW_KEY_N));
+ handler.addControl(DATA_STRING_INPUT_CODE_MENU_TYPE_O, new Control(ControlType.KEY,GLFW_KEY_O));
+ handler.addControl(DATA_STRING_INPUT_CODE_MENU_TYPE_P, new Control(ControlType.KEY,GLFW_KEY_P));
+ handler.addControl(DATA_STRING_INPUT_CODE_MENU_TYPE_Q, new Control(ControlType.KEY,GLFW_KEY_Q));
+ handler.addControl(DATA_STRING_INPUT_CODE_MENU_TYPE_R, new Control(ControlType.KEY,GLFW_KEY_R));
+ handler.addControl(DATA_STRING_INPUT_CODE_MENU_TYPE_S, new Control(ControlType.KEY,GLFW_KEY_S));
+ handler.addControl(DATA_STRING_INPUT_CODE_MENU_TYPE_T, new Control(ControlType.KEY,GLFW_KEY_T));
+ handler.addControl(DATA_STRING_INPUT_CODE_MENU_TYPE_U, new Control(ControlType.KEY,GLFW_KEY_U));
+ handler.addControl(DATA_STRING_INPUT_CODE_MENU_TYPE_V, new Control(ControlType.KEY,GLFW_KEY_V));
+ handler.addControl(DATA_STRING_INPUT_CODE_MENU_TYPE_W, new Control(ControlType.KEY,GLFW_KEY_W));
+ handler.addControl(DATA_STRING_INPUT_CODE_MENU_TYPE_X, new Control(ControlType.KEY,GLFW_KEY_X));
+ handler.addControl(DATA_STRING_INPUT_CODE_MENU_TYPE_Y, new Control(ControlType.KEY,GLFW_KEY_Y));
+ handler.addControl(DATA_STRING_INPUT_CODE_MENU_TYPE_Z, new Control(ControlType.KEY,GLFW_KEY_Z));
/*
Inventory controls
*/
- handler.addControl(INPUT_CODE_INVENTORY_CLOSE, new Control(true,false,GLFW_KEY_I));
- handler.addControl(INPUT_CODE_INVENTORY_ITEM_MANIPULATE, new Control(false,true,GLFW_MOUSE_BUTTON_1));
+ handler.addControl(INPUT_CODE_INVENTORY_CLOSE, new Control(ControlType.KEY,GLFW_KEY_I));
+ handler.addControl(INPUT_CODE_INVENTORY_ITEM_MANIPULATE, new Control(ControlType.MOUSE_BUTTON,GLFW_MOUSE_BUTTON_1));
+ handler.addControl(INPUT_CODE_INVENTORY_ITEM_DRAG, new Control(ControlType.MOUSE_MOVEMENT,0));
/*
set state
@@ -224,7 +254,7 @@ public class ControlHandler {
/*
Debug controls
*/
- handler.addControl(DATA_STRING_INPUT_CODE_DEBUG_SPAWN_ITEM, new Control(true,false,GLFW_KEY_Q));
+ handler.addControl(DATA_STRING_INPUT_CODE_DEBUG_SPAWN_ITEM, new Control(ControlType.KEY,GLFW_KEY_Q));
/*
return
@@ -284,6 +314,70 @@ public class ControlHandler {
}
void setMainGameControls(){
+ /*
+ Camera rotation
+ */
+ mainGameControlList.add(controls.get(INPUT_CODE_CAMERA_ROTATION));
+ controls.get(INPUT_CODE_CAMERA_ROTATION).setOnMove(new Control.MouseCallback(){
+
+ float mouseSensitivity = .1f;
+ float cameraSpeed;
+ float yaw = 150;
+ float pitch = 50;
+ Vector3f cameraRotationVector = new Vector3f();
+ public void execute(MouseEvent event){
+
+ cameraSpeed = 2.5f * Main.deltaTime;
+
+ if(Globals.controlHandler != null && !Globals.controlHandler.isMouseVisible()){
+ yaw = yaw + event.getDeltaX() * mouseSensitivity;
+ pitch = pitch - event.getDeltaY() * mouseSensitivity;
+
+ if (pitch > 100.0f) {
+ pitch = 100.0f;
+ }
+ if (pitch < -99.0f) {
+ pitch = -99.0f;
+ }
+ }
+
+ if(Crosshair.getCrosshairActive()){
+
+ // if(Globals.playerCharacter != null){
+ // Vector3d charPos = EntityUtils.getPosition(Globals.playerCharacter);
+ // CameraEntityUtils.setCameraCenter(Globals.playerCamera, new Vector3f((float)charPos.x,(float)charPos.y,(float)charPos.z));
+ // }
+
+ Vector3d characterPos = EntityUtils.getPosition(Globals.playerCharacter);
+ Vector3d targetPos = Crosshair.getTargetPosition();
+ Vector3d diffed = new Vector3d(targetPos).sub(characterPos).mul(-1).normalize();
+ cameraRotationVector.set((float)diffed.x, 0.5f, (float)diffed.z).normalize();
+
+ yaw = (float)Math.toDegrees(Math.atan2(diffed.z, diffed.x));
+
+ CameraEntityUtils.setCameraPitch(Globals.playerCamera, pitch);
+ CameraEntityUtils.setCameraYaw(Globals.playerCamera, yaw);
+
+ } else {
+ CameraEntityUtils.setCameraPitch(Globals.playerCamera, pitch);
+ CameraEntityUtils.setCameraYaw(Globals.playerCamera, yaw);
+
+ // if(Globals.playerCharacter != null){
+ // Vector3d charPos = EntityUtils.getPosition(Globals.playerCharacter);
+ // CameraEntityUtils.setCameraCenter(Globals.playerCamera, new Vector3f((float)charPos.x,(float)charPos.y,(float)charPos.z));
+ // }
+
+ float cam_Player_Orbit_Magnitude = 5f;
+ cameraRotationVector.x = 0 + (float) Math.cos(yaw / 180.0f * Math.PI) * cam_Player_Orbit_Magnitude;
+ cameraRotationVector.y = 0 + (float) Math.sin(pitch / 180.0f * Math.PI) * cam_Player_Orbit_Magnitude;
+ cameraRotationVector.z = 0 + (float) Math.sin(yaw / 180.0f * Math.PI) * cam_Player_Orbit_Magnitude;
+ cameraRotationVector.normalize();
+ }
+
+ CameraEntityUtils.setCameraEye(Globals.playerCamera, cameraRotationVector);
+
+ Globals.viewMatrix = CameraEntityUtils.getCameraViewMatrix(Globals.playerCamera);
+ }});
/*
Move forward
*/
@@ -627,9 +721,20 @@ public class ControlHandler {
*/
mainGameControlList.add(controls.get(DATA_STRING_INPUT_CODE_IN_GAME_MAIN_MENU));
controls.get(DATA_STRING_INPUT_CODE_IN_GAME_MAIN_MENU).setOnPress(new ControlMethod(){public void execute(){
- Globals.currentMenu = MenuUtils.createInGameMainMenu();
- MenuUtils.makeMenuDrawable(Globals.currentMenu);
+ // Globals.elementManager.registerWindow(WindowStrings.WINDOW_MENU_INGAME_MAIN, MenuGenerators.createInGameMainMenu());
+ // Globals.controlHandler.setHandlerState(ControlsState.IN_GAME_MAIN_MENU);
+
+ Window mainMenuWindow = new Window(0, 0, Globals.WINDOW_WIDTH, Globals.WINDOW_HEIGHT);
+ Element mainMenuInGame = MenuGenerators.createInGameMainMenu();
+ mainMenuWindow.addChild(mainMenuInGame);
+ Globals.elementManager.registerWindow(WindowStrings.WINDOW_MENU_INGAME_MAIN, mainMenuWindow);
+ WindowUtils.recursiveSetVisible(Globals.elementManager.getWindow(WindowStrings.WINDOW_MENU_INGAME_MAIN), true);
Globals.controlHandler.setHandlerState(ControlsState.IN_GAME_MAIN_MENU);
+ Globals.controlHandler.showMouse();
+ // Element mainMenu = MenuGenerators.createInGameMainMenu();
+ // Globals.elementManager.registerWindow(WindowStrings.WINDOW_MENU_INGAME_MAIN, mainMenu);
+ // MenuGenerators.makeMenuDrawable(mainMenu);
+ // Globals.controlHandler.setHandlerState(ControlsState.IN_GAME_MAIN_MENU);
}});
/*
@@ -638,9 +743,18 @@ public class ControlHandler {
mainGameControlList.add(controls.get(INPUT_CODE_INVENTORY_OPEN));
controls.get(INPUT_CODE_INVENTORY_OPEN).setOnPress(new ControlMethod(){public void execute(){
if(InventoryUtils.hasNaturalInventory(Globals.playerCharacter)){
+ //create window
+ Window mainMenuWindow = new Window(0, 0, Globals.WINDOW_WIDTH, Globals.WINDOW_HEIGHT);
UnrelationalInventoryState inventory = InventoryUtils.getNaturalInventory(Globals.playerCharacter);
- Globals.currentMenu = MenuUtils.createNaturalInventoryMenu(inventory);
- MenuUtils.makeMenuDrawable(Globals.currentMenu);
+ //create window contents
+ Element inventoryUI = MenuGenerators.createNaturalInventoryMenu(inventory);
+ //add contents
+ mainMenuWindow.addChild(inventoryUI);
+ //register
+ Globals.elementManager.registerWindow(WindowUtils.getInventoryWindowID(inventory.getId()), mainMenuWindow);
+ //make visible
+ WindowUtils.recursiveSetVisible(Globals.elementManager.getWindow(WindowUtils.getInventoryWindowID(inventory.getId())), true);
+ //controls
Globals.controlHandler.setHandlerState(ControlsState.INVENTORY);
Globals.controlHandler.showMouse();
}
@@ -660,66 +774,32 @@ public class ControlHandler {
void setMenuNavigationControls(){
menuNavigationControlList.add(controls.get(DATA_STRING_INPUT_CODE_MENU_INCREMENT));
controls.get(DATA_STRING_INPUT_CODE_MENU_INCREMENT).setOnPress(new ControlMethod(){public void execute(){
- Globals.currentMenu.incrementMenuOption();
+ // Globals.currentMenu.incrementMenuOption();
+ Globals.elementManager.focusNextElement(Globals.elementManager.getWindow(WindowStrings.WINDOW_MENU_MAIN));
}});
menuNavigationControlList.add(controls.get(DATA_STRING_INPUT_CODE_MENU_DECREMENT));
controls.get(DATA_STRING_INPUT_CODE_MENU_DECREMENT).setOnPress(new ControlMethod(){public void execute(){
- Globals.currentMenu.decrementMenuOption();
+ // Globals.currentMenu.decrementMenuOption();
+ Globals.elementManager.focusPreviousElement(Globals.elementManager.getWindow(WindowStrings.WINDOW_MENU_MAIN));
}});
menuNavigationControlList.add(controls.get(DATA_STRING_INPUT_CODE_MENU_SELECT));
controls.get(DATA_STRING_INPUT_CODE_MENU_SELECT).setOnPress(new ControlMethod(){public void execute(){
- MenuTransition.selectOption(Globals.currentMenu);
+ Globals.elementManager.click(new ClickEvent(
+ Globals.elementManager.getFocusedElement().getPositionX(),
+ Globals.elementManager.getFocusedElement().getPositionY(),
+ true,
+ Globals.mouseCallback.getButton(GLFW_MOUSE_BUTTON_2)
+ ));
+ // MenuCallbacks.selectOption(Globals.currentMenu);
}});
menuNavigationControlList.add(controls.get(DATA_STRING_INPUT_CODE_MENU_BACKOUT));
controls.get(DATA_STRING_INPUT_CODE_MENU_BACKOUT).setOnPress(new ControlMethod(){public void execute(){
- MenuTransition.backout(Globals.currentMenu);
+ // MenuCallbacks.backout(Globals.currentMenu);
}});
}
-
- public void runHandlers(List controls){
- for(Control control : controls){
- if(control.isIsKey()){
- if(Globals.controlCallback.getKey(control.getKeyValue())){
- if(!control.isState()){
- //on press
- control.onPress();
- } else {
- //on repeat
- control.onRepeat();
- }
- control.setState(true);
- } else {
- if(control.isState()){
- //on release
- control.onRelease();
- } else {
- }
- control.setState(false);
- }
- } else if(control.isIsMouse()){
- if(Globals.mouseCallback.getButton(control.getKeyValue())){
- if(!control.isState()){
- //on press
- control.onPress();
- } else {
- //on repeat
- control.onRepeat();
- }
- control.setState(true);
- } else {
- if(control.isState()){
- //on release
- control.onRelease();
- } else {
- }
- control.setState(false);
- }
- }
- }
- }
void setTypingControls(){
@@ -766,7 +846,12 @@ public class ControlHandler {
for(String currentKey : typeKeybinds){
typingControlList.add(controls.get(currentKey));
controls.get(currentKey).setOnPress(new ControlMethod(){public void execute(){
- MenuTransition.menuHandleKeypress(Globals.currentMenu,currentKey);
+ Globals.elementManager.fireEvent(
+ new KeyboardEvent(currentKey),
+ Globals.elementManager.getFocusedElement().getPositionX(),
+ Globals.elementManager.getFocusedElement().getPositionY()
+ );
+ // MenuCallbacks.menuHandleKeypress(Globals.currentMenu,currentKey);
}});
// if(controls.get(currentKey).isIsKey() && Globals.controlCallback.getKey(controls.get(currentKey).getKeyValue())){
// controls.get(currentKey).setState(true);
@@ -785,15 +870,109 @@ public class ControlHandler {
*/
inventoryControlList.add(controls.get(INPUT_CODE_INVENTORY_CLOSE));
controls.get(INPUT_CODE_INVENTORY_CLOSE).setOnPress(new ControlMethod(){public void execute(){
- MenuTransition.backout(Globals.currentMenu);
+ // MenuCallbacks.backout(Globals.currentMenu);
+ UnrelationalInventoryState inventory = InventoryUtils.getNaturalInventory(Globals.playerCharacter);
+ Element inventoryWindow = Globals.elementManager.getWindow(WindowUtils.getInventoryWindowID(inventory.getId()));
+ WindowUtils.recursiveSetVisible(inventoryWindow, false);
+ hideMouse();
+ Globals.elementManager.unregisterWindow(WindowUtils.getInventoryWindowID(inventory.getId()));
+ Globals.controlHandler.setHandlerState(ControlsState.MAIN_GAME);
}});
/*
Item manipulation
*/
inventoryControlList.add(controls.get(INPUT_CODE_INVENTORY_ITEM_MANIPULATE));
controls.get(INPUT_CODE_INVENTORY_ITEM_MANIPULATE).setOnPress(new ControlMethod(){public void execute(){
-
}});
+ controls.get(INPUT_CODE_INVENTORY_ITEM_MANIPULATE).setOnRelease(new ControlMethod(){public void execute(){
+ if(dragging){
+ dragging = false;
+ //fire dragrelease event to elementmanager
+ Globals.elementManager.dragRelease((int)xpos,(int)ypos,(int)mouse_lastX,(int)mouse_lastY,(int)(xpos - mouse_lastX),(int)(mouse_lastY - ypos));
+ } else {
+ //fire onclick event to elementmanager
+ Globals.elementManager.click(new ClickEvent((int)xpos,(int)ypos,true,Globals.mouseCallback.getButton(GLFW_MOUSE_BUTTON_2)));
+ }
+ }});
+ /*
+ item dragging
+ */
+ inventoryControlList.add(controls.get(INPUT_CODE_INVENTORY_ITEM_DRAG));
+ controls.get(INPUT_CODE_INVENTORY_ITEM_DRAG).setOnMove(new Control.MouseCallback(){public void execute(MouseEvent event){
+ if(!dragging && event.getButton1()){
+ dragging = true;
+ //fire dragstart event to elementmanager
+ Globals.elementManager.dragStart((int)xpos,(int)ypos,(int)mouse_lastX,(int)mouse_lastY,(int)(xpos - mouse_lastX),(int)(mouse_lastY - ypos));
+ }
+ if(dragging){
+ //fire drag event to elementmanager
+ Globals.elementManager.drag((int)xpos,(int)ypos,(int)mouse_lastX,(int)mouse_lastY,(int)(xpos - mouse_lastX),(int)(mouse_lastY - ypos));
+ }
+ }});
+ }
+
+
+ public void runHandlers(List controls){
+
+ //construct mouse event
+ glfwGetCursorPos(Globals.window, mouse_X_Buffer, mouse_Y_Buffer);
+ xpos = mouse_X_Buffer[0];
+ ypos = mouse_Y_Buffer[0];
+ float xoffset = (float) (xpos - mouse_lastX);
+ float yoffset = (float) (mouse_lastY - ypos);
+ mouse_lastX = (float) xpos;
+ mouse_lastY = (float) ypos;
+ MouseEvent currentMouseEvent = new MouseEvent((int)xpos,(int)ypos,(int)mouse_lastX,(int)mouse_lastY,(int)xoffset,(int)yoffset,Globals.mouseCallback.getButton(GLFW_MOUSE_BUTTON_1),Globals.mouseCallback.getButton(GLFW_MOUSE_BUTTON_2));
+ boolean mouseMoveEvent = xoffset != 0 || yoffset != 0;
+
+
+ for(Control control : controls){
+ switch(control.getType()){
+ case KEY:
+ if(Globals.controlCallback.getKey(control.getKeyValue())){
+ if(!control.isState()){
+ //on press
+ control.onPress();
+ } else {
+ //on repeat
+ control.onRepeat();
+ }
+ control.setState(true);
+ } else {
+ if(control.isState()){
+ //on release
+ control.onRelease();
+ } else {
+ }
+ control.setState(false);
+ }
+ break;
+ case MOUSE_BUTTON:
+ if(Globals.mouseCallback.getButton(control.getKeyValue())){
+ if(!control.isState()){
+ //on press
+ control.onPress();
+ } else {
+ //on repeat
+ control.onRepeat();
+ }
+ control.setState(true);
+ } else {
+ if(control.isState()){
+ //on release
+ control.onRelease();
+ } else {
+ }
+ control.setState(false);
+ }
+ break;
+ case MOUSE_MOVEMENT:
+ if(mouseMoveEvent){
+ control.onMove(currentMouseEvent);
+ }
+ break;
+ }
+ }
}
public Control getControl(String controlName){
diff --git a/src/main/java/electrosphere/engine/LoadingThread.java b/src/main/java/electrosphere/engine/LoadingThread.java
index b56242f1..a43024d0 100644
--- a/src/main/java/electrosphere/engine/LoadingThread.java
+++ b/src/main/java/electrosphere/engine/LoadingThread.java
@@ -2,7 +2,6 @@ package electrosphere.engine;
import electrosphere.collision.dispatch.CollisionObject;
import electrosphere.controls.ControlHandler;
-import electrosphere.entity.CameraEntityUtils;
import electrosphere.entity.Entity;
import electrosphere.entity.EntityUtils;
import electrosphere.entity.state.ApplyRotationTree;
@@ -18,6 +17,7 @@ import electrosphere.game.simulation.MacroSimulation;
import electrosphere.game.server.terrain.manager.ServerTerrainManager;
import electrosphere.game.server.world.ServerWorldData;
import electrosphere.entity.types.attach.AttachUtils;
+import electrosphere.entity.types.camera.CameraEntityUtils;
import electrosphere.entity.types.particle.ParticleUtils;
import electrosphere.entity.types.collision.CollisionObjUtils;
import electrosphere.entity.types.foliage.FoliageUtils;
@@ -34,8 +34,9 @@ import electrosphere.game.server.datacell.DataCellManager;
import electrosphere.game.simulation.MicroSimulation;
import electrosphere.logger.LoggerInterface;
import electrosphere.main.Globals;
-import static electrosphere.main.Globals.loadingBox;
-import electrosphere.menu.MenuUtils;
+import electrosphere.menu.MenuGenerators;
+import electrosphere.menu.WindowStrings;
+import electrosphere.menu.WindowUtils;
import electrosphere.net.NetUtils;
import electrosphere.net.client.ClientNetworking;
import electrosphere.net.server.Server;
@@ -49,8 +50,10 @@ import electrosphere.game.server.pathfinding.NavMeshPathfinder;
import electrosphere.game.server.pathfinding.navmesh.NavCube;
import electrosphere.game.server.pathfinding.navmesh.NavMesh;
import electrosphere.game.server.unit.UnitUtils;
-import electrosphere.renderer.ui.Widget;
+import electrosphere.renderer.ui.DrawableElement;
import electrosphere.renderer.ui.WidgetUtils;
+import electrosphere.renderer.ui.Window;
+
import java.util.Random;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
@@ -83,6 +86,7 @@ public class LoadingThread extends Thread {
@Override
public void run(){
lock.acquireUninterruptibly();
+ Window loadingWindow = (Window)Globals.elementManager.getWindow(WindowStrings.WINDOW_LOADING);
switch(threadType){
@@ -93,13 +97,8 @@ public class LoadingThread extends Thread {
case LOAD_TITLE_MENU:
-
- Globals.currentMenu = MenuUtils.createTitleMenu();
-
- loadingBox.setVisible(false);
-
- MenuUtils.makeMenuDrawable(Globals.currentMenu);
-
+ WindowUtils.recursiveSetVisible(loadingWindow,false);
+ WindowUtils.recursiveSetVisible(Globals.elementManager.getWindow(WindowStrings.WINDOW_MENU_MAIN), true);
break;
@@ -111,8 +110,8 @@ public class LoadingThread extends Thread {
case LOAD_MAIN_GAME:
-
- loadingBox.setVisible(true);
+ WindowUtils.recursiveSetVisible(Globals.elementManager.getWindow(WindowStrings.WINDOW_MENU_MAIN), false);
+ loadingWindow.setVisible(true);
//disable menu input
Globals.controlHandler.setHandlerState(ControlHandler.ControlsState.NO_INPUT);
@@ -188,11 +187,8 @@ public class LoadingThread extends Thread {
//hide cursor
Globals.controlHandler.hideMouse();
- //create in game ui
- showInGameUI();
-
- loadingBox.setVisible(false);
+ loadingWindow.setVisible(false);
RenderUtils.recaptureScreen();
@@ -217,8 +213,8 @@ public class LoadingThread extends Thread {
case LOAD_ARENA:
-
- loadingBox.setVisible(true);
+ WindowUtils.recursiveSetVisible(Globals.elementManager.getWindow(WindowStrings.WINDOW_MENU_MAIN), false);
+ loadingWindow.setVisible(true);
//disable menu input
Globals.controlHandler.setHandlerState(ControlHandler.ControlsState.NO_INPUT);
@@ -278,10 +274,7 @@ public class LoadingThread extends Thread {
//hide cursor
Globals.controlHandler.hideMouse();
- //create in game ui
- showInGameUI();
-
- loadingBox.setVisible(false);
+ loadingWindow.setVisible(false);
RenderUtils.recaptureScreen();
@@ -554,7 +547,7 @@ public class LoadingThread extends Thread {
Player Camera
*/
- Globals.playerCamera = CameraEntityUtils.spawnBasicCameraEntity(new Vector3f(1,0,1), new Vector3f(0,0,0));
+ Globals.playerCamera = CameraEntityUtils.spawnEntityTrackingCameraEntity(new Vector3f(1,0,1), new Vector3f(0,0,0), Globals.playerCharacter);
@@ -583,13 +576,6 @@ public class LoadingThread extends Thread {
Globals.microSimulation = new MicroSimulation();
}
- static void showInGameUI(){
- for(Widget widget : Globals.inGameUI){
-// System.out.println("Set widget visible");
- widget.setVisible(true);
- }
- }
-
static void setSimulationsToReady(){
Globals.microSimulation.setReady(true);
if(Globals.macroSimulation != null){
diff --git a/src/main/java/electrosphere/entity/state/inventory/UnrelationalInventoryState.java b/src/main/java/electrosphere/entity/state/inventory/UnrelationalInventoryState.java
index 8bdfbf37..9b83c28b 100644
--- a/src/main/java/electrosphere/entity/state/inventory/UnrelationalInventoryState.java
+++ b/src/main/java/electrosphere/entity/state/inventory/UnrelationalInventoryState.java
@@ -7,14 +7,26 @@ import electrosphere.entity.Entity;
public class UnrelationalInventoryState {
+ static int inventoryIncrementer = 0;
+
int capacity;
+ int id;
List items = new LinkedList();
- public UnrelationalInventoryState(int capacity){
+ public static UnrelationalInventoryState createUnrelationalInventory(int capacity){
+ return new UnrelationalInventoryState(inventoryIncrementer++,capacity);
+ }
+
+ UnrelationalInventoryState(int id, int capacity){
+ this.id = id;
this.capacity = capacity;
}
+ // public UnrelationalInventoryState(int capacity){
+ // this.capacity = capacity;
+ // }
+
public void addItem(Entity item){
items.add(item);
}
@@ -31,5 +43,9 @@ public class UnrelationalInventoryState {
return capacity;
}
+ public int getId(){
+ return id;
+ }
+
}
diff --git a/src/main/java/electrosphere/entity/state/movement/GroundMovementTree.java b/src/main/java/electrosphere/entity/state/movement/GroundMovementTree.java
index c8301598..bc2e9576 100644
--- a/src/main/java/electrosphere/entity/state/movement/GroundMovementTree.java
+++ b/src/main/java/electrosphere/entity/state/movement/GroundMovementTree.java
@@ -5,7 +5,7 @@ import electrosphere.entity.state.gravity.GravityTree;
import electrosphere.entity.state.gravity.GravityUtils;
import electrosphere.collision.dispatch.CollisionObject;
import electrosphere.dynamics.RigidBody;
-import electrosphere.entity.CameraEntityUtils;
+import electrosphere.entity.types.camera.CameraEntityUtils;
import electrosphere.entity.types.creature.CreatureUtils;
import electrosphere.entity.Entity;
import electrosphere.entity.EntityDataStrings;
diff --git a/src/main/java/electrosphere/entity/CameraEntityUtils.java b/src/main/java/electrosphere/entity/types/camera/CameraEntityUtils.java
similarity index 80%
rename from src/main/java/electrosphere/entity/CameraEntityUtils.java
rename to src/main/java/electrosphere/entity/types/camera/CameraEntityUtils.java
index b5036e09..ca305f76 100644
--- a/src/main/java/electrosphere/entity/CameraEntityUtils.java
+++ b/src/main/java/electrosphere/entity/types/camera/CameraEntityUtils.java
@@ -1,8 +1,13 @@
-package electrosphere.entity;
+package electrosphere.entity.types.camera;
+import electrosphere.entity.Entity;
+import electrosphere.entity.EntityDataStrings;
+import electrosphere.entity.EntityUtils;
+import electrosphere.entity.state.BehaviorTree;
import electrosphere.main.Globals;
import org.joml.Matrix4f;
import org.joml.Quaternionf;
+import org.joml.Vector3d;
import org.joml.Vector3f;
/**
@@ -23,7 +28,7 @@ public class CameraEntityUtils {
return rVal;
}
- public static Entity spawnPointTrackingCameraEntity(Vector3f center, Vector3f eye){
+ public static Entity spawnEntityTrackingCameraEntity(Vector3f center, Vector3f eye, Entity toTrack){
Entity rVal = new Entity();
Globals.entityManager.registerEntity(rVal);
rVal.putData(EntityDataStrings.DATA_STRING_CAMERA_TYPE, EntityDataStrings.DATA_STRING_CAMERA_TYPE_ORBIT);
@@ -31,6 +36,17 @@ public class CameraEntityUtils {
rVal.putData(EntityDataStrings .DATA_STRING_CAMERA_EYE, eye);
rVal.putData(EntityDataStrings.CAMERA_PITCH, 0.0f);
rVal.putData(EntityDataStrings.CAMERA_YAW, 0.0f);
+ BehaviorTree entityTrackingTree = new BehaviorTree() {
+ @Override
+ public void simulate() {
+ // TODO Auto-generated method stub
+ if(toTrack != null){
+ Vector3d entityPos = EntityUtils.getPosition(toTrack);
+ CameraEntityUtils.setCameraCenter(rVal, new Vector3f((float)entityPos.x,(float)entityPos.y,(float)entityPos.z));
+ }
+ }
+ };
+ Globals.entityManager.registerBehaviorTree(entityTrackingTree);
return rVal;
}
diff --git a/src/main/java/electrosphere/entity/types/creature/CreatureUtils.java b/src/main/java/electrosphere/entity/types/creature/CreatureUtils.java
index d0e75c33..a540154d 100644
--- a/src/main/java/electrosphere/entity/types/creature/CreatureUtils.java
+++ b/src/main/java/electrosphere/entity/types/creature/CreatureUtils.java
@@ -192,7 +192,7 @@ public class CreatureUtils {
// rVal.putData(EntityDataStrings.EQUIP_STATE, new EquipState(rVal,"MiddleLower.R"));
break;
case "INVENTORY":
- rVal.putData(EntityDataStrings.NATURAL_INVENTORY,new UnrelationalInventoryState(10));
+ rVal.putData(EntityDataStrings.NATURAL_INVENTORY,UnrelationalInventoryState.createUnrelationalInventory(10));
break;
}
}
diff --git a/src/main/java/electrosphere/entity/types/particle/ParticleUtils.java b/src/main/java/electrosphere/entity/types/particle/ParticleUtils.java
index bcb8894a..ece0c730 100644
--- a/src/main/java/electrosphere/entity/types/particle/ParticleUtils.java
+++ b/src/main/java/electrosphere/entity/types/particle/ParticleUtils.java
@@ -1,10 +1,10 @@
package electrosphere.entity.types.particle;
-import electrosphere.entity.CameraEntityUtils;
import electrosphere.entity.Entity;
import electrosphere.entity.EntityDataStrings;
import electrosphere.entity.EntityUtils;
import electrosphere.entity.state.ParticleTree;
+import electrosphere.entity.types.camera.CameraEntityUtils;
import electrosphere.main.Globals;
import org.joml.AxisAngle4f;
import org.joml.Matrix4f;
diff --git a/src/main/java/electrosphere/game/client/ClientFunctions.java b/src/main/java/electrosphere/game/client/ClientFunctions.java
index 1031299a..26f9bd9b 100644
--- a/src/main/java/electrosphere/game/client/ClientFunctions.java
+++ b/src/main/java/electrosphere/game/client/ClientFunctions.java
@@ -1,7 +1,7 @@
package electrosphere.game.client;
-import electrosphere.entity.CameraEntityUtils;
import electrosphere.entity.EntityUtils;
+import electrosphere.entity.types.camera.CameraEntityUtils;
import electrosphere.main.Globals;
import org.joml.Vector3f;
diff --git a/src/main/java/electrosphere/game/client/targeting/crosshair/Crosshair.java b/src/main/java/electrosphere/game/client/targeting/crosshair/Crosshair.java
index ba21f588..fe3a6046 100644
--- a/src/main/java/electrosphere/game/client/targeting/crosshair/Crosshair.java
+++ b/src/main/java/electrosphere/game/client/targeting/crosshair/Crosshair.java
@@ -1,8 +1,8 @@
package electrosphere.game.client.targeting.crosshair;
-import electrosphere.entity.CameraEntityUtils;
import electrosphere.entity.Entity;
import electrosphere.entity.EntityUtils;
+import electrosphere.entity.types.camera.CameraEntityUtils;
import electrosphere.main.Globals;
import org.joml.Vector3d;
diff --git a/src/main/java/electrosphere/main/Globals.java b/src/main/java/electrosphere/main/Globals.java
index 8c2143b6..c0139c8e 100644
--- a/src/main/java/electrosphere/main/Globals.java
+++ b/src/main/java/electrosphere/main/Globals.java
@@ -13,6 +13,7 @@ import electrosphere.controls.ControlHandler;
import electrosphere.controls.MouseCallback;
import electrosphere.entity.Entity;
import electrosphere.entity.EntityManager;
+import electrosphere.entity.state.inventory.UnrelationalInventoryState;
import electrosphere.game.collision.CollisionEngine;
import electrosphere.entity.types.hitbox.HitboxManager;
import electrosphere.game.client.cells.DrawCellManager;
@@ -38,7 +39,9 @@ import electrosphere.game.server.world.MacroData;
import electrosphere.game.server.datacell.DataCellManager;
import electrosphere.game.simulation.MicroSimulation;
import electrosphere.logger.LoggerInterface;
-import electrosphere.menu.Menu;
+import electrosphere.menu.MenuGenerators;
+import electrosphere.menu.WindowStrings;
+import electrosphere.menu.WindowUtils;
import electrosphere.net.client.ClientNetworking;
import electrosphere.net.server.Player;
import electrosphere.net.server.PlayerManager;
@@ -50,13 +53,13 @@ import electrosphere.renderer.ShaderProgram;
import electrosphere.engine.assetmanager.AssetDataStrings;
import electrosphere.engine.assetmanager.AssetManager;
import electrosphere.game.server.pathfinding.NavMeshManager;
-import electrosphere.renderer.ui.Widget;
-import electrosphere.renderer.ui.WidgetManager;
+import electrosphere.renderer.ui.ElementManager;
import electrosphere.renderer.ui.WidgetUtils;
-import electrosphere.renderer.ui.WindowManager;
+import electrosphere.renderer.ui.Window;
+import electrosphere.renderer.ui.elements.ImagePanel;
+import electrosphere.renderer.ui.elements.Label;
import electrosphere.renderer.ui.font.FontUtils;
import electrosphere.renderer.ui.font.RawFontMap;
-import electrosphere.renderer.ui.font.TextBox;
import electrosphere.util.FileUtils;
import java.io.File;
import java.io.IOException;
@@ -218,10 +221,6 @@ public class Globals {
public static ShaderProgram defaultMeshShader;
public static ShaderProgram terrainShaderProgram;
- public static Menu currentMenu;
-
- public static List inGameUI = new LinkedList();
-
public static String particleBillboardModel;
@@ -275,15 +274,9 @@ public class Globals {
//thread for loading different game states
public static LoadingThread loadingThread;
-
- //manages all windows to be drawn to the screen
- public static WindowManager windowManager;
//manager for all widgets currently being drawn to screen
- public static WidgetManager widgetManager;
-
- //ui text box for loading text
- public static TextBox loadingBox;
+ public static ElementManager elementManager;
//collision world data
public static CommonWorldData commonWorldData;
@@ -304,6 +297,10 @@ public class Globals {
//ai manager
public static AIManager aiManager;
+
+ //drag item state
+ public static Entity draggedItem = null;
+ public static UnrelationalInventoryState dragSourceInventory = null;
@@ -336,7 +333,7 @@ public class Globals {
//load asset manager
assetManager = new AssetManager();
//load widget manager
- widgetManager = new WidgetManager();
+ elementManager = new ElementManager();
//hitbox manager
hitboxManager = new HitboxManager();
//ai manager
@@ -385,8 +382,8 @@ public class Globals {
//off white texture for backgrounds
offWhiteTexture = "Textures/ow1.png";
Globals.assetManager.addTexturePathtoQueue(offWhiteTexture);
- //loading box
- loadingBox = WidgetUtils.createVerticallyAlignedTextBox(520, 100, 50, 7, 1, "LOADING", true);
+ //initialize required windows
+ WindowUtils.initBaseWindows();
//init default shaderProgram
defaultMeshShader = ShaderProgram.smart_assemble_shader(false,true);
//init terrain shader program
@@ -402,6 +399,10 @@ public class Globals {
assetManager.addModelPathToQueue("Models/unitplane.fbx");
assetManager.addModelPathToQueue("Models/unitcube.fbx");
planeModelID = assetManager.registerModel(RenderUtils.createPlaneModel());
+
+ //image panel
+ ImagePanel.imagePanelModelPath = assetManager.registerModel(RenderUtils.createPlaneModel());
+ Globals.assetManager.queueOverrideMeshShader(ImagePanel.imagePanelModelPath, "plane", "Shaders/font/bitmapchar/bitmapchar.vs", "Shaders/font/bitmapchar/bitmapchar.fs");
//init ui images
assetManager.addTexturePathtoQueue("Textures/ui/WindowBorder.png");
@@ -409,8 +410,8 @@ public class Globals {
testingTexture = "Textures/Testing1.png";
Globals.assetManager.addTexturePathtoQueue(testingTexture);
- //in game ui stuff
- inGameUI.add(WidgetUtils.createInGameMainMenuButton());
+ // //in game ui stuff
+ // elementManager.registerWindow(WindowStrings.WINDOW_MENU_MAIN,WidgetUtils.createInGameMainMenuButton());
@@ -418,4 +419,7 @@ public class Globals {
//load them into memory now. The loading time penalty is worth it I think.
Globals.assetManager.loadAssetsInQueue();
}
+
+
+
}
diff --git a/src/main/java/electrosphere/main/Main.java b/src/main/java/electrosphere/main/Main.java
index 61e29a7b..b74f36c8 100644
--- a/src/main/java/electrosphere/main/Main.java
+++ b/src/main/java/electrosphere/main/Main.java
@@ -5,7 +5,6 @@ import electrosphere.audio.AudioEngine;
import electrosphere.audio.AudioSource;
import electrosphere.audio.AudioUtils;
import electrosphere.controls.ControlHandler;
-import electrosphere.entity.CameraEntityUtils;
import electrosphere.entity.types.creature.CreatureUtils;
import electrosphere.renderer.Material;
import electrosphere.renderer.Model;
@@ -16,6 +15,7 @@ import electrosphere.entity.state.movement.GroundMovementTree;
import electrosphere.entity.types.hitbox.HitboxUtils;
import electrosphere.entity.types.item.ItemUtils;
import electrosphere.entity.types.attach.AttachUtils;
+import electrosphere.entity.types.camera.CameraEntityUtils;
import electrosphere.engine.LoadingThread;
import electrosphere.game.client.ClientFunctions;
import electrosphere.game.client.targeting.crosshair.Crosshair;
@@ -74,16 +74,16 @@ public class Main {
/*
Mouse Controls
*/
- static float mouse_lastX = 400;
- static float mouse_lastY = 300;
- static double xpos = 400;
- static double ypos = 300;
- static float mouseSensitivity = .1f;
- static double mouse_X_Buffer[] = new double[1];
- static double mouse_Y_Buffer[] = new double[1];
- static float cameraSpeed;
- static float yaw = 150;
- static float pitch = 50;
+ // static float mouse_lastX = 400;
+ // static float mouse_lastY = 300;
+ // static double xpos = 400;
+ // static double ypos = 300;
+ // static float mouseSensitivity = .1f;
+ // static double mouse_X_Buffer[] = new double[1];
+ // static double mouse_Y_Buffer[] = new double[1];
+ // static float cameraSpeed;
+ // static float yaw = 150;
+ // static float pitch = 50;
@@ -216,7 +216,7 @@ public class Main {
///
/// C A M E R A C R E A T I O N
///
- Vector3f cameraRotationVector = new Vector3f();
+ // Vector3f cameraRotationVector = new Vector3f();
//main loop
while (running) {
@@ -250,7 +250,7 @@ public class Main {
///
/// I N P U T C O N T R O L S
///
- cameraSpeed = 2.5f * deltaTime;
+ // cameraSpeed = 2.5f * deltaTime;
// if (glfwGetKey(Globals.window, GLFW_KEY_ESCAPE) == GLFW_PRESS && Globals.RENDER_FLAG_RENDER_SCREEN_FRAMEBUFFER_CONTENT) {
// break;
// }
@@ -308,67 +308,67 @@ public class Main {
/// C A M E R A S T U F F
///
//poll mouse variables and update camera variables
- if(Globals.RENDER_FLAG_RENDER_SCREEN_FRAMEBUFFER_CONTENT){
+// if(Globals.RENDER_FLAG_RENDER_SCREEN_FRAMEBUFFER_CONTENT){
- updateMouseVariables();
+// updateMouseVariables();
- if(Crosshair.getCrosshairActive()){
+// if(Crosshair.getCrosshairActive()){
- if(Globals.playerCharacter != null){
- Vector3d charPos = EntityUtils.getPosition(Globals.playerCharacter);
- CameraEntityUtils.setCameraCenter(Globals.playerCamera, new Vector3f((float)charPos.x,(float)charPos.y,(float)charPos.z));
- }
+// if(Globals.playerCharacter != null){
+// Vector3d charPos = EntityUtils.getPosition(Globals.playerCharacter);
+// CameraEntityUtils.setCameraCenter(Globals.playerCamera, new Vector3f((float)charPos.x,(float)charPos.y,(float)charPos.z));
+// }
- Vector3d characterPos = EntityUtils.getPosition(Globals.playerCharacter);
- Vector3d targetPos = Crosshair.getTargetPosition();
- Vector3d diffed = new Vector3d(targetPos).sub(characterPos).mul(-1).normalize();
- cameraRotationVector.set((float)diffed.x, 0.5f, (float)diffed.z).normalize();
+// Vector3d characterPos = EntityUtils.getPosition(Globals.playerCharacter);
+// Vector3d targetPos = Crosshair.getTargetPosition();
+// Vector3d diffed = new Vector3d(targetPos).sub(characterPos).mul(-1).normalize();
+// cameraRotationVector.set((float)diffed.x, 0.5f, (float)diffed.z).normalize();
- yaw = (float)Math.toDegrees(Math.atan2(diffed.z, diffed.x));
+// yaw = (float)Math.toDegrees(Math.atan2(diffed.z, diffed.x));
- CameraEntityUtils.setCameraPitch(Globals.playerCamera, pitch);
- CameraEntityUtils.setCameraYaw(Globals.playerCamera, yaw);
+// CameraEntityUtils.setCameraPitch(Globals.playerCamera, pitch);
+// CameraEntityUtils.setCameraYaw(Globals.playerCamera, yaw);
- } else {
- CameraEntityUtils.setCameraPitch(Globals.playerCamera, pitch);
- CameraEntityUtils.setCameraYaw(Globals.playerCamera, yaw);
+// } else {
+// CameraEntityUtils.setCameraPitch(Globals.playerCamera, pitch);
+// CameraEntityUtils.setCameraYaw(Globals.playerCamera, yaw);
- if(Globals.playerCharacter != null){
- Vector3d charPos = EntityUtils.getPosition(Globals.playerCharacter);
- CameraEntityUtils.setCameraCenter(Globals.playerCamera, new Vector3f((float)charPos.x,(float)charPos.y,(float)charPos.z));
- }
+// if(Globals.playerCharacter != null){
+// Vector3d charPos = EntityUtils.getPosition(Globals.playerCharacter);
+// CameraEntityUtils.setCameraCenter(Globals.playerCamera, new Vector3f((float)charPos.x,(float)charPos.y,(float)charPos.z));
+// }
- float cam_Player_Orbit_Magnitude = 5f;
- cameraRotationVector.x = 0 + (float) Math.cos(yaw / 180.0f * Math.PI) * cam_Player_Orbit_Magnitude;
- cameraRotationVector.y = 0 + (float) Math.sin(pitch / 180.0f * Math.PI) * cam_Player_Orbit_Magnitude;
- cameraRotationVector.z = 0 + (float) Math.sin(yaw / 180.0f * Math.PI) * cam_Player_Orbit_Magnitude;
- cameraRotationVector.normalize();
- }
+// float cam_Player_Orbit_Magnitude = 5f;
+// cameraRotationVector.x = 0 + (float) Math.cos(yaw / 180.0f * Math.PI) * cam_Player_Orbit_Magnitude;
+// cameraRotationVector.y = 0 + (float) Math.sin(pitch / 180.0f * Math.PI) * cam_Player_Orbit_Magnitude;
+// cameraRotationVector.z = 0 + (float) Math.sin(yaw / 180.0f * Math.PI) * cam_Player_Orbit_Magnitude;
+// cameraRotationVector.normalize();
+// }
- CameraEntityUtils.setCameraEye(Globals.playerCamera, cameraRotationVector);
+// CameraEntityUtils.setCameraEye(Globals.playerCamera, cameraRotationVector);
-// if(Crosshair.getCrosshairActive()){
-// CameraEntityUtils.setCameraEye(Globals.playerCamera, cameraRotationVector);
-// } else {
-// CameraEntityUtils.setCameraEye(Globals.playerCamera, cameraRotationVector);
-// }
+// // if(Crosshair.getCrosshairActive()){
+// // CameraEntityUtils.setCameraEye(Globals.playerCamera, cameraRotationVector);
+// // } else {
+// // CameraEntityUtils.setCameraEye(Globals.playerCamera, cameraRotationVector);
+// // }
-// if(Globals.playerCharacter != null){
-// Vector3f playerPos = EntityUtils.getPosition(Globals.playerCharacter);
-// if(posX == -1 && playerPos.x > 100){
-// posX = playerPos.x;
-// posZ = playerPos.z;
-// }
-// posX = posX - (cameraRotationVector.x * 0.01);
-// posZ = posZ - (cameraRotationVector.z * 0.01);
-// Vector3f moveVec = new Vector3f(-cameraRotationVector.x,0,-cameraRotationVector.z);
-// Quaternionf playerRot = new Quaternionf().rotationTo(new Vector3f(0,0,1), moveVec);
-// EntityUtils.getRotation(Globals.playerCharacter).set(playerRot);
-// EntityUtils.getPosition(Globals.playerCharacter).set((float)posX,playerPos.y,(float)posZ);
-// }
+// // if(Globals.playerCharacter != null){
+// // Vector3f playerPos = EntityUtils.getPosition(Globals.playerCharacter);
+// // if(posX == -1 && playerPos.x > 100){
+// // posX = playerPos.x;
+// // posZ = playerPos.z;
+// // }
+// // posX = posX - (cameraRotationVector.x * 0.01);
+// // posZ = posZ - (cameraRotationVector.z * 0.01);
+// // Vector3f moveVec = new Vector3f(-cameraRotationVector.x,0,-cameraRotationVector.z);
+// // Quaternionf playerRot = new Quaternionf().rotationTo(new Vector3f(0,0,1), moveVec);
+// // EntityUtils.getRotation(Globals.playerCharacter).set(playerRot);
+// // EntityUtils.getPosition(Globals.playerCharacter).set((float)posX,playerPos.y,(float)posZ);
+// // }
- Globals.viewMatrix = CameraEntityUtils.getCameraViewMatrix(Globals.playerCamera);
- }
+// Globals.viewMatrix = CameraEntityUtils.getCameraViewMatrix(Globals.playerCamera);
+// }
@@ -426,27 +426,27 @@ public class Main {
- public static void updateMouseVariables(){
- glfwGetCursorPos(Globals.window, mouse_X_Buffer, mouse_Y_Buffer);
- xpos = mouse_X_Buffer[0];
- ypos = mouse_Y_Buffer[0];
- float xoffset = (float) (xpos - mouse_lastX) * mouseSensitivity;
- float yoffset = (float) (mouse_lastY - ypos) * mouseSensitivity;
- mouse_lastX = (float) xpos;
- mouse_lastY = (float) ypos;
+ // public static void updateMouseVariables(){
+ // glfwGetCursorPos(Globals.window, mouse_X_Buffer, mouse_Y_Buffer);
+ // xpos = mouse_X_Buffer[0];
+ // ypos = mouse_Y_Buffer[0];
+ // float xoffset = (float) (xpos - mouse_lastX) * mouseSensitivity;
+ // float yoffset = (float) (mouse_lastY - ypos) * mouseSensitivity;
+ // mouse_lastX = (float) xpos;
+ // mouse_lastY = (float) ypos;
- if(Globals.controlHandler != null && !Globals.controlHandler.isMouseVisible()){
- yaw = yaw + xoffset;
- pitch = pitch - yoffset;
+ // if(Globals.controlHandler != null && !Globals.controlHandler.isMouseVisible()){
+ // yaw = yaw + xoffset;
+ // pitch = pitch - yoffset;
- if (pitch > 100.0f) {
- pitch = 100.0f;
- }
- if (pitch < -99.0f) {
- pitch = -99.0f;
- }
- }
- }
+ // if (pitch > 100.0f) {
+ // pitch = 100.0f;
+ // }
+ // if (pitch < -99.0f) {
+ // pitch = -99.0f;
+ // }
+ // }
+ // }
diff --git a/src/main/java/electrosphere/menu/Menu.java b/src/main/java/electrosphere/menu/Menu.java
deleted file mode 100644
index 3023a605..00000000
--- a/src/main/java/electrosphere/menu/Menu.java
+++ /dev/null
@@ -1,104 +0,0 @@
-package electrosphere.menu;
-
-import electrosphere.audio.AudioSource;
-import electrosphere.audio.AudioUtils;
-import electrosphere.main.Globals;
-import electrosphere.renderer.ui.Widget;
-import electrosphere.renderer.ui.font.TextBox;
-import java.util.ArrayList;
-import java.util.List;
-import org.joml.Vector3f;
-
-/**
- *
- * @author amaterasu
- */
-public class Menu {
-
- public enum MenuType {
- TITLE_MENU,
- WORLD_SELECT_MENU, //select preexisting world (Char already created)
- WORLD_CREATE_MENU, //create world
- SAVE_CREATE_MENU, //select basic save settings
- CHARACTER_CREATE_MENU, //create character
- FINALIZE_SAVE_CREATION_MENU, //finalize the save before we commit
- MULTIPLAYER_MENU,
- IP_MENU,
- OPTIONS_MAIN_MENU,
- IN_GAME_MAIN_MENU,
- TEST,
- INVENTORY_NATURAL,
- }
-
- MenuType type;
-
- int option = 0;
- int optionMax = 0;
-
- List widgetList = new ArrayList();
- List optionList = new ArrayList();
-
- public Menu(MenuType type){
- this.type = type;
- }
-
- public void addOption(Widget option){
- widgetList.add(option);
- optionList.add(option);
- optionMax++;
- }
-
- public void addElement(Widget element){
- widgetList.add(element);
- }
-
- public void dispose(){
- for(Widget w : widgetList){
- Globals.widgetManager.unregisterWidget(w);
- }
- widgetList.clear();
- optionList.clear();
- }
-
- public void incrementMenuOption(){
- setMenuOptionColor(option,new Vector3f(1.0f,1.0f,1.0f));
- option++;
- if(option>=optionMax){
- option = 0;
- }
- setMenuOptionColor(option,new Vector3f(0.2f,0.8f,0.5f));
- AudioSource startupSound = AudioUtils.playAudioAtLocation("/Audio/MenuChangeOption.ogg", new Vector3f(0,0,0));
- }
-
- public void decrementMenuOption(){
- setMenuOptionColor(option,new Vector3f(1.0f,1.0f,1.0f));
- option--;
- if(option < 0){
- option = optionMax - 1;
- }
- setMenuOptionColor(option,new Vector3f(0.2f,0.8f,0.5f));
- AudioSource startupSound = AudioUtils.playAudioAtLocation("/Audio/MenuChangeOption.ogg", new Vector3f(0,0,0));
- }
-
- public Widget getCurrentOption(){
- return optionList.get(option);
- }
-
- public MenuType getType(){
- return type;
- }
-
- public void setMenuOptionColor(int option, Vector3f color){
- if(optionList.get(option) instanceof TextBox){
- ((TextBox)optionList.get(option)).setColor(color);
- }
- }
-
- public List getOptions(){
- return optionList;
- }
-
- public List getWidgets(){
- return widgetList;
- }
-}
diff --git a/src/main/java/electrosphere/menu/MenuCallbacks.java b/src/main/java/electrosphere/menu/MenuCallbacks.java
new file mode 100644
index 00000000..1878cf27
--- /dev/null
+++ b/src/main/java/electrosphere/menu/MenuCallbacks.java
@@ -0,0 +1,357 @@
+package electrosphere.menu;
+
+import electrosphere.audio.AudioSource;
+import electrosphere.audio.AudioUtils;
+import electrosphere.controls.ControlHandler;
+import electrosphere.controls.ControlHandler.ControlsState;
+import electrosphere.engine.LoadingThread;
+import electrosphere.game.server.saves.SaveUtils;
+import electrosphere.main.Globals;
+import electrosphere.main.Main;
+import electrosphere.net.NetUtils;
+import electrosphere.net.client.ClientNetworking;
+import electrosphere.renderer.ui.DrawableElement;
+import electrosphere.renderer.ui.elements.Label;
+
+import org.joml.Vector3f;
+
+/**
+ *
+ * @author amaterasu
+ */
+public class MenuCallbacks {
+// public static void selectOption(Menu m){
+// switch(m.getType()){
+// case TITLE_MENU:
+// switch(((TextBox)m.getCurrentOption()).getText()){
+// //single player
+// case "SINGLEPLAYER":
+// // m.dispose();
+// // Globals.loadingThread = new LoadingThread(LoadingThread.LOAD_MAIN_GAME);
+// // Globals.RUN_CLIENT = true;
+// // Globals.RUN_SERVER = true;
+// // Globals.loadingThread.start();
+// m.dispose();
+// Globals.currentMenu = MenuGenerators.createWorldSelectMenu();
+// break;
+// //multi player
+// case "MULTIPLAYER":
+// m.dispose();
+// Globals.currentMenu = MenuGenerators.createMultiplayerMenu();
+// break;
+// //arena
+// case "ARENA":
+// m.dispose();
+// Globals.loadingThread = new LoadingThread(LoadingThread.LOAD_ARENA);
+// Globals.RUN_CLIENT = true;
+// Globals.RUN_SERVER = true;
+// Globals.loadingThread.start();
+// break;
+// //options
+// case "OPTIONS":
+// m.dispose();
+// Globals.currentMenu = MenuGenerators.createOptionsMainMenu();
+// break;
+// //test
+// case "UI TESTING":
+// m.dispose();
+// Globals.currentMenu = MenuGenerators.createTestMainMenu();
+// break;
+// }
+// break;
+// case WORLD_SELECT_MENU:
+// switch(((TextBox)m.getCurrentOption()).getText()){
+// case "CREATE WORLD":
+// m.dispose();
+// Globals.currentMenu = MenuGenerators.createWorldCreationMenu();
+// break;
+// default:
+// String worldName = ((TextBox)m.getCurrentOption()).getText();
+// m.dispose();
+// //check if has save or not
+// if(SaveUtils.worldHasSave(worldName.toLowerCase())){
+// Globals.loadingThread = new LoadingThread(LoadingThread.LOAD_MAIN_GAME);
+// Globals.RUN_CLIENT = true;
+// Globals.RUN_SERVER = true;
+// Globals.loadingThread.start();
+// } else {
+// Globals.currentSaveName = worldName.toLowerCase();
+// SaveUtils.loadTerrainAndCreateWorldData();
+// Globals.currentMenu = MenuGenerators.createSaveCreationMenu();
+// }
+// break;
+// }
+// break;
+// case WORLD_CREATE_MENU:
+// break;
+// case SAVE_CREATE_MENU:
+// switch(((TextBox)m.getCurrentOption()).getText()){
+// case "SAVE":
+// m.dispose();
+// SaveUtils.saveWorldDataToSave(Globals.currentSaveName);
+// Globals.currentMenu = MenuGenerators.createWorldSelectMenu();
+// break;
+// case "CANCEL":
+// m.dispose();
+// Globals.currentMenu = MenuGenerators.createWorldSelectMenu();
+// break;
+// }
+// break;
+// case CHARACTER_CREATE_MENU:
+// break;
+// case FINALIZE_SAVE_CREATION_MENU:
+// break;
+// case MULTIPLAYER_MENU:
+// switch(((TextBox)m.getCurrentOption()).getText()){
+// //HOST
+// case "HOST":
+// m.dispose();
+// Globals.loadingThread = new LoadingThread(LoadingThread.LOAD_MAIN_GAME);
+// Globals.RUN_CLIENT = true;
+// Globals.RUN_SERVER = true;
+// Globals.loadingThread.start();
+// break;
+// //JOIN
+// case "JOIN":
+// m.dispose();
+// Globals.currentMenu = MenuGenerators.createIPMenu();
+// break;
+// //back
+// case "BACK":
+// backout(m);
+// break;
+
+// }
+// break;
+// case IP_MENU:
+// switch(((TextBox)m.getCurrentOption()).getText()){
+// //connect
+// case "CONNECT":
+// NetUtils.setAddress( ( (TextBox)m.getOptions().get(0) ).getText() );
+// NetUtils.setPort( Integer.parseInt( ( (TextBox)m.getOptions().get(1) ).getText() ) );
+// m.dispose();
+// Globals.loadingThread = new LoadingThread(LoadingThread.LOAD_MAIN_GAME);
+// Globals.RUN_CLIENT = true;
+// Globals.RUN_SERVER = false;
+// Globals.loadingThread.start();
+// break;
+// //back
+// case "BACK":
+// backout(m);
+// break;
+// }
+// break;
+// case IN_GAME_MAIN_MENU:
+// switch(((Label)m.getCurrentOption()).getText()){
+// //connect
+// case "QUIT":
+// //TODO: actually shut down program
+// Globals.ENGINE_SHUTDOWN_FLAG = true;
+// break;
+// //back
+// case "BACK":
+// MenuGenerators.makeMenuUndrawable(Globals.currentMenu);
+// Globals.currentMenu.dispose();
+// Globals.controlHandler.setHandlerState(ControlsState.MAIN_GAME);
+// break;
+// }
+// break;
+// }
+// }
+
+// public static void backout(Menu m){
+// AudioSource startupSound = AudioUtils.playAudioAtLocation("/Audio/MenuBackspace.ogg", new Vector3f(0,0,0));
+// switch(m.getType()){
+// case TITLE_MENU:
+// Main.running = false;
+// break;
+// case WORLD_SELECT_MENU:
+// m.dispose();
+// Globals.currentMenu = MenuGenerators.createTitleMenu();
+// break;
+// case WORLD_CREATE_MENU:
+// m.dispose();
+// Globals.currentMenu = MenuGenerators.createWorldSelectMenu();
+// break;
+// case SAVE_CREATE_MENU:
+// m.dispose();
+// Globals.currentMenu = MenuGenerators.createWorldSelectMenu();
+// break;
+// case CHARACTER_CREATE_MENU:
+// m.dispose();
+// Globals.currentMenu = MenuGenerators.createSaveCreationMenu();
+// break;
+// case FINALIZE_SAVE_CREATION_MENU:
+// m.dispose();
+// Globals.currentMenu = MenuGenerators.createCharacterCreationMenu();
+// break;
+// case MULTIPLAYER_MENU:
+// m.dispose();
+// Globals.currentMenu = MenuGenerators.createTitleMenu();
+// break;
+// case IP_MENU:
+// m.dispose();
+// Globals.currentMenu = MenuGenerators.createMultiplayerMenu();
+// break;
+// case OPTIONS_MAIN_MENU:
+// m.dispose();
+// Globals.currentMenu = MenuGenerators.createTitleMenu();
+// break;
+// case TEST:
+// m.dispose();
+// Globals.currentMenu = MenuGenerators.createTitleMenu();
+// break;
+// case IN_GAME_MAIN_MENU:
+// MenuGenerators.makeMenuUndrawable(Globals.currentMenu);
+// Globals.currentMenu.dispose();
+// Globals.controlHandler.setHandlerState(ControlsState.MAIN_GAME);
+// break;
+// case INVENTORY_NATURAL:
+// MenuGenerators.makeMenuUndrawable(Globals.currentMenu);
+// Globals.currentMenu.dispose();
+// Globals.controlHandler.setHandlerState(ControlsState.MAIN_GAME);
+// Globals.controlHandler.hideMouse();
+// break;
+// }
+// }
+
+// public static void menuHandleKeypress(Menu m, String keycode){
+// char toWrite = ' ';
+// DrawableElement currentOption = m.getCurrentOption();
+// boolean backspace = false;
+// switch(keycode){
+// case ControlHandler.DATA_STRING_INPUT_CODE_MENU_TYPE_BACKSPACE:
+// if(currentOption instanceof TextBox){
+// TextBox currentTextBox = (TextBox)currentOption;
+// String currentText = currentTextBox.getText();
+// if(currentText.length() > 0){
+// currentTextBox.setText(currentText.substring(0, currentText.length() - 1));
+// AudioSource startupSound = AudioUtils.playAudioAtLocation("/Audio/MenuBackspace.ogg", new Vector3f(0,0,0));
+// }
+// }
+// backspace = true;
+// break;
+// case ControlHandler.DATA_STRING_INPUT_CODE_MENU_TYPE_0:
+// toWrite = '0';
+// break;
+// case ControlHandler.DATA_STRING_INPUT_CODE_MENU_TYPE_1:
+// toWrite = '1';
+// break;
+// case ControlHandler.DATA_STRING_INPUT_CODE_MENU_TYPE_2:
+// toWrite = '2';
+// break;
+// case ControlHandler.DATA_STRING_INPUT_CODE_MENU_TYPE_3:
+// toWrite = '3';
+// break;
+// case ControlHandler.DATA_STRING_INPUT_CODE_MENU_TYPE_4:
+// toWrite = '4';
+// break;
+// case ControlHandler.DATA_STRING_INPUT_CODE_MENU_TYPE_5:
+// toWrite = '5';
+// break;
+// case ControlHandler.DATA_STRING_INPUT_CODE_MENU_TYPE_6:
+// toWrite = '6';
+// break;
+// case ControlHandler.DATA_STRING_INPUT_CODE_MENU_TYPE_7:
+// toWrite = '7';
+// break;
+// case ControlHandler.DATA_STRING_INPUT_CODE_MENU_TYPE_8:
+// toWrite = '8';
+// break;
+// case ControlHandler.DATA_STRING_INPUT_CODE_MENU_TYPE_9:
+// toWrite = '9';
+// break;
+// case ControlHandler.DATA_STRING_INPUT_CODE_MENU_TYPE_A:
+// toWrite = 'A';
+// break;
+// case ControlHandler.DATA_STRING_INPUT_CODE_MENU_TYPE_B:
+// toWrite = 'B';
+// break;
+// case ControlHandler.DATA_STRING_INPUT_CODE_MENU_TYPE_C:
+// toWrite = 'C';
+// break;
+// case ControlHandler.DATA_STRING_INPUT_CODE_MENU_TYPE_D:
+// toWrite = 'D';
+// break;
+// case ControlHandler.DATA_STRING_INPUT_CODE_MENU_TYPE_E:
+// toWrite = 'E';
+// break;
+// case ControlHandler.DATA_STRING_INPUT_CODE_MENU_TYPE_F:
+// toWrite = 'F';
+// break;
+// case ControlHandler.DATA_STRING_INPUT_CODE_MENU_TYPE_G:
+// toWrite = 'G';
+// break;
+// case ControlHandler.DATA_STRING_INPUT_CODE_MENU_TYPE_H:
+// toWrite = 'H';
+// break;
+// case ControlHandler.DATA_STRING_INPUT_CODE_MENU_TYPE_I:
+// toWrite = 'I';
+// break;
+// case ControlHandler.DATA_STRING_INPUT_CODE_MENU_TYPE_J:
+// toWrite = 'J';
+// break;
+// case ControlHandler.DATA_STRING_INPUT_CODE_MENU_TYPE_K:
+// toWrite = 'K';
+// break;
+// case ControlHandler.DATA_STRING_INPUT_CODE_MENU_TYPE_L:
+// toWrite = 'L';
+// break;
+// case ControlHandler.DATA_STRING_INPUT_CODE_MENU_TYPE_M:
+// toWrite = 'M';
+// break;
+// case ControlHandler.DATA_STRING_INPUT_CODE_MENU_TYPE_N:
+// toWrite = 'N';
+// break;
+// case ControlHandler.DATA_STRING_INPUT_CODE_MENU_TYPE_O:
+// toWrite = 'O';
+// break;
+// case ControlHandler.DATA_STRING_INPUT_CODE_MENU_TYPE_P:
+// toWrite = 'P';
+// break;
+// case ControlHandler.DATA_STRING_INPUT_CODE_MENU_TYPE_Q:
+// toWrite = 'Q';
+// break;
+// case ControlHandler.DATA_STRING_INPUT_CODE_MENU_TYPE_R:
+// toWrite = 'R';
+// break;
+// case ControlHandler.DATA_STRING_INPUT_CODE_MENU_TYPE_S:
+// toWrite = 'S';
+// break;
+// case ControlHandler.DATA_STRING_INPUT_CODE_MENU_TYPE_T:
+// toWrite = 'T';
+// break;
+// case ControlHandler.DATA_STRING_INPUT_CODE_MENU_TYPE_U:
+// toWrite = 'U';
+// break;
+// case ControlHandler.DATA_STRING_INPUT_CODE_MENU_TYPE_V:
+// toWrite = 'V';
+// break;
+// case ControlHandler.DATA_STRING_INPUT_CODE_MENU_TYPE_W:
+// toWrite = 'W';
+// break;
+// case ControlHandler.DATA_STRING_INPUT_CODE_MENU_TYPE_X:
+// toWrite = 'X';
+// break;
+// case ControlHandler.DATA_STRING_INPUT_CODE_MENU_TYPE_Y:
+// toWrite = 'Y';
+// break;
+// case ControlHandler.DATA_STRING_INPUT_CODE_MENU_TYPE_Z:
+// toWrite = 'Z';
+// break;
+// case ControlHandler.DATA_STRING_INPUT_CODE_MENU_TYPE_PERIOD:
+// toWrite = '.';
+// break;
+// }
+// if(!backspace){
+// if(currentOption instanceof TextBox){
+// TextBox currentTextBox = (TextBox)currentOption;
+// String currentText = currentTextBox.getText();
+// if(currentText.length() < currentTextBox.getCols()){
+// currentTextBox.setText(currentText + toWrite);
+// AudioSource startupSound = AudioUtils.playAudioAtLocation("/Audio/MenuType.ogg", new Vector3f(0,0,0));
+// }
+// }
+// }
+// }
+}
diff --git a/src/main/java/electrosphere/menu/MenuGenerators.java b/src/main/java/electrosphere/menu/MenuGenerators.java
new file mode 100644
index 00000000..9f67e279
--- /dev/null
+++ b/src/main/java/electrosphere/menu/MenuGenerators.java
@@ -0,0 +1,548 @@
+package electrosphere.menu;
+
+import electrosphere.engine.LoadingThread;
+import electrosphere.entity.Entity;
+import electrosphere.entity.state.inventory.InventoryUtils;
+import electrosphere.entity.state.inventory.UnrelationalInventoryState;
+import electrosphere.entity.types.item.ItemUtils;
+import electrosphere.game.server.saves.SaveUtils;
+import electrosphere.main.Globals;
+import electrosphere.net.NetUtils;
+import electrosphere.net.server.Server;
+import electrosphere.renderer.ui.ClickableElement;
+import electrosphere.renderer.ui.DrawableElement;
+import electrosphere.renderer.ui.Element;
+import electrosphere.renderer.ui.FocusableElement;
+import electrosphere.renderer.ui.WidgetUtils;
+import electrosphere.renderer.ui.Window;
+import electrosphere.renderer.ui.DraggableElement.DragEventCallback;
+import electrosphere.renderer.ui.elements.Button;
+import electrosphere.renderer.ui.elements.Div;
+import electrosphere.renderer.ui.elements.ImagePanel;
+import electrosphere.renderer.ui.elements.Label;
+import electrosphere.renderer.ui.elements.TextInput;
+import electrosphere.renderer.ui.events.ClickEvent;
+import electrosphere.renderer.ui.events.DragEvent;
+import electrosphere.renderer.ui.form.FormElement;
+
+import java.util.List;
+import org.joml.Vector3f;
+
+/**
+ *
+ * @author amaterasu
+ */
+public class MenuGenerators {
+
+
+ public static Element createTitleMenu(){
+ FormElement rVal = new FormElement();
+
+ //label (title)
+ Label titleLabel = new Label(100,150,1.0f);
+ titleLabel.setText("ORPG");
+ rVal.addChild(titleLabel);
+
+ //button (multiplayer)
+ Button singleplayerButton = new Button();
+ Label singleplayerLabel = new Label(100,275,1.0f);
+ singleplayerLabel.setText("Singleplayer");
+ singleplayerButton.addChild(singleplayerLabel);
+ rVal.addChild(singleplayerButton);
+ singleplayerButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){
+ Globals.loadingThread = new LoadingThread(LoadingThread.LOAD_MAIN_GAME);
+ Globals.RUN_CLIENT = true;
+ Globals.RUN_SERVER = true;
+ Globals.loadingThread.start();
+ return false;
+ }});
+
+ //button (multiplayer)
+ Button multiplayerButton = new Button();
+ Label multiplayerLabel = new Label(100,350,1.0f);
+ multiplayerLabel.setText("Multiplayer");
+ multiplayerButton.addChild(multiplayerLabel);
+ rVal.addChild(multiplayerButton);
+ multiplayerButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){
+ WindowUtils.replaceMainMenuContents(MenuGenerators.createMultiplayerMenu());
+ return false;
+ }});
+
+ //button (arena)
+ Button arenaButton = new Button();
+ Label arenaLabel = new Label(100,425,1.0f);
+ arenaLabel.setText("Arena");
+ arenaButton.addChild(arenaLabel);
+ rVal.addChild(arenaButton);
+ arenaButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){
+ Globals.loadingThread = new LoadingThread(LoadingThread.LOAD_ARENA);
+ Globals.RUN_CLIENT = true;
+ Globals.RUN_SERVER = true;
+ Globals.loadingThread.start();
+ return false;
+ }});
+
+ //button (options)
+ Button optionsButton = new Button();
+ Label optionsLabel = new Label(100,500,1.0f);
+ optionsLabel.setText("Options");
+ optionsButton.addChild(optionsLabel);
+ rVal.addChild(optionsButton);
+ optionsButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){
+ WindowUtils.replaceMainMenuContents(MenuGenerators.createOptionsMainMenu());
+ return false;
+ }});
+
+ //button (ui testing)
+ Button uiTestingButton = new Button();
+ Label uiTestingLabel = new Label(100,575,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());
+ return false;
+ }});
+
+ return rVal;
+ }
+
+ public static Element createWorldSelectMenu(){
+ FormElement rVal = new FormElement();
+ int screenTop = Globals.WINDOW_HEIGHT - 150;
+ List saveNames = SaveUtils.getSaves();
+ int verticalPosition = 125;
+ for(String saveName : saveNames){
+ if(!saveName.startsWith(".")){
+
+ //button (select save)
+ Button selectButton = new Button();
+ Label selectLabel = new Label(100,125 + verticalPosition,1.0f);
+ selectLabel.setText(saveName.toUpperCase());
+ selectButton.addChild(selectLabel);
+ rVal.addChild(selectButton);
+ selectButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){
+ if(SaveUtils.worldHasSave(saveName.toLowerCase())){
+ Globals.loadingThread = new LoadingThread(LoadingThread.LOAD_MAIN_GAME);
+ Globals.RUN_CLIENT = true;
+ Globals.RUN_SERVER = true;
+ Globals.loadingThread.start();
+ } else {
+ Globals.currentSaveName = saveName.toLowerCase();
+ SaveUtils.loadTerrainAndCreateWorldData();
+ WindowUtils.replaceMainMenuContents(MenuGenerators.createSaveCreationMenu());
+ }
+ return false;
+ }});
+
+ verticalPosition = verticalPosition + 75;
+ }
+ }
+
+ //button (create)
+ Button createButton = new Button();
+ Label createLabel = new Label(100,125 + verticalPosition + 200,1.0f);
+ createLabel.setText("Create World");
+ createButton.addChild(createLabel);
+ rVal.addChild(createButton);
+ createButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){
+ WindowUtils.replaceMainMenuContents(MenuGenerators.createWorldCreationMenu());
+ return false;
+ }});
+
+ return rVal;
+ }
+
+ public static Element createWorldCreationMenu(){
+ FormElement rVal = new FormElement();
+ int screenTop = 150;
+ List saveNames = SaveUtils.getSaves();
+ int verticalPosition = 125;
+
+ //TODO: add text input to name world
+
+ //button (create)
+ Button createButton = new Button();
+ Label createLabel = new Label(100,screenTop + verticalPosition,1.0f);
+ createLabel.setText("Not implemented");
+ createButton.addChild(createLabel);
+ rVal.addChild(createButton);
+ createButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){
+ WindowUtils.replaceMainMenuContents(MenuGenerators.createWorldCreationMenu());
+ return false;
+ }});
+
+ return rVal;
+ }
+
+ public static Element createSaveCreationMenu(){
+ FormElement rVal = new FormElement();
+ int screenTop = 150;
+
+ //button (save)
+ Button saveButton = new Button();
+ Label saveLabel = new Label(100,screenTop + 125,1.0f);
+ saveLabel.setText("Save");
+ saveButton.addChild(saveLabel);
+ rVal.addChild(saveButton);
+ saveButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){
+ SaveUtils.saveWorldDataToSave(Globals.currentSaveName);
+ WindowUtils.replaceMainMenuContents(MenuGenerators.createWorldSelectMenu());
+ return false;
+ }});
+
+ //button (cancel)
+ Button cancelButton = new Button();
+ Label cancelLabel = new Label(100,screenTop + 200,1.0f);
+ cancelLabel.setText("Cancel");
+ cancelButton.addChild(cancelLabel);
+ rVal.addChild(cancelButton);
+ saveButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){
+ WindowUtils.replaceMainMenuContents(MenuGenerators.createWorldSelectMenu());
+ return false;
+ }});
+
+ return rVal;
+ }
+
+ public static Element createCharacterCreationMenu(){
+ FormElement rVal = new FormElement();
+ int screenTop = 150;
+ List saveNames = SaveUtils.getSaves();
+ int verticalPosition = 125;
+
+ //TODO: add text input to name world
+
+ //button (create)
+ Button createButton = new Button();
+ Label createLabel = new Label(100,screenTop + verticalPosition,1.0f);
+ createLabel.setText("Create World");
+ createButton.addChild(createLabel);
+ rVal.addChild(createButton);
+
+
+ return rVal;
+ }
+
+ public static Element createFinalizeSaveCreationMenu(){
+ FormElement rVal = new FormElement();
+ int screenTop = 150;
+ List saveNames = SaveUtils.getSaves();
+ int verticalPosition = 125;
+
+ //TODO: add text input to name world
+
+ //button (create)
+ Button createButton = new Button();
+ Label createLabel = new Label(100,screenTop + verticalPosition,1.0f);
+ createLabel.setText("Create World");
+ createButton.addChild(createLabel);
+ rVal.addChild(createButton);
+
+ return rVal;
+ }
+
+ public static Element createMultiplayerMenu(){
+ FormElement rVal = new FormElement();
+ int screenTop = 150;
+
+ //button (host)
+ Button hostButton = new Button();
+ Label hostLabel = new Label(100,screenTop + 125,1.0f);
+ hostLabel.setText("Host");
+ hostButton.addChild(hostLabel);
+ rVal.addChild(hostButton);
+ hostButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){
+ Globals.loadingThread = new LoadingThread(LoadingThread.LOAD_MAIN_GAME);
+ Globals.RUN_CLIENT = true;
+ Globals.RUN_SERVER = true;
+ Globals.loadingThread.start();
+ return false;
+ }});
+
+ //button (join)
+ Button joinButton = new Button();
+ Label joinLabel = new Label(100,screenTop + 200,1.0f);
+ joinLabel.setText("Join");
+ joinButton.addChild(joinLabel);
+ rVal.addChild(joinButton);
+ joinButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){
+ WindowUtils.replaceMainMenuContents(MenuGenerators.createIPMenu());
+ return false;
+ }});
+
+
+ //button (back)
+ Button connectButton = new Button();
+ Label connectLabel = new Label(100,screenTop + 275,1.0f);
+ connectLabel.setText("Back");
+ connectButton.addChild(connectLabel);
+ rVal.addChild(connectButton);
+ connectButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){
+ WindowUtils.replaceMainMenuContents(MenuGenerators.createTitleMenu());
+ return false;
+ }});
+
+ return rVal;
+ }
+
+ public static Element createIPMenu(){
+ FormElement rVal = new FormElement();
+ int screenTop = 150;
+
+ //label (address)
+ Label addressLabel = new Label(100,screenTop + 50,1.0f);
+ addressLabel.setText("IP Address");
+ rVal.addChild(addressLabel);
+
+ //text entry (address)
+ TextInput addressInput = new TextInput(100,screenTop + 125,40*15, 40);
+ addressInput.setText(NetUtils.getAddress());
+ rVal.addChild(addressInput);
+
+ //label (port)
+ Label portLabel = new Label(100,screenTop + 200,1.0f);
+ portLabel.setText("Port");
+ rVal.addChild(portLabel);
+
+ //text entry (port)
+ TextInput portInput = new TextInput(100,screenTop + 275,40*5, 40);
+ rVal.addChild(portInput);
+
+ //button (connect)
+ Button connectButton = new Button();
+ Label connectLabel = new Label(100,screenTop + 350,1.0f);
+ connectLabel.setText("Back");
+ connectButton.addChild(connectLabel);
+ rVal.addChild(connectButton);
+ connectButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){
+ NetUtils.setAddress(addressInput.getText());
+ NetUtils.setPort(Integer.parseInt(portInput.getText()));
+ Globals.loadingThread = new LoadingThread(LoadingThread.LOAD_MAIN_GAME);
+ Globals.RUN_CLIENT = true;
+ Globals.RUN_SERVER = false;
+ Globals.loadingThread.start();
+ return false;
+ }});
+
+ //button (back)
+ Button backButton = new Button();
+ Label backLabel = new Label(100,screenTop + 425,1.0f);
+ backLabel.setText("Back");
+ backButton.addChild(backLabel);
+ rVal.addChild(backButton);
+ backButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){
+ WindowUtils.replaceMainMenuContents(MenuGenerators.createMultiplayerMenu());
+ return false;
+ }});
+
+ return rVal;
+ }
+
+ public static Element createOptionsMainMenu(){
+ FormElement rVal = new FormElement();
+ int screenTop = 150;
+
+ //label (options)
+ Label optionsLabel = new Label(100,screenTop + 50,1.0f);
+ optionsLabel.setText("Options");
+ rVal.addChild(optionsLabel);
+
+ //button (back)
+ Button backButton = new Button();
+ Label backLabel = new Label(100,screenTop + 275,1.0f);
+ backLabel.setText("Back");
+ backButton.addChild(backLabel);
+ rVal.addChild(backButton);
+ backButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){
+ WindowUtils.replaceMainMenuContents(MenuGenerators.createTitleMenu());
+ return false;
+ }});
+
+ return rVal;
+ }
+
+ public static Element createUITestMenu(){
+ FormElement rVal = new FormElement();
+ int screenTop = 150;
+
+ //button (back)
+ Button backButton = new Button();
+ Label backLabel = new Label(100,screenTop + 275,1.0f);
+ backLabel.setText("Back");
+ backButton.addChild(backLabel);
+ rVal.addChild(backButton);
+ backButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){
+ WindowUtils.replaceMainMenuContents(MenuGenerators.createTitleMenu());
+ return false;
+ }});
+
+ return rVal;
+ }
+
+ public static Element worldItemDropCaptureWindow(){
+ Div rVal = new Div();
+ rVal.setOnDragRelease(new DragEventCallback() {public boolean execute(DragEvent event){
+ if(Globals.draggedItem != null){
+ //remove item from inventory
+ Globals.dragSourceInventory.removeItem(Globals.draggedItem);
+ //drop item
+ InventoryUtils.attemptEjectItem(Globals.playerCharacter,Globals.draggedItem);
+ //clear ui
+ WindowUtils.cleanItemWindow();
+ String sourceWindowId = WindowUtils.getInventoryWindowID(Globals.dragSourceInventory.getId());
+ WindowUtils.replaceWindowContents(sourceWindowId,MenuGenerators.createNaturalInventoryMenu(Globals.dragSourceInventory));
+ //null globals
+ Globals.dragSourceInventory = null;
+ Globals.draggedItem = null;
+ return false;
+ }
+ return true;
+ }});
+ rVal.setPositionX(0);
+ rVal.setPositionY(0);
+ rVal.setWidth(Globals.WINDOW_WIDTH);
+ rVal.setHeight(Globals.WINDOW_HEIGHT);
+ return rVal;
+ }
+
+ public static Element createInGameMainMenu(){
+ int screenTop = Globals.WINDOW_HEIGHT - 150;
+ int width = 500;
+ int height = 500;
+ int screenLeft = (Globals.WINDOW_WIDTH - width)/2;
+ FormElement rVal = new FormElement();
+
+ //black texture background
+ ImagePanel imagePanel = new ImagePanel(0,0,width,height,Globals.blackTexture);
+ // imagePanel.setWidth(width);
+ // imagePanel.setHeight(height);
+ // imagePanel.setTexture(Globals.assetManager.fetchTexture(Globals.blackTexture));
+ rVal.addChild(imagePanel);
+
+ //label 1 (back)
+ Label backLabel = new Label(100,50,1.0f);
+ backLabel.setText("Back");
+ rVal.addChild(backLabel);
+
+
+ //label 2 (quit)
+ Label quitLabel = new Label(100,150,1.0f);
+ quitLabel.setText("Quit");
+ rVal.addChild(quitLabel);
+
+ return rVal;
+ }
+
+ public static Element createNaturalInventoryMenu(UnrelationalInventoryState inventory){
+ int screenTop = Globals.WINDOW_HEIGHT - 150;
+ int width = 500;
+ int height = 500;
+ int screenLeft = (Globals.WINDOW_WIDTH - width)/2;
+ Div rVal = new Div();
+
+ rVal.setOnDragRelease(new DragEventCallback() {public boolean execute(DragEvent event){
+ if(Globals.draggedItem != null){
+ if(Globals.dragSourceInventory != inventory){
+ UnrelationalInventoryState sourceInventory = Globals.dragSourceInventory;
+ //transfer item
+ Globals.dragSourceInventory.removeItem(Globals.draggedItem);
+ inventory.addItem(Globals.draggedItem);
+ //null out global state
+ Globals.dragSourceInventory = null;
+ Globals.draggedItem = null;
+ //clear item container ui
+ WindowUtils.cleanItemWindow();
+ //rerender both inventories
+ //re-render inventory
+ WindowUtils.replaceWindowContents(WindowUtils.getInventoryWindowID(inventory.getId()), MenuGenerators.createNaturalInventoryMenu(inventory));
+ //re-render inventory
+ WindowUtils.replaceWindowContents(WindowUtils.getInventoryWindowID(sourceInventory.getId()), MenuGenerators.createNaturalInventoryMenu(sourceInventory));
+ } else {
+ //clear ui
+ WindowUtils.cleanItemWindow();
+ //re-render inventory
+ WindowUtils.replaceWindowContents(WindowUtils.getInventoryWindowID(inventory.getId()), MenuGenerators.createNaturalInventoryMenu(inventory));
+ }
+ return false;
+ }
+ return true;
+ }});
+
+ //black texture background
+ ImagePanel imagePanel = new ImagePanel(0,0,width,height,Globals.blackTexture);
+ // imagePanel.setWidth(width);
+ // imagePanel.setHeight(height);
+ // imagePanel.setTexture(Globals.assetManager.fetchTexture(Globals.blackTexture));
+ rVal.addChild(imagePanel);
+
+ //label 1 (inventory)
+ Label inventoryLabel = new Label(10,10,1.0f);
+ inventoryLabel.setText("INVENTORY");
+ rVal.addChild(inventoryLabel);
+
+ int columns = 8;
+ int columnWidth = 60;
+ int rowHeight = 60;
+ for(int i = 0; i < inventory.getCapacity(); i++){
+ String texturePath = "Textures/icons/itemIconEmpty.png";
+ boolean hasItem = false;
+ if(i < inventory.getItems().size()){
+ Entity currentItem = inventory.getItems().get(i);
+ //get texture path from item
+ texturePath = ItemUtils.getItemIcon(currentItem);
+ //flag that this isn't an empty slot
+ hasItem = true;
+ }
+ if(!Globals.assetManager.hasLoadedTexture(texturePath)){
+ Globals.assetManager.addTexturePathtoQueue(texturePath);
+ }
+ int posX = (10 + i % columns * columnWidth);
+ int posY = 60 + (i / columns * rowHeight);
+ int panelWidth = 50;
+ int panelHeight = 50;
+ ImagePanel panel = new ImagePanel(posX,posY,panelWidth,panelHeight,texturePath);
+ if(hasItem == true){
+ int itemId = i;
+ panel.setOnDragStart(new DragEventCallback() {public boolean execute(DragEvent event){
+ // System.out.println("Drag start");
+ Globals.dragSourceInventory = inventory;
+ Globals.draggedItem = inventory.getItems().get(itemId);
+ rVal.removeChild(panel);
+ WindowUtils.pushItemIconToItemWindow(panel);
+ return false;
+ }});
+ panel.setOnDrag(new DragEventCallback() {public boolean execute(DragEvent event){
+ // System.out.println("Drag");
+ panel.setPositionX(event.getCurrentX() - panelWidth / 2);
+ panel.setPositionY(event.getCurrentY() - panelHeight / 2);
+ return false;
+ }});
+ // panel.setOnDragRelease(new DragEventCallback(){public boolean execute(DragEvent event){
+ // // panel.setPositionX(posX);
+ // // panel.setPositionY(posY);
+ // //now the fun begins :)
+ // //if transfer item
+ // // remove item from current inventory
+ // // place item in new inventory
+ // // trigger recreation of the menu
+ // //if drop item
+ // // remove item from current inventory
+ // // create item in world in front of character
+ // // trigger recreation of the menu
+ // //if neither of above
+ // // replace item icon position to origin
+ // // System.out.println("Release drag");
+ // return false;
+ // }});
+ }
+ // imagePanel.setWidth(width);
+ // imagePanel.setHeight(height);
+ // imagePanel.setTexture(Globals.assetManager.fetchTexture(Globals.blackTexture));
+ rVal.addChild(panel);
+ }
+
+ return rVal;
+ }
+
+}
diff --git a/src/main/java/electrosphere/menu/MenuTransition.java b/src/main/java/electrosphere/menu/MenuTransition.java
deleted file mode 100644
index dce34934..00000000
--- a/src/main/java/electrosphere/menu/MenuTransition.java
+++ /dev/null
@@ -1,357 +0,0 @@
-package electrosphere.menu;
-
-import electrosphere.audio.AudioSource;
-import electrosphere.audio.AudioUtils;
-import electrosphere.controls.ControlHandler;
-import electrosphere.controls.ControlHandler.ControlsState;
-import electrosphere.engine.LoadingThread;
-import electrosphere.game.server.saves.SaveUtils;
-import electrosphere.main.Globals;
-import electrosphere.main.Main;
-import electrosphere.net.NetUtils;
-import electrosphere.net.client.ClientNetworking;
-import electrosphere.renderer.ui.Widget;
-import electrosphere.renderer.ui.font.TextBox;
-import electrosphere.renderer.ui.label.Label;
-import org.joml.Vector3f;
-
-/**
- *
- * @author amaterasu
- */
-public class MenuTransition {
- public static void selectOption(Menu m){
- switch(m.getType()){
- case TITLE_MENU:
- switch(((TextBox)m.getCurrentOption()).getText()){
- //single player
- case "SINGLEPLAYER":
-// m.dispose();
-// Globals.loadingThread = new LoadingThread(LoadingThread.LOAD_MAIN_GAME);
-// Globals.RUN_CLIENT = true;
-// Globals.RUN_SERVER = true;
-// Globals.loadingThread.start();
- m.dispose();
- Globals.currentMenu = MenuUtils.createWorldSelectMenu();
- break;
- //multi player
- case "MULTIPLAYER":
- m.dispose();
- Globals.currentMenu = MenuUtils.createMultiplayerMenu();
- break;
- //arena
- case "ARENA":
- m.dispose();
- Globals.loadingThread = new LoadingThread(LoadingThread.LOAD_ARENA);
- Globals.RUN_CLIENT = true;
- Globals.RUN_SERVER = true;
- Globals.loadingThread.start();
- break;
- //options
- case "OPTIONS":
- m.dispose();
- Globals.currentMenu = MenuUtils.createOptionsMainMenu();
- break;
- //test
- case "UI TESTING":
- m.dispose();
- Globals.currentMenu = MenuUtils.createTestMainMenu();
- break;
- }
- break;
- case WORLD_SELECT_MENU:
- switch(((TextBox)m.getCurrentOption()).getText()){
- case "CREATE WORLD":
- m.dispose();
- Globals.currentMenu = MenuUtils.createWorldCreationMenu();
- break;
- default:
- String worldName = ((TextBox)m.getCurrentOption()).getText();
- m.dispose();
- //check if has save or not
- if(SaveUtils.worldHasSave(worldName.toLowerCase())){
- Globals.loadingThread = new LoadingThread(LoadingThread.LOAD_MAIN_GAME);
- Globals.RUN_CLIENT = true;
- Globals.RUN_SERVER = true;
- Globals.loadingThread.start();
- } else {
- Globals.currentSaveName = worldName.toLowerCase();
- SaveUtils.loadTerrainAndCreateWorldData();
- Globals.currentMenu = MenuUtils.createSaveCreationMenu();
- }
- break;
- }
- break;
- case WORLD_CREATE_MENU:
- break;
- case SAVE_CREATE_MENU:
- switch(((TextBox)m.getCurrentOption()).getText()){
- case "SAVE":
- m.dispose();
- SaveUtils.saveWorldDataToSave(Globals.currentSaveName);
- Globals.currentMenu = MenuUtils.createWorldSelectMenu();
- break;
- case "CANCEL":
- m.dispose();
- Globals.currentMenu = MenuUtils.createWorldSelectMenu();
- break;
- }
- break;
- case CHARACTER_CREATE_MENU:
- break;
- case FINALIZE_SAVE_CREATION_MENU:
- break;
- case MULTIPLAYER_MENU:
- switch(((TextBox)m.getCurrentOption()).getText()){
- //HOST
- case "HOST":
- m.dispose();
- Globals.loadingThread = new LoadingThread(LoadingThread.LOAD_MAIN_GAME);
- Globals.RUN_CLIENT = true;
- Globals.RUN_SERVER = true;
- Globals.loadingThread.start();
- break;
- //JOIN
- case "JOIN":
- m.dispose();
- Globals.currentMenu = MenuUtils.createIPMenu();
- break;
- //back
- case "BACK":
- backout(m);
- break;
-
- }
- break;
- case IP_MENU:
- switch(((TextBox)m.getCurrentOption()).getText()){
- //connect
- case "CONNECT":
- NetUtils.setAddress( ( (TextBox)m.getOptions().get(0) ).getText() );
- NetUtils.setPort( Integer.parseInt( ( (TextBox)m.getOptions().get(1) ).getText() ) );
- m.dispose();
- Globals.loadingThread = new LoadingThread(LoadingThread.LOAD_MAIN_GAME);
- Globals.RUN_CLIENT = true;
- Globals.RUN_SERVER = false;
- Globals.loadingThread.start();
- break;
- //back
- case "BACK":
- backout(m);
- break;
- }
- break;
- case IN_GAME_MAIN_MENU:
- switch(((Label)m.getCurrentOption()).getText()){
- //connect
- case "QUIT":
- //TODO: actually shut down program
- Globals.ENGINE_SHUTDOWN_FLAG = true;
- break;
- //back
- case "BACK":
- MenuUtils.makeMenuUndrawable(Globals.currentMenu);
- Globals.currentMenu.dispose();
- Globals.controlHandler.setHandlerState(ControlsState.MAIN_GAME);
- break;
- }
- break;
- }
- }
-
- public static void backout(Menu m){
- AudioSource startupSound = AudioUtils.playAudioAtLocation("/Audio/MenuBackspace.ogg", new Vector3f(0,0,0));
- switch(m.getType()){
- case TITLE_MENU:
- Main.running = false;
- break;
- case WORLD_SELECT_MENU:
- m.dispose();
- Globals.currentMenu = MenuUtils.createTitleMenu();
- break;
- case WORLD_CREATE_MENU:
- m.dispose();
- Globals.currentMenu = MenuUtils.createWorldSelectMenu();
- break;
- case SAVE_CREATE_MENU:
- m.dispose();
- Globals.currentMenu = MenuUtils.createWorldSelectMenu();
- break;
- case CHARACTER_CREATE_MENU:
- m.dispose();
- Globals.currentMenu = MenuUtils.createSaveCreationMenu();
- break;
- case FINALIZE_SAVE_CREATION_MENU:
- m.dispose();
- Globals.currentMenu = MenuUtils.createCharacterCreationMenu();
- break;
- case MULTIPLAYER_MENU:
- m.dispose();
- Globals.currentMenu = MenuUtils.createTitleMenu();
- break;
- case IP_MENU:
- m.dispose();
- Globals.currentMenu = MenuUtils.createMultiplayerMenu();
- break;
- case OPTIONS_MAIN_MENU:
- m.dispose();
- Globals.currentMenu = MenuUtils.createTitleMenu();
- break;
- case TEST:
- m.dispose();
- Globals.currentMenu = MenuUtils.createTitleMenu();
- break;
- case IN_GAME_MAIN_MENU:
- MenuUtils.makeMenuUndrawable(Globals.currentMenu);
- Globals.currentMenu.dispose();
- Globals.controlHandler.setHandlerState(ControlsState.MAIN_GAME);
- break;
- case INVENTORY_NATURAL:
- MenuUtils.makeMenuUndrawable(Globals.currentMenu);
- Globals.currentMenu.dispose();
- Globals.controlHandler.setHandlerState(ControlsState.MAIN_GAME);
- Globals.controlHandler.hideMouse();
- break;
- }
- }
-
- public static void menuHandleKeypress(Menu m, String keycode){
- char toWrite = ' ';
- Widget currentOption = m.getCurrentOption();
- boolean backspace = false;
- switch(keycode){
- case ControlHandler.DATA_STRING_INPUT_CODE_MENU_TYPE_BACKSPACE:
- if(currentOption instanceof TextBox){
- TextBox currentTextBox = (TextBox)currentOption;
- String currentText = currentTextBox.getText();
- if(currentText.length() > 0){
- currentTextBox.setText(currentText.substring(0, currentText.length() - 1));
- AudioSource startupSound = AudioUtils.playAudioAtLocation("/Audio/MenuBackspace.ogg", new Vector3f(0,0,0));
- }
- }
- backspace = true;
- break;
- case ControlHandler.DATA_STRING_INPUT_CODE_MENU_TYPE_0:
- toWrite = '0';
- break;
- case ControlHandler.DATA_STRING_INPUT_CODE_MENU_TYPE_1:
- toWrite = '1';
- break;
- case ControlHandler.DATA_STRING_INPUT_CODE_MENU_TYPE_2:
- toWrite = '2';
- break;
- case ControlHandler.DATA_STRING_INPUT_CODE_MENU_TYPE_3:
- toWrite = '3';
- break;
- case ControlHandler.DATA_STRING_INPUT_CODE_MENU_TYPE_4:
- toWrite = '4';
- break;
- case ControlHandler.DATA_STRING_INPUT_CODE_MENU_TYPE_5:
- toWrite = '5';
- break;
- case ControlHandler.DATA_STRING_INPUT_CODE_MENU_TYPE_6:
- toWrite = '6';
- break;
- case ControlHandler.DATA_STRING_INPUT_CODE_MENU_TYPE_7:
- toWrite = '7';
- break;
- case ControlHandler.DATA_STRING_INPUT_CODE_MENU_TYPE_8:
- toWrite = '8';
- break;
- case ControlHandler.DATA_STRING_INPUT_CODE_MENU_TYPE_9:
- toWrite = '9';
- break;
- case ControlHandler.DATA_STRING_INPUT_CODE_MENU_TYPE_A:
- toWrite = 'A';
- break;
- case ControlHandler.DATA_STRING_INPUT_CODE_MENU_TYPE_B:
- toWrite = 'B';
- break;
- case ControlHandler.DATA_STRING_INPUT_CODE_MENU_TYPE_C:
- toWrite = 'C';
- break;
- case ControlHandler.DATA_STRING_INPUT_CODE_MENU_TYPE_D:
- toWrite = 'D';
- break;
- case ControlHandler.DATA_STRING_INPUT_CODE_MENU_TYPE_E:
- toWrite = 'E';
- break;
- case ControlHandler.DATA_STRING_INPUT_CODE_MENU_TYPE_F:
- toWrite = 'F';
- break;
- case ControlHandler.DATA_STRING_INPUT_CODE_MENU_TYPE_G:
- toWrite = 'G';
- break;
- case ControlHandler.DATA_STRING_INPUT_CODE_MENU_TYPE_H:
- toWrite = 'H';
- break;
- case ControlHandler.DATA_STRING_INPUT_CODE_MENU_TYPE_I:
- toWrite = 'I';
- break;
- case ControlHandler.DATA_STRING_INPUT_CODE_MENU_TYPE_J:
- toWrite = 'J';
- break;
- case ControlHandler.DATA_STRING_INPUT_CODE_MENU_TYPE_K:
- toWrite = 'K';
- break;
- case ControlHandler.DATA_STRING_INPUT_CODE_MENU_TYPE_L:
- toWrite = 'L';
- break;
- case ControlHandler.DATA_STRING_INPUT_CODE_MENU_TYPE_M:
- toWrite = 'M';
- break;
- case ControlHandler.DATA_STRING_INPUT_CODE_MENU_TYPE_N:
- toWrite = 'N';
- break;
- case ControlHandler.DATA_STRING_INPUT_CODE_MENU_TYPE_O:
- toWrite = 'O';
- break;
- case ControlHandler.DATA_STRING_INPUT_CODE_MENU_TYPE_P:
- toWrite = 'P';
- break;
- case ControlHandler.DATA_STRING_INPUT_CODE_MENU_TYPE_Q:
- toWrite = 'Q';
- break;
- case ControlHandler.DATA_STRING_INPUT_CODE_MENU_TYPE_R:
- toWrite = 'R';
- break;
- case ControlHandler.DATA_STRING_INPUT_CODE_MENU_TYPE_S:
- toWrite = 'S';
- break;
- case ControlHandler.DATA_STRING_INPUT_CODE_MENU_TYPE_T:
- toWrite = 'T';
- break;
- case ControlHandler.DATA_STRING_INPUT_CODE_MENU_TYPE_U:
- toWrite = 'U';
- break;
- case ControlHandler.DATA_STRING_INPUT_CODE_MENU_TYPE_V:
- toWrite = 'V';
- break;
- case ControlHandler.DATA_STRING_INPUT_CODE_MENU_TYPE_W:
- toWrite = 'W';
- break;
- case ControlHandler.DATA_STRING_INPUT_CODE_MENU_TYPE_X:
- toWrite = 'X';
- break;
- case ControlHandler.DATA_STRING_INPUT_CODE_MENU_TYPE_Y:
- toWrite = 'Y';
- break;
- case ControlHandler.DATA_STRING_INPUT_CODE_MENU_TYPE_Z:
- toWrite = 'Z';
- break;
- case ControlHandler.DATA_STRING_INPUT_CODE_MENU_TYPE_PERIOD:
- toWrite = '.';
- break;
- }
- if(!backspace){
- if(currentOption instanceof TextBox){
- TextBox currentTextBox = (TextBox)currentOption;
- String currentText = currentTextBox.getText();
- if(currentText.length() < currentTextBox.getCols()){
- currentTextBox.setText(currentText + toWrite);
- AudioSource startupSound = AudioUtils.playAudioAtLocation("/Audio/MenuType.ogg", new Vector3f(0,0,0));
- }
- }
- }
- }
-}
diff --git a/src/main/java/electrosphere/menu/MenuUtils.java b/src/main/java/electrosphere/menu/MenuUtils.java
deleted file mode 100644
index 296ee25b..00000000
--- a/src/main/java/electrosphere/menu/MenuUtils.java
+++ /dev/null
@@ -1,228 +0,0 @@
-package electrosphere.menu;
-
-import electrosphere.entity.Entity;
-import electrosphere.entity.state.inventory.UnrelationalInventoryState;
-import electrosphere.entity.types.item.ItemUtils;
-import electrosphere.game.server.saves.SaveUtils;
-import electrosphere.main.Globals;
-import electrosphere.menu.Menu.MenuType;
-import electrosphere.net.NetUtils;
-import electrosphere.net.server.Server;
-import electrosphere.renderer.ui.Widget;
-import electrosphere.renderer.ui.WidgetUtils;
-import electrosphere.renderer.ui.Window;
-import electrosphere.renderer.ui.label.Label;
-import electrosphere.renderer.ui.widgets.ImagePanel;
-import java.util.List;
-import org.joml.Vector3f;
-
-/**
- *
- * @author amaterasu
- */
-public class MenuUtils {
-
-
- public static Menu createTitleMenu(){
- Menu rVal = new Menu(MenuType.TITLE_MENU);
- int screenTop = Globals.WINDOW_HEIGHT - 150;
- rVal.addElement(WidgetUtils.createVerticallyAlignedMinSizeTextBoxFromCharCount(40, 40, screenTop, "ORPG", true));
- rVal.addOption( WidgetUtils.createVerticallyAlignedMinSizeTextBoxFromCharCount(40, 40, screenTop - 125, "SINGLEPLAYER", true));
- rVal.setMenuOptionColor(0, new Vector3f(0.2f,0.8f,0.5f));
- rVal.addOption( WidgetUtils.createVerticallyAlignedMinSizeTextBoxFromCharCount(40, 40, screenTop - 200, "MULTIPLAYER", true));
- rVal.addOption( WidgetUtils.createVerticallyAlignedMinSizeTextBoxFromCharCount(40, 40, screenTop - 275, "ARENA", true));
- rVal.addOption( WidgetUtils.createVerticallyAlignedMinSizeTextBoxFromCharCount(40, 40, screenTop - 350, "OPTIONS", true));
- rVal.addOption( WidgetUtils.createVerticallyAlignedMinSizeTextBoxFromCharCount(40, 40, screenTop - 425, "UI TESTING", true));
- return rVal;
- }
-
- public static Menu createWorldSelectMenu(){
- Menu rVal = new Menu(MenuType.WORLD_SELECT_MENU);
- int screenTop = Globals.WINDOW_HEIGHT - 150;
- List saveNames = SaveUtils.getSaves();
- int verticalPosition = 125;
- for(String saveName : saveNames){
- if(!saveName.startsWith(".")){
- rVal.addOption(WidgetUtils.createVerticallyAlignedMinSizeTextBoxFromCharCount(40, 40, screenTop - verticalPosition, saveName.toUpperCase(), true));
- verticalPosition = verticalPosition + 75;
- }
- }
- rVal.addOption(WidgetUtils.createVerticallyAlignedMinSizeTextBoxFromCharCount(40, 40, screenTop - verticalPosition - 200, "CREATE WORLD", true));
- return rVal;
- }
-
- public static Menu createWorldCreationMenu(){
- Menu rVal = new Menu(MenuType.WORLD_CREATE_MENU);
- int screenTop = Globals.WINDOW_HEIGHT - 150;
- List saveNames = SaveUtils.getSaves();
- int verticalPosition = 125;
- //TODO: add text input to name world
- rVal.addOption(WidgetUtils.createVerticallyAlignedMinSizeTextBoxFromCharCount(40, 40, screenTop - 125, "CREATE WORLD", true));
- return rVal;
- }
-
- public static Menu createSaveCreationMenu(){
- Menu rVal = new Menu(MenuType.SAVE_CREATE_MENU);
- int screenTop = Globals.WINDOW_HEIGHT - 150;
- rVal.addOption(WidgetUtils.createVerticallyAlignedMinSizeTextBoxFromCharCount(40, 40, screenTop - 125, "SAVE", true));
- rVal.addOption(WidgetUtils.createVerticallyAlignedMinSizeTextBoxFromCharCount(40, 40, screenTop - 200, "CANCEL", true));
- return rVal;
- }
-
- public static Menu createCharacterCreationMenu(){
- Menu rVal = new Menu(MenuType.CHARACTER_CREATE_MENU);
- int screenTop = Globals.WINDOW_HEIGHT - 150;
- List saveNames = SaveUtils.getSaves();
- int verticalPosition = 125;
- //TODO: add text input to name world
- rVal.addOption(WidgetUtils.createVerticallyAlignedMinSizeTextBoxFromCharCount(40, 40, screenTop - verticalPosition, "CREATE WORLD", true));
- return rVal;
- }
-
- public static Menu createFinalizeSaveCReationMenu(){
- Menu rVal = new Menu(MenuType.FINALIZE_SAVE_CREATION_MENU);
- int screenTop = Globals.WINDOW_HEIGHT - 150;
- List saveNames = SaveUtils.getSaves();
- int verticalPosition = 125;
- //TODO: add text input to name world
- rVal.addOption(WidgetUtils.createVerticallyAlignedMinSizeTextBoxFromCharCount(40, 40, screenTop - verticalPosition, "CREATE WORLD", true));
- return rVal;
- }
-
- public static Menu createMultiplayerMenu(){
- Menu rVal = new Menu(MenuType.MULTIPLAYER_MENU);
- int screenTop = Globals.WINDOW_HEIGHT - 150;
- rVal.addOption( WidgetUtils.createVerticallyAlignedMinSizeTextBoxFromCharCount(40, 40, screenTop - 125, "HOST", true));
- rVal.setMenuOptionColor(0, new Vector3f(0.2f,0.8f,0.5f));
- rVal.addOption( WidgetUtils.createVerticallyAlignedMinSizeTextBoxFromCharCount(40, 40, screenTop - 200, "JOIN", true));
- rVal.addOption( WidgetUtils.createVerticallyAlignedMinSizeTextBoxFromCharCount(40, 40, screenTop - 275, "BACK", true));
- return rVal;
- }
-
- public static Menu createIPMenu(){
- Menu rVal = new Menu(MenuType.IP_MENU);
- int screenTop = Globals.WINDOW_HEIGHT - 150;
-
- rVal.addElement(WidgetUtils.createVerticallyAlignedMinSizeTextBoxFromCharCount(40, 40, screenTop - 50, "IP ADDRESS", true));
- rVal.addOption( WidgetUtils.createVerticallyAlignedEditableTextBox(40*15, 40, screenTop - 125, 15, 1, NetUtils.getAddress(), true));
- rVal.setMenuOptionColor(0, new Vector3f(0.2f,0.8f,0.5f));
- rVal.addElement(WidgetUtils.createVerticallyAlignedMinSizeTextBoxFromCharCount(40, 40, screenTop - 200, "PORT", true));
- rVal.addOption( WidgetUtils.createVerticallyAlignedEditableTextBox(40*5, 40, screenTop - 275, 5, 1, NetUtils.DEFAULT_PORT + "", true));
- rVal.addOption( WidgetUtils.createVerticallyAlignedMinSizeTextBoxFromCharCount(40, 40, screenTop - 350, "CONNECT", true));
- rVal.addOption( WidgetUtils.createVerticallyAlignedMinSizeTextBoxFromCharCount(40, 40, screenTop - 425, "BACK", true));
- return rVal;
- }
-
- public static Menu createOptionsMainMenu(){
- Menu rVal = new Menu(MenuType.OPTIONS_MAIN_MENU);
- int screenTop = Globals.WINDOW_HEIGHT - 150;
-
- rVal.addElement(WidgetUtils.createVerticallyAlignedMinSizeTextBoxFromCharCount(40, 40, screenTop - 50, "OPTIONS", true));
- rVal.addOption( WidgetUtils.createVerticallyAlignedMinSizeTextBoxFromCharCount(40, 40, screenTop - 275, "BACK", true));
- return rVal;
- }
-
- public static Menu createInGameMainMenu(){
- Menu rVal = new Menu(MenuType.IN_GAME_MAIN_MENU);
- int screenTop = Globals.WINDOW_HEIGHT - 150;
- int width = 500;
- int height = 500;
- int screenLeft = (Globals.WINDOW_WIDTH - width)/2;
- Window menuWindow = new Window(100, 100, 500, 500);
-
- //black texture background
- ImagePanel imagePanel = new ImagePanel(0,0,width,height,Globals.blackTexture);
- // imagePanel.setWidth(width);
- // imagePanel.setHeight(height);
- // imagePanel.setTexture(Globals.assetManager.fetchTexture(Globals.blackTexture));
- menuWindow.addWidget(imagePanel);
-
- //label 1 (back)
- Label backLabel = new Label(100,50,1.0f);
- backLabel.setText("BACK");
- menuWindow.addWidget(backLabel);
- rVal.addOption(backLabel);
-
-
- //label 2 (quit)
- Label quitLabel = new Label(100,150,1.0f);
- quitLabel.setText("QUIT");
- menuWindow.addWidget(quitLabel);
- rVal.addOption(quitLabel);
-
-
- rVal.addElement(menuWindow);
- Globals.widgetManager.registerWidget(menuWindow);
-// rVal.addElement(WidgetUtils.createVerticallyAlignedMinSizeTextBoxFromCharCount(40, 40, screenTop - 50, "BACK", true));
-// rVal.addOption( WidgetUtils.createVerticallyAlignedMinSizeTextBoxFromCharCount(40, 40, screenTop - 275, "QUIT", true));
- return rVal;
- }
-
- public static Menu createTestMainMenu(){
- Menu rVal = new Menu(MenuType.TEST);
- rVal.addElement(WidgetUtils.createWindowTEST());
- return rVal;
- }
-
- public static Menu createNaturalInventoryMenu(UnrelationalInventoryState inventory){
- Menu rVal = new Menu(MenuType.INVENTORY_NATURAL);
- int screenTop = Globals.WINDOW_HEIGHT - 150;
- int width = 500;
- int height = 500;
- int screenLeft = (Globals.WINDOW_WIDTH - width)/2;
- Window menuWindow = new Window(100, 100, 500, 500);
-
- //black texture background
- ImagePanel imagePanel = new ImagePanel(0,0,width,height,Globals.blackTexture);
- // imagePanel.setWidth(width);
- // imagePanel.setHeight(height);
- // imagePanel.setTexture(Globals.assetManager.fetchTexture(Globals.blackTexture));
- menuWindow.addWidget(imagePanel);
-
- //label 1 (inventory)
- Label inventoryLabel = new Label(10,10,1.0f);
- inventoryLabel.setText("INVENTORY");
- menuWindow.addWidget(inventoryLabel);
- rVal.addOption(inventoryLabel);
-
- int columns = 8;
- int columnWidth = 60;
- int rowHeight = 60;
- for(int i = 0; i < inventory.getCapacity(); i++){
- String texturePath = "Textures/icons/itemIconEmpty.png";
- if(i < inventory.getItems().size()){
- Entity currentItem = inventory.getItems().get(i);
- //get texture path from item
- texturePath = ItemUtils.getItemIcon(currentItem);
- }
- if(!Globals.assetManager.hasLoadedTexture(texturePath)){
- Globals.assetManager.addTexturePathtoQueue(texturePath);
- }
- ImagePanel panel = new ImagePanel((10 + i % columns * columnWidth),height - (110 + i / columns * rowHeight),50,50,texturePath);
- // imagePanel.setWidth(width);
- // imagePanel.setHeight(height);
- // imagePanel.setTexture(Globals.assetManager.fetchTexture(Globals.blackTexture));
- menuWindow.addWidget(panel);
- }
-
-
- rVal.addElement(menuWindow);
- Globals.widgetManager.registerWidget(menuWindow);
-// rVal.addElement(WidgetUtils.createVerticallyAlignedMinSizeTextBoxFromCharCount(40, 40, screenTop - 50, "BACK", true));
-// rVal.addOption( WidgetUtils.createVerticallyAlignedMinSizeTextBoxFromCharCount(40, 40, screenTop - 275, "QUIT", true));
- return rVal;
- }
-
- public static void makeMenuDrawable(Menu m){
- for(Widget w : m.widgetList){
- w.setVisible(true);
- }
- }
-
- public static void makeMenuUndrawable(Menu m){
- for(Widget w : m.widgetList){
- w.setVisible(false);
- }
- }
-
-}
diff --git a/src/main/java/electrosphere/menu/WindowStrings.java b/src/main/java/electrosphere/menu/WindowStrings.java
new file mode 100644
index 00000000..a6084adf
--- /dev/null
+++ b/src/main/java/electrosphere/menu/WindowStrings.java
@@ -0,0 +1,13 @@
+package electrosphere.menu;
+
+public class WindowStrings {
+
+
+ public static final String WINDOW_MENU_MAIN = "windowMenuMain";
+ public static final String WINDOW_MENU_INGAME_MAIN = "windowMenuInGameMain";
+ public static final String WINDOW_MENU_INVENTORY = "windowMenuInventory";
+ public static final String WINDOW_LOADING = "windowLoading";
+ public static final String WINDDOW_ITEM_DROP = "itemDrop";
+ public static final String WINDOW_ITEM_DRAG_CONTAINER = "itemDragContainer";
+
+}
diff --git a/src/main/java/electrosphere/menu/WindowUtils.java b/src/main/java/electrosphere/menu/WindowUtils.java
new file mode 100644
index 00000000..f68992e2
--- /dev/null
+++ b/src/main/java/electrosphere/menu/WindowUtils.java
@@ -0,0 +1,102 @@
+package electrosphere.menu;
+
+import electrosphere.main.Globals;
+import electrosphere.renderer.ui.ContainerElement;
+import electrosphere.renderer.ui.DrawableElement;
+import electrosphere.renderer.ui.Element;
+import electrosphere.renderer.ui.Window;
+import electrosphere.renderer.ui.elements.Label;
+
+public class WindowUtils {
+
+ public static void replaceMainMenuContents(Element newMenu){
+ Element mainMenuEl = Globals.elementManager.getWindow(WindowStrings.WINDOW_MENU_MAIN);
+ if(mainMenuEl != null && mainMenuEl instanceof Window){
+ Window mainMenu = (Window) mainMenuEl;
+ //todo: destroy elements as well
+ mainMenu.getChildren().clear();
+ mainMenu.addChild(newMenu);
+ Globals.elementManager.focusFirstElement(mainMenu);
+ }
+ }
+
+ public static void recursiveSetVisible(Element topLevelMenu, boolean visible){
+ if(topLevelMenu instanceof DrawableElement){
+ ((DrawableElement)topLevelMenu).setVisible(visible);
+ }
+ if(topLevelMenu instanceof ContainerElement){
+ for(Element child : ((ContainerElement)topLevelMenu).getChildren()){
+ recursiveSetVisible(child, visible);
+ }
+ }
+ }
+
+ public static String getInventoryWindowID(int id){
+ return "INVENTORY-" + id;
+ }
+
+ public static void replaceWindowContents(String window, Element content){
+ Element mainMenuEl = Globals.elementManager.getWindow(window);
+ if(mainMenuEl != null && mainMenuEl instanceof Window){
+ Window mainMenu = (Window) mainMenuEl;
+ //todo: destroy elements as well
+ mainMenu.getChildren().clear();
+ mainMenu.addChild(content);
+ Globals.elementManager.focusFirstElement(mainMenu);
+ }
+ }
+
+ public static void pushItemIconToItemWindow(Element itemIcon){
+ Window targetWindow = (Window) Globals.elementManager.getWindow(WindowStrings.WINDOW_ITEM_DRAG_CONTAINER);
+ targetWindow.addChild(itemIcon);
+ recursiveSetVisible(targetWindow,true);
+ Globals.elementManager.pushWindowToFront(targetWindow);
+ }
+
+ public static void cleanItemWindow(){
+ Window targetWindow = (Window) Globals.elementManager.getWindow(WindowStrings.WINDOW_ITEM_DRAG_CONTAINER);
+ targetWindow.getChildren().clear();
+ recursiveSetVisible(targetWindow, false);
+ }
+
+
+
+
+
+
+
+
+ public static void initBaseWindows(){
+ initLoadingWindow();
+ initItemDropWindow();
+ initItemDragContainerWindow();
+ initMainMenuWindow();
+ }
+
+ static void initLoadingWindow(){
+ Window loadingWindow = new Window(0, 0, Globals.WINDOW_WIDTH, Globals.WINDOW_HEIGHT);
+ Label loadingLabel = new Label(100,50,1.0f);
+ loadingLabel.setText("LOADING");
+ loadingWindow.addChild(loadingLabel);
+ 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);
+ Globals.elementManager.registerWindow(WindowStrings.WINDOW_MENU_MAIN, mainMenuWindow);
+ WindowUtils.replaceMainMenuContents(MenuGenerators.createTitleMenu());
+ }
+
+ static void initItemDropWindow(){
+ Window itemDropWindow = new Window(0,0,Globals.WINDOW_WIDTH,Globals.WINDOW_HEIGHT);
+ Globals.elementManager.registerWindow(WindowStrings.WINDDOW_ITEM_DROP, itemDropWindow);
+ WindowUtils.replaceWindowContents(WindowStrings.WINDDOW_ITEM_DROP, MenuGenerators.worldItemDropCaptureWindow());
+ }
+
+ static void initItemDragContainerWindow(){
+ Window itemDragContainerWindow = new Window(0,0,Globals.WINDOW_WIDTH,Globals.WINDOW_HEIGHT);
+ Globals.elementManager.registerWindow(WindowStrings.WINDOW_ITEM_DRAG_CONTAINER, itemDragContainerWindow);
+ }
+
+}
diff --git a/src/main/java/electrosphere/renderer/Mesh.java b/src/main/java/electrosphere/renderer/Mesh.java
index fed46c20..257c924c 100644
--- a/src/main/java/electrosphere/renderer/Mesh.java
+++ b/src/main/java/electrosphere/renderer/Mesh.java
@@ -1,6 +1,6 @@
package electrosphere.renderer;
-import electrosphere.entity.CameraEntityUtils;
+import electrosphere.entity.types.camera.CameraEntityUtils;
import electrosphere.logger.LoggerInterface;
import electrosphere.main.Globals;
import electrosphere.main.Main;
diff --git a/src/main/java/electrosphere/renderer/RenderUtils.java b/src/main/java/electrosphere/renderer/RenderUtils.java
index e96881d1..d9fabd86 100644
--- a/src/main/java/electrosphere/renderer/RenderUtils.java
+++ b/src/main/java/electrosphere/renderer/RenderUtils.java
@@ -1,7 +1,8 @@
package electrosphere.renderer;
import electrosphere.engine.assetmanager.AssetDataStrings;
-import electrosphere.entity.CameraEntityUtils;
+import electrosphere.entity.types.camera.CameraEntityUtils;
+
import java.nio.FloatBuffer;
import java.nio.IntBuffer;
import java.util.ArrayList;
diff --git a/src/main/java/electrosphere/renderer/RenderingEngine.java b/src/main/java/electrosphere/renderer/RenderingEngine.java
index bd5de52e..1f0a3e8a 100644
--- a/src/main/java/electrosphere/renderer/RenderingEngine.java
+++ b/src/main/java/electrosphere/renderer/RenderingEngine.java
@@ -2,10 +2,10 @@ package electrosphere.renderer;
import electrosphere.controls.ControlCallback;
import electrosphere.controls.MouseCallback;
-import electrosphere.entity.CameraEntityUtils;
import electrosphere.entity.Entity;
import electrosphere.entity.EntityDataStrings;
import electrosphere.entity.EntityUtils;
+import electrosphere.entity.types.camera.CameraEntityUtils;
import electrosphere.entity.types.hitbox.HitboxData;
import electrosphere.entity.types.hitbox.HitboxUtils;
import electrosphere.game.data.creature.type.CollidableTemplate;
@@ -23,9 +23,13 @@ import electrosphere.renderer.framebuffer.Framebuffer;
import electrosphere.renderer.framebuffer.FramebufferUtils;
import electrosphere.renderer.framebuffer.Renderbuffer;
import electrosphere.renderer.texture.Texture;
-import electrosphere.renderer.ui.Widget;
+import electrosphere.renderer.ui.DrawableElement;
+import electrosphere.renderer.ui.Element;
+
import java.nio.FloatBuffer;
import java.nio.IntBuffer;
+import java.util.ListIterator;
+
import org.joml.Matrix4f;
import org.joml.Quaternionf;
import org.joml.Vector3d;
@@ -674,9 +678,12 @@ public class RenderingEngine {
static void renderUI(){
glDisable(GL_DEPTH_TEST);
- for(Widget currentWidget : Globals.widgetManager.getWidgetList()){
- if(currentWidget.getVisible()){
- currentWidget.draw(GL_DEFAULT_FRAMEBUFFER, Globals.WINDOW_WIDTH, Globals.WINDOW_HEIGHT);
+ for(Element currentElement : Globals.elementManager.getWindowList()){
+ if(currentElement instanceof DrawableElement){
+ DrawableElement drawable = (DrawableElement) currentElement;
+ if(drawable.getVisible()){
+ drawable.draw(GL_DEFAULT_FRAMEBUFFER, Globals.WINDOW_WIDTH, Globals.WINDOW_HEIGHT);
+ }
}
}
diff --git a/src/main/java/electrosphere/renderer/ui/ClickableElement.java b/src/main/java/electrosphere/renderer/ui/ClickableElement.java
new file mode 100644
index 00000000..fb658200
--- /dev/null
+++ b/src/main/java/electrosphere/renderer/ui/ClickableElement.java
@@ -0,0 +1,13 @@
+package electrosphere.renderer.ui;
+
+import electrosphere.renderer.ui.events.ClickEvent;
+
+public interface ClickableElement extends Element {
+
+ public void setOnClick(ClickEventCallback callback);
+
+ public interface ClickEventCallback {
+ public boolean execute(ClickEvent event);
+ }
+
+}
diff --git a/src/main/java/electrosphere/renderer/ui/ContainerElement.java b/src/main/java/electrosphere/renderer/ui/ContainerElement.java
new file mode 100644
index 00000000..f153cfeb
--- /dev/null
+++ b/src/main/java/electrosphere/renderer/ui/ContainerElement.java
@@ -0,0 +1,13 @@
+package electrosphere.renderer.ui;
+
+import java.util.List;
+
+public interface ContainerElement extends Element {
+
+ public void addChild(Element child);
+
+ public List getChildren();
+
+ public void removeChild(Element child);
+
+}
diff --git a/src/main/java/electrosphere/renderer/ui/DraggableElement.java b/src/main/java/electrosphere/renderer/ui/DraggableElement.java
new file mode 100644
index 00000000..d1deead4
--- /dev/null
+++ b/src/main/java/electrosphere/renderer/ui/DraggableElement.java
@@ -0,0 +1,20 @@
+package electrosphere.renderer.ui;
+
+import electrosphere.renderer.ui.events.DragEvent;
+
+public interface DraggableElement extends Element {
+
+ public void setOnDragStart(DragEventCallback callback);
+
+ public void setOnDrag(DragEventCallback callback);
+
+ public void setOnDragRelease(DragEventCallback callback);
+
+
+ public interface DragEventCallback{
+
+ public boolean execute(DragEvent event);
+
+ }
+
+}
diff --git a/src/main/java/electrosphere/renderer/ui/DrawableElement.java b/src/main/java/electrosphere/renderer/ui/DrawableElement.java
new file mode 100644
index 00000000..aa5bb7e0
--- /dev/null
+++ b/src/main/java/electrosphere/renderer/ui/DrawableElement.java
@@ -0,0 +1,16 @@
+package electrosphere.renderer.ui;
+
+/**
+ *
+ * @author amaterasu
+ */
+public interface DrawableElement extends Element {
+
+ public boolean getVisible();
+
+ public void setVisible(boolean draw);
+
+ public abstract void draw(int parentFramebufferPointer, int parentWidth, int parentHeight);
+
+
+}
diff --git a/src/main/java/electrosphere/renderer/ui/Element.java b/src/main/java/electrosphere/renderer/ui/Element.java
new file mode 100644
index 00000000..3aa528ac
--- /dev/null
+++ b/src/main/java/electrosphere/renderer/ui/Element.java
@@ -0,0 +1,34 @@
+package electrosphere.renderer.ui;
+
+import electrosphere.renderer.ui.events.Event;
+
+public interface Element {
+
+ public int getWidth();
+
+ public int getHeight();
+
+ public int getPositionX();
+
+ public int getPositionY();
+
+ public void setWidth(int width);
+
+ public void setHeight(int height);
+
+ public void setPositionX(int positionX);
+
+ public void setPositionY(int positionY);
+
+ public void setParentWidth(int width);
+
+ public void setParentHeight(int height);
+
+ /**
+ *
+ * @param event the even to handle
+ * @return true if the event should continue to propagate
+ */
+ public boolean handleEvent(Event event);
+
+}
diff --git a/src/main/java/electrosphere/renderer/ui/ElementManager.java b/src/main/java/electrosphere/renderer/ui/ElementManager.java
new file mode 100644
index 00000000..1bbd5550
--- /dev/null
+++ b/src/main/java/electrosphere/renderer/ui/ElementManager.java
@@ -0,0 +1,211 @@
+package electrosphere.renderer.ui;
+
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.ListIterator;
+import java.util.Map;
+import java.util.Stack;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+import electrosphere.renderer.ui.events.ClickEvent;
+import electrosphere.renderer.ui.events.DragEvent;
+import electrosphere.renderer.ui.events.Event;
+import electrosphere.renderer.ui.events.FocusEvent;
+import electrosphere.renderer.ui.events.MouseEvent;
+import electrosphere.renderer.ui.events.DragEvent.DragEventType;
+
+/**
+ *
+ * @author amaterasu
+ */
+public class ElementManager {
+
+
+ Map elementMap = new ConcurrentHashMap();
+ List elementList = new CopyOnWriteArrayList();
+ FocusableElement currentFocusedElement = null;
+ DraggableElement currentDragElement = null;
+
+ public void registerWindow(String name, Element w){
+ elementMap.put(name,w);
+ if(!elementList.contains(w)){
+ elementList.add(w);
+ }
+ if(elementList.size() == 1){
+ focusFirstElement(w);
+ }
+ }
+
+ public Element getWindow(String name){
+ return elementMap.get(name);
+ }
+
+ public List getWindowList(){
+ return elementList;
+ }
+
+ public void unregisterWindow(String name){
+ Element w = elementMap.remove(name);
+ if(elementList.contains(w)){
+ elementList.remove(w);
+ }
+ }
+
+ public void pushWindowToFront(Window window){
+ elementList.remove(window);
+ elementList.add(window);
+ }
+
+ List getFocusableList(Element topLevel, List input){
+ if(topLevel instanceof FocusableElement){
+ input.add((FocusableElement)topLevel);
+ }
+ if(topLevel instanceof ContainerElement){
+ ContainerElement container = (ContainerElement) topLevel;
+ for(Element child : container.getChildren()){
+ getFocusableList(child,input);
+ }
+ }
+ return input;
+ }
+
+ public FocusableElement getFocusedElement(){
+ return currentFocusedElement;
+ }
+
+ public void focusFirstElement(Element topLevel){
+ List focusables = getFocusableList(topLevel,new LinkedList());
+ if(focusables.size() > 0){
+ if(currentFocusedElement != null){
+ currentFocusedElement.handleEvent(new FocusEvent(false));
+ }
+ currentFocusedElement = focusables.get(0);
+ currentFocusedElement.handleEvent(new FocusEvent(true));
+ }
+ }
+
+ public void focusNextElement(Element topLevel){
+ List focusables = getFocusableList(topLevel,new LinkedList());
+ if(focusables.contains(currentFocusedElement)){
+ int index = focusables.indexOf(currentFocusedElement);
+ if(index + 1 >= focusables.size()){
+ index = 0;
+ } else {
+ index++;
+ }
+ if(currentFocusedElement != null){
+ currentFocusedElement.handleEvent(new FocusEvent(false));
+ }
+ currentFocusedElement = focusables.get(index);
+ currentFocusedElement.handleEvent(new FocusEvent(true));
+ }
+ }
+
+ public void focusPreviousElement(Element topLevel){
+ List focusables = getFocusableList(topLevel,new LinkedList());
+ if(focusables.contains(currentFocusedElement)){
+ int index = focusables.indexOf(currentFocusedElement);
+ if(index - 1 < 0){
+ index = focusables.size() - 1;
+ } else {
+ index--;
+ }
+ if(currentFocusedElement != null){
+ currentFocusedElement.handleEvent(new FocusEvent(false));
+ }
+ currentFocusedElement = focusables.get(index);
+ currentFocusedElement.handleEvent(new FocusEvent(true));
+ }
+ }
+
+ public void fireEvent(Event event, int x, int y){
+ boolean propagate = true;
+ ListIterator windowIterator = elementList.listIterator(elementList.size());
+ while(windowIterator.hasPrevious()){
+ Element currentWindow = windowIterator.previous();
+ Stack elementStack = buildElementPositionalStack(new Stack(), currentWindow, x, y, 0, 0);
+ Element currentElement = null;
+ while(elementStack.size() > 0 && propagate == true){
+ currentElement = elementStack.pop();
+ propagate = currentElement.handleEvent(event);
+ }
+ if(!propagate){
+ break;
+ }
+ }
+ }
+
+ Stack buildElementPositionalStack(Stack inputStack, Element current, int x, int y, int offsetX, int offsetY){
+ inputStack.push(current);
+ if(current instanceof ContainerElement){
+ 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());
+ }
+ }
+ }
+ return inputStack;
+ }
+
+ public Element resolveFirstDraggable(DragEvent event){
+ ListIterator windowIterator = elementList.listIterator(elementList.size());
+ while(windowIterator.hasPrevious()){
+ Element currentWindow = windowIterator.previous();
+ Stack elementStack = buildElementPositionalStack(new Stack(), currentWindow, event.getCurrentX(), event.getCurrentY(), 0, 0);
+ Element currentElement = null;
+ while(elementStack.size() > 0){
+ currentElement = elementStack.pop();
+ if(currentElement instanceof DraggableElement){
+ return currentElement;
+ }
+ }
+ }
+ return null;
+ }
+
+ boolean elementContainsPoint(Element el, int x, int y){
+ return
+ x >= el.getPositionX() &&
+ x <= el.getPositionX() + el.getWidth() &&
+ y >= el.getPositionY() &&
+ y <= el.getPositionY() + el.getHeight();
+ }
+
+ // public void click(MouseEvent event){
+ // if(currentFocusedElement instanceof ClickableElement){
+ // ((ClickableElement)currentFocusedElement).onClick();
+ // }
+ // }
+
+ public void click(ClickEvent event){
+ fireEvent(event,event.getCurrentX(),event.getCurrentY());
+ }
+
+ public void dragStart(int x, int y, int lastX, int lastY, int deltaX, int deltaY){
+ DragEvent event = new DragEvent(x, y, lastX, lastY, deltaX, deltaY, DragEventType.START, null);
+ currentDragElement = (DraggableElement)resolveFirstDraggable(event);
+ event.setTarget(currentDragElement);
+ fireEvent(event,x,y);
+ }
+
+ public void drag(int x, int y, int lastX, int lastY, int deltaX, int deltaY){
+ DragEvent event = new DragEvent(x, y, lastX, lastY, deltaX, deltaY, DragEventType.DRAG, currentDragElement);
+ if(currentDragElement != null){
+ currentDragElement.handleEvent(event);
+ }
+ // fireEvent(event,event.getCurrentX(),event.getCurrentY());
+ }
+
+ public void dragRelease(int x, int y, int lastX, int lastY, int deltaX, int deltaY){
+ DragEvent event = new DragEvent(x, y, lastX, lastY, deltaX, deltaY, DragEventType.RELEASE, currentDragElement);
+ if(currentDragElement != null){
+ currentDragElement.handleEvent(event);
+ currentDragElement = null;
+ }
+ fireEvent(event,event.getCurrentX(),event.getCurrentY());
+ }
+
+}
diff --git a/src/main/java/electrosphere/renderer/ui/FocusableElement.java b/src/main/java/electrosphere/renderer/ui/FocusableElement.java
new file mode 100644
index 00000000..8b44b3d6
--- /dev/null
+++ b/src/main/java/electrosphere/renderer/ui/FocusableElement.java
@@ -0,0 +1,20 @@
+package electrosphere.renderer.ui;
+
+import electrosphere.renderer.ui.events.FocusEvent;
+
+public interface FocusableElement extends Element {
+
+ public boolean isFocused();
+
+ public abstract void setOnFocus(FocusEventCallback callback);
+
+ public abstract void setOnLoseFocus(FocusEventCallback callback);
+
+
+ public abstract interface FocusEventCallback {
+
+ public boolean execute(FocusEvent event);
+
+ }
+
+}
diff --git a/src/main/java/electrosphere/renderer/ui/NavigableElement.java b/src/main/java/electrosphere/renderer/ui/NavigableElement.java
new file mode 100644
index 00000000..76aed737
--- /dev/null
+++ b/src/main/java/electrosphere/renderer/ui/NavigableElement.java
@@ -0,0 +1,15 @@
+package electrosphere.renderer.ui;
+
+import electrosphere.renderer.ui.events.NavigationEvent;
+
+public interface NavigableElement extends Element {
+
+ public void setOnNavigationCallback(NavigationEventCallback callback);
+
+ public interface NavigationEventCallback {
+
+ public void execute(NavigationEvent event);
+
+ }
+
+}
diff --git a/src/main/java/electrosphere/renderer/ui/Widget.java b/src/main/java/electrosphere/renderer/ui/Widget.java
deleted file mode 100644
index 228fb7ec..00000000
--- a/src/main/java/electrosphere/renderer/ui/Widget.java
+++ /dev/null
@@ -1,70 +0,0 @@
-package electrosphere.renderer.ui;
-
-/**
- *
- * @author amaterasu
- */
-public abstract class Widget {
-
- 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){
- parentHeight = height;
- }
-
- public abstract void draw(int parentFramebufferPointer, int parentWidth, int parentHeight);
-
-}
diff --git a/src/main/java/electrosphere/renderer/ui/WidgetManager.java b/src/main/java/electrosphere/renderer/ui/WidgetManager.java
deleted file mode 100644
index 06227e70..00000000
--- a/src/main/java/electrosphere/renderer/ui/WidgetManager.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package electrosphere.renderer.ui;
-
-import java.util.HashMap;
-import java.util.concurrent.CopyOnWriteArrayList;
-
-/**
- *
- * @author amaterasu
- */
-public class WidgetManager {
-
-
-
- CopyOnWriteArrayList widgetList = new CopyOnWriteArrayList();
-
- public WidgetManager(){
-
- }
-
- public void registerWidget(Widget w){
- if(!widgetList.contains(w)){
- widgetList.add(w);
- }
- }
-
- public CopyOnWriteArrayList getWidgetList(){
- return widgetList;
- }
-
- public void unregisterWidget(Widget w){
- if(widgetList.contains(w)){
- widgetList.remove(w);
- }
- }
-
-}
diff --git a/src/main/java/electrosphere/renderer/ui/WidgetUtils.java b/src/main/java/electrosphere/renderer/ui/WidgetUtils.java
index d8eec8a7..46b91767 100644
--- a/src/main/java/electrosphere/renderer/ui/WidgetUtils.java
+++ b/src/main/java/electrosphere/renderer/ui/WidgetUtils.java
@@ -2,13 +2,12 @@ package electrosphere.renderer.ui;
import electrosphere.controls.ControlHandler;
import electrosphere.main.Globals;
+import electrosphere.renderer.ui.elements.ImagePanel;
+import electrosphere.renderer.ui.elements.Label;
+import electrosphere.renderer.ui.elements.TextInput;
import electrosphere.renderer.ui.font.FontUtils;
-import electrosphere.renderer.ui.font.TextBox;
import electrosphere.renderer.ui.font.bitmapchar.BitmapCharacter;
-import electrosphere.renderer.ui.label.Label;
import electrosphere.renderer.ui.layout.LayoutSchemeListScrollable;
-import electrosphere.renderer.ui.widgets.ImagePanel;
-import electrosphere.renderer.ui.widgets.TextInput;
/**
*
@@ -17,111 +16,111 @@ import electrosphere.renderer.ui.widgets.TextInput;
public class WidgetUtils {
- public static TextBox createTextBox(int positionX, int positionY, int width, int height, int cols, int rows, String text, boolean render){
- TextBox rVal = new TextBox(-width/2, positionY, width, height, rows, cols, text, render, false);
- Globals.widgetManager.registerWidget(rVal);
- return rVal;
- }
+ // public static TextBox createTextBox(int positionX, int positionY, int width, int height, int cols, int rows, String text, boolean render){
+ // TextBox rVal = new TextBox(-width/2, positionY, width, height, rows, cols, text, render, false);
+ // // Globals.widgetManager.registerWidget(rVal);
+ // return rVal;
+ // }
- public static TextBox createVerticallyAlignedTextBox(int width, int height, int windowTop, int cols, int rows, String text, boolean render){
- TextBox rVal = new TextBox(-width/2, windowTop, width, height, rows, cols, text, render, false);
- Globals.widgetManager.registerWidget(rVal);
- return rVal;
- }
+ // public static TextBox createVerticallyAlignedTextBox(int width, int height, int windowTop, int cols, int rows, String text, boolean render){
+ // TextBox rVal = new TextBox(-width/2, windowTop, width, height, rows, cols, text, render, false);
+ // // Globals.widgetManager.registerWidget(rVal);
+ // return rVal;
+ // }
- public static TextBox createVerticallyAlignedMinSizeTextBox(int charWidth, int charHeight, int windowTop, int cols, int rows, String text, boolean render){
- TextBox rVal = new TextBox(-cols * charWidth / 2, windowTop, cols * charWidth, rows * charHeight, rows, cols, text, render, false);
- Globals.widgetManager.registerWidget(rVal);
- return rVal;
- }
+ // public static TextBox createVerticallyAlignedMinSizeTextBox(int charWidth, int charHeight, int windowTop, int cols, int rows, String text, boolean render){
+ // TextBox rVal = new TextBox(-cols * charWidth / 2, windowTop, cols * charWidth, rows * charHeight, rows, cols, text, render, false);
+ // // Globals.widgetManager.registerWidget(rVal);
+ // return rVal;
+ // }
- public static TextBox createVerticallyAlignedMinSizeTextBoxFromCharCount(int charWidth, int charHeight, int windowTop, String text, boolean render){
- int cols = text.length();
- int rows = 1;
- TextBox rVal = new TextBox(-cols * charWidth / 2, windowTop, cols * charWidth, rows * charHeight, rows, cols, text, render, false);
- rVal.setVisible(true);
- Globals.widgetManager.registerWidget(rVal);
- return rVal;
- }
+ // public static TextBox createVerticallyAlignedMinSizeTextBoxFromCharCount(int charWidth, int charHeight, int windowTop, String text, boolean render){
+ // int cols = text.length();
+ // int rows = 1;
+ // TextBox rVal = new TextBox(-cols * charWidth / 2, windowTop, cols * charWidth, rows * charHeight, rows, cols, text, render, false);
+ // rVal.setVisible(true);
+ // // Globals.widgetManager.registerWidget(rVal);
+ // return rVal;
+ // }
- public static TextBox createVerticallyAlignedEditableTextBox(int width, int height, int windowTop, int cols, int rows, String text, boolean render){
- TextBox rVal = new TextBox(-(int)(width/2.5), windowTop, width, height, rows, cols, text, render, true);
- rVal.setVisible(true);
- Globals.widgetManager.registerWidget(rVal);
- return rVal;
- }
+ // public static TextBox createVerticallyAlignedEditableTextBox(int width, int height, int windowTop, int cols, int rows, String text, boolean render){
+ // TextBox rVal = new TextBox(-(int)(width/2.5), windowTop, width, height, rows, cols, text, render, true);
+ // rVal.setVisible(true);
+ // // Globals.widgetManager.registerWidget(rVal);
+ // return rVal;
+ // }
- public static LayoutSchemeListScrollable createListTEST(){
- LayoutSchemeListScrollable rVal = new LayoutSchemeListScrollable(200, 200, 500, 500, true);
- rVal.addWidget(createVerticallyAlignedMinSizeTextBoxFromCharCount(25, 25, 0, "TESTESTESTEST", true));
- rVal.addWidget(WidgetUtils.createTextBox(100, 100, 500, 500, 3, 10, "TEST", true));
- Globals.widgetManager.registerWidget(rVal);
- return rVal;
- }
+ // public static LayoutSchemeListScrollable createListTEST(){
+ // LayoutSchemeListScrollable rVal = new LayoutSchemeListScrollable(200, 200, 500, 500, true);
+ // rVal.addWidget(createVerticallyAlignedMinSizeTextBoxFromCharCount(25, 25, 0, "TESTESTESTEST", true));
+ // rVal.addWidget(WidgetUtils.createTextBox(100, 100, 500, 500, 3, 10, "TEST", true));
+ // // Globals.widgetManager.registerWidget(rVal);
+ // return rVal;
+ // }
- public static Widget createWindowTEST(){
- Window rVal = new Window(0, 0, 1920, 1080);
-// //panel 1
-// ImagePanel imagePanel = new ImagePanel();
-// imagePanel.setTexture(Globals.assetManager.fetchTexture(Globals.testingTexture));
-// imagePanel.setPositionX(100);
-// imagePanel.setPositionY(100);
-// imagePanel.setVisible(true);
-// rVal.addWidget(imagePanel);
-// //panel 2
-// imagePanel = new ImagePanel();
-// imagePanel.setTexture(Globals.assetManager.fetchTexture(Globals.testingTexture));
-// imagePanel.setVisible(true);
-// rVal.addWidget(imagePanel);
-// rVal.setVisible(true);
-// //window top
-// imagePanel = new ImagePanel();
-// imagePanel.setTexture(Globals.assetManager.fetchTexture("Textures/ui/WindowBorder.png"));
-// imagePanel.setWidth(100);
-// imagePanel.setHeight(50);
-// imagePanel.setPositionX(200);
-// imagePanel.setPositionY(50);
-// imagePanel.setVisible(true);
-// rVal.addWidget(imagePanel);
-// TextInput textInput = new TextInput();
-// textInput.setText("TESTESTE$STESTET\nTESTESTE$STESTET\nTESTESTE$STESTET\nTESTESTE$STESTET\nTESTESTE$STESTET\nAAAAAAAAAABBBBBBBBBB\nAAAAAAAAAABBBBBBBBBB\nAAAAAAAAAABBBBBBBBBB\nAAAAAAAAAABBBBBBBBBB\nAAAAAAAAAABBBBBBBBBB\nAAAAAAAAAABBBBBBBBBB\nAAAAAAAAAABBBBBBBBBB\nAAAAAAAAAABBBBBBBBBB\nAAAAAAAAAABBBBBBBBBB\nAAAAAAAAAABBBBBBBBBB\nAAAAAAAAAABBBBBBBBBB\nAAAAAAAAAABBBBBBBBBB\nAAAAAAAAAABBBBBBBBBB\nAAAAAAAAAABBBBBBBBBB\nAAAAAAAAAABBBBBBBBBB\n");
-// textInput.setPositionX(0);
-// textInput.setPositionY(0);
-// textInput.setWidth(500);
-// textInput.setHeight(500);
-// textInput.setFontWidth(10);
-// textInput.setFontHeight(27);
-// textInput.setVisible(true);
-// rVal.addWidget(textInput);
+// public static DrawableElement createWindowTEST(){
+// Window rVal = new Window(0, 0, 1920, 1080);
+// // //panel 1
+// // ImagePanel imagePanel = new ImagePanel();
+// // imagePanel.setTexture(Globals.assetManager.fetchTexture(Globals.testingTexture));
+// // imagePanel.setPositionX(100);
+// // imagePanel.setPositionY(100);
+// // imagePanel.setVisible(true);
+// // rVal.addWidget(imagePanel);
+// // //panel 2
+// // imagePanel = new ImagePanel();
+// // imagePanel.setTexture(Globals.assetManager.fetchTexture(Globals.testingTexture));
+// // imagePanel.setVisible(true);
+// // rVal.addWidget(imagePanel);
+// // rVal.setVisible(true);
+// // //window top
+// // imagePanel = new ImagePanel();
+// // imagePanel.setTexture(Globals.assetManager.fetchTexture("Textures/ui/WindowBorder.png"));
+// // imagePanel.setWidth(100);
+// // imagePanel.setHeight(50);
+// // imagePanel.setPositionX(200);
+// // imagePanel.setPositionY(50);
+// // imagePanel.setVisible(true);
+// // rVal.addWidget(imagePanel);
+// // TextInput textInput = new TextInput();
+// // textInput.setText("TESTESTE$STESTET\nTESTESTE$STESTET\nTESTESTE$STESTET\nTESTESTE$STESTET\nTESTESTE$STESTET\nAAAAAAAAAABBBBBBBBBB\nAAAAAAAAAABBBBBBBBBB\nAAAAAAAAAABBBBBBBBBB\nAAAAAAAAAABBBBBBBBBB\nAAAAAAAAAABBBBBBBBBB\nAAAAAAAAAABBBBBBBBBB\nAAAAAAAAAABBBBBBBBBB\nAAAAAAAAAABBBBBBBBBB\nAAAAAAAAAABBBBBBBBBB\nAAAAAAAAAABBBBBBBBBB\nAAAAAAAAAABBBBBBBBBB\nAAAAAAAAAABBBBBBBBBB\nAAAAAAAAAABBBBBBBBBB\nAAAAAAAAAABBBBBBBBBB\nAAAAAAAAAABBBBBBBBBB\n");
+// // textInput.setPositionX(0);
+// // textInput.setPositionY(0);
+// // textInput.setWidth(500);
+// // textInput.setHeight(500);
+// // textInput.setFontWidth(10);
+// // textInput.setFontHeight(27);
+// // textInput.setVisible(true);
+// // rVal.addWidget(textInput);
-// BitmapCharacter characterDisp = new BitmapCharacter(0,0,500,500,'A');
-// rVal.addWidget(characterDisp);
+// // BitmapCharacter characterDisp = new BitmapCharacter(0,0,500,500,'A');
+// // rVal.addWidget(characterDisp);
- Label label = new Label(100,100,1);
- label.setText("TESTING");
- rVal.addWidget(label);
+// Label label = new Label(100,100,1);
+// label.setText("TESTING");
+// rVal.addChild(label);
-// TextInput textInput2 = new TextInput();
-// textInput2.setText("TESTESTE$STESTET\nTESTESTE$STESTET\nTESTESTE$STESTET\nTESTESTE$STESTET\nTESTESTE$STESTET\n");
-// textInput2.setPositionX(500);
-// textInput2.setPositionY(0);
-// textInput2.setWidth(500);
-// textInput2.setHeight(500);
-// textInput2.setFontWidth(20);
-// textInput2.setFontHeight(40);
-// textInput2.setVisible(true);
-// rVal.addWidget(textInput2);
+// // TextInput textInput2 = new TextInput();
+// // textInput2.setText("TESTESTE$STESTET\nTESTESTE$STESTET\nTESTESTE$STESTET\nTESTESTE$STESTET\nTESTESTE$STESTET\n");
+// // textInput2.setPositionX(500);
+// // textInput2.setPositionY(0);
+// // textInput2.setWidth(500);
+// // textInput2.setHeight(500);
+// // textInput2.setFontWidth(20);
+// // textInput2.setFontHeight(40);
+// // textInput2.setVisible(true);
+// // rVal.addWidget(textInput2);
- rVal.setVisible(true);
- Globals.widgetManager.registerWidget(rVal);
- return rVal;
- }
+// rVal.setVisible(true);
+// // Globals.widgetManager.registerWidget(rVal);
+// return rVal;
+// }
- public static Widget createInGameMainMenuButton(){
+ public static DrawableElement createInGameMainMenuButton(){
int width = (int)(Globals.WINDOW_WIDTH * 0.05);
int height = (int)(Globals.WINDOW_HEIGHT * 0.05);
int x = Globals.WINDOW_WIDTH - width;
@@ -139,17 +138,17 @@ public class WidgetUtils {
Label menuLabel = new Label(0,0,0.3f);
menuLabel.setText("Menu");
menuLabel.setVisible(true);
- rVal.addWidget(menuLabel);
+ rVal.addChild(menuLabel);
//label telling player what key they have their menu bound to
Label keyCodeLabel = new Label(0,10,0.3f);
keyCodeLabel.setText(ControlHandler.convertKeycodeToName(Globals.controlHandler.getControl(ControlHandler.DATA_STRING_INPUT_CODE_IN_GAME_MAIN_MENU).getKeyValue()));
keyCodeLabel.setVisible(true);
- rVal.addWidget(keyCodeLabel);
+ rVal.addChild(keyCodeLabel);
rVal.setVisible(false);
// Globals.inGameUI.add(rVal);
- Globals.widgetManager.registerWidget(rVal);
+ // Globals.widgetManager.registerWidget(rVal);
return rVal;
}
diff --git a/src/main/java/electrosphere/renderer/ui/Window.java b/src/main/java/electrosphere/renderer/ui/Window.java
index 8f191e1f..508a8746 100644
--- a/src/main/java/electrosphere/renderer/ui/Window.java
+++ b/src/main/java/electrosphere/renderer/ui/Window.java
@@ -5,6 +5,8 @@ import electrosphere.renderer.Material;
import electrosphere.renderer.Model;
import electrosphere.renderer.framebuffer.Framebuffer;
import electrosphere.renderer.framebuffer.FramebufferUtils;
+import electrosphere.renderer.ui.events.Event;
+
import java.util.LinkedList;
import java.util.List;
import org.joml.Vector3f;
@@ -15,8 +17,8 @@ import static org.lwjgl.opengl.GL30.*;
*
* @author amaterasu
*/
-public class Window extends Widget {
- List widgetList = new LinkedList();
+public class Window implements DrawableElement, ContainerElement {
+ List childList = new LinkedList();
Framebuffer widgetBuffer;
Material customMat = new Material();
@@ -50,8 +52,11 @@ public class Window extends Widget {
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- for(Widget child : widgetList){
- child.draw(widgetBuffer.getFramebufferPointer(),width,height);
+ for(Element child : childList){
+ if(child instanceof DrawableElement){
+ DrawableElement drawableChild = (DrawableElement) child;
+ drawableChild.draw(widgetBuffer.getFramebufferPointer(),width,height);
+ }
}
//this call binds the screen as the "texture" we're rendering to
//have to call before actually rendering
@@ -70,33 +75,28 @@ public class Window extends Widget {
public void pack() {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
-
- public void addWidget(Widget widget) {
- widgetList.add(widget);
- widget.setParentWidth(width);
- widget.setParentHeight(height);
- widget.setVisible(false);
- }
-
- public List getWidgets() {
- return widgetList;
- }
@Override
public void setWidth(int width){
this.width = width;
- for(Widget widget : widgetList){
- widget.setParentWidth(width);
- widget.setParentHeight(height);
+ for(Element child : childList){
+ if(child instanceof DrawableElement){
+ DrawableElement drawableChild = (DrawableElement) child;
+ drawableChild.setParentWidth(width);
+ drawableChild.setParentHeight(height);
+ }
}
}
@Override
public void setHeight(int height){
this.height = height;
- for(Widget widget : widgetList){
- widget.setParentWidth(height);
- widget.setParentHeight(height);
+ for(Element child : childList){
+ if(child instanceof DrawableElement){
+ DrawableElement drawableChild = (DrawableElement) child;
+ drawableChild.setParentWidth(width);
+ drawableChild.setParentHeight(height);
+ }
}
}
@@ -115,4 +115,89 @@ public class Window extends Widget {
float ndcHeight = (float)y/Globals.WINDOW_HEIGHT;
texScale = new Vector3f(ndcWidth,ndcHeight,0);
}
+
+ 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 setVisible(boolean draw) {
+ this.visible = draw;
+ }
+
+ @Override
+ public void setPositionX(int positionX) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void setPositionY(int positionY) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void setParentWidth(int width) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void setParentHeight(int height) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @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 getChildren() {
+ return childList;
+ }
+
+ @Override
+ public void removeChild(Element child) {
+ childList.remove(child);
+ }
+
+ public boolean handleEvent(Event event){
+ return true;
+ }
+
}
diff --git a/src/main/java/electrosphere/renderer/ui/WindowManager.java b/src/main/java/electrosphere/renderer/ui/WindowManager.java
deleted file mode 100644
index 64f31101..00000000
--- a/src/main/java/electrosphere/renderer/ui/WindowManager.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package electrosphere.renderer.ui;
-
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-
-public class WindowManager {
-
-
- Map windowManager = new HashMap();
- List windowPriorityList = new LinkedList();
-
- public void registerWindow(String windowName, Window window){
- windowManager.put(windowName,window);
- windowPriorityList.add(window);
- }
-
- public Window getWindow(String windowName){
- return windowManager.get(windowName);
- }
-
- public void unregisterWindow(String windowName){
- Window toRemove = windowManager.remove(windowName);
- if(toRemove != null){
- windowPriorityList.remove(toRemove);
- }
- }
-
- /**
- * windows should be drawn in this order
- * @return
- */
- public List getWindowPriorityList(){
- return windowPriorityList;
- }
-
-}
diff --git a/src/main/java/electrosphere/renderer/ui/elements/Button.java b/src/main/java/electrosphere/renderer/ui/elements/Button.java
new file mode 100644
index 00000000..5fe4174c
--- /dev/null
+++ b/src/main/java/electrosphere/renderer/ui/elements/Button.java
@@ -0,0 +1,253 @@
+package electrosphere.renderer.ui.elements;
+
+import java.util.LinkedList;
+import java.util.List;
+
+import org.joml.Vector3f;
+
+import electrosphere.renderer.ui.ClickableElement;
+import electrosphere.renderer.ui.ContainerElement;
+import electrosphere.renderer.ui.DrawableElement;
+import electrosphere.renderer.ui.Element;
+import electrosphere.renderer.ui.FocusableElement;
+import electrosphere.renderer.ui.events.ClickEvent;
+import electrosphere.renderer.ui.events.Event;
+import electrosphere.renderer.ui.events.FocusEvent;
+import electrosphere.renderer.ui.events.MouseEvent;
+
+public class Button implements DrawableElement, FocusableElement, ContainerElement, ClickableElement {
+
+ List childList = new LinkedList();
+
+ int width = 1;
+ int height = 1;
+
+ int positionX = 0;
+ int positionY = 0;
+
+ int parentWidth = 1;
+ int parentHeight = 1;
+
+ boolean visible = false;
+ boolean focused = false;
+
+ FocusEventCallback onFocusCallback;
+ FocusEventCallback onLoseFocusCallback;
+ ClickEventCallback clickCallback;
+
+ 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 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 boolean isFocused() {
+ return focused;
+ }
+
+ void onFocus(FocusEvent event) {
+ // TODO Auto-generated method stub
+ if(onFocusCallback != null){
+ onFocusCallback.execute(event);
+ } else {
+ for(Element child : childList){
+ if(child instanceof Label){
+ Label childLabel = (Label) child;
+ childLabel.setColor(new Vector3f(1,0,0));
+ }
+ }
+ }
+ }
+
+ void onLoseFocus(FocusEvent event) {
+ // TODO Auto-generated method stub
+ if(onLoseFocusCallback != null){
+ onLoseFocusCallback.execute(event);
+ } else {
+ for(Element child : childList){
+ if(child instanceof Label){
+ Label childLabel = (Label) child;
+ childLabel.setColor(new Vector3f(1,1,1));
+ }
+ }
+ }
+ }
+
+ public void draw(int parentFramebufferPointer, int parentWidth, int parentHeight) {
+ // TODO Auto-generated method stub
+ for(Element child : childList){
+ if(child instanceof DrawableElement){
+ DrawableElement drawableChild = (DrawableElement) child;
+ drawableChild.draw(parentFramebufferPointer,parentWidth,parentHeight);
+ }
+ }
+ }
+
+ @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 getChildren() {
+ return childList;
+ }
+
+ @Override
+ public void removeChild(Element child) {
+ childList.remove(child);
+ }
+
+ @Override
+ public void setOnFocus(FocusEventCallback callback) {
+ // TODO Auto-generated method stub
+ onFocusCallback = callback;
+ }
+
+ @Override
+ public void setOnLoseFocus(FocusEventCallback callback) {
+ // TODO Auto-generated method stub
+ onLoseFocusCallback = callback;
+ }
+
+ @Override
+ public void setOnClick(ClickEventCallback callback) {
+ // TODO Auto-generated method stub
+ clickCallback = callback;
+ }
+
+ public boolean handleEvent(Event event){
+ if(event instanceof MouseEvent){
+ return false;
+ }
+ if(event instanceof FocusEvent){
+ FocusEvent focusEvent = (FocusEvent) event;
+ if(focusEvent.isFocused()){
+ this.focused = true;
+ onFocus(focusEvent);
+ } else {
+ this.focused = false;
+ onLoseFocus(focusEvent);
+ }
+ return false;
+ }
+ if(event instanceof ClickEvent){
+ if(clickCallback != null){
+ clickCallback.execute((ClickEvent)event);
+ }
+ }
+ return true;
+ }
+
+}
diff --git a/src/main/java/electrosphere/renderer/ui/elements/Div.java b/src/main/java/electrosphere/renderer/ui/elements/Div.java
new file mode 100644
index 00000000..8549d00a
--- /dev/null
+++ b/src/main/java/electrosphere/renderer/ui/elements/Div.java
@@ -0,0 +1,329 @@
+package electrosphere.renderer.ui.elements;
+
+import java.util.LinkedList;
+import java.util.List;
+
+import electrosphere.renderer.ui.ClickableElement;
+import electrosphere.renderer.ui.ContainerElement;
+import electrosphere.renderer.ui.DraggableElement;
+import electrosphere.renderer.ui.DrawableElement;
+import electrosphere.renderer.ui.Element;
+import electrosphere.renderer.ui.FocusableElement;
+import electrosphere.renderer.ui.events.ClickEvent;
+import electrosphere.renderer.ui.events.DragEvent;
+import electrosphere.renderer.ui.events.Event;
+import electrosphere.renderer.ui.events.FocusEvent;
+import electrosphere.renderer.ui.events.DragEvent.DragEventType;
+
+public class Div implements ClickableElement,ContainerElement,DraggableElement,FocusableElement,DrawableElement {
+
+ ClickEventCallback onClick;
+ FocusEventCallback onFocus;
+ FocusEventCallback onLoseFocus;
+ DragEventCallback onDragStart;
+ DragEventCallback onDrag;
+ DragEventCallback onDragRelease;
+ boolean focused = false;
+ List childList = new LinkedList();
+
+
+ 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;
+
+ @Override
+ public int getWidth() {
+ 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 width;
+ }
+ }
+
+ @Override
+ public int getHeight() {
+ 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 height;
+ }
+ }
+
+ @Override
+ public int getPositionX() {
+ 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 positionX;
+ }
+ }
+
+ @Override
+ public int getPositionY() {
+ 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 positionY;
+ }
+ }
+
+ @Override
+ public void setWidth(int width) {
+ // TODO Auto-generated method stub
+ this.width = width;
+ }
+
+ @Override
+ public void setHeight(int height) {
+ // TODO Auto-generated method stub
+ this.height = height;
+ }
+
+ @Override
+ public void setPositionX(int positionX) {
+ // TODO Auto-generated method stub
+ this.positionX = positionX;
+ }
+
+ @Override
+ public void setPositionY(int positionY) {
+ // TODO Auto-generated method stub
+ this.positionY = positionY;
+ }
+
+ @Override
+ public void setParentWidth(int width) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void setParentHeight(int height) {
+ // TODO Auto-generated method stub
+
+ }
+
+
+
+
+
+ @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 getChildren() {
+ return childList;
+ }
+
+ @Override
+ public void removeChild(Element child) {
+ childList.remove(child);
+ }
+
+
+
+
+
+
+
+ public void setFocus(boolean focus){
+ this.focused = focus;
+ }
+
+ @Override
+ public boolean isFocused() {
+ // TODO Auto-generated method stub
+ return focused;
+ }
+
+ @Override
+ public void setOnFocus(FocusEventCallback callback) {
+ // TODO Auto-generated method stub
+ this.onFocus = callback;
+ }
+
+ @Override
+ public void setOnLoseFocus(FocusEventCallback callback) {
+ // TODO Auto-generated method stub
+ this.onLoseFocus = callback;
+ }
+
+ @Override
+ public void setOnDragStart(DragEventCallback callback) {
+ // TODO Auto-generated method stub
+ this.onDragStart = callback;
+ }
+
+ @Override
+ public void setOnDrag(DragEventCallback callback) {
+ // TODO Auto-generated method stub
+ this.onDrag = callback;
+ }
+
+ @Override
+ public void setOnDragRelease(DragEventCallback callback) {
+ // TODO Auto-generated method stub
+ this.onDragRelease = callback;
+ }
+
+ @Override
+ public void setOnClick(ClickEventCallback callback) {
+ // TODO Auto-generated method stub
+ this.onClick = callback;
+ }
+
+
+
+
+ @Override
+ public boolean handleEvent(Event event) {
+ boolean propagate = true;
+ if(onClick != null){
+ if(event instanceof ClickEvent){
+ if(!onClick.execute((ClickEvent)event)){
+ propagate = false;
+ }
+ }
+ }
+ 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)){
+ propagate = false;
+ }
+ }
+ if(onDrag != null && ((DragEvent)event).getType() == DragEventType.DRAG){
+ if(!onDrag.execute((DragEvent)event)){
+ propagate = false;
+ }
+ }
+ if(onDragRelease != null && ((DragEvent)event).getType() == DragEventType.RELEASE){
+ if(!onDragRelease.execute((DragEvent)event)){
+ propagate = false;
+ }
+ }
+ }
+ return propagate;
+ }
+
+ @Override
+ public boolean getVisible() {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ @Override
+ public void setVisible(boolean draw) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void draw(int parentFramebufferPointer, int parentWidth, int parentHeight) {
+ // TODO Auto-generated method stub
+ for(Element child : childList){
+ if(child instanceof DrawableElement){
+ DrawableElement drawableChild = (DrawableElement) child;
+ drawableChild.draw(parentFramebufferPointer,parentWidth,parentHeight);
+ }
+ }
+ }
+
+
+
+
+
+
+
+
+}
diff --git a/src/main/java/electrosphere/renderer/ui/widgets/ImagePanel.java b/src/main/java/electrosphere/renderer/ui/elements/ImagePanel.java
similarity index 50%
rename from src/main/java/electrosphere/renderer/ui/widgets/ImagePanel.java
rename to src/main/java/electrosphere/renderer/ui/elements/ImagePanel.java
index 730c75b6..24e88142 100644
--- a/src/main/java/electrosphere/renderer/ui/widgets/ImagePanel.java
+++ b/src/main/java/electrosphere/renderer/ui/elements/ImagePanel.java
@@ -1,4 +1,4 @@
-package electrosphere.renderer.ui.widgets;
+package electrosphere.renderer.ui.elements;
import electrosphere.main.Globals;
import electrosphere.renderer.Material;
@@ -6,7 +6,12 @@ import electrosphere.renderer.Model;
import electrosphere.renderer.framebuffer.Framebuffer;
import electrosphere.renderer.framebuffer.FramebufferUtils;
import electrosphere.renderer.texture.Texture;
-import electrosphere.renderer.ui.Widget;
+import electrosphere.renderer.ui.DraggableElement;
+import electrosphere.renderer.ui.DrawableElement;
+import electrosphere.renderer.ui.events.DragEvent;
+import electrosphere.renderer.ui.events.Event;
+import electrosphere.renderer.ui.events.DragEvent.DragEventType;
+
import org.joml.Vector3f;
import static org.lwjgl.opengl.GL11.GL_COLOR_BUFFER_BIT;
import static org.lwjgl.opengl.GL11.GL_DEPTH_BUFFER_BIT;
@@ -19,8 +24,10 @@ import static org.lwjgl.opengl.GL30.glBindFramebuffer;
*
* @author amaterasu
*/
-public class ImagePanel extends Widget {
+public class ImagePanel implements DrawableElement, DraggableElement {
+ public static String imagePanelModelPath;
+
String texturePath;
Material customMat = new Material();
boolean hasLoadedTexture = false;
@@ -29,6 +36,10 @@ public class ImagePanel extends Widget {
Vector3f texPosition = new Vector3f(0,0,0);
Vector3f texScale = new Vector3f(1,1,0);
+
+ DragEventCallback onDragStart;
+ DragEventCallback onDrag;
+ DragEventCallback onDragRelease;
public ImagePanel(int x, int y, int width, int height, String texturePath){
this.texturePath = texturePath;
@@ -76,7 +87,7 @@ public class ImagePanel extends Widget {
Vector3f boxPosition = new Vector3f(ndcX,ndcY,0);
Vector3f boxDimensions = new Vector3f(ndcWidth,ndcHeight,0);
- Model planeModel = Globals.assetManager.fetchModel(Globals.planeModelID);
+ Model planeModel = Globals.assetManager.fetchModel(imagePanelModelPath);
planeModel.pushUniformToMesh("plane", "mPosition", boxPosition);
planeModel.pushUniformToMesh("plane", "mDimension", boxDimensions);
planeModel.pushUniformToMesh("plane", "tPosition", texPosition);
@@ -84,5 +95,101 @@ public class ImagePanel extends Widget {
planeModel.meshes.get(0).setMaterial(customMat);
planeModel.drawUI();
}
+
+ 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){
+ if(onDragStart != null && ((DragEvent)event).getType() == DragEventType.START){
+ if(!onDragStart.execute((DragEvent)event)){
+ propagate = false;
+ }
+ }
+ if(onDrag != null && ((DragEvent)event).getType() == DragEventType.DRAG){
+ if(!onDrag.execute((DragEvent)event)){
+ propagate = false;
+ }
+ }
+ if(onDragRelease != null && ((DragEvent)event).getType() == DragEventType.RELEASE){
+ if(!onDragRelease.execute((DragEvent)event)){
+ propagate = false;
+ }
+ }
+ }
+ return propagate;
+ }
+
+ @Override
+ public void setOnDragStart(DragEventCallback callback) {
+ onDragStart = callback;
+ }
+
+ @Override
+ public void setOnDrag(DragEventCallback callback) {
+ onDrag = callback;
+ }
+
+ @Override
+ public void setOnDragRelease(DragEventCallback callback) {
+ onDragRelease = callback;
+ }
}
diff --git a/src/main/java/electrosphere/renderer/ui/elements/Label.java b/src/main/java/electrosphere/renderer/ui/elements/Label.java
new file mode 100644
index 00000000..45b3098b
--- /dev/null
+++ b/src/main/java/electrosphere/renderer/ui/elements/Label.java
@@ -0,0 +1,199 @@
+package electrosphere.renderer.ui.elements;
+
+import electrosphere.main.Globals;
+import electrosphere.renderer.Model;
+import electrosphere.renderer.ui.DrawableElement;
+import electrosphere.renderer.ui.Element;
+import electrosphere.renderer.ui.events.Event;
+import electrosphere.renderer.ui.font.FontUtils;
+import electrosphere.renderer.ui.font.bitmapchar.BitmapCharacter;
+import java.util.LinkedList;
+import java.util.List;
+import org.joml.Vector3f;
+
+/**
+ *
+ * @author amaterasu
+ */
+public class Label implements DrawableElement {
+
+ String text = "";
+ int textPixelWidth = 0;
+
+ float fontSize = 1.0f;
+
+ List childrenElements = new LinkedList();
+
+ public Label(int x, int y, float fontSize){
+ this.positionX = x;
+ this.positionY = y;
+ this.width = 0;
+ this.height = (int)(FontUtils.getFontHeight() * fontSize);
+ this.fontSize = fontSize;
+ }
+
+ void generateLetters(){
+ childrenElements.clear();
+ int rollingOffset = 0;
+ for(int i = 0; i < text.length(); i++){
+ char toDraw = text.charAt(i);
+ Vector3f bitMapDimension = FontUtils.getDimensionOfCharacterDiscrete(toDraw);
+ BitmapCharacter newLetter = new BitmapCharacter((int)(rollingOffset * fontSize) + positionX, positionY, (int)(bitMapDimension.x * fontSize), this.height, toDraw);
+ rollingOffset += (int)bitMapDimension.x;
+ childrenElements.add(newLetter);
+ }
+ }
+
+ public void setText(String text){
+ this.text = text;
+ textPixelWidth = 0;
+ for(int i = 0; i < text.length(); i++){
+ Vector3f bitMapDimension = FontUtils.getDimensionOfCharacterDiscrete(text.charAt(i));
+ textPixelWidth = textPixelWidth + (int)bitMapDimension.x;
+ }
+ generateLetters();
+ }
+
+ public void setColor(Vector3f color){
+ for(BitmapCharacter character : childrenElements){
+ character.setColor(color);
+ }
+ }
+
+ public String getText(){
+ return text;
+ }
+
+ @Override
+ public void draw(int parentFramebufferPointer, int parentWidth, int parentHeight) {
+ for(DrawableElement child : childrenElements){
+ child.draw(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 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 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;
+ }
+
+}
diff --git a/src/main/java/electrosphere/renderer/ui/transparenttextbox/TextBox.java b/src/main/java/electrosphere/renderer/ui/elements/TextBox.java
similarity index 70%
rename from src/main/java/electrosphere/renderer/ui/transparenttextbox/TextBox.java
rename to src/main/java/electrosphere/renderer/ui/elements/TextBox.java
index 60ec0abf..92c5d44e 100644
--- a/src/main/java/electrosphere/renderer/ui/transparenttextbox/TextBox.java
+++ b/src/main/java/electrosphere/renderer/ui/elements/TextBox.java
@@ -1,19 +1,16 @@
-package electrosphere.renderer.ui.transparenttextbox;
+package electrosphere.renderer.ui.elements;
import electrosphere.main.Globals;
import electrosphere.renderer.Model;
import electrosphere.engine.assetmanager.AssetDataStrings;
-import electrosphere.renderer.ui.Widget;
+import electrosphere.renderer.ui.DrawableElement;
+import electrosphere.renderer.ui.events.Event;
import electrosphere.renderer.ui.font.FontUtils;
import org.joml.Vector3f;
-public class TextBox extends Widget{
+public class TextBox implements DrawableElement {
- int positionX;
- int positionY;
- int width;
- int height;
String text;
boolean editable;
@@ -86,4 +83,68 @@ public class TextBox extends Widget{
// }
// }
}
+
+ 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;
+ }
+
}
diff --git a/src/main/java/electrosphere/renderer/ui/widgets/TextInput.java b/src/main/java/electrosphere/renderer/ui/elements/TextInput.java
similarity index 84%
rename from src/main/java/electrosphere/renderer/ui/widgets/TextInput.java
rename to src/main/java/electrosphere/renderer/ui/elements/TextInput.java
index e669c50a..4a379cf2 100644
--- a/src/main/java/electrosphere/renderer/ui/widgets/TextInput.java
+++ b/src/main/java/electrosphere/renderer/ui/elements/TextInput.java
@@ -1,4 +1,4 @@
-package electrosphere.renderer.ui.widgets;
+package electrosphere.renderer.ui.elements;
import electrosphere.main.Globals;
import electrosphere.renderer.Material;
@@ -7,7 +7,8 @@ import electrosphere.engine.assetmanager.AssetDataStrings;
import electrosphere.renderer.framebuffer.Framebuffer;
import electrosphere.renderer.framebuffer.FramebufferUtils;
import electrosphere.renderer.texture.Texture;
-import electrosphere.renderer.ui.Widget;
+import electrosphere.renderer.ui.DrawableElement;
+import electrosphere.renderer.ui.events.Event;
import electrosphere.renderer.ui.font.FontUtils;
import org.joml.Vector3f;
import static org.lwjgl.opengl.GL30.GL_FRAMEBUFFER;
@@ -17,7 +18,7 @@ import static org.lwjgl.opengl.GL30.glBindFramebuffer;
*
* @author amaterasu
*/
-public class TextInput extends Widget {
+public class TextInput implements DrawableElement {
Framebuffer widgetBuffer;
Material customMat = new Material();
@@ -37,27 +38,31 @@ public class TextInput extends Widget {
Vector3f color = new Vector3f(0,0,0);
- public TextInput(){
+ public TextInput(int positionX, int positionY, int width, int height){
//TODO: figure out why this has to be 1920x1080
// widgetBuffer = FramebufferUtils.generateTextureFramebuffer(500, 500);
widgetBuffer = FramebufferUtils.generateScreensizeTextureFramebuffer();
customMat.setTexturePointer(widgetBuffer.getTexturePointer());
// customMat.setTexturePointer(Globals.assetManager.fetchTexture("Textures/Testing1.png").getTexturePointer());
// customMat.setTexturePointer(Globals.assetManager.fetchTexture("Textures/default_diffuse.png").getTexturePointer());
+ setPositionX(positionX);
+ setPositionY(positionY);
+ setWidth(width);
+ setHeight(height);
}
@Override
public void setPositionY(int positionY) {
float ndcY = (float)positionY/(float)Globals.WINDOW_HEIGHT;
boxPosition.y = ndcY;
- super.setPositionY(positionY);
+ this.positionY = positionY;
}
@Override
public void setPositionX(int positionX) {
float ndcX = (float)positionX/(float)Globals.WINDOW_WIDTH;
boxPosition.x = ndcX;
- super.setPositionX(positionX);
+ this.positionX = positionX;
}
@Override
@@ -70,7 +75,7 @@ public class TextInput extends Widget {
customMat.setTexturePointer(widgetBuffer.getTexturePointer());
oldBuffer.free();
// customMat.setTexturePointer(Globals.assetManager.fetchTexture("Textures/Testing1.png").getTexturePointer());
- super.setHeight(height);
+ this.height = height;
}
@Override
@@ -85,19 +90,17 @@ public class TextInput extends Widget {
oldBuffer.free();
// widgetBuffer = FramebufferUtils.generateTextureFramebuffer(width, height);
// customMat.setTexturePointer(Globals.assetManager.fetchTexture("Textures/Testing1.png").getTexturePointer());
- super.setWidth(width);
+ this.width = width;
}
@Override
public void setParentWidth(int parentWidth){
this.parentWidth = parentWidth;
- setWidth(width);
}
@Override
public void setParentHeight(int parentHeight){
this.parentHeight = parentHeight;
- setHeight(height);
}
public void setFontWidth(int width){
@@ -115,6 +118,10 @@ public class TextInput extends Widget {
public int getFontHeight(){
return fontHeight;
}
+
+ public String getText(){
+ return text;
+ }
public void setText(String text){
this.text = text;
@@ -173,5 +180,44 @@ public class TextInput extends Widget {
planeModel.meshes.get(0).setMaterial(customMat);
planeModel.drawUI();
}
+
+ 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 setVisible(boolean draw) {
+ this.visible = draw;
+ }
+
+ public boolean handleEvent(Event event){
+ return true;
+ }
}
diff --git a/src/main/java/electrosphere/renderer/ui/events/ClickEvent.java b/src/main/java/electrosphere/renderer/ui/events/ClickEvent.java
new file mode 100644
index 00000000..0002e6c7
--- /dev/null
+++ b/src/main/java/electrosphere/renderer/ui/events/ClickEvent.java
@@ -0,0 +1,33 @@
+package electrosphere.renderer.ui.events;
+
+public class ClickEvent implements Event {
+
+ int currentX;
+ int currentY;
+ boolean button1;
+ boolean button2;
+
+ public ClickEvent(int currentX,int currentY,boolean button1,boolean button2){
+ this.currentX = currentX;
+ this.currentY = currentY;
+ this.button1 = button1;
+ this.button2 = button2;
+ }
+
+ public int getCurrentX(){
+ return currentX;
+ }
+
+ public int getCurrentY(){
+ return currentY;
+ }
+
+ public boolean getButton1(){
+ return button1;
+ }
+
+ public boolean getButton2(){
+ return button2;
+ }
+
+}
diff --git a/src/main/java/electrosphere/renderer/ui/events/DragEvent.java b/src/main/java/electrosphere/renderer/ui/events/DragEvent.java
new file mode 100644
index 00000000..530bba55
--- /dev/null
+++ b/src/main/java/electrosphere/renderer/ui/events/DragEvent.java
@@ -0,0 +1,69 @@
+package electrosphere.renderer.ui.events;
+
+import electrosphere.renderer.ui.Element;
+
+public class DragEvent implements Event {
+
+ public static enum DragEventType {
+ START,
+ DRAG,
+ RELEASE,
+ }
+
+ int currentX;
+ int currentY;
+ int previousX;
+ int previousY;
+ int deltaX;
+ int deltaY;
+ DragEventType type;
+ Element target;
+
+ public DragEvent(int currentX,int currentY,int previousX,int previousY,int deltaX,int deltaY,DragEventType type,Element target){
+ this.currentX = currentX;
+ this.currentY = currentY;
+ this.previousX = previousX;
+ this.previousY = previousY;
+ this.deltaX = deltaX;
+ this.deltaY = deltaY;
+ this.type = type;
+ this.target = target;
+ }
+
+ public int getCurrentX(){
+ return currentX;
+ }
+
+ public int getCurrentY(){
+ return currentY;
+ }
+
+ public int getPreviousX(){
+ return previousX;
+ }
+
+ public int getPreviousY(){
+ return previousY;
+ }
+
+ public int getDeltaX(){
+ return deltaX;
+ }
+
+ public int getDeltaY(){
+ return deltaY;
+ }
+
+ public DragEventType getType(){
+ return type;
+ }
+
+ public Element getTarget(){
+ return target;
+ }
+
+ public void setTarget(Element target){
+ this.target = target;
+ }
+
+}
diff --git a/src/main/java/electrosphere/renderer/ui/events/Event.java b/src/main/java/electrosphere/renderer/ui/events/Event.java
new file mode 100644
index 00000000..c5b999ab
--- /dev/null
+++ b/src/main/java/electrosphere/renderer/ui/events/Event.java
@@ -0,0 +1,5 @@
+package electrosphere.renderer.ui.events;
+
+public interface Event {
+
+}
diff --git a/src/main/java/electrosphere/renderer/ui/events/FocusEvent.java b/src/main/java/electrosphere/renderer/ui/events/FocusEvent.java
new file mode 100644
index 00000000..de0cb914
--- /dev/null
+++ b/src/main/java/electrosphere/renderer/ui/events/FocusEvent.java
@@ -0,0 +1,15 @@
+package electrosphere.renderer.ui.events;
+
+public class FocusEvent implements Event {
+
+ boolean isFocused;
+
+ public FocusEvent(boolean isFocused){
+ this.isFocused = isFocused;
+ }
+
+ public boolean isFocused(){
+ return isFocused;
+ }
+
+}
diff --git a/src/main/java/electrosphere/renderer/ui/events/KeyboardEvent.java b/src/main/java/electrosphere/renderer/ui/events/KeyboardEvent.java
new file mode 100644
index 00000000..e111c339
--- /dev/null
+++ b/src/main/java/electrosphere/renderer/ui/events/KeyboardEvent.java
@@ -0,0 +1,15 @@
+package electrosphere.renderer.ui.events;
+
+public class KeyboardEvent implements Event {
+
+ String key;
+
+ public KeyboardEvent(String key){
+ this.key = key;
+ }
+
+ public String getKey(){
+ return key;
+ }
+
+}
diff --git a/src/main/java/electrosphere/renderer/ui/events/MouseEvent.java b/src/main/java/electrosphere/renderer/ui/events/MouseEvent.java
new file mode 100644
index 00000000..e1013b10
--- /dev/null
+++ b/src/main/java/electrosphere/renderer/ui/events/MouseEvent.java
@@ -0,0 +1,57 @@
+package electrosphere.renderer.ui.events;
+
+public class MouseEvent implements Event {
+
+ int currentX;
+ int currentY;
+ int previousX;
+ int previousY;
+ int deltaX;
+ int deltaY;
+ boolean button1;
+ boolean button2;
+
+ public MouseEvent(int currentX,int currentY,int previousX,int previousY,int deltaX,int deltaY,boolean button1,boolean button2){
+ this.currentX = currentX;
+ this.currentY = currentY;
+ this.previousX = previousX;
+ this.previousY = previousY;
+ this.deltaX = deltaX;
+ this.deltaY = deltaY;
+ this.button1 = button1;
+ this.button2 = button2;
+ }
+
+ public int getCurrentX(){
+ return currentX;
+ }
+
+ public int getCurrentY(){
+ return currentY;
+ }
+
+ public int getPreviousX(){
+ return previousX;
+ }
+
+ public int getPreviousY(){
+ return previousY;
+ }
+
+ public int getDeltaX(){
+ return deltaX;
+ }
+
+ public int getDeltaY(){
+ return deltaY;
+ }
+
+ public boolean getButton1(){
+ return button1;
+ }
+
+ public boolean getButton2(){
+ return button2;
+ }
+
+}
diff --git a/src/main/java/electrosphere/renderer/ui/events/NavigationEvent.java b/src/main/java/electrosphere/renderer/ui/events/NavigationEvent.java
new file mode 100644
index 00000000..82e3d99e
--- /dev/null
+++ b/src/main/java/electrosphere/renderer/ui/events/NavigationEvent.java
@@ -0,0 +1,5 @@
+package electrosphere.renderer.ui.events;
+
+public class NavigationEvent implements Event {
+
+}
diff --git a/src/main/java/electrosphere/renderer/ui/font/FontUtils.java b/src/main/java/electrosphere/renderer/ui/font/FontUtils.java
index 99a0509c..cd2049f3 100644
--- a/src/main/java/electrosphere/renderer/ui/font/FontUtils.java
+++ b/src/main/java/electrosphere/renderer/ui/font/FontUtils.java
@@ -21,8 +21,8 @@ public class FontUtils {
static RawFontMap rawFontMap;
- static HashMap positionMap = new HashMap();
- static HashMap dimensionMap = new HashMap();
+ static HashMap positionMap = new HashMap();
+ static HashMap dimensionMap = new HashMap();
static int width = 10;
static int height = 10;
diff --git a/src/main/java/electrosphere/renderer/ui/font/TextBox.java b/src/main/java/electrosphere/renderer/ui/font/TextBox.java
deleted file mode 100644
index 7ea0578d..00000000
--- a/src/main/java/electrosphere/renderer/ui/font/TextBox.java
+++ /dev/null
@@ -1,108 +0,0 @@
-package electrosphere.renderer.ui.font;
-
-import electrosphere.main.Globals;
-import electrosphere.renderer.Model;
-import electrosphere.engine.assetmanager.AssetDataStrings;
-import electrosphere.renderer.ui.Widget;
-import org.joml.Vector3f;
-
-/**
- *
- * @author amaterasu
- */
-public class TextBox extends Widget{
-
-
- int positionX;
- int positionY;
- int width;
- int height;
- int rows;
- int cols;
- String text;
- boolean editable;
-
- Vector3f color = new Vector3f(0,0,0);
-
- public TextBox(int positionX, int positionY, int width, int height, int rows, int cols, String text, boolean render, boolean editable) {
- this.positionX = positionX;
- this.positionY = positionY;
- this.width = width;
- this.height = height;
- this.rows = rows;
- this.cols = cols;
- this.text = text;
- }
-
- public int getRows() {
- return rows;
- }
-
- public int getCols() {
- return cols;
- }
-
- public String getText() {
- return text;
- }
-
- public void setRows(int rows) {
- this.rows = rows;
- }
-
- public void setCols(int cols) {
- this.cols = cols;
- }
-
- public void setText(String text) {
- this.text = text;
- }
-
- public void setColor(Vector3f color) {
- this.color = color;
- }
-
- public boolean isEditable() {
- return editable;
- }
-
- public void setEditable(boolean editable) {
- this.editable = editable;
- }
-
-
- @Override
- public void draw(int parentFramebufferPointer, int parentWidth, int parentHeight){
- Globals.renderingEngine.bindFramebuffer(parentFramebufferPointer);
- 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;
- //monowidth for the moment
- float charWidth = ndcWidth/cols;
- float charHeight = ndcHeight/rows;
- for(int y = 0; y < rows; y++){
- for(int x = 0; x < cols; x++){
- char toDraw = ' ';
- if(x + y * cols < text.length()){
- toDraw = text.charAt(x + y * cols);
- }
- Vector3f characterPosition = new Vector3f(ndcX + x * charWidth,ndcY + y * charHeight,0);
- Vector3f characterDimensions = new Vector3f(charWidth,charHeight,0);
- Vector3f bitMapPosition = FontUtils.getPositionOfCharacter(toDraw);
- Vector3f bitMapDimension = FontUtils.getDimensionOfCharacter(toDraw);
- Model charModel = Globals.assetManager.fetchModel(AssetDataStrings.ASSET_STRING_BITMAP_FONT);
- if(charModel != null && toDraw != ' '){
- charModel.pushUniformToMesh(AssetDataStrings.ASSET_STRING_BITMAP_FONT_MESH_NAME, "mPosition", characterPosition);
- charModel.pushUniformToMesh(AssetDataStrings.ASSET_STRING_BITMAP_FONT_MESH_NAME, "mDimension", characterDimensions);
- charModel.pushUniformToMesh(AssetDataStrings.ASSET_STRING_BITMAP_FONT_MESH_NAME, "tPosition", bitMapPosition);
- charModel.pushUniformToMesh(AssetDataStrings.ASSET_STRING_BITMAP_FONT_MESH_NAME, "tDimension", bitMapDimension);
- charModel.pushUniformToMesh(AssetDataStrings.ASSET_STRING_BITMAP_FONT_MESH_NAME, "color", color);
- charModel.drawUI();
- }
- }
- }
- }
-
-
-}
diff --git a/src/main/java/electrosphere/renderer/ui/font/bitmapchar/BitmapCharacter.java b/src/main/java/electrosphere/renderer/ui/font/bitmapchar/BitmapCharacter.java
index ee136014..3bccc499 100644
--- a/src/main/java/electrosphere/renderer/ui/font/bitmapchar/BitmapCharacter.java
+++ b/src/main/java/electrosphere/renderer/ui/font/bitmapchar/BitmapCharacter.java
@@ -3,7 +3,8 @@ package electrosphere.renderer.ui.font.bitmapchar;
import electrosphere.engine.assetmanager.AssetDataStrings;
import electrosphere.main.Globals;
import electrosphere.renderer.Model;
-import electrosphere.renderer.ui.Widget;
+import electrosphere.renderer.ui.DrawableElement;
+import electrosphere.renderer.ui.events.Event;
import electrosphere.renderer.ui.font.FontUtils;
import org.joml.Vector3f;
@@ -11,12 +12,8 @@ import org.joml.Vector3f;
*
* @author satellite
*/
-public class BitmapCharacter extends Widget {
+public class BitmapCharacter implements DrawableElement {
- int positionX;
- int positionY;
- int width;
- int height;
String text;
Vector3f color = new Vector3f(0,0,0);
@@ -24,11 +21,11 @@ public class BitmapCharacter extends Widget {
public BitmapCharacter(int posX, int posY, int width, int height, char toDraw){
- positionX = posX;
- positionY = posY;
+ this.positionX = posX;
+ this.positionY = posY;
this.width = width;
this.height = height;
- text = "" + toDraw;
+ this.text = "" + toDraw;
}
@@ -75,5 +72,68 @@ public class BitmapCharacter extends Widget {
charModel.drawUI();
}
}
+
+ 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;
+ }
}
diff --git a/src/main/java/electrosphere/renderer/ui/form/FormElement.java b/src/main/java/electrosphere/renderer/ui/form/FormElement.java
new file mode 100644
index 00000000..b58f630c
--- /dev/null
+++ b/src/main/java/electrosphere/renderer/ui/form/FormElement.java
@@ -0,0 +1,202 @@
+package electrosphere.renderer.ui.form;
+
+import java.util.LinkedList;
+import java.util.List;
+
+import electrosphere.renderer.ui.ContainerElement;
+import electrosphere.renderer.ui.DrawableElement;
+import electrosphere.renderer.ui.Element;
+import electrosphere.renderer.ui.events.Event;
+
+public class FormElement implements DrawableElement, ContainerElement {
+
+ List childList = new LinkedList();
+
+ public void draw(int parentFramebufferPointer, int parentWidth, int parentHeight) {
+ // TODO Auto-generated method stub
+ for(Element child : childList){
+ if(child instanceof DrawableElement){
+ DrawableElement drawableChild = (DrawableElement) child;
+ drawableChild.draw(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 getChildren() {
+ return childList;
+ }
+
+ @Override
+ public void removeChild(Element child) {
+ childList.remove(child);
+ }
+
+ public boolean handleEvent(Event event){
+ return true;
+ }
+
+}
diff --git a/src/main/java/electrosphere/renderer/ui/label/Label.java b/src/main/java/electrosphere/renderer/ui/label/Label.java
deleted file mode 100644
index 9c3fefcf..00000000
--- a/src/main/java/electrosphere/renderer/ui/label/Label.java
+++ /dev/null
@@ -1,66 +0,0 @@
-package electrosphere.renderer.ui.label;
-
-import electrosphere.main.Globals;
-import electrosphere.renderer.Model;
-import electrosphere.renderer.ui.Widget;
-import electrosphere.renderer.ui.font.FontUtils;
-import electrosphere.renderer.ui.font.bitmapchar.BitmapCharacter;
-import java.util.LinkedList;
-import java.util.List;
-import org.joml.Vector3f;
-
-/**
- *
- * @author amaterasu
- */
-public class Label extends Widget{
-
- String text = "";
- int textPixelWidth = 0;
-
- float fontSize = 1.0f;
-
- List childrenElements = new LinkedList();
-
- public Label(int x, int y, float fontSize){
- this.positionX = x;
- this.positionY = y;
- this.width = 0;
- this.height = (int)(FontUtils.getFontHeight() * fontSize);
- this.fontSize = fontSize;
- }
-
- void generateLetters(){
- childrenElements.clear();
- int rollingOffset = 0;
- for(int i = 0; i < text.length(); i++){
- char toDraw = text.charAt(i);
- Vector3f bitMapDimension = FontUtils.getDimensionOfCharacterDiscrete(toDraw);
- Widget newLetter = new BitmapCharacter((int)(rollingOffset * fontSize) + positionX, positionY, (int)(bitMapDimension.x * fontSize), this.height, toDraw);
- rollingOffset += (int)bitMapDimension.x;
- childrenElements.add(newLetter);
- }
- }
-
- public void setText(String text){
- this.text = text;
- textPixelWidth = 0;
- for(int i = 0; i < text.length(); i++){
- Vector3f bitMapDimension = FontUtils.getDimensionOfCharacterDiscrete(text.charAt(i));
- textPixelWidth = textPixelWidth + (int)bitMapDimension.x;
- }
- generateLetters();
- }
-
- public String getText(){
- return text;
- }
-
- @Override
- public void draw(int parentFramebufferPointer, int parentWidth, int parentHeight) {
- for(Widget child : childrenElements){
- child.draw(parentFramebufferPointer, parentWidth, parentHeight);
- }
- }
-
-}
diff --git a/src/main/java/electrosphere/renderer/ui/layout/LayoutScheme.java b/src/main/java/electrosphere/renderer/ui/layout/LayoutScheme.java
index 695dcce2..1678ba79 100644
--- a/src/main/java/electrosphere/renderer/ui/layout/LayoutScheme.java
+++ b/src/main/java/electrosphere/renderer/ui/layout/LayoutScheme.java
@@ -1,6 +1,7 @@
package electrosphere.renderer.ui.layout;
-import electrosphere.renderer.ui.Widget;
+import electrosphere.renderer.ui.ContainerElement;
+import electrosphere.renderer.ui.DrawableElement;
import java.util.LinkedList;
import java.util.List;
@@ -8,14 +9,8 @@ import java.util.List;
*
* @author amaterasu
*/
-public abstract interface LayoutScheme {
+public abstract interface LayoutScheme extends ContainerElement {
public abstract void pack();
- public abstract void addWidget(Widget widget);
-
- public abstract List getWidgets();
-
- public abstract void destroy();
-
}
diff --git a/src/main/java/electrosphere/renderer/ui/layout/LayoutSchemeListScrollable.java b/src/main/java/electrosphere/renderer/ui/layout/LayoutSchemeListScrollable.java
index 0cfd883a..38afd3d5 100644
--- a/src/main/java/electrosphere/renderer/ui/layout/LayoutSchemeListScrollable.java
+++ b/src/main/java/electrosphere/renderer/ui/layout/LayoutSchemeListScrollable.java
@@ -3,7 +3,9 @@ package electrosphere.renderer.ui.layout;
import electrosphere.main.Globals;
import electrosphere.renderer.Material;
import electrosphere.renderer.framebuffer.Framebuffer;
-import electrosphere.renderer.ui.Widget;
+import electrosphere.renderer.ui.DrawableElement;
+import electrosphere.renderer.ui.Element;
+import electrosphere.renderer.ui.events.Event;
import electrosphere.renderer.Model;
import electrosphere.engine.assetmanager.AssetDataStrings;
import electrosphere.renderer.framebuffer.FramebufferUtils;
@@ -28,9 +30,9 @@ import static org.lwjgl.opengl.GL30.glBindFramebuffer;
*
* @author amaterasu
*/
-public class LayoutSchemeListScrollable extends Widget {
+public class LayoutSchemeListScrollable implements DrawableElement,LayoutScheme {
- List widgetList = new LinkedList();
+ List childList = new LinkedList();
Framebuffer widgetBuffer = FramebufferUtils.generateScreensizeTextureFramebuffer();
Material customMat = new Material();
@@ -58,8 +60,11 @@ public class LayoutSchemeListScrollable extends Widget {
widgetBuffer.bind();
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- for(Widget child : widgetList){
- child.draw(widgetBuffer.getFramebufferPointer(),width,height);
+ for(Element child : childList){
+ if(child instanceof DrawableElement){
+ DrawableElement drawableChild = (DrawableElement) child;
+ drawableChild.draw(widgetBuffer.getFramebufferPointer(),width,height);
+ }
}
//this call binds the screen as the "texture" we're rendering to
//have to call before actually rendering
@@ -82,17 +87,88 @@ public class LayoutSchemeListScrollable extends Widget {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
- public void addWidget(Widget widget) {
- widgetList.add(widget);
- widget.setVisible(false);
+ 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 List getWidgets() {
- return widgetList;
+ public int getHeight() {
+ return height;
}
- public void destroy() {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ 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 getChildren() {
+ return childList;
+ }
+
+ @Override
+ public void removeChild(Element child) {
+ childList.remove(child);
+ }
+
+ public boolean handleEvent(Event event){
+ return true;
+ }
+
}
diff --git a/src/main/java/electrosphere/renderer/ui/transparenttextbox/TextBoxUtils.java b/src/main/java/electrosphere/renderer/ui/transparenttextbox/TextBoxUtils.java
deleted file mode 100644
index ce50c48e..00000000
--- a/src/main/java/electrosphere/renderer/ui/transparenttextbox/TextBoxUtils.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package electrosphere.renderer.ui.transparenttextbox;
-
-/**
- *
- * @author amaterasu
- */
-public class TextBoxUtils {
-
-}