From f54c669e89fadd0bdd736e5f1feccc78cc6cbed8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jaakko=20Kera=CC=88nen?= Date: Sat, 16 Feb 2019 11:34:18 +0200 Subject: [PATCH] Fixed|Input: Controls menu does not wait for axis movement When making axis bindings, check the position relative to the axis position at the beginning. IssueID #2307 --- .../apps/client/include/ui/axisinputcontrol.h | 3 ++ .../apps/client/src/ui/axisinputcontrol.cpp | 15 ++++++-- doomsday/apps/client/src/ui/inputsystem.cpp | 35 ++++++++++++++----- 3 files changed, 42 insertions(+), 11 deletions(-) diff --git a/doomsday/apps/client/include/ui/axisinputcontrol.h b/doomsday/apps/client/include/ui/axisinputcontrol.h index c57ed1fa31..bfd143e5c7 100644 --- a/doomsday/apps/client/include/ui/axisinputcontrol.h +++ b/doomsday/apps/client/include/ui/axisinputcontrol.h @@ -62,6 +62,9 @@ class AxisInputControl : public InputDevice::Control de::ddouble position() const; void setPosition(de::ddouble newPosition); + void markPosition(); + de::ddouble markedPosition() const; + /** * Update the position of the axis control from a "real" position. * diff --git a/doomsday/apps/client/src/ui/axisinputcontrol.cpp b/doomsday/apps/client/src/ui/axisinputcontrol.cpp index c9c4fe7f09..492a1806c2 100644 --- a/doomsday/apps/client/src/ui/axisinputcontrol.cpp +++ b/doomsday/apps/client/src/ui/axisinputcontrol.cpp @@ -35,8 +35,9 @@ DENG2_PIMPL_NOREF(AxisInputControl) Type type = Pointer; dint flags = 0; - ddouble position = 0; ///< Current translated position (-1..1) including any filtering. - ddouble realPosition = 0; ///< The actual latest position (-1..1). + ddouble position = 0; ///< Current translated position (-1..1) including any filtering. + ddouble realPosition = 0; ///< The actual latest position (-1..1). + ddouble markedPosition = 0; dfloat offset = 0; ///< Offset to add to real input value. dfloat scale = 1; ///< Scaling factor for real input values. @@ -185,6 +186,16 @@ void AxisInputControl::setPosition(ddouble newPosition) d->position = newPosition; } +void AxisInputControl::markPosition() +{ + d->markedPosition = d->position; +} + +ddouble AxisInputControl::markedPosition() const +{ + return d->markedPosition; +} + void AxisInputControl::applyRealPosition(dfloat pos) { DENG2_GUARD(this); diff --git a/doomsday/apps/client/src/ui/inputsystem.cpp b/doomsday/apps/client/src/ui/inputsystem.cpp index c4fae7e479..0e9fbc6806 100644 --- a/doomsday/apps/client/src/ui/inputsystem.cpp +++ b/doomsday/apps/client/src/ui/inputsystem.cpp @@ -414,10 +414,11 @@ DENG2_PIMPL(InputSystem) // enough for an echo. if (ev.type == E_AXIS) { - InputDevice const &device = self().device(ev.device); - float const pos = device.axis(ev.axis.id).translateRealPosition(ev.axis.pos); + const InputDevice &device = self().device(ev.device); + const float pos = device.axis(ev.axis.id).translateRealPosition(ev.axis.pos); + const float markedPos = float(device.axis(ev.axis.id).markedPosition()); - if ((ev.axis.type == EAXIS_ABSOLUTE && fabs(pos) < .5f) || + if ((ev.axis.type == EAXIS_ABSOLUTE && fabs(pos - markedPos) < .5f) || (ev.axis.type == EAXIS_RELATIVE && fabs(pos) < .02f)) { return; // Not significant enough. @@ -427,10 +428,10 @@ DENG2_PIMPL(InputSystem) // Echo the event. String name = "echo-" + B_EventToString(ev); - Block const nameUtf8 = name.toUtf8(); - ddevent_t echo; de::zap(echo); - echo.device = uint(-1); - echo.type = E_SYMBOLIC; + const Block nameUtf8 = name.toUtf8(); + ddevent_t echo{}; + echo.device = -1; + echo.type = E_SYMBOLIC; echo.symbolic.id = 0; echo.symbolic.name = nameUtf8.constData(); @@ -950,8 +951,24 @@ InputSystem::InputSystem() : d(new Impl(this)) initAllDevices(); } -void InputSystem::timeChanged(Clock const &) -{} +void InputSystem::timeChanged(const Clock &) +{ + // Symbolic echo mode is used when creating input bindings interactively. + // For axis controls, we need to know the difference to whatever position + // the axis had before symbolic mode started, so here we mark the current + // position. + + if (!symbolicEchoMode) + { + for (auto *device : d->devices) + { + for (int i = 0; i < device->axisCount(); ++i) + { + device->axis(i).markPosition(); + } + } + } +} ConfigProfiles &InputSystem::settings() {