Ejemplo n.º 1
0
        /// <summary>
        /// Gets the result of the completed task.
        /// </summary>
        /// <param name="result">The result of the completed task.</param>
        /// <returns>True if the result is available, false if the task should abort with no
        /// result. (I.e. An internal abort.)</returns>
        protected override bool GetResult(out TileBuildAssets result)
        {
            BuildContext logger = new BuildContext();

            result = new TileBuildAssets();

            NavmeshTileBuildData tbd =
                NMBuild.GetBuildData(logger, mTileX, mTileZ
                                     , mPolyData, (mDetailData == null ? null : mDetailData), mConnections
                                     , mBVTreeEnabled);

            AddMessages(logger.GetMessages());

            if (tbd == null)
            {
                return(false);
            }

            NavmeshTileData td = NavmeshTileData.Create(tbd);

            if (td.Size == 0)
            {
                AddMessage(string.Format(
                               "Could not create {2} object. Cause unknown."
                               + " Tile: ({0},{1})"
                               , mTileX, mTileZ, td.GetType().Name));

                return(false);
            }

            result = new TileBuildAssets(mTileX, mTileZ, td, tbd.PolyCount);

            return(true);
        }
Ejemplo n.º 2
0
        internal NavmeshTileData GetTileData(int x, int z, out int polyCount)
        {
            polyCount = 0;

            int i = GetIndex(x, z);

            if (i == IndexError)
            {
                return(null);
            }

            BuildDataItem item = unsafeItems[i];

            /*
             * Important: Must use the state. This method must return
             * the same number of tiles as the BakeableCount method indicates.
             */

            switch (item.TileState)
            {
            case TileBuildState.Built:

                polyCount = item.workingPolyCount;
                return(NavmeshTileData.Create(item.workingTile));

            case TileBuildState.Baked:

                polyCount = item.bakedPolyCount;
                return(NavmeshTileData.Create(item.bakedTile));
            }

            polyCount = 0;
            return(null);
        }
Ejemplo n.º 3
0
        internal void SetWorkingData(NavmeshTileData tile, int polyCount)
        {
            if (tile == null || polyCount <= 0)
            {
                SetAsEmpty();
                return;
            }

            workingTile      = tile.GetData();
            workingPolyCount = polyCount;
        }
Ejemplo n.º 4
0
        internal void SetWorkingData(int x, int z, NavmeshTileData tile, int polyCount)
        {
            int i = GetIndex(x, z);

            if (i == IndexError)
            {
                return;
            }

            unsafeItems[i].SetWorkingData(tile, polyCount);

            mIsDirty = true;
            unsafeVersion++;
        }
Ejemplo n.º 5
0
        internal bool GetMeshBuildData(UnityEngine.Vector3 origin, float tileWorldSize, TileZone zone
                                       , out NavmeshParams config
                                       , out NavmeshTileData[] tiles)
        {
            // Is there anything to bake?

            config = null;
            tiles  = null;

            int maxPolyCount;

            int tileCount;

            BakeableCount(out tileCount, out maxPolyCount);

            if (tileCount == 0)
            {
                return(false);
            }

            config = new NavmeshParams(origin.ToVector3()
                                       , tileWorldSize, tileWorldSize
                                       , Mathf.Max(1, tileCount)
                                       , Mathf.Max(1, maxPolyCount));

            // Add the tiles.

            List <NavmeshTileData> ltiles = new List <NavmeshTileData>();

            for (int tx = zone.xmin; tx <= zone.xmax; tx++)
            {
                for (int tz = zone.zmin; tz <= zone.zmax; tz++)
                {
                    int             trash;
                    NavmeshTileData td = GetTileData(tx, tz, out trash);
                    if (td == null)
                    {
                        // Tile is not available.
                        continue;
                    }

                    ltiles.Add(td);
                }
            }

            tiles = ltiles.ToArray();

            return(true);
        }
Ejemplo n.º 6
0
        /// <summary>
        /// Constructor
        /// </summary>
        /// <remarks>
        /// <para>
        /// A 'no result' object will be created if the <paramref name="tile"/> parameter
        /// is null or polygon count is less than one.
        /// </para>
        /// </remarks>
        /// <param name="tx">The x-index of the tile within the tile grid. (tx, tz)</param>
        /// <param name="tz">The z-index of the tile within the tile grid. (tx, tz)</param>
        /// <param name="tile">The tile data.</param>
        /// <param name="polyCount">The polygons in the tile.</param>
        public TileBuildAssets(int tx, int tz, NavmeshTileData tile, int polyCount)
        {
            mTileX = tx;
            mTileZ = tz;

            if (tile == null || polyCount < 1)
            {
                mTile      = null;
                mPolyCount = 0;
            }
            else
            {
                mTile      = tile;
                mPolyCount = polyCount;
            }
        }
Ejemplo n.º 7
0
        private void HandleBake()
        {
            NavmeshBuild build = Context.Build;

            NavmeshTileData[] tiles = new NavmeshTileData[1]
            {
                build.BuildData.GetTileData(0, 0)
            };

            NavmeshParams nconfig = NavUtil.DeriveConfig(tiles[0]);

            NavStatus status = build.BuildTarget.Load(nconfig, tiles, NMBEditorUtil.GetConfig(build));

            if ((status & NavStatus.Failure) == 0)
            {
                EditorUtility.SetDirty((Object)build.BuildTarget);
                // build.BuildData.SetAsBaked();
                build.BuildData.Reset(0, 0);  // Don't need to keep the data.
            }
            else
            {
                Logger.PostError("Bake to target: Target reported failure.", (Object)build.BuildTarget);
            }
        }
Ejemplo n.º 8
0
        public void Build()
        {
            if (!mBuild)
            {
                return;
            }

            mBuild.ResetBuild();

            // Note: The 'finally' takes care of all cleanup.

            try
            {
                EditorUtility.DisplayCancelableProgressBar("Build & Bake"
                                                           , "Preparing..."
                                                           , 0);

                // Prepare the build.

                if (!CompileInput())
                {
                    return;
                }

                if (!InitializeBuild())
                {
                    return;
                }

                // Build the tiles.
                NavmeshParams     nconfig = null;
                NavmeshTileData[] tiles   = null;
                bool success = true;

                if (mBuild.TileSetDefinition == null)
                {
                    if (!BuildSingleTile())
                    {
                        return;
                    }

                    tiles = new NavmeshTileData[1] {
                        mBuild.BuildData.GetTileData(0, 0)
                    };

                    nconfig = NavUtil.DeriveConfig(tiles[0]);
                }
                else if (BuildMultiTiled())
                {
                    success = mBuild.BuildData.GetMeshBuildData(mBuild.TileSetDefinition.BoundsMin
                                                                , mBuild.TileSetDefinition.TileWorldSize
                                                                , out nconfig, out tiles);
                }
                else
                {
                    return;
                }

                if (!success)
                {
                    mContext.PostError("Navigation mesh creation failed.", mBuild);
                    return;
                }

                // Bake the mesh.

                NavStatus nstatus =
                    mBuild.BuildTarget.Load(nconfig, tiles, NMBEditorUtil.GetConfig(mBuild));

                if ((nstatus & NavStatus.Sucess) == 0)
                {
                    mContext.PostError("Bake to target: Target reported failure.", mBuild);
                }
                else
                {
                    EditorUtility.SetDirty((Object)mBuild.BuildTarget);
                }
            }
            finally
            {
                mBuild.ResetBuild();
                EditorUtility.ClearProgressBar();
            }
        }
Ejemplo n.º 9
0
        private bool BuildSingleTile()
        {
            TileBuildData tdata  = mBuild.BuildData;
            NMGenConfig   config = mBuild.Config;
            InputGeometry geom   = mBuild.InputGeom;

            mContext.ResetLog();

            /*
             * Design note:
             *
             * Not using the build task since it doesn't provide enough progress
             * feedback for a single tile.
             *
             */

            // Create the NMGen builder.

            IncrementalBuilder builder = IncrementalBuilder.Create(config.GetConfig()
                                                                   , config.ResultOptions
                                                                   , geom
                                                                   , mBuild.NMGenProcessors);

            if (builder == null)
            {
                mContext.PostError("Unexpected failure creating NMGen builder.", mBuild);
                tdata.SetAsFailed(0, 0);
                return(false);
            }
            else if (builder.IsFinished)
            {
                if (builder.State == NMGenState.NoResult)
                {
                    mContext.PostError("NMGen build did not produce a result. (Early exit.)"
                                       , builder.GetMessages(), mBuild);
                    tdata.SetAsFailed(0, 0);
                    return(false);
                }
                else
                {
                    mContext.PostError("Unexpected NMGen builder completion."
                                       , builder.GetMessages(), mBuild);
                    tdata.SetAsFailed(0, 0);
                    return(false);
                }
            }

            mBuild.BuildData.SetAsInProgress(0, 0);

            // Run the NMGen builder.

            while (!builder.IsFinished)
            {
                if (EditorUtility.DisplayCancelableProgressBar("Build Single Tile Mesh"
                                                               , IncrementalBuilder.ToLabel(builder.State)
                                                               , IncrementalBuilder.ToProgress(builder.State)))
                {
                    return(false);
                }

                builder.Build();
            }

            // Handle NMGen failures.

            mContext.Log(builder.GetMessages());   // Single tile build.  So go ahead an record.

            switch (builder.State)
            {
            case NMGenState.Aborted:

                mContext.PostError("NMGen build failed.", mBuild);
                tdata.SetAsFailed(0, 0);
                return(false);

            case NMGenState.NoResult:

                mContext.PostError("NMGen build did not produce a result.", mBuild);
                tdata.SetAsFailed(0, 0);
                return(false);
            }

            mContext.Log(string.Format("Completed NMGen build: {0} polygons."
                                       , builder.Result.PolyMesh.PolyCount)
                         , mBuild);

            // Build the tile.

            NMGenAssets result = builder.Result;

            if (result.DetailMesh == null)
            {
                Debug.LogError("result.DetailMesh ==null!");
            }

            NavmeshTileBuildData tbd = org.critterai.nmbuild.NMBuild.GetBuildData(
                mContext, 0, 0
                , result.PolyMesh.GetData(false), result.DetailMesh.GetData(false)
                , mBuild.Connections
                , (config.BuildFlags & NMGenBuildFlag.BVTreeEnabled) != 0);

            if (tbd == null)
            {
                // No need to log the error.  The above method takes care of that.
                tdata.SetAsFailed(0, 0);
                return(false);
            }

            NavmeshTileData td = NavmeshTileData.Create(tbd);

            if (td.Size == 0)
            {
                mContext.PostError(
                    "Could not create {0} object. Cause unknown." + typeof(NavmeshTileData)
                    , mBuild);
                tdata.SetAsFailed(0, 0);
                return(false);
            }

            // Finalize the tile.

            tdata.SetWorkingData(0, 0, result.PolyMesh, result.DetailMesh);
            tdata.SetWorkingData(0, 0, td, tbd.PolyCount);

            mContext.PostTrace("Completed single tile build.", mBuild);

            return(true);
        }
Ejemplo n.º 10
0
        private void HandleWorkingNavmesh(TileSelection selection)
        {
            NavmeshBuild  build = selection.Build;
            TileBuildData tdata = build.BuildData;

            if (mDebugObject == null)
            {
                Navmesh navmesh = null;

                if (tdata.BakeableCount() == 0)
                {
                    // Nothing to display.
                    return;
                }

                bool success = true;

                TileSetDefinition tdef = build.TileSetDefinition;

                NavmeshParams     nconfig;
                NavmeshTileData[] tiles;

                if (tdef == null)
                {
                    tiles = new NavmeshTileData[1] {
                        tdata.GetTileData(0, 0)
                    };
                    nconfig = NavUtil.DeriveConfig(tiles[0]);
                }
                else
                {
                    TileZone zone;

                    if (selection.HasSelection)
                    {
                        zone = selection.Zone;
                    }
                    else
                    {
                        zone = new TileZone(0, 0, tdef.Width - 1, tdef.Depth - 1);
                    }

                    success = tdata.GetMeshBuildData(tdef.BoundsMin.ToUnityVector3(), tdef.TileWorldSize, zone
                                                     , out nconfig, out tiles);
                }

                NavStatus status = NavStatus.Sucess;

                if (success)
                {
                    status = Navmesh.Create(nconfig, out navmesh);

                    if ((status & NavStatus.Failure) == 0)
                    {
                        foreach (NavmeshTileData tile in tiles)
                        {
                            uint trash;
                            status = navmesh.AddTile(tile, Navmesh.NullTile, out trash);

                            if ((status & NavStatus.Sucess) == 0)
                            {
                                navmesh = null;
                                break;
                            }
                        }
                    }
                }

                if ((status & NavStatus.Sucess) == 0)
                {
                    Show = MeshDebugOption.None;                      // Use property.
                    Debug.LogError("Mesh Debug View: Error creating working navigation mesh: "
                                   + status + ". Disabled display.", build);
                }
                else
                {
                    mDebugObject = navmesh;
                }
            }

            if (mDebugObject != null)
            {
                Navmesh nm = ( Navmesh )mDebugObject;
                NavDebug.Draw(nm, NavmeshSceneDraw.Instance.ColorByArea);
            }
        }
Ejemplo n.º 11
0
 public static extern void dtnmFreeTileData(NavmeshTileData tileData);
Ejemplo n.º 12
0
 public static extern void dtnmFreeTileData(NavmeshTileData tileData);
Ejemplo n.º 13
0
 public static extern bool dtnmBuildTileDataRaw([In] byte[] rawData
                                                , int dataSize
                                                , [In, Out] NavmeshTileData resultTile);
Ejemplo n.º 14
0
 public static extern bool dtnmBuildTileData(NavmeshTileBuildData sourceData
                                             , [In, Out] NavmeshTileData resultTile);
Ejemplo n.º 15
0
 public static extern NavStatus dtnmAddTile(IntPtr navmesh
                                            , [In, Out] NavmeshTileData tileData
                                            , uint lastRef
                                            , ref uint resultRef);