added scenecontroller

This commit is contained in:
Anselme 2015-06-27 00:03:34 +02:00
parent a36b607ccf
commit 61c6f97da3
9 changed files with 116 additions and 76 deletions

View File

@ -78,6 +78,6 @@ void Mesh::draw()
if(locked)
{
glAssert(glBindVertexArray(vao));
//glAssert(glDrawElements(GL_TRIANGLES, indices.size(), GL_UNSIGNED_INT, 0));
glAssert(glDrawElements(GL_TRIANGLES, indices.size(), GL_UNSIGNED_INT, indices.data()));
}
}

View File

@ -1,21 +1,24 @@
#include <glew/glew.h>
#include "myglwidget.h"
#include "sparrowrenderer.h"
#include "scene.h"
#include "glassert.h"
#include "camera.h"
#include "gridmesh.h"
#include "phongmaterial.h"
#include <iostream>
#include <glm/glm.hpp>
#include <QKeyEvent>
#include <QMouseEvent>
MyGLWidget::MyGLWidget(QWidget *parent) :
QGLWidget(parent),
renderer(NULL)
{
}
scene(NULL)
{}
MyGLWidget::~MyGLWidget()
{
if(renderer != NULL)
delete(renderer);
if(scene != NULL)
delete(scene);
}
void MyGLWidget::initializeGL()
@ -45,13 +48,25 @@ void MyGLWidget::initializeGL()
glAssert(glEnable(GL_TEXTURE_2D));
glAssert(glViewport(0, 0, width(), height()));
renderer = new SparrowRenderer(width(), height());
buildScene();
controller.setScene(scene);
}
void MyGLWidget::buildScene()
{
scene = new Scene();
scene->setCamera(new Camera(width(), height()));
Mesh* myGrid = new GridMesh(2, 2, false);
myGrid->initGL();
Shader* shader = new Shader(QString("../phong.vert"), QString("../phong.frag"));
Material* mat = new PhongMaterial(shader);
scene->addEntity(myGrid, mat);
}
void MyGLWidget::resizeGL(int width, int height)
{
glAssert(glViewport(0, 0, width, height));
renderer->resize(width, height);
scene->getCamera()->resize(width, height);
updateGL();
}
@ -59,5 +74,33 @@ void MyGLWidget::paintGL()
{
glAssert(glClearColor(0.60, 0.65, 0.75, 1.0));
glAssert(glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT));
renderer->render();
scene->drawEntities();
}
void MyGLWidget::mouseMoveEvent(QMouseEvent *e)
{
static QPoint* last = NULL;
if(last == NULL)
last = new QPoint(e->pos().x(), e->pos().y());
else
controller.mouseMove(e->pos().x() - last->x(), e->pos().y() - last->y());
*last = e->pos();
}
void MyGLWidget::mousePressEvent(QMouseEvent* e)
{
controller.mouseEvent(e->button(), true);
}
void MyGLWidget::mouseReleaseEvent(QMouseEvent* e)
{
controller.mouseEvent(e->button(), false);
}
void MyGLWidget::keyPressEvent(QKeyEvent *e)
{
controller.mouseEvent(e->key(), true);
}
void MyGLWidget::keyReleaseEvent(QKeyEvent *e)
{
controller.mouseEvent(e->key(), false);
}

View File

@ -1,9 +1,10 @@
#ifndef MYGLWIDGET_H
#define MYGLWIDGET_H
#include "scenecontroller.h"
#include <QGLWidget>
class SparrowRenderer;
class Scene;
namespace Ui {
class MyGLWidget;
@ -13,7 +14,8 @@ class MyGLWidget : public QGLWidget
{
Q_OBJECT
SparrowRenderer* renderer;
Scene* scene;
SceneController controller;
public:
explicit MyGLWidget(QWidget *parent = 0);
@ -21,8 +23,17 @@ public:
protected:
void initializeGL();
void buildScene();
void resizeGL(int width, int height);
void paintGL();
private:
// handle events
void mouseMoveEvent(QMouseEvent *e);
void mousePressEvent(QMouseEvent* e);
void mouseReleaseEvent(QMouseEvent* e);
void keyPressEvent(QKeyEvent *e);
void keyReleaseEvent(QKeyEvent *e);
};
#endif // MYGLWIDGET_H

View File

@ -32,6 +32,6 @@ vec3 computeLight(in vec3 kd, in vec3 ks, in float ns, in vec3 color, in vec3 no
void main(void) {
vec3 kd = vec3(texture2D(baseTexture, varTexCoord));
outColor = vec4(kd, 1);
outColor = vec4(1, 0, 0, 1);
}

24
scenecontroller.cpp Normal file
View File

@ -0,0 +1,24 @@
#include "scenecontroller.h"
#include "scene.h"
#include "camera.h"
void SceneController::setScene(Scene* myScene)
{
scene = myScene;
camera = scene->getCamera();
}
void SceneController::mouseMove(int dx, int dy)
{
}
void SceneController::mouseEvent(int button, bool state)
{
}
void SceneController::keyEvent(int key, bool state)
{
}

20
scenecontroller.h Normal file
View File

@ -0,0 +1,20 @@
#ifndef SCENECONTROLLER_H
#define SCENECONTROLLER_H
#include <QObject>
class Scene;
class Camera;
class SceneController
{
Camera* camera;
Scene* scene;
public:
void setScene(Scene* myScene);
void mouseMove(int dx, int dy);
void mouseEvent(int button, bool state);
void keyEvent(int key, bool state);
};
#endif // SCENECONTROLLER_H

View File

@ -25,24 +25,24 @@ SOURCES += main.cpp\
shader.cpp \
mesh.cpp \
camera.cpp \
sparrowrenderer.cpp \
scene.cpp \
gridmesh.cpp \
texture.cpp \
phongmaterial.cpp
phongmaterial.cpp \
scenecontroller.cpp
HEADERS += mainwindow.h \
myglwidget.h \
shader.h \
mesh.h \
camera.h \
sparrowrenderer.h \
glassert.h \
scene.h \
material.h \
gridmesh.h \
texture.h \
phongmaterial.h
phongmaterial.h \
scenecontroller.h
FORMS += mainwindow.ui

View File

@ -1,37 +0,0 @@
#include "sparrowrenderer.h"
#include "phongmaterial.h"
#include "shader.h"
#include "camera.h"
#include "scene.h"
#include "gridmesh.h"
#include "glassert.h"
#include <glew/glew.h>
#include <QString>
SparrowRenderer::SparrowRenderer(int width, int height)
{
scene = new Scene();
scene->setCamera(new Camera(width, height));
Mesh* myGrid = new GridMesh(2, 2, false);
myGrid->initGL();
Shader* shader = new Shader(QString("../phong.vert"), QString("../phong.frag"));
Material* mat = new PhongMaterial(shader);
scene->addEntity(myGrid, mat);
}
SparrowRenderer::~SparrowRenderer()
{
delete(scene->getCamera());
delete(scene);
}
void SparrowRenderer::resize(int width, int height)
{
scene->getCamera()->resize(width, height);
}
void SparrowRenderer::render()
{
// draw geometry
scene->drawEntities();
}

View File

@ -1,21 +0,0 @@
#ifndef SPARROWRENDERER_H
#define SPARROWRENDERER_H
class Camera;
class Shader;
class Scene;
class SparrowRenderer
{
Scene* scene;
public:
SparrowRenderer(int width, int height);
~SparrowRenderer();
void resize(int width, int height);
// Sparrow renderer's rendering pipeline
void render();
};
#endif // SPARROWRENDERER_H