bool isCenterInViewport(const Frustum& frustum, const Boxf& worldBox, const Viewport& viewport) const { Vector4f center = worldBox.getCenter(); center[3] = 1.0; Vector4f mvpCenter = frustum.getMVPMatrix() * center; Vector3f mvpCenterHom = mvpCenter / mvpCenter[3]; const bool isNegXBorder = viewport[0] == 0.0f; // left const bool isPosXBorder = viewport[0] + viewport[2] == 1.0f; // left + width const bool isNegYBorder = viewport[1] == 0.0f; // top const bool isPosYBorder = viewport[1] + viewport[3] == 1.0f; // top + height Vector3f minBox(-1.0f); Vector3f maxBox(1.0f); if (isNegXBorder) minBox[0] = -infinite; if (isPosXBorder) maxBox[0] = infinite; if (isNegYBorder) minBox[1] = -infinite; if (isPosYBorder) maxBox[1] = infinite; minBox[2] = -infinite; maxBox[2] = infinite; const Boxf ndcCube(minBox, maxBox); return ndcCube.isIn(mvpCenterHom); }