internal void ClearRender() { DynaShapeViewExtension.ViewModel.RequestViewRefresh -= RequestViewRefreshHandler; DynaShapeViewExtension.DynamoWindow.Dispatcher.Invoke(() => { List <Model3D> sceneItems = DynaShapeViewExtension.GetSceneItems(); if (sceneItems.Contains(pointModel)) { sceneItems.Remove(pointModel); } pointModel.Detach(); pointModel.Dispose(); if (sceneItems.Contains(lineModel)) { sceneItems.Remove(lineModel); } lineModel.Detach(); lineModel.Dispose(); if (sceneItems.Contains(billboardTextModel)) { sceneItems.Remove(billboardTextModel); } billboardTextModel.Detach(); billboardTextModel.Dispose(); foreach (MeshGeometryModel3D meshModel in meshModels) { if (sceneItems.Contains(meshModel)) { sceneItems.Remove(meshModel); } meshModel.Detach(); meshModel.Dispose(); } }); }
// This handler prevents flickering when geometries other than DynaShape ones exist in the viewport private void RequestViewRefreshHandler() { List <Model3D> sceneItems = DynaShapeViewExtension.GetSceneItems(); if (pointGeometry.Positions.Count >= 1 && !sceneItems.Contains(pointModel)) { sceneItems.Add(pointModel); } if (lineGeometry.Positions.Count >= 2 && !sceneItems.Contains(lineModel)) { sceneItems.Add(lineModel); } if (billboardText.TextInfo.Count >= 1 && !sceneItems.Contains(billboardTextModel)) { sceneItems.Add(billboardTextModel); } foreach (MeshGeometryModel3D meshModel in meshModels) { if (!sceneItems.Contains(meshModel)) { sceneItems.Add(meshModel); } } }
private void RenderAction() { IRenderHost renderHost = DynaShapeViewExtension.GetViewport().RenderHost; List <Model3D> sceneItems = DynaShapeViewExtension.GetSceneItems(); pointGeometry = new PointGeometry3D { Positions = new Vector3Collection(), Indices = new IntCollection(), Colors = new Color4Collection() }; lineGeometry = new LineGeometry3D() { Positions = new Vector3Collection(), Indices = new IntCollection(), Colors = new Color4Collection() }; billboardText = new BillboardText3D(); foreach (MeshGeometryModel3D meshModel in meshModels) { meshModel.Detach(); if (sceneItems.Contains(meshModel)) { sceneItems.Remove(meshModel); } } meshModels.Clear(); //============================================ // Render nodes as points //============================================ int n = pointGeometry.Indices.Count; for (int i = 0; i < solver.Nodes.Count; i++) { pointGeometry.Positions.Add(solver.Nodes[i].Position.ToVector3()); pointGeometry.Colors.Add(DefaultPointColor); pointGeometry.Indices.Add(n + i); } //============================================================== // Render geometries from geometry binders //============================================================== foreach (GeometryBinder geometryBinder in solver.GeometryBinders) { if (geometryBinder.Show) { geometryBinder.CreateDisplayedGeometries(this, solver.Nodes); } } //============================================================================ // Render GUI elements //============================================================================ RenderGUI(); //============================================================== // Attach the geometries to Helix render host //============================================================== if (pointGeometry.Positions.Count >= 1) { pointModel.Geometry = pointGeometry; if (!sceneItems.Contains(pointModel)) { sceneItems.Add(pointModel); } if (!pointModel.IsAttached) { pointModel.Attach(renderHost); } // sceneItems.Remove(pointModel); // pointModel.Detach(); // sceneItems.Add(pointModel); // sw.Restart(); // pointModel.Attach(renderHost); // DynamoLogger.Instance.Log(sw.Elapsed.TotalMilliseconds + "ms (Attach)"); } else { if (sceneItems.Contains(pointModel)) { sceneItems.Remove(pointModel); } pointModel.Detach(); } if (lineGeometry.Positions.Count >= 2) { lineModel.Geometry = lineGeometry; if (!sceneItems.Contains(lineModel)) { sceneItems.Add(lineModel); } if (!lineModel.IsAttached) { lineModel.Attach(renderHost); } } else { if (sceneItems.Contains(lineModel)) { sceneItems.Remove(lineModel); } lineModel.Detach(); } foreach (MeshGeometryModel3D meshModel in meshModels) { sceneItems.Add(meshModel); meshModel.Attach(renderHost); } if (billboardText.TextInfo.Count >= 1) { billboardTextModel.Geometry = billboardText; if (!sceneItems.Contains(billboardTextModel)) { sceneItems.Add(billboardTextModel); } if (!billboardTextModel.IsAttached) { billboardTextModel.Attach(renderHost); } } else { if (sceneItems.Contains(billboardTextModel)) { sceneItems.Remove(billboardTextModel); } billboardTextModel.Detach(); } }