Project::OSiRiON - Git repositories
Project::OSiRiON
News . About . Screenshots . Downloads . Forum . Wiki . Tracker . Git
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStijn Buys <ingar@osirion.org>2013-11-23 14:02:14 +0000
committerStijn Buys <ingar@osirion.org>2013-11-23 14:02:14 +0000
commit93bb759aeb71537a98386693918b28b37961a103 (patch)
tree350a6b2eda28b9649ce4a8dcab5aa4b8eca97bee /src/client
parent7afa635b4728e504ca6ec3bf64223efe0f991f67 (diff)
Support for EntityDynamic explosion sounds, minor SoundExt cleanups.
Diffstat (limited to 'src/client')
-rw-r--r--src/client/soundext.cc59
-rw-r--r--src/client/soundext.h2
-rw-r--r--src/client/targets.cc2
3 files changed, 56 insertions, 7 deletions
diff --git a/src/client/soundext.cc b/src/client/soundext.cc
index 397a420..09c83d8 100644
--- a/src/client/soundext.cc
+++ b/src/client/soundext.cc
@@ -98,6 +98,7 @@ SoundExt::SoundExt(core::Entity *entity) : core::Extension(core::Extension::Soun
state_jumpstartbuffer = 0;
state_jumpstopbuffer = 0;
state_explosionbuffer = 0;
+ state_projectilebuffer = 0;
state_engineloopbuffer = 0;
state_engineloopsource = 0;
@@ -132,20 +133,23 @@ SoundExt::SoundExt(core::Entity *entity) : core::Extension(core::Extension::Soun
state_engineloopsource = audio::Sources::get();
state_engineeventsource = audio::Sources::get();
-
+
+ } else if (entity->type() == core::Entity::Dynamic) {
+
+ state_explosionbuffer = audio::Buffers::load("fx/explosion01");
} else if (entity->type() == core::Entity::Projectile) {
core::EntityProjectile *projectile = static_cast<core::EntityProjectile *>(entity);
// if the sound name is set
if (projectile->projectile_soundname().size()) {
- state_impulsestartbuffer = audio::Buffers::load("projectiles/" + projectile->projectile_soundname());
+ state_projectilebuffer = audio::Buffers::load("projectiles/" + projectile->projectile_soundname());
// if the sound file was loaded
- if (state_impulsestartbuffer) {
+ if (state_projectilebuffer) {
state_engineeventsource = audio::Sources::get();
// of the OpenAL source is available
if (state_engineeventsource) {
- audio::update_source(state_engineeventsource, entity->location(), math::Vector3f());
- audio::play(state_engineeventsource, state_impulsestartbuffer);
+ audio::update_source(state_engineeventsource, entity->location(), math::Vector3f(), 1.0f, 1.0f);
+ audio::play(state_engineeventsource, state_projectilebuffer);
}
}
}
@@ -272,7 +276,7 @@ void SoundExt::frame(float elapsed)
} else if (controlable->state() == core::Entity::Destroyed) {
if (state_engineloopbuffer) {
- audio::stop(state_engineloopbuffer);
+ audio::stop(state_engineloopsource);
state_engineloopbuffer = 0;
}
if (state_engineeventbuffer != state_explosionbuffer) {
@@ -311,6 +315,49 @@ void SoundExt::frame(float elapsed)
audio::update_source(state_engineeventsource,
controlable->location() - controlable->axis().forward() * r , velocity);
+
+ } else if (entity()->type() == core::Entity::Dynamic) {
+
+ core::EntityDynamic *dynamic = static_cast<core::EntityDynamic *>(this->entity());
+
+ speed = dynamic->speed();
+
+ if (snd_doppler->value()) {
+ velocity.assign(dynamic->axis().forward() * speed);
+ }
+
+ if (dynamic->state() == core::Entity::Destroyed) {
+ if (!state_engineeventsource) {
+ state_engineeventsource = audio::Sources::get();
+ }
+
+ if (state_engineeventbuffer != state_explosionbuffer) {
+ audio::update_source(state_engineeventsource,
+ dynamic->location() - dynamic->axis().forward() * r ,
+ dynamic->axis().forward() * speed);
+ // pack random explosion sound
+ if (math::randomf(100.0f) < 50.0f) {
+ state_explosionbuffer = audio::Buffers::load("fx/explosion01");
+ } else {
+ state_explosionbuffer = audio::Buffers::load("fx/explosion02");
+ }
+ state_engineeventbuffer = audio::play(state_engineeventsource, state_explosionbuffer);
+ }
+ } else {
+ if (state_engineeventbuffer) {
+ audio::stop(state_engineeventsource);
+ state_engineloopbuffer = 0;
+ }
+ if (state_engineeventsource) {
+ audio::Sources::remove(state_engineeventsource);
+ state_engineeventsource = 0;
+ }
+ }
+
+ if (state_engineeventbuffer) {
+ audio::update_source(state_engineeventsource,
+ dynamic->location() - dynamic->axis().forward() * r , velocity, 1.0f, 1.0f);
+ }
} else if (entity()->type() == core::Entity::Projectile) {
diff --git a/src/client/soundext.h b/src/client/soundext.h
index 1cadae6..6616b89 100644
--- a/src/client/soundext.h
+++ b/src/client/soundext.h
@@ -87,6 +87,8 @@ private:
size_t state_jumpstopbuffer;
/// index of the audio buffer containing the explosion sound
size_t state_explosionbuffer;
+ /// index of the audio buffer containing the projetile sound
+ size_t state_projectilebuffer;
/// index of the audio buffer currently looping in enginesource
size_t state_engineloopbuffer;
diff --git a/src/client/targets.cc b/src/client/targets.cc
index 466b4a9..a35ebe7 100644
--- a/src/client/targets.cc
+++ b/src/client/targets.cc
@@ -515,7 +515,7 @@ void frame()
core::Entity *entity = (*it);
// render entity sound
- if ((entity->type() == core::Entity::Controlable) || (entity->type() == core::Entity::Projectile) || (entity->model() && entity->model()->sounds().size())) {
+ if ((entity->type() == core::Entity::Dynamic) || (entity->type() == core::Entity::Controlable) || (entity->type() == core::Entity::Projectile) || (entity->model() && entity->model()->sounds().size())) {
render_entity_sound(entity);
}