#include <env_sound_user.h>
Inheritance diagram for NLSOUND::CEnvSoundUser:
An envsound object is a node of an envsound tree, the root of which is returned by CAudioMixerUser::loadEnvSounds() and getEnvSounds(). The root is the world envsound: it has no bounds. The areas of children envsounds have bounds and they must be totally included in the area of their parent envsound.
Here is an example of an envsound tree:
* Root (world envsound) * / \ * Transition Transition * | | * Cave1 City * / \ * Transition Transition * | | * Building1 Building2 *
In a transition, the _Source object is the center source played when the listener not in the child area (CSimpleSource). In a non-transition envsound, the _Source object is the ambiant source (CAmbiantSource) which plays a stereo mix.
Nevrax France
Definition at line 82 of file env_sound_user.h.
Public Member Functions | |
void | addChild (CEnvSoundUser *child) |
Add a child (EDIT). | |
void | addEnvTag (IPlayable *source, const std::string &tag="") |
CEnvSoundUser () | |
Constructor. | |
IBoundingShape * | getBoundingShape () |
Return the bounding shape (EDIT). | |
virtual std::vector< UEnvSound * > & | getChildren () |
Return the children envsounds. | |
CEnvSoundUser * | getParent () |
Return the parent (EDIT). | |
virtual void | getPos (NLMISC::CVector &pos) const=0 |
Return the position. | |
virtual const NLMISC::CVector & | getPos () const |
Return the position. | |
IPlayable * | getSource () |
Return the source (EDIT). | |
bool | mustPlay () const |
Return the play flag. | |
virtual void | play (bool children_too=false) |
Play this node, and all descendants if children_too is true. | |
void | recompute () |
Recompute the EnvSound. Call this method after having moved the 3D source (call only on the root env). | |
virtual void | selectEnv (const char *tag, bool children_too=false) |
Select the current env for this node, and for all descendants if children_too is true. | |
virtual void | setPos (const NLMISC::CVector &pos) |
Moves the envsound (and its transition envsound if it has one). | |
void | setProperties (bool transition, IBoundingShape *bshape) |
Set properties (EDIT) (set a NULL shape for all world). | |
virtual void | stop (bool children_too=false) |
Stop playing this node, and all descendants if children_too is true. | |
void | update () |
Update the stereo mixes (call evenly on the root) (recursive). | |
virtual | ~CEnvSoundUser () |
Destructor. | |
Protected Member Functions | |
void | applySourcesMarks () |
CEnvSoundUser * | findCurrentEnv (const NLMISC::CVector &listenerpos) |
Find the area where the listener is located (recursive). | |
uint32 | getCount () const |
Count the envs in the tree (call on the root). | |
bool | isRoot () const |
Return true if the envsound is the root of the hierarchy tree. | |
void | markSources (const NLMISC::CVector &listenerpos, float gain) |
void | playSub (bool children_too=false) |
Play this node, and all descendants if children_too is true, but do not recompute. | |
void | stopSub (bool children_too=false) |
Stop playing this node, and all descendants if children_too is true, but do not recompute. | |
Private Attributes | |
IBoundingShape * | _BoundingShape |
std::vector< CEnvSoundUser * > | _Children |
float | _Gain |
bool | _Mark |
CEnvSoundUser * | _Parent |
bool | _Play |
IPlayable * | _Source |
std::vector< IPlayable * > | _SrcBank |
std::vector< std::string > | _Tags |
bool | _Transition |
|
Constructor.
Definition at line 43 of file env_sound_user.cpp.
00043 : _Play(false), _Source(NULL), _BoundingShape(NULL), _Transition(false), _Parent(NULL), _Mark(false), _Gain(1.0f) 00044 { 00045 } |
|
Destructor.
Definition at line 51 of file env_sound_user.cpp. References _SrcBank.
00052 { 00053 vector<CEnvSoundUser*>::iterator ipe; 00054 for ( ipe=_Children.begin(); ipe!=_Children.end(); ++ipe ) 00055 { 00056 delete (*ipe); 00057 } 00058 00059 vector<IPlayable*>::iterator ipp; 00060 for ( ipp=_SrcBank.begin(); ipp!=_SrcBank.end(); ++ipp ) 00061 { 00062 // An IPlayable object can be a CAmbiantSource or a CSimpleSource. 00063 // A CAmbiantSource removes its source (channels) in destructor, but not a CSimpleSource 00064 if ( dynamic_cast<CSimpleSource*>(*ipp) ) 00065 { 00066 CAudioMixerUser::instance()->removeSource( static_cast<CSimpleSource*>(*ipp) ); 00067 } 00068 else 00069 { 00070 if ( (*ipp) != NULL ) 00071 { 00072 delete (*ipp); 00073 } 00074 } 00075 } 00076 00077 if ( _BoundingShape != NULL ) 00078 { 00079 delete _BoundingShape; 00080 } 00081 } |
|
Add a child (EDIT).
Definition at line 588 of file env_sound_user.cpp. References _Parent.
00589 { 00590 child->_Parent = this; 00591 _Children.push_back( child ); 00592 } |
|
Add an environment source/tag (EDIT) (set a NULL source for no source at all). The current source always becomes the first one. Definition at line 487 of file env_sound_user.cpp. References _Source, and _SrcBank.
|
|
Definition at line 452 of file env_sound_user.cpp. References _Mark, and _Source. Referenced by recompute().
00453 { 00454 if ( ! _Play ) 00455 { 00456 _Mark = false; 00457 } 00458 if ( _Source != NULL ) 00459 { 00460 _Source->enable( _Mark, _Gain ); 00461 } 00462 _Mark = false; 00463 00464 // Apply on children 00465 vector<CEnvSoundUser*>::iterator ipe; 00466 for ( ipe=_Children.begin(); ipe!=_Children.end(); ++ipe ) 00467 { 00468 (*ipe)->applySourcesMarks(); 00469 } 00470 } |
|
Find the area where the listener is located (recursive).
Definition at line 303 of file env_sound_user.cpp. Referenced by recompute().
00304 { 00305 // Find in children first (check from leaves to root) 00306 vector<CEnvSoundUser*>::iterator ipe = _Children.begin(); 00307 CEnvSoundUser *found = NULL; 00308 while ( ! ( (found) || (ipe==_Children.end()) ) ) 00309 { 00310 found = (*ipe)->findCurrentEnv( listenerpos ); 00311 ipe++; 00312 } 00313 if ( found ) 00314 return found; 00315 else if ( (_BoundingShape == NULL) || (_BoundingShape->include( listenerpos )) ) 00316 return this; 00317 else 00318 return NULL; 00319 } |
|
Return the bounding shape (EDIT).
Definition at line 136 of file env_sound_user.h.
00136 { return _BoundingShape; } |
|
Return the children envsounds.
Implements NLSOUND::UEnvSound. Definition at line 376 of file env_sound_user.cpp.
00377 { 00378 return (vector<UEnvSound*>&)(_Children); 00379 } |
|
Count the envs in the tree (call on the root).
Definition at line 248 of file env_sound_user.cpp. References uint32.
|
|
Return the parent (EDIT).
Definition at line 140 of file env_sound_user.h. References _Parent.
00140 { return _Parent; } |
|
Return the position.
|
|
Return the position.
|
|
Return the source (EDIT).
Definition at line 138 of file env_sound_user.h. References _Source.
00138 { return _Source; } |
|
Return true if the envsound is the root of the hierarchy tree.
Definition at line 148 of file env_sound_user.h. References _Parent. Referenced by recompute().
00148 { return _Parent==NULL; } |
|
Prepare the related sources to play (recursive). In each children branch, there must be an env which is not a transition, for the recursion to stop Definition at line 408 of file env_sound_user.cpp. References _Mark, _Parent, _Transition, and nlassert. Referenced by recompute().
00409 { 00410 // Is the listener in a transition area ? 00411 if ( _Transition ) 00412 { 00413 //nldebug( "AM: EnvSound: Marking sources for transition between child and parent" ); 00414 00415 // Compute the listener position to find the ratio between up and down envs 00416 nlassert( (_Children.size() == 1) && (_Children[0] != NULL) && (_Parent != NULL) ); 00417 nlassert( _BoundingShape && _Children[0]->_BoundingShape ); 00418 float ratio = _BoundingShape->getRatio( listenerpos, _Children[0]->_BoundingShape ); 00419 nlassert( ratio >= 0.0f && ratio <= 1.0f ); 00420 00421 // The child env plays at gain*ratio 00422 // The recursion stops because the child env is not a transition area 00423 _Children[0]->markSources( listenerpos, gain * ratio ); 00424 00425 // The parent env (therefore the 3d source of the current env as well) plays at gain*(1-ratio) 00426 // The recursion stops because the parent env is not a transition area 00427 _Parent->markSources( listenerpos, gain * (1.0f-ratio) ); 00428 } 00429 else 00430 { 00431 //nldebug( "AM: EnvSound: Marking sources for environnement" ); 00432 00433 // The listener in an environment, containing other environments (e.g. a town) or not (e.g. a room). 00434 // The current env plays 00435 _Mark = true; 00436 _Gain = gain; 00437 00438 // The children env (next level only) play 00439 vector<CEnvSoundUser*>::iterator ipe; 00440 for( ipe=_Children.begin(); ipe!=_Children.end(); ++ipe ) 00441 { 00442 (*ipe)->_Mark = true; 00443 (*ipe)->_Gain = gain; 00444 } 00445 } 00446 } |
|
Return the play flag.
Definition at line 122 of file env_sound_user.h.
00122 { return _Play; } |
|
Play this node, and all descendants if children_too is true.
Implements NLSOUND::UEnvSound. Definition at line 516 of file env_sound_user.cpp. References playSub().
00517 { 00518 playSub( children_too ); 00519 00520 CAudioMixerUser::instance()->getEnvSounds()->recompute(); 00521 } |
|
Play this node, and all descendants if children_too is true, but do not recompute.
Definition at line 538 of file env_sound_user.cpp. References _Parent, _Play, and _Transition. Referenced by play().
00539 { 00540 _Play = true; 00541 00542 // Start transition as well 00543 if ( (_Parent != NULL) && ( _Parent->_Transition ) ) 00544 { 00545 _Parent->_Play = true; 00546 } 00547 00548 // Apply to descendants 00549 if ( children_too ) 00550 { 00551 vector<CEnvSoundUser*>::iterator ipc; 00552 for ( ipc=_Children.begin(); ipc!=_Children.end(); ++ipc ) 00553 { 00554 (*ipc)->playSub( children_too ); 00555 } 00556 } 00557 } |
|
Recompute the EnvSound. Call this method after having moved the 3D source (call only on the root env).
Definition at line 385 of file env_sound_user.cpp. References applySourcesMarks(), findCurrentEnv(), isRoot(), markSources(), and nlassert.
00386 { 00387 nlassert( isRoot() ); 00388 00389 // Find the area of the listener 00390 CVector listenerpos; 00391 CAudioMixerUser::instance()->getListener()->getPos( listenerpos ); 00392 CEnvSoundUser *current = findCurrentEnv( listenerpos ); 00393 00394 // Mark the envs that have to play their source 00395 if ( current != NULL ) 00396 { 00397 current->markSources( listenerpos, 1.0f ); 00398 } 00399 00400 // Enable/disable the sources in the hierarchy, and reset the marks 00401 applySourcesMarks(); 00402 } |
|
Select the current env for this node, and for all descendants if children_too is true.
Implements NLSOUND::UEnvSound. Definition at line 190 of file env_sound_user.cpp. References _Source, _SrcBank, nldebug, and uint.
00191 { 00192 uint i; 00193 for ( i=0; i!= _Tags.size(); i++ ) 00194 { 00195 if ( _Tags[i] == string(tag) ) 00196 { 00197 if ( _Source != NULL ) 00198 { 00199 _Source->enable( false, 1.0f ); 00200 } 00201 _Source = _SrcBank[i]; 00202 nldebug( "AM: EnvSound: Environment changed to %s", tag ); 00203 CAudioMixerUser::instance()->getEnvSounds()->recompute(); 00204 break; 00205 } 00206 } 00207 //nldebug( "AM: EnvSound: Environment %s not found", tag ); 00208 // Don't change _Source if not found 00209 00210 // Apply to descendants 00211 if ( children_too ) 00212 { 00213 vector<CEnvSoundUser*>::iterator ipc; 00214 for ( ipc=_Children.begin(); ipc!=_Children.end(); ++ipc ) 00215 { 00216 (*ipc)->selectEnv( tag, children_too ); 00217 } 00218 } 00219 } |
|
Moves the envsound (and its transition envsound if it has one).
Implements NLSOUND::UEnvSound. Definition at line 341 of file env_sound_user.cpp. References _BoundingShape, _Parent, _Source, and _Transition.
00342 { 00343 if ( _BoundingShape != NULL ) 00344 { 00345 // Get the vector between the pos of this envsound and the pos of its transition envsound 00346 CVector newpos; 00347 if ( (_Parent != NULL) && ( _Parent->_Transition ) ) 00348 { 00349 newpos = pos + _Parent->_BoundingShape->getCenter() - _BoundingShape->getCenter(); 00350 } 00351 else 00352 { 00353 newpos = pos; 00354 } 00355 00356 // Set the new pos 00357 _BoundingShape->setCenter( pos ); 00358 if ( (_Parent != NULL) && ( _Parent->_Transition ) ) 00359 { 00360 _Parent->_BoundingShape->setCenter( newpos ); 00361 if ( _Parent->_Source != NULL ) 00362 { 00363 _Parent->_Source->moveTo( newpos ); 00364 } 00365 } 00366 00367 // Recompute the entire tree 00368 CAudioMixerUser::instance()->getEnvSounds()->recompute(); 00369 } 00370 } |
|
Set properties (EDIT) (set a NULL shape for all world).
Definition at line 476 of file env_sound_user.cpp. References _Transition.
00477 { 00478 _Transition = transition; 00479 _BoundingShape = bshape; 00480 } |
|
Stop playing this node, and all descendants if children_too is true.
Implements NLSOUND::UEnvSound. Definition at line 527 of file env_sound_user.cpp. References stopSub().
00528 { 00529 stopSub( children_too ); 00530 00531 CAudioMixerUser::instance()->getEnvSounds()->recompute(); 00532 } |
|
Stop playing this node, and all descendants if children_too is true, but do not recompute.
Definition at line 563 of file env_sound_user.cpp. References _Parent, _Play, and _Transition. Referenced by stop().
00564 { 00565 _Play = false; 00566 00567 // Stop transition as well 00568 if ( (_Parent != NULL) && ( _Parent->_Transition ) ) 00569 { 00570 _Parent->_Play = false; 00571 } 00572 00573 // Apply to descendants 00574 if ( children_too ) 00575 { 00576 vector<CEnvSoundUser*>::iterator ipc; 00577 for ( ipc=_Children.begin(); ipc!=_Children.end(); ++ipc ) 00578 { 00579 (*ipc)->stopSub( children_too ); 00580 } 00581 } 00582 } |
|
Update the stereo mixes (call evenly on the root) (recursive).
Definition at line 286 of file env_sound_user.cpp. References _Source.
|
|
Definition at line 182 of file env_sound_user.h. Referenced by setPos(). |
|
Definition at line 189 of file env_sound_user.h. |
|
Definition at line 193 of file env_sound_user.h. |
|
Definition at line 192 of file env_sound_user.h. Referenced by applySourcesMarks(), and markSources(). |
|
Definition at line 188 of file env_sound_user.h. Referenced by addChild(), getParent(), isRoot(), markSources(), playSub(), setPos(), and stopSub(). |
|
Definition at line 174 of file env_sound_user.h. |
|
Definition at line 177 of file env_sound_user.h. Referenced by addEnvTag(), applySourcesMarks(), getSource(), selectEnv(), setPos(), and update(). |
|
Definition at line 178 of file env_sound_user.h. Referenced by addEnvTag(), selectEnv(), and ~CEnvSoundUser(). |
|
Definition at line 179 of file env_sound_user.h. |
|
Definition at line 185 of file env_sound_user.h. Referenced by markSources(), playSub(), setPos(), setProperties(), and stopSub(). |