]> git.mxchange.org Git - simgear.git/commitdiff
give the sample class as much info as possible to properly position and orientate...
authorehofman <ehofman>
Thu, 15 Oct 2009 09:18:21 +0000 (09:18 +0000)
committerTim Moore <timoore@redhat.com>
Fri, 16 Oct 2009 09:14:05 +0000 (11:14 +0200)
simgear/sound/sample_group.cxx
simgear/sound/sample_group.hxx
simgear/sound/sample_openal.cxx
simgear/sound/sample_openal.hxx
simgear/sound/soundmgr_openal.cxx
simgear/sound/soundmgr_openal.hxx
simgear/sound/xmlsound.cxx

index 22f9f9bfc615cf7489560cf52ea4940e055f5d52..c85e386f44e213223bedfdb257f94db950a4cf05 100644 (file)
@@ -46,9 +46,9 @@ SGSampleGroup::SGSampleGroup () :
     _refname(""),
     _active(false),
     _tied_to_listener(false),
-    _position(SGVec3d::zeros()),
-    _velocity(SGVec3f::zeros()),
-    _orientation(SGVec3f::zeros())
+    _velocity(SGVec3d::zeros()),
+    _position(SGGeod()),
+    _orientation(SGQuatd::zeros())
 {
     _samples.clear();
 }
@@ -58,9 +58,9 @@ SGSampleGroup::SGSampleGroup ( SGSoundMgr *smgr, const string &refname ) :
     _refname(refname),
     _active(false), 
     _tied_to_listener(false),
-    _position(SGVec3d::zeros()),
-    _velocity(SGVec3f::zeros()),
-    _orientation(SGVec3f::zeros())
+    _velocity(SGVec3d::zeros()),
+    _position(SGGeod()),
+    _orientation(SGQuatd::zeros())
 {
     _smgr->add(this, refname);
     _active = _smgr->is_working();
@@ -104,12 +104,6 @@ void SGSampleGroup::update( double dt ) {
             if ( _smgr->request_buffer(sample) == SGSoundMgr::NO_BUFFER )
                 continue;
 
-            if ( _tied_to_listener && _smgr->has_changed() ) {
-                sample->set_base_position( _smgr->get_position_vec() );
-                sample->set_orientation( _smgr->get_direction() );
-                sample->set_velocity( _smgr->get_velocity() );
-            }
-
             // start playing the sample
             ALboolean looping = sample->get_looping() ? AL_TRUE : AL_FALSE;
             ALuint buffer = sample->get_buffer();
@@ -294,29 +288,9 @@ bool SGSampleGroup::stop( const string& refname ) {
     return true;
 }
 
-
-// set source position of all managed sounds
-void SGSampleGroup::set_position( SGVec3d pos ) {
-    if ( isnan(pos.data()[0]) || isnan(pos.data()[1]) || isnan(pos.data()[2]) )
-    {
-        SG_LOG( SG_GENERAL, SG_ALERT, "NAN's found in SampleGroup postion");
-        return;
-    }
-
-    if ( !_tied_to_listener && _position != pos ) {
-        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_base_position( pos );
-        }
-        _position = pos;
-    }
-}
-
 // set source velocity of all managed sounds
-void SGSampleGroup::set_velocity( SGVec3vel ) {
-    if ( isnan(vel.data()[0]) || isnan(vel.data()[1]) || isnan(vel.data()[2]) )
+void SGSampleGroup::set_velocity( SGVec3d &vel ) {
+    if ( isnan(vel[0]) || isnan(vel[1]) || isnan(vel[2]) )
     {
         SG_LOG( SG_GENERAL, SG_ALERT, "NAN's found in SampleGroup velocity");
         return;
@@ -329,16 +303,25 @@ void SGSampleGroup::set_velocity( SGVec3f vel ) {
             SGSoundSample *sample = sample_current->second;
             sample->set_velocity( vel );
         }
+        _velocity = vel;
     }
 }
 
 // ste the source orientation of all managed sounds
-void SGSampleGroup::set_orientation( SGVec3f ori ) {
-    if ( isnan(ori.data()[0]) || isnan(ori.data()[1]) || isnan(ori.data()[2]) )
-    {
-        SG_LOG( SG_GENERAL, SG_ALERT, "NAN's found in SampleGroup orientation");
-        return;
+void SGSampleGroup::set_position( SGGeod pos ) {
+
+    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;
+}
+
+
+// ste the source orientation of all managed sounds
+void SGSampleGroup::set_orientation( SGQuatd ori ) {
 
     if (_orientation != ori) {
         sample_map_iterator sample_current = _samples.begin();
@@ -347,6 +330,21 @@ void SGSampleGroup::set_orientation( SGVec3f ori ) {
             SGSoundSample *sample = sample_current->second;
             sample->set_orientation( ori );
         }
+        _orientation = ori;
+    }
+}
+
+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_master_volume( _volume );
     }
 }
 
@@ -354,9 +352,15 @@ void SGSampleGroup::update_sample_config( SGSoundSample *sample ) {
     if ( sample->is_valid_source() ) {
         unsigned int source = sample->get_source();
 
-        alSourcefv( source, AL_POSITION, sample->get_position());
-        alSourcefv( source, AL_DIRECTION, sample->get_orientation() );
-        alSourcefv( source, AL_VELOCITY, sample->get_velocity() );
+        if ( _tied_to_listener && _smgr->has_changed() ) {
+            alSourcefv( source, AL_POSITION, _smgr->get_position().data() );
+            alSourcefv( source, AL_DIRECTION, _smgr->get_direction().data() );
+            alSourcefv( source, AL_VELOCITY, _smgr->get_velocity().data() );
+        } else {
+            alSourcefv( source, AL_POSITION, sample->get_position());
+            alSourcefv( source, AL_DIRECTION, sample->get_orientation() );
+            alSourcefv( source, AL_VELOCITY, sample->get_velocity() );
+        }
         testForALError("position and orientation");
 
         alSourcef( source, AL_PITCH, sample->get_pitch() );
@@ -377,20 +381,6 @@ void SGSampleGroup::update_sample_config( SGSoundSample *sample ) {
     }
 }
 
-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_master_volume( _volume );
-    }
-}
-
 bool SGSampleGroup::testForError(void *p, string s)
 {
    if (p == NULL) {
index 1344df4493f4a5961ba11e6b348e7284731dec48..5bb504a9bd08552815ed6a41f684d8a34f381312 100644 (file)
@@ -139,19 +139,19 @@ public:
     void set_volume( float vol );
 
     /**
-     * set the positions of all managed sound sources
+     * set the velocities of all managed sound sources
      */
-    void set_position( SGVec3d pos );
+    void set_velocity( SGVec3d& vel );
 
     /**
-     * set the velocities of all managed sound sources
+     * set the position of all managed sound sources
      */
-    void set_velocity( SGVec3f vel );
+    void set_position( SGGeod pos );
 
     /**
      * set the orientation of all managed sound sources
      */
-    void set_orientation( SGVec3f ori );
+    void set_orientation( SGQuatd ori );
 
     inline void tie_to_listener() { _tied_to_listener = true; }
 
@@ -165,9 +165,9 @@ private:
     float _volume;
     bool _tied_to_listener;
 
-    SGVec3d _position;
-    SGVec3f _velocity;
-    SGVec3f _orientation;
+    SGVec3d _velocity;
+    SGGeod _position;
+    SGQuatd _orientation;
 
     sample_map _samples;
 
index 8eb83a68d981657325a2be3dfc8eab46b2e2222e..526e27c77c5f5383ea1bb1b114def67bd5b596ec 100644 (file)
 
 // empty constructor
 SGSoundSample::SGSoundSample() :
-    _absolute_pos(SGVec3d::zeros().data()),
-    _relative_pos(SGVec3f::zeros().data()),
-    _base_pos(SGVec3d::zeros().data()),
-    _orientation(SGVec3f::zeros().data()),
-    _direction(SGVec3f::zeros().data()),
-    _velocity(SGVec3f::zeros().data()),
+    _absolute_pos(SGVec3d::zeros()),
+    _relative_pos(SGVec3f::zeros()),
+    _direction(SGVec3d::zeros()),
+    _velocity(SGVec3d::zeros()),
+    _base_pos(SGGeod()),
+    _orientation(SGQuatd::zeros()),
     _sample_name(""),
     _data(NULL),
     _format(AL_FORMAT_MONO8),
@@ -72,12 +72,12 @@ SGSoundSample::SGSoundSample() :
 
 // constructor
 SGSoundSample::SGSoundSample( const char *path, const char *file ) :
-    _absolute_pos(SGVec3d::zeros().data()),
-    _relative_pos(SGVec3f::zeros().data()),
-    _base_pos(SGVec3d::zeros().data()),
-    _orientation(SGVec3f::zeros().data()),
-    _direction(SGVec3f::zeros().data()),
-    _velocity(SGVec3f::zeros().data()),
+    _absolute_pos(SGVec3d::zeros()),
+    _relative_pos(SGVec3f::zeros()),
+    _direction(SGVec3d::zeros()),
+    _velocity(SGVec3d::zeros()),
+    _base_pos(SGGeod()),
+    _orientation(SGQuatd::zeros()),
     _format(AL_FORMAT_MONO8),
     _size(0),
     _freq(0),
@@ -111,12 +111,12 @@ SGSoundSample::SGSoundSample( const char *path, const char *file ) :
 
 // constructor
 SGSoundSample::SGSoundSample( unsigned char *data, int len, int freq, int format ) :
-    _absolute_pos(SGVec3d::zeros().data()),
-    _relative_pos(SGVec3f::zeros().data()),
-    _base_pos(SGVec3d::zeros().data()),
-    _orientation(SGVec3f::zeros().data()),
-    _direction(SGVec3f::zeros().data()),
-    _velocity(SGVec3f::zeros().data()),
+    _absolute_pos(SGVec3d::zeros()),
+    _relative_pos(SGVec3f::zeros()),
+    _direction(SGVec3d::zeros()),
+    _velocity(SGVec3d::zeros()),
+    _base_pos(SGGeod()),
+    _orientation(SGQuatd::zeros()),
     _data(data),
     _format(format),
     _size(len),
@@ -148,46 +148,37 @@ SGSoundSample::SGSoundSample( unsigned char *data, int len, int freq, int format
 SGSoundSample::~SGSoundSample() {
 }
 
-float *SGSoundSample::get_orientation() {
-#if 0
-    SGQuatf quat = SGQuatf::fromAngleAxis(_orientation);
-    SGVec3f orient = quat.transform(_direction);
-    return orient.data();
-#else
-    return _orientation.data();
-#endif
-}
-
-void SGSoundSample::set_base_position( SGVec3d pos ) {
-    _base_pos = pos;
+void SGSoundSample::set_orientation( SGQuatd ori ) {
+    _orientation = ori;
     update_absolute_position();
     _changed = true;
 }
 
-void SGSoundSample::set_relative_position( SGVec3f pos ) {
-    _relative_pos = pos;
+void SGSoundSample::set_direction( SGVec3d dir ) {
+    _direction = dir;
     update_absolute_position();
     _changed = true;
 }
 
-void SGSoundSample::set_orientation( SGVec3f ori ) {
-    _orientation = ori;
+float *SGSoundSample::get_orientation() {
+    SGQuatd orient = SGQuatd::fromLonLat(_base_pos) * _orientation;
+    SGVec3d orivec = -orient.rotate(_direction);
+    return toVec3f(orivec).data();
+}
+
+void SGSoundSample::set_relative_position( SGVec3f pos ) {
+    _relative_pos = pos;
     update_absolute_position();
     _changed = true;
 }
 
-void SGSoundSample::set_direction( SGVec3f dir ) {
-    _direction = dir;
+void SGSoundSample::set_position( SGGeod pos ) {
+    _base_pos = pos;
     update_absolute_position();
     _changed = true;
 }
 
 void SGSoundSample::update_absolute_position() {
-#if 0
-    SGQuatf orient = SGQuatf::fromAngleAxis(_orientation);
-    SGVec3f modified_relative_pos = orient.transform(_relative_pos);
-    _absolute_pos = _base_pos + toVec3d(modified_relative_pos);
-#else
-    _absolute_pos = _base_pos;
-#endif
+    _absolute_pos = -SGVec3d::fromGeod(_base_pos);
+    // TODO: add relative position
 }
index f44596a8bedcdec1df30864b944de159c044e19b..59d26581207d165b5fc77bdbcce04a8867f4f9fb 100644 (file)
@@ -40,9 +40,7 @@
 #include <simgear/structure/SGSharedPtr.hxx>
 #include <simgear/math/SGMath.hxx>
 
-#include <plib/sg.h>
-
-using std::string;
+// #include <plib/sg.h>
 
 /**
  * manages everything we need to know for an individual sound sample
@@ -55,16 +53,14 @@ private:
     // Position of the source sound.
     SGVec3d _absolute_pos;     // absolute position
     SGVec3f _relative_pos;     // position relative to the base position
-    SGVec3d _base_pos;         // base position
-
-    // The orientation of the sound (direction and cut-off angles)
-    SGVec3f _orientation;      // base orientation
-    SGVec3f _direction;                // orientation offset
+    SGVec3d _direction;                // orientation offset
+    SGVec3d _velocity;         // Velocity of the source sound.
 
-    // Velocity of the source sound.
-    SGVec3f _velocity;
+    // The position and orientation of the sound
+    SGGeod _base_pos;
+    SGQuatd _orientation;      // base orientation
 
-    string _sample_name;
+    std::string _sample_name;
     unsigned char *_data;
 
     // configuration values
@@ -326,7 +322,6 @@ public:
     /**
      * Set position of the sound source (uses same coordinate system as opengl)
      */
-    void set_base_position( SGVec3d pos );
     void set_relative_position( SGVec3f pos );
 
     /**
@@ -335,16 +330,20 @@ public:
     inline float *get_position() const { return toVec3f(_absolute_pos).data(); }
 
     /**
-     * Set the orientation of the sound source, both for direction
-     * and audio cut-off angles.
+     * Set the position of the sound source
+     */
+    void set_position( SGGeod pos );
+
+    /**
+     * Set the orientation of the sound source
      */
-    void set_orientation( SGVec3f ori );
+    void set_orientation( SGQuatd ori );
 
     /**
      * Set the relative direction of the sound source, both for direction
      * and audio cut-off angles.
      */
-    void set_direction( SGVec3f dir );
+    void set_direction( SGVec3d dir );
 
     /**
      * Define the audio cone parameters for directional audio
@@ -369,14 +368,15 @@ public:
     /**
      * Set velocity of the sound source (uses same coordinate system as opengl)
      */
-    inline void set_velocity( SGVec3f vel ) {
-        _velocity = SGVec3f(vel); _changed = true;
+    inline void set_velocity( SGVec3d& vel ) {
+        _velocity = vel;
+        _changed = true;
     }
 
     /**
      * Get velocity of the sound source (uses same coordinate system as opengl)
      */
-    inline float *get_velocity() { return _velocity.data(); }
+    inline float *get_velocity() { return toVec3f(_velocity).data(); }
 
 
     /**
@@ -411,7 +411,7 @@ public:
     /**
      * Get the name of this sample
      */
-    inline string get_sample_name() { return _sample_name; }
+    inline std::string get_sample_name() { return _sample_name; }
 };
 
 
index 11a10fde1c5ebecdc17680762299c7a5ac1aacac..12c4b9540fc427e38e55a30b3d15d8398b8d410a 100644 (file)
@@ -59,8 +59,9 @@ SGSoundMgr::SGSoundMgr() :
     _volume(0.0),
     _device(NULL),
     _context(NULL),
-    _position(SGVec3d::zeros().data()),
-    _velocity(SGVec3f::zeros().data()),
+    _position(SGVec3d::zeros()),
+    _velocity(SGVec3d::zeros()),
+    _orientation(SGQuatd::zeros()),
     _devname(NULL)
 {
 #if defined(ALUT_API_MAJOR_VERSION) && ALUT_API_MAJOR_VERSION >= 1
@@ -111,13 +112,13 @@ void SGSoundMgr::init() {
     _context = context;
     _working = true;
 
-    _orientation[0] = 0.0; _orientation[1] = 0.0; _orientation[2] = -1.0;
-    _orientation[3] = 0.0; _orientation[4] = 1.0; _orientation[5] = 0.0;
+    _at_up_vec[0] = 0.0; _at_up_vec[1] = 0.0; _at_up_vec[2] = -1.0;
+    _at_up_vec[3] = 0.0; _at_up_vec[4] = 1.0; _at_up_vec[5] = 0.0;
 
     alListenerf( AL_GAIN, 0.2f );
-    alListenerfv( AL_POSITION, toVec3f(_position).data() );
-    alListenerfv( AL_ORIENTATION, _orientation );
-    alListenerfv( AL_VELOCITY, _velocity.data() );
+    alListenerfv( AL_POSITION, SGVec3f::zeros().data() );
+    alListenerfv( AL_ORIENTATION, _at_up_vec );
+    alListenerfv( AL_VELOCITY, toVec3f(_velocity).data() );
 
     alDopplerFactor(0.5);
     alDopplerVelocity(340.3);   // speed of sound in meters per second.
@@ -227,9 +228,9 @@ void SGSoundMgr::update_late( double dt ) {
 
         if (_changed) {
             alListenerf( AL_GAIN, _volume );
-            alListenerfv( AL_VELOCITY, _velocity.data() );
-            alListenerfv( AL_ORIENTATION, _orientation );
+            alListenerfv( AL_ORIENTATION, _at_up_vec );
             alListenerfv( AL_POSITION, toVec3f(_position).data() );
+            alListenerfv( AL_VELOCITY, toVec3f(_velocity).data() );
             // alDopplerVelocity(340.3);       // TODO: altitude dependent
             testForALError("update");
             _changed = false;
@@ -334,14 +335,16 @@ void SGSoundMgr::set_volume( float v )
  */
 void SGSoundMgr::set_orientation( SGQuatd ori )
 {
+    _orientation = ori;
+
     SGVec3d sgv_up = ori.rotate(SGVec3d::e2());
     SGVec3d sgv_at = ori.rotate(SGVec3d::e3());
-    _orientation[0] = sgv_at[0];
-    _orientation[1] = sgv_at[1];
-    _orientation[2] = sgv_at[2];
-    _orientation[3] = sgv_up[0];
-    _orientation[4] = sgv_up[1];
-    _orientation[5] = sgv_up[2];
+    _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];
     _changed = true;
 }
 
index ba1e55224203cdbf485b0a9df5cc518be7c26846..4baad69b0805e45548f3c1cfb7d6823b405236ca 100644 (file)
@@ -134,35 +134,32 @@ public:
     /**
      * set the position of the listener (in opengl coordinates)
      */
-    void set_position( SGVec3d pos ) {
-        if (_position != pos) {
-            _position = pos;
-            _changed = true;
-        }
+    void set_position( const SGVec3d& pos ) {
+        _position = -pos;
+        _changed = true;
     }
 
-    inline double *get_position() { return _position.data(); }
-    inline SGVec3d get_position_vec() { return _position; };
+    inline SGVec3f get_position() { return toVec3f(_position); }
 
     /**
-     * set the velocity of the listener (in opengl coordinates)
+     * set the velocity direction of the listener (in opengl coordinates)
      */
-    void set_velocity( SGVec3f vel ) {
-        if (_velocity != vel) {
-            _velocity = vel;
-            _changed = true;
-        }
+    void set_velocity( SGVec3d& dir ) {
+        _velocity = dir;
+        _changed = true;
     }
 
-    inline SGVec3f get_velocity() { return _velocity; }
+    inline SGVec3f get_velocity() { return toVec3f(_velocity); }
 
     /**
      * set the orientation of the listener (in opengl coordinates)
      */
     void set_orientation( SGQuatd ori );
 
+    inline const SGQuatd& get_orientation() { return _orientation; }
+
     inline SGVec3f get_direction() {
-        return SGVec3f(_orientation[0], _orientation[1], _orientation[2]);
+        return SGVec3f(_at_up_vec[0], _at_up_vec[1], _at_up_vec[2]);
     }
 
     enum {
@@ -221,11 +218,12 @@ private:
     SGVec3d _position;
 
     // Velocity of the listener.
-    SGVec3f _velocity;
+    SGVec3d _velocity;
 
     // Orientation of the listener. 
     // first 3 elements are "at" vector, second 3 are "up" vector
-    ALfloat _orientation[6];
+    SGQuatd _orientation;
+    ALfloat _at_up_vec[6];
 
     sample_group_map _sample_groups;
     buffer_map _buffers;
index 9fe4fdb1e92b407a169ed165e3c1165c23a2a02a..4edad96066e1c53ebe0fd44b64046785b3137bfc 100644 (file)
@@ -240,20 +240,20 @@ SGXmlSound::init(SGPropertyNode *root, SGPropertyNode *node,
    //
    // Orientation
    //
-   SGVec3f dir = SGVec3f::zeros();
+   SGVec3d dir = SGVec3d::zeros();
    float inner, outer, outer_gain;
    inner = outer = 360.0;
    outer_gain = 0.0;
    prop = node->getChild("orientation");
    if ( prop != NULL ) {
-      dir[0] = prop->getDoubleValue("x", 0.0);
-      dir[1] = -prop->getDoubleValue("y", 0.0);
-      dir[2] = prop->getDoubleValue("z", 0.0);
+      dir = SGVec3d(-prop->getDoubleValue("x", 0.0),
+                    -prop->getDoubleValue("y", 0.0),
+                    -prop->getDoubleValue("z", 0.0));
       inner = prop->getDoubleValue("inner-angle", 360.0);
       outer = prop->getDoubleValue("outer-angle", 360.0);
       outer_gain = prop->getDoubleValue("outer-gain", 0.0);
    }
-   
+
    //
    // Initialize the sample
    //