#include "glm/glm.hpp"
#include "glm/gtc/matrix_transform.hpp"
#include "glm/gtc/type_ptr.hpp"
#include "LogicalEngine.hpp"
LogicalEngine::LogicalEngine() : wnd(800, 600, "Hello World"), vertices_buffer(2)
{
shaders_init();
///
glClearColor(1.0f, 0.4f, 0.5f, 1.0f);
glEnable(GL_DEPTH_TEST);
GLfloat V[3 * 4] = {
0.0f, 0.0f, 1.0f,
0.0f, 1.0f, 1.0f,
1.0f, 1.0f, 1.0f,
1.0f, 0.0f, 1.0f
};
GLfloat P[3 * 4] = {
1.0f, 1.0f, 1.0f,
1.0f, 1.0f, 1.0f,
1.0f, 1.0f, 1.0f,
1.0f, 1.0f, 1.0f,
};
Vertices & vbuff = vertices_buffer.get_vertices_ref(0);
vbuff.add_vertices_data(V);
pos_loc = glGetAttribLocation(program1.get_program_id(), "inPos");
glVertexAttribPointer(pos_loc, 3, GL_FLOAT, GL_FALSE, 0, NULL);
Vertices & pbuff = vertices_buffer.get_vertices_ref(1);
pbuff.add_vertices_data(P);
col_loc = glGetAttribLocation(program1.get_program_id(), "inCol");
glVertexAttribPointer(col_loc, 3, GL_FLOAT, GL_FALSE, 0, NULL);
matrix_projection = glGetUniformLocation(program1.get_program_id(), "mp");
matrix_model = glGetUniformLocation(program1.get_program_id(), "mm");
matrix_view = glGetUniformLocation(program1.get_program_id(), "mv");
}
void LogicalEngine::shaders_init()
{
Shader shader1 = Shader::prepare_shader("test.vertex.glsl", GL_VERTEX_SHADER);
Shader shader2 = Shader::prepare_shader("test.fragment.glsl", GL_FRAGMENT_SHADER);
program1.attach_shader(shader1, "vertex1");
program1.attach_shader(shader2, "fragment1");
if(!(shader1.compile() && shader2.compile()))
{
exit(1);
}
program1.do_linking();
}
void LogicalEngine::main_loop()
{
sf::Event evt;
while(wnd.IsOpened())
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glClearDepth(1.0f);
glm::mat4 Projection = glm::perspective(60.0f, 4.0f/3.0f, -0.1f, 7.0f);
glm::mat4 View = glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 0.0f, -5.f));
glm::mat4 Model = glm::scale(glm::mat4(1.0f), glm::vec3(0.5f));
glEnableVertexAttribArray(pos_loc);
glEnableVertexAttribArray(col_loc);
program1.use();
glUniformMatrix4fv(matrix_projection, 1, GL_FALSE, glm::value_ptr(Projection));
glUniformMatrix4fv(matrix_view, 1, GL_FALSE, glm::value_ptr(View));
glUniformMatrix4fv(matrix_model, 1, GL_FALSE, glm::value_ptr(Model));
glDrawArrays(GL_QUADS, 0, 4);
ShaderProgram::use_no_program();
glDisableVertexAttribArray(col_loc);
glDisableVertexAttribArray(pos_loc);
while(wnd.GetEvent(evt))
{
switch(evt.Type)
{
case sf::Event::Closed:
exit(0);
case sf::Event::Resized:
glViewport(0, 0, evt.Size.Width, evt.Size.Height);
break;
default:
break;
}
}
glFlush();
wnd.Display();
sf::Sleep(0.5f);
}
}
LogicalEngine::~LogicalEngine()
{
}
//// SHADER:
#version 150
in vec4 inPos;
in vec4 inCol;
uniform mat4x4 mm;
uniform mat4x4 mp;
uniform mat4x4 mv;
out vec4 color;
void main(void)
{
gl_Position = mp * mm * mv * inPos;
//gl_Position = inPos;
color = inCol;
}