コード例 #1
0
ファイル: NavMeshBuilder.cs プロジェクト: taotao111/ainav
 public void GetDirtyTileBounds(List <NavMeshTileBounds> dirty)
 {
     foreach (var tileCoord in TilesToBuild)
     {
         DtBoundingBox     bounds     = NavMeshBuildUtils.CalculateTileBoundingBox(BuildSettings, tileCoord);
         NavMeshTileBounds tileBounds = new NavMeshTileBounds(tileCoord, bounds);
         dirty.Add(tileBounds);
     }
 }
コード例 #2
0
ファイル: NavMeshBuilder.cs プロジェクト: taotao111/ainav
        public void MarkDirty(DtBoundingBox boundingBox)
        {
            var tiles = NavMeshBuildUtils.GetOverlappingTiles(BuildSettings, boundingBox);

            foreach (var tileCoord in tiles)
            {
                TilesToBuild.Add(tileCoord);
            }
        }
コード例 #3
0
ファイル: NavMeshBuilder.cs プロジェクト: taotao111/ainav
        public unsafe bool BuildAllFromSingleInput(NavMeshBuildInput single)
        {
            HeightBounds = default;
            Tiles.Clear();
            TilesToBuild.Clear();

            List <NavMeshBuildInput> inputs = new List <NavMeshBuildInput>()
            {
                single
            };

            BuildResult = new NavMeshBuildResult();

            NormalizeInputHeights(inputs);
            SetGlobalBounds(inputs);

            foreach (NavMeshBuildInput input in inputs)
            {
                var tiles = NavMeshBuildUtils.GetOverlappingTiles(BuildSettings, input.TileBounds.Bounds);
                foreach (var tileCoord in tiles)
                {
                    int result = BuildTile(tileCoord, BuildSettings, AgentSettings, input, 1, out NavMeshTile tile);
                    if (result == 0)
                    {
                        Tiles[tileCoord] = tile;
                        BuildResult.TilesBuilt++;
                    }
                    else if (result != 110)
                    {
                        BuildResult.Result = result;
                        return(false);
                    }
                }
            }

            BuildResult.Result = 0;

            return(true);
        }
コード例 #4
0
ファイル: NavMeshBuilder.cs プロジェクト: taotao111/ainav
        private unsafe int BuildTile(int2 tileCoordinate, NavMeshBuildSettings buildSettings, NavAgentSettings agentSettings,
                                     NavMeshBuildInput buildInput, long buildTimeStamp, out NavMeshTile meshTile)
        {
            meshTile = null;

            if (buildInput.AreasLength != buildInput.IndicesLength / 3)
            {
                return(-1001);
            }

            if (buildInput.VerticesLength <= 0 || buildInput.IndicesLength <= 0)
            {
                return(-1000);
            }

            DtBoundingBox tileBoundingBox = NavMeshBuildUtils.CalculateTileBoundingBox(buildSettings, tileCoordinate);

            NavMeshBuildUtils.SnapBoundingBoxToCellHeight(buildSettings, ref tileBoundingBox);

            tileBoundingBox.min.y = HeightBounds.min.y;
            tileBoundingBox.max.y = HeightBounds.max.y;

            IntPtr builder = Navigation.NavMesh.CreateBuilder();

            DtBuildSettings internalBuildSettings = new DtBuildSettings
            {
                // Tile settings
                BoundingBox  = tileBoundingBox,
                TilePosition = tileCoordinate,
                TileSize     = buildSettings.TileSize,

                // General build settings
                CellHeight           = buildSettings.CellHeight,
                CellSize             = buildSettings.CellSize,
                RegionMinArea        = buildSettings.MinRegionArea,
                RegionMergeArea      = buildSettings.RegionMergeArea,
                EdgeMaxLen           = buildSettings.MaxEdgeLen,
                EdgeMaxError         = buildSettings.MaxEdgeError,
                DetailSampleDist     = buildSettings.DetailSamplingDistance,
                DetailSampleMaxError = buildSettings.MaxDetailSamplingError,

                // Agent settings
                AgentHeight   = agentSettings.Height,
                AgentRadius   = agentSettings.Radius,
                AgentMaxClimb = agentSettings.MaxClimb,
                AgentMaxSlope = agentSettings.MaxSlope
            };

            Navigation.NavMesh.SetSettings(builder, new IntPtr(&internalBuildSettings));

            IntPtr buildResultPtr = Navigation.NavMesh.Build2(builder, buildInput.Vertices, buildInput.VerticesLength, buildInput.Indices, buildInput.IndicesLength, buildInput.Areas);

            DtGeneratedData *generatedDataPtr = (DtGeneratedData *)buildResultPtr;

            if (generatedDataPtr->Success && generatedDataPtr->NavmeshDataLength > 0)
            {
                meshTile = new NavMeshTile();

                // Copy the generated navigationMesh data
                meshTile.Data = new byte[generatedDataPtr->NavmeshDataLength + sizeof(long)];
                Marshal.Copy(generatedDataPtr->NavmeshData, meshTile.Data, 0, generatedDataPtr->NavmeshDataLength);

                // Append time stamp
                byte[] timeStamp = BitConverter.GetBytes(buildTimeStamp);
                for (int i = 0; i < timeStamp.Length; i++)
                {
                    meshTile.Data[meshTile.Data.Length - sizeof(long) + i] = timeStamp[i];
                }
            }

            int error = generatedDataPtr->Error;

            Navigation.NavMesh.DestroyBuilder(builder);

            return(error);
        }