66 lines
1.4 KiB
C++

#pragma once
#include <string>
#include <vector>
#include <memory>
#include <GL/glew.h>
#include <functional>
#include "glm/gtc/type_ptr.hpp"
#include "Material.h"
#include "Light.h"
#include "SceneContext.h"
#include "Loader.h"
enum ShaderFlags
{
NO_UNIFORM = 0,
KD_FLAG = 1,
KA_FLAG = 2,
KS_FLAG = 4,
SHINE_FLAG = 8,
MVP_FLAG = 16,
NORMAL_MAT_FLAG = 32,
MODELVIEW_FLAG = 64,
LIGHTS_FLAG = 128,
};
class Shader
{
public:
Shader() {};
Shader(const std::string vtx_name, const std::string frag_name);
~Shader();
int uniformFlags = KD_FLAG | KA_FLAG | KS_FLAG | SHINE_FLAG | MVP_FLAG | NORMAL_MAT_FLAG | MODELVIEW_FLAG | LIGHTS_FLAG;
Material mat;
Light::LightType light_type = Light::LightType::BASE;
void enable();
void disable();
public:
void setUniforms(SceneContext ctx);
void addUniform(const std::string name, glm::vec3 data)
{
_program.use(); glUniform3fv(_program.addUniform(name), 1, glm::value_ptr(data)); ; _program.disable();
}
void addUniform(const std::string name, int data)
{
_program.use(); glUniform1i(_program.addUniform(name), data); _program.disable();
}
void addUniform(const std::string name, float data)
{
_program.use(); glUniform1fv(_program.addUniform(name), 1, &data); _program.disable();
}
private:
void setMaterial(SceneContext ctx);
void setCamera(SceneContext ctx);
void setLights(SceneContext ctx);
private:
ShaderProgram _program;
};