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());
|
||||
|
||||
// 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user