private bool DoFindPath(TileGrid.FindPathArgs args, DiscreteSpeedMoveable discreteMoveable, out MoveablePath pathForSpeed) { List <DubinCSC> path = null; pathForSpeed = null; bool pathfound = false; if (TileGrid.Instance().FindPath(args, out path)) { pathfound = true; pathForSpeed = new MoveablePath() { path = path, turnRadius = discreteMoveable.CurrentTurnRadius, isReverse = discreteMoveable.currentSpeed == Speed.Reverse, isDirectional = args.IsDirectionalPath, moveRateCost = 1.0f, speed = discreteMoveable.currentSpeed }; } ; return(pathfound); }
//bool FindPath(Vector3 dest, Vector3 destDir, out MoveablePath bestMoveablePath) //{ //} //bool FindPath(Vector3 dest, out MoveablePath bestMoveablePath) //{ //} // TODO: These functions are a bit out of place, steps all over other territory. // I should probably move'em to a discrete moveable bool DoFindBestPath(DiscreteSpeedMoveable discreteMoveable, TileGrid.FindPathArgs args, out MoveablePath bestMoveablePath, bool flipBackAfterReverse) { bool pathFound = false; List <DubinCSC> path; int bestIndex = 0; float bestDistance = float.MaxValue; List <DubinCSC> bestPath; // reverse // neutral // combat speed // full // check reverse manually, since it has slightly different Args pathFound |= TileGrid.Instance().FindPath(args, out bestPath); if (pathFound) { bestDistance = TotalDistance(bestPath) * discreteMoveable.SpeedCostArray[0]; } // flip the fwd/right args for all forward movement if (flipBackAfterReverse) { args.Fwd = -args.Fwd; args.Right = -args.Right; } for (int i = 1; i < discreteMoveable.SpeedCostArray.Length; ++i) { // check next args.TurnRadius = discreteMoveable.TurnRadiusArray[i]; if (TileGrid.Instance().FindPath(args, out path)) { float nextDistance = TotalDistance(path) * discreteMoveable.SpeedCostArray[i]; if (nextDistance < bestDistance) { bestDistance = nextDistance; bestIndex = i; bestPath = path; } pathFound = true; } } bestMoveablePath = new MoveablePath() { path = bestPath, turnRadius = discreteMoveable.TurnRadiusArray[bestIndex], isReverse = bestIndex == 0, isDirectional = args.IsDirectionalPath, moveRateCost = discreteMoveable.SpeedCostArray[bestIndex], speed = (Speed)bestIndex }; return(pathFound); }
bool FindBestPath(Vector3 dest, out MoveablePath bestMoveablePath) { DiscreteSpeedMoveable discreteMoveable = tileMoveable.GetComponent <DiscreteSpeedMoveable>(); // Note: We start out testing reverse first, hence the negatives var args = new TileGrid.FindPathArgs() { Fwd = -tileMoveable.transform.forward, Right = -tileMoveable.transform.right, TurnRadius = discreteMoveable.TurnRadiusArray[0], Pos = tileMoveable.transform.position, Dest = dest, BoxCollider = tileMoveable.boxCollider }; return(DoFindBestPath(discreteMoveable, args, out bestMoveablePath, true)); }
bool FindPathAtCurrentSpeed(Vector3 dest, out MoveablePath pathForSpeed) { DiscreteSpeedMoveable discreteMoveable = tileMoveable.GetComponent <DiscreteSpeedMoveable>(); float dir = discreteMoveable.currentSpeed == Speed.Reverse ? -1.0f : 1.0f; var args = new TileGrid.FindPathArgs() { Fwd = dir * tileMoveable.transform.forward, Right = dir * tileMoveable.transform.right, TurnRadius = discreteMoveable.CurrentTurnRadius, Pos = tileMoveable.transform.position, Dest = dest, BoxCollider = tileMoveable.boxCollider, }; return(DoFindPath(args, discreteMoveable, out pathForSpeed)); }
bool FindBestPath(Vector3 dest, Vector3 destDir, out MoveablePath bestMoveablePath) { DiscreteSpeedMoveable discreteMoveable = tileMoveable.GetComponent <DiscreteSpeedMoveable>(); // Note: For directional paths, we do NOT flip for reverse movement. var args = new TileGrid.FindPathArgs() { Fwd = -tileMoveable.transform.forward, Right = -tileMoveable.transform.right, TurnRadius = discreteMoveable.TurnRadiusArray[0], Pos = tileMoveable.transform.position, Dest = dest, DestDir = destDir, BoxCollider = tileMoveable.boxCollider, IsDirectionalPath = true }; return(DoFindBestPath(discreteMoveable, args, out bestMoveablePath, true)); }
bool FindPathAtCurrentSpeed(Vector3 dest, Vector3 destDir, out MoveablePath pathForSpeed) { DiscreteSpeedMoveable discreteMoveable = tileMoveable.GetComponent <DiscreteSpeedMoveable>(); float dir = discreteMoveable.currentSpeed == Speed.Reverse ? -1.0f : 1.0f; // Note: We start out testing reverse first, hence the negatives var args = new TileGrid.FindPathArgs() { Fwd = dir * tileMoveable.transform.forward, Right = dir * tileMoveable.transform.right, TurnRadius = discreteMoveable.CurrentTurnRadius, Pos = tileMoveable.transform.position, Dest = dest, DestDir = destDir, BoxCollider = tileMoveable.boxCollider, IsDirectionalPath = true }; return(DoFindPath(args, discreteMoveable, out pathForSpeed)); }