Here is a simple fix I created for dealing with cab views that do not have cab controls.
Index: MSTSLocomotive.cs =================================================================== --- MSTSLocomotive.cs (revision 1820) +++ MSTSLocomotive.cs (working copy) @@ -2996,57 +2996,60 @@ var controlSortIndex = 1; // Controls are drawn atop the cabview and in order they appear in the CVF file. // This allows the segments of moving-scale meters to be hidden by covers (e.g. TGV-A) CabViewControlRenderersList.Add(new List<CabViewControlRenderer>()); - foreach (CabViewControl cvc in cabView.CVFFile.CabViewControls) + if (cabView.CVFFile.CabViewControls != null) { - controlSortIndex++; - CVCDial dial = cvc as CVCDial; - if (dial != null) + foreach (CabViewControl cvc in cabView.CVFFile.CabViewControls) { - CabViewDialRenderer cvcr = new CabViewDialRenderer(viewer, car, dial, _Shader); - cvcr.SortIndex = controlSortIndex; - CabViewControlRenderersList[i].Add(cvcr); - continue; + controlSortIndex++; + CVCDial dial = cvc as CVCDial; + if (dial != null) + { + CabViewDialRenderer cvcr = new CabViewDialRenderer(viewer, car, dial, _Shader); + cvcr.SortIndex = controlSortIndex; + CabViewControlRenderersList[i].Add(cvcr); + continue; + } + CVCGauge gauge = cvc as CVCGauge; + if (gauge != null) + { + CabViewGaugeRenderer cvgr = new CabViewGaugeRenderer(viewer, car, gauge, _Shader); + cvgr.SortIndex = controlSortIndex; + CabViewControlRenderersList[i].Add(cvgr); + continue; + } + CVCSignal asp = cvc as CVCSignal; + if (asp != null) + { + CabViewDiscreteRenderer aspr = new CabViewDiscreteRenderer(viewer, car, asp, _Shader); + aspr.SortIndex = controlSortIndex; + CabViewControlRenderersList[i].Add(aspr); + continue; + } + CVCMultiStateDisplay multi = cvc as CVCMultiStateDisplay; + if (multi != null) + { + CabViewDiscreteRenderer mspr = new CabViewDiscreteRenderer(viewer, car, multi, _Shader); + mspr.SortIndex = controlSortIndex; + CabViewControlRenderersList[i].Add(mspr); + continue; + } + CVCDiscrete disc = cvc as CVCDiscrete; + if (disc != null) + { + CabViewDiscreteRenderer cvdr = new CabViewDiscreteRenderer(viewer, car, disc, _Shader); + cvdr.SortIndex = controlSortIndex; + CabViewControlRenderersList[i].Add(cvdr); + continue; + } + CVCDigital digital = cvc as CVCDigital; + if (digital != null) + { + CabViewDigitalRenderer cvdr = new CabViewDigitalRenderer(viewer, car, digital, _Shader); + cvdr.SortIndex = controlSortIndex; + CabViewControlRenderersList[i].Add(cvdr); + continue; + } } - CVCGauge gauge = cvc as CVCGauge; - if (gauge != null) - { - CabViewGaugeRenderer cvgr = new CabViewGaugeRenderer(viewer, car, gauge, _Shader); - cvgr.SortIndex = controlSortIndex; - CabViewControlRenderersList[i].Add(cvgr); - continue; - } - CVCSignal asp = cvc as CVCSignal; - if (asp != null) - { - CabViewDiscreteRenderer aspr = new CabViewDiscreteRenderer(viewer, car, asp, _Shader); - aspr.SortIndex = controlSortIndex; - CabViewControlRenderersList[i].Add(aspr); - continue; - } - CVCMultiStateDisplay multi = cvc as CVCMultiStateDisplay; - if (multi != null) - { - CabViewDiscreteRenderer mspr = new CabViewDiscreteRenderer(viewer, car, multi, _Shader); - mspr.SortIndex = controlSortIndex; - CabViewControlRenderersList[i].Add(mspr); - continue; - } - CVCDiscrete disc = cvc as CVCDiscrete; - if (disc != null) - { - CabViewDiscreteRenderer cvdr = new CabViewDiscreteRenderer(viewer, car, disc, _Shader); - cvdr.SortIndex = controlSortIndex; - CabViewControlRenderersList[i].Add(cvdr); - continue; - } - CVCDigital digital = cvc as CVCDigital; - if (digital != null) - { - CabViewDigitalRenderer cvdr = new CabViewDigitalRenderer(viewer, car, digital, _Shader); - cvdr.SortIndex = controlSortIndex; - CabViewControlRenderersList[i].Add(cvdr); - continue; - } } } i++;