/* * 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 "SequenceComponent.h" #include "../Cinematics/AnimSequence.h" namespace Maestro { class EditorSequenceComponent : public AzToolsFramework::Components::EditorComponentBase , public Maestro::EditorSequenceComponentRequestBus::Handler , public Maestro::SequenceComponentRequestBus::Handler , public AZ::TickBus::Handler // for refreshing propertyGrids after SetAnimatedPropertyValue events { public: AZ_EDITOR_COMPONENT(EditorSequenceComponent, EditorSequenceComponentTypeId); // EditorSequenceComponentTypeId is defined in EditorSequenceComponentBus.h using AnimatablePropertyAddress = Maestro::SequenceComponentRequests::AnimatablePropertyAddress; using AnimatedValue = Maestro::SequenceComponentRequests::AnimatedValue; EditorSequenceComponent(); ~EditorSequenceComponent(); ////////////////////////////////////////////////////////////////////////// // AZ::Component interface implementation void Init() override; void Activate() override; void Deactivate() override; ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// // EditorSequenceComponentRequestBus::Handler Interface void GetAllAnimatablePropertiesForComponent(IAnimNode::AnimParamInfos& addressList, AZ::EntityId id, AZ::ComponentId componentId) override; void GetAnimatableComponents(AZStd::vector& componentIds, AZ::EntityId id) override; void AddEntityToAnimate(AZ::EntityId entityToAnimate) override; void RemoveEntityToAnimate(AZ::EntityId removedEntityId) override; bool MarkEntityLayerAsDirty() const override; AnimValueType GetValueType(const AZStd::string& animatableAddress) override; // ~EditorSequenceComponentRequestBus::Handler Interface ////////////////////////////////////////////////////////////////////////// // SequenceComponentRequestBus::Handler Interface /** * Get the current value for a property * @param returnValue holds the value to get - this must be instance of one of the concrete subclasses of AnimatedValue, corresponding to the type of the property referenced by the animatedAdresss * @param animatedEntityId the entity Id of the entity containing the animatedAddress * @param animatedAddress identifies the component and property to be set */ void GetAnimatedPropertyValue(AnimatedValue& returnValue, const AZ::EntityId& animatedEntityId, const AnimatablePropertyAddress& animatableAddress) override; /** * Set a value for an animated property at the given address on the given entity. * @param animatedEntityId the entity Id of the entity containing the animatedAddress * @param animatedAddress identifies the component and property to be set * @param value the value to set - this must be instance of one of the concrete subclasses of AnimatedValue, corresponding to the type of the property referenced by the animatedAdresss * @return true if the value was changed. */ bool SetAnimatedPropertyValue(const AZ::EntityId& animatedEntityId, const AnimatablePropertyAddress& animatableAddress, const AnimatedValue& value) override; AZ::Uuid GetAnimatedAddressTypeId(const AZ::EntityId& animatedEntityId, const Maestro::SequenceComponentRequests::AnimatablePropertyAddress& animatableAddress) override; void GetAssetDuration(AnimatedValue& returnValue, const AZ::EntityId& animatedEntityId, AZ::ComponentId componentId, const AZ::Data::AssetId& assetId) override; void GetAssetTypeName(AZStd::string& returnValue, const AZ::EntityId& animatedEntityId, const AnimatablePropertyAddress& animatableAddress) override; ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// // TickBus - used to refresh property displays when values are animated virtual void OnTick(float deltaTime, AZ::ScriptTimePoint time); ////////////////////////////////////////////////////////////////////////// // TODO - this should be on a Bus, right? IAnimSequence* GetSequence() { return m_sequence.get(); } protected: static void GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided) { provided.push_back(AZ_CRC("SequenceService", 0x7cbe5938)); } static void GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& incompatible) { // This guarantees that only one SequenceComponent will ever be on an entity incompatible.push_back(AZ_CRC("SequenceService", 0x7cbe5938)); } // Required Reflect function. static void Reflect(AZ::ReflectContext* context); //////////////////////////////////////////////////////////////////////// void BuildGameEntity(AZ::Entity* gameEntity) override; //////////////////////////////////////////////////////////////////////// private: // pointer and id of the CryMovie anim sequence responsible for playback/recording AZStd::intrusive_ptr m_sequence; uint32 m_sequenceId; static AZ::ScriptTimePoint s_lastPropertyRefreshTime; static const double s_refreshPeriodMilliseconds; // property refresh period for SetAnimatedPropertyValue events static const int s_invalidSequenceId; }; } // namespace Maestro