_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();
}
_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();
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 ) {
}
}
-// 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 );
}
}
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() );