Skip to content

Commit 6035afb

Browse files
committed
better rumble
1 parent a2dfcf2 commit 6035afb

3 files changed

Lines changed: 48 additions & 12 deletions

File tree

jme3-ios-examples/src/main/java/jme3test/ios/IosTestChooserLauncher.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,7 @@ private static void invokeSetShowSettings(Application application) {
191191
private static void configureIosSettings(Application application) {
192192
AppSettings settings = new AppSettings(true);
193193
settings.setUseJoysticks(true);
194+
settings.setOnDeviceJoystickRumble(true);
194195
application.setSettings(settings);
195196
}
196197

jme3-ios/src/main/java/com/jme3/input/ios/IosJoyInput.java

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -121,17 +121,26 @@ public long getInputTimeNanos() {
121121
}
122122

123123
@Override
124-
public void setJoyRumble(int joyId, float amount) {
124+
public void setJoyRumble(int joyId, float amountHigh, float amountLow, float duration) {
125125
if (onDeviceJoystickRumble && JmeSystem.isDeviceRumbleSupported()) {
126-
JmeSystem.setDeviceRumble(amount);
126+
JmeSystem.rumble(amountHigh, amountLow, duration);
127127
return;
128128
}
129-
float rumble = FastMath.clamp(amount, 0f, 1f);
130-
int amplitude = (int) (rumble * 0xffff);
129+
131130
IosJoystick joystick = joysticks.get(joyId);
132131
if (joystick != null) {
133-
joystick.rumble(amplitude, amplitude, 100);
132+
joystick.rumble(toRumbleAmplitude(amountLow), toRumbleAmplitude(amountHigh),
133+
toRumbleDurationMillis(duration));
134+
}
135+
}
136+
137+
@Override
138+
public void stopJoyRumble(int joyId) {
139+
if (onDeviceJoystickRumble && JmeSystem.isDeviceRumbleSupported()) {
140+
JmeSystem.stopRumble();
141+
return;
134142
}
143+
setJoyRumble(joyId, 0f, 0f, 0f);
135144
}
136145

137146
public void loadSettings(AppSettings settings) {
@@ -275,6 +284,19 @@ private static String displayName(String sdlName, String fallback, int id) {
275284
return sdlName;
276285
}
277286

287+
private static int toRumbleAmplitude(float amount) {
288+
return (int) (FastMath.clamp(amount, 0f, 1f) * 0xffff);
289+
}
290+
291+
private static int toRumbleDurationMillis(float duration) {
292+
if (duration == Float.POSITIVE_INFINITY) {
293+
return 21 * 24 * 60 * 60 * 1000;
294+
} else if (duration <= 0f) {
295+
return 0;
296+
}
297+
return Math.max(1, (int) (duration * 1000f));
298+
}
299+
278300
private static final class IosJoystick extends AbstractJoystick {
279301
private final Map<Integer, JoystickAxis> axes = new HashMap<>();
280302
private final Map<Integer, JoystickButton> buttons = new HashMap<>();

jme3-ios/src/main/java/com/jme3/system/ios/JmeIosSystem.java

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -31,17 +31,17 @@
3131
*/
3232
package com.jme3.system.ios;
3333

34+
import com.jme3.audio.AudioRenderer;
35+
import com.jme3.audio.ios.IosAL;
36+
import com.jme3.audio.ios.IosALC;
37+
import com.jme3.audio.ios.IosEFX;
38+
import com.jme3.audio.openal.ALAudioRenderer;
3439
import com.jme3.system.AppSettings;
3540
import com.jme3.system.JmeContext;
3641
import com.jme3.system.JmeSystemDelegate;
3742
import com.jme3.system.NullContext;
3843
import com.jme3.system.Platform;
3944
import com.jme3.util.res.Resources;
40-
import com.jme3.audio.AudioRenderer;
41-
import com.jme3.audio.ios.IosAL;
42-
import com.jme3.audio.ios.IosALC;
43-
import com.jme3.audio.ios.IosEFX;
44-
import com.jme3.audio.openal.ALAudioRenderer;
4545
import java.io.IOException;
4646
import java.io.OutputStream;
4747
import java.net.URL;
@@ -145,9 +145,22 @@ public boolean isDeviceRumbleSupported() {
145145
}
146146

147147
@Override
148-
public void setDeviceRumble(float amount) {
148+
public void rumble(float amountHigh, float amountLow, float duration) {
149+
if (duration <= 0f) {
150+
stopRumble();
151+
return;
152+
}
153+
try {
154+
LibJGLIOSDeviceBridge.rumble(amountHigh, amountLow, duration);
155+
} catch (UnsatisfiedLinkError | NoClassDefFoundError ignored) {
156+
// Desktop/unit-test runs may load this delegate without the iOS launcher.
157+
}
158+
}
159+
160+
@Override
161+
public void stopRumble() {
149162
try {
150-
LibJGLIOSDeviceBridge.setRumble(amount);
163+
LibJGLIOSDeviceBridge.stopRumble();
151164
} catch (UnsatisfiedLinkError | NoClassDefFoundError ignored) {
152165
// Desktop/unit-test runs may load this delegate without the iOS launcher.
153166
}

0 commit comments

Comments
 (0)