public ParticleSystem(ITimeProvider timeProvider, object userData = null, float subdivision = 128.0f)
        {
            TimeProvider = timeProvider;
            Subdivision  = subdivision;

            Particles = new SpatialPartition <ParticleCollection>(Subdivision, (index) => new ParticleCollection(index, Particles.GetSectorBounds(index)));

            UpdateArgs = new ParticleUpdateArgs(this);
            RenderArgs = new ParticleRenderArgs(this);

            var temporaryInstance = Activator.CreateInstance <T>();

            temporaryInstance.InitializeSystem(userData, out Updater, out Renderer, out GetPosition, this);
        }