Add example code to test shaders and camera
This commit is contained in:
parent
7d5cf856e6
commit
8f489ea7f1
|
@ -1,4 +1,4 @@
|
||||||
cmake_minimum_required(VERSION 3.10)
|
cmake_minimum_required(VERSION 3.5)
|
||||||
project(universium-engine)
|
project(universium-engine)
|
||||||
|
|
||||||
# Modules
|
# Modules
|
||||||
|
|
|
@ -0,0 +1,8 @@
|
||||||
|
#version 130
|
||||||
|
|
||||||
|
out vec4 out_Color;
|
||||||
|
in vec3 cardial_color;
|
||||||
|
|
||||||
|
void main(void) {
|
||||||
|
out_Color = vec4(cardial_color.xyz, 1.0f);
|
||||||
|
}
|
|
@ -0,0 +1,15 @@
|
||||||
|
#version 130
|
||||||
|
|
||||||
|
in vec3 position;
|
||||||
|
in vec3 color;
|
||||||
|
out vec3 cardial_color;
|
||||||
|
|
||||||
|
uniform mat4 projectionMatrix;
|
||||||
|
uniform mat4 viewMatrix;
|
||||||
|
uniform mat4 modelMatrix;
|
||||||
|
|
||||||
|
void main(void) {
|
||||||
|
gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(position, 1.0);
|
||||||
|
|
||||||
|
cardial_color = color;
|
||||||
|
}
|
|
@ -16,8 +16,9 @@
|
||||||
|
|
||||||
#include "Application.h"
|
#include "Application.h"
|
||||||
#include "util/Log.h"
|
#include "util/Log.h"
|
||||||
|
#include "Shader.h"
|
||||||
|
|
||||||
Application::Application()
|
Application::Application() : m_width(1080), m_height(720)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -40,8 +41,8 @@ void Application::initialize()
|
||||||
"Universium",
|
"Universium",
|
||||||
SDL_WINDOWPOS_CENTERED,
|
SDL_WINDOWPOS_CENTERED,
|
||||||
SDL_WINDOWPOS_CENTERED,
|
SDL_WINDOWPOS_CENTERED,
|
||||||
1080,
|
m_width,
|
||||||
720,
|
m_height,
|
||||||
SDL_WINDOW_OPENGL
|
SDL_WINDOW_OPENGL
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -65,6 +66,8 @@ void Application::initialize()
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SDL_GL_MakeCurrent(m_window, m_glContext);
|
||||||
|
|
||||||
// Initialize GLEW
|
// Initialize GLEW
|
||||||
glewInit();
|
glewInit();
|
||||||
|
|
||||||
|
@ -112,6 +115,7 @@ void Application::handleEvents()
|
||||||
|
|
||||||
glm::vec2 mousepos = Input::getInstance().getMouseCoords();
|
glm::vec2 mousepos = Input::getInstance().getMouseCoords();
|
||||||
|
|
||||||
|
// Handle Camera Movement Keys
|
||||||
if(Input::getInstance().isKeyDown(SDLK_w))
|
if(Input::getInstance().isKeyDown(SDLK_w))
|
||||||
m_camera->processKeyboard(Camera_Movement::FORWARD, 0.01f);
|
m_camera->processKeyboard(Camera_Movement::FORWARD, 0.01f);
|
||||||
|
|
||||||
|
@ -124,10 +128,22 @@ void Application::handleEvents()
|
||||||
if(Input::getInstance().isKeyDown(SDLK_a))
|
if(Input::getInstance().isKeyDown(SDLK_a))
|
||||||
m_camera->processKeyboard(Camera_Movement::LEFT, 0.01f);
|
m_camera->processKeyboard(Camera_Movement::LEFT, 0.01f);
|
||||||
|
|
||||||
|
// Handle Camera Zoom
|
||||||
m_camera->processMouseScroll((float) Input::getInstance().getMouseWheelVertical() / 10.0f);
|
m_camera->processMouseScroll((float) Input::getInstance().getMouseWheelVertical() / 10.0f);
|
||||||
|
|
||||||
|
// Force mouse to the center of the screen
|
||||||
|
SDL_WarpMouseInWindow(m_window, m_width/2, m_height/2);
|
||||||
|
|
||||||
|
// Handle Camera Movement
|
||||||
|
m_camera->processMouseMovement(-(m_width/2 - mousepos.x), m_height/2 - mousepos.y, GL_TRUE);
|
||||||
|
|
||||||
|
// Print mouse position on click
|
||||||
if(Input::getInstance().isKeyPressed(SDL_BUTTON_LEFT))
|
if(Input::getInstance().isKeyPressed(SDL_BUTTON_LEFT))
|
||||||
std::cout << "mX: " << mousepos.x << " mY: " << mousepos.y << std::endl;
|
std::cout << "mX: " << mousepos.x << " mY: " << mousepos.y << std::endl;
|
||||||
|
|
||||||
|
// Exit game on Esc
|
||||||
|
if(Input::getInstance().isKeyPressed(SDLK_ESCAPE))
|
||||||
|
exit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -137,6 +153,75 @@ void Application::run()
|
||||||
m_now = SDL_GetPerformanceCounter();
|
m_now = SDL_GetPerformanceCounter();
|
||||||
m_last = 0;
|
m_last = 0;
|
||||||
|
|
||||||
|
// TEST CODE
|
||||||
|
static const GLfloat vertices[] = {
|
||||||
|
-1.0f,-1.0f,-1.0f, 0.0f, 1.0f, 1.0f, // triangle 1 : begin
|
||||||
|
-1.0f,-1.0f, 1.0f, 0.0f, 1.0f, 1.0f,
|
||||||
|
-1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, // triangle 1 : end
|
||||||
|
1.0f, 1.0f,-1.0f, 1.0f, 1.0f, 0.0f, // triangle 2 : begin
|
||||||
|
-1.0f,-1.0f,-1.0f, 1.0f, 1.0f, 0.0f,
|
||||||
|
-1.0f, 1.0f,-1.0f, 1.0f, 1.0f, 0.0f, // triangle 2 : end
|
||||||
|
1.0f,-1.0f, 1.0f, 1.0f, 0.0f, 1.0f,
|
||||||
|
-1.0f,-1.0f,-1.0f, 1.0f, 0.0f, 1.0f,
|
||||||
|
1.0f,-1.0f,-1.0f, 1.0f, 0.0f, 1.0f,
|
||||||
|
1.0f, 1.0f,-1.0f, 1.0f, 1.0f, 0.0f,
|
||||||
|
1.0f,-1.0f,-1.0f, 1.0f, 1.0f, 0.0f,
|
||||||
|
-1.0f,-1.0f,-1.0f, 1.0f, 1.0f, 0.0f,
|
||||||
|
-1.0f,-1.0f,-1.0f, 0.0f, 1.0f, 1.0f,
|
||||||
|
-1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f,
|
||||||
|
-1.0f, 1.0f,-1.0f, 0.0f, 1.0f, 1.0f,
|
||||||
|
1.0f,-1.0f, 1.0f, 1.0f, 0.0f, 1.0f,
|
||||||
|
-1.0f,-1.0f, 1.0f, 1.0f, 0.0f, 1.0f,
|
||||||
|
-1.0f,-1.0f,-1.0f, 1.0f, 0.0f, 1.0f,
|
||||||
|
-1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f,
|
||||||
|
-1.0f,-1.0f, 1.0f, 0.0f, 0.0f, 1.0f,
|
||||||
|
1.0f,-1.0f, 1.0f, 0.0f, 0.0f, 1.0f,
|
||||||
|
1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f,
|
||||||
|
1.0f,-1.0f,-1.0f, 1.0f, 0.0f, 0.0f,
|
||||||
|
1.0f, 1.0f,-1.0f, 1.0f, 0.0f, 0.0f,
|
||||||
|
1.0f,-1.0f,-1.0f, 1.0f, 0.0f, 0.0f,
|
||||||
|
1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f,
|
||||||
|
1.0f,-1.0f, 1.0f, 1.0f, 0.0f, 0.0f,
|
||||||
|
1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f,
|
||||||
|
1.0f, 1.0f,-1.0f, 0.0f, 1.0f, 0.0f,
|
||||||
|
-1.0f, 1.0f,-1.0f, 0.0f, 1.0f, 0.0f,
|
||||||
|
1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f,
|
||||||
|
-1.0f, 1.0f,-1.0f, 0.0f, 1.0f, 0.0f,
|
||||||
|
-1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f,
|
||||||
|
1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f,
|
||||||
|
-1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f,
|
||||||
|
1.0f,-1.0f, 1.0f, 0.0f, 0.0f, 1.0f
|
||||||
|
};
|
||||||
|
|
||||||
|
GLuint vertexArray, vertexBuffer;
|
||||||
|
|
||||||
|
// Create VAO
|
||||||
|
glGenVertexArrays(1, &vertexArray);
|
||||||
|
glBindVertexArray(vertexArray);
|
||||||
|
|
||||||
|
// Generate 1 buffer, put the resulting identifier in vertexBuffer
|
||||||
|
glGenBuffers(1, &vertexBuffer);
|
||||||
|
// The following commands will talk about our 'vertexBuffer' buffer
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
|
||||||
|
// Give our vertices to OpenGL.
|
||||||
|
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
|
||||||
|
|
||||||
|
// Create the shader and link them together
|
||||||
|
Shader& skyboxShader = Shader::createShader("data/shaders/skybox.vert", "data/shaders/skybox.frag");
|
||||||
|
skyboxShader.linkShaders();
|
||||||
|
|
||||||
|
// Give the buffers to the shader
|
||||||
|
skyboxShader.setBuffers(vertexArray, vertexBuffer, 0);
|
||||||
|
|
||||||
|
// Set attribute arrays
|
||||||
|
skyboxShader.setAttribute("position", 3, GL_FALSE, 6, 0, GL_FLOAT);
|
||||||
|
skyboxShader.setAttribute("color", 3, GL_FALSE, 6, 3, GL_FLOAT);
|
||||||
|
|
||||||
|
glEnable(GL_DEPTH_TEST);
|
||||||
|
SDL_ShowCursor(SDL_DISABLE);
|
||||||
|
|
||||||
|
// END TEST CODE
|
||||||
|
|
||||||
while(m_run)
|
while(m_run)
|
||||||
{
|
{
|
||||||
m_last = m_now;
|
m_last = m_now;
|
||||||
|
@ -144,17 +229,30 @@ void Application::run()
|
||||||
|
|
||||||
handleEvents();
|
handleEvents();
|
||||||
|
|
||||||
|
// Clear color buffer
|
||||||
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
|
glClearColor(0.39f, 0.58f, 0.93f, 1.f);
|
||||||
|
|
||||||
deltaTime = ((m_now - m_last) / (double)SDL_GetPerformanceFrequency());
|
deltaTime = ((m_now - m_last) / (double)SDL_GetPerformanceFrequency());
|
||||||
|
|
||||||
|
// TEST CODE
|
||||||
|
|
||||||
|
glm::vec3 cameraPos = m_camera->getPosition();
|
||||||
|
|
||||||
|
glm::mat4 projection = glm::perspective(m_camera->getFOV(), (GLfloat)m_width/(GLfloat)m_height, 0.1f, 100.0f);
|
||||||
|
glm::mat4 model = glm::scale(glm::translate(glm::mat4(1.0f), cameraPos), glm::vec3(50.0f, 50.0f, 50.0f));
|
||||||
|
skyboxShader.use();
|
||||||
|
skyboxShader.setUniform("projectionMatrix", projection);
|
||||||
|
skyboxShader.setUniform("viewMatrix", m_camera->getViewMatrix());
|
||||||
|
skyboxShader.setUniform("modelMatrix", model);
|
||||||
|
|
||||||
|
glDrawArrays(GL_TRIANGLES, 0, 12*3); // 12*3 indices starting at 0 -> 12 triangles -> 6 squares
|
||||||
|
|
||||||
|
// END TEST CODE
|
||||||
|
|
||||||
update(deltaTime);
|
update(deltaTime);
|
||||||
render();
|
render();
|
||||||
|
|
||||||
// Set background color as cornflower blue
|
|
||||||
glClearColor(0.39f, 0.58f, 0.93f, 1.f);
|
|
||||||
|
|
||||||
// Clear color buffer
|
|
||||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
|
||||||
|
|
||||||
// Update window with OpenGL rendering
|
// Update window with OpenGL rendering
|
||||||
SDL_GL_SwapWindow(m_window);
|
SDL_GL_SwapWindow(m_window);
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,6 +32,8 @@ class Application : public Singleton<Application>
|
||||||
|
|
||||||
friend class Singleton<Application>;
|
friend class Singleton<Application>;
|
||||||
private:
|
private:
|
||||||
|
int m_width, m_height;
|
||||||
|
|
||||||
Camera* m_camera;
|
Camera* m_camera;
|
||||||
SDL_Window* m_window;
|
SDL_Window* m_window;
|
||||||
SDL_Event m_event;
|
SDL_Event m_event;
|
||||||
|
|
|
@ -16,6 +16,8 @@
|
||||||
|
|
||||||
#include "Camera.h"
|
#include "Camera.h"
|
||||||
|
|
||||||
|
#include "util/Log.h"
|
||||||
|
|
||||||
// TODO: use Roll
|
// TODO: use Roll
|
||||||
|
|
||||||
Camera::Camera(glm::vec3 position, glm::vec3 up, GLfloat yaw, GLfloat pitch, GLfloat roll) :
|
Camera::Camera(glm::vec3 position, glm::vec3 up, GLfloat yaw, GLfloat pitch, GLfloat roll) :
|
||||||
|
|
|
@ -87,7 +87,7 @@ Shader& Shader::createShader(const string& vertexShaderFilePath, const string& f
|
||||||
{
|
{
|
||||||
fatalError("Fragment shader failed to be created!");
|
fatalError("Fragment shader failed to be created!");
|
||||||
}
|
}
|
||||||
|
|
||||||
Shader::compileShader(vertexShaderFilePath, shader->m_vertexShaderID);
|
Shader::compileShader(vertexShaderFilePath, shader->m_vertexShaderID);
|
||||||
Shader::compileShader(fragmentShaderFilePath, shader->m_fragmentShaderID);
|
Shader::compileShader(fragmentShaderFilePath, shader->m_fragmentShaderID);
|
||||||
|
|
||||||
|
@ -171,6 +171,7 @@ void Shader::setAttribute(const std::string& name,
|
||||||
glEnableVertexAttribArray(loc);
|
glEnableVertexAttribArray(loc);
|
||||||
glVertexAttribPointer(loc, size, type, normalized, stride * sizeof(GLfloat),
|
glVertexAttribPointer(loc, size, type, normalized, stride * sizeof(GLfloat),
|
||||||
(void*)(offset * sizeof(GLfloat)));
|
(void*)(offset * sizeof(GLfloat)));
|
||||||
|
|
||||||
m_attributes[name].size = size;
|
m_attributes[name].size = size;
|
||||||
m_attributes[name].normalized = normalized;
|
m_attributes[name].normalized = normalized;
|
||||||
m_attributes[name].stride = stride;
|
m_attributes[name].stride = stride;
|
||||||
|
@ -285,25 +286,9 @@ void Shader::use()
|
||||||
if (!m_valid)
|
if (!m_valid)
|
||||||
{
|
{
|
||||||
m_valid = true;
|
m_valid = true;
|
||||||
glLinkProgram(m_programID);
|
|
||||||
|
|
||||||
start();
|
start();
|
||||||
|
|
||||||
GLint result;
|
|
||||||
glGetProgramiv(m_programID, GL_LINK_STATUS, &result);
|
|
||||||
|
|
||||||
if (result != GL_TRUE)
|
|
||||||
{
|
|
||||||
logError("Shader relink failed!");
|
|
||||||
GLsizei maxLength = 0;
|
|
||||||
glGetProgramiv(m_programID, GL_INFO_LOG_LENGTH, &maxLength);
|
|
||||||
|
|
||||||
char* log = new char[maxLength];
|
|
||||||
glGetProgramInfoLog(m_programID, maxLength, &maxLength, log);
|
|
||||||
|
|
||||||
std::printf("%s\n", log);
|
|
||||||
}
|
|
||||||
|
|
||||||
glBindVertexArray(vao);
|
glBindVertexArray(vao);
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, vbo);
|
glBindBuffer(GL_ARRAY_BUFFER, vbo);
|
||||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);
|
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);
|
||||||
|
|
Loading…
Reference in New Issue