Add support for multi-threaded CPU particles simulation

This commit is contained in:
Wojtek Figat
2021-06-15 23:48:00 +02:00
parent 2a73d18d14
commit d2d8a83461
11 changed files with 245 additions and 313 deletions

View File

@@ -335,7 +335,7 @@ void DrawEmitterCPU(RenderContext& renderContext, ParticleBuffer* buffer, DrawCa
break;
int32 count = buffer->CPU.Count;
ASSERT(buffer->CPU.RibbonOrder.Count() == emitter->Graph.RibbonRenderingModules.Count() * buffer->Capacity);
int32* ribbonOrderData = buffer->CPU.RibbonOrder.Get() + module->Ribbon.RibbonOrderOffset;
int32* ribbonOrderData = buffer->CPU.RibbonOrder.Get() + module->RibbonOrderOffset;
ParticleBufferCPUDataAccessor<Vector3> positionData(buffer, emitter->Graph.Layout.GetAttributeOffset(module->Attributes[0]));
@@ -483,7 +483,7 @@ void DrawEmitterCPU(RenderContext& renderContext, ParticleBuffer* buffer, DrawCa
Vector2 uvOffset = module->Values[5].AsVector2();
ParticleBufferCPUDataAccessor<float> sortKeyData(buffer, emitter->Graph.Layout.GetAttributeOffset(module->Attributes[1]));
int32* ribbonOrderData = buffer->CPU.RibbonOrder.Get() + module->Ribbon.RibbonOrderOffset;
int32* ribbonOrderData = buffer->CPU.RibbonOrder.Get() + module->RibbonOrderOffset;
int32 count = buffer->CPU.Count;
// Setup ribbon data
@@ -1073,6 +1073,7 @@ ParticleBuffer* Particles::AcquireParticleBuffer(ParticleEmitter* emitter)
if (emitter->EnablePooling && EnableParticleBufferPooling)
{
PoolLocker.Lock();
const auto entries = Pool.TryGet(emitter);
if (entries)
{
@@ -1087,7 +1088,6 @@ ParticleBuffer* Particles::AcquireParticleBuffer(ParticleEmitter* emitter)
{
Delete(result);
result = nullptr;
if (entries->IsEmpty())
{
Pool.Remove(emitter);
@@ -1096,6 +1096,7 @@ ParticleBuffer* Particles::AcquireParticleBuffer(ParticleEmitter* emitter)
}
}
}
PoolLocker.Unlock();
}
if (!result)