Program Listing for File Noise.ixx

Program Listing for File Noise.ixx#

Return to documentation for file (Src/GraphicsEngineOpenGL/scene/atmospheric_effects/clouds/Noise.ixx)

module;

#include <glad/glad.h>
#include <glm/glm.hpp>
#include "host_device/bindings.hpp"

#include <array>
#include <memory>
#include <random>
#include <vector>

export module kataglyphis.opengl.noise;

import kataglyphis.opengl.compute_shader_program;

export class Noise
{
  public:
    Noise();

    Noise(const Noise &) = delete;
    Noise &operator=(const Noise &) = delete;
    Noise(Noise &&) = delete;
    Noise &operator=(Noise &&) = delete;

    void create_res128_noise();
    void create_res32_noise();

    void read_res128_noise() const;
    void read_res32_noise() const;

    void update();

    void set_num_cells(GLuint cells_per_axis, GLuint index);

    ~Noise();

  private:
    void create_shader_programs();
    void generate_cells(GLuint cells_per_axis, GLuint cell_index);

    void generate_textures();
    void generate_num_cells_textures();
    void generate_res128_noise_texture();
    void generate_res32_noise_texture();

    void delete_textures();

    static void print_comp_shader_capabilities();

    // first texture dim = 128^3
    GLuint texture_1_id{};
    GLuint texture_dim_1;
    std::unique_ptr<ComputeShaderProgram> texture_1_shader_program;

    // 2nd texture dim = 32^3
    GLuint texture_2_id{};
    GLuint texture_dim_2;
    std::unique_ptr<ComputeShaderProgram> texture_2_shader_program;

    GLuint cell_ids[NUM_CELL_POSITIONS]{};
    GLuint num_cells_per_axis[NUM_CELL_POSITIONS]{};
    std::array<std::vector<GLfloat>, NUM_CELL_POSITIONS> cell_data;
};