Working with Machine Shop, I designed and wrote an entire pipleline to go from 3D animation (as a sequence of OBJs) to shapes out of water.
First each OBJ in the sequence was sliced and intersections between positions of drops and the model were found. I wrote a C++ application (using Cinder and CGAL) to do this. Within this application you could choose the number of layers, arrangement of the nozzles, gravity compensation, etc.
A Beaglebone Black sent the volume data to 64 x 32 solenoids via the PRU, which was programmed in Assembly. The PRU was handled by a C program that ran on the BBB.
I designed a PCB to receive synchronous serial data and control 8 solenoids. These were daisy chained.
On the shoot, the PRU would wait on a trigger from the motion control rig. Once the timing of the shot was decided, we would adjust the drops to take account of acceleration. Then I would write a one liner shell script to read a directory of files. Then we would sit back, in total darkness and every 5 seconds there would be a huge flash and the image of the water figure would be burnt into your retina.
There’s also a bit of a behind the scenes.