-void
-FGFX::update_pos_and_orientation(SGSoundMgr *smgr, double dt)
-{
- SGModelPlacement *model = globals->get_aircraft_model()->get3DModel();
- FGViewer *observer = globals->get_current_view();
-
- // Right now we make a simplifying assumption that the primary
- // aircraft is the source of all sounds and that all sounds are
- // positioned in the aircraft base
- // EMH: Note: this is fine, to hear multiple aircraft simulataniously
- // we just have to trigger one instance of the FGFX class for every
- // aircraft
-
- // get the orientation
- const SGQuatd view_or = observer->getViewOrientation();
- SGQuatd surf_or = SGQuatd::fromLonLat(observer->getPosition());
-
- SGQuatd model_or = SGQuatd::fromYawPitchRollDeg(
- model->getHeadingDeg(),
- model->getPitchDeg(),
- model->getRollDeg());
-
- // get the up and at vector in the aircraft base
- // (ok, the up vector is a down vector, but the coordinates
- // are finally calculated in a left hand system and openal
- // lives in a right hand system. Therefore we need to pass
- // the down vector to get correct stereo sound.)
- SGVec3d sgv_up
- = model_or.rotateBack(surf_or.rotateBack(view_or.rotate(SGVec3d(0,1,0))));
- SGVec3d sgv_at
- = model_or.rotateBack(surf_or.rotateBack(view_or.rotate(SGVec3d(0,0,1))));
-
- // get the location data for the primary FDM (now hardcoded to ac model)...
- // EMH: to add multiple sound sources this should be replaced
- SGVec3d absolute_view_pos = SGVec3d::fromGeod(model->getPosition());
-
- // calculate speed of visitor and model
- SGVec3d moved = last_visitor_pos - observer->get_view_pos();
- last_visitor_pos = observer->get_view_pos();
- SGVec3f listener_vel(model_or.rotateBack(surf_or.rotateBack(moved)));
-
- moved = last_model_pos - absolute_view_pos;
- last_model_pos = absolute_view_pos;
- SGVec3f model_vel(model_or.rotateBack(surf_or.rotateBack(moved)));
-
- if (dt > 0) {
- model_vel /= dt;
- listener_vel /= dt;
- }
-
- // checking, if the listener pos has moved suddenly
- if (length(listener_vel) > 1000) {
- // check if the relative speed model vs listener has moved suddenly, too
- SGVec3f delta_vel = listener_vel - model_vel;
- if (length(delta_vel) > 1000)
- // a sane value
- smgr->set_listener_vel(model_vel.data());
- else
- smgr->set_listener_vel(listener_vel.data());
- } else {
- smgr->set_listener_vel( listener_vel.data());
- }
-
- // set positional offset for sources
- SGVec3d dsource_pos_offset = observer->get_view_pos() - absolute_view_pos;
- dsource_pos_offset = model_or.rotateBack(surf_or.rotateBack(
- dsource_pos_offset
- ));
-
- smgr->set_source_pos_all( SGVec3f(dsource_pos_offset).data() );
- smgr->set_source_vel_all(model_vel.data() );
-
- float orient[6];
- for (int i = 0; i < 3; i++) {
- orient[i] = sgv_at[i];
- orient[i + 3] = sgv_up[i];
- }
- smgr->set_listener_orientation( orient );
-
- // The listener is always positioned at the origin.
- smgr->set_listener_pos( SGVec3f::zeros().data() );
-}
-