public static void ShowRecastDetailMesh(DbgRenderMesh renderMesh, PolyMeshAsset.PolyMeshDetailData dmesh) { renderMesh.Clear(); UnityEngine.Random.seed = c_RandomSeed; int nmeshes = dmesh.nmeshes; for (int i = 0; i < nmeshes; ++i) { Color col = new Color(UnityEngine.Random.value, UnityEngine.Random.value, UnityEngine.Random.value); uint bverts = dmesh.meshes[i * 4]; uint btris = dmesh.meshes[i * 4 + 2]; uint ntris = dmesh.meshes[i * 4 + 3]; ; uint trisStart = btris * 4; for (uint j = 0; j < ntris; ++j) { Vector3[] verts = new Vector3[3]; for (int k = 0; k < 3; ++k) { int vertStart = (int)(bverts + dmesh.tris[trisStart + j * 4 + k]) * 3; verts[k].x = dmesh.verts[vertStart + 0]; verts[k].y = dmesh.verts[vertStart + 1]; verts[k].z = dmesh.verts[vertStart + 2]; } col = VaryColor(col); renderMesh.AddTriangle(new DbgRenderTriangle( verts[0] , verts[1] , verts[2] , col)); } } renderMesh.Rebuild(); }
public static void ShowRecastNavmesh(DbgRenderMesh renderMesh, PolyMeshAsset.PolyMeshData pmesh, Pathfinding.Config config) { renderMesh.Clear(); UnityEngine.Random.seed = c_RandomSeed; int npolys = pmesh.npolys; int nvp = pmesh.nvp; int[] tri = new int[3]; Vector3[] verts = new Vector3[3]; for (int i = 0; i < npolys; ++i) { int pIndex = i * nvp * 2; Color col = new Color(UnityEngine.Random.value, UnityEngine.Random.value, UnityEngine.Random.value); for (int j = 2; j < nvp; ++j) { if (pmesh.polys[pIndex + j] == RC_MESH_NULL_IDX) break; tri[0] = pmesh.polys[pIndex]; tri[1] = pmesh.polys[pIndex + j - 1]; tri[2] = pmesh.polys[pIndex + j]; for (int k = 0; k < 3; ++k) { int vIndex = tri[k] * 3; verts[k].x = config.bmin[0] + pmesh.verts[vIndex + 0] * pmesh.cs; verts[k].y = config.bmin[1] + (pmesh.verts[vIndex + 1] + 1) * pmesh.ch + 0.1f; verts[k].z = config.bmin[2] + pmesh.verts[vIndex + 2] * pmesh.cs; } col = VaryColor(col); renderMesh.AddTriangle(new DbgRenderTriangle(verts[0], verts[1], verts[2], col)); } } renderMesh.Rebuild(); }
void BakeSingleTile() { UpdateProgress(0f); int nverts = 0; float[] verts = null; int ntris = 0; int[] tris = null; ProcessTerrain(ref verts, ref nverts, ref tris, ref ntris); UpdateProgress(0.25f); config.walkableHeight = (int)Math.Ceiling(ecfg.AgentHeight / config.ch); config.walkableClimb = (int)Math.Floor(ecfg.AgentMaxClimb / config.ch); config.walkableRadius = (int)Math.Ceiling(ecfg.AgentRadius / config.cs); config.maxEdgeLen = (int)(EdgeLen / config.cs); config.minRegionArea = (int)Math.Pow(RegionMinSize, 2); config.mergeRegionArea = (int)Math.Pow(RegionMergeSize, 2); config.detailSampleDist = DetailSampleDist < 0.9f ? 0 : config.cs * DetailSampleDist; config.detailSampleMaxError = DetailSampleMaxError * config.ch; // Generate Recast Recast.handleBuild(ref config, verts, nverts, tris, ntris); // Fetch navmeshes IntPtr polyPtr = Recast.getPolyMesh(); IntPtr detailPtr = Recast.getPolyMeshDetail(); PolyMesh mesh = (PolyMesh)Marshal.PtrToStructure(polyPtr, typeof(PolyMesh)); PolyMeshDetail detail = (PolyMeshDetail)Marshal.PtrToStructure(detailPtr, typeof(PolyMeshDetail)); UpdateProgress(0.5f); // Create asset PolyMeshAsset asset = CustomAssetUtility.CreateAssetWithoutSaving <PolyMeshAsset>(); // Save config asset.config = config; // Set poly data asset.PolyMesh.nverts = mesh.nverts; asset.PolyMesh.npolys = mesh.npolys; asset.PolyMesh.maxpolys = mesh.maxpolys; asset.PolyMesh.nvp = mesh.nvp; CopyArray <float>(mesh.bmin, ref asset.PolyMesh.bmin, 3); CopyArray <float>(mesh.bmax, ref asset.PolyMesh.bmax, 3); asset.PolyMesh.cs = mesh.cs; asset.PolyMesh.ch = mesh.ch; asset.PolyMesh.borderSize = mesh.borderSize; asset.PolyMesh.verts = new ushort[3 * mesh.nverts]; CopyArray(mesh.verts, asset.PolyMesh.verts, 3 * mesh.nverts); asset.PolyMesh.polys = new ushort[mesh.maxpolys * 2 * mesh.nvp]; CopyArray(mesh.polys, asset.PolyMesh.polys, mesh.maxpolys * 2 * mesh.nvp); asset.PolyMesh.regs = new ushort[mesh.maxpolys]; CopyArray(mesh.regs, asset.PolyMesh.regs, mesh.maxpolys); asset.PolyMesh.flags = new ushort[mesh.npolys]; CopyArray(mesh.flags, asset.PolyMesh.flags, mesh.npolys); asset.PolyMesh.areas = new byte[mesh.maxpolys]; CopyArray(mesh.areas, asset.PolyMesh.areas, mesh.maxpolys); // Set detail data asset.PolyDetailMesh.nmeshes = detail.nmeshes; asset.PolyDetailMesh.nverts = detail.nverts; asset.PolyDetailMesh.ntris = detail.ntris; asset.PolyDetailMesh.meshes = new uint[4 * detail.nmeshes]; CopyArray(detail.meshes, asset.PolyDetailMesh.meshes, 4 * detail.nmeshes); asset.PolyDetailMesh.verts = new float[3 * detail.nverts]; CopyArray(detail.verts, asset.PolyDetailMesh.verts, 3 * detail.nverts); asset.PolyDetailMesh.tris = new byte[4 * detail.ntris]; CopyArray(detail.tris, asset.PolyDetailMesh.tris, 4 * detail.ntris); // Save asset again UpdateProgress(0.75f); CustomAssetUtility.SaveAsset <PolyMeshAsset>(asset); // Close window UpdateProgress(0f); EditorUtility.ClearProgressBar(); }