static void DrawGradient(Controls.OpenGL.GLControl glControl) { if (SceneBackground == null) { SceneBackground = new STLModel3D(); SceneBackground.Triangles = new TriangleInfoList(); var gradientColor1 = new Byte4Class(255, 19, 20, 21); var gradientColor2 = new Byte4Class(255, 39, 42, 61); var triangle = new Triangle(); triangle.Vectors[0].Position = new Vector3Class(-1f, -1f, 0f); triangle.Vectors[0].Color = gradientColor2; triangle.Vectors[1].Position = new Vector3Class(1f, 1f, 0); triangle.Vectors[1].Color = gradientColor1; triangle.Vectors[2].Position = new Vector3Class(-1f, 1f, 0); triangle.Vectors[2].Color = gradientColor1; SceneBackground.Triangles[0].Add(triangle); triangle = new Triangle(); triangle.Vectors[0].Position = new Vector3Class(-1f, -1f, 0f); triangle.Vectors[0].Color = gradientColor2; triangle.Vectors[1].Position = new Vector3Class(1f, -1f, 0); triangle.Vectors[1].Color = gradientColor2; triangle.Vectors[2].Position = new Vector3Class(1f, 1f, 0); triangle.Vectors[2].Color = gradientColor1; SceneBackground.Triangles[0].Add(triangle); SceneBackground.Loaded = true; SceneBackground.BindModel(); SceneBackground.UpdateBinding(); } GL.Viewport(0, 0, glControl.Width, glControl.Height); GL.MatrixMode(MatrixMode.Projection); GL.LoadIdentity(); GL.MatrixMode(MatrixMode.Modelview); GL.LoadIdentity(); GL.Disable(EnableCap.DepthTest); GL.Disable(EnableCap.Lighting); GL.PolygonMode(MaterialFace.Front, PolygonMode.Fill); GL.EnableClientState(ArrayCap.ColorArray); GL.EnableClientState(ArrayCap.VertexArray); foreach (var vboIndex in SceneBackground.VBOIndexes) { GL.BindBuffer(BufferTarget.ArrayBuffer, vboIndex); GL.ColorPointer(4, ColorPointerType.UnsignedByte, Vertex.Stride, new IntPtr(0)); GL.VertexPointer(3, VertexPointerType.Float, Vertex.Stride, 4); GL.DrawArrays(PrimitiveType.Triangles, 0, SceneBackground.Triangles[0].Count * 3); } GL.DisableClientState(ArrayCap.ColorArray); GL.DisableClientState(ArrayCap.VertexArray); GL.Enable(EnableCap.DepthTest); GL.Enable(EnableCap.Lighting); }
internal static void DetermineIfFaceDownContoursHasEdgeDown(ConcurrentDictionary <LowestPointPolygon, Dictionary <float, List <PolyNode> > > facingDownContours, SortedDictionary <float, PolyTree> modelContours, float materialSupportConeOverhangDistance, STLModel3D stlModel, Dictionary <int, float> sliceIndexKeys) { var maxMaterialSupportConeOverhangDistance = 100 * materialSupportConeOverhangDistance * CONTOURPOINT_TO_VECTORPOINT_FACTOR; //foreach(var facingDownContourItemAsync in facingDownContours) Parallel.ForEach(facingDownContours, facingDownContourItemAsync => { { var facingDownContourItem = facingDownContourItemAsync; var facingDownContour = facingDownContourItem.Key; var facingDownSliceIndex = facingDownContour.SliceIndex; var facingDownEndSliceIndex = facingDownSliceIndex + facingDownContourItem.Value.Count; var contoursOnSameHeight = modelContours[facingDownContour.SliceHeight]; var totalCurrentPolygonTriangles = new Dictionary <TriangleConnectionInfo, bool>(); var otherPolygonTriangles = new Dictionary <TriangleConnectionInfo, bool>(); var totalOtherPolygonTriangles = new Dictionary <TriangleConnectionInfo, bool>(); //find nextr triange indexes till end sliceheight if (stlModel.SliceIndexes.Count > facingDownContour.SliceIndex + 40) { var facingDownEndSliceIndexHeight = sliceIndexKeys[facingDownContour.SliceIndex + 40]; totalCurrentPolygonTriangles = Helpers.TriangleHelper.GetConnectedTrianglesAbove(facingDownContour.Polygon.TriangleConnections, facingDownContour.SliceHeight, facingDownEndSliceIndexHeight, stlModel); //other contours foreach (var t in contoursOnSameHeight._allPolys) { if (!t.IsHole) { if (t != facingDownContour.Polygon) { foreach (var triangleConnection in t.TriangleConnections.Keys) { if (!otherPolygonTriangles.ContainsKey(triangleConnection)) { otherPolygonTriangles.Add(triangleConnection, false); } } } } } var t2 = Helpers.TriangleHelper.GetConnectedTrianglesEdgeDown(otherPolygonTriangles.Keys.ToArray(), totalCurrentPolygonTriangles, facingDownContour.SliceHeight, facingDownEndSliceIndexHeight, stlModel); if (t2) { facingDownContour.HasEdgeDown = true; foreach (var k in facingDownContour.Polygon.TriangleConnections) { stlModel.Triangles[k.Key.ArrayIndex][k.Key.TriangleIndex].UpdateColor(new Byte4Class(128, 0, 0, 255), true); } } } } } ); stlModel.UpdateBinding(); }