123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 |
- #pragma once
- #include "AkInclude.h"
- #include "AkAudioDevice.h"
- #include "WorldCollision.h"
- #include "HAL/ThreadSafeBool.h"
- #define NUM_BOUNDING_BOX_TRACE_POINTS 12
- class UAkComponent;
- class AActor;
- class AAkAcousticPortal;
- struct FAkListenerObstructionAndOcclusion
- {
- float CurrentValue;
- float TargetValue;
- float Rate;
- FAkListenerObstructionAndOcclusion(float in_TargetValue = 0.0f, float in_CurrentValue = 0.0f);
- void SetTarget(float in_TargetValue);
- bool ReachedTarget();
- bool Update(float DeltaTime);
- };
- struct FAkListenerObstructionAndOcclusionPair
- {
- FAkListenerObstructionAndOcclusionPair();
- FAkListenerObstructionAndOcclusion Occ;
- FAkListenerObstructionAndOcclusion Obs;
- FVector Position;
- bool Update(float DeltaTime);
- bool ReachedTarget();
-
- void AsyncTraceFromSource(const FVector& SourcePosition, const FVector& EndPosition, int BoundingBoxPointIndex, ECollisionChannel CollisionChannel, UWorld* World, const FCollisionQueryParams& CollisionParams);
-
- void AsyncTraceFromListener(const FVector& ListenerPosition, const FVector& EndPosition, int BoundingBoxPointIndex, ECollisionChannel CollisionChannel, UWorld* World, const FCollisionQueryParams& CollisionParams);
-
- int GetCollisionCount();
- void Reset();
-
- void CheckTraceResults(UWorld* World);
- private:
-
- int CurrentCollisionCount = 0;
- TArray<FTraceHandle> SourceTraceHandles;
- TArray<FTraceHandle> ListenerTraceHandles;
-
- void CheckListenerTraceHandles(UWorld* World);
-
- void CheckSourceTraceHandles(UWorld* World);
- TArray<FThreadSafeBool> SourceRayCollisions;
- TArray<FThreadSafeBool> ListenerRayCollisions;
- };
- class AKAUDIO_API AkObstructionAndOcclusionService
- {
- public:
- void Tick(const UAkComponentSet& in_Listeners, const FVector& SourcePosition, const AActor* Actor, AkRoomID RoomID, ECollisionChannel in_collisionChannel, float DeltaTime, float OcclusionRefreshInterval);
-
- void UpdateObstructionAndOcclusion(const UAkComponentSet& in_Listeners, const FVector& SourcePosition, const AActor* Actor, AkRoomID RoomID, ECollisionChannel in_collisionChannel, float OcclusionRefreshInterval);
- void ClearOcclusionValues();
- virtual void SetObstructionAndOcclusion(AkGameObjectID ListenerID, float Value) = 0;
- virtual ~AkObstructionAndOcclusionService() {}
- protected:
- void _Init(UWorld* in_world, float in_refreshInterval);
- private:
-
- void RefreshObstructionAndOcclusion(const UAkComponentSet& in_Listeners, const FVector& SourcePosition, const AActor* Actor, AkRoomID RoomID, ECollisionChannel in_collisionChannel, const float DeltaTime, float OcclusionRefreshInterval);
-
- void SetObstructionAndOcclusion(const UAkComponentSet& in_Listeners, AkRoomID RoomID);
-
- void CalculateObstructionAndOcclusionValues(const UAkComponentSet& in_Listeners, const FVector& SourcePosition, const AActor* Actor, AkRoomID RoomID, ECollisionChannel in_collisionChannel, bool bAsync = true);
-
- float LastObstructionAndOcclusionRefresh = -1;
- float PreviousRefreshInterval = -1.0f;
- bool ClearingObstructionAndOcclusion = false;
- typedef AkGameObjectIdKeyFuncs<FAkListenerObstructionAndOcclusionPair, false> ListenerOccObsPairGameObjectIDKeyFuncs;
- TMap<AkGameObjectID, FAkListenerObstructionAndOcclusionPair, FDefaultSetAllocator, ListenerOccObsPairGameObjectIDKeyFuncs> ListenerInfoMap;
- };
|