For smoke and dust I wanted a material with a billowing effect and control over animation speed, tiling and the like. Since flip books don’t scale up well frame rate or resolution wise I chose a different approach.
The slopes in R and G are used to distort the texture: At the beginning the distortion amount multiplier is a negative value so bright areas are pinched, pushed smaller. As the animation progresses the multiplier interpolates to positive values, that’s when the bright areas expand. Smaller bumps in the grayscale image produce coffee bean like artifacts toward the end which are not that visible in the final material but I still want to address them in the future.
The obvious problem at this point was that the animation was not looping seamlessly. A simple solution was to produce a another animation and blend between the two in a way that snapping back to the beginning is never visible. The second animation uses the same input texture but the UVs are 90 degrees rotated and 0.5 units offset on both axes.
Then the effect looped without snapping but the same two states showed up over and over. To fix that I used a noise texture to add a random offset to the generated UVs. The two animations have their own random value which changes every time they snap back to the beginning.
(If using a texture for noise is not an option then any simpler method for generating a random-ish number should work fine. The smoke texture is random enough to make it hard to see the relation between offset positions.)
The rest of the features were trivial to implement: transparency, a fiery core, particle parameters controlling tiling, contrast and so on.