diff --git a/Code/Framework/AzFramework/AzFramework/Entity/GameEntityContextComponent.cpp b/Code/Framework/AzFramework/AzFramework/Entity/GameEntityContextComponent.cpp index 903bad91bf..694ed83765 100644 --- a/Code/Framework/AzFramework/AzFramework/Entity/GameEntityContextComponent.cpp +++ b/Code/Framework/AzFramework/AzFramework/Entity/GameEntityContextComponent.cpp @@ -290,7 +290,10 @@ namespace AzFramework isPrefabSystemEnabled, &AzFramework::ApplicationRequests::IsPrefabSystemEnabled); if (isPrefabSystemEnabled) { - AZ::Interface::Get()->RemoveSpawnedEntity(currentEntity->GetId()); + SpawnedEntityTicketMapperInterface* spawnedEntityTicketMapperInterface = + AZ::Interface::Get(); + AZ_Assert(spawnedEntityTicketMapperInterface != nullptr, "SpawnedEntityTicketMapperInterface is not found."); + spawnedEntityTicketMapperInterface->RemoveSpawnedEntity(currentEntity->GetId()); } if (currentEntity->GetState() == AZ::Entity::State::Active) diff --git a/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnableEntitiesManager.cpp b/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnableEntitiesManager.cpp index eae71b5ea0..2c317bc33f 100644 --- a/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnableEntitiesManager.cpp +++ b/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnableEntitiesManager.cpp @@ -17,7 +17,6 @@ #include #include #include -#include namespace AzFramework { @@ -352,7 +351,7 @@ namespace AzFramework for (auto it = ticket.m_spawnedEntities.begin() + spawnedEntitiesInitialCount; it != ticket.m_spawnedEntities.end(); ++it) { GameEntityContextRequestBus::Broadcast(&GameEntityContextRequestBus::Events::AddGameEntity, *it); - AZ::Interface::Get()->AddSpawnedEntity((*it)->GetId(), &ticket); + m_spawnedEntityTicketMapper.AddSpawnedEntity((*it)->GetId(), &ticket); } // Let other systems know about newly spawned entities for any post-processing after adding to the scene/game context. @@ -434,7 +433,7 @@ namespace AzFramework for (auto it = ticket.m_spawnedEntities.begin() + spawnedEntitiesInitialCount; it != ticket.m_spawnedEntities.end(); ++it) { GameEntityContextRequestBus::Broadcast(&GameEntityContextRequestBus::Events::AddGameEntity, *it); - AZ::Interface::Get()->AddSpawnedEntity((*it)->GetId(), &ticket); + m_spawnedEntityTicketMapper.AddSpawnedEntity((*it)->GetId(), &ticket); } if (request.m_completionCallback) @@ -625,18 +624,18 @@ namespace AzFramework bool SpawnableEntitiesManager::ProcessRequest(ClaimEntityCommand& request) { - Ticket& ticket = *request.m_ticket; - if (request.m_requestId == ticket.m_currentRequestId) + Ticket* ticket = request.m_ticket; + if (request.m_requestId == ticket->m_currentRequestId) { - AZStd::vector& spawnedEntities = ticket.m_spawnedEntities; + AZStd::vector& spawnedEntities = ticket->m_spawnedEntities; AZStd::vector::size_type entityIndex = 0; for (entityIndex = 0; entityIndex < spawnedEntities.size(); entityIndex++) { if (spawnedEntities[entityIndex]->GetId() == request.m_entityId) { spawnedEntities.erase(spawnedEntities.begin() + entityIndex); - ticket.m_spawnedEntityIndices.erase(ticket.m_spawnedEntityIndices.begin() + entityIndex); - ticket.m_currentRequestId++; + ticket->m_spawnedEntityIndices.erase(ticket->m_spawnedEntityIndices.begin() + entityIndex); + ticket->m_currentRequestId++; return true; } } diff --git a/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnableEntitiesManager.h b/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnableEntitiesManager.h index 89181ea179..e5a0760010 100644 --- a/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnableEntitiesManager.h +++ b/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnableEntitiesManager.h @@ -16,6 +16,7 @@ #include #include #include +#include namespace AZ { @@ -167,7 +168,6 @@ namespace AzFramework struct ClaimEntityCommand { Ticket* m_ticket; - EntitySpawnTicket::Id m_ticketId; uint32_t m_requestId; AZ::EntityId m_entityId; }; @@ -234,6 +234,8 @@ namespace AzFramework //! SpawnablePriority_Default which gives users a bit of room to fine tune the priorities as this value can be configured //! through the Settings Registry under the key "/O3DE/AzFramework/Spawnables/HighPriorityThreshold". SpawnablePriority m_highPriorityThreshold { 64 }; + private: + SpawnedEntityTicketMapper m_spawnedEntityTicketMapper; }; AZ_DEFINE_ENUM_BITWISE_OPERATORS(AzFramework::SpawnableEntitiesManager::CommandQueuePriority); diff --git a/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnableSystemComponent.h b/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnableSystemComponent.h index 33e0a29704..5b5fb1b7ee 100644 --- a/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnableSystemComponent.h +++ b/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnableSystemComponent.h @@ -18,7 +18,6 @@ #include #include #include -#include namespace AzFramework { @@ -91,7 +90,6 @@ namespace AzFramework void LoadRootSpawnableFromSettingsRegistry(); SpawnableAssetHandler m_assetHandler; - SpawnedEntityTicketMapper m_spawnedEntityTicketMapper; SpawnableEntitiesManager m_entitiesManager; SpawnableEntitiesContainer m_rootSpawnableContainer; AZ::SettingsRegistryInterface::NotifyEventHandler m_registryChangeHandler; diff --git a/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnedEntityTicketMapper.cpp b/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnedEntityTicketMapper.cpp index 4179f3c111..3a6b40f5a9 100644 --- a/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnedEntityTicketMapper.cpp +++ b/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnedEntityTicketMapper.cpp @@ -13,6 +13,9 @@ namespace AzFramework { SpawnedEntityTicketMapper::SpawnedEntityTicketMapper() { + spawnableEntitiesInterface = SpawnableEntitiesInterface::Get(); + AZ_Assert(spawnableEntitiesInterface != nullptr, "SpawnableEntitiesInterface is not found."); + AZ::Interface::Register(this); } @@ -26,8 +29,6 @@ namespace AzFramework auto spawnedGameEntitiesIterator = m_spawnedEntities.find(entityId); if (spawnedGameEntitiesIterator != m_spawnedEntities.end()) { - SpawnableEntitiesDefinition* spawnableEntitiesInterface = SpawnableEntitiesInterface::Get(); - AZ_Assert(spawnableEntitiesInterface == nullptr, "SpawnableEntitiesInterface is not found."); spawnableEntitiesInterface->ClaimEntity( spawnedGameEntitiesIterator->first, spawnedGameEntitiesIterator->second); m_spawnedEntities.erase(entityId); diff --git a/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnedEntityTicketMapper.h b/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnedEntityTicketMapper.h index 36582a05b2..45e701db4e 100644 --- a/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnedEntityTicketMapper.h +++ b/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnedEntityTicketMapper.h @@ -23,7 +23,7 @@ namespace AzFramework SpawnedEntityTicketMapper(); ~SpawnedEntityTicketMapper(); - //! Removes the entityId from the spawned entities map. + //! Removes the entityId from the spawned entities map if present. //! @param entityId The id of the entity to remove. void RemoveSpawnedEntity(AZ::EntityId entityId) override; @@ -32,6 +32,7 @@ namespace AzFramework //! @param ticket The ticket pointer to add. void AddSpawnedEntity(AZ::EntityId entityId, void* ticket) override; private: + SpawnableEntitiesDefinition* spawnableEntitiesInterface = nullptr; AZStd::unordered_map m_spawnedEntities; }; } // namespace AzFramework