fully implemented shadow mapping