Exemplo n.º 1
0
    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();
    }
Exemplo n.º 2
0
    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();
    }
Exemplo n.º 3
0
        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();
        }