diff --git a/.classpath b/.classpath index 7a93719..cce230b 100644 --- a/.classpath +++ b/.classpath @@ -8,5 +8,6 @@ + diff --git a/doc/license.flibitEFX b/doc/license.flibitEFX new file mode 100644 index 0000000..1242742 --- /dev/null +++ b/doc/license.flibitEFX @@ -0,0 +1,15 @@ +/* + * Copyright (C) 2011 Ethan "flibitijibibo" Lee + * + * flibitEFX is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * flibitEFX is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * You should have received a copy of the GNU Lesser General Public License + * along with flibitEFX. If not, see . + */ \ No newline at end of file diff --git a/lib/flibitEFX.jar b/lib/flibitEFX.jar new file mode 100644 index 0000000..adadd74 Binary files /dev/null and b/lib/flibitEFX.jar differ diff --git a/src/lwjake2/sound/lwjgl/Channel.java b/src/lwjake2/sound/lwjgl/Channel.java index 54f40ad..2bc2072 100644 --- a/src/lwjake2/sound/lwjgl/Channel.java +++ b/src/lwjake2/sound/lwjgl/Channel.java @@ -37,6 +37,8 @@ import java.util.Iterator; import java.util.Map; import org.lwjgl.openal.AL10; +import org.lwjgl.openal.AL11; +import org.lwjgl.openal.EFX10; /** * Channel @@ -52,7 +54,7 @@ public class Channel { private static Channel[] channels = new Channel[MAX_CHANNELS]; private static IntBuffer sources = Lib.newIntBuffer(MAX_CHANNELS); - // a reference of L:WJGLSoundImpl.buffers + // a reference of LWJGLSoundImpl.buffers private static IntBuffer buffers; private static Map looptable = new Hashtable(MAX_CHANNELS); @@ -289,7 +291,7 @@ public class Channel { //stack variable private static float[] entityOrigin = {0, 0, 0}; - static void playAllSounds(FloatBuffer listenerOrigin) { + static void playAllSounds(FloatBuffer listenerOrigin, int currentEffectIndex) { FloatBuffer sourceOrigin = sourceOriginBuffer; Channel ch; int sourceId; @@ -323,6 +325,7 @@ public class Channel { } AL10.alSourcef (sourceId, AL10.AL_ROLLOFF_FACTOR, ch.rolloff); AL10.alSource3f(sourceId, AL10.AL_POSITION, sourceOrigin.get(), sourceOrigin.get(), sourceOrigin.get()); + AL11.alSource3i(sourceId, EFX10.AL_AUXILIARY_SEND_FILTER, currentEffectIndex, 0, EFX10.AL_FILTER_NULL); AL10.alSourcePlay(sourceId); sourceOrigin.rewind(); ch.modified = false; diff --git a/src/lwjake2/sound/lwjgl/LWJGLSoundImpl.java b/src/lwjake2/sound/lwjgl/LWJGLSoundImpl.java index e2cefb8..1615d46 100644 --- a/src/lwjake2/sound/lwjgl/LWJGLSoundImpl.java +++ b/src/lwjake2/sound/lwjgl/LWJGLSoundImpl.java @@ -21,6 +21,7 @@ package lwjake2.sound.lwjgl; import lwjake2.Defines; import lwjake2.Globals; import lwjake2.game.Cmd; +import lwjake2.game.GameBase; import lwjake2.game.cvar_t; import lwjake2.game.entity_state_t; import lwjake2.qcommon.Com; @@ -41,17 +42,13 @@ import java.nio.FloatBuffer; import java.nio.IntBuffer; import java.nio.ShortBuffer; +import com.flibitijibibo.flibitEFX.EFXUnderwater; import org.lwjgl.LWJGLException; import org.lwjgl.openal.AL; import org.lwjgl.openal.AL10; import org.lwjgl.openal.ALC10; +import org.lwjgl.openal.EFX10; import org.lwjgl.openal.OpenALException; -/* -Old EAX Code. If possible, replace with EFX10 - flibit -import org.lwjgl.openal.eax.EAX; -import org.lwjgl.openal.eax.EAX20; -import org.lwjgl.openal.eax.EAXListenerProperties; -*/ /** * LWJGLSoundImpl @@ -63,15 +60,16 @@ public final class LWJGLSoundImpl implements Sound { static { S.register(new LWJGLSoundImpl()); }; - - // Replace with an EFX equivalent - flibit - // private boolean hasEAX; private cvar_t s_volume; // the last 4 buffers are used for cinematics streaming private IntBuffer buffers = Lib.newIntBuffer(MAX_SFX + STREAM_QUEUE); + /** EFX Variables */ + private int currentEffectIndex; + private EFXUnderwater underwaterEffect; + // singleton private LWJGLSoundImpl() { } @@ -84,7 +82,7 @@ public final class LWJGLSoundImpl implements Sound { try { initOpenAL(); checkError(); - // initOpenALExtensions(); <- If possible, replace with EFX10 - flibit + initOpenALExtensions(); } catch (OpenALException e) { Com.Printf(e.getMessage() + '\n'); return false; @@ -151,44 +149,18 @@ public final class LWJGLSoundImpl implements Sound { } } - /* - - This is old EAX code. If possible, replace with EFX10 - flibit - - private void initOpenALExtensions() throws OpenALException + /** Initializes OpenAL EFX effects. */ + private void initOpenALExtensions() { - if (AL10.alIsExtensionPresent("EAX2.0")) - { - try { - EAX.create(); - Com.Printf("... using EAX2.0\n"); - hasEAX=true; - } catch (LWJGLException e) { - Com.Printf("... can't create EAX2.0\n"); - hasEAX=false; - } - } - else - { - Com.Printf("... EAX2.0 not found\n"); - hasEAX=false; - } + Com.Printf("... using EFX effects:\n"); + underwaterEffect = new EFXUnderwater(); } - */ - void exitOpenAL() { - /* - - This is old EAX code. If possible, replace with EFX10 - flibit - - // Release the EAX context. - if (hasEAX){ - EAX.destroy(); - } - */ + // Unload EFX Effects + underwaterEffect.killEffect(); // Release the context and the device. AL.destroy(); @@ -287,40 +259,16 @@ public final class LWJGLSoundImpl implements Sound { // set the master volume AL10.alListenerf(AL10.AL_GAIN, s_volume.value); - /* - - This is old EAX code. If possible, replace with EFX10 - flibit - - if (hasEAX){ - if ((GameBase.gi.pointcontents.pointcontents(origin)& Defines.MASK_WATER)!= 0) { - changeEnvironment(EAX20.EAX_ENVIRONMENT_UNDERWATER); - } else { - changeEnvironment(EAX20.EAX_ENVIRONMENT_GENERIC); - } - } - - */ + // Detect EFX Conditions + if ((GameBase.gi.pointcontents.pointcontents(origin)& Defines.MASK_WATER)!= 0) + currentEffectIndex = underwaterEffect.getIndex(); + else + currentEffectIndex = EFX10.AL_EFFECTSLOT_NULL; Channel.addLoopSounds(); Channel.addPlaySounds(); - Channel.playAllSounds(listenerOrigin); + Channel.playAllSounds(listenerOrigin, currentEffectIndex); } - - /* - - This is old EAX code. If possible, replace with EFX10 - flibit - - private IntBuffer eaxEnv = Lib.newIntBuffer(1); - private int currentEnv = EAX20.EAX_ENVIRONMENT_UNDERWATER; - - private void changeEnvironment(int env) { - if (env == currentEnv) return; - currentEnv = env; - eaxEnv.put(0, currentEnv); - EAX20.eaxSet(EAX20.LISTENER_GUID, EAXListenerProperties.EAXLISTENER_ENVIRONMENT | EAXListenerProperties.EAXLISTENER_DEFERRED, 0, eaxEnv, 4); - } - - */ /* (non-Javadoc) * @see jake2.sound.SoundImpl#StopAllSounds()