96 lines
2.6 KiB
C++

#pragma once
#ifndef _NB_SHADER
#define _NB_SHADER
#include <GLLoad.h>
#include <cctype>
#include <exception>
#include <fstream>
#include <iostream>
#include <map>
#include <sstream>
#include <string>
#include <utility>
#include <vector>
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtc/type_ptr.hpp>
namespace NB {
class ShaderPreprocessorError : public std::runtime_error {
public:
enum Codes : unsigned char {
NONE,
FILE_NOT_FOUND,
BUILTIN_NOT_FOUND,
CUSTOM,
UNDEFINED
};
const Codes code;
ShaderPreprocessorError(const std::string&, const std::string& file="", int line=-1);
ShaderPreprocessorError(Codes, const std::string& arg="", const std::string& file="", int line=-1);
protected:
static std::string errorCodeParser(Codes, const std::string& arg="");
};
class ShaderError : public std::runtime_error {
public:
ShaderError(const std::string&, const char* shad=nullptr, const std::string& file="", int line=-1);
protected:
std::string formatString(const std::string&, const char* shad=nullptr, const std::string& file="", int line=-1);
};
class ShaderUnit {
std::string rawSource;
std::string preprocSource;
std::map<std::string, std::string> defines;
std::map<uint8_t, ShaderUnit*> includes;
uint8_t vMajor=0, vMinor=0;
};
class ShaderPreprocessor {
public:
typedef ShaderPreprocessorError::Codes Codes;
std::vector<std::string> AcceptedExtensions = {"frag", "vert", "tess", "geom", "comp", "shad", "glsl"};
std::vector<std::string> Directories;
std::map<std::string, std::string> BuiltIns;
ShaderPreprocessor();
std::stringstream load(const std::string&) const;
std::stringstream include(const std::string&, const std::string& base="", bool relativeFirst=false) const;
std::stringstream loadFromRelative(const std::string&, const std::string& base="") const;
std::stringstream loadFromDirectory(const std::string&) const;
std::stringstream loadFromBuiltIn(const std::string&) const;
virtual std::stringstream process(std::stringstream&) const;
virtual std::stringstream process(std::string) const;
};
class Shader {
public:
Shader(const std::stringstream&, const std::stringstream&);
Shader();
Shader(const Shader&);
Shader& operator=(const Shader&);
void use() const;
void setBool(const std::string& name, bool value) const;
void setInt(const std::string& name, int value) const;
void setFloat(const std::string& name, float value) const;
void setMat4(const std::string& name, glm::mat4& value) const;
unsigned int id;
private:
};
}
#endif