From 56b0856541446cbafee4eed9ef0ee9fb69af565a Mon Sep 17 00:00:00 2001 From: Stijn Buys Date: Fri, 8 Aug 2008 22:17:29 +0000 Subject: improved truster indicator, impulse engine sounds --- src/client/targets.cc | 92 ++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 69 insertions(+), 23 deletions(-) (limited to 'src/client/targets.cc') diff --git a/src/client/targets.cc b/src/client/targets.cc index f922199..384c793 100644 --- a/src/client/targets.cc +++ b/src/client/targets.cc @@ -10,6 +10,8 @@ #include #include "audio/audio.h" +#include "audio/buffers.h" +#include "audio/sources.h" #include "auxiliary/functions.h" #include "audio/sources.h" #include "client/input.h" @@ -292,7 +294,7 @@ void render_listener_sound() audio::update_listener(render::Camera::eye(), render::Camera::axis(), velocity); } -void render_entity_sound(core::Entity *entity) +void render_entity_sound(core::EntityControlable *entity) { if (!(entity->type() == core::Entity::Controlable)) return; @@ -302,34 +304,77 @@ void render_entity_sound(core::Entity *entity) return; } - core::EntityControlable *entitycontrolable = (core::EntityControlable *) entity; core::ClientState *state = entity->state(); + if (!(entity->model() && state->detailvisible())) { + entity->state()->clearsound(); + return; + } - if (entity->model() && state->detailvisible() && entitycontrolable->thrust() > 0 ) { + if (!state->state_thusterloopbuffer || ! state->state_impulseloopbuffer) { + // load engine sound + size_t enginesound = 0; + if (entity->model()) + enginesound = entity->model()->enginesound(); + + std::stringstream soundname; + soundname << "engines/loop" << std::setfill('0') << std::setw(2) << enginesound; + state->state_thusterloopbuffer = audio::Buffers::load(soundname.str()); + + // load impulse sound + // FIXME read impulse sound set from model + state->state_impulseloopbuffer = audio::Buffers::load("engines/impulse_loop00"); + state->state_impulsestartbuffer = audio::Buffers::load("engines/impulse_start00"); + state->state_impulsestopbuffer = audio::Buffers::load("engines/impulse_stop00"); + } - float speed = entitycontrolable->speed(); - float pitch = 0.2f + entitycontrolable->thrust() * 0.8f; - - if (!state->state_enginesound) { - if ((state->state_enginesound = audio::Sources::get()) > 0 ) { - - size_t enginesound = 0; - if (entity->model()) - enginesound = entity->model()->enginesound(); - - std::stringstream soundname; - soundname << "engines/loop" << std::setfill('0') << std::setw(2) << enginesound; - audio::loop(state->state_enginesound, soundname.str().c_str(), pitch, 0); - } + + if (!state->state_engineloopsource) { + state->state_engineloopsource = audio::Sources::get(); + state->state_engineeventsource = audio::Sources::get(); + } + + float speed = entity->speed(); + float pitch = 0.2f + entity->thrust() * 0.8f; + float gain = 0.0; + if (entity->thrust() > 0 ) { + gain = 1.0f; + } + + if (entity->eventstate() == core::Entity::ImpulseInitiate ) { + + if (state->state_engineeventbuffer != state->state_impulsestartbuffer) { + audio::update_source(state->state_engineeventsource, + state->location() - state->axis().forward() * entity->model()->maxbbox().y , state->axis().forward() * speed); + state->state_engineeventbuffer = audio::play(state->state_engineeventsource, state->state_impulsestartbuffer); } + } else if (entity->eventstate() == core::Entity::Impulse) { - if (state->state_enginesound) { - audio::update_source(state->state_enginesound, - state->location() - state->axis().forward() * entity->model()->maxbbox().y , state->axis().forward() * speed, pitch); + state->state_engineeventbuffer = state->state_impulseloopbuffer; + + if (state->state_engineloopbuffer != state->state_impulseloopbuffer) { + state->state_engineloopbuffer = audio::loop(state->state_engineloopsource, state->state_impulseloopbuffer, pitch, 0); } + pitch = 1.0f; } else { - entity->state()->clearsound(); + + if (state->state_engineeventbuffer == state->state_impulseloopbuffer) { + audio::update_source(state->state_engineeventsource, + state->location() - state->axis().forward() * entity->model()->maxbbox().y , state->axis().forward() * speed); + state->state_engineeventbuffer = audio::play(state->state_engineeventsource, state->state_impulsestopbuffer); + } + state->state_engineeventbuffer = 0; + + if (state->state_engineloopbuffer != state->state_thusterloopbuffer) { + state->state_engineloopbuffer = audio::loop(state->state_engineloopsource, state->state_thusterloopbuffer, pitch, 0); + } } + + + audio::update_source(state->state_engineloopsource, + state->location() - state->axis().forward() * entity->model()->maxbbox().y , state->axis().forward() * speed, pitch, gain); + + audio::update_source(state->state_engineeventsource, + state->location() - state->axis().forward() * entity->model()->maxbbox().y , state->axis().forward() * speed); } void draw_entity_offscreen_target(core::Entity *entity, bool is_active_target) @@ -511,8 +556,9 @@ void draw() core::Entity *entity = (*it); // render entity sound - render_entity_sound(entity); - + if (entity->type() == core::Entity::Controlable) { + render_entity_sound(static_cast(entity)); + } // find the current target if (core::localcontrol() && is_legal_target(entity)) { -- cgit v1.2.3