/// <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); }
/// <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; }
/// <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); }
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; }
/// <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); }
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; }
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))); }