From 00a5a209ee542a8e1804f0a58533293b89063d1e Mon Sep 17 00:00:00 2001 From: John Lewin Date: Tue, 28 Nov 2017 15:34:49 -0800 Subject: [PATCH 1/3] Remove per draw Object3D wrapper and instantiation - Extract color calculation to reusable helper method - Issue MatterHackers/MCCentral#2327 Color assigned per draw, color assignment creates new thread... --- PartPreviewWindow/View3D/MeshViewerWidget.cs | 105 ++++++++++--------- 1 file changed, 57 insertions(+), 48 deletions(-) diff --git a/PartPreviewWindow/View3D/MeshViewerWidget.cs b/PartPreviewWindow/View3D/MeshViewerWidget.cs index 7e3aba54d..b8f1f56f8 100644 --- a/PartPreviewWindow/View3D/MeshViewerWidget.cs +++ b/PartPreviewWindow/View3D/MeshViewerWidget.cs @@ -444,63 +444,33 @@ namespace MatterHackers.MeshVisualizer GL.Enable(EnableCap.Lighting); } - foreach (var renderData in object3D.VisibleMeshes()) + foreach (var item in object3D.VisibleMeshes()) { bool isSelected = parentSelected || scene.HasSelection && (object3D == scene.SelectedItem || scene.SelectedItem.Children.Contains(object3D)); - Color drawColor = renderData.WorldColor(); - if (renderData.WorldOutputType() == PrintOutputTypes.Support) - { - drawColor = new Color(Color.Yellow, 120); - } - else if (renderData.WorldOutputType() == PrintOutputTypes.Hole) - { - drawColor = new Color(Color.Gray, 120); - } - - // If there is a printer - check if the object is within the bed volume (has no AABB outside the bed volume) - if(sceneContext.Printer != null) - { - if (!renderData.InsideBuildVolume(sceneContext.Printer)) - { - drawColor = new Color(drawColor, 65); - } - } - - // check if we should be rendering materials (this overrides the other colors) - if (this.RenderType == RenderTypes.Materials) - { - drawColor = MatterialRendering.Color(renderData.WorldMaterialIndex()); - } + Color drawColor = GetItemColor(item); bool isDebugItem = false; bool renderAsSolid = drawColor.alpha == 255; #if DEBUG - isDebugItem = scene.DebugItem == renderData; + isDebugItem = scene.DebugItem == item; renderAsSolid = (renderAsSolid && scene.DebugItem == null) || isDebugItem; #endif if (renderAsSolid) { - GLHelper.Render(renderData.Mesh, drawColor, renderData.WorldMatrix(), RenderType, renderData.WorldMatrix() * World.ModelviewMatrix); + GLHelper.Render(item.Mesh, drawColor, item.WorldMatrix(), RenderType, item.WorldMatrix() * World.ModelviewMatrix); } else { - transparentMeshes.Add(new Object3D() - { - Mesh = renderData.Mesh, - Matrix = renderData.WorldMatrix(), - Color = (scene.DebugItem == null) ? drawColor : debugNotSelectedFillColor, - MaterialIndex = renderData.WorldMaterialIndex(), - OutputType = renderData.WorldOutputType() - }); + transparentMeshes.Add(item); } if (isSelected && !tooBigForComplexSelection) { - RenderSelection(renderData, frustum); + RenderSelection(item, frustum); } #if DEBUG @@ -511,9 +481,9 @@ namespace MatterHackers.MeshVisualizer GLHelper.PrepareFor3DLineRender(true); RenderAABB(frustum, aabb, Matrix4X4.Identity, debugBorderColor, 1); - if (renderData.Mesh != null) + if (item.Mesh != null) { - GLHelper.Render(renderData.Mesh, debugBorderColor, renderData.WorldMatrix(), RenderTypes.Wireframe, renderData.WorldMatrix() * World.ModelviewMatrix); + GLHelper.Render(item.Mesh, debugBorderColor, item.WorldMatrix(), RenderTypes.Wireframe, item.WorldMatrix() * World.ModelviewMatrix); } } #endif @@ -525,6 +495,36 @@ namespace MatterHackers.MeshVisualizer } } + private Color GetItemColor(IObject3D item) + { + Color drawColor = item.WorldColor(); + if (item.WorldOutputType() == PrintOutputTypes.Support) + { + drawColor = new Color(Color.Yellow, 120); + } + else if (item.WorldOutputType() == PrintOutputTypes.Hole) + { + drawColor = new Color(Color.Gray, 120); + } + + // If there is a printer - check if the object is within the bed volume (has no AABB outside the bed volume) + if (sceneContext.Printer != null) + { + if (!item.InsideBuildVolume(sceneContext.Printer)) + { + drawColor = new Color(drawColor, 65); + } + } + + // check if we should be rendering materials (this overrides the other colors) + if (this.RenderType == RenderTypes.Materials) + { + drawColor = MatterialRendering.Color(item.WorldMaterialIndex()); + } + + return drawColor; + } + private void RenderNormals(IObject3D renderData) { var frustum = World.GetClippingFrustum(); @@ -660,21 +660,29 @@ namespace MatterHackers.MeshVisualizer { // render the bed RenderBedMesh(lookingDownOnBed); - // than the transparent stuff - //int colorIndex = 0; // helps debug the sorting order - foreach (var transparentRenderData in transparentMeshes) + + // then the transparent objects + foreach (var object3D in transparentMeshes) { - var color = transparentRenderData.Color; - //color = RGBA_Floats.FromHSL(Math.Max(colorIndex++, 0) / 10.0, .99, .49).ToColor(); - GLHelper.Render(transparentRenderData.Mesh, color, transparentRenderData.Matrix, RenderTypes.Outlines, transparentRenderData.Matrix * World.ModelviewMatrix); + GLHelper.Render( + object3D.Mesh, + GetItemColor(object3D), + object3D.WorldMatrix(), + RenderTypes.Outlines, + object3D.WorldMatrix() * World.ModelviewMatrix); } } else { - // render the transparent stuff - foreach (var transparentRenderData in transparentMeshes) + // render transparent objects + foreach (var object3D in transparentMeshes) { - GLHelper.Render(transparentRenderData.Mesh, transparentRenderData.Color, transparentRenderData.Matrix, RenderTypes.Outlines, transparentRenderData.Matrix * World.ModelviewMatrix); + GLHelper.Render( + object3D.Mesh, + object3D.WorldColor(), + object3D.WorldMatrix(), + RenderTypes.Outlines, + object3D.WorldMatrix() * World.ModelviewMatrix); } // than render the bed RenderBedMesh(lookingDownOnBed); @@ -789,4 +797,5 @@ namespace MatterHackers.MeshVisualizer } } } -} \ No newline at end of file +} + \ No newline at end of file From 529e8dc6dcc9a701d51456ca852dfead189a72e9 Mon Sep 17 00:00:00 2001 From: John Lewin Date: Tue, 28 Nov 2017 15:41:41 -0800 Subject: [PATCH 2/3] Simplify --- PartPreviewWindow/View3D/MeshViewerWidget.cs | 37 +++++++------------- 1 file changed, 13 insertions(+), 24 deletions(-) diff --git a/PartPreviewWindow/View3D/MeshViewerWidget.cs b/PartPreviewWindow/View3D/MeshViewerWidget.cs index b8f1f56f8..eafcaa1d9 100644 --- a/PartPreviewWindow/View3D/MeshViewerWidget.cs +++ b/PartPreviewWindow/View3D/MeshViewerWidget.cs @@ -658,33 +658,22 @@ namespace MatterHackers.MeshVisualizer if (lookingDownOnBed) { - // render the bed RenderBedMesh(lookingDownOnBed); - - // then the transparent objects - foreach (var object3D in transparentMeshes) - { - GLHelper.Render( - object3D.Mesh, - GetItemColor(object3D), - object3D.WorldMatrix(), - RenderTypes.Outlines, - object3D.WorldMatrix() * World.ModelviewMatrix); - } } - else + + // Transparent objects + foreach (var object3D in transparentMeshes) + { + GLHelper.Render( + object3D.Mesh, + GetItemColor(object3D), + object3D.WorldMatrix(), + RenderTypes.Outlines, + object3D.WorldMatrix() * World.ModelviewMatrix); + } + + if (!lookingDownOnBed) { - // render transparent objects - foreach (var object3D in transparentMeshes) - { - GLHelper.Render( - object3D.Mesh, - object3D.WorldColor(), - object3D.WorldMatrix(), - RenderTypes.Outlines, - object3D.WorldMatrix() * World.ModelviewMatrix); - } - // than render the bed RenderBedMesh(lookingDownOnBed); } From 9929ef0ed2bffa58ab35bb028c27c7c33709dfa8 Mon Sep 17 00:00:00 2001 From: John Lewin Date: Tue, 28 Nov 2017 15:48:18 -0800 Subject: [PATCH 3/3] Latest agg-sharp --- Submodules/agg-sharp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Submodules/agg-sharp b/Submodules/agg-sharp index 0d57ebf6a..9fd86f08b 160000 --- a/Submodules/agg-sharp +++ b/Submodules/agg-sharp @@ -1 +1 @@ -Subproject commit 0d57ebf6abaa365881fd9f9b18562c288ab8cb66 +Subproject commit 9fd86f08b68ea6b97b82577a117a2bfe1a48cd13