void ISpatial_DB::q_frustum (xr_vector<ISpatial*>& R, u32 _o, u32 _mask, const CFrustum& _frustum) { cs.Enter (); q_result = &R; q_result->clear_not_free(); walker W(this,_mask,&_frustum); W.walk(m_root,m_center,m_bounds,_frustum.getMask()); cs.Leave (); }
void COLLIDER::frustum_query(const MODEL *m_def, const CFrustum& F) { m_def->syncronize (); // Get nodes const AABBNoLeafTree* T = (const AABBNoLeafTree*)m_def->tree->GetTree(); const AABBNoLeafNode* N = T->GetNodes(); const DWORD mask= F.getMask(); r_clear (); // Binary dispatcher if (frustum_mode&OPT_FULL_TEST) { if (frustum_mode&OPT_ONLYFIRST) { frustum_collider<true,true> BC; BC._init (this,m_def->verts,m_def->tris,&F); BC._stab (N,mask); } else { frustum_collider<true,false> BC; BC._init (this,m_def->verts,m_def->tris,&F); BC._stab (N,mask); } } else { if (frustum_mode&OPT_ONLYFIRST) { frustum_collider<false,true> BC; BC._init (this,m_def->verts,m_def->tris,&F); BC._stab (N,mask); } else { frustum_collider<false,false> BC; BC._init (this,m_def->verts,m_def->tris,&F); BC._stab (N,mask); } } }