bool CFlock::RayTest( Vec3 &raySrc,Vec3 &rayTrg,SFlockHit &hit ) { // Vec3 v; Vec3 p1,p2; // Check all boids. for (unsigned int i = 0; i < m_boids.size(); i++) { CBoidObject *boid = m_boids[i]; Lineseg lseg(raySrc,rayTrg); Sphere sphere(boid->m_pos,boid->m_scale); if ( Intersect::Lineseg_Sphere( lseg,sphere, p1,p2 ) > 0) { hit.object = boid; hit.dist = (raySrc - p1).GetLength(); return true; } } return false; }
CNode * lseg_insert_back(CNode * hd, CNode * tl) _(requires hd != NULL && tl != NULL) _(requires lseg(hd, tl)) _(requires !\oset_in(tl, lseg_reach(hd, tl))) _(ensures \result != tl) _(ensures lseg(\result, tl)) _(ensures !\oset_in(tl, lseg_reach(\result, tl))) ; _(dryad) CNode * circular_list_insert_back(CNode * x) _(requires x != NULL) _(requires x->next != NULL) _(requires lseg(x->next, x)) _(requires !\oset_in(x, lseg_reach(x->next, x))) _(ensures \result != x) _(ensures \result == x->next) _(ensures lseg(\result, x)) _(ensures !\oset_in(x, lseg_reach(\result, x))) { _(assume mutable_list(x)) CNode * next = x->next; if (next == x) { CNode * tl = (CNode *) malloc(sizeof(CNode)); _(assume tl != NULL) tl->next = x;