surface_normal implemented but not yet tested