]> git.mxchange.org Git - simgear.git/blobdiff - simgear/sound/soundmgr_openal.cxx
the wrong name also mislead me: rotate velocity to the proper quat
[simgear.git] / simgear / sound / soundmgr_openal.cxx
index b617794810ce0c765f5e019eadeb93a90a14e646..6066a560c32d1d22cc49679b387171fe0a8807d9 100644 (file)
@@ -63,12 +63,11 @@ SGSoundMgr::SGSoundMgr() :
     _volume(0.0),
     _device(NULL),
     _context(NULL),
-    _position_geod(SGGeod::fromDeg(0,0)),
-    _position_offs(SGVec3d::zeros()),
     _absolute_pos(SGVec3d::zeros()),
+    _offset_pos(SGVec3d::zeros()),
+    _base_pos(SGVec3d::zeros()),
     _velocity(SGVec3d::zeros()),
     _orientation(SGQuatd::zeros()),
-    _orient_offs(SGQuatd::zeros()),
     _devname(NULL)
 {
 #if defined(ALUT_API_MAJOR_VERSION) && ALUT_API_MAJOR_VERSION >= 1
@@ -134,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");
 
@@ -247,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 ) {
@@ -255,13 +256,14 @@ void SGSoundMgr::update( double dt ) {
         }
 
         if (_changed) {
+#if 0
 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");
-            update_pos_and_orientation();
+#endif
             alListenerf( AL_GAIN, _volume );
             alListenerfv( AL_ORIENTATION, _at_up_vec );
-            alListenerfv( AL_POSITION, toVec3f(_absolute_pos).data() );
+            // alListenerfv( AL_POSITION, toVec3f(_absolute_pos).data() );
             alListenerfv( AL_VELOCITY, _velocity.data() );
             // alDopplerVelocity(340.3);       // TODO: altitude dependent
             testForALError("update");
@@ -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,28 +465,6 @@ void SGSoundMgr::release_buffer(SGSoundSample *sample)
 }
 
 void SGSoundMgr::update_pos_and_orientation() {
-    // The rotation rotating from the earth centerd frame to
-    // the horizontal local frame
-    SGQuatd hlOr = SGQuatd::fromLonLat( _position_geod );
-
-    // Compute the listeners orientation and position
-    // wrt the earth centered frame - that is global coorinates
-    SGQuatd lc2body = hlOr*_orientation;
-
-    // cartesian position of the listener
-    SGVec3d position = SGVec3d::fromGeod( _position_geod );
-
-    // This is rotates the x-forward, y-right, z-down coordinate system where
-    // simulation runs into the OpenGL camera system with x-right, y-up, z-back.
-    SGQuatd q(-0.5, -0.5, 0.5, 0.5);
-
-    _absolute_pos = position;
-#if 0
-     if (_position_offs[0] || _position_offs[1] || _position_offs[2] ) {
-         _absolute_pos += (lc2body*q).backTransform( _position_offs );
-     }
-#endif
-
     /**
      * Description: ORIENTATION is a pair of 3-tuples representing the
      * 'at' direction vector and 'up' direction of the Object in
@@ -492,17 +473,22 @@ 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.
      */
-    SGQuatd lViewOrientation = hlOr*_orient_offs*q;
-    SGVec3d sgv_up = -lViewOrientation.rotate(SGVec3d::e2());
-    SGVec3d sgv_at = lViewOrientation.rotate(SGVec3d::e3());
+    SGVec3d sgv_at = _orientation.backTransform(-SGVec3d::e3());
+    SGVec3d sgv_up = _orientation.backTransform(SGVec3d::e2());
     _at_up_vec[0] = sgv_at[0];
     _at_up_vec[1] = sgv_at[1];
     _at_up_vec[2] = sgv_at[2];
     _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,