package gameEngine.entites.editorComponents;
import gameEngine.entites.EditorEntity;
import gameEngine.geometry.Transform;
import gameEngine.scenes.EditorScene;
import gameEngine.views.Sprite;
import gameEngine.views.Text;
import gameEngine.views.Window;
import org.joml.Vector3f;
import java.util.ArrayList;
import java.util.List;
public class EntityView extends Draggable{
private Sprite sprite;
private Text text;
private PortView portviewA;
public EntityView(EditorEntity parent) {
this.parent = parent;
this.sprite = new Sprite(Window.resourcePath + "EntityView.png");
this.text = new Text(parent.screenTransform.position.x, parent.screenTransform.position.y, "Entity", 14);
sprite.updateSpriteDimensions();
portviewA = new PortView(PortView.PortType.IN, parent);
}
@Override
public void init() {
sprite.update();
sprite.updateSpriteDimensions();
}
@Override
public void update() {
Transform transform = parent.transform;
Transform screenTransform = parent.screenTransform;
if(Window.get().getScene() instanceof EditorScene) {
Vector3f cameraPosition = Window.get().getScene().getCamera().getPosition();
Vector3f actualPosition = new Vector3f(screenTransform.position).sub(cameraPosition);
sprite.setPosition(actualPosition);
sprite.setRotation(transform.rotation);
sprite.setScale(transform.scale);
sprite.update();
text.setPosition(new Vector3f(0,-16,0).add(actualPosition));
text.setRotation(transform.rotation);
text.setScale(transform.scale);
text.update();
Vector3f adjustedPos = new Vector3f(actualPosition.x - 30, actualPosition.y + 8, actualPosition.z);
portviewA.update(adjustedPos, transform.rotation, transform.scale);
portviewA.handleDragging();
}
}
@Override
public EditorComponent copy() {
return this;
}
@Override
protected boolean isMouseOver(float mouseX, float mouseY) {
return sprite.isMouseOver(mouseX, mouseY);
}
@Override
protected void leftDragStartAction(float mouseX, float mouseY) {
Vector3f cameraPosition = Window.get().getScene().getCamera().getPosition();
float worldMouseX = mouseX + cameraPosition.x;
float worldMouseY = mouseY + cameraPosition.y;
dragOffsetX = worldMouseX - parent.transform.position.x;
dragOffsetY = worldMouseY - parent.transform.position.y;
}
@Override
protected void leftDraggingAction(float mouseX, float mouseY) {
Vector3f cameraPosition = Window.get().getScene().getCamera().getPosition();
float worldMouseX = mouseX + cameraPosition.x;
float worldMouseY = mouseY + cameraPosition.y;
float targetX = worldMouseX - dragOffsetX;
float targetY = worldMouseY - dragOffsetY;
parent.transform.setPosition(
targetX,
targetY,
parent.transform.position.z
);
parent.screenTransform.setPosition(
parent.transform.position.x - cameraPosition.x,
parent.transform.position.y - cameraPosition.y,
parent.transform.position.z - - cameraPosition.z
);
}
@Override
protected void rightDragStartAction(float mouseX, float mouseY) {
Vector3f cameraPosition = Window.get().getScene().getCamera().getPosition();
float worldMouseX = mouseX + cameraPosition.x;
float worldMouseY = mouseY + cameraPosition.y;
dragOffsetX = worldMouseX - parent.transform.position.x;
dragOffsetY = worldMouseY - parent.transform.position.y;
}
@Override
protected void rightDraggingAction(float mouseX, float mouseY) {
Vector3f cameraPosition = Window.get().getScene().getCamera().getPosition();
float worldMouseX = mouseX + cameraPosition.x;
float worldMouseY = mouseY + cameraPosition.y;
float targetX = worldMouseX - dragOffsetX;
float targetY = worldMouseY - dragOffsetY;
float deltaX = targetX - parent.transform.position.x;
float deltaY = targetY - parent.transform.position.y;
parent.transform.setPosition(
targetX,
targetY,
parent.transform.position.z
);
parent.screenTransform.setPosition(
parent.transform.position.x - cameraPosition.x,
parent.transform.position.y - cameraPosition.y,
parent.transform.position.z - cameraPosition.z
);
List<ComponentView> connectedComponents = getConnectedComponentViews();
for (ComponentView component : connectedComponents) {
EditorEntity componentParent = component.parent;
componentParent.transform.setPosition(
componentParent.transform.position.x + deltaX,
componentParent.transform.position.y + deltaY,
componentParent.transform.position.z
);
componentParent.screenTransform.setPosition(
componentParent.transform.position.x - cameraPosition.x,
componentParent.transform.position.y - cameraPosition.y,
componentParent.transform.position.z - cameraPosition.z
);
}
}
public PortView getPortView() {
return portviewA;
}
public List<ComponentView> getConnectedComponentViews() {
List<ComponentView> connectedComponentViews = new ArrayList<>();
for (PortView connectedPort : portviewA.getConnectedPorts()) {
EditorEntity parentEntity = connectedPort.getParent();
if (parentEntity != null) {
for (EditorComponent component : parentEntity.editorComponents) {
if (component instanceof ComponentView) {
connectedComponentViews.add((ComponentView) component);
}
}
}
}
return connectedComponentViews;
}
}