void ListenerNode::updatePositionAndOrientation() { //get absolute transformation of node, by default OpenAL uses absolute transformations const float *absMatPtr; getTransMatrices( 0x0, &absMatPtr ); Matrix4f absMat( absMatPtr ); Vec3f trans, rot, scale; absMat.decompose( trans, rot, scale ); alListener3f( AL_POSITION, trans.x, trans.y, trans.z ); //remove translation absMat.x[12] = 0; absMat.x[13] = 0; absMat.x[14] = 0; Vec3f forward = ( absMat * Vec3f( 0, 0, -1 ) ).normalized(); Vec3f up = ( absMat * Vec3f( 0, 1, 0 ) ).normalized(); float orientation[6]; orientation[0] = forward.x; orientation[1] = forward.y; orientation[2] = forward.z; orientation[3] = up.x; orientation[4] = up.y; orientation[5] = up.z; alListenerfv( AL_ORIENTATION, orientation ); }
void SoundNode::onPostUpdate() { //this gets called after absolute transformation has been updated const float *absMatPtr; getTransMatrices( 0x0, &absMatPtr ); Matrix4f absMat( absMatPtr ); Vec3f trans, rot, scale; absMat.decompose( trans, rot, scale ); alSource3f( _source, AL_POSITION, trans.x, trans.y, trans.z ); }