Physics Simulation & Visualization Tool 0.1
A C++ physics simulation engine with real-time 3D visualization
Loading...
Searching...
No Matches
Shader.cpp
Go to the documentation of this file.
1#include "Shader.h"
2#include <fstream>
3#include <iostream>
4#include <sstream>
5#include <glm/gtc/type_ptr.hpp>
6
7Shader::Shader(const std::string &vertexPath, const std::string &fragmentPath, QOpenGLFunctions_4_5_Core* glFuncs) : funcs(glFuncs) {
8 std::string vertexCode = loadFile(vertexPath);
9 std::string fragmentCode = loadFile(fragmentPath);
10
11 unsigned int vertex = compileShader(GL_VERTEX_SHADER, vertexCode);
12 unsigned int fragment = compileShader(GL_FRAGMENT_SHADER, fragmentCode);
13
14 ID = funcs->glCreateProgram();
15 funcs->glAttachShader(ID, vertex);
16 funcs->glAttachShader(ID, fragment);
17 funcs->glLinkProgram(ID);
18
19 funcs->glDeleteShader(vertex);
20 funcs->glDeleteShader(fragment);
21}
22
24 funcs->glDeleteProgram(ID);
25}
26
27
28std::string Shader::loadFile(const std::string &path) const {
29 std::ifstream file(path);
30 if (!file) {
31 std::cerr << "Error: Could not open file " << path << std::endl;
32 return "";
33 }
34 std::stringstream buffer;
35 buffer << file.rdbuf();
36 return buffer.str();
37}
38
39unsigned int Shader::compileShader(GLenum type, const std::string &source) const {
40 unsigned int shader = funcs->glCreateShader(type);
41 const char* src = source.c_str();
42 funcs->glShaderSource(shader, 1, &src, nullptr);
43 funcs->glCompileShader(shader);
44
45 int success;
46 funcs->glGetShaderiv(shader, GL_COMPILE_STATUS, &success);
47 if(!success) {
48 char infoLog[1024];
49 funcs->glGetShaderInfoLog(shader, 1024, nullptr, infoLog);
50 std::cerr << "ERROR::SHADER_COMPILATION_ERROR of type: " << type << "\n" << infoLog << std::endl;
51 }
52 return shader;
53}
54
55void Shader::use() const {
56 funcs->glUseProgram(ID);
57}
58
59void Shader::setBool(const std::string &name, bool value) const {
60 funcs->glUniform1i(funcs->glGetUniformLocation(ID, name.c_str()), (int)value);
61}
62void Shader::setInt(const std::string &name, int value) const {
63 funcs->glUniform1i(funcs->glGetUniformLocation(ID, name.c_str()), value);
64}
65void Shader::setFloat(const std::string &name, float value) const {
66 funcs->glUniform1f(funcs->glGetUniformLocation(ID, name.c_str()), value);
67}
68void Shader::setMat4(const std::string &name, const glm::mat4 &mat) const {
69 funcs->glUniformMatrix4fv(funcs->glGetUniformLocation(ID, name.c_str()), 1, GL_FALSE, glm::value_ptr(mat));
70}
71void Shader::setVec3(const std::string &name, const glm::vec3 &vec) const {
72 funcs->glUniform3fv(funcs->glGetUniformLocation(ID, name.c_str()), 1, glm::value_ptr(vec));
73}
void setVec3(const std::string &name, const glm::vec3 &vec) const
Definition Shader.cpp:71
void use() const
Definition Shader.cpp:55
Shader(const std::string &vertexPath, const std::string &fragmentPath, QOpenGLFunctions_4_5_Core *glFuncs)
Definition Shader.cpp:7
void setMat4(const std::string &name, const glm::mat4 &mat) const
Definition Shader.cpp:68
void setBool(const std::string &name, bool value) const
Definition Shader.cpp:59
void setInt(const std::string &name, int value) const
Definition Shader.cpp:62
void setFloat(const std::string &name, float value) const
Definition Shader.cpp:65
~Shader()
Definition Shader.cpp:23