#include #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 #include #include #include 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(); }