small code reorganization and addition of debugging tests.
This commit is contained in:
@@ -29,6 +29,10 @@
|
|||||||
#include "soundmgr_openal.hxx"
|
#include "soundmgr_openal.hxx"
|
||||||
#include "sample_group.hxx"
|
#include "sample_group.hxx"
|
||||||
|
|
||||||
|
bool isNaN(float *v) {
|
||||||
|
return (isnan(v[0]) || isnan(v[1]) || isnan(v[2]));
|
||||||
|
}
|
||||||
|
|
||||||
SGSampleGroup::SGSampleGroup () :
|
SGSampleGroup::SGSampleGroup () :
|
||||||
_smgr(NULL),
|
_smgr(NULL),
|
||||||
_refname(""),
|
_refname(""),
|
||||||
@@ -359,15 +363,26 @@ void SGSampleGroup::update_sample_config( SGSoundSample *sample ) {
|
|||||||
if ( sample->is_valid_source() ) {
|
if ( sample->is_valid_source() ) {
|
||||||
unsigned int source = sample->get_source();
|
unsigned int source = sample->get_source();
|
||||||
|
|
||||||
if ( _tied_to_listener && _smgr->has_changed() ) {
|
float *position, *orientation, *velocity;
|
||||||
alSourcefv( source, AL_POSITION, _smgr->get_position().data() );
|
if ( _tied_to_listener ) {
|
||||||
alSourcefv( source, AL_VELOCITY, _smgr->get_velocity().data() );
|
position = _smgr->get_position().data();
|
||||||
alSourcefv( source, AL_DIRECTION, _smgr->get_direction().data() );
|
orientation = _smgr->get_velocity().data();
|
||||||
|
velocity = _smgr->get_direction().data();
|
||||||
} else {
|
} else {
|
||||||
alSourcefv( source, AL_POSITION, sample->get_position() );
|
sample->update_absolute_position();
|
||||||
alSourcefv( source, AL_VELOCITY, sample->get_velocity() );
|
position = sample->get_position();
|
||||||
alSourcefv( source, AL_DIRECTION, sample->get_orientation() );
|
orientation = sample->get_velocity();
|
||||||
|
velocity = sample->get_orientation();
|
||||||
}
|
}
|
||||||
|
if (dist(_smgr->get_position(), sample->get_position_vec()) > 50000)
|
||||||
|
printf("source and listener distance greater than 50km!\n");
|
||||||
|
if (isNaN(position)) printf("NaN in source position\n");
|
||||||
|
if (isNaN(orientation)) printf("NaN in source orientation\n");
|
||||||
|
if (isNaN(velocity)) printf("NaN in source velocity\n");
|
||||||
|
|
||||||
|
alSourcefv( source, AL_POSITION, position );
|
||||||
|
alSourcefv( source, AL_VELOCITY, velocity );
|
||||||
|
alSourcefv( source, AL_DIRECTION, orientation );
|
||||||
testForALError("position and orientation");
|
testForALError("position and orientation");
|
||||||
|
|
||||||
alSourcef( source, AL_PITCH, sample->get_pitch() );
|
alSourcef( source, AL_PITCH, sample->get_pitch() );
|
||||||
|
|||||||
@@ -195,51 +195,24 @@ SGSoundSample::~SGSoundSample() {
|
|||||||
_data = NULL;
|
_data = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SGSoundSample::set_orientation( const SGQuatd& ori ) {
|
|
||||||
_orientation = ori;
|
|
||||||
update_absolute_position();
|
|
||||||
_changed = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void SGSoundSample::set_direction( const SGVec3d& dir ) {
|
|
||||||
_direction = dir;
|
|
||||||
update_absolute_position();
|
|
||||||
_changed = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void SGSoundSample::set_relative_position( const SGVec3f& pos ) {
|
|
||||||
_relative_pos = toVec3d(pos);
|
|
||||||
update_absolute_position();
|
|
||||||
_changed = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void SGSoundSample::set_position( const SGGeod& pos ) {
|
|
||||||
_base_pos = pos;
|
|
||||||
update_absolute_position();
|
|
||||||
_changed = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void SGSoundSample::update_absolute_position() {
|
void SGSoundSample::update_absolute_position() {
|
||||||
// SGQuatd orient = SGQuatd::fromLonLat(_base_pos) * _orientation;
|
|
||||||
// _orivec = -toVec3f(orient.rotate(-SGVec3d::e1()));
|
|
||||||
|
|
||||||
// The rotation rotating from the earth centerd frame to
|
// The rotation rotating from the earth centerd frame to
|
||||||
// the horizontal local frame
|
// the horizontal local frame
|
||||||
SGQuatd hlOr = SGQuatd::fromLonLat(_base_pos);
|
SGQuatd hlOr = SGQuatd::fromLonLat(_base_pos);
|
||||||
|
|
||||||
// Compute the eyepoints orientation and position
|
// Compute the sounds orientation and position
|
||||||
// wrt the earth centered frame - that is global coorinates
|
// wrt the earth centered frame - that is global coorinates
|
||||||
SGQuatd ec2body = hlOr*_orientation;
|
SGQuatd sc2body = _orientation*hlOr;
|
||||||
|
|
||||||
// This is rotates the x-forward, y-right, z-down coordinate system where
|
// 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.
|
// simulation runs into the OpenGL camera system with x-right, y-up, z-back.
|
||||||
SGQuatd q(-0.5, -0.5, 0.5, 0.5);
|
SGQuatd q(-0.5, -0.5, 0.5, 0.5);
|
||||||
|
|
||||||
// The cartesian position of the basic view coordinate
|
// The cartesian position of the base sound coordinate
|
||||||
SGVec3d position = SGVec3d::fromGeod(_base_pos);
|
SGVec3d position = SGVec3d::fromGeod(_base_pos);
|
||||||
|
|
||||||
_absolute_pos = position + (ec2body*q).backTransform(_relative_pos);
|
_absolute_pos = position + (sc2body*q).backTransform(_relative_pos);
|
||||||
_orivec = toVec3f( (ec2body*q).backTransform(_direction) );
|
_orivec = toVec3f( (sc2body*q).backTransform(_direction) );
|
||||||
}
|
}
|
||||||
|
|
||||||
string SGSoundSample::random_string() {
|
string SGSoundSample::random_string() {
|
||||||
@@ -252,3 +225,4 @@ string SGSoundSample::random_string() {
|
|||||||
|
|
||||||
return rstr;
|
return rstr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -303,13 +303,17 @@ public:
|
|||||||
* This is in the same coordinate system as OpenGL; y=up, z=back, x=right.
|
* This is in the same coordinate system as OpenGL; y=up, z=back, x=right.
|
||||||
* @param pos Relative position of this sound
|
* @param pos Relative position of this sound
|
||||||
*/
|
*/
|
||||||
void set_relative_position( const SGVec3f& pos );
|
inline void set_relative_position( const SGVec3f& pos ) {
|
||||||
|
_relative_pos = toVec3d(pos); _changed = true;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the base position of this sound in Geodetic coordinates.
|
* Set the base position of this sound in Geodetic coordinates.
|
||||||
* @param pos Geodetic position
|
* @param pos Geodetic position
|
||||||
*/
|
*/
|
||||||
void set_position( const SGGeod& pos );
|
inline void set_position( const SGGeod& pos ) {
|
||||||
|
_base_pos = pos; _changed = true;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the absolute position of this sound.
|
* Get the absolute position of this sound.
|
||||||
@@ -317,19 +321,24 @@ public:
|
|||||||
* @return Absolute position
|
* @return Absolute position
|
||||||
*/
|
*/
|
||||||
float *get_position() const { return toVec3f(_absolute_pos).data(); }
|
float *get_position() const { return toVec3f(_absolute_pos).data(); }
|
||||||
|
SGVec3f get_position_vec() const { return toVec3f(_absolute_pos); }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the orientation of this sound.
|
* Set the orientation of this sound.
|
||||||
* @param ori Quaternation containing the orientation information
|
* @param ori Quaternation containing the orientation information
|
||||||
*/
|
*/
|
||||||
void set_orientation( const SGQuatd& ori );
|
inline void set_orientation( const SGQuatd& ori ) {
|
||||||
|
_orientation = ori; _changed = true;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set direction of this sound relative to the orientation.
|
* Set direction of this sound relative to the orientation.
|
||||||
* This is in the same coordinate system as OpenGL; y=up, z=back, x=right
|
* This is in the same coordinate system as OpenGL; y=up, z=back, x=right
|
||||||
* @param dir Sound emission direction
|
* @param dir Sound emission direction
|
||||||
*/
|
*/
|
||||||
void set_direction( const SGVec3d& dir );
|
inline void set_direction( const SGVec3d& dir ) {
|
||||||
|
_direction = dir; _changed = true;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Define the audio cone parameters for directional audio.
|
* Define the audio cone parameters for directional audio.
|
||||||
@@ -426,6 +435,8 @@ public:
|
|||||||
*/
|
*/
|
||||||
inline std::string get_sample_name() const { return _refname; }
|
inline std::string get_sample_name() const { return _refname; }
|
||||||
|
|
||||||
|
void update_absolute_position();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
// Position of the source sound.
|
// Position of the source sound.
|
||||||
@@ -472,7 +483,6 @@ private:
|
|||||||
bool _static_changed;
|
bool _static_changed;
|
||||||
bool _is_file;
|
bool _is_file;
|
||||||
|
|
||||||
void update_absolute_position();
|
|
||||||
string random_string();
|
string random_string();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user