]> git.mxchange.org Git - simgear.git/blobdiff - simgear/sound/sample_group.cxx
small fixes
[simgear.git] / simgear / sound / sample_group.cxx
index a5d19641d385e86097f7a20cccbf6069ac37c4bb..539ab61bfa233eb2fb67155ff64d93c7ce93cd81 100644 (file)
@@ -37,11 +37,12 @@ SGSampleGroup::SGSampleGroup () :
     _smgr(NULL),
     _refname(""),
     _active(false),
+    _changed(false),
     _pause(false),
     _tied_to_listener(false),
     _velocity(SGVec3d::zeros()),
-    _orientation(SGQuatd::zeros()),
-    _position(SGGeod())
+    _base_pos(SGVec3d::zeros()),
+    _orientation(SGQuatd::zeros())
 {
     _samples.clear();
 }
@@ -50,11 +51,12 @@ SGSampleGroup::SGSampleGroup ( SGSoundMgr *smgr, const string &refname ) :
     _smgr(smgr),
     _refname(refname),
     _active(false), 
+    _changed(false),
     _pause(false),
     _tied_to_listener(false),
     _velocity(SGVec3d::zeros()),
-    _orientation(SGQuatd::zeros()),
-    _position(SGGeod())
+    _base_pos(SGVec3d::zeros()),
+    _orientation(SGQuatd::zeros())
 {
     _smgr->add(this, refname);
     _samples.clear();
@@ -111,6 +113,12 @@ void SGSampleGroup::update( double dt ) {
         i++;
     }
 
+    // Update the position and orientation information for all samples.
+    if ( _changed || _smgr->has_changed() ) {
+        update_pos_and_orientation();
+        _changed = false;
+    }
+
     sample_map_iterator sample_current = _samples.begin();
     sample_map_iterator sample_end = _samples.end();
     for ( ; sample_current != sample_end; ++sample_current ) {
@@ -326,44 +334,33 @@ void SGSampleGroup::set_velocity( const SGVec3f &vel ) {
     }
 }
 
-// set the source position of all managed sounds
-void SGSampleGroup::set_position( const SGGeod& pos ) {
+void SGSampleGroup::set_volume( float vol )
+{
+    _volume = vol;
+    if (_volume < 0.0) _volume = 0.0;
+    if (_volume > 1.0) _volume = 1.0;
 
     sample_map_iterator sample_current = _samples.begin();
     sample_map_iterator sample_end = _samples.end();
     for ( ; sample_current != sample_end; ++sample_current ) {
         SGSoundSample *sample = sample_current->second;
-        sample->set_position( pos );
-    }
-    _position = pos;
-}
-
-
-// set the source orientation of all managed sounds
-void SGSampleGroup::set_orientation( const SGQuatd& ori ) {
-
-    if (_orientation != ori) {
-        sample_map_iterator sample_current = _samples.begin();
-        sample_map_iterator sample_end = _samples.end();
-        for ( ; sample_current != sample_end; ++sample_current ) {
-            SGSoundSample *sample = sample_current->second;
-            sample->set_orientation( ori );
-        }
-        _orientation = ori;
+        sample->set_master_volume( _volume );
     }
 }
 
-void SGSampleGroup::set_volume( float vol )
-{
-    _volume = vol;
-    if (_volume < 0.0) _volume = 0.0;
-    if (_volume > 1.0) _volume = 1.0;
+// set the source position and orientation of all managed sounds
+void SGSampleGroup::update_pos_and_orientation() {
+    SGVec3d position = _base_pos - _smgr->get_position();
+     SGQuatd hlOr = SGQuatd::fromLonLat(_position_geod) * _orientation;
 
     sample_map_iterator sample_current = _samples.begin();
     sample_map_iterator sample_end = _samples.end();
     for ( ; sample_current != sample_end; ++sample_current ) {
         SGSoundSample *sample = sample_current->second;
-        sample->set_master_volume( _volume );
+        sample->set_position( position );
+        sample->set_orientation( _orientation );
+        sample->set_rotation( hlOr );
     }
 }
 
@@ -373,20 +370,22 @@ void SGSampleGroup::update_sample_config( SGSoundSample *sample ) {
 
     if ( _tied_to_listener ) {
         orientation = _smgr->get_direction();
-        position = _smgr->get_position();
+        position = SGVec3d::zeros();
         velocity = _smgr->get_velocity();
     } else {
-        sample->update_absolute_position();
+        sample->update_pos_and_orientation();
         orientation = sample->get_orientation();
         position = sample->get_position();
         velocity = sample->get_velocity();
     }
 
-    if (dist(position, _smgr->get_position()) > 10000)
+#if 0
+    if (length(position) > 20000)
         printf("source and listener distance greater than 20km!\n");
     if (isNaN(toVec3f(position).data())) printf("NaN in source position\n");
     if (isNaN(orientation.data())) printf("NaN in source orientation\n");
     if (isNaN(velocity.data())) printf("NaN in source velocity\n");
+#endif
 
     unsigned int source = sample->get_source();
     alSourcefv( source, AL_POSITION, toVec3f(position).data() );