VegetationMocks.h 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #pragma once
  9. #include <Vegetation/Ebuses/AreaNotificationBus.h>
  10. #include <Vegetation/Ebuses/AreaRequestBus.h>
  11. #include <Vegetation/Ebuses/AreaSystemRequestBus.h>
  12. #include <Vegetation/Ebuses/DescriptorProviderRequestBus.h>
  13. #include <Vegetation/Ebuses/DescriptorSelectorRequestBus.h>
  14. #include <Vegetation/Ebuses/FilterRequestBus.h>
  15. #include <Vegetation/Ebuses/InstanceSystemRequestBus.h>
  16. #include <Vegetation/Ebuses/ModifierRequestBus.h>
  17. #include <Vegetation/Ebuses/SystemConfigurationBus.h>
  18. #include <LmbrCentral/Shape/ShapeComponentBus.h>
  19. #include <AtomLyIntegration/CommonFeatures/Mesh/MeshComponentBus.h>
  20. #include <AzCore/Math/Random.h>
  21. #include <GradientSignal/Ebuses/GradientRequestBus.h>
  22. #include <SurfaceData/SurfaceDataSystemRequestBus.h>
  23. #include <SurfaceData/Utility/SurfaceDataUtility.h>
  24. #include <AzCore/Component/TransformBus.h>
  25. #include <AzCore/std/containers/set.h>
  26. #include <AzCore/std/smart_ptr/make_shared.h>
  27. #include <Atom/RPI.Reflect/Model/ModelAsset.h>
  28. #include <Source/AreaSystemComponent.h>
  29. #include <Source/InstanceSystemComponent.h>
  30. #include <ISerialize.h>
  31. #include <IIndexedMesh.h>
  32. //////////////////////////////////////////////////////////////////////////
  33. // mock event bus classes for testing vegetation
  34. namespace UnitTest
  35. {
  36. struct MockAreaManager
  37. : public Vegetation::AreaSystemRequestBus::Handler
  38. {
  39. mutable int m_count = 0;
  40. MockAreaManager()
  41. {
  42. Vegetation::AreaSystemRequestBus::Handler::BusConnect();
  43. }
  44. ~MockAreaManager()
  45. {
  46. Vegetation::AreaSystemRequestBus::Handler::BusDisconnect();
  47. }
  48. void RegisterArea([[maybe_unused]] AZ::EntityId areaId, [[maybe_unused]] AZ::u32 layer, [[maybe_unused]] AZ::u32 priority, [[maybe_unused]] const AZ::Aabb& bounds) override
  49. {
  50. ++m_count;
  51. }
  52. void UnregisterArea([[maybe_unused]] AZ::EntityId areaId) override
  53. {
  54. ++m_count;
  55. }
  56. void RefreshArea([[maybe_unused]] AZ::EntityId areaId, [[maybe_unused]] AZ::u32 layer, [[maybe_unused]] AZ::u32 priority, [[maybe_unused]] const AZ::Aabb& bounds) override
  57. {
  58. ++m_count;
  59. }
  60. void RefreshAllAreas() override
  61. {
  62. ++m_count;
  63. }
  64. void ClearAllAreas() override
  65. {
  66. ++m_count;
  67. }
  68. void MuteArea([[maybe_unused]] AZ::EntityId areaId) override
  69. {
  70. ++m_count;
  71. }
  72. void UnmuteArea([[maybe_unused]] AZ::EntityId areaId) override
  73. {
  74. ++m_count;
  75. }
  76. AZStd::vector<Vegetation::InstanceData> m_existingInstances;
  77. void EnumerateInstancesInOverlappingSectors(const AZ::Aabb& bounds, Vegetation::AreaSystemEnumerateCallback callback) const override
  78. {
  79. EnumerateInstancesInAabb(bounds, callback);
  80. }
  81. void EnumerateInstancesInAabb([[maybe_unused]] const AZ::Aabb& bounds, Vegetation::AreaSystemEnumerateCallback callback) const override
  82. {
  83. ++m_count;
  84. for (const auto& instanceData : m_existingInstances)
  85. {
  86. if (callback(instanceData) != Vegetation::AreaSystemEnumerateCallbackResult::KeepEnumerating)
  87. {
  88. return;
  89. }
  90. }
  91. }
  92. AZStd::size_t GetInstanceCountInAabb([[maybe_unused]] const AZ::Aabb& bounds) const override
  93. {
  94. ++m_count;
  95. return m_existingInstances.size();
  96. }
  97. AZStd::vector<Vegetation::InstanceData> GetInstancesInAabb([[maybe_unused]] const AZ::Aabb& bounds) const override
  98. {
  99. ++m_count;
  100. return m_existingInstances;
  101. }
  102. };
  103. struct MockDescriptorBus
  104. : public Vegetation::InstanceSystemRequestBus::Handler
  105. {
  106. AZStd::set<Vegetation::DescriptorPtr> m_descriptorSet;
  107. MockDescriptorBus()
  108. {
  109. Vegetation::InstanceSystemRequestBus::Handler::BusConnect();
  110. }
  111. ~MockDescriptorBus() override
  112. {
  113. Vegetation::InstanceSystemRequestBus::Handler::BusDisconnect();
  114. }
  115. Vegetation::DescriptorPtr RegisterUniqueDescriptor(const Vegetation::Descriptor& descriptor) override
  116. {
  117. Vegetation::DescriptorPtr sharedPtr = AZStd::make_shared<Vegetation::Descriptor>(descriptor);
  118. m_descriptorSet.insert(sharedPtr);
  119. return sharedPtr;
  120. }
  121. void ReleaseUniqueDescriptor(Vegetation::DescriptorPtr descriptorPtr) override
  122. {
  123. m_descriptorSet.erase(descriptorPtr);
  124. }
  125. void CreateInstance(Vegetation::InstanceData& instanceData) override
  126. {
  127. instanceData.m_instanceId = Vegetation::InstanceId();
  128. }
  129. void DestroyInstance([[maybe_unused]] Vegetation::InstanceId instanceId) override {}
  130. void DestroyAllInstances() override {}
  131. void Cleanup() override {}
  132. };
  133. struct MockGradientRequestHandler
  134. : public GradientSignal::GradientRequestBus::Handler
  135. {
  136. mutable int m_count = 0;
  137. AZStd::function<float()> m_valueGetter;
  138. float m_defaultValue = -AZ::Constants::FloatMax;
  139. AZ::Entity m_entity;
  140. MockGradientRequestHandler()
  141. {
  142. GradientSignal::GradientRequestBus::Handler::BusConnect(m_entity.GetId());
  143. }
  144. ~MockGradientRequestHandler()
  145. {
  146. GradientSignal::GradientRequestBus::Handler::BusDisconnect();
  147. }
  148. float GetValue([[maybe_unused]] const GradientSignal::GradientSampleParams& sampleParams) const override
  149. {
  150. ++m_count;
  151. if (m_valueGetter)
  152. {
  153. return m_valueGetter();
  154. }
  155. return m_defaultValue;
  156. }
  157. bool IsEntityInHierarchy(const AZ::EntityId &) const override
  158. {
  159. return false;
  160. }
  161. };
  162. struct MockShapeComponentNotificationsBus
  163. : public LmbrCentral::ShapeComponentRequestsBus::Handler
  164. {
  165. AZ::Aabb m_aabb = AZ::Aabb::CreateCenterRadius(AZ::Vector3::CreateZero(), AZ::Constants::FloatMax);
  166. MockShapeComponentNotificationsBus()
  167. {
  168. }
  169. ~MockShapeComponentNotificationsBus() override
  170. {
  171. }
  172. void GetTransformAndLocalBounds(AZ::Transform& transform, AZ::Aabb& bounds) const override
  173. {
  174. transform = AZ::Transform::CreateTranslation(m_aabb.GetCenter());
  175. bounds = m_aabb;
  176. }
  177. AZ::Crc32 GetShapeType() const override
  178. {
  179. return AZ::Crc32();
  180. }
  181. AZ::Aabb GetEncompassingAabb() const override
  182. {
  183. return m_aabb;
  184. }
  185. bool IsPointInside(const AZ::Vector3& point) const override
  186. {
  187. return m_aabb.Contains(point);
  188. }
  189. float DistanceSquaredFromPoint(const AZ::Vector3& point) const override
  190. {
  191. return m_aabb.GetDistanceSq(point);
  192. }
  193. };
  194. struct MockSystemConfigurationRequestBus
  195. : public Vegetation::SystemConfigurationRequestBus::Handler
  196. {
  197. AZ::ComponentConfig* m_lastUpdated = nullptr;
  198. mutable const AZ::ComponentConfig* m_lastRead = nullptr;
  199. Vegetation::AreaSystemConfig m_areaSystemConfig;
  200. Vegetation::InstanceSystemConfig m_instanceSystemConfig;
  201. MockSystemConfigurationRequestBus()
  202. {
  203. Vegetation::SystemConfigurationRequestBus::Handler::BusConnect();
  204. }
  205. ~MockSystemConfigurationRequestBus() override
  206. {
  207. Vegetation::SystemConfigurationRequestBus::Handler::BusDisconnect();
  208. }
  209. void UpdateSystemConfig(const AZ::ComponentConfig* config) override
  210. {
  211. if (azrtti_typeid(m_areaSystemConfig) == azrtti_typeid(*config))
  212. {
  213. m_areaSystemConfig = *azrtti_cast<const Vegetation::AreaSystemConfig*>(config);
  214. m_lastUpdated = &m_areaSystemConfig;
  215. }
  216. else if (azrtti_typeid(m_instanceSystemConfig) == azrtti_typeid(*config))
  217. {
  218. m_instanceSystemConfig = *azrtti_cast<const Vegetation::InstanceSystemConfig*>(config);
  219. m_lastUpdated = &m_instanceSystemConfig;
  220. }
  221. else
  222. {
  223. m_lastUpdated = nullptr;
  224. AZ_Error("vegetation", false, "Invalid AZ::ComponentConfig type updated");
  225. }
  226. }
  227. void GetSystemConfig(AZ::ComponentConfig* config) const override
  228. {
  229. if (azrtti_typeid(m_areaSystemConfig) == azrtti_typeid(*config))
  230. {
  231. *azrtti_cast<Vegetation::AreaSystemConfig*>(config) = m_areaSystemConfig;
  232. m_lastRead = azrtti_cast<const Vegetation::AreaSystemConfig*>(&m_areaSystemConfig);
  233. }
  234. else if (azrtti_typeid(m_instanceSystemConfig) == azrtti_typeid(*config))
  235. {
  236. *azrtti_cast<Vegetation::InstanceSystemConfig*>(config) = m_instanceSystemConfig;
  237. m_lastRead = azrtti_cast<const Vegetation::InstanceSystemConfig*>(&m_instanceSystemConfig);
  238. }
  239. else
  240. {
  241. m_lastRead = nullptr;
  242. AZ_Error("vegetation", false, "Invalid AZ::ComponentConfig type read");
  243. }
  244. }
  245. };
  246. template<class T>
  247. struct MockAsset : public AZ::Data::Asset<T>
  248. {
  249. void ClearData()
  250. {
  251. this->m_assetData = nullptr;
  252. }
  253. };
  254. struct MockAssetData
  255. : public AZ::Data::AssetData
  256. {
  257. void SetId(const AZ::Data::AssetId& assetId)
  258. {
  259. m_assetId = assetId;
  260. m_status.store(AZ::Data::AssetData::AssetStatus::Ready);
  261. }
  262. void SetStatus(AZ::Data::AssetData::AssetStatus status)
  263. {
  264. m_status.store(status);
  265. }
  266. };
  267. struct MockSurfaceHandler
  268. : public SurfaceData::SurfaceDataSystemRequestBus::Handler
  269. {
  270. public:
  271. mutable int m_count = 0;
  272. MockSurfaceHandler()
  273. {
  274. AZ::Interface<SurfaceData::SurfaceDataSystem>::Register(this);
  275. }
  276. ~MockSurfaceHandler()
  277. {
  278. AZ::Interface<SurfaceData::SurfaceDataSystem>::Unregister(this);
  279. }
  280. AZ::Vector3 m_outPosition = {};
  281. AZ::Vector3 m_outNormal = {};
  282. SurfaceData::SurfaceTagWeights m_outMasks;
  283. void GetSurfacePoints([[maybe_unused]] const AZ::Vector3& inPosition, [[maybe_unused]] const SurfaceData::SurfaceTagVector& masks, SurfaceData::SurfacePointList& surfacePointList) const override
  284. {
  285. ++m_count;
  286. surfacePointList.Clear();
  287. surfacePointList.StartListConstruction(AZStd::span<const AZ::Vector3>(&inPosition, 1), 1, {});
  288. surfacePointList.AddSurfacePoint(AZ::EntityId(), inPosition, m_outPosition, m_outNormal, m_outMasks);
  289. surfacePointList.EndListConstruction();
  290. }
  291. void GetSurfacePointsFromRegion([[maybe_unused]] const AZ::Aabb& inRegion, [[maybe_unused]] const AZ::Vector2 stepSize, [[maybe_unused]] const SurfaceData::SurfaceTagVector& desiredTags,
  292. [[maybe_unused]] SurfaceData::SurfacePointList& surfacePointListPerPosition) const override
  293. {
  294. }
  295. void GetSurfacePointsFromList(
  296. [[maybe_unused]] AZStd::span<const AZ::Vector3> inPositions,
  297. [[maybe_unused]] const SurfaceData::SurfaceTagVector& desiredTags,
  298. [[maybe_unused]] SurfaceData::SurfacePointList& surfacePointLists) const override
  299. {
  300. }
  301. SurfaceData::SurfaceDataRegistryHandle RegisterSurfaceDataProvider([[maybe_unused]] const SurfaceData::SurfaceDataRegistryEntry& entry) override
  302. {
  303. ++m_count;
  304. return SurfaceData::InvalidSurfaceDataRegistryHandle;
  305. }
  306. void UnregisterSurfaceDataProvider([[maybe_unused]] const SurfaceData::SurfaceDataRegistryHandle& handle) override
  307. {
  308. ++m_count;
  309. }
  310. void UpdateSurfaceDataProvider([[maybe_unused]] const SurfaceData::SurfaceDataRegistryHandle& handle, [[maybe_unused]] const SurfaceData::SurfaceDataRegistryEntry& entry) override
  311. {
  312. ++m_count;
  313. }
  314. SurfaceData::SurfaceDataRegistryHandle RegisterSurfaceDataModifier([[maybe_unused]] const SurfaceData::SurfaceDataRegistryEntry& entry) override
  315. {
  316. ++m_count;
  317. return SurfaceData::InvalidSurfaceDataRegistryHandle;
  318. }
  319. void UnregisterSurfaceDataModifier([[maybe_unused]] const SurfaceData::SurfaceDataRegistryHandle& handle) override
  320. {
  321. ++m_count;
  322. }
  323. void UpdateSurfaceDataModifier([[maybe_unused]] const SurfaceData::SurfaceDataRegistryHandle& handle, [[maybe_unused]] const SurfaceData::SurfaceDataRegistryEntry& entry) override
  324. {
  325. ++m_count;
  326. }
  327. void RefreshSurfaceData(
  328. [[maybe_unused]] const SurfaceData::SurfaceDataRegistryHandle& handle, [[maybe_unused]] const AZ::Aabb& dirtyBounds) override
  329. {
  330. ++m_count;
  331. }
  332. SurfaceData::SurfaceDataRegistryHandle GetSurfaceDataProviderHandle([[maybe_unused]] const AZ::EntityId& providerEntityId) override
  333. {
  334. return {};
  335. }
  336. SurfaceData::SurfaceDataRegistryHandle GetSurfaceDataModifierHandle([[maybe_unused]] const AZ::EntityId& modifierEntityId) override
  337. {
  338. return {};
  339. }
  340. };
  341. struct MockMeshAsset
  342. : public AZ::RPI::ModelAsset
  343. {
  344. AZ_RTTI(MockMeshAsset, "{C314B960-9B54-468D-B37C-065738E7487C}", AZ::RPI::ModelAsset);
  345. AZ_CLASS_ALLOCATOR(ModelAsset, AZ::SystemAllocator);
  346. MockMeshAsset()
  347. {
  348. m_assetId = AZ::Uuid::CreateRandom();
  349. m_status.store(AZ::Data::AssetData::AssetStatus::Ready);
  350. m_useCount.fetch_add(1);
  351. m_weakUseCount.fetch_add(1);
  352. }
  353. ~MockMeshAsset() override = default;
  354. bool LocalRayIntersectionAgainstModel(
  355. [[maybe_unused]] const AZ::Vector3& rayStart, [[maybe_unused]] const AZ::Vector3& dir, [[maybe_unused]] bool allowBruteForce,
  356. [[maybe_unused]] float& distance, [[maybe_unused]] AZ::Vector3& normal) const override
  357. {
  358. distance = 0.1f;
  359. return true;
  360. }
  361. };
  362. struct MockMeshRequestBus
  363. : public AZ::Render::MeshComponentRequestBus::Handler
  364. {
  365. AZ::Aabb m_GetWorldBoundsOutput;
  366. AZ::Aabb GetWorldBounds() const override
  367. {
  368. return m_GetWorldBoundsOutput;
  369. }
  370. AZ::Aabb m_GetLocalBoundsOutput;
  371. AZ::Aabb GetLocalBounds() const override
  372. {
  373. return m_GetLocalBoundsOutput;
  374. }
  375. void SetModelAsset([[maybe_unused]] AZ::Data::Asset<AZ::RPI::ModelAsset> modelAsset) override
  376. {
  377. }
  378. AZ::Data::Asset<AZ::RPI::ModelAsset> m_GetMeshAssetOutput;
  379. AZ::Data::Asset<const AZ::RPI::ModelAsset> GetModelAsset() const override
  380. {
  381. return m_GetMeshAssetOutput;
  382. }
  383. bool m_GetVisibilityOutput = true;
  384. bool GetVisibility() const override
  385. {
  386. return m_GetVisibilityOutput;
  387. }
  388. void SetVisibility(bool visibility) override
  389. {
  390. m_GetVisibilityOutput = visibility;
  391. }
  392. void SetRayTracingEnabled([[maybe_unused]] bool enabled) override
  393. {
  394. }
  395. bool GetRayTracingEnabled() const override
  396. {
  397. return false;
  398. }
  399. void SetExcludeFromReflectionCubeMaps([[maybe_unused]] bool excludeFromReflectionCubeMaps) override
  400. {
  401. }
  402. bool GetExcludeFromReflectionCubeMaps() const override
  403. {
  404. return false;
  405. }
  406. AZ::Data::AssetId m_assetIdOutput;
  407. void SetModelAssetId(AZ::Data::AssetId modelAssetId) override
  408. {
  409. m_assetIdOutput = modelAssetId;
  410. }
  411. AZ::Data::AssetId GetModelAssetId() const override
  412. {
  413. return m_assetIdOutput;
  414. }
  415. AZStd::string m_modelAssetPathOutput;
  416. void SetModelAssetPath(const AZStd::string& path) override
  417. {
  418. m_modelAssetPathOutput = path;
  419. }
  420. AZStd::string GetModelAssetPath() const override
  421. {
  422. return m_modelAssetPathOutput;
  423. }
  424. AZ::Data::Instance<AZ::RPI::Model> GetModel() const override
  425. {
  426. return AZ::Data::Instance<AZ::RPI::Model>();
  427. }
  428. AZ::RHI::DrawItemSortKey m_drawItemSortKeyOutput;
  429. void SetSortKey(AZ::RHI::DrawItemSortKey sortKey) override
  430. {
  431. m_drawItemSortKeyOutput = sortKey;
  432. }
  433. AZ::RHI::DrawItemSortKey GetSortKey() const override
  434. {
  435. return m_drawItemSortKeyOutput;
  436. }
  437. bool m_isAlwaysDynamic = false;
  438. void SetIsAlwaysDynamic(bool isAlwaysDynamic) override
  439. {
  440. m_isAlwaysDynamic = isAlwaysDynamic;
  441. }
  442. bool GetIsAlwaysDynamic() const override
  443. {
  444. return m_isAlwaysDynamic;
  445. }
  446. AZ::RPI::Cullable::LodType m_lodTypeOutput;
  447. void SetLodType(AZ::RPI::Cullable::LodType lodType) override
  448. {
  449. m_lodTypeOutput = lodType;
  450. }
  451. AZ::RPI::Cullable::LodType GetLodType() const override
  452. {
  453. return m_lodTypeOutput;
  454. }
  455. AZ::RPI::Cullable::LodOverride m_lodOverrideOutput;
  456. void SetLodOverride(AZ::RPI::Cullable::LodOverride lodOverride) override
  457. {
  458. m_lodOverrideOutput = lodOverride;
  459. }
  460. AZ::RPI::Cullable::LodOverride GetLodOverride() const override
  461. {
  462. return m_lodOverrideOutput;
  463. }
  464. float m_minimumScreenCoverageOutput;
  465. void SetMinimumScreenCoverage(float minimumScreenCoverage) override
  466. {
  467. m_minimumScreenCoverageOutput = minimumScreenCoverage;
  468. }
  469. float GetMinimumScreenCoverage() const override
  470. {
  471. return m_minimumScreenCoverageOutput;
  472. }
  473. float m_qualityDecayRateOutput;
  474. void SetQualityDecayRate(float qualityDecayRate) override
  475. {
  476. m_qualityDecayRateOutput = qualityDecayRate;
  477. }
  478. float GetQualityDecayRate() const override
  479. {
  480. return m_qualityDecayRateOutput;
  481. }
  482. };
  483. struct MockTransformBus
  484. : public AZ::TransformBus::Handler
  485. {
  486. void BindTransformChangedEventHandler(AZ::TransformChangedEvent::Handler&) override
  487. {
  488. ;
  489. }
  490. void BindParentChangedEventHandler(AZ::ParentChangedEvent::Handler&) override
  491. {
  492. ;
  493. }
  494. void BindChildChangedEventHandler(AZ::ChildChangedEvent::Handler&) override
  495. {
  496. ;
  497. }
  498. void NotifyChildChangedEvent(AZ::ChildChangeType, AZ::EntityId) override
  499. {
  500. ;
  501. }
  502. AZ::Transform m_GetLocalTMOutput;
  503. const AZ::Transform & GetLocalTM() override
  504. {
  505. return m_GetLocalTMOutput;
  506. }
  507. AZ::Transform m_GetWorldTMOutput;
  508. const AZ::Transform & GetWorldTM() override
  509. {
  510. return m_GetWorldTMOutput;
  511. }
  512. bool IsStaticTransform() override
  513. {
  514. return false;
  515. }
  516. };
  517. class MockShapeServiceComponent
  518. : public AZ::Component
  519. {
  520. public:
  521. AZ_COMPONENT(MockShapeServiceComponent, "{E1687D77-F43F-439B-BB6D-B1457E94812A}", AZ::Component);
  522. void Activate() override {}
  523. void Deactivate() override {}
  524. static void Reflect(AZ::ReflectContext* reflect) { AZ_UNUSED(reflect); }
  525. static void GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided)
  526. {
  527. provided.push_back(AZ_CRC_CE("ShapeService"));
  528. provided.push_back(AZ_CRC_CE("VegetationDescriptorProviderService"));
  529. }
  530. };
  531. class MockVegetationAreaServiceComponent
  532. : public AZ::Component
  533. {
  534. public:
  535. AZ_COMPONENT(MockVegetationAreaServiceComponent, "{EF5292D8-411E-4660-9B31-EFAEED34B1EE}", AZ::Component);
  536. void Activate() override {}
  537. void Deactivate() override {}
  538. static void Reflect(AZ::ReflectContext* reflect) { AZ_UNUSED(reflect); }
  539. static void GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided)
  540. {
  541. provided.push_back(AZ_CRC_CE("VegetationAreaService"));
  542. }
  543. };
  544. class MockMeshServiceComponent
  545. : public AZ::Component
  546. {
  547. public:
  548. AZ_COMPONENT(MockMeshServiceComponent, "{69547762-7EAB-4AC4-86FA-7486F1BBB115}", AZ::Component);
  549. void Activate() override {}
  550. void Deactivate() override {}
  551. static void Reflect(AZ::ReflectContext* reflect) { AZ_UNUSED(reflect); }
  552. static void GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided)
  553. {
  554. provided.push_back(AZ_CRC_CE("MeshService"));
  555. }
  556. };
  557. }