public unsafe void Render() { if (_activeCount > 0) { fixed (MetaParticle* buffer = _buffer) { var iterator = new ParticleIterator(buffer, _bufferSize, _head, _activeCount); _stateManager.Render(ref iterator); } } }
public unsafe void Trigger(float totalSeconds, Vector2 position) { fixed (MetaParticle* buffer = _buffer) { var startIndex = _next; var released = 0; for (var i = 0; i < ReleaseQuantity; i++) { var index = Push(); if (index < 0) break; Vector2 dir; Vector2 off; _shape.GetOffsetAndDirection(out off, out dir); var releaseInfo = new ReleaseInformation(totalSeconds, position + off, dir); (buffer + index)->ReleaseInfo = releaseInfo; released++; } if (released > 0) { var iterator = new ParticleIterator(buffer, _bufferSize, startIndex, released); _stateManager.Trigger(ref iterator); } } }
public unsafe void Update(float totalSeconds, float deltaSeconds) { if (_activeCount == 0) return; fixed (MetaParticle* buffer = _buffer) { var expired = 0; var iteration = 0; do { var meta = buffer + ((_head + iteration) % _bufferSize); meta->Age = (totalSeconds - meta->ReleaseInfo.TotalSeconds) / _term; if (meta->Age > 1f) expired++; } while (++iteration < _activeCount); if (expired > 0) Pop(expired); var iterator = new ParticleIterator(buffer, _bufferSize, _head, _activeCount); _stateManager.Update(ref iterator, deltaSeconds); } }