voxel_engine.cpp - changed structure, added character controls, physics almost all files are modified (including shaders) + new source directory - physics
131 lines
3.3 KiB
C++
131 lines
3.3 KiB
C++
#include "Shader.h"
|
|
|
|
#include <exception>
|
|
#include <fstream>
|
|
#include <iostream>
|
|
#include <sstream>
|
|
|
|
#include <glm/gtc/type_ptr.hpp>
|
|
|
|
#include <GL/glew.h>
|
|
#include <GLFW/glfw3.h>
|
|
|
|
Shader::Shader(unsigned int id) : id(id){
|
|
}
|
|
|
|
Shader::~Shader(){
|
|
glDeleteProgram(id);
|
|
}
|
|
|
|
void Shader::use(){
|
|
glUseProgram(id);
|
|
}
|
|
|
|
void Shader::uniformMatrix(std::string name, glm::mat4 matrix){
|
|
GLuint transformLoc = glGetUniformLocation(id, name.c_str());
|
|
glUniformMatrix4fv(transformLoc, 1, GL_FALSE, glm::value_ptr(matrix));
|
|
}
|
|
|
|
void Shader::uniform1i(std::string name, int x){
|
|
GLuint transformLoc = glGetUniformLocation(id, name.c_str());
|
|
glUniform1i(transformLoc, x);
|
|
}
|
|
|
|
void Shader::uniform1f(std::string name, float x){
|
|
GLuint transformLoc = glGetUniformLocation(id, name.c_str());
|
|
glUniform1f(transformLoc, x);
|
|
}
|
|
|
|
void Shader::uniform2f(std::string name, float x, float y){
|
|
GLuint transformLoc = glGetUniformLocation(id, name.c_str());
|
|
glUniform2f(transformLoc, x, y);
|
|
}
|
|
|
|
void Shader::uniform3f(std::string name, float x, float y, float z){
|
|
GLuint transformLoc = glGetUniformLocation(id, name.c_str());
|
|
glUniform3f(transformLoc, x,y,z);
|
|
}
|
|
|
|
|
|
|
|
Shader* load_shader(std::string vertexFile, std::string fragmentFile) {
|
|
// Reading Files
|
|
std::string vertexCode;
|
|
std::string fragmentCode;
|
|
std::ifstream vShaderFile;
|
|
std::ifstream fShaderFile;
|
|
|
|
vShaderFile.exceptions(std::ifstream::badbit);
|
|
fShaderFile.exceptions(std::ifstream::badbit);
|
|
try {
|
|
vShaderFile.open(vertexFile);
|
|
fShaderFile.open(fragmentFile);
|
|
std::stringstream vShaderStream, fShaderStream;
|
|
|
|
vShaderStream << vShaderFile.rdbuf();
|
|
fShaderStream << fShaderFile.rdbuf();
|
|
|
|
vShaderFile.close();
|
|
fShaderFile.close();
|
|
|
|
vertexCode = vShaderStream.str();
|
|
fragmentCode = fShaderStream.str();
|
|
}
|
|
catch(std::ifstream::failure& e) {
|
|
std::cerr << "ERROR::SHADER::FILE_NOT_SUCCESFULLY_READ" << std::endl;
|
|
return nullptr;
|
|
}
|
|
const GLchar* vShaderCode = vertexCode.c_str();
|
|
const GLchar* fShaderCode = fragmentCode.c_str();
|
|
|
|
GLuint vertex, fragment;
|
|
GLint success;
|
|
GLchar infoLog[512];
|
|
|
|
// Vertex Shader
|
|
vertex = glCreateShader(GL_VERTEX_SHADER);
|
|
glShaderSource(vertex, 1, &vShaderCode, nullptr);
|
|
glCompileShader(vertex);
|
|
glGetShaderiv(vertex, GL_COMPILE_STATUS, &success);
|
|
if (!success){
|
|
glGetShaderInfoLog(vertex, 512, nullptr, infoLog);
|
|
std::cerr << "SHADER::VERTEX: compilation failed" << std::endl;
|
|
std::cerr << infoLog << std::endl;
|
|
return nullptr;
|
|
}
|
|
|
|
// Fragment Shader
|
|
fragment = glCreateShader(GL_FRAGMENT_SHADER);
|
|
glShaderSource(fragment, 1, &fShaderCode, nullptr);
|
|
glCompileShader(fragment);
|
|
glGetShaderiv(fragment, GL_COMPILE_STATUS, &success);
|
|
if (!success){
|
|
glGetShaderInfoLog(fragment, 512, nullptr, infoLog);
|
|
std::cerr << "SHADER::FRAGMENT: compilation failed" << std::endl;
|
|
std::cerr << infoLog << std::endl;
|
|
return nullptr;
|
|
}
|
|
|
|
// Shader Program
|
|
GLuint id = glCreateProgram();
|
|
glAttachShader(id, vertex);
|
|
glAttachShader(id, fragment);
|
|
glLinkProgram(id);
|
|
|
|
glGetProgramiv(id, GL_LINK_STATUS, &success);
|
|
if (!success){
|
|
glGetProgramInfoLog(id, 512, nullptr, infoLog);
|
|
std::cerr << "SHADER::PROGRAM: linking failed" << std::endl;
|
|
std::cerr << infoLog << std::endl;
|
|
|
|
glDeleteShader(vertex);
|
|
glDeleteShader(fragment);
|
|
return nullptr;
|
|
}
|
|
|
|
glDeleteShader(vertex);
|
|
glDeleteShader(fragment);
|
|
|
|
return new Shader(id);
|
|
}
|