/* * 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 namespace LmbrCentral { template class EditorWrappedComponentBase; } namespace Water { class WaterVolumeSurfaceDataConfig : public AZ::ComponentConfig { public: AZ_CLASS_ALLOCATOR(WaterVolumeSurfaceDataConfig, AZ::SystemAllocator, 0); AZ_RTTI(WaterVolumeSurfaceDataConfig, "{805F64AD-2E5A-4BF0-ACF6-01549E1B40F2}", AZ::ComponentConfig); static void Reflect(AZ::ReflectContext* context); SurfaceData::SurfaceTagVector m_providerTags; SurfaceData::SurfaceTagVector m_modifierTags; }; class WaterVolumeSurfaceDataComponent : public AZ::Component , private AZ::TickBus::Handler , private AZ::TransformNotificationBus::Handler , private CrySystemEventBus::Handler , private LmbrCentral::ShapeComponentNotificationsBus::Handler , private SurfaceData::SurfaceDataModifierRequestBus::Handler , private SurfaceData::SurfaceDataProviderRequestBus::Handler { public: template friend class LmbrCentral::EditorWrappedComponentBase; AZ_COMPONENT(WaterVolumeSurfaceDataComponent, "{E37DF74C-1B92-4DC5-A831-CEB5756C1F00}"); static void GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& services); static void GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& services); static void GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& services); static void Reflect(AZ::ReflectContext* context); WaterVolumeSurfaceDataComponent(const WaterVolumeSurfaceDataConfig& configuration); WaterVolumeSurfaceDataComponent() = default; ~WaterVolumeSurfaceDataComponent() = default; ////////////////////////////////////////////////////////////////////////// // AZ::Component interface implementation void Activate() override; void Deactivate() override; bool ReadInConfig(const AZ::ComponentConfig* baseConfig) override; bool WriteOutConfig(AZ::ComponentConfig* outBaseConfig) const override; ////////////////////////////////////////////////////////////////////////// // SurfaceDataProviderRequestBus void GetSurfacePoints(const AZ::Vector3& inPosition, SurfaceData::SurfacePointList& surfacePointList) const; ////////////////////////////////////////////////////////////////////////// // SurfaceDataModifierRequestBus void ModifySurfacePoints(SurfaceData::SurfacePointList& surfacePointList) const override; ////////////////////////////////////////////////////////////////////////// // AZ::TransformNotificationBus void OnTransformChanged(const AZ::Transform& /*local*/, const AZ::Transform& /*world*/) override; // ShapeComponentNotificationsBus void OnShapeChanged(ShapeChangeReasons changeReason) override; //////////////////////////////////////////////////////////////////////// // AZ::TickBus void OnTick(float deltaTime, AZ::ScriptTimePoint time) override; //////////////////////////////////////////////////////////////////////////// // CrySystemEvents void OnCrySystemInitialized(ISystem& system, const SSystemInitParams& systemInitParams) override; void OnCrySystemShutdown(ISystem& system) override; private: void OnCompositionChanged(); void UpdateShapeData(); WaterVolumeSurfaceDataConfig m_configuration; SurfaceData::SurfaceDataRegistryHandle m_providerHandle = SurfaceData::InvalidSurfaceDataRegistryHandle; SurfaceData::SurfaceDataRegistryHandle m_modifierHandle = SurfaceData::InvalidSurfaceDataRegistryHandle; // cached data AZStd::atomic_bool m_refresh{ false }; mutable AZStd::recursive_mutex m_cacheMutex; AZ::Aabb m_shapeBounds = AZ::Aabb::CreateNull(); bool m_shapeBoundsIsValid = false; ISystem* m_system = nullptr; }; }