glprogram.h File Reference

Go to the documentation of this file. Source: include/ffw/graphics/glprogram.h

/* This file is part of FineFramework project */
#ifndef FFW_GRAPHICS_PROGRAM
#define FFW_GRAPHICS_PROGRAM

#include "glshader.h"
#include "color.h"
#include "vec2.h"
#include "vec3.h"
#include "vec4.h"
#include "mat3.h"
#include "mat4.h"
#include <iostream>

namespace ffw {
    class FFW_API GLProgram {
    public:
        GLProgram();
        GLProgram(const std::initializer_list<GLShader*>& shaders);
        GLProgram(const GLProgram& other) = delete;
        GLProgram(GLProgram&& other) NOEXCEPT;
        virtual ~GLProgram();
        GLProgram& operator = (const GLProgram& other) = delete;
        GLProgram& operator = (GLProgram&& other) NOEXCEPT;
        void swap(GLProgram& other) NOEXCEPT;

        void attachShader(const GLShader& shader);
        void linkProgram();

        void destroy();
        inline GLint getHandle() const {
            return handle;
        }
        inline bool isCreated() const {
            return loaded;
        }

        void enableVertexAttribArray(GLint location) const;
        void disableVertexAttribArray(GLint location) const;
        void setAttributePointerf(GLint location, GLint size, GLsizei stride, const GLvoid* offset) const;
        void setAttributeDivisor(GLuint index, GLuint divisor) const;
        void drawArrays(unsigned int mode, int first, int count) const;
        void drawArraysInstanced(unsigned int mode, int first, int count, int instancecount) const;
        void drawElements(unsigned int mode, int count, unsigned int type, const void* indices) const;
        void drawElementsRange(unsigned int mode, unsigned int start, unsigned int end, int count, unsigned int type, const void* indices) const;
        void drawElementsInstanced(unsigned int mode, int count, unsigned int type, const void* indices, int instancecount) const;
        void bind() const;
        void unbind() const;
        int getUniformLocation(const char* name) const;
        int getAttributeLocation(const char* name) const;
        void setUniform1f(int location, float value) const;
        void setUniform1fv(int location, const float* array, int length) const;
        void setUniform1i(int location, int value) const;
        void setUniform1iv(int location, const int* array, int length) const;
        void setUniform2f(int location, float x, float y) const;
        void setUniform2fv(int location, const float* array, int length) const;
        void setUniform2i(int location, int x, int y) const;
        void setUniform2iv(int location, const int* array, int length) const;
        void setUniform3f(int location, float x, float y, float z) const;
        void setUniform3fv(int location, const float* array, int length) const;
        void setUniform3i(int location, int x, int y, int z) const;
        void setUniform3iv(int location, const int* array, int length) const;
        void setUniform4f(int location, float x, float y, float z, float w) const;
        void setUniform4fv(int location, const float* array, int length) const;
        void setUniform4i(int location, int x, int y, int z, int w) const;
        void setUniform4iv(int location, const int* array, int length) const;
        void setUniformMatrix2fv(int location, const float* mat, int length) const;
        void setUniformMatrix3fv(int location, const float* mat, int length) const;
        void setUniformMatrix4fv(int location, const float* mat, int length) const;
        void setUniform2f(int location, const ffw::Vec2f& vec) const;
        void setUniform2fv(int location, const ffw::Vec2f* array, int length) const;
        void setUniform2i(int location, const ffw::Vec2i& vec) const;
        void setUniform2iv(int location, const ffw::Vec2i* array, int length) const;
        void setUniform3f(int location, const ffw::Vec3f& vec) const;
        void setUniform3fv(int location, const ffw::Vec3f* array, int length) const;
        void setUniform3i(int location, const ffw::Vec3i& vec) const;
        void setUniform3iv(int location, const  ffw::Vec3i* array, int length) const;
        void setUniform4f(int location, const  ffw::Vec4f& vec) const;
        void setUniform4fv(int location, const ffw::Vec4f* array, int length) const;
        void setUniform4i(int location, const  ffw::Vec4i& vec) const;
        void setUniform4iv(int location, const ffw::Vec4i*  array, int length) const;
        void setUniform4f(int location, const  Color& color) const;
        void setUniform4fv(int location, const Color* colors, int length) const;
        void setUniformMatrix3fv(int location, const Mat3x3f* mat, int length) const;
        void setUniformMatrix4fv(int location, const Mat4x4f* mat, int length) const;
    private:
        bool checkForProgramErrors(std::string& errorstr) const;

        bool loaded;
        GLuint handle;
    };
};

inline void swap(ffw::GLProgram& first, ffw::GLProgram& second) NOEXCEPT {
    first.swap(second);
}
#endif