From 2dca1a2732fabf33c12b6d0f8bcaaf70596fc58d Mon Sep 17 00:00:00 2001 From: Kirill Vainer Date: Sun, 10 Apr 2016 23:24:19 -0400 Subject: [PATCH] add AudioListenerState --- .../java/com/jme3/app/SimpleApplication.java | 3 +- .../com/jme3/audio/AudioListenerState.java | 104 ++++++++++++++++++ .../main/java/com/jme3/audio/Listener.java | 6 +- 3 files changed, 109 insertions(+), 4 deletions(-) create mode 100644 jme3-core/src/main/java/com/jme3/audio/AudioListenerState.java diff --git a/jme3-core/src/main/java/com/jme3/app/SimpleApplication.java b/jme3-core/src/main/java/com/jme3/app/SimpleApplication.java index 2ab008c5c..01c04601c 100644 --- a/jme3-core/src/main/java/com/jme3/app/SimpleApplication.java +++ b/jme3-core/src/main/java/com/jme3/app/SimpleApplication.java @@ -32,6 +32,7 @@ package com.jme3.app; import com.jme3.app.state.AppState; +import com.jme3.audio.AudioListenerState; import com.jme3.font.BitmapFont; import com.jme3.font.BitmapText; import com.jme3.input.FlyByCamera; @@ -96,7 +97,7 @@ public abstract class SimpleApplication extends LegacyApplication { } public SimpleApplication() { - this( new StatsAppState(), new FlyCamAppState(), new DebugKeysAppState() ); + this(new StatsAppState(), new FlyCamAppState(), new AudioListenerState(), new DebugKeysAppState()); } public SimpleApplication( AppState... initialStates ) { diff --git a/jme3-core/src/main/java/com/jme3/audio/AudioListenerState.java b/jme3-core/src/main/java/com/jme3/audio/AudioListenerState.java new file mode 100644 index 000000000..947cb9231 --- /dev/null +++ b/jme3-core/src/main/java/com/jme3/audio/AudioListenerState.java @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2009-2016 jMonkeyEngine + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'jMonkeyEngine' nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package com.jme3.audio; + +import com.jme3.app.Application; +import com.jme3.app.state.BaseAppState; +import com.jme3.math.Quaternion; +import com.jme3.math.Vector3f; +import com.jme3.renderer.Camera; +import com.jme3.renderer.RenderManager; + +/** + * AudioListenerState updates the audio listener's position, + * orientation, and velocity from a {@link Camera}. + * + * @author Kirill Vainer + */ +public class AudioListenerState extends BaseAppState { + + private Listener listener; + private Camera camera; + private float lastTpf; + + public AudioListenerState() { + } + + @Override + protected void initialize(Application app) { + this.camera = app.getCamera(); + this.listener = app.getListener(); + } + + @Override + protected void cleanup(Application app) { + } + + @Override + public void update(float tpf) { + lastTpf = tpf; + } + + @Override + public void render(RenderManager rm) { + if (!isEnabled()) { + return; + } + + Vector3f lastLocation = listener.getLocation(); + Vector3f currentLocation = camera.getLocation(); + Vector3f velocity = listener.getVelocity(); + + if (!lastLocation.equals(currentLocation)) { + velocity.set(currentLocation).subtractLocal(lastLocation); + velocity.multLocal(1f / lastTpf); + listener.setLocation(currentLocation); + listener.setVelocity(velocity); + } else if (!velocity.equals(Vector3f.ZERO)) { + listener.setVelocity(Vector3f.ZERO); + } + + Quaternion lastRotation = listener.getRotation(); + Quaternion currentRotation = camera.getRotation(); + if (!lastRotation.equals(currentRotation)) { + listener.setRotation(currentRotation); + } + } + + @Override + protected void onEnable() { + } + + @Override + protected void onDisable() { + } +} diff --git a/jme3-core/src/main/java/com/jme3/audio/Listener.java b/jme3-core/src/main/java/com/jme3/audio/Listener.java index 8e59eac0c..afd08a730 100644 --- a/jme3-core/src/main/java/com/jme3/audio/Listener.java +++ b/jme3-core/src/main/java/com/jme3/audio/Listener.java @@ -36,9 +36,9 @@ import com.jme3.math.Vector3f; public class Listener { - private Vector3f location; - private Vector3f velocity; - private Quaternion rotation; + private final Vector3f location; + private final Vector3f velocity; + private final Quaternion rotation; private float volume = 1; private AudioRenderer renderer;