7#include <glm/gtc/type_ptr.hpp>
11#include <unordered_map>
29 const std::regex UNIFORM_DATA_REGEX<glm::vec2> = std::regex(
"uniform vec2 (\\S+);");
31 const std::regex UNIFORM_DATA_REGEX<glm::vec4> = std::regex(
"uniform vec4 (\\S+);");
33 const std::regex UNIFORM_DATA_REGEX<glm::mat4> = std::regex(
"uniform mat4 (\\S+);");
51 Shader(
const char * v,
const char * f)
70 Shader(std::string path, std::string name);
99 throw std::runtime_error(
"could not find uniform: " + name);
110 if (u !=
nullptr){
setValue(u, value);
return; }
130 return NULL_UNIFORM<T>;
137 return NULL_UNIFORM<T>;
141 if (u !=
nullptr){
return *u; }
143 return NULL_UNIFORM<T>;
153 std::vector<std::string> v;
156 v.push_back(it->first);
186 std::unordered_map<std::string, std::shared_ptr<AbstractjGLUniform>>
uniforms;
196 if (shader.length() == 0) {
return shader; }
197 std::string source =
"1: ";
199 auto iter = shader.begin();
200 while (iter != shader.end())
202 if (*iter ==
'\n' && iter+1 != shader.end())
205 source +=
"\n" + std::to_string(line)+
": ";
219 const std::regex r = UNIFORM_DATA_REGEX<T>;
221 auto start = std::sregex_iterator(code.begin(), code.end(), r);
222 auto end = std::sregex_iterator();
223 for (std::sregex_iterator it = start; it != end; it++)
225 std::string match = (*it).str();
226 if (match.find(
"lowp") != std::string::npos)
229 match.erase(0, match.find(
"lowp")+4);
232 if (match.find(
"highp") != std::string::npos)
235 match.erase(0, match.find(
"highp")+5);
239 match.erase(0, match.find(
" ")+1);
240 match.erase(0, match.find(
" ")+1);
241 std::string name = match.substr(0, match.find(
";"));
242 std::shared_ptr<jGLUniform<T>> u = std::make_shared<jGLUniform<T>>(
jGLUniform<T>(name,T(0)));
A drawable graphic.
Definition id.h:10
const std::regex UNIFORM_DATA_REGEX< int >
Definition shader.h:25
const std::regex UNIFORM_DATA_REGEX
Definition shader.h:22
const std::regex UNIFORM_DATA_REGEX< float >
Definition shader.h:27
const std::regex UNIFORM_DATA_REGEX< Sampler2D >
Definition shader.h:35
Generic shader program with vertex and fragment shader.
Definition shader.h:44
virtual ~Shader()=default
std::vector< std::string > getUniformNames()
Get all the parsed uniforms in the Shader.
Definition shader.h:151
std::string displayFragmentSource() const
Display the fragment shader with line numbers.
Definition shader.h:179
Shader()
Construct an empty Shader.
Definition shader.h:60
virtual void setValue(jGLUniform< glm::mat4 > *u, glm::mat4 value)
Definition shader.h:280
std::unordered_map< std::string, std::shared_ptr< AbstractjGLUniform > > uniforms
Definition shader.h:186
std::string displayVertexSource() const
Display the vertex shader with line numbers.
Definition shader.h:172
virtual void setValue(jGLUniform< int > *u, int value)
Definition shader.h:254
std::string parseShaderSource(std::ifstream &file)
Definition shader.cpp:22
const std::string & getFragment() const
Definition shader.h:116
virtual void setValue(jGLUniform< float > *u, float value)
Definition shader.h:265
virtual void use()=0
Use the shader.
std::string fragment
Definition shader.h:184
bool lint()
Check for common shader errors.
Definition shader.cpp:77
virtual void setValue(jGLUniform< glm::vec4 > *u, glm::vec4 value)
Definition shader.h:275
void setUniform(std::string name, T value)
Set a Uniform to a value.
Definition shader.h:95
void detectUniformsAndCreate(std::string code)
Definition shader.h:217
std::string vertex
Definition shader.h:183
bool operator==(const Shader &s)
Definition shader.h:74
virtual void setValue(jGLUniform< Sampler2D > *u, Sampler2D value)
Definition shader.h:260
Shader(const char *v, const char *f)
Construct a Shader from a vertex and fragment source.
Definition shader.h:51
const std::string & getVertex() const
Definition shader.h:115
std::string formatWithLineNumbers(std::string shader) const
Definition shader.h:194
jGLUniform< T > getUniform(std::string name)
Get a Uniform by name.
Definition shader.h:126
virtual void setValue(jGLUniform< glm::vec2 > *u, glm::vec2 value)
Definition shader.h:270
bool parseUniforms()
Definition shader.cpp:33