initial commit
This commit is contained in:
1841
src/glad.c
Normal file
1841
src/glad.c
Normal file
File diff suppressed because it is too large
Load Diff
236
src/main.cpp
Normal file
236
src/main.cpp
Normal file
@@ -0,0 +1,236 @@
|
||||
// General includes
|
||||
#include <chrono>
|
||||
#include <vector>
|
||||
|
||||
// GL includes
|
||||
#include <glad/glad.h>
|
||||
|
||||
// SDL includes different on windows
|
||||
// the way i have it set up so i gotta
|
||||
// do it like this unfortunately
|
||||
#if _WIN32
|
||||
#include <SDL.h>
|
||||
#else
|
||||
#include <SDL2/SDL.h>
|
||||
#endif
|
||||
|
||||
#include <glm/glm.hpp>
|
||||
#include <glm/gtc/matrix_transform.hpp>
|
||||
#include <glm/gtc/type_ptr.hpp>
|
||||
|
||||
// Custom includes
|
||||
#define LOGGER_DEFINITION
|
||||
#include <logger.h>
|
||||
#include "timers.h"
|
||||
#include "object.h"
|
||||
#include "shader.h"
|
||||
|
||||
|
||||
int main(int argc, char** argv) {
|
||||
std::cout << "-----------------------------" << std::endl;
|
||||
std::cout << "----- OpenGL Playground -----" << std::endl;
|
||||
std::cout << "-------- Version 1.0 --------" << std::endl;
|
||||
std::cout << "----- ©Benjamin Kyd 2019 ----" << std::endl;
|
||||
std::cout << "-----------------------------" << std::endl;
|
||||
std::cout << std::endl;
|
||||
|
||||
// Get global variables ready
|
||||
Logger logger;
|
||||
SDL_Window* window = nullptr;
|
||||
SDL_GLContext glContext;
|
||||
bool isWindowOpen = false;
|
||||
|
||||
// Initialize SDL and OpenGL
|
||||
// isWindowOpen = init(logger, window, glContext);
|
||||
SDL_Init(SDL_INIT_EVERYTHING);
|
||||
|
||||
SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);
|
||||
SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8);
|
||||
SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8);
|
||||
SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8);
|
||||
SDL_GL_SetAttribute(SDL_GL_BUFFER_SIZE, 32);
|
||||
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
|
||||
|
||||
// MXAA
|
||||
SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1);
|
||||
SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 4);
|
||||
SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "4");
|
||||
|
||||
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 4);
|
||||
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 5);
|
||||
|
||||
window = SDL_CreateWindow("OpenGL Playground V1.0",
|
||||
SDL_WINDOWPOS_CENTERED,
|
||||
SDL_WINDOWPOS_CENTERED,
|
||||
// 640, 480,
|
||||
1280, 720,
|
||||
SDL_WINDOW_OPENGL);
|
||||
glContext = SDL_GL_CreateContext(window);
|
||||
SDL_GL_SetSwapInterval(1);
|
||||
|
||||
gladLoadGLLoader(SDL_GL_GetProcAddress);
|
||||
// SDL_SetRelativeMouseMode(SDL_TRUE);
|
||||
// SDL_WarpMouseInWindow(window, 0, 0);
|
||||
|
||||
isWindowOpen = true;
|
||||
|
||||
logger << LOGGER_INFO << "OpenGL and SDL initialized" << LOGGER_ENDL;
|
||||
|
||||
// Load an object into system memory
|
||||
std::vector<glm::vec3> vertices;
|
||||
std::vector<glm::vec3> normals;
|
||||
std::vector<GLushort> elements;
|
||||
|
||||
// LoadOBJ(logger, "./resources/dragon.obj", vertices, normals, elements);
|
||||
LoadOBJ(logger, "./resources/lucy.obj", vertices, normals, elements);
|
||||
|
||||
std::vector<glm::vec3> toGPU;
|
||||
toGPU.insert(toGPU.end(), vertices.begin(), vertices.end());
|
||||
toGPU.insert(toGPU.end(), normals.begin(), normals.end());
|
||||
|
||||
// Generate a vertex array object
|
||||
GLuint vao;
|
||||
glGenVertexArrays(1, &vao);
|
||||
// Bind array to GPU
|
||||
glBindVertexArray(vao);
|
||||
|
||||
// Generate a vertex buffer object
|
||||
GLuint vbo;
|
||||
glGenBuffers(1, &vbo);
|
||||
// Bind buffer to the GPU
|
||||
glBindBuffer(GL_ARRAY_BUFFER, vbo);
|
||||
// Copy vertex data to the vertex buffer already on the GPU
|
||||
glBufferData(GL_ARRAY_BUFFER, toGPU.size() * sizeof(glm::vec3), &toGPU[0], GL_STATIC_DRAW);
|
||||
|
||||
// Generate another vertex buffer for the element array buffer
|
||||
GLuint ebo;
|
||||
glGenBuffers(1, &ebo);
|
||||
// Bind buffer to the GPU
|
||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);
|
||||
// Copy buffer data to the buffer already on the GPU
|
||||
glBufferData(GL_ELEMENT_ARRAY_BUFFER, elements.size() * sizeof(GLushort), &elements[0], GL_STATIC_DRAW);
|
||||
|
||||
// Load, compile, apply and link shader programs
|
||||
Shader simpleShader{ logger };
|
||||
simpleShader.load("./resources/shaders/phong").attatch().link().use();
|
||||
|
||||
GLint posAttrib = glGetAttribLocation(simpleShader.getProgram(), "position");
|
||||
glEnableVertexAttribArray(posAttrib);
|
||||
glVertexAttribPointer(posAttrib, 3, GL_FLOAT, GL_FALSE, 0, 0);
|
||||
|
||||
GLint normalAttrib = glGetAttribLocation(simpleShader.getProgram(), "normal");
|
||||
glEnableVertexAttribArray(normalAttrib);
|
||||
glVertexAttribPointer(normalAttrib, 3, GL_FLOAT, GL_FALSE, 0, (const void*)(vertices.size() * sizeof(glm::vec3)));
|
||||
|
||||
// Set up camera
|
||||
// Camera camera(glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, -90.0f, 0.0f), 45.0f, 640.0f / 480.0f, 0.1f, 1000.0f);
|
||||
|
||||
|
||||
// Model matrice
|
||||
glm::mat4 model = glm::mat4(1.0f);
|
||||
model = glm::translate(model, { -170.0f, -170.0f, -170.0f });
|
||||
model = glm::rotate(model, glm::radians(-160.0f), glm::vec3(0.0f, 1.0f, 0.0f));
|
||||
// Gets uniform for model matrice, to be used later
|
||||
GLint uniTrans = glGetUniformLocation(simpleShader.getProgram(), "model");
|
||||
glUniformMatrix4fv(uniTrans, 1, GL_FALSE, glm::value_ptr(model));
|
||||
|
||||
|
||||
// View matrice
|
||||
glm::mat4 view = glm::lookAt(
|
||||
glm::vec3(1.0f, 1.0f, 1.0f),
|
||||
glm::vec3(0.0f, 0.4f, 0.0f),
|
||||
glm::vec3(0.0f, 1.0f, 0.0f)
|
||||
);
|
||||
// Get uniform and send it to the GPU
|
||||
GLint uniView = glGetUniformLocation(simpleShader.getProgram(), "view");
|
||||
glUniformMatrix4fv(uniView, 1, GL_FALSE, glm::value_ptr(view));
|
||||
|
||||
// Projection matrice
|
||||
glm::mat4 proj = glm::perspective(glm::radians(45.0f), 1280.0f / 720.0f, 1.0f, 1000.0f);//camera.perspective;
|
||||
// Get uniform and send it to the GPU
|
||||
GLint uniProj = glGetUniformLocation(simpleShader.getProgram(), "proj");
|
||||
glUniformMatrix4fv(uniProj, 1, GL_FALSE, glm::value_ptr(proj));
|
||||
|
||||
|
||||
glm::vec3 lightPos = { -2.0f, 4.0f, -1.0f };
|
||||
|
||||
GLint uniLight = glGetUniformLocation(simpleShader.getProgram(), "lightpos");
|
||||
glUniformMatrix3fv(uniLight, 1, GL_FALSE, glm::value_ptr(lightPos));
|
||||
|
||||
simpleShader.use();
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
glEnable(GL_MULTISAMPLE);
|
||||
|
||||
SDL_Event event;
|
||||
logger << LOGGER_ENDL;
|
||||
while (isWindowOpen) {
|
||||
FPSCount(logger);
|
||||
|
||||
// Update tick (60ups)
|
||||
if (UPSTimer()) {
|
||||
const Uint8 *state = SDL_GetKeyboardState(NULL);
|
||||
|
||||
if (state[SDL_SCANCODE_Q]) {
|
||||
model = glm::rotate(model, glm::radians(-1.5f), glm::vec3(0.0f, 1.0f, 0.0f));
|
||||
glUniformMatrix4fv(uniTrans, 1, GL_FALSE, glm::value_ptr(model));
|
||||
}
|
||||
|
||||
if (state[SDL_SCANCODE_E]) {
|
||||
model = glm::rotate(model, glm::radians(1.5f), glm::vec3(0.0f, 1.0f, 0.0f));
|
||||
glUniformMatrix4fv(uniTrans, 1, GL_FALSE, glm::value_ptr(model));
|
||||
}
|
||||
|
||||
UpdateClock = SDL_GetTicks();
|
||||
}
|
||||
|
||||
// Handle events
|
||||
while (SDL_PollEvent(&event) != 0) {
|
||||
if (event.type == SDL_QUIT || event.key.keysym.sym == SDLK_ESCAPE)
|
||||
isWindowOpen = false;
|
||||
if (event.key.keysym.sym == SDLK_r) {
|
||||
simpleShader.reload();
|
||||
|
||||
posAttrib = glGetAttribLocation(simpleShader.getProgram(), "position");
|
||||
glEnableVertexAttribArray(posAttrib);
|
||||
glVertexAttribPointer(posAttrib, 3, GL_FLOAT, GL_FALSE, 0, 0);
|
||||
|
||||
normalAttrib = glGetAttribLocation(simpleShader.getProgram(), "normal");
|
||||
glEnableVertexAttribArray(normalAttrib);
|
||||
glVertexAttribPointer(normalAttrib, 3, GL_FLOAT, GL_FALSE, 0, (const void*)(vertices.size() * sizeof(glm::vec3)));
|
||||
|
||||
uniTrans = glGetUniformLocation(simpleShader.getProgram(), "model");
|
||||
glUniformMatrix4fv(uniTrans, 1, GL_FALSE, glm::value_ptr(model));
|
||||
|
||||
uniView = glGetUniformLocation(simpleShader.getProgram(), "view");
|
||||
glUniformMatrix4fv(uniView, 1, GL_FALSE, glm::value_ptr(view));
|
||||
|
||||
uniProj = glGetUniformLocation(simpleShader.getProgram(), "proj");
|
||||
glUniformMatrix4fv(uniProj, 1, GL_FALSE, glm::value_ptr(proj));
|
||||
|
||||
uniLight = glGetUniformLocation(simpleShader.getProgram(), "lightpos");
|
||||
glUniformMatrix3fv(uniLight, 1, GL_FALSE, glm::value_ptr(lightPos));
|
||||
}
|
||||
if (event.type == SDL_MOUSEMOTION) {
|
||||
int mouseX = event.motion.xrel;
|
||||
int mouseY = event.motion.yrel;
|
||||
// camera.rot.y += mouseX * 0.5f;
|
||||
// camera.rot.x += mouseY * -0.5f;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
glViewport(0, 0, 1280, 720);
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
||||
glClear(GL_DEPTH_BUFFER_BIT);
|
||||
const float clear[] = {0.1f, 0.45f, 0.9f, 1.0f};
|
||||
glClearBufferfv(GL_COLOR, 0, clear);
|
||||
simpleShader.use();
|
||||
|
||||
glDrawElements(GL_TRIANGLES, elements.size(), GL_UNSIGNED_SHORT, 0);
|
||||
|
||||
// Swap
|
||||
SDL_GL_SwapWindow(window);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
58
src/object.cpp
Normal file
58
src/object.cpp
Normal file
@@ -0,0 +1,58 @@
|
||||
#include "object.h"
|
||||
|
||||
#include <fstream>
|
||||
|
||||
// https://en.wikibooks.org/wiki/OpenGL_Programming/Modern_OpenGL_Tutorial_Load_OBJ
|
||||
void LoadOBJ(Logger& logger, std::string file, std::vector<glm::vec3>& vertices, std::vector<glm::vec3>& normals, std::vector<GLushort>& elements) {
|
||||
std::ifstream in(file, std::ios::in);
|
||||
if (!in) {
|
||||
logger << LOGGER_ERROR << "Cannot open " << file << LOGGER_ENDL;
|
||||
return;
|
||||
}
|
||||
|
||||
std::string line;
|
||||
while (getline(in, line)) {
|
||||
if (line.substr(0,2) == "v ") {
|
||||
std::istringstream s(line.substr(2));
|
||||
glm::vec3 v; s >> v.x; s >> v.y; s >> v.z;
|
||||
vertices.push_back(v);
|
||||
} else if (line.substr(0,2) == "f ") {
|
||||
std::istringstream s(line.substr(2));
|
||||
GLushort a,b,c;
|
||||
s >> a; s >> b; s >> c;
|
||||
a--; b--; c--;
|
||||
elements.push_back(a); elements.push_back(b); elements.push_back(c);
|
||||
} else if (line[0] == '#') { }
|
||||
else {}
|
||||
}
|
||||
|
||||
normals.resize(vertices.size(), glm::vec3(0.0, 0.0, 0.0));
|
||||
for (int i = 0; i < elements.size(); i += 3) {
|
||||
GLushort ia = elements[i];
|
||||
GLushort ib = elements[i+1];
|
||||
GLushort ic = elements[i+2];
|
||||
glm::vec3 normal = glm::normalize(glm::cross(
|
||||
glm::vec3(vertices[ib]) - glm::vec3(vertices[ia]),
|
||||
glm::vec3(vertices[ic]) - glm::vec3(vertices[ia])));
|
||||
normals[ia] = normals[ib] = normals[ic] = normal;
|
||||
}
|
||||
|
||||
logger << LOGGER_INFO << "Loaded OBJ: " << file << LOGGER_ENDL;
|
||||
}
|
||||
|
||||
void FlatShade(std::vector<glm::vec3>& vertices, std::vector<glm::vec3>& normals, std::vector<GLushort>& elements) {
|
||||
std::vector<glm::vec3> shared_vertices;
|
||||
for (int i = 0; i < elements.size(); i++) {
|
||||
vertices.push_back(shared_vertices[elements[i]]);
|
||||
if ((i % 3) == 2) {
|
||||
GLushort ia = elements[i-2];
|
||||
GLushort ib = elements[i-1];
|
||||
GLushort ic = elements[i];
|
||||
glm::vec3 normal = glm::normalize(glm::cross(
|
||||
shared_vertices[ic] - shared_vertices[ia],
|
||||
shared_vertices[ib] - shared_vertices[ia]));
|
||||
for (int n = 0; n < 3; n++)
|
||||
normals.push_back(normal);
|
||||
}
|
||||
}
|
||||
}
|
||||
33
src/object.h
Normal file
33
src/object.h
Normal file
@@ -0,0 +1,33 @@
|
||||
#ifndef SRC_OBJECT_H_
|
||||
#define SRC_OBJECT_H_
|
||||
|
||||
// General includes
|
||||
#include <vector>
|
||||
|
||||
// GL includes
|
||||
#include <glad/glad.h>
|
||||
|
||||
#if _WIN32
|
||||
#include <SDL.h>
|
||||
#else
|
||||
#include <SDL2/SDL.h>
|
||||
#endif
|
||||
|
||||
#include <glm/glm.hpp>
|
||||
#include <glm/gtc/matrix_transform.hpp>
|
||||
#include <glm/gtc/type_ptr.hpp>
|
||||
|
||||
// Custom includes
|
||||
#include <logger.h>
|
||||
|
||||
void LoadOBJ(Logger& logger,
|
||||
std::string file,
|
||||
std::vector<glm::vec3>& vertices,
|
||||
std::vector<glm::vec3>& normals,
|
||||
std::vector<GLushort>& elements);
|
||||
|
||||
void FlatShade(std::vector<glm::vec3>& vertices,
|
||||
std::vector<glm::vec3>& normals,
|
||||
std::vector<GLushort>& elements);
|
||||
|
||||
#endif
|
||||
167
src/shader.cpp
Normal file
167
src/shader.cpp
Normal file
@@ -0,0 +1,167 @@
|
||||
#include "shader.h"
|
||||
|
||||
#include <iostream>
|
||||
#include <fstream>
|
||||
|
||||
Shader::Shader(Logger& logger)
|
||||
: logger(logger) {
|
||||
m_program = glCreateProgram();
|
||||
}
|
||||
|
||||
Shader& Shader::use() {
|
||||
glUseProgram(m_program);
|
||||
return *this;
|
||||
}
|
||||
|
||||
Shader& Shader::link() {
|
||||
glLinkProgram(m_program);
|
||||
return *this;
|
||||
}
|
||||
|
||||
Shader& Shader::attatch() {
|
||||
glAttachShader(m_program, m_vert);
|
||||
glAttachShader(m_program, m_frag);
|
||||
return *this;
|
||||
}
|
||||
|
||||
std::string readShader(std::string source) {
|
||||
std::ifstream t(source);
|
||||
std::string shaderCode((std::istreambuf_iterator<char>(t)),
|
||||
std::istreambuf_iterator<char>());
|
||||
return shaderCode;
|
||||
}
|
||||
|
||||
Shader& Shader::load(GLenum type, std::string sourceLoc) {
|
||||
const char* source = readShader(sourceLoc).c_str();
|
||||
|
||||
if (type == GL_VERTEX_SHADER) {
|
||||
m_vertLoc = sourceLoc;
|
||||
m_vertSource = (std::string)source;
|
||||
m_vert = glCreateShader(GL_VERTEX_SHADER);
|
||||
glShaderSource(m_vert, 1, &source, NULL);
|
||||
glCompileShader(m_vert);
|
||||
|
||||
glGetShaderiv(m_vert, GL_COMPILE_STATUS, &m_status);
|
||||
if (m_status == GL_FALSE) {
|
||||
char buf[512];
|
||||
glGetShaderInfoLog(m_vert, 512, NULL, buf);
|
||||
logger << LOGGER_ERROR << buf << LOGGER_ENDL;
|
||||
}
|
||||
|
||||
logger << LOGGER_INFO << "Vertex shader at '" << sourceLoc << "' compiled..." << LOGGER_ENDL;
|
||||
} else if (type == GL_FRAGMENT_SHADER) {
|
||||
m_fragLoc = sourceLoc;
|
||||
m_fragSource = (std::string)source;
|
||||
m_frag = glCreateShader(GL_FRAGMENT_SHADER);
|
||||
glShaderSource(m_frag, 1, &source, NULL);
|
||||
glCompileShader(m_frag);
|
||||
|
||||
glGetShaderiv(m_frag, GL_COMPILE_STATUS, &m_status);
|
||||
if (m_status == GL_FALSE) {
|
||||
char buf[512];
|
||||
glGetShaderInfoLog(m_frag, 512, NULL, buf);
|
||||
logger << LOGGER_ERROR << buf << LOGGER_ENDL;
|
||||
}
|
||||
|
||||
logger << LOGGER_INFO << "Vertex shader at '" << sourceLoc << "' compiled..." << LOGGER_ENDL;
|
||||
}
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
Shader& Shader::load(std::string sourceLoc) {
|
||||
m_vertLoc = sourceLoc + ".vert";
|
||||
m_fragLoc = sourceLoc + ".frag";
|
||||
|
||||
m_vertSource = readShader(m_vertLoc);
|
||||
m_fragSource = readShader(m_fragLoc);
|
||||
|
||||
m_vert = glCreateShader(GL_VERTEX_SHADER);
|
||||
m_frag = glCreateShader(GL_FRAGMENT_SHADER);
|
||||
|
||||
const char* vertSource = m_vertSource.c_str();
|
||||
glShaderSource(m_vert, 1, &vertSource, NULL);
|
||||
glCompileShader(m_vert);
|
||||
|
||||
const char* fragSource = m_fragSource.c_str();
|
||||
glShaderSource(m_frag, 1, &fragSource, NULL);
|
||||
glCompileShader(m_frag);
|
||||
|
||||
glGetShaderiv(m_vert, GL_COMPILE_STATUS, &m_status);
|
||||
if (m_status == GL_FALSE) {
|
||||
char buf[512];
|
||||
glGetShaderInfoLog(m_vert, 512, NULL, buf);
|
||||
logger << LOGGER_ERROR << buf << LOGGER_ENDL;
|
||||
}
|
||||
|
||||
glGetShaderiv(m_frag, GL_COMPILE_STATUS, &m_status);
|
||||
if (m_status == GL_FALSE) {
|
||||
char buf[512];
|
||||
glGetShaderInfoLog(m_frag, 512, NULL, buf);
|
||||
logger << LOGGER_ERROR << buf << LOGGER_ENDL;
|
||||
}
|
||||
|
||||
logger << LOGGER_INFO << "Vertex shader at '" << m_vertLoc << "' compiled..." << LOGGER_ENDL;
|
||||
logger << LOGGER_INFO << "Fragment shader at '" << m_fragLoc << "' compiled..." << LOGGER_ENDL;
|
||||
return *this;
|
||||
}
|
||||
|
||||
Shader& Shader::reload() {
|
||||
glDeleteProgram(m_program);
|
||||
glDeleteShader(m_vert);
|
||||
glDeleteShader(m_frag);
|
||||
|
||||
m_vertSource = readShader(m_vertLoc);
|
||||
m_fragSource = readShader(m_fragLoc);
|
||||
|
||||
m_vert = glCreateShader(GL_VERTEX_SHADER);
|
||||
m_frag = glCreateShader(GL_FRAGMENT_SHADER);
|
||||
|
||||
const char* vertSource = m_vertSource.c_str();
|
||||
glShaderSource(m_vert, 1, &vertSource, NULL);
|
||||
glCompileShader(m_vert);
|
||||
|
||||
const char* fragSource = m_fragSource.c_str();
|
||||
glShaderSource(m_frag, 1, &fragSource, NULL);
|
||||
glCompileShader(m_frag);
|
||||
|
||||
glGetShaderiv(m_vert, GL_COMPILE_STATUS, &m_status);
|
||||
if (m_status == GL_FALSE) {
|
||||
char buf[512];
|
||||
glGetShaderInfoLog(m_vert, 512, NULL, buf);
|
||||
logger << LOGGER_ERROR << buf << LOGGER_ENDL;
|
||||
}
|
||||
|
||||
glGetShaderiv(m_frag, GL_COMPILE_STATUS, &m_status);
|
||||
if (m_status == GL_FALSE) {
|
||||
char buf[512];
|
||||
glGetShaderInfoLog(m_frag, 512, NULL, buf);
|
||||
logger << LOGGER_ERROR << buf << LOGGER_ENDL;
|
||||
}
|
||||
|
||||
logger << LOGGER_INFO << "Vertex shader at '" << m_vertLoc << "' compiled..." << LOGGER_ENDL;
|
||||
logger << LOGGER_INFO << "Fragment shader at '" << m_fragLoc << "' compiled..." << LOGGER_ENDL;
|
||||
|
||||
link();
|
||||
attatch();
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
GLuint Shader::getProgram() {
|
||||
return m_program;
|
||||
}
|
||||
|
||||
GLuint Shader::getVertex() {
|
||||
return m_vert;
|
||||
}
|
||||
|
||||
GLuint Shader::getFragment() {
|
||||
return m_frag;
|
||||
}
|
||||
|
||||
Shader::~Shader() {
|
||||
glDeleteProgram(m_program);
|
||||
glDeleteShader(m_vert);
|
||||
glDeleteShader(m_frag);
|
||||
}
|
||||
42
src/shader.h
Normal file
42
src/shader.h
Normal file
@@ -0,0 +1,42 @@
|
||||
#ifndef SRC_SHADER_H_
|
||||
#define SRC_SHADER_H_
|
||||
|
||||
#include <glad/glad.h>
|
||||
#include <string>
|
||||
#include <logger.h>
|
||||
|
||||
class Shader {
|
||||
public:
|
||||
Shader(Logger& logger);
|
||||
|
||||
Shader& use();
|
||||
Shader& link();
|
||||
Shader& attatch();
|
||||
Shader& load(GLenum type, std::string sourceLoc);
|
||||
Shader& load(std::string sourceLoc);
|
||||
Shader& reload();
|
||||
|
||||
GLuint getProgram();
|
||||
GLuint getVertex();
|
||||
GLuint getFragment();
|
||||
|
||||
virtual ~Shader();
|
||||
private:
|
||||
Shader(Shader const &) = delete;
|
||||
Shader & operator=(Shader const &) = delete;
|
||||
|
||||
GLuint m_program;
|
||||
GLuint m_vert;
|
||||
GLuint m_frag;
|
||||
|
||||
std::string m_vertSource;
|
||||
std::string m_fragSource;
|
||||
std::string m_vertLoc;
|
||||
std::string m_fragLoc;
|
||||
|
||||
Logger& logger;
|
||||
|
||||
GLint m_status;
|
||||
};
|
||||
|
||||
#endif
|
||||
36
src/timers.h
Normal file
36
src/timers.h
Normal file
@@ -0,0 +1,36 @@
|
||||
#ifndef SRC_TIMERS_H_
|
||||
#define SRC_TIMERS_H_
|
||||
|
||||
// General includes
|
||||
#include <chrono>
|
||||
|
||||
// GL includes
|
||||
#if _WIN32
|
||||
#include <SDL.h>
|
||||
#else
|
||||
#include <SDL2/SDL.h>
|
||||
#endif
|
||||
|
||||
// Custom includes
|
||||
#include <logger.h>
|
||||
|
||||
std::chrono::high_resolution_clock timer;
|
||||
auto FPSCalculateLast = timer.now();
|
||||
auto FPSClock = SDL_GetTicks();
|
||||
|
||||
auto UpdateClock = SDL_GetTicks();
|
||||
|
||||
void FPSCount(Logger& logger) {
|
||||
if (SDL_GetTicks() - FPSClock >= 1000) {
|
||||
auto deltaTime = std::chrono::duration_cast<std::chrono::nanoseconds>(timer.now() - FPSCalculateLast).count();
|
||||
logger << LOGGER_INFO << "FPS: " << (int)(1 / ((float)deltaTime * 1e-9)) << LOGGER_ENDL;
|
||||
FPSClock = SDL_GetTicks();
|
||||
}
|
||||
FPSCalculateLast = timer.now();
|
||||
}
|
||||
|
||||
bool UPSTimer() {
|
||||
return (SDL_GetTicks() - UpdateClock >= 10);
|
||||
}
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user