Enable destroying game entities spawned with a spawnable
Signed-off-by: srikappa-amzn <srikappa@amazon.com>
This commit is contained in:
@@ -91,15 +91,6 @@ namespace AzFramework
|
|||||||
*/
|
*/
|
||||||
virtual void DestroyGameEntity(const AZ::EntityId& /*id*/) = 0;
|
virtual void DestroyGameEntity(const AZ::EntityId& /*id*/) = 0;
|
||||||
|
|
||||||
/**
|
|
||||||
* Destroys an entity only in slice mode (when prefabs are disabled). This request is only added as a stop-gap solution
|
|
||||||
* to prevent the editor from crashing when prefabs are enabled and must only be called through the BehaviorContext binding
|
|
||||||
* for 'DestroyGameEntity'. No code should be written to directly call this method. This will be removed soon.
|
|
||||||
*
|
|
||||||
* @param id The ID of the entity to destroy.
|
|
||||||
*/
|
|
||||||
virtual void DestroyGameEntityOnlyInSliceMode(const AZ::EntityId& /*id*/) = 0;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Destroys an entity and all of its descendants.
|
* Destroys an entity and all of its descendants.
|
||||||
* The entity and its descendants are immediately deactivated and will be
|
* The entity and its descendants are immediately deactivated and will be
|
||||||
@@ -108,15 +99,6 @@ namespace AzFramework
|
|||||||
*/
|
*/
|
||||||
virtual void DestroyGameEntityAndDescendants(const AZ::EntityId& /*id*/) = 0;
|
virtual void DestroyGameEntityAndDescendants(const AZ::EntityId& /*id*/) = 0;
|
||||||
|
|
||||||
/**
|
|
||||||
* Destroys an entity and its descendants only in slice mode (when prefabs are disabled). This request is only added as a stop-gap
|
|
||||||
* solution to prevent the editor from crashing when prefabs are enabled and must only be called through the BehaviorContext
|
|
||||||
* binding for 'DestroyGameEntityAndDescendants'.No code should be written to directly call this method. This will be removed soon.
|
|
||||||
*
|
|
||||||
* @param id The ID of the entity to destroy.
|
|
||||||
*/
|
|
||||||
virtual void DestroyGameEntityAndDescendantsOnlyInSliceMode(const AZ::EntityId& /*id*/) = 0;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Activates the game entity.
|
* Activates the game entity.
|
||||||
* @param id The ID of the entity to activate.
|
* @param id The ID of the entity to activate.
|
||||||
|
|||||||
@@ -11,9 +11,10 @@
|
|||||||
#include <AzCore/Serialization/SerializeContext.h>
|
#include <AzCore/Serialization/SerializeContext.h>
|
||||||
#include <AzCore/Serialization/EditContext.h>
|
#include <AzCore/Serialization/EditContext.h>
|
||||||
#include <AzCore/RTTI/BehaviorContext.h>
|
#include <AzCore/RTTI/BehaviorContext.h>
|
||||||
|
#include <AzFramework/API/ApplicationAPI.h>
|
||||||
#include <AzFramework/Entity/EntityContext.h>
|
#include <AzFramework/Entity/EntityContext.h>
|
||||||
#include <AzFramework/Components/TransformComponent.h>
|
#include <AzFramework/Components/TransformComponent.h>
|
||||||
#include <AzFramework/API/ApplicationAPI.h>
|
#include <AzFramework/Spawnable/SpawnedEntityTicketMapperInterface.h>
|
||||||
|
|
||||||
#include "GameEntityContextComponent.h"
|
#include "GameEntityContextComponent.h"
|
||||||
|
|
||||||
@@ -47,9 +48,9 @@ namespace AzFramework
|
|||||||
->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Common)
|
->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Common)
|
||||||
->Event("CreateGameEntity", &GameEntityContextRequestBus::Events::CreateGameEntityForBehaviorContext)
|
->Event("CreateGameEntity", &GameEntityContextRequestBus::Events::CreateGameEntityForBehaviorContext)
|
||||||
->Attribute(AZ::Script::Attributes::ExcludeFrom, AZ::Script::Attributes::ExcludeFlags::All)
|
->Attribute(AZ::Script::Attributes::ExcludeFrom, AZ::Script::Attributes::ExcludeFlags::All)
|
||||||
->Event("DestroyGameEntity", &GameEntityContextRequestBus::Events::DestroyGameEntityOnlyInSliceMode)
|
->Event("DestroyGameEntity", &GameEntityContextRequestBus::Events::DestroyGameEntity)
|
||||||
->Event(
|
->Event(
|
||||||
"DestroyGameEntityAndDescendants", &GameEntityContextRequestBus::Events::DestroyGameEntityAndDescendantsOnlyInSliceMode)
|
"DestroyGameEntityAndDescendants", &GameEntityContextRequestBus::Events::DestroyGameEntityAndDescendants)
|
||||||
->Event("ActivateGameEntity", &GameEntityContextRequestBus::Events::ActivateGameEntity)
|
->Event("ActivateGameEntity", &GameEntityContextRequestBus::Events::ActivateGameEntity)
|
||||||
->Event("DeactivateGameEntity", &GameEntityContextRequestBus::Events::DeactivateGameEntity)
|
->Event("DeactivateGameEntity", &GameEntityContextRequestBus::Events::DeactivateGameEntity)
|
||||||
->Attribute(AZ::ScriptCanvasAttributes::DeactivatesInputEntity, true)
|
->Attribute(AZ::ScriptCanvasAttributes::DeactivatesInputEntity, true)
|
||||||
@@ -249,23 +250,6 @@ namespace AzFramework
|
|||||||
DestroyGameEntityInternal(id, false);
|
DestroyGameEntityInternal(id, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GameEntityContextComponent::DestroyGameEntityOnlyInSliceMode(const AZ::EntityId& id)
|
|
||||||
{
|
|
||||||
bool isPrefabSystemEnabled = false;
|
|
||||||
AzFramework::ApplicationRequests::Bus::BroadcastResult(
|
|
||||||
isPrefabSystemEnabled, &AzFramework::ApplicationRequests::IsPrefabSystemEnabled);
|
|
||||||
if (!isPrefabSystemEnabled)
|
|
||||||
{
|
|
||||||
DestroyGameEntityInternal(id, false);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
AZ_Error(
|
|
||||||
"GameEntityContextComponent", false,
|
|
||||||
"Destroying a game entity is temporarily disabled until the Spawnable system can support this.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//=========================================================================
|
//=========================================================================
|
||||||
// GameEntityContextComponent::DestroyGameEntityAndDescendantsById
|
// GameEntityContextComponent::DestroyGameEntityAndDescendantsById
|
||||||
//=========================================================================
|
//=========================================================================
|
||||||
@@ -274,24 +258,6 @@ namespace AzFramework
|
|||||||
DestroyGameEntityInternal(id, true);
|
DestroyGameEntityInternal(id, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void GameEntityContextComponent::DestroyGameEntityAndDescendantsOnlyInSliceMode(const AZ::EntityId& id)
|
|
||||||
{
|
|
||||||
bool isPrefabSystemEnabled = false;
|
|
||||||
AzFramework::ApplicationRequests::Bus::BroadcastResult(
|
|
||||||
isPrefabSystemEnabled, &AzFramework::ApplicationRequests::IsPrefabSystemEnabled);
|
|
||||||
if (!isPrefabSystemEnabled)
|
|
||||||
{
|
|
||||||
DestroyGameEntityInternal(id, true);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
AZ_Error(
|
|
||||||
"GameEntityContextComponent", false,
|
|
||||||
"Destroying a game entity and its descendants is temporarily disabled until the Spawnable system can support this.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//=========================================================================
|
//=========================================================================
|
||||||
// GameEntityContextComponent::DestroyGameEntityInternal
|
// GameEntityContextComponent::DestroyGameEntityInternal
|
||||||
//=========================================================================
|
//=========================================================================
|
||||||
@@ -319,6 +285,14 @@ namespace AzFramework
|
|||||||
EBUS_EVENT_RESULT(currentEntity, AZ::ComponentApplicationBus, FindEntity, *entityIdIter);
|
EBUS_EVENT_RESULT(currentEntity, AZ::ComponentApplicationBus, FindEntity, *entityIdIter);
|
||||||
if (currentEntity)
|
if (currentEntity)
|
||||||
{
|
{
|
||||||
|
bool isPrefabSystemEnabled = false;
|
||||||
|
AzFramework::ApplicationRequests::Bus::BroadcastResult(
|
||||||
|
isPrefabSystemEnabled, &AzFramework::ApplicationRequests::IsPrefabSystemEnabled);
|
||||||
|
if (isPrefabSystemEnabled)
|
||||||
|
{
|
||||||
|
AZ::Interface<SpawnedEntityTicketMapperInterface>::Get()->RemoveSpawnedEntity(currentEntity->GetId());
|
||||||
|
}
|
||||||
|
|
||||||
if (currentEntity->GetState() == AZ::Entity::State::Active)
|
if (currentEntity->GetState() == AZ::Entity::State::Active)
|
||||||
{
|
{
|
||||||
// Deactivate the entity, we'll destroy it as soon as it is safe.
|
// Deactivate the entity, we'll destroy it as soon as it is safe.
|
||||||
|
|||||||
@@ -90,11 +90,6 @@ namespace AzFramework
|
|||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
//////////////////////////////////////////////////////////////////////////
|
|
||||||
// GameEntityContextRequestBus
|
|
||||||
void DestroyGameEntityOnlyInSliceMode(const AZ::EntityId&) override;
|
|
||||||
void DestroyGameEntityAndDescendantsOnlyInSliceMode(const AZ::EntityId&) override;
|
|
||||||
/////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
AzFramework::EntityVisibilityBoundsUnionSystem m_entityVisibilityBoundsUnionSystem;
|
AzFramework::EntityVisibilityBoundsUnionSystem m_entityVisibilityBoundsUnionSystem;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -235,6 +235,12 @@ namespace AzFramework
|
|||||||
SpawnablePriority m_priority{ SpawnablePriority_Default };
|
SpawnablePriority m_priority{ SpawnablePriority_Default };
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct ClaimEntityOptionalArgs final
|
||||||
|
{
|
||||||
|
//! The priority at which this call will be executed.
|
||||||
|
SpawnablePriority m_priority{ SpawnablePriority_Default };
|
||||||
|
};
|
||||||
|
|
||||||
struct BarrierOptionalArgs final
|
struct BarrierOptionalArgs final
|
||||||
{
|
{
|
||||||
//! The priority at which this call will be executed.
|
//! The priority at which this call will be executed.
|
||||||
@@ -314,6 +320,8 @@ namespace AzFramework
|
|||||||
virtual void ClaimEntities(
|
virtual void ClaimEntities(
|
||||||
EntitySpawnTicket& ticket, ClaimEntitiesCallback listCallback, ClaimEntitiesOptionalArgs optionalArgs = {}) = 0;
|
EntitySpawnTicket& ticket, ClaimEntitiesCallback listCallback, ClaimEntitiesOptionalArgs optionalArgs = {}) = 0;
|
||||||
|
|
||||||
|
virtual void ClaimEntity(AZ::EntityId entityId, void* ticket, ClaimEntityOptionalArgs optionalArgs = {}) = 0;
|
||||||
|
|
||||||
//! Blocks until all operations made on the provided ticket before the barrier call have completed.
|
//! Blocks until all operations made on the provided ticket before the barrier call have completed.
|
||||||
//! @param ticket The ticket to monitor.
|
//! @param ticket The ticket to monitor.
|
||||||
//! @param completionCallback Required callback that will be called as soon as the barrier has been reached.
|
//! @param completionCallback Required callback that will be called as soon as the barrier has been reached.
|
||||||
|
|||||||
@@ -17,17 +17,18 @@
|
|||||||
#include <AzFramework/Entity/GameEntityContextBus.h>
|
#include <AzFramework/Entity/GameEntityContextBus.h>
|
||||||
#include <AzFramework/Spawnable/Spawnable.h>
|
#include <AzFramework/Spawnable/Spawnable.h>
|
||||||
#include <AzFramework/Spawnable/SpawnableEntitiesManager.h>
|
#include <AzFramework/Spawnable/SpawnableEntitiesManager.h>
|
||||||
|
#include <AzFramework/Spawnable/SpawnedEntityTicketMapperInterface.h>
|
||||||
|
|
||||||
namespace AzFramework
|
namespace AzFramework
|
||||||
{
|
{
|
||||||
template<typename T>
|
template<typename T>
|
||||||
void SpawnableEntitiesManager::QueueRequest(EntitySpawnTicket& ticket, SpawnablePriority priority, T&& request)
|
void SpawnableEntitiesManager::QueueRequest(Ticket* ticket, SpawnablePriority priority, T&& request)
|
||||||
{
|
{
|
||||||
request.m_ticket = &GetTicketPayload<Ticket>(ticket);
|
request.m_ticket = ticket;
|
||||||
Queue& queue = priority <= m_highPriorityThreshold ? m_highPriorityQueue : m_regularPriorityQueue;
|
Queue& queue = priority <= m_highPriorityThreshold ? m_highPriorityQueue : m_regularPriorityQueue;
|
||||||
{
|
{
|
||||||
AZStd::scoped_lock queueLock(queue.m_pendingRequestMutex);
|
AZStd::scoped_lock queueLock(queue.m_pendingRequestMutex);
|
||||||
request.m_requestId = GetTicketPayload<Ticket>(ticket).m_nextRequestId++;
|
request.m_requestId = ticket->m_nextRequestId++;
|
||||||
queue.m_pendingRequest.push(AZStd::move(request));
|
queue.m_pendingRequest.push(AZStd::move(request));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -56,7 +57,7 @@ namespace AzFramework
|
|||||||
optionalArgs.m_serializeContext == nullptr ? m_defaultSerializeContext : optionalArgs.m_serializeContext;
|
optionalArgs.m_serializeContext == nullptr ? m_defaultSerializeContext : optionalArgs.m_serializeContext;
|
||||||
queueEntry.m_completionCallback = AZStd::move(optionalArgs.m_completionCallback);
|
queueEntry.m_completionCallback = AZStd::move(optionalArgs.m_completionCallback);
|
||||||
queueEntry.m_preInsertionCallback = AZStd::move(optionalArgs.m_preInsertionCallback);
|
queueEntry.m_preInsertionCallback = AZStd::move(optionalArgs.m_preInsertionCallback);
|
||||||
QueueRequest(ticket, optionalArgs.m_priority, AZStd::move(queueEntry));
|
QueueRequest(&GetTicketPayload<Ticket>(ticket), optionalArgs.m_priority, AZStd::move(queueEntry));
|
||||||
}
|
}
|
||||||
|
|
||||||
void SpawnableEntitiesManager::SpawnEntities(
|
void SpawnableEntitiesManager::SpawnEntities(
|
||||||
@@ -72,7 +73,7 @@ namespace AzFramework
|
|||||||
queueEntry.m_completionCallback = AZStd::move(optionalArgs.m_completionCallback);
|
queueEntry.m_completionCallback = AZStd::move(optionalArgs.m_completionCallback);
|
||||||
queueEntry.m_preInsertionCallback = AZStd::move(optionalArgs.m_preInsertionCallback);
|
queueEntry.m_preInsertionCallback = AZStd::move(optionalArgs.m_preInsertionCallback);
|
||||||
queueEntry.m_referencePreviouslySpawnedEntities = optionalArgs.m_referencePreviouslySpawnedEntities;
|
queueEntry.m_referencePreviouslySpawnedEntities = optionalArgs.m_referencePreviouslySpawnedEntities;
|
||||||
QueueRequest(ticket, optionalArgs.m_priority, AZStd::move(queueEntry));
|
QueueRequest(&GetTicketPayload<Ticket>(ticket), optionalArgs.m_priority, AZStd::move(queueEntry));
|
||||||
}
|
}
|
||||||
|
|
||||||
void SpawnableEntitiesManager::DespawnAllEntities(EntitySpawnTicket& ticket, DespawnAllEntitiesOptionalArgs optionalArgs)
|
void SpawnableEntitiesManager::DespawnAllEntities(EntitySpawnTicket& ticket, DespawnAllEntitiesOptionalArgs optionalArgs)
|
||||||
@@ -82,7 +83,7 @@ namespace AzFramework
|
|||||||
DespawnAllEntitiesCommand queueEntry;
|
DespawnAllEntitiesCommand queueEntry;
|
||||||
queueEntry.m_ticketId = ticket.GetId();
|
queueEntry.m_ticketId = ticket.GetId();
|
||||||
queueEntry.m_completionCallback = AZStd::move(optionalArgs.m_completionCallback);
|
queueEntry.m_completionCallback = AZStd::move(optionalArgs.m_completionCallback);
|
||||||
QueueRequest(ticket, optionalArgs.m_priority, AZStd::move(queueEntry));
|
QueueRequest(&GetTicketPayload<Ticket>(ticket), optionalArgs.m_priority, AZStd::move(queueEntry));
|
||||||
}
|
}
|
||||||
|
|
||||||
void SpawnableEntitiesManager::ReloadSpawnable(
|
void SpawnableEntitiesManager::ReloadSpawnable(
|
||||||
@@ -96,7 +97,7 @@ namespace AzFramework
|
|||||||
queueEntry.m_serializeContext =
|
queueEntry.m_serializeContext =
|
||||||
optionalArgs.m_serializeContext == nullptr ? m_defaultSerializeContext : optionalArgs.m_serializeContext;
|
optionalArgs.m_serializeContext == nullptr ? m_defaultSerializeContext : optionalArgs.m_serializeContext;
|
||||||
queueEntry.m_completionCallback = AZStd::move(optionalArgs.m_completionCallback);
|
queueEntry.m_completionCallback = AZStd::move(optionalArgs.m_completionCallback);
|
||||||
QueueRequest(ticket, optionalArgs.m_priority, AZStd::move(queueEntry));
|
QueueRequest(&GetTicketPayload<Ticket>(ticket), optionalArgs.m_priority, AZStd::move(queueEntry));
|
||||||
}
|
}
|
||||||
|
|
||||||
void SpawnableEntitiesManager::ListEntities(
|
void SpawnableEntitiesManager::ListEntities(
|
||||||
@@ -108,7 +109,7 @@ namespace AzFramework
|
|||||||
ListEntitiesCommand queueEntry;
|
ListEntitiesCommand queueEntry;
|
||||||
queueEntry.m_ticketId = ticket.GetId();
|
queueEntry.m_ticketId = ticket.GetId();
|
||||||
queueEntry.m_listCallback = AZStd::move(listCallback);
|
queueEntry.m_listCallback = AZStd::move(listCallback);
|
||||||
QueueRequest(ticket, optionalArgs.m_priority, AZStd::move(queueEntry));
|
QueueRequest(&GetTicketPayload<Ticket>(ticket), optionalArgs.m_priority, AZStd::move(queueEntry));
|
||||||
}
|
}
|
||||||
|
|
||||||
void SpawnableEntitiesManager::ListIndicesAndEntities(
|
void SpawnableEntitiesManager::ListIndicesAndEntities(
|
||||||
@@ -120,7 +121,7 @@ namespace AzFramework
|
|||||||
ListIndicesEntitiesCommand queueEntry;
|
ListIndicesEntitiesCommand queueEntry;
|
||||||
queueEntry.m_ticketId = ticket.GetId();
|
queueEntry.m_ticketId = ticket.GetId();
|
||||||
queueEntry.m_listCallback = AZStd::move(listCallback);
|
queueEntry.m_listCallback = AZStd::move(listCallback);
|
||||||
QueueRequest(ticket, optionalArgs.m_priority, AZStd::move(queueEntry));
|
QueueRequest(&GetTicketPayload<Ticket>(ticket), optionalArgs.m_priority, AZStd::move(queueEntry));
|
||||||
}
|
}
|
||||||
|
|
||||||
void SpawnableEntitiesManager::ClaimEntities(
|
void SpawnableEntitiesManager::ClaimEntities(
|
||||||
@@ -132,7 +133,18 @@ namespace AzFramework
|
|||||||
ClaimEntitiesCommand queueEntry;
|
ClaimEntitiesCommand queueEntry;
|
||||||
queueEntry.m_ticketId = ticket.GetId();
|
queueEntry.m_ticketId = ticket.GetId();
|
||||||
queueEntry.m_listCallback = AZStd::move(listCallback);
|
queueEntry.m_listCallback = AZStd::move(listCallback);
|
||||||
QueueRequest(ticket, optionalArgs.m_priority, AZStd::move(queueEntry));
|
QueueRequest(&GetTicketPayload<Ticket>(ticket), optionalArgs.m_priority, AZStd::move(queueEntry));
|
||||||
|
}
|
||||||
|
|
||||||
|
void SpawnableEntitiesManager::ClaimEntity(
|
||||||
|
AZ::EntityId entityId, void* ticket,
|
||||||
|
ClaimEntityOptionalArgs optionalArgs)
|
||||||
|
{
|
||||||
|
AZ_Assert(ticket == nullptr, "Ticket provided to ClaimEntity is invalid.");
|
||||||
|
|
||||||
|
ClaimEntityCommand queueEntry;
|
||||||
|
queueEntry.m_entityId = entityId;
|
||||||
|
QueueRequest(reinterpret_cast<Ticket*>(ticket), optionalArgs.m_priority, AZStd::move(queueEntry));
|
||||||
}
|
}
|
||||||
|
|
||||||
void SpawnableEntitiesManager::Barrier(EntitySpawnTicket& ticket, BarrierCallback completionCallback, BarrierOptionalArgs optionalArgs)
|
void SpawnableEntitiesManager::Barrier(EntitySpawnTicket& ticket, BarrierCallback completionCallback, BarrierOptionalArgs optionalArgs)
|
||||||
@@ -143,7 +155,7 @@ namespace AzFramework
|
|||||||
BarrierCommand queueEntry;
|
BarrierCommand queueEntry;
|
||||||
queueEntry.m_ticketId = ticket.GetId();
|
queueEntry.m_ticketId = ticket.GetId();
|
||||||
queueEntry.m_completionCallback = AZStd::move(completionCallback);
|
queueEntry.m_completionCallback = AZStd::move(completionCallback);
|
||||||
QueueRequest(ticket, optionalArgs.m_priority, AZStd::move(queueEntry));
|
QueueRequest(&GetTicketPayload<Ticket>(ticket), optionalArgs.m_priority, AZStd::move(queueEntry));
|
||||||
}
|
}
|
||||||
|
|
||||||
auto SpawnableEntitiesManager::ProcessQueue(CommandQueuePriority priority) -> CommandQueueStatus
|
auto SpawnableEntitiesManager::ProcessQueue(CommandQueuePriority priority) -> CommandQueueStatus
|
||||||
@@ -340,6 +352,7 @@ namespace AzFramework
|
|||||||
for (auto it = ticket.m_spawnedEntities.begin() + spawnedEntitiesInitialCount; it != ticket.m_spawnedEntities.end(); ++it)
|
for (auto it = ticket.m_spawnedEntities.begin() + spawnedEntitiesInitialCount; it != ticket.m_spawnedEntities.end(); ++it)
|
||||||
{
|
{
|
||||||
GameEntityContextRequestBus::Broadcast(&GameEntityContextRequestBus::Events::AddGameEntity, *it);
|
GameEntityContextRequestBus::Broadcast(&GameEntityContextRequestBus::Events::AddGameEntity, *it);
|
||||||
|
AZ::Interface<SpawnedEntityTicketMapperInterface>::Get()->AddSpawnedEntity((*it)->GetId(), &ticket);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Let other systems know about newly spawned entities for any post-processing after adding to the scene/game context.
|
// Let other systems know about newly spawned entities for any post-processing after adding to the scene/game context.
|
||||||
@@ -421,6 +434,7 @@ namespace AzFramework
|
|||||||
for (auto it = ticket.m_spawnedEntities.begin() + spawnedEntitiesInitialCount; it != ticket.m_spawnedEntities.end(); ++it)
|
for (auto it = ticket.m_spawnedEntities.begin() + spawnedEntitiesInitialCount; it != ticket.m_spawnedEntities.end(); ++it)
|
||||||
{
|
{
|
||||||
GameEntityContextRequestBus::Broadcast(&GameEntityContextRequestBus::Events::AddGameEntity, *it);
|
GameEntityContextRequestBus::Broadcast(&GameEntityContextRequestBus::Events::AddGameEntity, *it);
|
||||||
|
AZ::Interface<SpawnedEntityTicketMapperInterface>::Get()->AddSpawnedEntity((*it)->GetId(), &ticket);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (request.m_completionCallback)
|
if (request.m_completionCallback)
|
||||||
@@ -448,7 +462,7 @@ namespace AzFramework
|
|||||||
if (entity != nullptr)
|
if (entity != nullptr)
|
||||||
{
|
{
|
||||||
GameEntityContextRequestBus::Broadcast(
|
GameEntityContextRequestBus::Broadcast(
|
||||||
&GameEntityContextRequestBus::Events::DestroyGameEntityAndDescendants, entity->GetId());
|
&GameEntityContextRequestBus::Events::DestroyGameEntity, entity->GetId());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -483,7 +497,7 @@ namespace AzFramework
|
|||||||
if (entity != nullptr)
|
if (entity != nullptr)
|
||||||
{
|
{
|
||||||
GameEntityContextRequestBus::Broadcast(
|
GameEntityContextRequestBus::Broadcast(
|
||||||
&GameEntityContextRequestBus::Events::DestroyGameEntityAndDescendants, entity->GetId());
|
&GameEntityContextRequestBus::Events::DestroyGameEntity, entity->GetId());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -609,6 +623,31 @@ namespace AzFramework
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool SpawnableEntitiesManager::ProcessRequest(ClaimEntityCommand& request)
|
||||||
|
{
|
||||||
|
Ticket& ticket = *request.m_ticket;
|
||||||
|
if (request.m_requestId == ticket.m_currentRequestId)
|
||||||
|
{
|
||||||
|
AZStd::vector<AZ::Entity*>& spawnedEntities = ticket.m_spawnedEntities;
|
||||||
|
AZStd::vector<AZ::Entity*>::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++;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool SpawnableEntitiesManager::ProcessRequest(BarrierCommand& request)
|
bool SpawnableEntitiesManager::ProcessRequest(BarrierCommand& request)
|
||||||
{
|
{
|
||||||
Ticket& ticket = *request.m_ticket;
|
Ticket& ticket = *request.m_ticket;
|
||||||
@@ -637,7 +676,7 @@ namespace AzFramework
|
|||||||
if (entity != nullptr)
|
if (entity != nullptr)
|
||||||
{
|
{
|
||||||
GameEntityContextRequestBus::Broadcast(
|
GameEntityContextRequestBus::Broadcast(
|
||||||
&GameEntityContextRequestBus::Events::DestroyGameEntityAndDescendants, entity->GetId());
|
&GameEntityContextRequestBus::Events::DestroyGameEntity, entity->GetId());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
delete request.m_ticket;
|
delete request.m_ticket;
|
||||||
|
|||||||
@@ -66,6 +66,8 @@ namespace AzFramework
|
|||||||
EntitySpawnTicket& ticket, ListIndicesEntitiesCallback listCallback, ListEntitiesOptionalArgs optionalArgs = {}) override;
|
EntitySpawnTicket& ticket, ListIndicesEntitiesCallback listCallback, ListEntitiesOptionalArgs optionalArgs = {}) override;
|
||||||
void ClaimEntities(
|
void ClaimEntities(
|
||||||
EntitySpawnTicket& ticket, ClaimEntitiesCallback listCallback, ClaimEntitiesOptionalArgs optionalArgs = {}) override;
|
EntitySpawnTicket& ticket, ClaimEntitiesCallback listCallback, ClaimEntitiesOptionalArgs optionalArgs = {}) override;
|
||||||
|
void ClaimEntity(
|
||||||
|
AZ::EntityId entityId, void* ticket, ClaimEntityOptionalArgs optionalArgs = {}) override;
|
||||||
|
|
||||||
void Barrier(EntitySpawnTicket& spawnInfo, BarrierCallback completionCallback, BarrierOptionalArgs optionalArgs = {}) override;
|
void Barrier(EntitySpawnTicket& spawnInfo, BarrierCallback completionCallback, BarrierOptionalArgs optionalArgs = {}) override;
|
||||||
|
|
||||||
@@ -162,6 +164,13 @@ namespace AzFramework
|
|||||||
EntitySpawnTicket::Id m_ticketId;
|
EntitySpawnTicket::Id m_ticketId;
|
||||||
uint32_t m_requestId;
|
uint32_t m_requestId;
|
||||||
};
|
};
|
||||||
|
struct ClaimEntityCommand
|
||||||
|
{
|
||||||
|
Ticket* m_ticket;
|
||||||
|
EntitySpawnTicket::Id m_ticketId;
|
||||||
|
uint32_t m_requestId;
|
||||||
|
AZ::EntityId m_entityId;
|
||||||
|
};
|
||||||
struct BarrierCommand
|
struct BarrierCommand
|
||||||
{
|
{
|
||||||
BarrierCallback m_completionCallback;
|
BarrierCallback m_completionCallback;
|
||||||
@@ -177,7 +186,7 @@ namespace AzFramework
|
|||||||
|
|
||||||
using Requests = AZStd::variant<
|
using Requests = AZStd::variant<
|
||||||
SpawnAllEntitiesCommand, SpawnEntitiesCommand, DespawnAllEntitiesCommand, ReloadSpawnableCommand, ListEntitiesCommand,
|
SpawnAllEntitiesCommand, SpawnEntitiesCommand, DespawnAllEntitiesCommand, ReloadSpawnableCommand, ListEntitiesCommand,
|
||||||
ListIndicesEntitiesCommand, ClaimEntitiesCommand, BarrierCommand, DestroyTicketCommand>;
|
ListIndicesEntitiesCommand, ClaimEntitiesCommand, ClaimEntityCommand, BarrierCommand, DestroyTicketCommand>;
|
||||||
|
|
||||||
struct Queue
|
struct Queue
|
||||||
{
|
{
|
||||||
@@ -187,7 +196,7 @@ namespace AzFramework
|
|||||||
};
|
};
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
void QueueRequest(EntitySpawnTicket& ticket, SpawnablePriority priority, T&& request);
|
void QueueRequest(Ticket* ticket, SpawnablePriority priority, T&& request);
|
||||||
AZStd::pair<EntitySpawnTicket::Id, void*> CreateTicket(AZ::Data::Asset<Spawnable>&& spawnable) override;
|
AZStd::pair<EntitySpawnTicket::Id, void*> CreateTicket(AZ::Data::Asset<Spawnable>&& spawnable) override;
|
||||||
void DestroyTicket(void* ticket) override;
|
void DestroyTicket(void* ticket) override;
|
||||||
|
|
||||||
@@ -203,6 +212,7 @@ namespace AzFramework
|
|||||||
bool ProcessRequest(ListEntitiesCommand& request);
|
bool ProcessRequest(ListEntitiesCommand& request);
|
||||||
bool ProcessRequest(ListIndicesEntitiesCommand& request);
|
bool ProcessRequest(ListIndicesEntitiesCommand& request);
|
||||||
bool ProcessRequest(ClaimEntitiesCommand& request);
|
bool ProcessRequest(ClaimEntitiesCommand& request);
|
||||||
|
bool ProcessRequest(ClaimEntityCommand& request);
|
||||||
bool ProcessRequest(BarrierCommand& request);
|
bool ProcessRequest(BarrierCommand& request);
|
||||||
bool ProcessRequest(DestroyTicketCommand& request);
|
bool ProcessRequest(DestroyTicketCommand& request);
|
||||||
|
|
||||||
|
|||||||
@@ -18,6 +18,7 @@
|
|||||||
#include <AzFramework/Spawnable/SpawnableAssetHandler.h>
|
#include <AzFramework/Spawnable/SpawnableAssetHandler.h>
|
||||||
#include <AzFramework/Spawnable/SpawnableEntitiesContainer.h>
|
#include <AzFramework/Spawnable/SpawnableEntitiesContainer.h>
|
||||||
#include <AzFramework/Spawnable/SpawnableEntitiesManager.h>
|
#include <AzFramework/Spawnable/SpawnableEntitiesManager.h>
|
||||||
|
#include <AzFramework/Spawnable/SpawnedEntityTicketMapper.h>
|
||||||
|
|
||||||
namespace AzFramework
|
namespace AzFramework
|
||||||
{
|
{
|
||||||
@@ -90,6 +91,7 @@ namespace AzFramework
|
|||||||
void LoadRootSpawnableFromSettingsRegistry();
|
void LoadRootSpawnableFromSettingsRegistry();
|
||||||
|
|
||||||
SpawnableAssetHandler m_assetHandler;
|
SpawnableAssetHandler m_assetHandler;
|
||||||
|
SpawnedEntityTicketMapper m_spawnedEntityTicketMapper;
|
||||||
SpawnableEntitiesManager m_entitiesManager;
|
SpawnableEntitiesManager m_entitiesManager;
|
||||||
SpawnableEntitiesContainer m_rootSpawnableContainer;
|
SpawnableEntitiesContainer m_rootSpawnableContainer;
|
||||||
AZ::SettingsRegistryInterface::NotifyEventHandler m_registryChangeHandler;
|
AZ::SettingsRegistryInterface::NotifyEventHandler m_registryChangeHandler;
|
||||||
|
|||||||
@@ -0,0 +1,43 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) Contributors to the Open 3D Engine Project.
|
||||||
|
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0 OR MIT
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <AzFramework/Spawnable/SpawnableEntitiesInterface.h>
|
||||||
|
#include <AzFramework/Spawnable/SpawnedEntityTicketMapper.h>
|
||||||
|
|
||||||
|
namespace AzFramework
|
||||||
|
{
|
||||||
|
SpawnedEntityTicketMapper::SpawnedEntityTicketMapper()
|
||||||
|
{
|
||||||
|
AZ::Interface<SpawnedEntityTicketMapperInterface>::Register(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
SpawnedEntityTicketMapper::~SpawnedEntityTicketMapper()
|
||||||
|
{
|
||||||
|
AZ::Interface<SpawnedEntityTicketMapperInterface>::Unregister(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SpawnedEntityTicketMapper::RemoveSpawnedEntity(AZ::EntityId entityId)
|
||||||
|
{
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SpawnedEntityTicketMapper::AddSpawnedEntity(AZ::EntityId entityId, void* ticket)
|
||||||
|
{
|
||||||
|
m_spawnedEntities.emplace(entityId, ticket);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) Contributors to the Open 3D Engine Project.
|
||||||
|
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0 OR MIT
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <AzCore/Component/EntityId.h>
|
||||||
|
#include <AzCore/std/containers/unordered_map.h>
|
||||||
|
#include <AzFramework/Spawnable/SpawnedEntityTicketMapperInterface.h>
|
||||||
|
|
||||||
|
namespace AzFramework
|
||||||
|
{
|
||||||
|
class SpawnedEntityTicketMapper
|
||||||
|
: public SpawnedEntityTicketMapperInterface
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
AZ_RTTI(SpawnedEntityTicketMapper, "{5C803604-E949-44F4-94A4-F835E5794C77}", SpawnedEntityTicketMapperInterface);
|
||||||
|
|
||||||
|
SpawnedEntityTicketMapper();
|
||||||
|
~SpawnedEntityTicketMapper();
|
||||||
|
|
||||||
|
//! Removes the entityId from the spawned entities map.
|
||||||
|
//! @param entityId The id of the entity to remove.
|
||||||
|
void RemoveSpawnedEntity(AZ::EntityId entityId) override;
|
||||||
|
|
||||||
|
//! Adds the entityId,ticket pair to the spawned entities map.
|
||||||
|
//! @param entityId The id of the entity to add.
|
||||||
|
//! @param ticket The ticket pointer to add.
|
||||||
|
void AddSpawnedEntity(AZ::EntityId entityId, void* ticket) override;
|
||||||
|
private:
|
||||||
|
AZStd::unordered_map<AZ::EntityId, void*> m_spawnedEntities;
|
||||||
|
};
|
||||||
|
} // namespace AzFramework
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) Contributors to the Open 3D Engine Project.
|
||||||
|
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0 OR MIT
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <AzCore/Component/EntityId.h>
|
||||||
|
#include <AzCore/RTTI/RTTI.h>
|
||||||
|
|
||||||
|
namespace AzFramework
|
||||||
|
{
|
||||||
|
class SpawnedEntityTicketMapperInterface
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
AZ_RTTI(SpawnedEntityTicketMapperInterface, "{D407E96B-635C-44F2-B089-084EBAB8B036}");
|
||||||
|
|
||||||
|
virtual void RemoveSpawnedEntity(AZ::EntityId entityId) = 0;
|
||||||
|
virtual void AddSpawnedEntity(AZ::EntityId entityId, void* ticket) = 0;
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -294,6 +294,9 @@ set(FILES
|
|||||||
Spawnable/SpawnableMonitor.cpp
|
Spawnable/SpawnableMonitor.cpp
|
||||||
Spawnable/SpawnableSystemComponent.h
|
Spawnable/SpawnableSystemComponent.h
|
||||||
Spawnable/SpawnableSystemComponent.cpp
|
Spawnable/SpawnableSystemComponent.cpp
|
||||||
|
Spawnable/SpawnedEntityTicketMapper.h
|
||||||
|
Spawnable/SpawnedEntityTicketMapper.cpp
|
||||||
|
Spawnable/SpawnedEntityTicketMapperInterface.h
|
||||||
Terrain/TerrainDataRequestBus.h
|
Terrain/TerrainDataRequestBus.h
|
||||||
Terrain/TerrainDataRequestBus.cpp
|
Terrain/TerrainDataRequestBus.cpp
|
||||||
Thermal/ThermalInfo.h
|
Thermal/ThermalInfo.h
|
||||||
|
|||||||
Reference in New Issue
Block a user