Integrating up through commit 90f050496
This commit is contained in:
@@ -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();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user