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); } } }