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 );
}
Example #2
0
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 );
}