I originally saw this from this tweet, which derives from this other tweet.
I implemented the same basic idea using Bevy, for fun and to learn how Bevy works a bit. The code is heavily based on the Breakout example from the Bevy project.
Available on the web here.