Exemple #1
0
    /// <summary>
    /// Load a navigation mesh from data created from the <see cref="Navmesh.GetSerializedMesh"/>
    /// method.
    /// </summary>
    /// <param name="serializedMesh">The serialized mesh.</param>
    /// <param name="buildConfig">The build information. (Optional)</param>
    /// <returns>The <see cref="NavStatus"/> flags for the operation.</returns>
    public NavStatus Load(byte[] serializedMesh, NavmeshBuildInfo buildConfig)
    {
        if (serializedMesh == null)
        {
            return(NavStatus.Failure | NavStatus.InvalidParam);
        }

        // This roundabout method is used for validation.

        Navmesh   navmesh;
        NavStatus status = Navmesh.Create(serializedMesh, out navmesh);

        if ((status & NavStatus.Sucess) == 0)
        {
            return(status);
        }

        mDataPack = navmesh.GetSerializedMesh();

        if (mDataPack == null)
        {
            return(NavStatus.Failure);
        }

        mBuildInfo = buildConfig;

        mVersion++;

        return(NavStatus.Sucess);
    }
Exemple #2
0
    /// <summary>
    /// Loads a single-tile navigation mesh from the provided data.
    /// </summary>
    /// <param name="buildData">The tile build data.</param>
    /// <param name="buildConfig">The build information. (Optional)</param>
    /// <returns>The <see cref="NavStatus"/> flags for the operation.</returns>
    public NavStatus Load(NavmeshTileBuildData buildData, NavmeshBuildInfo buildConfig)
    {
        if (buildData == null || buildData.IsDisposed)
        {
            return(NavStatus.Failure | NavStatus.InvalidParam);
        }

        Navmesh   navmesh;
        NavStatus status = Navmesh.Create(buildData, out navmesh);

        if ((status & NavStatus.Sucess) == 0)
        {
            return(status);
        }

        mDataPack = navmesh.GetSerializedMesh();

        if (mDataPack == null)
        {
            return(NavStatus.Failure);
        }

        mBuildInfo = buildConfig;

        mVersion++;

        return(NavStatus.Sucess);
    }
 /// <summary>
 /// True if the provided information does not match the current scene or is not
 /// available.
 /// </summary>
 /// <param name="info">The build information to check. (Null is valid.)</param>
 /// <returns>True if the provided information does not match the current scene.</returns>
 public static bool SceneMismatch(NavmeshBuildInfo info)
 {
     return(!(info == null ||
              info.inputScene == EditorApplication.currentScene ||
              info.inputScene == null ||
              info.inputScene.Length == 0));
 }
        /// <summary>
        /// The standard scene display name for the information.
        /// </summary>
        /// <param name="info">The build information to check. (Null is valid.)</param>
        /// <returns>The standard scene display name for the information.</returns>
        public static string SceneDisplayName(NavmeshBuildInfo info)
        {
            if (info == null || info.inputScene == null || info.inputScene.Length == 0)
            {
                return("Unknown");
            }

            string result = System.IO.Path.GetFileName(info.inputScene);

            return(result.Substring(0, result.LastIndexOf(".")));
        }
 /// <summary>
 /// Clones the object.
 /// </summary>
 /// <returns>A clone of the object.</returns>
 public NavmeshBuildInfo Clone()
 {
     NavmeshBuildInfo result = new NavmeshBuildInfo();
     result.tileSize = tileSize;
     result.borderSize = borderSize;
     result.walkableHeight = walkableHeight;
     result.walkableRadius = walkableRadius;
     result.walkableStep = walkableStep;
     result.xzCellSize = xzCellSize;
     result.yCellSize = yCellSize;
     result.inputScene = inputScene;
     return result;
 }
Exemple #6
0
        /// <summary>
        /// Clones the object.
        /// </summary>
        /// <returns>A clone of the object.</returns>
        public NavmeshBuildInfo Clone()
        {
            NavmeshBuildInfo result = new NavmeshBuildInfo();

            result.tileSize       = tileSize;
            result.borderSize     = borderSize;
            result.walkableHeight = walkableHeight;
            result.walkableRadius = walkableRadius;
            result.walkableStep   = walkableStep;
            result.xzCellSize     = xzCellSize;
            result.yCellSize      = yCellSize;
            result.inputScene     = inputScene;
            return(result);
        }
Exemple #7
0
    private void SetConfigFromTargetIntern(Navmesh navmesh)
    {
        NavmeshBuildInfo targetConfig = BuildTarget.BuildInfo;
        NMGenParams      currConfig   = mConfig.GetConfig();

        // Note: Must ensure exact match with original configuration.
        // So this process is using the fields and trusting the
        // original configuration to have valid values.

        currConfig.tileSize       = targetConfig.tileSize;
        currConfig.walkableHeight = targetConfig.walkableHeight;
        currConfig.walkableRadius = targetConfig.walkableRadius;
        currConfig.walkableStep   = targetConfig.walkableStep;
        currConfig.xzCellSize     = targetConfig.xzCellSize;
        currConfig.yCellSize      = targetConfig.yCellSize;
        currConfig.borderSize     = targetConfig.borderSize;

        mBoundsMin = navmesh.GetConfig().origin;

        int maxTiles = navmesh.GetMaxTiles();

        // Make sure the maximum bounds fits the target mesh.
        // Note: Will not shrink the existing max bounds.
        for (int i = 0; i < maxTiles; i++)
        {
            NavmeshTile tile = navmesh.GetTile(i);

            if (tile == null)
            {
                continue;
            }

            NavmeshTileHeader tileHeader = tile.GetHeader();

            if (tileHeader.polyCount == 0)
            {
                continue;
            }

            mBoundsMax = Vector3.Max(mBoundsMax, tileHeader.boundsMax);
        }

        mConfig.SetConfig(currConfig);

        mIsDirty = true;
    }
Exemple #8
0
    /// <summary>
    /// Loads a navigation mesh.
    /// </summary>
    /// <param name="config">The mesh configuration.</param>
    /// <param name="tiles">The tiles to add to the mesh.</param>
    /// <param name="buildConfig">The build information. (Optional)</param>
    /// <returns>The <see cref="NavStatus"/> flags for the operation.</returns>
    public NavStatus Load(NavmeshParams config
                          , NavmeshTileData[] tiles
                          , NavmeshBuildInfo buildConfig)
    {
        if (config == null || tiles == null || tiles.Length > config.maxTiles)
        {
            return(NavStatus.Failure | NavStatus.InvalidParam);
        }

        Navmesh   navmesh;
        NavStatus status = Navmesh.Create(config, out navmesh);

        if ((status & NavStatus.Sucess) == 0)
        {
            return(status);
        }

        foreach (NavmeshTileData tile in tiles)
        {
            if (tile == null)
            {
                continue;
            }

            uint trash;
            status = navmesh.AddTile(tile, Navmesh.NullTile, out trash);

            if ((status & NavStatus.Sucess) == 0)
            {
                return(status | NavStatus.InvalidParam);
            }
        }

        mDataPack = navmesh.GetSerializedMesh();

        if (mDataPack == null)
        {
            return(NavStatus.Failure);
        }

        mBuildInfo = buildConfig;

        mVersion++;

        return(NavStatus.Sucess);
    }
        internal static NavmeshBuildInfo GetConfig(NavmeshBuild build)
        {
            if (!build)
            {
                return(null);
            }

            NMGenParams config = build.Config.GetConfig();

            NavmeshBuildInfo result = new NavmeshBuildInfo();

            result.tileSize       = config.TileSize;
            result.walkableHeight = config.WalkableHeight;
            result.walkableRadius = config.WalkableRadius;
            result.walkableStep   = config.WalkableStep;
            result.xzCellSize     = config.XZCellSize;
            result.yCellSize      = config.YCellSize;
            result.borderSize     = config.BorderSize;
            result.inputScene     = SceneManager.GetActiveScene().path;
            return(result);
        }
Exemple #10
0
        internal static NavmeshBuildInfo GetConfig(NavmeshBuild build)
        {
            if (!build)
            {
                return(null);
            }

            NMGenParams config = build.Config.GetConfig();

            NavmeshBuildInfo result = new NavmeshBuildInfo();

            result.tileSize       = config.TileSize;
            result.walkableHeight = config.WalkableHeight;
            result.walkableRadius = config.WalkableRadius;
            result.walkableStep   = config.WalkableStep;
            result.xzCellSize     = config.XZCellSize;
            result.yCellSize      = config.YCellSize;
            result.borderSize     = config.BorderSize;
            result.inputScene     = EditorApplication.currentScene;

            return(result);
        }
    private static void OnGUIState(NavmeshBuild build)
    {
        INavmeshData     btarget = build.BuildTarget;
        NavmeshBuildInfo binfo   = (btarget == null ? null : btarget.BuildInfo);

        EditorGUILayout.Separator();

        System.Text.StringBuilder sb = new System.Text.StringBuilder();

        if (build.BuildState == NavmeshBuildState.Invalid)
        {
            if (!(ScriptableObject)btarget)
            {
                sb.AppendLine("No build target.");
            }

            if (build.inputProcessors.Count == 0)
            {
                sb.AppendLine("No input processors.");
            }

            GUILayout.Label(sb.ToString().Trim()
                            , EditorUtil.ErrorStyle, GUILayout.ExpandWidth(true));

            return;
        }

        sb.AppendLine("Input Scene: " + NavEditorUtil.SceneDisplayName(binfo));

        if (build.SceneQuery == null)
        {
            sb.AppendLine("Search scope: Entire scene");
        }

        if (build.TargetHasNavmesh)
        {
            sb.AppendLine("Target has existing navmesh.");
        }
        else
        {
            sb.AppendLine("Target does not have a navmesh.");
        }

        if (build.BuildType == NavmeshBuildType.Advanced)
        {
            TileBuildData tdata = build.BuildData;
            sb.AppendLine("Build state: " + build.BuildState);
            sb.AppendLine("Active builds: "
                          + (tdata == null ? 0 : build.BuildData.GetActive()));
        }

        GUILayout.Label(sb.ToString().Trim()
                        , EditorUtil.HelpStyle
                        , GUILayout.ExpandWidth(true));


        if (NavEditorUtil.SceneMismatch(binfo))
        {
            GUILayout.Box("Current scene does not match last input scene."
                          , EditorUtil.WarningStyle
                          , GUILayout.ExpandWidth(true));
        }

        EditorGUILayout.Separator();

        GUI.enabled = (btarget != null);

        NavmeshSceneDraw.Instance.OnGUI(build.BuildTarget, "Show Mesh", true, true);

        GUI.enabled = true;

        return;
    }
Exemple #12
0
    internal bool CanLoadFromTarget(BuildContext context, bool fullCheck)
    {
        INavmeshData target = BuildTarget;

        if (target == null || !target.HasNavmesh)
        {
            if (context != null)
            {
                context.LogError("Build target does not have an existing navigation mesh.", this);
            }
            return(false);
        }

        NavmeshBuildInfo targetConfig = target.BuildInfo;

        // Note: The tile size is checked since the original builder
        // may have supported a tile size not supported by the the standard build.
        if (targetConfig == null ||
            targetConfig.tileSize >= 0 && targetConfig.tileSize < MinAllowedTileSize)
        {
            if (context != null)
            {
                context.LogError("Unavailable or unsupported build target configuration.", this);
            }
            return(false);
        }

        if (!fullCheck)
        {
            return(true);
        }

        Navmesh nm = target.GetNavmesh();

        if (nm == null)
        {
            if (context != null)
            {
                context.LogError(
                    "Build target does not have an existing navigation mesh. (It lied.)", this);
            }
            return(false);
        }

        NavmeshParams nmConfig = nm.GetConfig();

        if (nmConfig.maxTiles < 2)
        {
            if (context != null)
            {
                context.LogError("Target navigation mesh is not tiled.", this);
            }
            return(false);
        }

        int tileCount = 0;

        for (int i = 0; i < nmConfig.maxTiles; i++)
        {
            NavmeshTile tile = nm.GetTile(i);

            if (tile == null)
            {
                continue;
            }

            NavmeshTileHeader header = tile.GetHeader();

            if (header.polyCount == 0)
            {
                continue;
            }

            tileCount++;

            if (header.layer > 0)
            {
                if (context != null)
                {
                    context.LogError(
                        "Target navigation mesh contains layered tiles. (Not supported.)", this);
                }
                return(false);
            }
        }

        if (tileCount < 2)
        {
            if (context != null)
            {
                context.LogError(
                    "Target navigation mesh is either not tiled or has no tiles loaded.", this);
            }
            return(false);
        }

        return(true);
    }
 /// <summary>
 /// True if the provided information does not match the current scene or is not
 /// available.
 /// </summary>
 /// <param name="info">The build information to check. (Null is valid.)</param>
 /// <returns>True if the provided information does not match the current scene.</returns>
 public static bool SceneMismatch(NavmeshBuildInfo info)
 {
     return(!(info == null ||
              info.inputScene == SceneManager.GetActiveScene().path ||
              string.IsNullOrEmpty(info.inputScene)));
 }