//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); }
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 } }
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(""); }
//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); }