_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)
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");
// 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 ) {
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() );
// sample group was not found.
if (create) {
SGSampleGroup* sgrp = new SGSampleGroup(this, refname);
+ add( sgrp, refname );
return sgrp;
}
else
}
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
* 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());
_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,