#ifndef SHADERBASE_H
#define SHADERBASE_H

#include "GL/gl.h"
#include <QList>
#include <QOpenGLTexture>
#include <QOpenGLShader>

class QString;
class QImage;



class ShaderBase
{

public:
    ShaderBase();
    virtual ~ShaderBase();

    /* 初始化形状 */
    virtual GLuint initShape() = 0;
    /* 初始化纹理对象 */
    virtual bool initTextures() = 0;
    /* 绘制图形 */
    virtual void drawShape() = 0;

    /* 初始化Shader，第一个是定点着色器，第二个是片段着色器 */
    virtual bool loadShaderCode(const QString &vertexShaderFile, const QString &fragmentShaderFile);
    /* 编译着色器程序 */
    virtual bool compileShader();
    /* 创建纹理，可以显式的指定纹理单元编号，返回纹理单元编号，创建失败则返回的是-1 */
    virtual int createTexture(const QString uniformName, int textureUnit = -1);
    /* 清空纹理 */
    virtual void clearTexture();

    /* 使用着色器 */
    virtual void useShader();
    

protected:
    /* 打印OpenGL错误 */
    void printGLerror(const std::string functionName);

protected:
    QByteArray m_vertexShaderCode;                          /* 顶点着色器文件 */
    QByteArray m_fragmentShaderCode;                        /* 片段着色器文件 */
    QOpenGLShaderProgram* m_shaderProgramObj = nullptr;     /* 着色器程序对象 */
    
    // QList<QPair<QString, QOpenGLTexture*>> m_listTexture;   /* uniform和纹理的映射 */
    QMap<int, QPair<QString, QOpenGLTexture*>> m_mapTexture; /* uniform和纹理的映射，int是第几个，与 GL_TEXTURE0 相对应 */
};


#endif // SHADERBASE_H
