add OuputDevice as singleton to manage output to statusbar,
This commit is contained in:
parent
96b7d6f736
commit
98302664ca
|
@ -1,5 +1,4 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
#include <QObject>
|
|
||||||
#include <QOpenGlTexture>
|
#include <QOpenGlTexture>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <QVector>
|
#include <QVector>
|
||||||
|
@ -7,7 +6,6 @@
|
||||||
#include <QMatrix4x4>
|
#include <QMatrix4x4>
|
||||||
#include <QQuaternion>
|
#include <QQuaternion>
|
||||||
#include <QRegExp>
|
#include <QRegExp>
|
||||||
#include "MainWindow.h"
|
|
||||||
|
|
||||||
struct BoundingBox {
|
struct BoundingBox {
|
||||||
QQuaternion rotation;
|
QQuaternion rotation;
|
||||||
|
@ -54,14 +52,12 @@ struct Material {
|
||||||
std::uint8_t dataValues[2] = { 0 };
|
std::uint8_t dataValues[2] = { 0 };
|
||||||
};
|
};
|
||||||
|
|
||||||
class FileInterface : public QObject
|
class FileInterface
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit FileInterface(QString path, QObject *parent)
|
explicit FileInterface(QString path)
|
||||||
: QObject(parent)
|
: m_models(new QVector<Model*>)
|
||||||
, m_models(new QVector<Model*>)
|
|
||||||
, m_materials(new QVector<Material>)
|
, m_materials(new QVector<Material>)
|
||||||
{
|
{
|
||||||
//open file
|
//open file
|
||||||
|
@ -70,10 +66,6 @@ public:
|
||||||
if (!m_file.is_open())
|
if (!m_file.is_open())
|
||||||
throw std::invalid_argument(std::string("ERROR: file not found: ") += path.toStdString());
|
throw std::invalid_argument(std::string("ERROR: file not found: ") += path.toStdString());
|
||||||
|
|
||||||
MainWindow* tmp = dynamic_cast<MainWindow*>(parent->parent()->parent());
|
|
||||||
if(tmp != NULL)
|
|
||||||
connect(this, SIGNAL(sendMessage(QString, int)), tmp, SLOT(printMessage(QString, int)));
|
|
||||||
|
|
||||||
m_filepath = path.left(path.lastIndexOf(QRegExp("/|\\\\")));
|
m_filepath = path.left(path.lastIndexOf(QRegExp("/|\\\\")));
|
||||||
|
|
||||||
};
|
};
|
||||||
|
@ -138,6 +130,4 @@ public:
|
||||||
return defMaterial;
|
return defMaterial;
|
||||||
};
|
};
|
||||||
|
|
||||||
signals:
|
|
||||||
void sendMessage(QString msg, int severity);
|
|
||||||
};
|
};
|
|
@ -46,7 +46,6 @@ public slots:
|
||||||
// signals
|
// signals
|
||||||
signals:
|
signals:
|
||||||
void requestResetView();
|
void requestResetView();
|
||||||
void sendMessage(QString message, int severity);
|
|
||||||
void requestUpdate();
|
void requestUpdate();
|
||||||
void sendFileInfo(QString name, QVector<Material>* materials, int vertices, int triangle);
|
void sendFileInfo(QString name, QVector<Material>* materials, int vertices, int triangle);
|
||||||
};
|
};
|
||||||
|
|
|
@ -20,7 +20,7 @@ enum ModelTyp {
|
||||||
class MshFile : public FileInterface
|
class MshFile : public FileInterface
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
explicit MshFile(QString path, QObject *parent = Q_NULLPTR);
|
explicit MshFile(QString path);
|
||||||
virtual ~MshFile();
|
virtual ~MshFile();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -91,7 +91,6 @@ public slots:
|
||||||
|
|
||||||
// signals
|
// signals
|
||||||
signals:
|
signals:
|
||||||
void sendMessage(QString message, int severity);
|
|
||||||
void loadFile(QString);
|
void loadFile(QString);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,27 @@
|
||||||
|
#pragma once
|
||||||
|
#include <QObject>
|
||||||
|
|
||||||
|
class OutputDevice : public QObject
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
private:
|
||||||
|
OutputDevice(QObject *parent = Q_NULLPTR) : QObject(parent) {};
|
||||||
|
|
||||||
|
public:
|
||||||
|
OutputDevice(OutputDevice const&) = delete;
|
||||||
|
void operator=(OutputDevice const&) = delete;
|
||||||
|
|
||||||
|
~OutputDevice() {};
|
||||||
|
|
||||||
|
static OutputDevice* getInstance(QObject *parent = Q_NULLPTR) {
|
||||||
|
static OutputDevice* instance = new OutputDevice(parent);
|
||||||
|
return instance;
|
||||||
|
};
|
||||||
|
|
||||||
|
void print(QString message, int severity) { emit sendMessage(message, severity); };
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void sendMessage(QString message, int severity);
|
||||||
|
|
||||||
|
};
|
|
@ -2,6 +2,7 @@
|
||||||
#include "..\Header\MshFile.h"
|
#include "..\Header\MshFile.h"
|
||||||
#include "..\Header\OglViewerWidget.h"
|
#include "..\Header\OglViewerWidget.h"
|
||||||
#include "..\Header\MainWindow.h"
|
#include "..\Header\MainWindow.h"
|
||||||
|
#include "..\Header\OutputDevice.h"
|
||||||
#include <QRegExp>
|
#include <QRegExp>
|
||||||
|
|
||||||
|
|
||||||
|
@ -154,7 +155,7 @@ void GeometryEngine::loadFile(QString filePath)
|
||||||
|
|
||||||
//reset view
|
//reset view
|
||||||
emit requestResetView();
|
emit requestResetView();
|
||||||
emit sendMessage("loading file..", 0);
|
OutputDevice::getInstance()->print("loading file..", 0);
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
@ -163,7 +164,7 @@ void GeometryEngine::loadFile(QString filePath)
|
||||||
QVector<GLuint> indexData;
|
QVector<GLuint> indexData;
|
||||||
|
|
||||||
// open file and get the information
|
// open file and get the information
|
||||||
MshFile file(filePath, this);
|
MshFile file(filePath);
|
||||||
|
|
||||||
models = file.getModels();
|
models = file.getModels();
|
||||||
m_materials = file.getMaterials();
|
m_materials = file.getMaterials();
|
||||||
|
@ -213,13 +214,13 @@ void GeometryEngine::loadFile(QString filePath)
|
||||||
m_indexBuf.allocate(indexData.data(), indexData.size() * sizeof(GLuint));
|
m_indexBuf.allocate(indexData.data(), indexData.size() * sizeof(GLuint));
|
||||||
|
|
||||||
emit requestUpdate();
|
emit requestUpdate();
|
||||||
emit sendMessage("done..", 0);
|
OutputDevice::getInstance()->print("done..", 0);
|
||||||
emit sendFileInfo(filePath.right(filePath.size() - filePath.lastIndexOf(QRegExp("/|\\\\")) - 1), m_materials, vertexData.size(), indexData.size() / 3);
|
emit sendFileInfo(filePath.right(filePath.size() - filePath.lastIndexOf(QRegExp("/|\\\\")) - 1), m_materials, vertexData.size(), indexData.size() / 3);
|
||||||
}
|
}
|
||||||
catch (std::invalid_argument e)
|
catch (std::invalid_argument e)
|
||||||
{
|
{
|
||||||
clearData();
|
clearData();
|
||||||
emit sendMessage(QString(e.what()), 2);
|
OutputDevice::getInstance()->print(QString(e.what()), 2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
#include "..\Header\MainWindow.h"
|
#include "..\Header\MainWindow.h"
|
||||||
#include "..\Header\OglViewerWidget.h"
|
#include "..\Header\OglViewerWidget.h"
|
||||||
#include "..\Header\FileInterface.h"
|
#include "..\Header\FileInterface.h"
|
||||||
|
#include "..\Header\OutputDevice.h"
|
||||||
#include <QSurfaceFormat>
|
#include <QSurfaceFormat>
|
||||||
#include <QSignalMapper>
|
#include <QSignalMapper>
|
||||||
#include <QToolButton>
|
#include <QToolButton>
|
||||||
|
@ -29,7 +30,7 @@ MainWindow::MainWindow(QWidget *parent)
|
||||||
setWindowTitle(WINDOW_NAME);
|
setWindowTitle(WINDOW_NAME);
|
||||||
setWindowIcon(QIcon(":/images/icon.ico"));
|
setWindowIcon(QIcon(":/images/icon.ico"));
|
||||||
|
|
||||||
printMessage("MeshViewer by Anakin", 0);
|
connect(OutputDevice::getInstance(this), &OutputDevice::sendMessage, this, &MainWindow::printMessage);
|
||||||
|
|
||||||
// setup opengl things
|
// setup opengl things
|
||||||
QSurfaceFormat format;
|
QSurfaceFormat format;
|
||||||
|
@ -49,6 +50,8 @@ MainWindow::MainWindow(QWidget *parent)
|
||||||
QFile styleSheet(":/files/StyleSheet.txt");
|
QFile styleSheet(":/files/StyleSheet.txt");
|
||||||
styleSheet.open(QIODevice::ReadOnly);
|
styleSheet.open(QIODevice::ReadOnly);
|
||||||
this->setStyleSheet(styleSheet.readAll());
|
this->setStyleSheet(styleSheet.readAll());
|
||||||
|
|
||||||
|
printMessage("MeshViewer by Anakin", 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
MainWindow::~MainWindow()
|
MainWindow::~MainWindow()
|
||||||
|
@ -67,7 +70,6 @@ void MainWindow::setupWidgets()
|
||||||
// Ogl Viewer
|
// Ogl Viewer
|
||||||
OglViewerWidget* viewer = new OglViewerWidget(this);
|
OglViewerWidget* viewer = new OglViewerWidget(this);
|
||||||
setCentralWidget(viewer);
|
setCentralWidget(viewer);
|
||||||
connect(viewer, &OglViewerWidget::sendMessage, this, &MainWindow::printMessage);
|
|
||||||
|
|
||||||
// open file
|
// open file
|
||||||
QToolButton *openFile = new QToolButton(this);
|
QToolButton *openFile = new QToolButton(this);
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
#include "..\Header\MshFile.h"
|
#include "..\Header\MshFile.h"
|
||||||
#include "..\Header\tga.h"
|
#include "..\Header\tga.h"
|
||||||
|
#include "..\Header\OutputDevice.h"
|
||||||
#include <QColor>
|
#include <QColor>
|
||||||
|
|
||||||
// helper function to save data from file to any variable type
|
// helper function to save data from file to any variable type
|
||||||
|
@ -9,8 +10,8 @@
|
||||||
/////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////
|
||||||
// public constructor/destructor
|
// public constructor/destructor
|
||||||
|
|
||||||
MshFile::MshFile(QString path, QObject * parent)
|
MshFile::MshFile(QString path)
|
||||||
: FileInterface(path, parent)
|
: FileInterface(path)
|
||||||
{
|
{
|
||||||
import();
|
import();
|
||||||
}
|
}
|
||||||
|
@ -89,7 +90,7 @@ void MshFile::loadChunks(std::list<ChunkHeader*>& destination, std::streampos st
|
||||||
// out of file. Maybe a size information is corrupted
|
// out of file. Maybe a size information is corrupted
|
||||||
if (!m_file.good())
|
if (!m_file.good())
|
||||||
{
|
{
|
||||||
emit sendMessage("WARNING: corrupted file. Trying to continue..", 1);
|
OutputDevice::getInstance()->print("WARNING: corrupted file. Trying to continue..", 1);
|
||||||
m_file.clear();
|
m_file.clear();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -506,7 +507,7 @@ void MshFile::analyseSegmChunks(Model * dataDestination, std::list<ChunkHeader*>
|
||||||
|
|
||||||
if (tmp_size < (unsigned) new_segment->vertices.size())
|
if (tmp_size < (unsigned) new_segment->vertices.size())
|
||||||
{
|
{
|
||||||
emit sendMessage("WARNING: too less normals " + QString::number(tmp_size) + " < " + QString::number(new_segment->vertices.size()), 1);
|
OutputDevice::getInstance()->print("WARNING: too less normals " + QString::number(tmp_size) + " < " + QString::number(new_segment->vertices.size()), 1);
|
||||||
|
|
||||||
for (unsigned int i = new_segment->vertices.size(); i != tmp_size; i--)
|
for (unsigned int i = new_segment->vertices.size(); i != tmp_size; i--)
|
||||||
for (unsigned int j = 0; j < 3; j++)
|
for (unsigned int j = 0; j < 3; j++)
|
||||||
|
@ -514,7 +515,7 @@ void MshFile::analyseSegmChunks(Model * dataDestination, std::list<ChunkHeader*>
|
||||||
}
|
}
|
||||||
else if (tmp_size > (unsigned) new_segment->vertices.size())
|
else if (tmp_size > (unsigned) new_segment->vertices.size())
|
||||||
{
|
{
|
||||||
emit sendMessage("WARNING: too many normals " + QString::number(tmp_size) + " > " + QString::number(new_segment->vertices.size()), 1);
|
OutputDevice::getInstance()->print("WARNING: too many normals " + QString::number(tmp_size) + " > " + QString::number(new_segment->vertices.size()), 1);
|
||||||
tmp_size = new_segment->vertices.size();
|
tmp_size = new_segment->vertices.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -698,7 +699,7 @@ void MshFile::readUV(Segment * dataDestination, std::streampos position)
|
||||||
|
|
||||||
if (tmp_size < (unsigned) dataDestination->vertices.size())
|
if (tmp_size < (unsigned) dataDestination->vertices.size())
|
||||||
{
|
{
|
||||||
emit sendMessage("WARNING: too less UVs " + QString::number(tmp_size) + " < " + QString::number(dataDestination->vertices.size()),1);
|
OutputDevice::getInstance()->print("WARNING: too less UVs " + QString::number(tmp_size) + " < " + QString::number(dataDestination->vertices.size()),1);
|
||||||
|
|
||||||
for (unsigned int i = dataDestination->vertices.size(); i != tmp_size; i--)
|
for (unsigned int i = dataDestination->vertices.size(); i != tmp_size; i--)
|
||||||
for (unsigned int j = 0; j < 2; j++)
|
for (unsigned int j = 0; j < 2; j++)
|
||||||
|
@ -706,7 +707,7 @@ void MshFile::readUV(Segment * dataDestination, std::streampos position)
|
||||||
}
|
}
|
||||||
else if (tmp_size > (unsigned) dataDestination->vertices.size())
|
else if (tmp_size > (unsigned) dataDestination->vertices.size())
|
||||||
{
|
{
|
||||||
emit sendMessage("WARNING: too many UVs " + QString::number(tmp_size) + " > " + QString::number(dataDestination->vertices.size()), 1);
|
OutputDevice::getInstance()->print("WARNING: too many UVs " + QString::number(tmp_size) + " > " + QString::number(dataDestination->vertices.size()), 1);
|
||||||
tmp_size = dataDestination->vertices.size();
|
tmp_size = dataDestination->vertices.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -722,7 +723,7 @@ void MshFile::loadTexture(QOpenGLTexture *& destination, QString filepath, QStri
|
||||||
|
|
||||||
if (!loadSuccess)
|
if (!loadSuccess)
|
||||||
{
|
{
|
||||||
emit sendMessage("WARNING: texture not found or corrupted: " + filename, 1);
|
OutputDevice::getInstance()->print("WARNING: texture not found or corrupted: " + filename, 1);
|
||||||
|
|
||||||
img = QImage(1, 1, QImage::Format_RGB32);
|
img = QImage(1, 1, QImage::Format_RGB32);
|
||||||
img.fill(QColor(m_materials->back().diffuseColor[0] * 255, m_materials->back().diffuseColor[1] * 255, m_materials->back().diffuseColor[2] * 255));
|
img.fill(QColor(m_materials->back().diffuseColor[0] * 255, m_materials->back().diffuseColor[1] * 255, m_materials->back().diffuseColor[2] * 255));
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
#include "..\Header\OglViewerWidget.h"
|
#include "..\Header\OglViewerWidget.h"
|
||||||
|
#include "..\Header\OutputDevice.h"
|
||||||
#include <QMouseEvent>
|
#include <QMouseEvent>
|
||||||
#include <QDropEvent>
|
#include <QDropEvent>
|
||||||
#include <QMimeData>
|
#include <QMimeData>
|
||||||
|
@ -65,7 +65,6 @@ void OglViewerWidget::setConnections()
|
||||||
connect(m_dataEngine, &GeometryEngine::requestResetView, this, &OglViewerWidget::resetView);
|
connect(m_dataEngine, &GeometryEngine::requestResetView, this, &OglViewerWidget::resetView);
|
||||||
connect(parentWidget(), SIGNAL(loadFile(QString)), m_dataEngine, SLOT(loadFile(QString)));
|
connect(parentWidget(), SIGNAL(loadFile(QString)), m_dataEngine, SLOT(loadFile(QString)));
|
||||||
connect(this, SIGNAL(loadFile(QString)), m_dataEngine, SLOT(loadFile(QString)));
|
connect(this, SIGNAL(loadFile(QString)), m_dataEngine, SLOT(loadFile(QString)));
|
||||||
connect(m_dataEngine, SIGNAL(sendMessage(QString, int)), parentWidget(), SLOT(printMessage(QString, int)));
|
|
||||||
connect(m_dataEngine, SIGNAL(requestUpdate()), this, SLOT(update()));
|
connect(m_dataEngine, SIGNAL(requestUpdate()), this, SLOT(update()));
|
||||||
connect(m_dataEngine, SIGNAL(sendFileInfo(QString, QVector<Material>*, int, int)), parentWidget(), SLOT(setFileInfo(QString, QVector<Material>*, int, int)));
|
connect(m_dataEngine, SIGNAL(sendFileInfo(QString, QVector<Material>*, int, int)), parentWidget(), SLOT(setFileInfo(QString, QVector<Material>*, int, int)));
|
||||||
}
|
}
|
||||||
|
@ -308,12 +307,12 @@ void OglViewerWidget::keyPressEvent(QKeyEvent *e)
|
||||||
{
|
{
|
||||||
m_zSpeed -= 0.1;
|
m_zSpeed -= 0.1;
|
||||||
m_zSpeed < 0.09 ? m_zSpeed = 0 : NULL;
|
m_zSpeed < 0.09 ? m_zSpeed = 0 : NULL;
|
||||||
emit sendMessage(QString("Zoom speed = %1%").arg(m_zSpeed * 100), 0);
|
OutputDevice::getInstance()->print(QString("Zoom speed = %1%").arg(m_zSpeed * 100), 0);
|
||||||
}
|
}
|
||||||
else if (e->key() == Qt::Key_Plus)
|
else if (e->key() == Qt::Key_Plus)
|
||||||
{
|
{
|
||||||
m_zSpeed += 0.1;
|
m_zSpeed += 0.1;
|
||||||
emit sendMessage(QString("Zoom speed = %1%").arg(m_zSpeed * 100), 0);
|
OutputDevice::getInstance()->print(QString("Zoom speed = %1%").arg(m_zSpeed * 100), 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue