147 lines
3.9 KiB
C++
147 lines
3.9 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 "resourcebase.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::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();
|
|
}
|