SparrowRenderer/myglwidget.cpp
2015-06-30 18:51:32 +02:00

126 lines
3.1 KiB
C++

#include <glew/glew.h>
#include "myglwidget.h"
#include "scene.h"
#include "glassert.h"
#include "camera.h"
#include "sphere.h"
#include "phongmaterial.h"
#include "skybox.h"
#include "utils.h"
#include "texture.h"
#include <iostream>
#include <glm/glm.hpp>
#include <QKeyEvent>
#include <QMouseEvent>
MyGLWidget::MyGLWidget(QWidget *parent) :
QGLWidget(parent),
scene(NULL)
{}
MyGLWidget::~MyGLWidget()
{
if(scene != NULL)
delete(scene);
}
void MyGLWidget::initializeGL()
{
makeCurrent();
GLenum err = glewInit(); // init and check glew
if (GLEW_OK != err)
{
std::cerr << "Warning: glewInit failed!" << std::endl;
}
if (!GLEW_ARB_vertex_program ||
!GLEW_ARB_fragment_program ||
!GLEW_ARB_texture_float ||
!GLEW_ARB_draw_buffers ||
!GLEW_ARB_framebuffer_object)
{
std::cerr << "Warning: Shaders not supported!" << std::endl;
}
std::cout << "OpenGL version " << glGetString(GL_VERSION) << std::endl;
std::cout << "GLSL version " << glGetString(GL_SHADING_LANGUAGE_VERSION) << std::endl;
std::cout.flush();
glAssert(glEnable(GL_DEPTH_TEST));
glAssert(glEnable(GL_CULL_FACE));
glAssert(glEnable(GL_TEXTURE_2D));
glAssert(glViewport(0, 0, width(), height()));
buildScene();
controller.setScene(scene);
}
void MyGLWidget::buildScene()
{
scene = new Scene();
Camera* cam = new Camera(width(), height());
cam->moveTo(glm::vec3(-1, 0, 0));
cam->lookAt(glm::vec3(0, 0, 0));
scene->setCamera(cam);
Mesh* myGrid = new Sphere(2);
myGrid->initGL();
QString vertSource = Utils::fileToString("../phong.vert");
QString fragSource = Utils::fileToString("../phong.frag");
Shader* shader = new Shader(&vertSource, &fragSource);
PhongMaterial* mat = new PhongMaterial(shader);
Texture* tex = new Texture("../data/noise.png");
mat->setTexture(tex);
QString filenames[6] = {
"../data/skybox_lf", "../data/skybox_rt",
"../data/skybox_up", "../data/skybox_dn",
"../data/skybox_bk", "../data/skybox_ft"
};
SkyBox* skybox = new SkyBox(filenames);
scene->addEntity(skybox);
scene->addEntity(myGrid, mat);
}
void MyGLWidget::resizeGL(int width, int height)
{
glAssert(glViewport(0, 0, width, height));
scene->getCamera()->resize(width, height);
updateGL();
}
void MyGLWidget::paintGL()
{
glAssert(glClearColor(0.60, 0.65, 0.75, 1.0));
glAssert(glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT));
scene->drawEntities();
}
void MyGLWidget::mouseMoveEvent(QMouseEvent *e)
{
controller.mouseMove(e->pos().x() - last.x(), e->pos().y() - last.y());
last = e->pos();
updateGL();
}
void MyGLWidget::mousePressEvent(QMouseEvent* e)
{
controller.mouseEvent(e->button(), true);
last = e->pos();
updateGL();
}
void MyGLWidget::mouseReleaseEvent(QMouseEvent* e)
{
controller.mouseEvent(e->button(), false);
updateGL();
}
void MyGLWidget::keyPressEvent(QKeyEvent *e)
{
controller.mouseEvent(e->key(), true);
updateGL();
}
void MyGLWidget::keyReleaseEvent(QKeyEvent *e)
{
controller.mouseEvent(e->key(), false);
updateGL();
}