#pragma once #include #include #include static glm::vec4 extract_plane(const glm::mat4& mat, int col) { float sign; if (col < 0) { sign = -1.0; col = -col - 1; } else { sign = 1.0; col -= 1; } return glm::column(mat, 3) + sign * glm::column(mat, col); } /* extracts frustum from projection matrix */ static std::array frustum(const glm::mat4& mat) { /* Left, Right, Top, Bottom, Back, Front */ std::array ret; /* { extract_plane(mat, 1), extract_plane(mat, -1), extract_plane(mat, 2), extract_plane(mat, -2), extract_plane(mat, 3), extract_plane(mat, -3), };*/ for (size_t i = 0; i < 3; i++) for (size_t j = 0; j < 4; j++) ret[i * 2][j] = mat[j].w + mat[j][i], ret[i * 2 + 1][j] = mat[j].w - mat[j][i]; return ret; } static bool box_in_frustum(const std::array& frustum, const glm::vec3 box_verts[8]) { for (const auto& plane : frustum) { for (size_t i = 0; i < 8; i++) { const auto& vert = box_verts[i]; if (glm::dot(glm::vec4(vert, 1.0), plane) > 0) goto double_continue; } return false; double_continue:; } return true; }