PixelWars/src/drawwidget.cpp
2016-06-02 21:45:28 +02:00

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);
}