Refactored to enable separate decomposition for model/view and projection transforms.