diff --git a/GameEngine/src/main/java/gameEngine/ConnectionManager.java b/GameEngine/src/main/java/gameEngine/ConnectionManager.java index 9d5874d..18afb37 100644 --- a/GameEngine/src/main/java/gameEngine/ConnectionManager.java +++ b/GameEngine/src/main/java/gameEngine/ConnectionManager.java @@ -9,7 +9,7 @@ import gameEngine.input.MouseInput; public class ConnectionManager { - private List connections = new ArrayList<>(); + private final List connections = new ArrayList<>(); private PortView pressedPort; public void handlePortPress(PortView port) { @@ -17,17 +17,24 @@ } public void handlePortRelease(PortView port) { - if (pressedPort != null && pressedPort != port && pressedPort.getPortType() != port.getPortType()) { - System.out.println("Connect!"); - Connection newConnection = new Connection(pressedPort, port); - connections.add(newConnection); - GameObject entityA = (GameObject) pressedPort.getParent(); - GameObject entityB = (GameObject) port.getParent(); - if(entityA.getComponent(EntityView.class) != null){ - entityA.ComponentConnections.add(entityB.getComponent(ComponentView.class).connectionType); - }else { - entityB.ComponentConnections.add(entityA.getComponent(ComponentView.class).connectionType); + if (pressedPort != null && pressedPort != port && pressedPort.getPortType() != port.getPortType()) { + if (pressedPort.isConnectedTo(port)) { + System.out.println("already connected"); + } else { + System.out.println("Connect!"); + Connection newConnection = new Connection(pressedPort, port); + connections.add(newConnection); + pressedPort.addConnectedPort(port); + port.addConnectedPort(pressedPort); + + GameObject portParentA = pressedPort.getParent(); + GameObject portParentB = port.getParent(); + if (portParentA.getComponent(EntityView.class) != null) { + portParentA.ComponentConnections.add(portParentB.getComponent(ComponentView.class).connectionType); + } else { + portParentB.ComponentConnections.add(portParentA.getComponent(ComponentView.class).connectionType); + } } } pressedPort = null; @@ -36,15 +43,42 @@ public void update() { for (Connection connection : connections) { connection.render(); + + if (Input.GetMouseButtonDown(0)) { + float mouseX = MouseInput.getX(); + float mouseY = MouseInput.getY(); + + if (connection.isClicked(mouseX, mouseY)) { + System.out.println("Connection removed"); + removeConnection(connection.getPortA(), connection.getPortB()); + break; + } + } + } + } + + public void removeConnection(PortView portA, PortView portB) { + Connection toRemove = null; + for (Connection connection : connections) { + if ((connection.getPortA() == portA && connection.getPortB() == portB) || + (connection.getPortA() == portB && connection.getPortB() == portA)) { + toRemove = connection; + break; + } } - if (Input.GetMouseButtonDown(0)) { - float mouseX = MouseInput.getX(); - float mouseY = MouseInput.getY(); + if (toRemove != null) { + connections.remove(toRemove); + portA.removeConnectedPort(portB); + portB.removeConnectedPort(portA); - for (Connection connection : connections) { - if(connection.isClicked(mouseX, mouseY)) System.out.println("Clicked"); - else System.out.println("o"); + GameObject portParentA = portA.getParent(); + GameObject portParentB = portB.getParent(); + + if (portParentA.getComponent(EntityView.class) != null) { + portParentA.ComponentConnections.remove(portParentB.getComponent(ComponentView.class).connectionType); + } else { + portParentB.ComponentConnections.remove(portParentA.getComponent(ComponentView.class).connectionType); } } } diff --git a/GameEngine/src/main/java/gameEngine/entites/gameComponents/ComponentView.java b/GameEngine/src/main/java/gameEngine/entites/gameComponents/ComponentView.java index 9bf08f5..a35f7a4 100644 --- a/GameEngine/src/main/java/gameEngine/entites/gameComponents/ComponentView.java +++ b/GameEngine/src/main/java/gameEngine/entites/gameComponents/ComponentView.java @@ -1,20 +1,19 @@ package gameEngine.entites.gameComponents; -import gameEngine.entites.Entity; import gameEngine.entites.GameObject; import gameEngine.views.Sprite; import org.joml.Vector3f; public class ComponentView extends Draggable{ - private Sprite sprite; + private final Sprite sprite; public GameObject.Connectiontype connectionType; - private PortView portviewA; + private final PortView portview; public ComponentView(GameObject parent, GameObject.Connectiontype connectionType){ this.parent = parent; this.sprite = new Sprite("GameEngine/resources/ComponentView.png"); sprite.updateSpriteDimensions(); - portviewA = new PortView(PortView.PortType.OUT, parent); + portview = new PortView(PortView.PortType.OUT, parent); this.connectionType = connectionType; } @@ -31,8 +30,8 @@ sprite.setScale(parent.transform.scale); sprite.update(); Vector3f pos = new Vector3f(parent.transform.position.x+82,parent.transform.position.y+4,parent.transform.position.z); - portviewA.update(pos, parent.transform.rotation, parent.transform.scale); - portviewA.handleDragging(); + portview.update(pos, parent.transform.rotation, parent.transform.scale); + portview.handleDragging(); } @Override diff --git a/GameEngine/src/main/java/gameEngine/entites/gameComponents/Connection.java b/GameEngine/src/main/java/gameEngine/entites/gameComponents/Connection.java index 7144b2e..511e943 100644 --- a/GameEngine/src/main/java/gameEngine/entites/gameComponents/Connection.java +++ b/GameEngine/src/main/java/gameEngine/entites/gameComponents/Connection.java @@ -1,23 +1,22 @@ package gameEngine.entites.gameComponents; -import gameEngine.views.Color; import gameEngine.views.Sprite; import org.joml.Vector3f; public class Connection { - private PortView inPort; - private PortView outPort; - private Sprite lineSprite; + private final PortView portA; + private final PortView portB; + private final Sprite lineSprite; public Connection(PortView inPort, PortView outPort) { - this.inPort = inPort; - this.outPort = outPort; + this.portA = inPort; + this.portB = outPort; this.lineSprite = new Sprite("GameEngine/resources/Line.png"); } public void render() { - Vector3f posA = inPort.getPosition(); - Vector3f posB = outPort.getPosition(); + Vector3f posA = portA.getPosition(); + Vector3f posB = portB.getPosition(); Vector3f linePosition = calculatePosition(posA, posB); float lineLength = calculateDistance(posA, posB); @@ -48,4 +47,12 @@ public boolean isClicked(float mouseX, float mouseY) { return lineSprite.isMouseOver(mouseX, mouseY); } + + public PortView getPortA() { + return portA; + } + + public PortView getPortB() { + return portB; + } } diff --git a/GameEngine/src/main/java/gameEngine/entites/gameComponents/PortView.java b/GameEngine/src/main/java/gameEngine/entites/gameComponents/PortView.java index efc6873..747a4b2 100644 --- a/GameEngine/src/main/java/gameEngine/entites/gameComponents/PortView.java +++ b/GameEngine/src/main/java/gameEngine/entites/gameComponents/PortView.java @@ -10,24 +10,26 @@ import gameEngine.views.Window; import org.joml.Vector3f; +import java.util.ArrayList; +import java.util.List; + public class PortView { - enum PortType {OUT, IN} - private PortType portType; - private ConnectionManager connectionManager; + public enum PortType {OUT, IN} + private final PortType portType; private Sprite sprite; private Vector3f position = new Vector3f(0,0,0); private GameObject parent; + private List connectedPorts = new ArrayList<>(); public PortView(PortType portType, GameObject parent){ this.parent = parent; - EditorScene editorScene = (EditorScene) Window.get().getScene(); - this.connectionManager = editorScene.connectionManager; if(portType == PortType.IN){ this.sprite = new Sprite("GameEngine/resources/InPort.png"); } else if(portType == PortType.OUT){ this.sprite = new Sprite("GameEngine/resources/OutPort.png"); } this.portType = portType; + assert sprite != null; sprite.updateSpriteDimensions(); } @@ -44,11 +46,13 @@ float mouseY = MouseInput.getY(); if (Input.GetMouseButtonDown(0) && isMouseOver(mouseX, mouseY)) { - connectionManager.handlePortPress(this); + EditorScene editorScene = (EditorScene) Window.get().getScene(); + editorScene.connectionManager.handlePortPress(this); } if (Input.GetMouseButtonUp(0) && isMouseOver(mouseX, mouseY)) { - connectionManager.handlePortRelease(this); + EditorScene editorScene = (EditorScene) Window.get().getScene(); + editorScene.connectionManager.handlePortRelease(this); } } @@ -66,8 +70,22 @@ public PortType getPortType(){ return portType; } - public Entity getParent() { + public GameObject getParent() { return parent; } + public void addConnectedPort(PortView portView) { + if (!connectedPorts.contains(portView)) { + connectedPorts.add(portView); + } + } + + public boolean isConnectedTo(PortView portView) { + return connectedPorts.contains(portView); + } + + public void removeConnectedPort(PortView portView) { + connectedPorts.remove(portView); + } + } \ No newline at end of file diff --git a/GameEngine/src/main/java/gameEngine/scenes/EditorScene.java b/GameEngine/src/main/java/gameEngine/scenes/EditorScene.java index dc86adc..8b1006d 100644 --- a/GameEngine/src/main/java/gameEngine/scenes/EditorScene.java +++ b/GameEngine/src/main/java/gameEngine/scenes/EditorScene.java @@ -8,7 +8,6 @@ import gameEngine.entites.gameComponents.Draggable; import gameEngine.entites.gameComponents.EntityView; import gameEngine.entites.gameComponents.TextMesh; -import gameEngine.views.Color; import gameEngine.views.Window; import org.joml.Vector3f; @@ -37,8 +36,7 @@ connectionManager.update(); for (Entity entity : editorEntities.values()) { - if (entity instanceof GameObject) { - GameObject gameObject = (GameObject) entity; + if (entity instanceof GameObject gameObject) { gameObject.updateComponents(); } } @@ -55,7 +53,6 @@ editorEntities.remove(eid); } - private GameObject createGameObject(){ int entitiesLength = editorEntities.size(); String newId = Integer.toString(entitiesLength); @@ -64,9 +61,8 @@ return gameObject; } - public Runnable addNewEntity() { + public void addNewEntity() { enqueueTask(this::addEntityView); - return null; } private void addEntityView(){ @@ -77,9 +73,8 @@ object.getComponent(TextMesh.class).setLocalPosition(new Vector3f(0,-20,0)); } - public Runnable addNewMeshComponent() { + public void addNewMeshComponent() { enqueueTask(this::addMeshComponentView); - return null; } private void addMeshComponentView(){ @@ -90,9 +85,8 @@ object.getComponent(TextMesh.class).setLocalPosition(new Vector3f(10,2,0)); } - public Runnable addNewMoveImageComponent() { + public void addNewMoveImageComponent() { enqueueTask(this::addMoveImageComponentView); - return null; } private void addMoveImageComponentView(){