2D variation of the recent "Cascade" series I've been experimenting with. I've combined two different techniques and managed to loop it.

1) Replacement looping. Learned from @bleuje a few years ago, and have used probably hundreds of times since In this case, the loop is ~3 seconds. However, if you time how long it takes a particle to fall, it's more than 2x that time. So each particle ends (after ~3 seconds) at a point where a new identical particle begins. This is the "replacement" that is going on.

2) Particle system. Motion is dictated by forces. In this case, a downward gravity-like force, and the repulsive force of the spheres/circles. Each new particle position is determined by previous position + net forces.

These experiments are the first time I've managed to use replacement looping with particles whose position is determined by their previous position (as opposed to equations that determine a particle position for any time during the loop).

@incre_ment @bleuje very cool! Can you give an outline of how the replacement looping is implemented here? Or link a good article if you know one?
@OliverUv @bleuje
Check the 4th tutorial here:
https://bleuje.com/tutorials/
... although I would suggest having a read of the first three as well, prior.
Tutorials / articles - bleuje