So after spending some time writing the core of the ray tracer again here is one of the first renders with multiple bounces of light. It took 4 mins to render at 2048×2048 with 32 rays per pixel, each taking 3 bounces along the way.
Aside from simplifying the light transport calculations, I have also written a camera class, which can now project rays into the world from arbitrary positions. One thing I still want to do is abstract the code to handle material interaction, since I don’t want to hard code this.