public void TestAddRemove() { Vector3[] rndVectors = Enumerable.Range(1, 11).Select(x => Random.insideUnitCircle.toVec3()).ToArray(); //IndexedTriangleMesh.Triangle[] trgs = Enumerable.Range(1, numTriagsPerRound * numRounds).Select( x => new IndexedTriangleMesh.Triangle( rndVectors[Random.Range(0,999)], rndVectors[Random.Range(0, 999)], rndVectors[Random.Range(0, 999)]) ).ToArray(); C5.ArrayList <IndexedTriangleMesh.Triangle> triags = new C5.ArrayList <IndexedTriangleMesh.Triangle>(); IndexedTriangleMesh itm = new IndexedTriangleMesh(); for (int j = 0; j < 100; j++) { for (int i = 0; i < 10; i++) { if (triags.Count > 0 & Random.value < 0.33f) { IndexedTriangleMesh.Triangle t = triags[Random.Range(0, triags.Count - 1)]; itm.RemoveTriangle(t); triags.Remove(t); } else { itm.AddTriangleByReference(new IndexedTriangleMesh.Triangle(rndVectors[Random.Range(0, rndVectors.Length - 1)], rndVectors[Random.Range(0, rndVectors.Length - 1)], rndVectors[Random.Range(0, rndVectors.Length - 1)])); } } NUnit.Framework.Assert.IsTrue(itm.SanityCheck(), "Sanity check failed"); } }
// Use this for initialization void Start() { System.Diagnostics.Stopwatch watch = new System.Diagnostics.Stopwatch(); watch.Start(); itm = NavMeshBuilder.BuildTerrainNavmesh(GameObject.FindObjectOfType <Terrain>()); Debug.Log("Terrain built in " + watch.Elapsed); watch.Reset(); watch.Start(); StartCoroutine(itm.OptimizeMesh()); StartCoroutine(Draw()); }
public static IndexedTriangleMesh BuildTerrainNavmesh(Terrain terrain) { IndexedTriangleMesh itm = new IndexedTriangleMesh(); TerrainData tdata = terrain.terrainData; float[,] heightmap = tdata.GetHeights(0, 0, tdata.heightmapWidth, tdata.heightmapHeight); Vector3[,] vertices = new Vector3[heightmap.GetLength(0), heightmap.GetLength(1)]; for (int y = 0; y < heightmap.GetLength(0); y++) { for (int x = 0; x < heightmap.GetLength(1); x++) { vertices[y, x] = HeightmapToVector(heightmap, x, y, tdata.heightmapScale); } } for (int y = 1; y < heightmap.GetLength(0); y++) { for (int x = 1; x < heightmap.GetLength(1); x++) { /*for(int y = 1; y < 3; y++) { * for(int x = 1; x < 3; x++) {*/ //IndexedTriangleMesh.Triangle triag = new IndexedTriangleMesh.Triangle( HeightmapToVector( heightmap, x, y, tdata.heightmapScale ), HeightmapToVector( heightmap, x, y - 1, tdata.heightmapScale ), HeightmapToVector( heightmap, x - 1, y, tdata.heightmapScale ) ); IndexedTriangleMesh.Triangle triag = new IndexedTriangleMesh.Triangle(vertices[y, x], vertices[y - 1, x], vertices[y, x - 1]); if (checkTriangleSlope(triag.vertices)) { itm.AddTriangleByReference(triag); } //triag = new IndexedTriangleMesh.Triangle( HeightmapToVector( heightmap, x - 1, y - 1, tdata.heightmapScale ), HeightmapToVector( heightmap, x - 1, y, tdata.heightmapScale ), HeightmapToVector( heightmap, x, y - 1, tdata.heightmapScale ) ); triag = new IndexedTriangleMesh.Triangle(vertices[y - 1, x - 1], vertices[y, x - 1], vertices[y - 1, x]); if (checkTriangleSlope(triag.vertices)) { itm.AddTriangleByReference(triag); } } } return(itm); }
public void TestOptimize() { IndexedTriangleMesh itm = new IndexedTriangleMesh(); Vector3[] vectors = new Vector3[] { new Vector3(1, 0, 1), new Vector3(1, 0, -1), new Vector3(-1, 0, -1), new Vector3(-1, 0, 1), new Vector3(0, 0, 0) }; IndexedTriangleMesh.Triangle[] trg = new IndexedTriangleMesh.Triangle[] { new IndexedTriangleMesh.Triangle(new Vector3[] { vectors[0], vectors[1], vectors[4] }), new IndexedTriangleMesh.Triangle(new Vector3[] { vectors[1], vectors[2], vectors[4] }), new IndexedTriangleMesh.Triangle(new Vector3[] { vectors[2], vectors[3], vectors[4] }), new IndexedTriangleMesh.Triangle(new Vector3[] { vectors[3], vectors[0], vectors[4] }) }; foreach (IndexedTriangleMesh.Triangle trig in trg) { itm.AddTriangleByReference(trig); } //Act itm.OptimizeMesh(); //Assert //The object has a new name Mesh testM = itm.ExtractMeshes().First(); NUnit.Framework.Assert.AreEqual(4, testM.vertexCount, "Mesh was not optimized"); }