mirror of
https://github.com/orange-cpp/omath.git
synced 2026-04-18 21:03:27 +00:00
added by distance targeting
This commit is contained in:
@@ -60,4 +60,44 @@ namespace omath::algorithm
|
||||
std::ranges::begin(range), std::ranges::end(range), camera, get_position, filter_func);
|
||||
}
|
||||
|
||||
// ── By world-space distance ───────────────────────────────────────────────
|
||||
|
||||
template<std::input_or_output_iterator IteratorType, class FilterT>
|
||||
requires std::is_invocable_r_v<bool, std::function<FilterT>, std::iter_reference_t<IteratorType>>
|
||||
[[nodiscard]]
|
||||
IteratorType get_closest_target_by_distance(const IteratorType& begin, const IteratorType& end,
|
||||
const Vector3<float>& origin, auto get_position,
|
||||
const std::optional<std::function<FilterT>>& filter_func = std::nullopt)
|
||||
{
|
||||
auto best_target = end;
|
||||
|
||||
for (auto current = begin; current != end; current = std::next(current))
|
||||
{
|
||||
if (filter_func && !filter_func.value()(*current))
|
||||
continue;
|
||||
|
||||
if (best_target == end)
|
||||
{
|
||||
best_target = current;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (origin.distance_to(get_position(*current)) < origin.distance_to(get_position(*best_target)))
|
||||
best_target = current;
|
||||
}
|
||||
return best_target;
|
||||
}
|
||||
|
||||
template<std::ranges::range RangeType, class FilterT>
|
||||
requires std::is_invocable_r_v<bool, std::function<FilterT>,
|
||||
std::ranges::range_reference_t<const RangeType>>
|
||||
[[nodiscard]]
|
||||
auto get_closest_target_by_distance(const RangeType& range, const Vector3<float>& origin,
|
||||
auto get_position,
|
||||
const std::optional<std::function<FilterT>>& filter_func = std::nullopt)
|
||||
{
|
||||
return get_closest_target_by_distance<decltype(std::ranges::begin(range)), FilterT>(
|
||||
std::ranges::begin(range), std::ranges::end(range), origin, get_position, filter_func);
|
||||
}
|
||||
|
||||
} // namespace omath::algorithm
|
||||
Reference in New Issue
Block a user