/* * Copyright (c) Contributors to the Open 3D Engine Project. * For complete copyright and license terms please see the LICENSE at the root of this distribution. * * SPDX-License-Identifier: Apache-2.0 OR MIT * */ #include "AudioAreaEnvironmentComponent.h" #include #include #include #include #include #include #include #include #include #include #include #include namespace LmbrCentral { AudioAreaEnvironmentComponent::AudioAreaEnvironmentComponent() : m_onTriggerEnterHandler([this]([[maybe_unused]] AzPhysics::SimulatedBodyHandle bodyHandle, const AzPhysics::TriggerEvent& triggerEvent) { OnTriggerEnter(triggerEvent); }) , m_onTriggerExitHandler([this]([[maybe_unused]] AzPhysics::SimulatedBodyHandle bodyHandle, const AzPhysics::TriggerEvent& triggerEvent) { OnTriggerExit(triggerEvent); }) { } //========================================================================= void AudioAreaEnvironmentComponent::Reflect(AZ::ReflectContext* context) { if (auto serializeContext = azrtti_cast(context)) { serializeContext->Class() ->Version(1) ->Field("Broad-phase Trigger Area entity", &AudioAreaEnvironmentComponent::m_broadPhaseTriggerArea) ->Field("Environment name", &AudioAreaEnvironmentComponent::m_environmentName) ->Field("Environment fade distance", &AudioAreaEnvironmentComponent::m_environmentFadeDistance) ; } } //========================================================================= void AudioAreaEnvironmentComponent::Activate() { m_environmentId = INVALID_AUDIO_ENVIRONMENT_ID; if (!m_environmentName.empty()) { Audio::AudioSystemRequestBus::BroadcastResult(m_environmentId, &Audio::AudioSystemRequestBus::Events::GetAudioEnvironmentID, m_environmentName.c_str()); } if (m_broadPhaseTriggerArea.IsValid()) { if (auto* physicsSystem = AZ::Interface::Get()) { AZStd::pair foundBody = physicsSystem->FindAttachedBodyHandleFromEntityId(m_broadPhaseTriggerArea); if (foundBody.first != AzPhysics::InvalidSceneHandle) { AzPhysics::SimulatedBodyEvents::RegisterOnTriggerEnterHandler( foundBody.first, foundBody.second, m_onTriggerEnterHandler); AzPhysics::SimulatedBodyEvents::RegisterOnTriggerExitHandler( foundBody.first, foundBody.second, m_onTriggerExitHandler); } } } } //========================================================================= void AudioAreaEnvironmentComponent::Deactivate() { m_onTriggerEnterHandler.Disconnect(); m_onTriggerExitHandler.Disconnect(); } //========================================================================= void AudioAreaEnvironmentComponent::OnTransformChanged(const AZ::Transform& /*local*/, const AZ::Transform& world) { if (m_environmentId == INVALID_AUDIO_ENVIRONMENT_ID) { AZ_WarningOnce("AudioAreaEnvironmentComponent", m_environmentId != INVALID_AUDIO_ENVIRONMENT_ID, "AudioAreaEnvironmentComponent - Invalid Environment being used!"); return; } const AZ::EntityId* busEntityId = AZ::TransformNotificationBus::GetCurrentBusId(); if (!busEntityId) { AZ_ErrorOnce("AudioAreaEnvironmentComponent", busEntityId != nullptr, "AudioAreaEnvironmentComponent - Bus Id is null!"); return; } AZ::Vector3 entityPos = world.GetTranslation(); float distanceFromShape = 0.f; ShapeComponentRequestsBus::EventResult(distanceFromShape, GetEntityId(), &ShapeComponentRequestsBus::Events::DistanceFromPoint, entityPos); // Calculate a fade value to pass as the environment amount for the entity. // Linear fade is fine, the audio middleware can be authored to translate this into custom curves. float fadeValue = AZ::GetClamp(distanceFromShape, 0.f, m_environmentFadeDistance); fadeValue = (1.f - (fadeValue / m_environmentFadeDistance)); AudioProxyComponentRequestBus::Event(*busEntityId, &AudioProxyComponentRequestBus::Events::SetEnvironmentAmount, m_environmentId, fadeValue); } //========================================================================= void AudioAreaEnvironmentComponent::OnTriggerEnter(const AzPhysics::TriggerEvent& triggerEvent) { AZ::EntityId enteringEntityId = triggerEvent.m_otherBody->GetEntityId(); AZ::TransformNotificationBus::MultiHandler::BusConnect(enteringEntityId); } //========================================================================= void AudioAreaEnvironmentComponent::OnTriggerExit(const AzPhysics::TriggerEvent& triggerEvent) { AZ::EntityId exitingEntityId = triggerEvent.m_otherBody->GetEntityId(); AZ::TransformNotificationBus::MultiHandler::BusDisconnect(exitingEntityId); if (m_environmentId != INVALID_AUDIO_ENVIRONMENT_ID) { // When entities fully exit the broad-phase trigger area, set the environment amount to zero to ensure no effects linger on the entity. AudioProxyComponentRequestBus::Event(exitingEntityId, &AudioProxyComponentRequestBus::Events::SetEnvironmentAmount, m_environmentId, 0.f); } } } // namespace LmbrCentral