| 1451 | #endif |
| 1452 | |
| 1453 | ParticleBuffer* Particles::AcquireParticleBuffer(ParticleEmitter* emitter) |
| 1454 | { |
| 1455 | PROFILE_CPU(); |
| 1456 | PROFILE_MEM(Particles); |
| 1457 | ParticleBuffer* result = nullptr; |
| 1458 | ASSERT(emitter && emitter->IsLoaded()); |
| 1459 | |
| 1460 | if (emitter->EnablePooling && EnableParticleBufferPooling) |
| 1461 | { |
| 1462 | PoolLocker.Lock(); |
| 1463 | const auto entries = Pool.TryGet(emitter); |
| 1464 | if (entries) |
| 1465 | { |
| 1466 | while (entries->HasItems() && !result) |
| 1467 | { |
| 1468 | // Reuse buffer |
| 1469 | result = entries->Last().Buffer; |
| 1470 | entries->RemoveLast(); |
| 1471 | |
| 1472 | // Remove old buffers |
| 1473 | if (result->Version != emitter->Graph.Version) |
| 1474 | { |
| 1475 | Delete(result); |
| 1476 | result = nullptr; |
| 1477 | } |
| 1478 | } |
| 1479 | } |
| 1480 | PoolLocker.Unlock(); |
| 1481 | } |
| 1482 | |
| 1483 | if (!result) |
| 1484 | { |
| 1485 | // Create new buffer |
| 1486 | result = New<ParticleBuffer>(); |
| 1487 | if (result->Init(emitter)) |
| 1488 | { |
| 1489 | LOG(Error, "Failed to create particle buffer for emitter {0}", emitter->ToString()); |
| 1490 | Delete(result); |
| 1491 | return nullptr; |
| 1492 | } |
| 1493 | } |
| 1494 | else |
| 1495 | { |
| 1496 | // Prepare buffer |
| 1497 | result->Clear(); |
| 1498 | } |
| 1499 | |
| 1500 | return result; |
| 1501 | } |
| 1502 | |
| 1503 | void Particles::RecycleParticleBuffer(ParticleBuffer* buffer) |
| 1504 | { |