Ported from OpenGL to Canvas

Update: This project is now going to be done in Canvas simply because
OpenGL is too bulky for this.