void walk (ISpatial_NODE* N, Fvector& n_C, float n_R, u32 fmask) { // box float n_vR = 2*n_R; Fbox BB; BB.set (n_C.x-n_vR, n_C.y-n_vR, n_C.z-n_vR, n_C.x+n_vR, n_C.y+n_vR, n_C.z+n_vR); if (fcvNone==F->testAABB(BB.data(),fmask)) return; // test items xr_vector<ISpatial*>::iterator _it = N->items.begin (); xr_vector<ISpatial*>::iterator _end = N->items.end (); for (; _it!=_end; _it++) { ISpatial* S = *_it; if (0==(S->spatial.type&mask)) continue; Fvector& sC = S->spatial.sphere.P; float sR = S->spatial.sphere.R; u32 tmask = fmask; if (fcvNone==F->testSphere(sC,sR,tmask)) continue; space->q_result->push_back (S); } // recurse float c_R = n_R/2; for (u32 octant=0; octant<8; octant++) { if (0==N->children[octant]) continue; Fvector c_C; c_C.mad (n_C,c_spatial_offset[octant],c_R); walk (N->children[octant],c_C,c_R,fmask); } }
bool CGroupObject::FrustumPick(const CFrustum& frustum) { if (m_Objects.empty()){ Fbox bb; GetBox (bb); u32 mask = u32(-1); return (frustum.testAABB(bb.data(),mask)); }else{ for (ObjectIt it=m_Objects.begin(); it!=m_Objects.end(); it++) if ((*it)->FrustumPick(frustum)) return true; } return false; }
bool CEditShape::FrustumPick(const CFrustum& frustum) { const Fmatrix& M = _Transform(); for (ShapeIt it=shapes.begin(); it!=shapes.end(); it++){ switch (it->type){ case cfSphere:{ Fvector C; Fsphere& T = it->data.sphere; M.transform_tiny(C,T.P); if (frustum.testSphere_dirty(C,T.R*FScale.x)) return true; }break; case cfBox:{ Fbox box; box.identity (); Fmatrix B = it->data.box; B.mulA_43 (_Transform()); box.xform (B); u32 mask = 0xff; if (frustum.testAABB(box.data(),mask)) return true; }break; } } return false; }