#include #include "myglwidget.h" #include "glassert.h" #include "camera.h" #include "sphere.h" #include "phongmaterial.h" #include "skyboxmodule.h" #include "entity.h" #include "phongmodule.h" #include "resourcebase.h" #include "utils.h" #include "lights.h" #include "texture.h" #include "gridmesh.h" #include "sparrowrenderer.h" #include "focuscontroller.h" #include #include #include #include #include MyGLWidget::MyGLWidget(QWidget *parent) : QGLWidget(parent), renderer(NULL), controller(NULL) {} MyGLWidget::~MyGLWidget() { if(renderer != NULL) delete(renderer); if(controller != NULL) delete(controller); } void MyGLWidget::loadResources() { std::string filenames[6] = { "../data/skybox_ft", "../data/skybox_bk", "../data/skybox_up", "../data/skybox_dn", "../data/skybox_lf", "../data/skybox_rt" }; ResourceBase::setTexture("skybox", new Texture(filenames)); ResourceBase::setTexture("textureNoise", new Texture("../data/noise.png")); ResourceBase::setTexture("perlinNoise", new Texture()); ResourceBase::setMesh("grid", new GridMesh(10, 10, true)); ResourceBase::setMesh("sword", Utils::loadOBJ("../data/sword.obj")); ResourceBase::setMesh("sphere", new Sphere(4)); std::string vertSource = Utils::fileToString("../phong.vert"); std::string fragSource = Utils::fileToString("../phong.frag"); ResourceBase::setShader("phong", new Shader(vertSource, fragSource)); } void MyGLWidget::buildScene() { // camera positionning Camera* cam = renderer->getCamera(); cam->moveTo(glm::vec3(0, 0, 3)); cam->lookAt(glm::vec2(0, 0)); // create skybox module SkyboxModule* skybox = new SkyboxModule(ResourceBase::getTexture("skybox")); renderer->addModule(skybox); // create phong module Lights* directionnalLights = new Lights(); Lights* pointLights = new Lights(); directionnalLights->addLight(glm::vec3(6, 4, -4), glm::vec3(0.7f, 0.6f, 0.4f)); // sun PhongModule* myPhongModule = new PhongModule(directionnalLights, pointLights, ResourceBase::getShader("phong")); renderer->addModule(myPhongModule); // create a material PhongMaterial* mat = new PhongMaterial(glm::vec3(1), glm::vec3(1), 20.0f); mat->setTexture(ResourceBase::getTexture("textureNoise")); ResourceBase::setMaterial("basicMat", mat); // create an entity Mesh* myMesh = ResourceBase::getMesh("sphere"); myMesh->initGL(); Entity* myEntity = new Entity(myMesh, ResourceBase::getMaterial("basicMat")); glm::mat4* transform = myEntity->getTransform(); *transform = glm::rotate(*transform, 100.0f, glm::vec3(0, 1, 0)); myPhongModule->addEntity(myEntity); } void MyGLWidget::initializeGL() { if(renderer != NULL) delete(renderer); renderer = new SparrowRenderer(width(), height()); loadResources(); buildScene(); controller = new FocusController(new glm::vec3(0)); controller->setCamera(renderer->getCamera()); } void MyGLWidget::resizeGL(int width, int height) { renderer->resize(width, height); updateGL(); } void MyGLWidget::paintGL() { renderer->render(); } 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::wheelEvent(QWheelEvent *e) { controller->mouseWheelEvent(e->delta()); updateGL(); } void MyGLWidget::keyPressEvent(QKeyEvent *e) { controller->mouseEvent(e->key(), true); updateGL(); } void MyGLWidget::keyReleaseEvent(QKeyEvent *e) { controller->mouseEvent(e->key(), false); updateGL(); }