feat(input): Enhance mouse event handling with raw and scaled coordinates

This commit is contained in:
extio-de
2025-12-26 18:38:16 +01:00
parent 87287ad5f7
commit eb1fc240ba
7 changed files with 76 additions and 23 deletions

View File

@@ -44,6 +44,7 @@ public class Container extends AbstractClientModule implements InitializingBean
protected final Area2 area = new Area2(MutableCoordI2.create(), MutableCoordI2.create()); 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 final Area2 normalizedArea = new Area2(MutableCoordI2.create(), MutableCoordI2.create());
protected boolean draggable; protected boolean draggable;
@@ -165,7 +166,7 @@ public class Container extends AbstractClientModule implements InitializingBean
foregroundContainer = container; foregroundContainer = container;
break; 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 // TODO z-index handling
foregroundContainer = container; foregroundContainer = container;
} }
@@ -178,12 +179,12 @@ public class Container extends AbstractClientModule implements InitializingBean
this.LOGGER.debug("Started dragging container {}", this.id); this.LOGGER.debug("Started dragging container {}", this.id);
} }
if (this.dragPrevPosition != null) { 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)) { if (!ImmutableCoordI2.zero().equals(delta)) {
this.setNormalizedPosition(this.getNormalizedPosition().add(delta)); this.setNormalizedPosition(this.getNormalizedPosition().add(delta));
} }
} }
this.dragPrevPosition = event.getCoord(); this.dragPrevPosition = event.getScaledCoord();
} }
} }
} }

View File

@@ -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.KeyStrokeEvent;
import de.extio.game_engine.renderer.model.event.MouseClickEvent; 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.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.event.MouseMoveEvent;
import de.extio.game_engine.renderer.model.options.VideoOptions; import de.extio.game_engine.renderer.model.options.VideoOptions;
import de.extio.game_engine.renderer.model.options.VideoOptions.VideoOptionsVideoMode; 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; import de.extio.game_engine.spatial2.model.ImmutableCoordI2;
public class G2DMainFrame extends Frame { public class G2DMainFrame extends Frame {
@@ -143,7 +146,9 @@ public class G2DMainFrame extends Frame {
@Override @Override
public void mouseReleased(final MouseEvent e) { public void mouseReleased(final MouseEvent e) {
try { 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) { catch (final Exception exc) {
LOGGER.warn(exc.getMessage()); LOGGER.warn(exc.getMessage());
@@ -154,7 +159,9 @@ public class G2DMainFrame extends Frame {
public void mousePressed(final MouseEvent e) { public void mousePressed(final MouseEvent e) {
try { try {
G2DMainFrame.this.requestFocus(); 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) { catch (final Exception exc) {
LOGGER.warn(exc.getMessage()); LOGGER.warn(exc.getMessage());
@@ -164,7 +171,9 @@ public class G2DMainFrame extends Frame {
@Override @Override
public void mouseExited(final MouseEvent e) { public void mouseExited(final MouseEvent e) {
try { 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) { catch (final Exception exc) {
LOGGER.warn(exc.getMessage()); LOGGER.warn(exc.getMessage());
@@ -174,7 +183,9 @@ public class G2DMainFrame extends Frame {
@Override @Override
public void mouseEntered(final MouseEvent e) { public void mouseEntered(final MouseEvent e) {
try { 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) { catch (final Exception exc) {
LOGGER.warn(exc.getMessage()); LOGGER.warn(exc.getMessage());
@@ -194,7 +205,9 @@ public class G2DMainFrame extends Frame {
final var button = this.getButton(e); final var button = this.getButton(e);
try { 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) { catch (final Exception exc) {
if ("Engine not started up yet".equals(exc.getMessage())) { if ("Engine not started up yet".equals(exc.getMessage())) {
@@ -209,7 +222,9 @@ public class G2DMainFrame extends Frame {
final var button = this.getButton(e); final var button = this.getButton(e);
try { 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) { catch (final Exception exc) {
if ("Engine not started up yet".equals(exc.getMessage())) { if ("Engine not started up yet".equals(exc.getMessage())) {
@@ -239,7 +254,9 @@ public class G2DMainFrame extends Frame {
@Override @Override
public void mouseWheelMoved(final MouseWheelEvent e) { public void mouseWheelMoved(final MouseWheelEvent e) {
try { 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) { catch (final Exception exc) {
LOGGER.warn(exc.getMessage()); LOGGER.warn(exc.getMessage());
@@ -452,4 +469,9 @@ public class G2DMainFrame extends Frame {
return result; 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));
}
} }

View File

@@ -11,8 +11,8 @@ public final class MouseClickEvent extends MouseEvent {
private int button; private int button;
public MouseClickEvent(final boolean pressed, final int modifiers, final int button, final CoordI2 coord) { public MouseClickEvent(final boolean pressed, final int modifiers, final int button, final CoordI2 rawCoord, final CoordI2 scaledCoord) {
super(coord, modifiers); super(rawCoord, scaledCoord, modifiers);
this.pressed = pressed; this.pressed = pressed;
this.button = button; this.button = button;
} }

View File

@@ -7,8 +7,8 @@ import de.extio.game_engine.spatial2.model.CoordI2;
*/ */
public final class MouseEnterEvent extends MouseEvent { public final class MouseEnterEvent extends MouseEvent {
public MouseEnterEvent(final int modifiers, final CoordI2 coord) { public MouseEnterEvent(final int modifiers, final CoordI2 rawCoord, final CoordI2 scaledCoord) {
super(coord, modifiers); super(rawCoord, scaledCoord, modifiers);
} }
} }

View File

@@ -5,21 +5,27 @@ import de.extio.game_engine.spatial2.model.CoordI2;
public abstract class MouseEvent implements Event { public abstract class MouseEvent implements Event {
private CoordI2 coord; private CoordI2 scaledCoord;
private CoordI2 rawCoord;
private int modifiers; private int modifiers;
public MouseEvent(final CoordI2 coord, final int modifiers) { public MouseEvent(final CoordI2 rawCoord, final CoordI2 scaledCoord, final int modifiers) {
this.coord = coord; this.rawCoord = rawCoord;
this.scaledCoord = scaledCoord;
this.modifiers = modifiers; 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) { public void setScaledCoord(final CoordI2 coord) {
this.coord = coord; this.scaledCoord = coord;
} }
public int getModifiers() { public int getModifiers() {
@@ -30,4 +36,14 @@ public abstract class MouseEvent implements Event {
this.modifiers = modifiers; 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;
}
} }

View File

@@ -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);
}
}

View File

@@ -11,8 +11,8 @@ public final class MouseMoveEvent extends MouseEvent {
private int button; private int button;
public MouseMoveEvent(final boolean drag, final int modifiers, final CoordI2 coord, final int button) { public MouseMoveEvent(final boolean drag, final int modifiers, final int button, final CoordI2 rawCoord, final CoordI2 scaledCoord) {
super(coord, modifiers); super(rawCoord, scaledCoord, modifiers);
this.drag = drag; this.drag = drag;
this.button = button; this.button = button;
} }