Example #1
0
        NodeGraph BakeVoxelAirNodes(Transform world, List <NavMeshBuildSource> sources)
        {
            var colliders   = new Collider[128];
            var mesh        = new Mesh();
            var nodeMap     = new Dictionary <uint3, (Voxel_t, Node)>();
            var meshFilters = world.GetComponentsInChildren <MeshFilter>().Where(mf => mf.gameObject.layer == LayerIndex.world.intVal).ToArray();

            Log("Mesh location");

            var combine = new CombineInstance[meshFilters.Length];

            for (int i = 0; i < meshFilters.Length; i++)
            {
                combine[i].mesh      = meshFilters[i].sharedMesh;
                combine[i].transform = meshFilters[i].transform.localToWorldMatrix;
            }

            mesh.CombineMeshes(combine);
            mesh.RecalculateBounds();
            Log("Mesh combination");

            var gpuVoxelData = GPUVoxelizer.Voxelize(VoxelizerShader, mesh, (int)Resolution, true);

            GPUVoxelizer.BuildBetterVoxels(VoxelizerShader, gpuVoxelData);
            var voxels = gpuVoxelData.GetData();

            Log("Voxelization");
            DestroyImmediate(mesh);
            CollectNodes(colliders, nodeMap, voxels);

            var nodeNeighbors = new Dictionary <uint3, List <uint3> >();
            var removedIds    = new List <uint3>();
            var remapIds      = new Dictionary <uint3, uint3>();

            (Voxel_t voxel, Node node)[] pairs = nodeMap.Values.ToArray();