Mark Harmstone : dsound: Fix 3D positioning bug with head-relative buffers.
Alexandre Julliard
julliard at wine.codeweavers.com
Tue Feb 3 10:01:12 CST 2015
Module: wine
Branch: master
Commit: 1c73ce1ee78e417e55550d05e4fd0fad8d3099f2
URL: http://source.winehq.org/git/wine.git/?a=commit;h=1c73ce1ee78e417e55550d05e4fd0fad8d3099f2
Author: Mark Harmstone <hellas at burntcomma.com>
Date: Mon Feb 2 23:55:39 2015 +0000
dsound: Fix 3D positioning bug with head-relative buffers.
---
dlls/dsound/sound3d.c | 19 +++++++++++--------
1 file changed, 11 insertions(+), 8 deletions(-)
diff --git a/dlls/dsound/sound3d.c b/dlls/dsound/sound3d.c
index f720478..c53783e 100644
--- a/dlls/dsound/sound3d.c
+++ b/dlls/dsound/sound3d.c
@@ -181,13 +181,14 @@ void DSOUND_Calc3DBuffer(IDirectSoundBufferImpl *dsb)
case DS3DMODE_NORMAL:
TRACE("Normal 3D processing mode\n");
/* we need to calculate distance between buffer and listener*/
- vDistance = VectorBetweenTwoPoints(&dsb->ds3db_ds3db.vPosition, &dsb->device->ds3dl.vPosition);
+ vDistance = VectorBetweenTwoPoints(&dsb->device->ds3dl.vPosition, &dsb->ds3db_ds3db.vPosition);
flDistance = VectorMagnitude (&vDistance);
break;
case DS3DMODE_HEADRELATIVE:
TRACE("Head-relative 3D processing mode\n");
/* distance between buffer and listener is same as buffer's position */
- flDistance = VectorMagnitude (&dsb->ds3db_ds3db.vPosition);
+ vDistance = dsb->ds3db_ds3db.vPosition;
+ flDistance = VectorMagnitude (&vDistance);
break;
}
@@ -220,8 +221,14 @@ void DSOUND_Calc3DBuffer(IDirectSoundBufferImpl *dsb)
}
else
{
+ D3DVECTOR vDistanceInv;
+
+ vDistanceInv.x = -vDistance.x;
+ vDistanceInv.y = -vDistance.y;
+ vDistanceInv.z = -vDistance.z;
+
/* calculate angle */
- flAngle = AngleBetweenVectorsDeg(&dsb->ds3db_ds3db.vConeOrientation, &vDistance);
+ flAngle = AngleBetweenVectorsDeg(&dsb->ds3db_ds3db.vConeOrientation, &vDistanceInv);
/* if by any chance it happens that OutsideConeAngle = InsideConeAngle (that means that conning has no effect) */
if (dsb->ds3db_ds3db.dwInsideConeAngle != dsb->ds3db_ds3db.dwOutsideConeAngle)
{
@@ -254,14 +261,10 @@ void DSOUND_Calc3DBuffer(IDirectSoundBufferImpl *dsb)
}
/* panning */
- if (dsb->device->ds3dl.vPosition.x == dsb->ds3db_ds3db.vPosition.x &&
- dsb->device->ds3dl.vPosition.y == dsb->ds3db_ds3db.vPosition.y &&
- dsb->device->ds3dl.vPosition.z == dsb->ds3db_ds3db.vPosition.z) {
+ if (vDistance.x == 0.0f && vDistance.y == 0.0f && vDistance.z == 0.0f)
flAngle = 0.0;
- }
else
{
- vDistance = VectorBetweenTwoPoints(&dsb->device->ds3dl.vPosition, &dsb->ds3db_ds3db.vPosition);
vLeft = VectorProduct(&dsb->device->ds3dl.vOrientFront, &dsb->device->ds3dl.vOrientTop);
flAngle = AngleBetweenVectorsRad(&dsb->device->ds3dl.vOrientFront, &vDistance);
flAngle2 = AngleBetweenVectorsRad(&vLeft, &vDistance);
More information about the wine-cvs
mailing list