+ TODO: 2D & 3D versions?