internal OrientationGizmo(float sizeCorrection, SideSelectionType highlightedSide, SideSelectionType selectedSide, bool updateFaceText = false) { this.HighlightedSide = highlightedSide; this.SelectedSide = selectedSide; this.Triangles = new TriangleInfoList(); //right-front-top var orientationGizmoPart = CalcOrientationGizmoPart(sizeCorrection, SideSelectionType.Top, SideSelectionType.Front, SideSelectionType.Right, SideSelectionType.TopRightFront); this.Triangles[0].AddRange(orientationGizmoPart.Triangles[0]); //right-back-top orientationGizmoPart = CalcOrientationGizmoPart(sizeCorrection, SideSelectionType.Top, SideSelectionType.Back, SideSelectionType.Right, SideSelectionType.TopRightBack); orientationGizmoPart.VerticalMirror(updateSurfacePlanes: false); this.Triangles[0].AddRange(orientationGizmoPart.Triangles[0]); //left-front-top orientationGizmoPart = CalcOrientationGizmoPart(sizeCorrection, SideSelectionType.Top, SideSelectionType.Front, SideSelectionType.Left, SideSelectionType.TopLeftFront); orientationGizmoPart.HorizontalMirror(updateSurfacePlanes: false); this.Triangles[0].AddRange(orientationGizmoPart.Triangles[0]); //left-back-top orientationGizmoPart = CalcOrientationGizmoPart(sizeCorrection, SideSelectionType.Top, SideSelectionType.Back, SideSelectionType.Left, SideSelectionType.TopLeftBack); orientationGizmoPart.HorizontalMirror(updateSurfacePlanes: false); orientationGizmoPart.VerticalMirror(updateSurfacePlanes: false); this.Triangles[0].AddRange(orientationGizmoPart.Triangles[0]); //right-front-bottom orientationGizmoPart = CalcOrientationGizmoPart(sizeCorrection, SideSelectionType.Front, SideSelectionType.Bottom, SideSelectionType.Right, SideSelectionType.BottomRightFront); orientationGizmoPart.Rotate(90, 0, 0, RotationEventArgs.TypeAxis.X, updateFaceColor: false); this.Triangles[0].AddRange(orientationGizmoPart.Triangles[0]); //right-back-bottom orientationGizmoPart = CalcOrientationGizmoPart(sizeCorrection, SideSelectionType.Back, SideSelectionType.Bottom, SideSelectionType.Right, SideSelectionType.BottomRightBack); orientationGizmoPart.Rotate(90, 0, 0, RotationEventArgs.TypeAxis.X, updateFaceColor: false); orientationGizmoPart.VerticalMirror(updateSurfacePlanes: false); this.Triangles[0].AddRange(orientationGizmoPart.Triangles[0]); //left-front-bottom orientationGizmoPart = CalcOrientationGizmoPart(sizeCorrection, SideSelectionType.Front, SideSelectionType.Bottom, SideSelectionType.Left, SideSelectionType.BottomLeftFront); orientationGizmoPart.Rotate(90, 0, 0, RotationEventArgs.TypeAxis.X, updateFaceColor: false); orientationGizmoPart.HorizontalMirror(updateSurfacePlanes: false); this.Triangles[0].AddRange(orientationGizmoPart.Triangles[0]); //left-back-bottom orientationGizmoPart = CalcOrientationGizmoPart(sizeCorrection, SideSelectionType.Back, SideSelectionType.Bottom, SideSelectionType.Left, SideSelectionType.BottomLeftBack); orientationGizmoPart.Rotate(90, 0, 0, RotationEventArgs.TypeAxis.X, updateFaceColor: false); orientationGizmoPart.HorizontalMirror(updateSurfacePlanes: false); orientationGizmoPart.VerticalMirror(updateSurfacePlanes: false); this.Triangles[0].AddRange(orientationGizmoPart.Triangles[0]); UpdateFaceText(sizeCorrection); if (this.FaceText != null) { this.Triangles[0].AddRange(this.FaceText); } this.Loaded = true; }
internal void ProcessSelectedSide(MouseEventArgs e, Point point) { var pixel = new Byte4(); GL.ReadPixels(e.X, frmStudioMain.SceneControl.Height - e.Y, 1, 1, PixelFormat.Rgba, PixelType.UnsignedByte, ref pixel); switch (pixel.A) { case (int)SideSelectionType.Front: SelectedSide = SideSelectionType.Front; break; case (int)SideSelectionType.Left: SelectedSide = SideSelectionType.Left; break; case (int)SideSelectionType.Right: SelectedSide = SideSelectionType.Right; break; case (int)SideSelectionType.Top: SelectedSide = SideSelectionType.Top; break; case (int)SideSelectionType.Back: SelectedSide = SideSelectionType.Back; break; case (int)SideSelectionType.Bottom: SelectedSide = SideSelectionType.Bottom; break; case (int)SideSelectionType.BottomLeftBack: SelectedSide = SideSelectionType.BottomLeftBack; break; case (int)SideSelectionType.BottomLeftFront: SelectedSide = SideSelectionType.BottomLeftFront; break; case (int)SideSelectionType.BottomRightBack: SelectedSide = SideSelectionType.BottomRightBack; break; case (int)SideSelectionType.BottomRightFront: SelectedSide = SideSelectionType.BottomRightFront; break; case (int)SideSelectionType.TopLeftBack: SelectedSide = SideSelectionType.TopLeftBack; break; case (int)SideSelectionType.TopLeftFront: SelectedSide = SideSelectionType.TopLeftFront; break; case (int)SideSelectionType.TopRightBack: SelectedSide = SideSelectionType.TopRightBack; break; case (int)SideSelectionType.TopRightFront: SelectedSide = SideSelectionType.TopRightFront; break; } ColorSelectedSide(); }
private STLModel3D CalcOrientationGizmoPart(float sizeCorrection, SideSelectionType firstSideSelectionType, SideSelectionType secondSideSelectionType, SideSelectionType thirdSideSelectionType, SideSelectionType cornerSelectionType) { var defaultSize = 5f * sizeCorrection; var defaultOffsetSize = defaultSize - (1f * sizeCorrection); var defaultOffsetSizeHalf = defaultSize + ((1f * sizeCorrection) / 2f); var result = new STLModel3D(); result.Triangles = new TriangleInfoList(); var cubePoints = new List <Vector3Class>(); cubePoints.Add(new Vector3Class(0, 0, defaultOffsetSizeHalf)); //top cubePoints.Add(new Vector3Class(0, -defaultOffsetSize, defaultOffsetSizeHalf)); //top cubePoints.Add(new Vector3Class(defaultOffsetSize, -defaultOffsetSize, defaultOffsetSizeHalf)); //top cubePoints.Add(new Vector3Class(defaultOffsetSize, 0, defaultOffsetSizeHalf)); //top cubePoints.Add(new Vector3Class(0, -defaultOffsetSize, defaultOffsetSizeHalf)); //top cubePoints.Add(new Vector3Class(0, -defaultSize, defaultOffsetSizeHalf)); //top cubePoints.Add(new Vector3Class(defaultOffsetSize, -defaultSize, defaultOffsetSizeHalf)); //top cubePoints.Add(new Vector3Class(defaultOffsetSize, -defaultOffsetSize, defaultOffsetSizeHalf)); //top cubePoints.Add(new Vector3Class(defaultOffsetSize, 0, defaultOffsetSizeHalf)); //top cubePoints.Add(new Vector3Class(defaultOffsetSize, -defaultOffsetSize, defaultOffsetSizeHalf)); //top cubePoints.Add(new Vector3Class(defaultSize, -defaultOffsetSize, defaultOffsetSizeHalf)); //top cubePoints.Add(new Vector3Class(defaultSize, 0, defaultOffsetSizeHalf)); //top cubePoints.Add(new Vector3Class(defaultOffsetSize, -defaultOffsetSize, defaultOffsetSizeHalf)); //top cubePoints.Add(new Vector3Class(defaultOffsetSize, -defaultSize, defaultOffsetSizeHalf)); //top cubePoints.Add(new Vector3Class(defaultSize, -defaultOffsetSize, defaultOffsetSizeHalf)); //top var cubeColor = new Byte4Class((byte)(int)firstSideSelectionType, 57, 64, 69); if (firstSideSelectionType == SelectedSide) { cubeColor = new Byte4Class((byte)(int)firstSideSelectionType, 255, 0, 0); } else if (firstSideSelectionType == HighlightedSide) { cubeColor = new Byte4Class((byte)(int)firstSideSelectionType, 255, 255, 255); } var cubeIndexes = new List <short[]> { new short[] { 0, 1, 2 }, //front new short[] { 2, 3, 0 }, //front new short[] { 4, 5, 6 }, //front new short[] { 6, 7, 4 }, //front new short[] { 8, 9, 10 }, //front new short[] { 10, 11, 8 }, //front new short[] { 12, 13, 14 }, //front }; var xAngles = new List <int>() { 0, -90 }; foreach (var xAngle in xAngles) { if (xAngle == -90) { if (secondSideSelectionType != SideSelectionType.Bottom) { cubeColor = new Byte4Class((byte)(int)secondSideSelectionType, 57, 64, 69); } else { cubeColor = new Byte4Class((byte)(int)secondSideSelectionType, 128, 128, 128); } if (secondSideSelectionType == SelectedSide) { cubeColor = new Byte4Class((byte)(int)secondSideSelectionType, 255, 0, 0); } else if (secondSideSelectionType == HighlightedSide) { cubeColor = new Byte4Class((byte)(int)secondSideSelectionType, 255, 255, 255); } } var tList = new List <Triangle>(); var stlModel = new STLModel3D(); stlModel.Triangles = new TriangleInfoList(); foreach (var cubeIndex in cubeIndexes) { var triangle = new Triangle(); triangle.Vectors[0].Position = cubePoints[cubeIndex[0]]; triangle.Vectors[1].Position = cubePoints[cubeIndex[1]]; triangle.Vectors[2].Position = cubePoints[cubeIndex[2]]; triangle.Vectors[0].Color = triangle.Vectors[1].Color = triangle.Vectors[2].Color = cubeColor; triangle.CalcNormal(); tList.Add(triangle); if (xAngle == -90) { triangle.Flip(true); } } stlModel.Triangles[0].AddRange(tList); stlModel.Rotate(xAngle, 0, 0, RotationEventArgs.TypeAxis.X, updateFaceColor: false); if (xAngle == -90) { stlModel.MoveModelWithTranslationZ(new Vector3Class(0, -(2 * defaultOffsetSizeHalf), 0)); } result.Triangles[0].AddRange(stlModel.Triangles[0]); } var tList2 = new List <Triangle>(); var stlModel2 = new STLModel3D(); stlModel2.Triangles = new TriangleInfoList(); cubeColor = new Byte4Class((byte)(int)thirdSideSelectionType, 57, 64, 69); if (thirdSideSelectionType == SelectedSide) { cubeColor = new Byte4Class((byte)(int)thirdSideSelectionType, 255, 0, 0); } else if (thirdSideSelectionType == HighlightedSide) { cubeColor = new Byte4Class((byte)(int)thirdSideSelectionType, 255, 255, 255); } foreach (var cubeIndex in cubeIndexes) { var triangle = new Triangle(); triangle.Vectors[0].Position = cubePoints[cubeIndex[0]]; triangle.Vectors[1].Position = cubePoints[cubeIndex[1]]; triangle.Vectors[2].Position = cubePoints[cubeIndex[2]]; triangle.Vectors[0].Color = triangle.Vectors[1].Color = triangle.Vectors[2].Color = cubeColor; triangle.Flip(true); tList2.Add(triangle); } stlModel2.Triangles[0].AddRange(tList2); stlModel2.Rotate(0, -90, 0, RotationEventArgs.TypeAxis.Y, updateFaceColor: false); stlModel2.MoveModelWithTranslationZ(new Vector3Class((2 * defaultOffsetSizeHalf), 0, 0)); result.Triangles[0].AddRange(stlModel2.Triangles[0]); //highlight parts var highlightParts = new List <Vector3Class>(); highlightParts.Add(new Vector3Class(0, -defaultSize, defaultOffsetSizeHalf)); highlightParts.Add(new Vector3Class(0, -defaultOffsetSizeHalf, defaultSize)); highlightParts.Add(new Vector3Class(defaultOffsetSize, -defaultOffsetSizeHalf, defaultSize)); highlightParts.Add(new Vector3Class(defaultOffsetSize, -defaultOffsetSizeHalf, defaultSize)); highlightParts.Add(new Vector3Class(defaultOffsetSize, -defaultSize, defaultOffsetSizeHalf)); highlightParts.Add(new Vector3Class(0, -defaultSize, defaultOffsetSizeHalf)); highlightParts.Add(new Vector3Class(defaultSize, -defaultOffsetSize, defaultOffsetSizeHalf)); highlightParts.Add(new Vector3Class(defaultOffsetSizeHalf, -defaultOffsetSize, defaultSize)); highlightParts.Add(new Vector3Class(defaultOffsetSizeHalf, 0f, defaultSize)); highlightParts.Add(new Vector3Class(defaultSize, -defaultOffsetSize, defaultOffsetSizeHalf)); highlightParts.Add(new Vector3Class(defaultOffsetSizeHalf, 0f, defaultSize)); highlightParts.Add(new Vector3Class(defaultSize, 0, defaultOffsetSizeHalf)); highlightParts.Add(new Vector3Class(defaultSize, -defaultOffsetSizeHalf, defaultOffsetSize)); highlightParts.Add(new Vector3Class(defaultSize, -defaultOffsetSizeHalf, 0f)); highlightParts.Add(new Vector3Class(defaultOffsetSizeHalf, -defaultSize, 0f)); highlightParts.Add(new Vector3Class(defaultOffsetSizeHalf, -defaultSize, 0f)); highlightParts.Add(new Vector3Class(defaultOffsetSizeHalf, -defaultSize, defaultOffsetSize)); highlightParts.Add(new Vector3Class(defaultSize, -defaultOffsetSizeHalf, defaultOffsetSize)); highlightParts.Add(new Vector3Class(defaultOffsetSize, -defaultSize, defaultOffsetSizeHalf)); highlightParts.Add(new Vector3Class(defaultOffsetSize, -defaultOffsetSizeHalf, defaultSize)); highlightParts.Add(new Vector3Class(defaultSize, -defaultOffsetSizeHalf, defaultOffsetSize)); highlightParts.Add(new Vector3Class(defaultOffsetSize, -defaultSize, defaultOffsetSizeHalf)); highlightParts.Add(new Vector3Class(defaultSize, -defaultOffsetSizeHalf, defaultOffsetSize)); highlightParts.Add(new Vector3Class(defaultSize, -defaultOffsetSize, defaultOffsetSizeHalf)); highlightParts.Add(new Vector3Class(defaultSize, -defaultOffsetSize, defaultOffsetSizeHalf)); highlightParts.Add(new Vector3Class(defaultSize, -defaultOffsetSizeHalf, defaultOffsetSize)); highlightParts.Add(new Vector3Class(defaultOffsetSizeHalf, -defaultOffsetSize, defaultSize)); highlightParts.Add(new Vector3Class(defaultSize, -defaultOffsetSizeHalf, defaultOffsetSize)); highlightParts.Add(new Vector3Class(defaultOffsetSizeHalf, -defaultSize, defaultOffsetSize)); highlightParts.Add(new Vector3Class(defaultOffsetSizeHalf, -defaultOffsetSize, defaultSize)); var highlightColor = new Byte4Class((byte)(int)cornerSelectionType, 0, 0, 0); if (cornerSelectionType == SelectedSide) { highlightColor = new Byte4Class((byte)(int)cornerSelectionType, 255, 0, 0); } else if (cornerSelectionType == HighlightedSide) { highlightColor = new Byte4Class((byte)(int)cornerSelectionType, 255, 255, 255); } for (var highlightIndex = 0; highlightIndex < highlightParts.Count; highlightIndex += 3) { var triangle = new Triangle(); triangle.Vectors[0].Position = highlightParts[highlightIndex]; triangle.Vectors[1].Position = highlightParts[highlightIndex + 1]; triangle.Vectors[2].Position = highlightParts[highlightIndex + 2]; triangle.Vectors[0].Color = triangle.Vectors[1].Color = triangle.Vectors[2].Color = highlightColor; triangle.CalcNormal(); result.Triangles[0].Add(triangle); } return(result); }