#include "drawwidget.h" #include #include #include #include #include #include #include #include "mapscene.h" #include "simulation.h" #include "pixelpipeline.h" #include 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); }