コード例 #1
0
ファイル: ColliderGenerator.cs プロジェクト: Rixic/Temporal
        //The actual polygon test for the given properties and generation container using the indicated polygon test mode "pt"
        static bool MeshPolyTest(GeneratorInstance gi, GeneratorProps gp, PolygonTest pt)
        {
            if (gi.tris.Count >= 3 && gi.finalVerts.Length >= 3)
            {
                switch (pt)
                {
                case PolygonTest.TotalTriangles:
                    return(gi.tris.Count / 3 <= 255);

                case PolygonTest.TotalQuads:
                    return(gi.tris.Count / 6 <= 255);

                case PolygonTest.EdgeQuads:
                    return(((gp.topSegments + gp.bottomSegments) * (gp.cornerDetails[0] + gp.cornerDetails[1] + gp.cornerDetails[2] + gp.cornerDetails[3] + 6)) <= 255);

                case PolygonTest.FaceEdgeQuads:
                    return(((gp.topSegments + gp.bottomSegments) * ((gp.cornerDetails[0] + gp.cornerDetails[1] + gp.cornerDetails[2] + gp.cornerDetails[3]) * (gp.XZDetail + 1) + gp.XYDetail + gp.YZDetail + 2)) <= 255);
                }
            }
            return(false);
        }
コード例 #2
0
        private void radBallType_CheckedChanged(object sender, EventArgs e)
        {
            grpTriangleZ.Visible = false;
            grpTriangleZ2.Visible = false;
            _triangle1 = null;
            _triangle2 = null;
            _polygon1 = null;
            _polygon2 = null;

            if (radBallBall.Checked || radSolidBallSolidBall.Checked)
            {
                #region Balls

                Ball newBall1, newBall2;

                if (radBallBall.Checked)
                {
                    // Switch them out with a standard ball
                    newBall1 = new Ball(_ball1.Position.Clone(), new DoubleVector(0, 1, 0, 1, 0, 0), _ball1.Radius, _ball1.Mass, _ball1.Elasticity, _ball1.KineticFriction, _ball1.StaticFriction, _boundryLower, _boundryUpper);
                    newBall1.Velocity.StoreNewValues(_ball1.Velocity.Clone());

                    newBall2 = new Ball(_ball2.Position.Clone(), new DoubleVector(0, 1, 0, 1, 0, 0), _ball2.Radius, _ball2.Mass, _ball2.Elasticity, _ball2.KineticFriction, _ball2.StaticFriction, _boundryLower, _boundryUpper);
                    newBall2.Velocity.StoreNewValues(_ball2.Velocity.Clone());
                }
                else if (radSolidBallSolidBall.Checked)
                {
                    // Switch them out with solidballs
                    newBall1 = new SolidBall(_ball1.Position.Clone(), new DoubleVector(0, 1, 0, 1, 0, 0), _ball1.Radius, _ball1.Mass, _ball1.Elasticity, _ball1.KineticFriction, _ball1.StaticFriction, _boundryLower, _boundryUpper);
                    newBall1.Velocity.StoreNewValues(_ball1.Velocity.Clone());
                    ((SolidBall)newBall1).AngularVelocity.StoreNewValues(new MyVector(0, 0, 200));

                    newBall2 = new SolidBall(_ball2.Position.Clone(), new DoubleVector(0, 1, 0, 1, 0, 0), _ball2.Radius, _ball2.Mass, _ball2.Elasticity, _ball2.KineticFriction, _ball2.StaticFriction, _boundryLower, _boundryUpper);
                    newBall2.Velocity.StoreNewValues(_ball2.Velocity.Clone());
                    ((SolidBall)newBall2).AngularVelocity.StoreNewValues(new MyVector(0, 0, 200));
                }
                else
                {
                    MessageBox.Show("Unknown radio button", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return;
                }

                _ball1 = newBall1;
                _ball2 = newBall2;

                #endregion
            }
            else if (radSphereSphere.Checked)
            {
                #region Spheres

                // leave the balls alone?

                #endregion
            }
            else if (radLineTriangle.Checked || radSphereTriangle.Checked || radTriangleTriangle.Checked)
            {
                #region Triangles

                if (radLineTriangle.Checked)
                {
                    #region Line Triangle

                    // I will leave ball1 alone.  I will use that one's velocity as the line

                    grpTriangleZ.Visible = true;

                    // Make the the triangle
                    if (chkTrianglePerpendicular.Checked)
                    {
                        _triangle1 = new TriangleTest(_ball2.Position.Clone(), new DoubleVector(1, 0, 0, 0, 1, 0), new Triangle(0, 0, -100, 0, 100, 0, 0, -100, 100));

                        radPoint1Neg.Enabled = radPoint1Pos.Enabled = radPoint1Zero.Enabled = false;
                        radPoint2Neg.Enabled = radPoint2Pos.Enabled = radPoint2Zero.Enabled = false;
                        radPoint3Neg.Enabled = radPoint3Pos.Enabled = radPoint3Zero.Enabled = false;
                    }
                    else
                    {
                        _triangle1 = new TriangleTest(_ball2.Position.Clone(), new DoubleVector(1, 0, 0, 0, 1, 0), new Triangle(-150, -150, 0, 150, -150, 0, 0, 150, 0));

                        radPoint1Neg.Enabled = radPoint1Pos.Enabled = radPoint1Zero.Enabled = true;
                        radPoint2Neg.Enabled = radPoint2Pos.Enabled = radPoint2Zero.Enabled = true;
                        radPoint3Neg.Enabled = radPoint3Pos.Enabled = radPoint3Zero.Enabled = true;

                        radPoint1_CheckedChanged(this, new EventArgs());
                        radPoint2_CheckedChanged(this, new EventArgs());
                        radPoint3_CheckedChanged(this, new EventArgs());
                    }

                    #endregion
                }
                else if (radSphereTriangle.Checked)
                {
                    #region Sphere Triangle

                    // I will leave ball1 alone.  I won't use its velocity, just radius

                    grpTriangleZ.Visible = true;

                    // Make the the triangle
                    if (chkTrianglePerpendicular.Checked)
                    {
                        _triangle1 = new TriangleTest(_ball2.Position.Clone(), new DoubleVector(1, 0, 0, 0, 1, 0), new Triangle(0, 0, -100, 0, 100, 0, 0, -100, 100));

                        radPoint1Neg.Enabled = radPoint1Pos.Enabled = radPoint1Zero.Enabled = false;
                        radPoint2Neg.Enabled = radPoint2Pos.Enabled = radPoint2Zero.Enabled = false;
                        radPoint3Neg.Enabled = radPoint3Pos.Enabled = radPoint3Zero.Enabled = false;
                    }
                    else
                    {
                        _triangle1 = new TriangleTest(_ball2.Position.Clone(), new DoubleVector(1, 0, 0, 0, 1, 0), new Triangle(-150, -150, 0, 150, -150, 0, 0, 150, 0));

                        radPoint1Neg.Enabled = radPoint1Pos.Enabled = radPoint1Zero.Enabled = true;
                        radPoint2Neg.Enabled = radPoint2Pos.Enabled = radPoint2Zero.Enabled = true;
                        radPoint3Neg.Enabled = radPoint3Pos.Enabled = radPoint3Zero.Enabled = true;

                        radPoint1_CheckedChanged(this, new EventArgs());
                        radPoint2_CheckedChanged(this, new EventArgs());
                        radPoint3_CheckedChanged(this, new EventArgs());
                    }

                    #endregion
                }
                else if (radTriangleTriangle.Checked)
                {
                    #region Triangle Triangle

                    grpTriangleZ.Visible = true;
                    grpTriangleZ2.Visible = true;

                    #region Triangle1 (right side)

                    // Make the the triangle
                    if (chkTrianglePerpendicular.Checked)
                    {
                        _triangle1 = new TriangleTest(_ball2.Position.Clone(), new DoubleVector(1, 0, 0, 0, 1, 0), new Triangle(0, 0, -100, 0, 100, 0, 0, -100, 100));

                        radPoint1Neg.Enabled = radPoint1Pos.Enabled = radPoint1Zero.Enabled = false;
                        radPoint2Neg.Enabled = radPoint2Pos.Enabled = radPoint2Zero.Enabled = false;
                        radPoint3Neg.Enabled = radPoint3Pos.Enabled = radPoint3Zero.Enabled = false;
                    }
                    else
                    {
                        _triangle1 = new TriangleTest(_ball2.Position.Clone(), new DoubleVector(1, 0, 0, 0, 1, 0), new Triangle(-150, -150, 0, 150, -150, 0, 0, 150, 0));

                        radPoint1Neg.Enabled = radPoint1Pos.Enabled = radPoint1Zero.Enabled = true;
                        radPoint2Neg.Enabled = radPoint2Pos.Enabled = radPoint2Zero.Enabled = true;
                        radPoint3Neg.Enabled = radPoint3Pos.Enabled = radPoint3Zero.Enabled = true;

                        radPoint1_CheckedChanged(this, new EventArgs());
                        radPoint2_CheckedChanged(this, new EventArgs());
                        radPoint3_CheckedChanged(this, new EventArgs());
                    }

                    #endregion
                    #region Triangle2 (left side)

                    // Make the the triangle
                    if (chkTrianglePerpendicular2.Checked)
                    {
                        _triangle2 = new TriangleTest(_ball1.Position.Clone(), new DoubleVector(1, 0, 0, 0, 1, 0), new Triangle(0, 0, -100, 0, 100, 0, 0, -100, 100));

                        radPoint1Neg2.Enabled = radPoint1Pos2.Enabled = radPoint1Zero2.Enabled = false;
                        radPoint2Neg2.Enabled = radPoint2Pos2.Enabled = radPoint2Zero2.Enabled = false;
                        radPoint3Neg2.Enabled = radPoint3Pos2.Enabled = radPoint3Zero2.Enabled = false;
                    }
                    else
                    {
                        _triangle2 = new TriangleTest(_ball1.Position.Clone(), new DoubleVector(1, 0, 0, 0, 1, 0), new Triangle(-150, -150, 0, 150, -150, 0, 0, 150, 0));

                        radPoint1Neg2.Enabled = radPoint1Pos2.Enabled = radPoint1Zero2.Enabled = true;
                        radPoint2Neg2.Enabled = radPoint2Pos2.Enabled = radPoint2Zero2.Enabled = true;
                        radPoint3Neg2.Enabled = radPoint3Pos2.Enabled = radPoint3Zero2.Enabled = true;

                        radPoint1Changed2_CheckedChanged(this, new EventArgs());
                        radPoint2Changed2_CheckedChanged(this, new EventArgs());
                        radPoint3Changed2_CheckedChanged(this, new EventArgs());
                    }

                    #endregion

                    #endregion
                }
                else
                {
                    MessageBox.Show("Unknown radio button", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return;
                }

                #endregion
            }
            else
            {
                #region Polygons

                if (radSpherePolygon.Checked)
                {
                    #region Sphere Polygon

                    // I will leave ball1 alone.  I won't use its velocity, just radius

                    // Make the the polygon
                    //_polygon1 = new PolygonTest(_ball2.Position.Clone(), new DoubleVector(1, 0, 0, 0, 1, 0), Polygon.CreateTetrahedron(_ball2.Radius * 2, true), _ball2.Radius * 2);
                    _polygon1 = new PolygonTest(_ball2.Position.Clone(), new DoubleVector(1, 0, 0, 0, 1, 0), MyPolygon.CreateCube(_ball2.Radius * 5, true), _ball2.Radius * 4);

                    #endregion
                }
                else if (radPolygonPolygon.Checked)
                {
                    #region Polygon Polygon

                    // Polygon1 is on the right (so it uses ball2 as its source)
                    _polygon1 = new PolygonTest(_ball2.Position.Clone(), new DoubleVector(1, 0, 0, 0, 1, 0), MyPolygon.CreateTetrahedron(_ball2.Radius * 2, true), _ball2.Radius * 2);
                    _polygon2 = new PolygonTest(_ball1.Position.Clone(), new DoubleVector(1, 0, 0, 0, 1, 0), MyPolygon.CreateCube(_ball1.Radius * 2, true), _ball2.Radius * 2);

                    #endregion
                }
                else
                {
                    MessageBox.Show("Unknown radio button", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return;
                }

                #endregion
            }
        }
コード例 #3
0
    private static void Main()
    //****************************************************************************80
    //
    //  Purpose:
    //
    //    MAIN is the main program for GEOMETRY_PRB.
    //
    //  Discussion:
    //
    //    GEOMETRY_PRB tests the GEOMETRY library.
    //
    //  Licensing:
    //
    //    This code is distributed under the GNU LGPL license.
    //
    //  Modified:
    //
    //   20 January 2018
    //
    //  Author:
    //
    //    John Burkardt
    //
    {
        Console.WriteLine("");
        Console.WriteLine("GEOMETRY_PRB");
        Console.WriteLine("  Test the GEOMETRY library.");

        AngleTest.angle_box_2d_test();
        AngleTest.angle_contains_ray_2d_test();
        AngleTest.angle_deg_2d_test();
        AngleTest.angle_half_2d_test();
        AngleTest.angle_rad_2d_test();
        AngleTest.angle_rad_3d_test();
        AngleTest.angle_rad_nd_test();
        AngleTest.angle_turn_2d_test();

        AnnulusTest.annulus_sector_centroid_2d_test();

        BallTest.ball01_sample_2d_test();
        BallTest.ball01_sample_3d_test();
        BallTest.ball01_sample_nd_test();
        BallTest.ball01_volume_test();

        BasisTest.basis_map_3d_test();

        BoxTest.box_contains_point_2d_test();

        BoxTest.box_segment_clip_2d_test();
        BoxTest.box_ray_int_2d_test();
        BoxTest.box01_contains_point_2d_test();

        CircleTest.circle_dia2imp_2d_test();

        CircleTest.circle_exp_contains_point_2d_test();
        CircleTest.circle_exp2imp_2d_test();

        CircleTest.circle_imp_point_dist_2d_test();
        CircleTest.circle_imp_points_arc_2d_test();

        CircleTest.circle_llr2imp_2d_test();

        CircleTest.circle_lune_angle_by_height_2d_test();
        CircleTest.circle_lune_area_by_angle_2d_test();
        CircleTest.circle_lune_area_by_height_2d_test();
        CircleTest.circle_lune_centroid_2d_test();
        CircleTest.circle_lune_height_by_angle_2d_test();

        CircleTest.circle_pppr2imp_3d_test();

        CircleTest.circle_ppr2imp_2d_test();

        CircleTest.circle_sector_area_2d_test();
        CircleTest.circle_sector_centroid_2d_test();

        CircleTest.circle_triangle_area_2d_test();

        CircleTest.test0155();
        CircleTest.test0156();
        CircleTest.test016();
        CircleTest.test0165();

        CircleTest.circles_intersect_area_2d_test();
        CircleTest.circles_intersect_points_2d_test();

        CubeTest.test020();

        CubeTest.cube01_volume_test();

        CylinderTest.cylinder_point_dist_3d_test();
        CylinderTest.cylinder_point_dist_signed_3d_test();

        CylinderTest.test0202();
        CylinderTest.test0203();
        CylinderTest.test02035();
        CylinderTest.test0204();
        DegRadTest.test0205();
        DirectionTest.test021();
        DirectionTest.test022();

        DirectionTest.direction_uniform_nd_test();

        DiskPointTest.disk_point_dist_3d_test();

        r8Test.test0234();
        dmsradTest.test0235();
        DodecahedronTest.test0236();

        DualTest.dual_size_3d_test();
        DualTest.dual_shape_3d_test();


        EllipseTest.test025();

        EllipseTest.ellipse_area1_test();
        EllipseTest.ellipse_area2_test();
        EllipseTest.ellipse_area3_test();
        EllipseTest.ellipse_point_near_2d_test();

        EllipseTest.test026();

        EllipseTest.ellipse_points_arc_2d_test();

        HalfTest.halfplane_contains_point_2d_test();

        HalfTest.test029();
        HalfTest.test030();
        HaversineTest.test031();
        HexagonTest.test0315();
        HexagonTest.test032();
        HexagonTest.test0321();
        i4Test.test0322();
        i4Test.test0323();
        IcosahedronTest.test0325();
        LinesTest.test0327();

        LinesTest.line_exp_perp_2d_test();
        LinesTest.line_exp_point_dist_2d();

        LinesTest.test0336();
        LinesTest.test0337();
        LinesTest.test034();
        LinesTest.test0345();
        LinesTest.test0346();

        LinesTest.line_imp_point_dist_2d_test();

        LinesTest.test0351();
        LinesTest.test0352();
        LinesTest.test038();
        LinesTest.test0385();
        LinesTest.test03855();
        LinesTest.test0386();

        LinesTest.lines_exp_int_2d_test();

        LinesTest.test040();
        LinesTest.test041();
        LinesTest.test0415();
        LinesTest.test0416();
        SegmentTest.test0418();
        SegmentTest.test042();
        SegmentTest.test043();
        SegmentTest.test044();
        SegmentTest.test045();
        LocalMinimumTest.test046();
        LocalMinimumTest.test047();
        OctahedronTest.test0475();
        ParallelogramTest.test0477();
        ParallelogramTest.test0478();

        ParallelogramTest.parallelogram_contains_point_2d_test();
        ParallelogramTest.parallelogram_contains_point_2d_test2();
        ParallelogramTest.parallelogram_contains_point_3d_test();

        ParabolaTest.test0493();
        ParallelepipedTest.test0495();

        PlaneTest.plane_exp_normal_3d_test();

        PlaneTest.test051();
        PlaneTest.test052();
        PlaneTest.test053();
        PlaneTest.test054();

        PlaneTest.plane_imp2normal_3d_test();
        PlaneTest.plane_imp_line_par_int_3d_test();

        PlaneTest.test057();
        PlaneTest.test058();
        PlaneTest.test059();
        PlaneTest.test060();
        PlaneTest.test061();
        PlaneTest.test0615();
        PlaneTest.test0616();
        PlaneTest.test0617();
        PlaneTest.test062();
        PlaneTest.test063();
        PlaneTest.test064();

        PointsTest.points_centroid_2d_test();
        PointsTest.points_colin_2d_test();

        SphereTest.test068();
        PolarTest.test0685();
        PolygonTest.test0755();

        PolygonTest.polygon_angles_2d_test();

        PolygonTest.test076();
        PolygonTest.test0765();
        PolygonTest.test078();
        PolygonTest.test0782();
        PolygonTest.test0784();

        PolygonTest.polygon_centroid_3d_test();
        PolygonTest.polygon_contains_point_2d_test();
        PolygonTest.polygon_contains_point_2d_2_test();
        PolygonTest.polygon_contains_point_2d_3_test();

        PolygonTest.test080();
        PolygonTest.test0803();
        PolygonTest.test0805();

        PolygonTest.polygon_solid_angle_3d_test();

        PolyhedronTest.polyhedron_area_3d_test();
        PolyhedronTest.polyhedron_centroid_3d_test();

        PolyhedronTest.test0825();
        PolyhedronTest.test083();
        PolylineTest.test084();

        PolylineTest.polyline_points_nd_test();

        PolyloopTest.test0845();
        PolyloopTest.test0846();

        PlaneTest.plane_exp_pro3_test();

        ProvecTest.test170();
        QuadrilateralTest.test171();
        QuadrilateralTest.test1712();
        QuadrilateralTest.test1715();

        r8Test.r8_acos_test();
        r8Test.r8_asin_test();
        r8Test.r8_atan_test();

        r8Test.test0243();
        r8Test.test0245();
        RadecTest.test173();
        RadecTest.test174();
        r8Test.test1745();
        r8Test.test1746();
        DGETest.test1787();
        XYTest.test1893();
        SegmentTest.test036();
        SegmentTest.test0365();

        SegmentTest.segment_point_dist_3d_test();
        SegmentTest.segment_point_near_2d_test();
        SegmentTest.segment_point_near_3d_test();
        SegmentTest.segment_point_near_3d_test2();

        SimplexTest.test1788();
        SimplexTest.test1789();
        IcosahedronTest.test179();
        SortHeapTest.test180();
        SimplexTest.test1805();
        SphereTest.test0125();
        SphereTest.test0126();
        SphereTest.test0127();

        SphereTest.sphere_dia2imp_3d_test();

        SphereTest.test182();
        SphereTest.test183();
        SphereTest.test1835();
        SphereTest.test1836();
        SphereTest.test187();
        SphereTest.test188();
        SphereTest.test189();
        SphereTest.test1892();
        SphereTest.test1895();
        SphereTest.test190();
        SphereTest.test191();
        SphereTest.test192();
        SphereTest.test193();

        SphereTest.sphere_unit_sample_nd_2_test();

        SphereTest.test195();
        SphereTest.test1955();
        ShapeTest.test196();
        ShapeTest.test197();
        ShapeTest.test198();
        ShapeTest.test199();
        SphereTest.test200();
        SegmentTest.test201();
        EllipseTest.test202();
        TetrahedronTest.test203();
        TetrahedronTest.test2031();
        TetrahedronTest.test2032();
        TetrahedronTest.test20321();
        TetrahedronTest.test20322();

        TetrahedronTest.tetrahedron_lattice_layer_point_next_test();

        TetrahedronTest.test203225();
        TetrahedronTest.test20323();
        TetrahedronTest.test203232();
        TetrahedronTest.test203233();
        TetrahedronTest.test203234();
        TetrahedronTest.test203235();
        TetrahedronTest.test20324();
        TetrahedronTest.test20325();

        TetrahedronTest.tetrahedron_solid_angles_3d_test();

        TetrahedronTest.test2033();
        TransMatTest.test204();
        TransMatTest.test205();

        TriangleTest.triangle_angles_2d_test();

        TriangleTest.test20605();
        TriangleTest.test2061();
        TriangleTest.test2062();
        TriangleTest.test209();
        TriangleTest.test20655();
        TriangleTest.test2066();
        TriangleTest.test2094();
        TriangleTest.test2101();
        TriangleTest.test21011();
        TriangleTest.test2067();
        TriangleTest.test21015();

        TriangleTest.triangle_contains_line_exp_3d_test();
        TriangleTest.triangle_contains_line_par_3d_test();

        TriangleTest.test207();
        TriangleTest.test2075();
        TriangleTest.test208();
        TriangleTest.test2102();
        TriangleTest.test2070();
        TriangleTest.test20701();
        TriangleTest.test2104();
        TriangleTest.test2105();
        TriangleTest.test211();
        TriangleTest.test2103();
        TriangleTest.test2071();
        TriangleTest.test20715();

        TriangleTest.triangle_point_dist_3d_test();
        TriangleTest.triangle_point_near_2d_test();
        TriangleTest.triangle_quality_2d_test();

        TriangleTest.test212();
        TriangleTest.test213();

        TubeTest.tube_2d_test();

        VectorTest.vector_directions_nd_test();
        VectorTest.vector_rotate_2d_test();
        VectorTest.vector_rotate_3d_test();
        VectorTest.vector_rotate_base_2d_test();
        VectorTest.vector_separation_nd_test();

        VoxelTest.voxels_dist_l1_nd_test();
        VoxelTest.voxels_line_3d_test();
        VoxelTest.voxels_region_3d_test();
        VoxelTest.voxels_step_3d_test();

        WedgeTest.wedge01_volume_test();

        Console.WriteLine("");
        Console.WriteLine("GEOMETRY_PRB");
        Console.WriteLine("  Normal end of execution.");
        Console.WriteLine("");
    }
コード例 #4
0
ファイル: ColliderGenerator.cs プロジェクト: Rixic/Temporal
        //Mesh generation function wrapped by other methods; do not call this one directly
        static Mesh GenerationOperation(ref GeneratorProps genProps, out ColliderFinishStatus cFin, bool preview)
        {
            genProps.VerifyProperties();                       //Make sure properties are valid
            cFin = ColliderFinishStatus.Fail;                  //Default status
            PolygonTest polyTest = PolygonTest.TotalTriangles; //Default polygon test

            //Choose proper polygon test mode
            if (genProps.polyTestMode == PolygonTestMode.BestGuess)
            {
                polyTest = genProps.boxedCorners ? PolygonTest.EdgeQuads : PolygonTest.FaceEdgeQuads;
            }
            else if (genProps.polyTestMode == PolygonTestMode.SafeGuess)
            {
                polyTest = genProps.boxedCorners ? PolygonTest.TotalQuads : PolygonTest.TotalTriangles;
            }
            else
            {
                polyTest = (PolygonTest)(genProps.polyTestMode - 2);
            }

            GeneratorInstance gi = new GeneratorInstance();//Temporary container for generation data in the static method
            bool passedPolyTest  = false;
            bool generating      = true;
            int  genAttempts     = 0; //Generation attempts
            int  reductionType   = 0; //0 = plane strips, 1 = top/bottom segments, 2 = corners

            //Loop is for repeat detail reduction attempts
            while (generating)
            {
                if (gi != null)
                {
                    gi.ClearData();             //Clear generation data before next attempt
                }
                GenerateMesh(ref gi, genProps); //The true mesh generation function

                if (genProps.bypassPolyTest || preview)
                {
                    //Skipping polygon testing
                    passedPolyTest = true;
                    generating     = false;
                }
                else if (genProps.detailReduction == GeneratorProps.DetailReductionMode.None)
                {
                    //Skipping detail reduction and checking if polygon test was passed
                    passedPolyTest = MeshPolyTest(gi, genProps, polyTest);
                    generating     = false;
                }
                else if (genProps.detailReductionAttempts > 0)
                {
                    //Detail reduction process
                    passedPolyTest = MeshPolyTest(gi, genProps, polyTest);//Polygon testing
                    if (genProps.detailReduction == GeneratorProps.DetailReductionMode.All)
                    {
                        //Reduce all detail properties together, one at a time
                        if (genAttempts < genProps.detailReductionAttempts && !passedPolyTest)
                        {
                            switch (reductionType)
                            {
                            case 0:    //Place strip reduction
                                genProps.XYDetail = Mathf.Max(0, genProps.XYDetail - 1);
                                genProps.YZDetail = Mathf.Max(0, genProps.YZDetail - 1);
                                genProps.XZDetail = Mathf.Max(0, genProps.XZDetail - 1);
                                break;

                            case 1:    //Top and bottom segment reduction
                                genProps.topSegments    = Mathf.Max(0, genProps.topSegments - 1);
                                genProps.bottomSegments = Mathf.Max(0, genProps.bottomSegments - 1);
                                break;

                            case 2:    //Corner detail reduction
                                genProps.cornerDetails[0] = Mathf.Max(0, genProps.cornerDetails[0] - 1);
                                genProps.cornerDetails[1] = Mathf.Max(0, genProps.cornerDetails[1] - 1);
                                genProps.cornerDetails[2] = Mathf.Max(0, genProps.cornerDetails[2] - 1);
                                genProps.cornerDetails[3] = Mathf.Max(0, genProps.cornerDetails[3] - 1);
                                break;
                            }

                            reductionType = (reductionType + 1) % 3;//Increment to next reduction type for subsequent attempt
                        }
                        else
                        {
                            generating = false;
                        }
                    }
                    else if (genProps.detailReduction == GeneratorProps.DetailReductionMode.LargestFirst)
                    {
                        //Reduce greatest detail property values first
                        if (genAttempts < genProps.detailReductionAttempts && !passedPolyTest)
                        {
                            //Get maximum detail value
                            int maxDetail = Mathf.Max(
                                genProps.XYDetail,
                                genProps.YZDetail,
                                genProps.XZDetail,
                                genProps.topSegments,
                                genProps.bottomSegments,
                                genProps.cornerDetails[0],
                                genProps.cornerDetails[1],
                                genProps.cornerDetails[2],
                                genProps.cornerDetails[3]);

                            //Reduce all detail properties that match the maximum value
                            if (maxDetail == genProps.XYDetail)
                            {
                                genProps.XYDetail = Mathf.Max(0, genProps.XYDetail - 1);
                            }

                            if (maxDetail == genProps.YZDetail)
                            {
                                genProps.YZDetail = Mathf.Max(0, genProps.YZDetail - 1);
                            }

                            if (maxDetail == genProps.XZDetail)
                            {
                                genProps.XZDetail = Mathf.Max(0, genProps.XZDetail - 1);
                            }

                            if (maxDetail == genProps.topSegments)
                            {
                                genProps.topSegments = Mathf.Max(0, genProps.topSegments - 1);
                            }

                            if (maxDetail == genProps.bottomSegments)
                            {
                                genProps.bottomSegments = Mathf.Max(0, genProps.bottomSegments - 1);
                            }

                            if (maxDetail == genProps.cornerDetails[0])
                            {
                                genProps.cornerDetails[0] = Mathf.Max(0, genProps.cornerDetails[0] - 1);
                            }

                            if (maxDetail == genProps.cornerDetails[1])
                            {
                                genProps.cornerDetails[1] = Mathf.Max(0, genProps.cornerDetails[1] - 1);
                            }

                            if (maxDetail == genProps.cornerDetails[2])
                            {
                                genProps.cornerDetails[2] = Mathf.Max(0, genProps.cornerDetails[2] - 1);
                            }

                            if (maxDetail == genProps.cornerDetails[3])
                            {
                                genProps.cornerDetails[3] = Mathf.Max(0, genProps.cornerDetails[3] - 1);
                            }
                        }
                        else
                        {
                            generating = false;
                        }
                    }
                    else
                    {
                        generating = false;
                    }
                }
                else
                {
                    generating = false;
                }
                genAttempts++;

                if (genAttempts > genProps.detailReductionAttempts)
                {
                    //Quit detail reduction upon reaching maximum attempts and throw exception
                    generating = false;
                    if (!passedPolyTest)
                    {
                        cFin = ColliderFinishStatus.DetailTimeout;
                    }
                }
            }

            if (passedPolyTest)
            {
                cFin = ColliderFinishStatus.Success;//Successful generation after passing polygon test
            }
            else if (cFin != ColliderFinishStatus.DetailTimeout)
            {
                cFin = ColliderFinishStatus.FailTriCount;//Failed generation due to having to many polygons
            }
            return(gi.colMesh);
        }