public IEnumerator UpdateGeometryOnMainThread()
        {
            if (Deviation == null)
            {
                yield break;
            }
            if (Deviation.DeviationPoints.Count == 0)
            {
                yield break;
            }
            if (is_disconnected)
            {
                yield break;
            }

            if (internalSO == null)
            {
                internalSO = new GOWrapperSO();
                internalSO.Create(GameObjectFactory.CreateParentGO("toolpath_deviation_so"));
                CC.ActiveScene.AddSceneObject(internalSO);
                internalSO.SetLocalFrame(SO.GetLocalFrame(CoordSpace.SceneCoords), CoordSpace.SceneCoords);
                SOFrameLink link = new SOFrameLink(internalSO, SO);
                CC.ActiveScene.LinkManager.AddLink(link);
            }

            var    settings   = SO.GetSettings();
            double nozzleDiam = settings.Machine.NozzleDiamMM;
            double tolerance  = nozzleDiam * 0.5 + DeviationToleranceMM;

            float layerHeight = (float)settings.LayerHeightMM;
            float ptWidth     = (float)nozzleDiam * 0.5f;

            // probably should just make a mesh for all these...
            int counter = 0;
            int N       = Deviation.DeviationPoints.Count;

            for (int i = 0; i < N; ++i)
            {
                if (is_disconnected)
                {
                    yield break;
                }
                DeviationPt pt          = Deviation.DeviationPoints[i];
                fMaterial   useMaterial = HighDeviationMaterial;
                if (pt.dist < tolerance * 1.5)
                {
                    useMaterial = LowDeviationMaterial;
                }
                //else if (pt.dist < tolerance * 1.2)
                //    useMaterial = LowDeviationMaterial;

                fGameObject go = GameObjectFactory.CreateBoxGO("deviation", ptWidth, layerHeight, ptWidth, useMaterial, true, false);
                go.SetLocalPosition((Vector3f)pt.pos);
                internalSO.AppendNewGO(go, internalSO.RootGameObject, false);
                go.SetLayer(FPlatform.WidgetOverlayLayer);
                PointGOs.Add(go);
                if (counter++ == 10)
                {
                    counter = 0;
                    yield return(null);
                }
            }
        }