X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fsound%2Fsoundmgr_openal.cxx;h=6066a560c32d1d22cc49679b387171fe0a8807d9;hb=afb18ca75b90e5a2e0bf791ba2e38812128ab0a8;hp=76b3f1381dcda5b5f766a841b27978de9034a56e;hpb=1ac944b7c1e7236e6d3493a7c23ea2c099109261;p=simgear.git diff --git a/simgear/sound/soundmgr_openal.cxx b/simgear/sound/soundmgr_openal.cxx index 76b3f138..6066a560 100644 --- a/simgear/sound/soundmgr_openal.cxx +++ b/simgear/sound/soundmgr_openal.cxx @@ -63,8 +63,9 @@ SGSoundMgr::SGSoundMgr() : _volume(0.0), _device(NULL), _context(NULL), - _position_geod(SGGeod::fromDeg(0,0)), _absolute_pos(SGVec3d::zeros()), + _offset_pos(SGVec3d::zeros()), + _base_pos(SGVec3d::zeros()), _velocity(SGVec3d::zeros()), _orientation(SGQuatd::zeros()), _devname(NULL) @@ -132,11 +133,9 @@ void SGSoundMgr::init() { alDopplerFactor(1.0); alDopplerVelocity(340.3); // speed of sound in meters per second. - if ( alIsExtensionPresent((const ALchar*)"EXT_exponent_distance") ) { - alDistanceModel(AL_EXPONENT_DISTANCE); - } else { - alDistanceModel(AL_INVERSE_DISTANCE); - } + // gain = AL_REFERENCE_DISTANCE / (AL_REFERENCE_DISTANCE + + // AL_ROLLOFF_FACTOR * (distance - AL_REFERENCE_DISTANCE)); + alDistanceModel(AL_INVERSE_DISTANCE_CLAMPED); testForALError("listener initialization"); @@ -245,6 +244,10 @@ void SGSoundMgr::unbind () // run the audio scheduler void SGSoundMgr::update( double dt ) { if (_active) { + if (_changed) { + update_pos_and_orientation(); + } + sample_group_map_iterator sample_grp_current = _sample_groups.begin(); sample_group_map_iterator sample_grp_end = _sample_groups.end(); for ( ; sample_grp_current != sample_grp_end; ++sample_grp_current ) { @@ -258,7 +261,6 @@ if (isNaN(_at_up_vec)) printf("NaN in listener orientation\n"); if (isNaN(toVec3f(_absolute_pos).data())) printf("NaN in listener position\n"); if (isNaN(_velocity.data())) printf("NaN in listener velocity\n"); #endif - update_pos_and_orientation(); alListenerf( AL_GAIN, _volume ); alListenerfv( AL_ORIENTATION, _at_up_vec ); // alListenerfv( AL_POSITION, toVec3f(_absolute_pos).data() ); @@ -321,6 +323,7 @@ SGSampleGroup *SGSoundMgr::find( const string &refname, bool create ) { // sample group was not found. if (create) { SGSampleGroup* sgrp = new SGSampleGroup(this, refname); + add( sgrp, refname ); return sgrp; } else @@ -462,9 +465,6 @@ void SGSoundMgr::release_buffer(SGSoundSample *sample) } void SGSoundMgr::update_pos_and_orientation() { - // cartesian position of the listener - _absolute_pos = SGVec3d::fromGeod( _position_geod ); - /** * Description: ORIENTATION is a pair of 3-tuples representing the * 'at' direction vector and 'up' direction of the Object in @@ -473,6 +473,7 @@ void SGSoundMgr::update_pos_and_orientation() { * one or more vectors have zero length, implementation behavior * is undefined. If the two vectors are linearly dependent, * behavior is undefined. + * * This is in the same coordinate system as OpenGL; y=up, z=back, x=right. */ SGVec3d sgv_at = _orientation.backTransform(-SGVec3d::e3()); @@ -483,6 +484,11 @@ void SGSoundMgr::update_pos_and_orientation() { _at_up_vec[3] = sgv_up[0]; _at_up_vec[4] = sgv_up[1]; _at_up_vec[5] = sgv_up[2]; + + // static const SGQuatd q(-0.5, -0.5, 0.5, 0.5); + // SGQuatd hlOr = SGQuatd::fromLonLat(SGGeod::fromCart(_base_pos)); + // SGQuatd ec2body = hlOr*_orientation; + _absolute_pos = _base_pos; // + ec2body.backTransform( _offset_pos ); } bool SGSoundMgr::load(string &samplepath, void **dbuf, int *fmt,