194 if (!_node->left_child_)
200 for (HandleIter it=_node->begin(); it!=_node->end(); ++it)
202 this->traits_.points(*it, v0, v1, v2);
205 _data.hit_handles.push_back(std::pair<Handle,Scalar>(*it,dist));
215 _raycollision_non_directional(_node->left_child_, _data);
218 _raycollision_non_directional(_node->right_child_, _data);
226template <
class BSPCore>
232 if (!_node->left_child_)
238 for (HandleIter it=_node->begin(); it!=_node->end(); ++it)
240 this->traits_.points(*it, v0, v1, v2);
243 _data.hit_handles.push_back(std::pair<Handle,Scalar>(*it,dist));
254 _raycollision_directional(_node->left_child_, _data);
257 _raycollision_directional(_node->right_child_, _data);
265template <
class BSPCore>
271 if (!_node->left_child_)
277 for (HandleIter it=_node->begin(); it!=_node->end(); ++it)
279 this->traits_.points(*it, v0, v1, v2);
282 _data.hit_handles.push_back(std::pair<Handle,Scalar>(*it, dist));
287 if(!_data.hit_handles.empty()) {
288 std::partial_sort(_data.hit_handles.begin(), _data.hit_handles.begin() + 1, _data.hit_handles.end(), less_pair_second<Handle, Scalar>());
289 _data.hit_handles.resize(1);
297 Node* first_node = _node->left_child_, *second_node = _node->right_child_;
298 if (!_node->plane_(_data.ref)) {
299 std::swap(first_node, second_node);
304 _raycollision_nearest_directional(first_node, _data);
308 if(!_data.hit_handles.empty()) {
309 dist = _data.hit_handles.front().second;
312 _raycollision_nearest_directional(second_node, _data);
316template<
class BSPCore>
317template<
class Callback>
322 Callback _callback)
const
325 if (!_node.left_child_)
327 const double r_sqr = _r * _r;
328 for (
const auto &fh: _node) {
329 const double dist = this->traits_.sqrdist(fh, _c);
337 const Scalar dist = _node.plane_.distance(_c);
338 const Node &left = *_node.left_child_;
339 const Node &right = *_node.right_child_;
342 _intersect_ball(left, _c, _r, _callback);
345 _intersect_ball(right, _c, _r, _callback);