SparrowRenderer/myglwidget.cpp
2015-07-06 21:46:17 +02:00

135 lines
3.4 KiB
C++

#include <glew/glew.h>
#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 "utils.h"
#include "lights.h"
#include "texture.h"
#include "gridmesh.h"
#include "sparrowrenderer.h"
#include "focuscontroller.h"
#include <iostream>
#include <glm/glm.hpp>
#include <glm/ext.hpp>
#include <QKeyEvent>
#include <QMouseEvent>
MyGLWidget::MyGLWidget(QWidget *parent) :
QGLWidget(parent),
renderer(NULL),
controller(NULL)
{}
MyGLWidget::~MyGLWidget()
{
if(renderer != NULL)
delete(renderer);
if(controller != NULL)
delete(controller);
}
void MyGLWidget::buildScene()
{
// init camera
Camera* cam = renderer->getCamera();
cam->moveTo(glm::vec3(0, 0, 3));
cam->lookAt(glm::vec2(0, 0));
// create skybox module
std::string filenames[6] = {
"../data/skybox_ft", "../data/skybox_bk",
"../data/skybox_up", "../data/skybox_dn",
"../data/skybox_lf", "../data/skybox_rt"
};
Texture* skyboxCubemap = new Texture(filenames);
SkyboxModule* skybox = new SkyboxModule(skyboxCubemap);
// create a mesh
//Mesh* myMesh = new GridMesh(10, 10, true);
//Mesh* myMesh = Utils::loadOBJ("../data/sword.obj");
Mesh* myMesh = new Sphere(4);
myMesh->initGL();
std::string vertSource = Utils::fileToString("../phong.vert");
std::string fragSource = Utils::fileToString("../phong.frag");
Shader* phongShader = new Shader(vertSource, fragSource);
PhongMaterial* mat = new PhongMaterial(phongShader, glm::vec3(1), glm::vec3(1), 20.0f);
Texture* tex = new Texture(); //new Texture("../data/noise.png");
mat->setTexture(tex);
Entity* myEntity = new Entity(myMesh, mat);
glm::mat4* transform = myEntity->getTransform();
//*transform = glm::scale(*transform, glm::vec3(0.01f));
Lights* directionnalLights = new Lights();
directionnalLights->addLight(glm::vec3(6, 4, -4), glm::vec3(0.7f, 0.6f, 0.4f)); // sun
PhongModule* myPhongModule = new PhongModule(directionnalLights, new Lights(), phongShader);
myPhongModule->addEntity(myEntity);
renderer->addModule(skybox);
renderer->addModule(myPhongModule);
}
void MyGLWidget::initializeGL()
{
if(renderer != NULL)
delete(renderer);
renderer = new SparrowRenderer(width(), height());
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();
}