They were implemented using CPU for rendering, using two threads: one for logic processing and the other for rendering. The logic thread sends render commands to the render thread, which then processes them. Communication was facilitated through a concurrent queue.
Both projects were developed by a group of 3 people.