5 PL_ALWAYS_INLINE WorldData::HierarchyType::Enum WorldData::GetHierarchyType(
bool bIsDynamic)
7 return bIsDynamic ? HierarchyType::Dynamic : HierarchyType::Static;
11 template <
typename VISITOR>
12 PL_FORCE_INLINE
plVisitorExecution::Enum WorldData::TraverseHierarchyLevel(Hierarchy::DataBlockArray& blocks,
void* pUserData )
14 for (WorldData::Hierarchy::DataBlock& block : blocks)
16 plGameObject::TransformationData* pCurrentData = block.m_pData;
17 plGameObject::TransformationData* pEndData = block.m_pData + block.m_uiCount;
19 while (pCurrentData < pEndData)
33 template <
typename VISITOR>
35 Hierarchy::DataBlockArray& blocks,
void* pUserData )
45 for (WorldData::Hierarchy::DataBlock& block : blocksSlice)
47 plGameObject::TransformationData* pCurrentData = block.m_pData;
48 plGameObject::TransformationData* pEndData = block.m_pData + block.m_uiCount;
50 while (pCurrentData < pEndData)
52 VISITOR::Visit(pCurrentData, pUserData);
57 "World DataBlock Traversal Task", parallelForParams);
63 PL_FORCE_INLINE
void WorldData::UpdateGlobalTransform(plGameObject::TransformationData* pData, plUInt32 uiUpdateCounter)
65 pData->UpdateGlobalTransformWithoutParent(uiUpdateCounter);
66 pData->UpdateGlobalBounds();
70 PL_FORCE_INLINE
void WorldData::UpdateGlobalTransformWithParent(plGameObject::TransformationData* pData, plUInt32 uiUpdateCounter)
72 pData->UpdateGlobalTransformWithParent(uiUpdateCounter);
73 pData->UpdateGlobalBounds();
77 PL_FORCE_INLINE
void WorldData::UpdateGlobalTransformAndSpatialData(plGameObject::TransformationData* pData, plUInt32 uiUpdateCounter,
plSpatialSystem& spatialSystem)
79 pData->UpdateGlobalTransformWithoutParent(uiUpdateCounter);
80 pData->UpdateGlobalBoundsAndSpatialData(spatialSystem);
84 PL_FORCE_INLINE
void WorldData::UpdateGlobalTransformWithParentAndSpatialData(plGameObject::TransformationData* pData, plUInt32 uiUpdateCounter,
plSpatialSystem& spatialSystem)
86 pData->UpdateGlobalTransformWithParent(uiUpdateCounter);
87 pData->UpdateGlobalBoundsAndSpatialData(spatialSystem);
92 PL_ALWAYS_INLINE
const plGameObject& WorldData::ConstObjectIterator::operator*()
const
97 PL_ALWAYS_INLINE
const plGameObject* WorldData::ConstObjectIterator::operator->()
const
102 PL_ALWAYS_INLINE WorldData::ConstObjectIterator::operator
const plGameObject*()
const
107 PL_ALWAYS_INLINE
void WorldData::ConstObjectIterator::Next()
111 while (m_Iterator.IsValid() && m_Iterator->GetHandle().IsInvalidated())
117 PL_ALWAYS_INLINE
bool WorldData::ConstObjectIterator::IsValid()
const
119 return m_Iterator.IsValid();
122 PL_ALWAYS_INLINE
void WorldData::ConstObjectIterator::operator++()
127 PL_ALWAYS_INLINE WorldData::ConstObjectIterator::ConstObjectIterator(ObjectStorage::ConstIterator iterator)
128 : m_Iterator(iterator)
130 while (m_Iterator.IsValid() && m_Iterator->
GetHandle().IsInvalidated())
138 PL_ALWAYS_INLINE
plGameObject& WorldData::ObjectIterator::operator*()
143 PL_ALWAYS_INLINE
plGameObject* WorldData::ObjectIterator::operator->()
148 PL_ALWAYS_INLINE WorldData::ObjectIterator::operator
plGameObject*()
157 while (m_Iterator.IsValid() && m_Iterator->GetHandle().IsInvalidated())
165 return m_Iterator.IsValid();
173 PL_ALWAYS_INLINE WorldData::ObjectIterator::ObjectIterator(ObjectStorage::Iterator iterator)
174 : m_Iterator(iterator)
176 while (m_Iterator.IsValid() && m_Iterator->
GetHandle().IsInvalidated())
184 PL_FORCE_INLINE WorldData::InitBatch::InitBatch(
plAllocator* pAllocator,
plStringView sName,
bool bMustFinishWithinOneFrame)
185 : m_bMustFinishWithinOneFrame(bMustFinishWithinOneFrame)
186 , m_ComponentsToInitialize(pAllocator)
187 , m_ComponentsToStartSimulation(pAllocator)
189 m_sName.Assign(sName);
196 m_Function = desc.m_Function;
197 m_sFunctionName = desc.m_sFunctionName;
198 m_fPriority = desc.m_fPriority;
199 m_uiGranularity = desc.m_uiGranularity;
200 m_bOnlyUpdateWhenSimulating = desc.m_bOnlyUpdateWhenSimulating;
203 PL_FORCE_INLINE
bool WorldData::RegisteredUpdateFunction::operator<(
const RegisteredUpdateFunction& other)
const
206 if (m_fPriority != other.m_fPriority)
207 return m_fPriority > other.m_fPriority;
211 PL_ASSERT_DEV(iNameComp != 0,
"An update function with the same name and same priority is already registered. This breaks determinism.");
212 return iNameComp < 0;
217 PL_ALWAYS_INLINE WorldData::ReadMarker::ReadMarker(
const WorldData& data)
222 PL_FORCE_INLINE
void WorldData::ReadMarker::Lock()
225 "World '{0}' cannot be marked for reading because it is already marked for writing by another thread.", m_Data.m_sName);
226 m_Data.m_iReadCounter.Increment();
229 PL_ALWAYS_INLINE
void WorldData::ReadMarker::Unlock()
231 m_Data.m_iReadCounter.Decrement();
236 PL_ALWAYS_INLINE WorldData::WriteMarker::WriteMarker(WorldData& data)
241 PL_FORCE_INLINE
void WorldData::WriteMarker::Lock()
246 PL_ASSERT_DEV(m_Data.m_iReadCounter == 0,
"World '{0}' cannot be marked for writing because it is already marked for reading.", m_Data.m_sName);
247 PL_ASSERT_DEV(m_Data.m_WriteThreadID == (plThreadID)0,
248 "World '{0}' cannot be marked for writing because it is already marked for writing by another thread.", m_Data.m_sName);
251 m_Data.m_iReadCounter.Increment();
254 m_Data.m_iWriteCounter++;
257 PL_FORCE_INLINE
void WorldData::WriteMarker::Unlock()
259 m_Data.m_iWriteCounter--;
261 if (m_Data.m_iWriteCounter == 0)
263 m_Data.m_iReadCounter.Decrement();
264 m_Data.m_WriteThreadID = (plThreadID)0;
Base class for all memory allocators.
Definition Allocator.h:23
This class encapsulates an array and it's size. It is recommended to use this class instead of plain ...
Definition ArrayPtr.h:37
This class represents an object inside the world.
Definition GameObject.h:32
plGameObjectHandle GetHandle() const
Returns a handle to this object.
Definition GameObject_inl.h:64
bool IsValid() const
Checks whether this iterator points to a valid object.
Definition WorldData_inl.h:163
void Next()
Advances the iterator to the next object. The iterator will not be valid anymore, if the last object ...
Definition WorldData_inl.h:153
void operator++()
Shorthand for 'Next'.
Definition WorldData_inl.h:168
Definition SpatialSystem.h:10
static plInt32 Compare(const char *pString1, const char *pString2, const char *pString1End=plUnicodeUtils::GetMaxStringEnd< char >(), const char *pString2End=plUnicodeUtils::GetMaxStringEnd< char >())
Compares two strings for equality.
Definition StringUtils.cpp:218
plStringView represent a read-only sub-string of a larger string, as it can store a dedicated string ...
Definition StringView.h:34
static void ParallelFor(plArrayPtr< ElemType > taskItems, Callback taskCallback, const char *szTaskName=nullptr, const plParallelForParams ¶ms=plParallelForParams())
Definition ParallelFor_inl.h:73
static plThreadID GetCurrentThreadID()
Returns an identifier for the currently running thread.
Definition ThreadUtils_Posix.h:42
Settings for plTaskSystem::ParallelFor invocations.
Definition TaskSystemDeclarations.h:167
plAllocator * m_pTaskAllocator
The allocator used to for the tasks that the parallel-for uses internally. If null,...
Definition TaskSystemDeclarations.h:186
plUInt32 m_uiMaxTasksPerThread
Definition TaskSystemDeclarations.h:181
plUInt32 m_uiBinSize
Definition TaskSystemDeclarations.h:173
Enum
Definition Declarations.h:344
@ Continue
Continue regular iteration.
Definition Declarations.h:345
Description of an update function that can be registered at the world.
Definition WorldModule.h:43