diff --git a/src/java/org/lwjgl/input/ControllerEvent.java b/src/java/org/lwjgl/input/ControllerEvent.java index c0f2f9c2..926940da 100644 --- a/src/java/org/lwjgl/input/ControllerEvent.java +++ b/src/java/org/lwjgl/input/ControllerEvent.java @@ -25,24 +25,38 @@ class ControllerEvent { private boolean xaxis; /** True if this event was caused by the y axis */ private boolean yaxis; + /** The time stamp of this event */ + private long timeStamp; /** * Create a new event * * @param source The source of the event + * @param timeStamp The time stamp given for this event * @param type The type of control generating this event * @param index The index of the input that generated the event * @param xaxis True if this event was caused by the x-axis * @param yaxis True if this event was caused by the y-axis */ - public ControllerEvent(Controller source,int type,int index,boolean xaxis,boolean yaxis) { + public ControllerEvent(Controller source,long timeStamp, int type,int index,boolean xaxis,boolean yaxis) { this.source = source; + this.timeStamp = timeStamp; this.type = type; this.index = index; this.xaxis = xaxis; this.yaxis = yaxis; } + /** + * Get the time stamp given for this event. As with nanoTime() + * this value means nothing other than giving ordering + * + * @return The time stamp given for this event + */ + public long getTimeStamp() { + return timeStamp; + } + /** * Get the controller that generated this event * diff --git a/src/java/org/lwjgl/input/Controllers.java b/src/java/org/lwjgl/input/Controllers.java index d213327e..ccaa5d11 100644 --- a/src/java/org/lwjgl/input/Controllers.java +++ b/src/java/org/lwjgl/input/Controllers.java @@ -234,6 +234,15 @@ public class Controllers { return event.isPovY(); } + /** + * Get the timestamp assigned to the current event + * + * @return The timestamp assigned ot the current event + */ + public static long getEventNanoseconds() { + return event.getTimeStamp(); + } + /** * Add an event to the stack of events that have been caused * diff --git a/src/java/org/lwjgl/input/JInputController.java b/src/java/org/lwjgl/input/JInputController.java index 48d51cd2..328321f1 100644 --- a/src/java/org/lwjgl/input/JInputController.java +++ b/src/java/org/lwjgl/input/JInputController.java @@ -3,6 +3,8 @@ package org.lwjgl.input; import java.util.ArrayList; import net.java.games.input.Component; +import net.java.games.input.Event; +import net.java.games.input.EventQueue; /** * A wrapper round a JInput controller that attempts to make the interface @@ -159,68 +161,60 @@ class JInputController implements Controller { public void poll() { target.poll(); - // read buttons to update events - for (int i=0;i axesMax[i]) { - axesMax[i] = Math.abs(value); - } - - // normalize the value based on maximum value read in the past - value /= axesMax[i]; - - if (axesValue[i] != value) { + // handle axis updates + if (axes.contains(event.getComponent())) { + Component axis = event.getComponent(); + int axisIndex = axes.indexOf(axis); + float value = axis.getPollData(); + + // fixed dead zone since most axis don't report it :( + if (Math.abs(value) < deadZones[axisIndex]) { + value = 0; + } + if (Math.abs(value) < axis.getDeadZone()) { + value = 0; + } + if (Math.abs(value) > axesMax[axisIndex]) { + axesMax[axisIndex] = Math.abs(value); + } + + // normalize the value based on maximum value read in the past + value /= axesMax[axisIndex]; // fire event - Controllers.addEvent(new ControllerEvent(this,ControllerEvent.AXIS,i,i == xaxis,i == yaxis)); + Controllers.addEvent(new ControllerEvent(this,event.getNanos(),ControllerEvent.AXIS,axisIndex, + axisIndex == xaxis,axisIndex == yaxis)); + axesValue[axisIndex] = value; } - axesValue[i] = value; } } diff --git a/src/java/org/lwjgl/test/input/TestControllers.java b/src/java/org/lwjgl/test/input/TestControllers.java index 212cde2e..50023de5 100644 --- a/src/java/org/lwjgl/test/input/TestControllers.java +++ b/src/java/org/lwjgl/test/input/TestControllers.java @@ -142,6 +142,7 @@ public class TestControllers extends JPanel { while (Controllers.next()) { System.out.println("Event Fired: "); + System.out.println("\t"+Controllers.getEventNanoseconds()); System.out.println("\t"+Controllers.getEventSource()+":"+Controllers.getEventControlIndex()+":"+Controllers.isEventButton()); System.out.println("\t"+Controllers.isEventXAxis()+":"+Controllers.isEventYAxis()); }