Files
o3de/Gems/GraphCanvas/Code/Source/Components/Slots/Extender/ExtenderSlotComponent.cpp
T
Esteban Papp 1f9b284de2 Merge branch 'development' into cmake/SPEC-7179
Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com>

# Conflicts:
#	Code/Editor/Plugins/ComponentEntityEditorPlugin/ComponentEntityEditorPlugin_precompiled.h
#	Code/Editor/Plugins/EditorCommon/EditorCommon_precompiled.h
#	Code/Editor/Plugins/EditorCommon/stdafx.cpp
#	Code/Editor/Plugins/FFMPEGPlugin/FFMPEGPlugin_precompiled.h
#	Code/Editor/Plugins/PerforcePlugin/PerforcePlugin_precompiled.h
#	Code/Editor/Plugins/ProjectSettingsTool/ProjectSettingsTool_precompiled.h
#	Code/Framework/AzToolsFramework/AzToolsFramework/AzToolsFramework_precompiled.h
#	Code/Tools/AssetProcessor/native/precompiled.h
#	Code/Tools/Standalone/StandaloneTools_precompiled.h
#	Gems/AssetMemoryAnalyzer/Code/Source/AssetMemoryAnalyzer_precompiled.h
#	Gems/Atom/Asset/ImageProcessingAtom/Code/Source/ImageProcessing_precompiled.h
#	Gems/Atom/RHI/DX12/Code/Source/RHI/Atom_RHI_DX12_precompiled.h
#	Gems/Atom/RHI/Metal/Code/Include/Platform/Mac/Atom_RHI_Metal_precompiled_Platform.h
#	Gems/Atom/RHI/Metal/Code/Include/Platform/iOS/Atom_RHI_Metal_precompiled_Platform.h
#	Gems/Atom/RHI/Metal/Code/Source/Atom_RHI_Metal_precompiled.h
#	Gems/Atom/RHI/Metal/Code/atom_rhi_metal_common_files.cmake
#	Gems/Atom/RHI/Null/Code/Source/Atom_RHI_Null_precompiled.h
#	Gems/Atom/RHI/Null/Code/atom_rhi_null_common_files.cmake
#	Gems/Atom/RHI/Vulkan/Code/Include/Platform/Android/Atom_RHI_Vulkan_precompiled_Platform.h
#	Gems/Atom/RHI/Vulkan/Code/Include/Platform/Linux/Atom_RHI_Vulkan_precompiled_Platform.h
#	Gems/Atom/RHI/Vulkan/Code/Include/Platform/Mac/Atom_RHI_Vulkan_precompiled_Platform.h
#	Gems/Atom/RHI/Vulkan/Code/Include/Platform/Windows/Atom_RHI_Vulkan_precompiled_Platform.h
#	Gems/Atom/RHI/Vulkan/Code/Source/Atom_RHI_Vulkan_precompiled.h
#	Gems/Atom/RHI/Vulkan/Code/Source/RHI/SwapChain.cpp
#	Gems/Atom/RHI/Vulkan/Code/atom_rhi_vulkan_common_files.cmake
#	Gems/AtomLyIntegration/AtomFont/Code/Include/AtomLyIntegration/AtomFont/AtomFont_precompiled.h
#	Gems/Blast/Code/Source/StdAfx.cpp
#	Gems/Camera/Code/Source/Camera_precompiled.h
#	Gems/EMotionFX/Code/Source/EMotionFX_precompiled.h
#	Gems/FastNoise/Code/Source/FastNoise_precompiled.h
#	Gems/Gestures/Code/Source/Gestures_precompiled.h
#	Gems/GradientSignal/Code/Source/GradientSignal_precompiled.h
#	Gems/GraphCanvas/Code/precompiled.h
#	Gems/ImGui/Code/Source/ImGui_precompiled.h
#	Gems/InAppPurchases/Code/Source/InAppPurchases_precompiled.h
#	Gems/LmbrCentral/Code/Source/LmbrCentral_precompiled.h
#	Gems/LmbrCentral/Code/Tests/ShapeGeometryUtilTest.cpp
#	Gems/LyShine/Code/Editor/UiCanvasEditor_precompiled.h
#	Gems/LyShine/Code/Source/Animation/LyShine_precompiled.h
#	Gems/LyShine/Code/Source/LyShine_precompiled.h
#	Gems/LyShineExamples/Code/Source/LyShineExamples_precompiled.h
#	Gems/Maestro/Code/Source/Cinematics/Maestro_precompiled.h
#	Gems/Maestro/Code/Source/Maestro_precompiled.h
#	Gems/MessagePopup/Code/Source/MessagePopup_precompiled.h
#	Gems/Metastream/Code/Source/Metastream_precompiled.h
#	Gems/Microphone/Code/Source/Microphone_precompiled.h
#	Gems/Multiplayer/Code/Source/Multiplayer_precompiled.h
#	Gems/PhysX/Code/NumericalMethods/Source/NumericalMethods_precompiled.h
#	Gems/PhysX/Code/Source/PhysXUnsupported_precompiled.h
#	Gems/PhysX/Code/Source/PhysX_precompiled.h
#	Gems/PhysX/Code/physx_unsupported_files.cmake
#	Gems/PhysXDebug/Code/Source/PhysXDebugUnsupported_precompiled.h
#	Gems/PhysXDebug/Code/Source/PhysXDebug_precompiled.h
#	Gems/ScriptCanvas/Code/Editor/precompiled.h
#	Gems/ScriptCanvas/Code/Source/precompiled.h
#	Gems/ScriptCanvasDeveloper/Code/Source/precompiled.h
#	Gems/ScriptCanvasPhysics/Code/Source/ScriptCanvasPhysics_precompiled.h
#	Gems/ScriptEvents/Code/Source/precompiled.h
#	Gems/ScriptEvents/Code/Tests/Editor/EditorTests.cpp
#	Gems/ScriptedEntityTweener/Code/Source/ScriptedEntityTweener_precompiled.h
#	Gems/SliceFavorites/Code/Source/SliceFavorites_precompiled.h
#	Gems/StartingPointCamera/Code/Source/StartingPointCamera_precompiled.h
#	Gems/StartingPointInput/Code/Source/StartingPointInput_precompiled.h
#	Gems/StartingPointMovement/Code/Source/StartingPointMovement_precompiled.h
#	Gems/SurfaceData/Code/Source/SurfaceData_precompiled.h
#	Gems/TextureAtlas/Code/Source/TextureAtlas_precompiled.h
#	Gems/TickBusOrderViewer/Code/Source/TickBusOrderViewer_precompiled.h
#	Gems/Twitch/Code/Source/Twitch_precompiled.h
#	Gems/VirtualGamepad/Code/Source/VirtualGamepad_precompiled.h
#	Gems/WhiteBox/Code/Source/WhiteBoxUnsupported_precompiled.h
#	Gems/WhiteBox/Code/Source/WhiteBox_precompiled.h
2021-07-16 15:42:37 -07:00

348 lines
11 KiB
C++

/*
* 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 <Components/Slots/Extender/ExtenderSlotComponent.h>
#include <Components/Slots/Extender/ExtenderSlotLayoutComponent.h>
#include <Components/Slots/SlotConnectionFilterComponent.h>
#include <Components/StylingComponent.h>
#include <GraphCanvas/Components/Connections/ConnectionFilters/ConnectionFilters.h>
namespace GraphCanvas
{
//////////////////////////
// ExtenderSlotComponent
//////////////////////////
void ExtenderSlotComponent::Reflect(AZ::ReflectContext* reflectContext)
{
AZ::SerializeContext* serializeContext = azrtti_cast<AZ::SerializeContext*>(reflectContext);
if (serializeContext)
{
serializeContext->Class<ExtenderSlotComponent, SlotComponent>()
->Version(SaveVersion::Current)
->Field("ExtensionId", &ExtenderSlotComponent::m_extenderId)
;
}
}
AZ::Entity* ExtenderSlotComponent::CreateExtenderSlot(const AZ::EntityId& nodeId, const ExtenderSlotConfiguration& extenderSlotConfiguration)
{
AZ::Entity* entity = SlotComponent::CreateCoreSlotEntity();
ExtenderSlotComponent* extenderSlot = aznew ExtenderSlotComponent(extenderSlotConfiguration);
if (!entity->AddComponent(extenderSlot))
{
AZ_Error("GraphCanvas", false, "Failed to add ExtenderSlotComponent to entity.");
delete extenderSlot;
delete entity;
return nullptr;
}
entity->CreateComponent<ExtenderSlotLayoutComponent>();
entity->CreateComponent<StylingComponent>(Styling::Elements::ExtenderSlot, nodeId, "");
SlotConnectionFilterComponent* connectionFilter = entity->CreateComponent<SlotConnectionFilterComponent>();
SlotTypeFilter* slotTypeFilter = aznew SlotTypeFilter(ConnectionFilterType::Include);
slotTypeFilter->AddSlotType(SlotTypes::DataSlot);
connectionFilter->AddFilter(slotTypeFilter);
ConnectionTypeFilter* connectionTypeFilter = aznew ConnectionTypeFilter(ConnectionFilterType::Include);
switch (extenderSlot->GetConnectionType())
{
case ConnectionType::CT_Input:
connectionTypeFilter->AddConnectionType(CT_Output);
break;
case ConnectionType::CT_Output:
connectionTypeFilter->AddConnectionType(CT_Input);
break;
default:
break;
};
connectionFilter->AddFilter(connectionTypeFilter);
return entity;
}
ExtenderSlotComponent::ExtenderSlotComponent()
: SlotComponent(SlotTypes::ExtenderSlot)
{
if (m_slotConfiguration.m_slotGroup == SlotGroups::Invalid)
{
m_slotConfiguration.m_slotGroup = SlotGroups::ExtenderGroup;
}
}
ExtenderSlotComponent::ExtenderSlotComponent(const ExtenderSlotConfiguration& extenderSlotConfiguration)
: SlotComponent(SlotTypes::ExtenderSlot, extenderSlotConfiguration)
, m_extenderId(extenderSlotConfiguration.m_extenderId)
{
}
ExtenderSlotComponent::~ExtenderSlotComponent()
{
}
void ExtenderSlotComponent::Init()
{
SlotComponent::Init();
}
void ExtenderSlotComponent::Activate()
{
SlotComponent::Activate();
ExtenderSlotRequestBus::Handler::BusConnect(GetEntityId());
}
void ExtenderSlotComponent::Deactivate()
{
SlotComponent::Deactivate();
ExtenderSlotRequestBus::Handler::BusDisconnect();
}
void ExtenderSlotComponent::OnSceneMemberAboutToSerialize(GraphSerialization&)
{
}
void ExtenderSlotComponent::AddConnectionId(const AZ::EntityId& connectionId, const Endpoint& endpoint)
{
AZ_UNUSED(connectionId);
AZ_UNUSED(endpoint);
}
void ExtenderSlotComponent::RemoveConnectionId(const AZ::EntityId& connectionId, const Endpoint& endpoint)
{
AZ_UNUSED(connectionId);
AZ_UNUSED(endpoint);
}
void ExtenderSlotComponent::SetNode(const AZ::EntityId& nodeId)
{
SlotComponent::SetNode(nodeId);
}
SlotConfiguration* ExtenderSlotComponent::CloneSlotConfiguration() const
{
ExtenderSlotConfiguration* slotConfiguration = aznew ExtenderSlotConfiguration();
slotConfiguration->m_extenderId = m_extenderId;
PopulateSlotConfiguration((*slotConfiguration));
return slotConfiguration;
}
int ExtenderSlotComponent::GetLayoutPriority() const
{
return std::numeric_limits<int>::min();
}
void ExtenderSlotComponent::SetLayoutPriority(int layoutPriority)
{
// Extenders should not have their layout priority changed
AZ_UNUSED(layoutPriority);
}
void ExtenderSlotComponent::OnMoveFinalized(bool isValidConnection)
{
ConnectionNotificationBus::Handler::BusDisconnect();
m_proposedSlot = false;
m_trackedConnectionId.SetInvalid();
if (m_createdSlot.IsValid())
{
if (isValidConnection)
{
NodeId nodeId = GetNode();
GraphId graphId;
SceneMemberRequestBus::EventResult(graphId, GetNode(), &SceneMemberRequests::GetScene);
GraphModelRequestBus::Event(graphId, &GraphModelRequests::FinalizeExtension, nodeId, m_extenderId);
m_createdSlot.SetInvalid();
}
else
{
EraseSlot();
}
}
}
void ExtenderSlotComponent::OnSourceSlotIdChanged(const SlotId& oldSlotId, const SlotId& /*newSlotId*/)
{
if (m_proposedSlot)
{
if (oldSlotId == m_createdSlot)
{
CleanupProposedSlot();
}
}
}
void ExtenderSlotComponent::OnTargetSlotIdChanged(const SlotId& oldSlotId, const SlotId& /*newSlotId*/)
{
if (m_proposedSlot)
{
if (oldSlotId == m_createdSlot)
{
CleanupProposedSlot();
}
}
}
void ExtenderSlotComponent::TriggerExtension()
{
// Don't need to track anything. Just create the slot then ignore whatever the return is.
ConstructSlot(GraphModelRequests::ExtensionRequestReason::UserRequest);
if (m_createdSlot.IsValid())
{
const bool isValidSlot = true;
OnMoveFinalized(isValidSlot);
GraphId graphId;
SceneMemberRequestBus::EventResult(graphId, GetNode(), &SceneMemberRequests::GetScene);
GraphModelRequestBus::Event(graphId, &GraphModelRequests::RequestUndoPoint);
}
m_createdSlot.SetInvalid();
}
Endpoint ExtenderSlotComponent::ExtendForConnectionProposal(const ConnectionId& connectionId, const Endpoint& endpoint)
{
// Don't want to extend if we are already extended.
if (m_createdSlot.IsValid())
{
return Endpoint();
}
ConstructSlot(GraphModelRequests::ExtensionRequestReason::ConnectionProposal);
if (!m_createdSlot.IsValid())
{
return Endpoint();
}
bool isValidConnection = false;
SlotRequestBus::EventResult(isValidConnection, m_createdSlot, &SlotRequests::CanCreateConnectionTo, endpoint);
if (!isValidConnection)
{
EraseSlot();
return Endpoint();
}
m_proposedSlot = true;
m_trackedConnectionId = connectionId;
ConnectionNotificationBus::Handler::BusConnect(connectionId);
return Endpoint(GetNode(), m_createdSlot);
}
void ExtenderSlotComponent::OnFinalizeDisplay()
{
}
void ExtenderSlotComponent::ConstructSlot(GraphModelRequests::ExtensionRequestReason reason)
{
if (!m_createdSlot.IsValid())
{
NodeId nodeId = GetNode();
GraphId graphId;
SceneMemberRequestBus::EventResult(graphId, nodeId, &SceneMemberRequests::GetScene);
{
ScopedGraphUndoBlocker undoBlocker(graphId);
GraphModelRequestBus::EventResult(m_createdSlot, graphId, &GraphModelRequests::RequestExtension, nodeId, m_extenderId, reason);
}
}
}
void ExtenderSlotComponent::EraseSlot()
{
if (m_createdSlot.IsValid())
{
NodeId nodeId = GetNode();
GraphId graphId;
SceneMemberRequestBus::EventResult(graphId, nodeId, &SceneMemberRequests::GetScene);
{
ScopedGraphUndoBlocker undoBlocker(graphId);
GraphModelRequestBus::Event(graphId, &GraphModelRequests::RemoveSlot, Endpoint(nodeId, m_createdSlot));
GraphModelRequestBus::Event(graphId, &GraphModelRequests::ExtensionCancelled, nodeId, m_extenderId);
}
m_createdSlot.SetInvalid();
}
}
void ExtenderSlotComponent::CleanupProposedSlot()
{
ConnectionNotificationBus::Handler::BusDisconnect();
m_proposedSlot = false;
m_trackedConnectionId.SetInvalid();
EraseSlot();
}
AZ::Entity* ExtenderSlotComponent::ConstructConnectionEntity(const Endpoint& sourceEndpoint, const Endpoint& targetEndpoint, bool createModelConnection)
{
ConstructSlot(GraphModelRequests::ExtensionRequestReason::Internal);
if (m_createdSlot.IsValid())
{
Endpoint otherEndpoint;
if (GetConnectionType() == CT_Input)
{
otherEndpoint = sourceEndpoint;
}
else if (GetConnectionType() == CT_Output)
{
otherEndpoint = targetEndpoint;
}
if (createModelConnection)
{
SlotRequestBus::EventResult(m_trackedConnectionId, m_createdSlot, &SlotRequests::CreateConnectionWithEndpoint, otherEndpoint);
}
else
{
SlotRequestBus::EventResult(m_trackedConnectionId, m_createdSlot, &SlotRequests::DisplayConnectionWithEndpoint, otherEndpoint);
}
AZ::Entity* connectionEntity = nullptr;
if (m_trackedConnectionId.IsValid())
{
ConnectionNotificationBus::Handler::BusConnect(m_trackedConnectionId);
AZ::ComponentApplicationBus::BroadcastResult(connectionEntity, &AZ::ComponentApplicationRequests::FindEntity, m_trackedConnectionId);
}
return connectionEntity;
}
return nullptr;
}
}