Example #1
0
    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);
    }