156 lines
3.2 KiB
C++
156 lines
3.2 KiB
C++
#include "drawwidget.h"
|
|
#include <QKeyEvent>
|
|
#include <QMouseEvent>
|
|
#include <pipeline.h>
|
|
#include <shadersource.h>
|
|
#include <framebuffer.h>
|
|
#include <resource.h>
|
|
#include <glm/ext.hpp>
|
|
#include "mapscene.h"
|
|
#include "simulation.h"
|
|
#include "pixelpipeline.h"
|
|
#include <QCoreApplication>
|
|
|
|
DrawWidget::DrawWidget(QWidget *parent) :
|
|
QOpenGLWidget(parent),
|
|
m_Qt_fbo(NULL),
|
|
m_pipeline(NULL)
|
|
{
|
|
new_simulation = false;
|
|
update_needed = false;
|
|
m_map = NULL;
|
|
}
|
|
|
|
DrawWidget::~DrawWidget()
|
|
{
|
|
if(m_pipeline != NULL)
|
|
delete m_pipeline;
|
|
if(m_Qt_fbo != NULL && m_Qt_fbo != FrameBuffer::screen)
|
|
delete(m_Qt_fbo);
|
|
}
|
|
|
|
void DrawWidget::initializeGL()
|
|
{
|
|
renderer.initGL(width(), height());
|
|
stopSimulation();
|
|
}
|
|
|
|
void DrawWidget::paintGL()
|
|
{
|
|
if(new_simulation)
|
|
{
|
|
if(m_pipeline != NULL)
|
|
delete m_pipeline;
|
|
m_map->initDraw();
|
|
m_pipeline = new PixelPipeline(m_map);
|
|
if(m_map == m_dummyMap)
|
|
m_pipeline->setShowToreiller(false);
|
|
m_pipeline->setTargetFBO(m_Qt_fbo);
|
|
m_pipeline->resizeGL(m_width, m_height);
|
|
renderer.setScene(m_map);
|
|
new_simulation = false;
|
|
}
|
|
else if(update_needed)
|
|
{
|
|
m_pipeline->updateChanges();
|
|
update_needed = false;
|
|
}
|
|
renderer.renderGL();
|
|
}
|
|
|
|
void DrawWidget::updateDudesBehavior()
|
|
{
|
|
update_needed = true;
|
|
}
|
|
|
|
void DrawWidget::resizeGL(int w, int h)
|
|
{
|
|
m_width = w;
|
|
m_height = h;
|
|
renderer.resizeGL(w, h);
|
|
if(m_Qt_fbo != NULL && m_Qt_fbo != FrameBuffer::screen)
|
|
delete(m_Qt_fbo);
|
|
m_Qt_fbo = new FrameBuffer(defaultFramebufferObject());
|
|
if(m_pipeline != NULL)
|
|
m_pipeline->setTargetFBO(m_Qt_fbo);
|
|
}
|
|
|
|
void DrawWidget::startSimulation(MapScene *map)
|
|
{
|
|
m_map = map;
|
|
new_simulation = true;
|
|
m_dummyMap = NULL;
|
|
repaint();
|
|
}
|
|
|
|
void DrawWidget::stopSimulation()
|
|
{
|
|
m_map = m_dummyMap = new MapScene();
|
|
new_simulation = true;
|
|
repaint();
|
|
}
|
|
|
|
// INPUT EVENTS
|
|
|
|
void DrawWidget::mouseMoveEvent(QMouseEvent *event)
|
|
{
|
|
if(grabbedMouse && m_pipeline != NULL)
|
|
{
|
|
m_pipeline->cameraMove(event->globalX() - lastMousePos.x(), event->globalY() - lastMousePos.y());
|
|
repaint();
|
|
}
|
|
lastMousePos = event->globalPos();
|
|
}
|
|
|
|
void DrawWidget::mousePressEvent(QMouseEvent* event)
|
|
{
|
|
switch(event->button())
|
|
{
|
|
case Qt::LeftButton :
|
|
grabbedMouse = true;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
lastMousePos = event->globalPos();
|
|
}
|
|
|
|
void DrawWidget::mouseDoubleClickEvent(QMouseEvent * event)
|
|
{
|
|
|
|
}
|
|
|
|
void DrawWidget::mouseReleaseEvent(QMouseEvent* event)
|
|
{
|
|
switch(event->button())
|
|
{
|
|
case Qt::LeftButton :
|
|
grabbedMouse = false;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
void DrawWidget::wheelEvent(QWheelEvent *event)
|
|
{
|
|
if(m_pipeline != NULL)
|
|
{
|
|
m_pipeline->cameraZoom(event->delta());
|
|
repaint();
|
|
}
|
|
}
|
|
|
|
void DrawWidget::setFlatSphere(int value)
|
|
{
|
|
if(m_pipeline != NULL)
|
|
m_pipeline->setFlatSphere(float(value)/100);
|
|
}
|
|
|
|
void DrawWidget::setSurfaceRatio(int value)
|
|
{
|
|
float fVal = float(value-50);
|
|
if(m_pipeline != NULL)
|
|
m_pipeline->setSurfaceRatio(fVal > 0 ? fVal/25 : fVal/60);
|
|
}
|