Integrating up through commit 90f050496

This commit is contained in:
alexpete
2021-04-07 14:03:29 -07:00
parent 8f2ed080a9
commit c2cbd430fe
2694 changed files with 285622 additions and 176874 deletions
@@ -31,7 +31,6 @@
#include <IRenderAuxGeom.h>
#include <CryPhysicsDeprecation.h>
#include <AzFramework/Physics/World.h>
namespace Audio
{
@@ -687,6 +686,7 @@ namespace Audio
rayInfo.m_raycastRequest.m_direction = dest - origin;
rayInfo.m_raycastRequest.m_distance = rayInfo.m_raycastRequest.m_direction.NormalizeSafeWithLength();
rayInfo.m_raycastRequest.m_maxResults = s_maxHitResultsPerRaycast;
rayInfo.m_raycastRequest.m_reportMultipleHits = true;
// Mark as pending
rayInfo.m_pending = true;
@@ -21,7 +21,7 @@
#include <climits>
#include <AzFramework/Physics/Casts.h>
#include <AzFramework/Physics/Common/PhysicsSceneQueries.h>
struct IRenderAuxGeom;
@@ -229,11 +229,11 @@ namespace Audio
///////////////////////////////////////////////////////////////////////////////////////////////////
struct AudioRaycastRequest
{
Physics::RayCastRequest m_request{};
AzPhysics::RayCastRequest m_request{};
TAudioObjectID m_audioObjectId = INVALID_AUDIO_OBJECT_ID;
size_t m_rayIndex = 0;
AudioRaycastRequest(const Physics::RayCastRequest& request, TAudioObjectID audioObjectId, size_t rayId)
AudioRaycastRequest(const AzPhysics::RayCastRequest& request, TAudioObjectID audioObjectId, size_t rayId)
: m_request(request)
, m_audioObjectId(audioObjectId)
, m_rayIndex(rayId)
@@ -243,11 +243,11 @@ namespace Audio
///////////////////////////////////////////////////////////////////////////////////////////////////
struct AudioRaycastResult
{
AZStd::vector<Physics::RayCastHit> m_result{};
AZStd::vector<AzPhysics::SceneQueryHit> m_result{};
TAudioObjectID m_audioObjectId = INVALID_AUDIO_OBJECT_ID;
size_t m_rayIndex = 0;
AudioRaycastResult(AZStd::vector<Physics::RayCastHit>&& result, TAudioObjectID audioObjectId, size_t rayId)
AudioRaycastResult(AZStd::vector<AzPhysics::SceneQueryHit>&& result, TAudioObjectID audioObjectId, size_t rayId)
: m_result(AZStd::move(result))
, m_audioObjectId(audioObjectId)
, m_rayIndex(rayId)
@@ -290,8 +290,8 @@ namespace Audio
///////////////////////////////////////////////////////////////////////////////////////////////////
struct RaycastInfo
{
AZStd::fixed_vector<Physics::RayCastHit, s_maxHitResultsPerRaycast> m_hits;
Physics::RayCastRequest m_raycastRequest;
AZStd::fixed_vector<AzPhysics::SceneQueryHit, s_maxHitResultsPerRaycast> m_hits;
AzPhysics::RayCastRequest m_raycastRequest;
float m_contribution = 0.f;
float m_cacheTimerMs = 0.f;
AZ::u16 m_numHits = 0;
@@ -24,6 +24,9 @@
#include <AzFramework/FileFunc/FileFunc.h>
#include <AzFramework/Physics/PhysicsScene.h>
#include <AzFramework/Physics/Common/PhysicsSceneQueries.h>
#include <AudioFileUtils.h>
#include <ATLCommon.h>
#include <SoundCVars.h>
@@ -630,10 +633,40 @@ namespace Audio
m_raycastRequests.push_back(request);
}
AudioRaycastManager::AudioRaycastManager()
: m_sceneFinishSimHandler([this](
[[maybe_unused]] AzPhysics::SceneHandle sceneHandle,
[[maybe_unused]] float fixedDeltatime)
{
this->OnPhysicsSubtickFinished();
}, aznumeric_cast<int32_t>(AzPhysics::SceneEvents::PhysicsStartFinishSimulationPriority::Audio))
{
if (auto* sceneInterface = AZ::Interface<AzPhysics::SceneInterface>::Get())
{
AzPhysics::SceneHandle sceneHandle = sceneInterface->GetSceneHandle(AzPhysics::DefaultPhysicsSceneName);
sceneInterface->RegisterSceneSimulationFinishHandler(sceneHandle, m_sceneFinishSimHandler);
}
AudioRaycastRequestBus::Handler::BusConnect();
}
AudioRaycastManager::~AudioRaycastManager()
{
AudioRaycastRequestBus::Handler::BusDisconnect();
m_sceneFinishSimHandler.Disconnect();
}
///////////////////////////////////////////////////////////////////////////////////////////////////
void AudioRaycastManager::OnPostPhysicsSubtick([[maybe_unused]] float fixedDeltaTimeSeconds)
void AudioRaycastManager::OnPhysicsSubtickFinished()
{
// [Main Thread]
AzPhysics::SceneHandle sceneHandle = AzPhysics::InvalidSceneHandle;
auto* sceneInterface = AZ::Interface<AzPhysics::SceneInterface>::Get();
if (sceneInterface != nullptr)
{
sceneHandle = sceneInterface->GetSceneHandle(AzPhysics::DefaultPhysicsSceneName);
}
AZ_Warning("AudioRaycastManager", sceneHandle != AzPhysics::InvalidSceneHandle, "Unable to retrive default physics scene.");
AudioRaycastRequestQueueType processingQueue;
// Lock and swap the main request container with a local one for processing...
@@ -651,13 +684,16 @@ namespace Audio
AZ_Assert(request.m_request.m_maxResults <= s_maxHitResultsPerRaycast,
"Encountered audio raycast request that has maxResults set too high (%" PRIu64 ")!\n", request.m_request.m_maxResults);
AZStd::vector<Physics::RayCastHit> hitResults;
Physics::WorldRequestBus::BroadcastResult(hitResults, &Physics::WorldRequestBus::Events::RayCastMultiple, request.m_request);
AzPhysics::SceneQueryHits hitResults;
if (sceneInterface != nullptr)
{
hitResults = sceneInterface->QueryScene(sceneHandle, &request.m_request);
}
AZ_Error("Audio Raycast", hitResults.size() <= s_maxHitResultsPerRaycast,
"RayCastMultiple returned too many hits (%zu)!\n", hitResults.size());
AZ_Error("Audio Raycast", hitResults.m_hits.size() <= s_maxHitResultsPerRaycast,
"RayCastMultiple returned too many hits (%zu)!\n", hitResults.m_hits.size());
resultsQueue.emplace_back(AZStd::move(hitResults), request.m_audioObjectId, request.m_rayIndex);
resultsQueue.emplace_back(AZStd::move(hitResults.m_hits), request.m_audioObjectId, request.m_rayIndex);
}
// Lock and swap the local results into the target container (or move-append if necessary)...
@@ -16,8 +16,8 @@
#include <AzCore/EBus/EBus.h>
#include <AzCore/XML/rapidxml.h>
#include <AzFramework/Physics/Casts.h>
#include <AzFramework/Physics/World.h>
#include <AzFramework/Physics/Common/PhysicsEvents.h>
#include <AzFramework/Physics/Common/PhysicsTypes.h>
#include <IAudioSystem.h>
#include <ATLAudioObject.h>
@@ -87,30 +87,15 @@ namespace Audio
///////////////////////////////////////////////////////////////////////////////////////////////////
class AudioRaycastManager
: public AudioRaycastRequestBus::Handler
, public Physics::WorldNotificationBus::Handler
{
public:
AudioRaycastManager()
{
Physics::WorldNotificationBus::Handler::BusConnect(Physics::DefaultPhysicsWorldId);
AudioRaycastRequestBus::Handler::BusConnect();
}
~AudioRaycastManager() override
{
AudioRaycastRequestBus::Handler::BusDisconnect();
Physics::WorldNotificationBus::Handler::BusDisconnect();
}
AudioRaycastManager();
~AudioRaycastManager() override;
// AudioRaycastRequestBus::Handler interface
void PushAudioRaycastRequest(const AudioRaycastRequest& request) override;
// Physics::WorldNotificationBus::Handler interface
void OnPostPhysicsSubtick(float fixedDeltaTimeSeconds) override;
int GetPhysicsTickOrder() override
{
return Physics::WorldNotifications::Audio;
}
void OnPhysicsSubtickFinished();
// Additional functionality related to processing raycasts...
void ProcessRaycastResults(float updateIntervalMs);
@@ -123,6 +108,8 @@ namespace Audio
AZStd::mutex m_raycastResultsMutex;
AudioRaycastRequestQueueType m_raycastRequests;
AudioRaycastResultQueueType m_raycastResults;
AzPhysics::SceneEvents::OnSceneSimulationFinishHandler m_sceneFinishSimHandler;
};
@@ -1,4 +1,4 @@
/*
/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
@@ -64,7 +64,7 @@ namespace Audio
void Release();
void Update();
virtual TAudioFileEntryID TryAddFileCacheEntry(const AZ::rapidxml::xml_node<char>* fileXmlNode, const EATLDataScope dataScope, bool autoLoad); // 'virtual' is needed for unit tests/mocking
virtual TAudioFileEntryID TryAddFileCacheEntry(const AZ::rapidxml::xml_node<char>* fileXmlNode, EATLDataScope dataScope, bool autoLoad); // 'virtual' is needed for unit tests/mocking
bool TryRemoveFileCacheEntry(const TAudioFileEntryID audioFileID, const EATLDataScope dataScope);
void UpdateLocalizedFileCacheEntries();