bool CD3dcam::BoxInFrustum(BOUNDINGBOX *pBoundingBox) { bool intersect = false; D3DXVECTOR3 _pvtx, _nvtx; bool x, y, z; float dist; for(int i=0;i<6;++i) { if(mFrustumPlane[i].a >= 0.0f) x = true; else x = false; if(mFrustumPlane[i].b >= 0.0f) y = true; else y = false; if(mFrustumPlane[i].c >= 0.0f) z = true; else z = false; if(x && y && z) { _pvtx = pBoundingBox->max; _nvtx = pBoundingBox->min; } if(x && y && !z) { _pvtx.x = pBoundingBox->max.x; _pvtx.y = pBoundingBox->max.y; _pvtx.z = pBoundingBox->min.z; _nvtx.x = pBoundingBox->min.x; _nvtx.y = pBoundingBox->min.y; _nvtx.z = pBoundingBox->max.z; } if(x && !y && z) { _pvtx.x = pBoundingBox->max.x; _pvtx.y = pBoundingBox->min.y; _pvtx.z = pBoundingBox->max.z; _nvtx.x = pBoundingBox->min.x; _nvtx.y = pBoundingBox->max.y; _nvtx.z = pBoundingBox->min.z; } if(x && !y && !z) { _pvtx.x = pBoundingBox->max.x; _pvtx.y = pBoundingBox->min.y; _pvtx.z = pBoundingBox->min.z; _nvtx.x = pBoundingBox->min.x; _nvtx.y = pBoundingBox->max.y; _nvtx.z = pBoundingBox->max.z; } if(!x && y && z) { _pvtx.x = pBoundingBox->min.x; _pvtx.y = pBoundingBox->max.y; _pvtx.z = pBoundingBox->max.z; _nvtx.x = pBoundingBox->max.x; _nvtx.y = pBoundingBox->min.y; _nvtx.z = pBoundingBox->min.z; } if(!x && y && !z) { _pvtx.x = pBoundingBox->min.x; _pvtx.y = pBoundingBox->max.y; _pvtx.z = pBoundingBox->min.z; _nvtx.x = pBoundingBox->max.x; _nvtx.y = pBoundingBox->min.y; _nvtx.z = pBoundingBox->max.z; } if(!x && !y && z) { _pvtx.x = pBoundingBox->min.x; _pvtx.y = pBoundingBox->min.y; _pvtx.z = pBoundingBox->max.z; _nvtx.x = pBoundingBox->max.x; _nvtx.y = pBoundingBox->max.y; _nvtx.z = pBoundingBox->min.z; } if(!x && !y && z) { _pvtx = pBoundingBox->min; _nvtx = pBoundingBox->max; } dist = D3DXPlaneDotCoord(&mFrustumPlane[i], &_nvtx); if(dist > 0) return false; // completely outside dist = D3DXPlaneDotCoord(&mFrustumPlane[i], &_pvtx); if(dist > 0) intersect = true; // intersecting } if(intersect) return true; return true; }