Program Listing for File ViewFrustumCulling.hpp

Return to documentation for file (Src/GraphicsEngineOpenGL/scene/ViewFrustumCulling.hpp)

#pragma once

#include <glad/glad.h>

#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtc/type_ptr.hpp>
#include <memory>
#include <vector>

#include "camera/Camera.hpp"
#include "hostDevice/GlobalValues.hpp"
#include "scene/AABB.hpp"
#include "scene/texture/Texture.hpp"

class ViewFrustumCulling
{
  public:
    ViewFrustumCulling();

    bool is_inside(GLfloat ratio,
      std::shared_ptr<Camera> main_camera,
      std::shared_ptr<AABB> bounding_box,
      glm::mat4 model);

    void render_view_frustum();

    ~ViewFrustumCulling();

  private:
    // render view frustum
    unsigned int VBO, VAO, EBO;

    unsigned int m_drawCount;

    // we get that as input
    GLfloat near_plane, far_plane, fov, ratio;

    // calculate as soon as we become params
    GLfloat tan, near_height, near_width, far_height, far_width;

    std::shared_ptr<Camera> main_camera;

    glm::vec3 dir, near_center, far_center;

    // all corners of the frustum
    // near plane
    glm::vec3 near_top_left, near_top_right, near_bottom_left, near_bottom_right;
    // far plane
    glm::vec3 far_top_left, far_top_right, far_bottom_left, far_bottom_right;

    // planes in Hesse normal form
    // layout: [0]: near plane, [1] far plane, [2] front, [3] bottom, [4]: left,
    // [5]: right
    struct frustum_plane
    {
        glm::vec3 normal;
        glm::vec3 position;
    };

    frustum_plane frustum_planes[NUM_FRUSTUM_PLANES];

    void init(std::vector<glm::vec3> frustum_corner);

    bool corners_outside_plane(std::vector<glm::vec3> aabb_corners, frustum_plane plane, GLuint outcode_pattern);

    GLfloat plane_point_distance(frustum_plane plane, glm::vec3 corner);

    void update_frustum_param(GLfloat near_plane,
      GLfloat far_plane,
      GLfloat fov,
      GLfloat ratio,
      std::shared_ptr<Camera> main_camera);
};