static bool CreateAppShortcut(bool allUsers) { ScopedMem<WCHAR> shortcutPath(GetShortcutPath(allUsers)); if (!shortcutPath.Get()) return false; ScopedMem<WCHAR> installedExePath(GetInstalledExePath()); return CreateShortcut(shortcutPath, installedExePath); }
void ompl::geometric::PathSimplifier::simplify(PathGeometric &path, const base::PlannerTerminationCondition &ptc) { if (path.getStateCount() < 3) return; // try a randomized step of connecting vertices bool tryMore = false; if (ptc == false) tryMore = reduceVertices(path); // try to collapse close-by vertices if (ptc == false) collapseCloseVertices(path); // try to reduce verices some more, if there is any point in doing so int times = 0; while (tryMore && ptc == false && ++times <= 5) tryMore = reduceVertices(path); // if the space is metric, we can do some additional smoothing if(si_->getStateSpace()->isMetricSpace()) { bool tryMore = true; unsigned int times = 0; do { bool shortcut = shortcutPath(path); // split path segments, not just vertices bool better_goal = gsr_ ? findBetterGoal(path, ptc) : false; // Try to connect the path to a closer goal tryMore = shortcut || better_goal; } while(ptc == false && tryMore && ++times <= 5); // smooth the path with BSpline interpolation if(ptc == false) smoothBSpline(path, 3, path.length()/100.0); // we always run this if the metric-space algorithms were run. In non-metric spaces this does not work. const std::pair<bool, bool> &p = path.checkAndRepair(magic::MAX_VALID_SAMPLE_ATTEMPTS); if (!p.second) OMPL_WARN("Solution path may slightly touch on an invalid region of the state space"); else if (!p.first) OMPL_DEBUG("The solution path was slightly touching on an invalid region of the state space, but it was successfully fixed."); } }
bool MWMechanics::AiPackage::pathTo(const MWWorld::Ptr& actor, const ESM::Pathgrid::Point& dest, float duration, float destTolerance) { mTimer += duration; //Update timer ESM::Position pos = actor.getRefData().getPosition(); //position of the actor /// Stops the actor when it gets too close to a unloaded cell //... At current time, this test is unnecessary. AI shuts down when actor is more than 7168 //... units from player, and exterior cells are 8192 units long and wide. //... But AI processing distance may increase in the future. if (isNearInactiveCell(pos)) { actor.getClass().getMovementSettings(actor).mPosition[1] = 0; return false; } // handle path building and shortcutting ESM::Pathgrid::Point start = pos.pos; float distToTarget = distance(start, dest); bool isDestReached = (distToTarget <= destTolerance); if (!isDestReached && mTimer > AI_REACTION_TIME) { bool wasShortcutting = mIsShortcutting; bool destInLOS = false; if (getTypeId() != TypeIdWander) // prohibit shortcuts for AiWander mIsShortcutting = shortcutPath(start, dest, actor, &destInLOS); // try to shortcut first if (!mIsShortcutting) { if (wasShortcutting || doesPathNeedRecalc(dest, actor.getCell())) // if need to rebuild path { mPathFinder.buildSyncedPath(start, dest, actor.getCell()); mRotateOnTheRunChecks = 3; // give priority to go directly on target if there is minimal opportunity if (destInLOS && mPathFinder.getPath().size() > 1) { // get point just before dest std::list<ESM::Pathgrid::Point>::const_iterator pPointBeforeDest = mPathFinder.getPath().end(); --pPointBeforeDest; --pPointBeforeDest; // if start point is closer to the target then last point of path (excluding target itself) then go straight on the target if (distance(start, dest) <= distance(dest, *pPointBeforeDest)) { mPathFinder.clearPath(); mPathFinder.addPointToPath(dest); } } } if (!mPathFinder.getPath().empty()) //Path has points in it { ESM::Pathgrid::Point lastPos = mPathFinder.getPath().back(); //Get the end of the proposed path if(distance(dest, lastPos) > 100) //End of the path is far from the destination mPathFinder.addPointToPath(dest); //Adds the final destination to the path, to try to get to where you want to go } } mTimer = 0; } if (isDestReached || mPathFinder.checkPathCompleted(pos.pos[0], pos.pos[1])) // if path is finished { // turn to destination point zTurn(actor, getZAngleToPoint(start, dest)); smoothTurn(actor, getXAngleToPoint(start, dest), 0); return true; } else { if (mRotateOnTheRunChecks == 0 || isReachableRotatingOnTheRun(actor, *mPathFinder.getPath().begin())) // to prevent circling around a path point { actor.getClass().getMovementSettings(actor).mPosition[1] = 1; // move to the target if (mRotateOnTheRunChecks > 0) mRotateOnTheRunChecks--; } // handle obstacles on the way evadeObstacles(actor, duration, pos); } // turn to next path point by X,Z axes zTurn(actor, mPathFinder.getZAngleToNext(pos.pos[0], pos.pos[1])); smoothTurn(actor, mPathFinder.getXAngleToNext(pos.pos[0], pos.pos[1], pos.pos[2]), 0); return false; }