feat(input): Enhance mouse event handling with raw and scaled coordinates
This commit is contained in:
@@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user