Skip to content

File SDFField.h

File List > scene > SDFField.h

Go to the documentation of this file

#pragma once

#include "ID.h"
#include "Transform.h"
#include "buffers/StorageBuffer.h"
#include "Camera.h"
#include "shaders/RenderShader.h"

class SDFField :  public ObjectID, public Transform3D
{

public:

    // width: x-axis, depth: y-axis, height: z-axis
    GLuint sdf_width = 0, sdf_depth = 0, sdf_height = 0;
    GLuint sdf_subdiv = 1;

private:

    struct SDFInfo {
        alignas(16) glm::vec3 pos;
        alignas(16) glm::vec3 scale;
        alignas(16) glm::vec3 size;
        GLuint subdiv;
    };

    static ChainedShader sdf_shader;

public:

    SDFField();
    SDFField(GLuint width, GLuint depth, GLuint height);
    ~SDFField();

private:

    StorageBuffer sdf_data;

public:

    void ResetBuffer();
    void ResetDistance();
    void Resize(GLuint width, GLuint depth, GLuint height);
    void Bind(GLuint _base = -1);
    void Unbind();

    void BindShader();
    void BindTargetTrans(const glm::mat4& _trans, bool _is_closure);
    void UnbindShader();

public:

    void Subdivide(GLuint _iter);
    std::vector<float> ReadSDF();
    float ReadSDFAt(GLuint x, GLuint y, GLuint z);
    void LoadSDF(const std::vector<float>& _data);

    GLuint GetSDFIndex(GLuint x, GLuint y, GLuint z);

public:

    void RenderSDF(const Camera* cam);

public:

    // only for debug
    void SDFLinearGrad();
    void SDFRadialGrad();
};