private void RenderParticles(PartSysEmitter emitter) { var it = emitter.NewIterator(); var totalCount = emitter.GetActiveCount(); if (totalCount == 0) { return; } // Lazily initialize render state if (!emitter.HasRenderState()) { emitter.SetRenderState( new QuadEmitterRenderState(_device, emitter)); } var renderState = (QuadEmitterRenderState)emitter.GetRenderState(); using var spriteMemory = MemoryPool.Rent(4 * totalCount); var sUpdateBuffer = spriteMemory.Memory.Span.Slice(0, 4 * totalCount); var i = 0; while (it.HasNext()) { var particleIdx = it.Next(); FillVertex(emitter, particleIdx, sUpdateBuffer, i); i += 4; } renderState.vertexBuffer.Resource.Update <SpriteVertex>(sUpdateBuffer); _device.SetMaterial(renderState.material); renderState.bufferBinding.Resource.Bind(); // Draw the batch _device.DrawIndexed(PrimitiveType.TriangleList, 4 * totalCount, 6 * totalCount); }