37#include <memory_resource>
42 template<CVec3 Vec3Type>
87 template<
class Key,
class T>
118 template<CVec3 Vec3Type>
121 template<CVec3 Vec3Type>
179 static JPL_INLINE
float ProcessAngleAttenuationImpl(
float azimutCos,
const AttenuationCone& cone);
182 using CurveAttenuationCacheArray = std::pmr::vector<CurveAttenuationCache>;
200 mAttenuationCache.emplace(handle,
205 mDirectionAttenuationCache.emplace(handle,
213 return mAttenuationCache.erase(source) + mDirectionAttenuationCache.erase(source);
218 if (!source.
IsValid() || !attenuationFunction)
222 auto& cache = mAttenuationCache[source];
223 return cache.emplace_back(attenuationFunction, 1.0f).Curve;
229 auto it = mAttenuationCache.find(source);
230 if (it == mAttenuationCache.end())
233 auto cache = std::ranges::find(it->second, curve, [](
const CurveAttenuationCache& cache) { return cache.Curve; });
234 if (cache != std::ranges::end(it->second))
242 auto it = mDirectionAttenuationCache.find(source);
243 if (it == mDirectionAttenuationCache.end())
246 return it->second.AttenuationValue;
251 return attenuationCurve->Evaluate(distance);
256 auto it = mAttenuationCache.find(source);
257 if (it == mAttenuationCache.end())
268 auto it = mDirectionAttenuationCache.find(source);
269 if (it == mDirectionAttenuationCache.end())
272 JPL_ASSERT(directionDot >= -1.0f && directionDot <= 1.0f);
274 it->second.AttenuationValue = ProcessAngleAttenuationImpl(directionDot, it->second.Cone);
279 template<CVec3 Vec3Type>
282 static const Vec3Type cForwardAxis(0, 0, -1);
285 const Vec3Type sourceRelativePosition = source.
Location - listener.
Location;
287 Vec3Type sourcePosInListenerFrame = listenerBasis.
InverseTransform(sourceRelativePosition);
293 sourcePosInListenerFrame += cForwardAxis * 1e-5f;
297 const float distance = Length(sourcePosInListenerFrame);
298 const Vec3Type dirRelativeToListener = sourcePosInListenerFrame / distance;
299 const float directionDot = DotProduct(dirRelativeToListener, cForwardAxis);
302 const Vec3Type& sourceForward = source.
Orientation.Forward;
303 const Vec3Type listenerToSourceDir = listenerBasis.
InverseTransform(-dirRelativeToListener);
304 const float invDirectionDot = DotProduct(sourceForward, listenerToSourceDir);
316 sourcePosInListenerFrame += cForwardAxis * 1e-5f;
320 const float distance = Length(sourcePosInListenerFrame);
321 const Vec3Type dirRelativeToListener = sourcePosInListenerFrame / distance;
322 const float directionDot = DotProduct(dirRelativeToListener, cForwardAxis);
325 const Vec3Type sourceForward = source.
Orientation.ToQuat().Rotate(cForwardAxis);
326 const Vec3Type listenerToSourceDir = listener.
Orientation.ToQuat().Conjugated().Rotate(-dirRelativeToListener);
327 const float invDirectionDot = DotProduct(sourceForward, listenerToSourceDir);
334 .Distance = distance,
335 .DirectionDot = directionDot,
336 .InvDirectionDot = invDirectionDot,
338 .Location = dirRelativeToListener,
339 .Orientation = {.Up = sourceToListenerOrientation.
Y, .Forward = sourceToListenerOrientation.
Z}
344 JPL_INLINE
float DirectPathService::ProcessAngleAttenuationImpl(
float azimutCos,
const AttenuationCone& cone)
347 const float cutoffInner = std::cos(cone.
InnerAngle * 0.5f);
348 const float cutoffOuter = std::cos(cone.
OuterAngle * 0.5f);
352 if (azimutCos > cutoffInner)
355 if (azimutCos > cutoffOuter)
358 factor = (cutoffInner - azimutCos) / (cutoffInner - cutoffOuter);
377 return ProcessAngleAttenuationImpl(std::cos(azimuth), cone);
380 template<CVec3 Vec3Type>
394 const Vec3Type referenceForward = referencePoint.
Orientation.Forward;
395 const Vec3Type sourceDirection = Normalized(position - referencePoint.
Location);
396 const float dot = DotProduct(referenceForward, sourceDirection);
398 return ProcessAngleAttenuationImpl(dot, cone);
#define JPL_ASSERT(inExpression,...)
Main assert macro, usage: JPL_ASSERT(condition, message) or JPL_ASSERT(condition)
Definition ErrorReporting.h:80
Definition DirectPathService.h:84
JPL_INLINE bool ReleaseEffectData(DirectEffectHandle source)
Definition DirectPathService.h:211
JPL_INLINE float GetDistanceAttenuation(DirectEffectHandle source, const AttenuationCurveRef &curve) const
Definition DirectPathService.h:227
DirectPathService(const DirectPathService &)=delete
DirectPathService & operator=(const DirectPathService &)=delete
FlatMapWithAllocator< Key, T, std::pmr::polymorphic_allocator > FlatMapType
Definition DirectPathService.h:88
static JPL_INLINE float ProcessAngleAttenuation(const Vec3Type &position, const Position< Vec3Type > &referencePoint, AttenuationCone cone)
Definition DirectPathService.h:381
static JPL_INLINE DirectPathResult< Vec3Type > ProcessDirectPath(const Position< Vec3Type > &source, const Position< Vec3Type > &listener)
Definition DirectPathService.h:280
JPL_INLINE AttenuationCurveRef AssignAttenuationCurve(DirectEffectHandle source, AttenuationCurveRef attenuationFunction)
Definition DirectPathService.h:216
JPL_INLINE float GetDirectionAttenuation(DirectEffectHandle source) const
Definition DirectPathService.h:240
JPL_INLINE bool EvaluateDirection(DirectEffectHandle source, float directionDot)
Definition DirectPathService.h:266
JPL_INLINE DirectEffectHandle InitializeDirrectEffect(const DirectEffectInitParameters &initParameters)
Definition DirectPathService.h:197
DirectPathService()=default
static JPL_INLINE float EvaluateDistance(float distance, const AttenuationCurveRef &attenuationCurve)
Definition DirectPathService.h:249
JPL_INLINE constexpr bool IsNearlyZero(T value, T errorTolerance=JPL_FLOAT_EPS_V< T >) noexcept
Definition Math.h:146
JPL_INLINE constexpr bool IsNearlyEqual(T a, T b, T tolerance=JPL_FLOAT_EPS_V< T >) noexcept
Definition Math.h:152
Definition AcousticMaterial.h:36
JPL_INLINE auto GetX(const Vec3Type &v) noexcept
Definition Vec3Traits.h:35
std::shared_ptr< AttenuationFunction > AttenuationCurveRef
Definition DirectPathService.h:58
JPL_INLINE auto GetZ(const Vec3Type &v) noexcept
Definition Vec3Traits.h:37
std::pmr::memory_resource * GetDefaultMemoryResource() noexcept
Definition Memory.h:42
Definition DirectPathService.h:53
float OuterAngle
Definition DirectPathService.h:55
float InnerAngle
Definition DirectPathService.h:54
Orthonormal basis (column-major)
Definition MinimalBasis.h:35
JPL_INLINE Vec3 InverseTransform(const Vec3 &pWorld) const noexcept
Apply rotation world -> local.
Definition MinimalBasis.h:99
Vec3 Z
Definition MinimalBasis.h:38
Vec3 Y
Definition MinimalBasis.h:38
Definition DirectPathService.h:68
float AttenuationValue
Definition DirectPathService.h:70
AttenuationCone Cone
Definition DirectPathService.h:69
Definition DirectPathService.h:62
float AttenuationValue
Definition DirectPathService.h:64
AttenuationCurveRef Curve
Definition DirectPathService.h:63
Definition DirectPathService.h:77
JPL::AttenuationCone AttenuationCone
Definition DirectPathService.h:79
AttenuationCurveRef BaseCurve
Definition DirectPathService.h:78
Definition DirectPathService.h:44
float DirectionDot
Definition DirectPathService.h:46
float InvDirectionDot
Definition DirectPathService.h:47
float Distance
Definition DirectPathService.h:45
JPL::Position< Vec3Type > Position
Definition DirectPathService.h:49
Definition DirectPathService.h:73
static constexpr IDType New() noexcept
Definition IDType.h:44
constexpr bool IsValid() const noexcept
Definition IDType.h:46
Location and orientation in one place.
Definition Position.h:80
OrientationData< Vec3Type > Orientation
Definition Position.h:82
Vec3Type Location
Definition Position.h:81