/* * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or * its licensors. * * For complete copyright and license terms please see the LICENSE at the root of this * distribution (the "License"). All use of this software is governed by the License, * or, if provided, by the license below or the license accompanying this file. Do not * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * */ #pragma once #include #include #include #include #include #include #include #include #include namespace ScriptCanvasEditor { class LoggingDataAggregator; class LoggingDataRequests : public AZ::EBusTraits { public: static const AZ::EBusAddressPolicy AddressPolicy = AZ::EBusAddressPolicy::ById; static const AZ::EBusHandlerPolicy HandlerPolicy = AZ::EBusHandlerPolicy::Single; using BusIdType = LoggingDataId; virtual bool IsCapturingData() const = 0; // Return the object to allow for certain large data elements to be passed by reference instead of by value. virtual const LoggingDataAggregator* FindLoggingData() const = 0; virtual void EnableRegistration(const AZ::NamedEntityId& namedEntityId, const ScriptCanvas::GraphIdentifier& graphIdentifier) = 0; virtual void DisableRegistration(const AZ::NamedEntityId& namedEntityId, const ScriptCanvas::GraphIdentifier& graphIdentifier) = 0; virtual AZ::NamedEntityId FindNamedEntityId(const AZ::EntityId& entityId) = 0; }; using LoggingDataRequestBus = AZ::EBus; class LoggingDataNotifications : public AZ::EBusTraits { public: static const AZ::EBusAddressPolicy AddressPolicy = AZ::EBusAddressPolicy::ById; using BusIdType = LoggingDataId; virtual void OnDataCaptureBegin() {}; virtual void OnDataCaptureEnd() {}; virtual void OnEntityGraphRegistered(const AZ::NamedEntityId& entityId, const ScriptCanvas::GraphIdentifier& assetId) {}; virtual void OnEntityGraphUnregistered(const AZ::NamedEntityId& entityId, const ScriptCanvas::GraphIdentifier& assetId) {} virtual void OnEnabledStateChanged(bool isEnabled, const AZ::NamedEntityId& namedEntityId, const ScriptCanvas::GraphIdentifier& graphIdentifier) {} // TODO: Find a better spot for this virtual void OnTreeItemAdded() {} }; using LoggingDataNotificationBus = AZ::EBus; // Container class for all of the local elements class LoggingDataAggregator : public LoggingDataRequestBus::Handler { public: AZ_CLASS_ALLOCATOR(LoggingDataAggregator, AZ::SystemAllocator,0); LoggingDataAggregator(); ~LoggingDataAggregator(); const LoggingDataId& GetDataId() const; // LoggedDataRequests const LoggingDataAggregator* FindLoggingData() const override; void EnableRegistration(const AZ::NamedEntityId& namedEntityId, const ScriptCanvas::GraphIdentifier& graphIdentifier) override; void DisableRegistration(const AZ::NamedEntityId& namedEntityId, const ScriptCanvas::GraphIdentifier& graphIdentifier) override; AZ::NamedEntityId FindNamedEntityId(const AZ::EntityId& entityId) override; //// virtual bool IsCapturingData() const = 0; virtual bool CanCaptureData() const = 0; // Should be bus methods, but don't want to copy data const EntityGraphRegistrationMap& GetEntityGraphRegistrationMap() const; const LoggingEntityMap& GetLoggingEntityMap() const; const LoggingAssetSet& GetLoggingAssetSet() const; //// // void ProcessSignal(const ScriptCanvas::Signal& signal); void ProcessNodeStateChanged(const ScriptCanvas::NodeStateChange& stateChangeSignal); void ProcessInputSignal(const ScriptCanvas::InputSignal& inputSignal); void ProcessOutputSignal(const ScriptCanvas::OutputSignal& outputSignal); void ProcessOutputDataSignal(const ScriptCanvas::OutputDataSignal& outputDataSignal); void ProcessAnnotateNode(const ScriptCanvas::AnnotateNodeSignal& annotateNodeSignal); void ProcessVariableChangedSignal(const ScriptCanvas::VariableChange& variableChangeSignal); //// DebugLogRootItem* GetTreeRoot() const; void RegisterEntityName(const AZ::EntityId& entityId, AZStd::string_view entityName); void UnregisterEntityName(const AZ::EntityId& entityId); protected: // Methods here for child elements to do something with the data. virtual void OnRegistrationEnabled(const AZ::NamedEntityId& namedEntityId, const ScriptCanvas::GraphIdentifier& graphIdentifier); virtual void OnRegistrationDisabled(const AZ::NamedEntityId& namedEntityId, const ScriptCanvas::GraphIdentifier& graphIdentifier); void ResetData(); void ResetLog(); void RegisterScriptCanvas(const AZ::NamedEntityId& entityId, const ScriptCanvas::GraphIdentifier& graphIdentifier); void UnregisterScriptCanvas(const AZ::NamedEntityId& entityId, const ScriptCanvas::GraphIdentifier& graphIdentifier); // Parsed Data Information // // Debug Context Information // // Will be used for visually displaying the data once we get to it. AZStd::unordered_map< ScriptCanvas::Endpoint, AZStd::string > m_endpointData; AZStd::unordered_map< ScriptCanvas::VariableId, AZStd::string > m_variableData; //// AZStd::unordered_map< AZ::EntityId, AZStd::string > m_entityNameCache; AZStd::unordered_map< ScriptCanvas::GraphInfo, ExecutionLogTreeItem* > m_lastAggregateItemMap; AZStd::unordered_map< ScriptCanvas::GraphInfo, AZStd::vector> m_lastExecutionThreadMap; private: DebugLogRootItem* m_debugLogRoot; // State Information LoggingDataId m_id; bool m_ignoreRegistrations; bool m_hasAnchor; ScriptCanvas::Timestamp m_anchorTimeStamp; // TODO: Consider wrapping the three of these up into a single struct. EntityGraphRegistrationMap m_registrationMap; LoggingEntityMap m_loggingEntityMapping; LoggingAssetSet m_loggedAssetSet; }; }