Пример #1
0
        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);
        }