gecko-dev/content/media/webaudio/ThreeDPoint.cpp
Karl Tomlinson 4affe59604 b=907986 normalize orientation vectors early and keep existing state if directions are undefined r=padenot
Normalizing the AudioListener front orientation vectors before taking their
cross product avoids the possibility of overflow.

The panning effect and the azimuth and elevation calculation in the Web Audio
spec becomes undefined with linearly dependent listener vectors, so keep
existing state in these situations.

PannerNode orientation is normalized for consistency, but zero is permitted
for this vector because the sound cone algorithm in the Web Audio specifies
behavior for this case.

--HG--
extra : transplant_source : %DA%C7e%E7%90%14%AF%EA%08%94x%C1%A2g%F1%9A%EE%16%EB%29
2013-09-04 21:20:59 +12:00

50 lines
1.2 KiB
C++

/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim:set ts=2 sw=2 sts=2 et cindent: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
/**
* Other similar methods can be added if needed.
*/
#include "ThreeDPoint.h"
#include "WebAudioUtils.h"
namespace mozilla {
namespace dom {
bool
ThreeDPoint::FuzzyEqual(const ThreeDPoint& other)
{
return WebAudioUtils::FuzzyEqual(x, other.x) &&
WebAudioUtils::FuzzyEqual(y, other.y) &&
WebAudioUtils::FuzzyEqual(z, other.z);
}
ThreeDPoint operator-(const ThreeDPoint& lhs, const ThreeDPoint& rhs)
{
return ThreeDPoint(lhs.x - rhs.x, lhs.y - rhs.y, lhs.z - rhs.z);
}
ThreeDPoint operator*(const ThreeDPoint& lhs, const ThreeDPoint& rhs)
{
return ThreeDPoint(lhs.x * rhs.x, lhs.y * rhs.y, lhs.z * rhs.z);
}
ThreeDPoint operator*(const ThreeDPoint& lhs, const double rhs)
{
return ThreeDPoint(lhs.x * rhs, lhs.y * rhs, lhs.z * rhs);
}
bool operator==(const ThreeDPoint& lhs, const ThreeDPoint& rhs)
{
return lhs.x == rhs.x &&
lhs.y == rhs.y &&
lhs.z == rhs.z;
}
}
}