diff --git a/src/main/java/de/extio/game_engine/renderer/container/Container.java b/src/main/java/de/extio/game_engine/renderer/container/Container.java index 7248961..e7edbf4 100644 --- a/src/main/java/de/extio/game_engine/renderer/container/Container.java +++ b/src/main/java/de/extio/game_engine/renderer/container/Container.java @@ -44,6 +44,7 @@ public class Container extends AbstractClientModule implements InitializingBean protected final Area2 area = new Area2(MutableCoordI2.create(), MutableCoordI2.create()); + // Normalized area relative to reference resolution, the actual area is aligned based on alignment settings. Scale factors are not considered/handled by the renderer control. protected final Area2 normalizedArea = new Area2(MutableCoordI2.create(), MutableCoordI2.create()); protected boolean draggable; @@ -165,7 +166,7 @@ public class Container extends AbstractClientModule implements InitializingBean foregroundContainer = container; break; } - if (SpatialUtils2.intersects(container.area.getPosition(), container.area.getDimension(), event.getCoord(), ImmutableCoordI2.one())) { + if (SpatialUtils2.intersects(container.area.getPosition(), container.area.getDimension(), event.getScaledCoord(), ImmutableCoordI2.one())) { // TODO z-index handling foregroundContainer = container; } @@ -178,12 +179,12 @@ public class Container extends AbstractClientModule implements InitializingBean this.LOGGER.debug("Started dragging container {}", this.id); } if (this.dragPrevPosition != null) { - final var delta = event.getCoord().substract(this.dragPrevPosition); + final var delta = event.getScaledCoord().substract(this.dragPrevPosition); if (!ImmutableCoordI2.zero().equals(delta)) { this.setNormalizedPosition(this.getNormalizedPosition().add(delta)); } } - this.dragPrevPosition = event.getCoord(); + this.dragPrevPosition = event.getScaledCoord(); } } } diff --git a/src/main/java/de/extio/game_engine/renderer/g2d/G2DMainFrame.java b/src/main/java/de/extio/game_engine/renderer/g2d/G2DMainFrame.java index 58e4a31..c104e2c 100644 --- a/src/main/java/de/extio/game_engine/renderer/g2d/G2DMainFrame.java +++ b/src/main/java/de/extio/game_engine/renderer/g2d/G2DMainFrame.java @@ -38,9 +38,12 @@ import de.extio.game_engine.renderer.g2d.control.G2DControlHasExclusiveKeyEvent; import de.extio.game_engine.renderer.model.event.KeyStrokeEvent; import de.extio.game_engine.renderer.model.event.MouseClickEvent; import de.extio.game_engine.renderer.model.event.MouseEnterEvent; +import de.extio.game_engine.renderer.model.event.MouseExitEvent; +import de.extio.game_engine.renderer.model.event.MouseExitEvent; import de.extio.game_engine.renderer.model.event.MouseMoveEvent; import de.extio.game_engine.renderer.model.options.VideoOptions; import de.extio.game_engine.renderer.model.options.VideoOptions.VideoOptionsVideoMode; +import de.extio.game_engine.spatial2.model.CoordI2; import de.extio.game_engine.spatial2.model.ImmutableCoordI2; public class G2DMainFrame extends Frame { @@ -143,7 +146,9 @@ public class G2DMainFrame extends Frame { @Override public void mouseReleased(final MouseEvent e) { try { - G2DMainFrame.this.rendererData.getEventService().fire(new MouseClickEvent(false, G2DMainFrame.getModifiers(e), e.getButton(), ImmutableCoordI2.create(e.getX(), e.getY()))); + final var rawCoord = ImmutableCoordI2.create(e.getX(), e.getY()); + final var scaleCoord = G2DMainFrame.this.scaleCoord(rawCoord); + G2DMainFrame.this.rendererData.getEventService().fire(new MouseClickEvent(false, G2DMainFrame.getModifiers(e), e.getButton(), rawCoord, scaleCoord)); } catch (final Exception exc) { LOGGER.warn(exc.getMessage()); @@ -154,7 +159,9 @@ public class G2DMainFrame extends Frame { public void mousePressed(final MouseEvent e) { try { G2DMainFrame.this.requestFocus(); - G2DMainFrame.this.rendererData.getEventService().fire(new MouseClickEvent(true, G2DMainFrame.getModifiers(e), e.getButton(), ImmutableCoordI2.create(e.getX(), e.getY()))); + final var rawCoord = ImmutableCoordI2.create(e.getX(), e.getY()); + final var scaleCoord = G2DMainFrame.this.scaleCoord(rawCoord); + G2DMainFrame.this.rendererData.getEventService().fire(new MouseClickEvent(true, G2DMainFrame.getModifiers(e), e.getButton(), rawCoord, scaleCoord)); } catch (final Exception exc) { LOGGER.warn(exc.getMessage()); @@ -164,7 +171,9 @@ public class G2DMainFrame extends Frame { @Override public void mouseExited(final MouseEvent e) { try { - G2DMainFrame.this.rendererData.getEventService().fire(new MouseMoveEvent(false, G2DMainFrame.getModifiers(e), null, 0)); + final var rawCoord = ImmutableCoordI2.create(e.getX(), e.getY()); + final var scaleCoord = G2DMainFrame.this.scaleCoord(rawCoord); + G2DMainFrame.this.rendererData.getEventService().fire(new MouseExitEvent(G2DMainFrame.getModifiers(e), rawCoord, scaleCoord)); } catch (final Exception exc) { LOGGER.warn(exc.getMessage()); @@ -174,7 +183,9 @@ public class G2DMainFrame extends Frame { @Override public void mouseEntered(final MouseEvent e) { try { - G2DMainFrame.this.rendererData.getEventService().fire(new MouseEnterEvent(G2DMainFrame.getModifiers(e), ImmutableCoordI2.create(e.getX(), e.getY()))); + final var rawCoord = ImmutableCoordI2.create(e.getX(), e.getY()); + final var scaleCoord = G2DMainFrame.this.scaleCoord(rawCoord); + G2DMainFrame.this.rendererData.getEventService().fire(new MouseEnterEvent(G2DMainFrame.getModifiers(e), rawCoord, scaleCoord)); } catch (final Exception exc) { LOGGER.warn(exc.getMessage()); @@ -194,7 +205,9 @@ public class G2DMainFrame extends Frame { final var button = this.getButton(e); try { - G2DMainFrame.this.rendererData.getEventService().fire(new MouseMoveEvent(false, G2DMainFrame.getModifiers(e), ImmutableCoordI2.create(e.getX(), e.getY()), button)); + final var rawCoord = ImmutableCoordI2.create(e.getX(), e.getY()); + final var scaleCoord = G2DMainFrame.this.scaleCoord(rawCoord); + G2DMainFrame.this.rendererData.getEventService().fire(new MouseMoveEvent(false, G2DMainFrame.getModifiers(e), button, rawCoord, scaleCoord)); } catch (final Exception exc) { if ("Engine not started up yet".equals(exc.getMessage())) { @@ -209,7 +222,9 @@ public class G2DMainFrame extends Frame { final var button = this.getButton(e); try { - G2DMainFrame.this.rendererData.getEventService().fire(new MouseMoveEvent(true, G2DMainFrame.getModifiers(e), ImmutableCoordI2.create(e.getX(), e.getY()), button)); + final var rawCoord = ImmutableCoordI2.create(e.getX(), e.getY()); + final var scaleCoord = G2DMainFrame.this.scaleCoord(rawCoord); + G2DMainFrame.this.rendererData.getEventService().fire(new MouseMoveEvent(true, G2DMainFrame.getModifiers(e), button, rawCoord, scaleCoord)); } catch (final Exception exc) { if ("Engine not started up yet".equals(exc.getMessage())) { @@ -239,7 +254,9 @@ public class G2DMainFrame extends Frame { @Override public void mouseWheelMoved(final MouseWheelEvent e) { try { - G2DMainFrame.this.rendererData.getEventService().fire(new MouseClickEvent(true, G2DMainFrame.getModifiers(e), e.getWheelRotation() == -1 ? 4 : 5, ImmutableCoordI2.create(e.getX(), e.getY()))); + final var rawCoord = ImmutableCoordI2.create(e.getX(), e.getY()); + final var scaleCoord = G2DMainFrame.this.scaleCoord(rawCoord); + G2DMainFrame.this.rendererData.getEventService().fire(new MouseClickEvent(true, G2DMainFrame.getModifiers(e), e.getWheelRotation() == -1 ? 4 : 5, rawCoord, scaleCoord)); } catch (final Exception exc) { LOGGER.warn(exc.getMessage()); @@ -452,4 +469,9 @@ public class G2DMainFrame extends Frame { return result; } + + private CoordI2 scaleCoord(final CoordI2 rawCoord) { + final var scaleFactor = ((G2DRendererControl) this.rendererData.getRendererControl()).getScaleFactor(); + return ImmutableCoordI2.create((int) (rawCoord.getX() / scaleFactor), (int) (rawCoord.getY() / scaleFactor)); + } } diff --git a/src/main/java/de/extio/game_engine/renderer/model/event/MouseClickEvent.java b/src/main/java/de/extio/game_engine/renderer/model/event/MouseClickEvent.java index 9fb9755..6e9e8f0 100644 --- a/src/main/java/de/extio/game_engine/renderer/model/event/MouseClickEvent.java +++ b/src/main/java/de/extio/game_engine/renderer/model/event/MouseClickEvent.java @@ -11,8 +11,8 @@ public final class MouseClickEvent extends MouseEvent { private int button; - public MouseClickEvent(final boolean pressed, final int modifiers, final int button, final CoordI2 coord) { - super(coord, modifiers); + public MouseClickEvent(final boolean pressed, final int modifiers, final int button, final CoordI2 rawCoord, final CoordI2 scaledCoord) { + super(rawCoord, scaledCoord, modifiers); this.pressed = pressed; this.button = button; } diff --git a/src/main/java/de/extio/game_engine/renderer/model/event/MouseEnterEvent.java b/src/main/java/de/extio/game_engine/renderer/model/event/MouseEnterEvent.java index 5ce3239..76d943e 100644 --- a/src/main/java/de/extio/game_engine/renderer/model/event/MouseEnterEvent.java +++ b/src/main/java/de/extio/game_engine/renderer/model/event/MouseEnterEvent.java @@ -7,8 +7,8 @@ import de.extio.game_engine.spatial2.model.CoordI2; */ public final class MouseEnterEvent extends MouseEvent { - public MouseEnterEvent(final int modifiers, final CoordI2 coord) { - super(coord, modifiers); + public MouseEnterEvent(final int modifiers, final CoordI2 rawCoord, final CoordI2 scaledCoord) { + super(rawCoord, scaledCoord, modifiers); } } diff --git a/src/main/java/de/extio/game_engine/renderer/model/event/MouseEvent.java b/src/main/java/de/extio/game_engine/renderer/model/event/MouseEvent.java index 870709c..06ab7f8 100644 --- a/src/main/java/de/extio/game_engine/renderer/model/event/MouseEvent.java +++ b/src/main/java/de/extio/game_engine/renderer/model/event/MouseEvent.java @@ -5,21 +5,27 @@ import de.extio.game_engine.spatial2.model.CoordI2; public abstract class MouseEvent implements Event { - private CoordI2 coord; + private CoordI2 scaledCoord; + + private CoordI2 rawCoord; private int modifiers; - public MouseEvent(final CoordI2 coord, final int modifiers) { - this.coord = coord; + public MouseEvent(final CoordI2 rawCoord, final CoordI2 scaledCoord, final int modifiers) { + this.rawCoord = rawCoord; + this.scaledCoord = scaledCoord; this.modifiers = modifiers; } - public CoordI2 getCoord() { - return this.coord; + /** + * Coordinate of mouse event, normalized/scaled according to current viewport + */ + public CoordI2 getScaledCoord() { + return this.scaledCoord; } - public void setCoord(final CoordI2 coord) { - this.coord = coord; + public void setScaledCoord(final CoordI2 coord) { + this.scaledCoord = coord; } public int getModifiers() { @@ -30,4 +36,14 @@ public abstract class MouseEvent implements Event { this.modifiers = modifiers; } + /** + * Raw, absolute coordinate of mouse event, without any scaling applied + */ + public CoordI2 getRawCoord() { + return rawCoord; + } + + public void setRawCoord(final CoordI2 rawCoord) { + this.rawCoord = rawCoord; + } } diff --git a/src/main/java/de/extio/game_engine/renderer/model/event/MouseExitEvent.java b/src/main/java/de/extio/game_engine/renderer/model/event/MouseExitEvent.java new file mode 100644 index 0000000..09d6fa7 --- /dev/null +++ b/src/main/java/de/extio/game_engine/renderer/model/event/MouseExitEvent.java @@ -0,0 +1,14 @@ +package de.extio.game_engine.renderer.model.event; + +import de.extio.game_engine.spatial2.model.CoordI2; + +/** + * Message sent by game client engine when mouse enters viewport + */ +public final class MouseExitEvent extends MouseEvent { + + public MouseExitEvent(final int modifiers, final CoordI2 rawCoord, final CoordI2 scaledCoord) { + super(rawCoord, scaledCoord, modifiers); + } + +} diff --git a/src/main/java/de/extio/game_engine/renderer/model/event/MouseMoveEvent.java b/src/main/java/de/extio/game_engine/renderer/model/event/MouseMoveEvent.java index b04fd39..6d4e269 100644 --- a/src/main/java/de/extio/game_engine/renderer/model/event/MouseMoveEvent.java +++ b/src/main/java/de/extio/game_engine/renderer/model/event/MouseMoveEvent.java @@ -11,8 +11,8 @@ public final class MouseMoveEvent extends MouseEvent { private int button; - public MouseMoveEvent(final boolean drag, final int modifiers, final CoordI2 coord, final int button) { - super(coord, modifiers); + public MouseMoveEvent(final boolean drag, final int modifiers, final int button, final CoordI2 rawCoord, final CoordI2 scaledCoord) { + super(rawCoord, scaledCoord, modifiers); this.drag = drag; this.button = button; }