Translate the source position separately

This is to handle the case where an app specifies the same values for the
source and listener, and expects centered panning. This fails due to floating-
point errors in the matrix, causing the result to be ever-so-slightly off of 0.

This error would normally be hidden by the position normalization, which will
not lengthen a distance shorter than the reference distance so the panning
would be nearly imperceptible. But that also fails if the reference distance
is set to 0, causing the position to expand to a full unit.

Keep the 4x4 matrix calculations, however. It will still be useful for the
requested listener matrix extension.
This commit is contained in:
Chris Robinson 2010-04-16 02:09:53 -07:00
parent 000d848f0b
commit fc2473f826

View File

@ -580,7 +580,7 @@ static ALvoid CalcSourceParams(const ALCcontext *ALContext, ALsource *ALSource)
//1. Translate Listener to origin (convert to head relative)
if(ALSource->bHeadRelative==AL_FALSE)
{
ALfloat U[3],V[3],N[3],P[3];
ALfloat U[3],V[3],N[3];
// Build transform matrix
memcpy(N, ALContext->Listener.Forward, sizeof(N)); // At-vector
@ -589,19 +589,15 @@ static ALvoid CalcSourceParams(const ALCcontext *ALContext, ALsource *ALSource)
aluNormalize(V); // Normalized Up-vector
aluCrossproduct(N, V, U); // Right-vector
aluNormalize(U); // Normalized Right-vector
P[0] = -(ALContext->Listener.Position[0]*U[0] + // Translation
ALContext->Listener.Position[1]*U[1] +
ALContext->Listener.Position[2]*U[2]);
P[1] = -(ALContext->Listener.Position[0]*V[0] +
ALContext->Listener.Position[1]*V[1] +
ALContext->Listener.Position[2]*V[2]);
P[2] = -(ALContext->Listener.Position[0]*-N[0] +
ALContext->Listener.Position[1]*-N[1] +
ALContext->Listener.Position[2]*-N[2]);
Matrix[0][0] = U[0]; Matrix[0][1] = V[0]; Matrix[0][2] = -N[0]; Matrix[0][3] = 0.0f;
Matrix[1][0] = U[1]; Matrix[1][1] = V[1]; Matrix[1][2] = -N[1]; Matrix[1][3] = 0.0f;
Matrix[2][0] = U[2]; Matrix[2][1] = V[2]; Matrix[2][2] = -N[2]; Matrix[2][3] = 0.0f;
Matrix[3][0] = P[0]; Matrix[3][1] = P[1]; Matrix[3][2] = P[2]; Matrix[3][3] = 1.0f;
Matrix[3][0] = 0.0f; Matrix[3][1] = 0.0f; Matrix[3][2] = 0.0f; Matrix[3][3] = 1.0f;
// Translate position
Position[0] -= ALContext->Listener.Position[0];
Position[1] -= ALContext->Listener.Position[1];
Position[2] -= ALContext->Listener.Position[2];
// Transform source position and direction into listener space
aluMatrixVector(Position, 1.0f, Matrix);