+VG_STATIC struct
+grind_edge *player_grind_collect_edge( v3f p0, v3f p1,
+ v3f c0, v3f c1, float max_dist )
+{
+ struct player_phys *phys = &player.phys;
+
+ bh_iter it;
+ bh_iter_init( 0, &it );
+
+ boxf region;
+
+ box_init_inf( region );
+ box_addpt( region, p0 );
+ box_addpt( region, p1 );
+
+ float k_r = max_dist;
+ v3_add( (v3f){ k_r, k_r, k_r}, region[1], region[1] );
+ v3_add( (v3f){-k_r,-k_r,-k_r}, region[0], region[0] );
+
+ float closest = k_r*k_r;
+ struct grind_edge *closest_edge = NULL;
+
+ int idx;
+ while( bh_next( world.grind_bh, &it, region, &idx ) )
+ {
+ struct grind_edge *edge = &world.grind_edges[ idx ];
+
+ float s,t;
+ v3f pa, pb;
+
+ float d2 =
+ closest_segment_segment( p0, p1, edge->p0, edge->p1, &s,&t, pa, pb );
+
+ if( d2 < closest )
+ {
+ closest = d2;
+ closest_edge = edge;
+ v3_copy( pa, c0 );
+ v3_copy( pb, c1 );
+ }
+ }
+
+ return closest_edge;
+}
+