diff --git a/QtMeshViewer/Header/FileInterface.h b/QtMeshViewer/Header/FileInterface.h index de60f45..0b9b792 100644 --- a/QtMeshViewer/Header/FileInterface.h +++ b/QtMeshViewer/Header/FileInterface.h @@ -3,6 +3,7 @@ #include #include #include +#include #include #include #include @@ -41,16 +42,16 @@ class FileInterface : public QObject Q_OBJECT public: - explicit FileInterface(const char* path, QObject *parent) + explicit FileInterface(QString path, QObject *parent) : QObject(parent) , m_models(new QVector) - , m_textureNames(new QVector) + , m_textureNames(new QStringList) { //open file - m_file.open(path, std::ios::in | std::ios::binary); + m_file.open(path.toStdString().c_str(), std::ios::in | std::ios::binary); if (!m_file.is_open()) - throw std::invalid_argument(std::string("ERROR: file not found: ") += path); + throw std::invalid_argument(std::string("ERROR: file not found: ") += path.toStdString()); MainWindow* tmp = dynamic_cast(parent->parent()->parent()); if(tmp != NULL) @@ -87,14 +88,14 @@ public: protected: QVector* m_models; std::fstream m_file; - QVector* m_textureNames; + QStringList* m_textureNames; BoundingBox m_sceneBbox; virtual void import() = 0; public: virtual QVector* getModels() const { return m_models; }; - virtual QVector* getTextureNames() const { return m_textureNames; }; + virtual QStringList* getTextureNames() const { return m_textureNames; }; virtual BoundingBox getBoundingBox() const { return m_sceneBbox; }; signals: diff --git a/QtMeshViewer/Header/GeometryEngine.h b/QtMeshViewer/Header/GeometryEngine.h index 631e52f..c96147c 100644 --- a/QtMeshViewer/Header/GeometryEngine.h +++ b/QtMeshViewer/Header/GeometryEngine.h @@ -29,16 +29,17 @@ private: QVector m_drawList; BoundingBox m_boundings; - void loadTexture(const char* filePath, const char* fileName); + void loadTexture(QString filePath, QString fileName); void clearData(); public slots: - void loadFile(const char* filePath); + void loadFile(QString filePath); void drawGeometry(QOpenGLShaderProgram *program); signals: void requestResetView(); void sendMessage(QString message, int severity); void requestUpdate(); + void sendFileInfo(QString name, QStringList textures, int vertices, int triangle); }; diff --git a/QtMeshViewer/Header/MainWindow.h b/QtMeshViewer/Header/MainWindow.h index 44fbb0f..de0e350 100644 --- a/QtMeshViewer/Header/MainWindow.h +++ b/QtMeshViewer/Header/MainWindow.h @@ -1,6 +1,8 @@ #pragma once #include +#include +#include #include "ui_MainWindow.h" class MainWindow : public QMainWindow @@ -15,6 +17,7 @@ private: Ui::MainWindowClass* ui; int m_curSeverity; void setupWidgets(); + QByteArray m_fileInfo; private slots: @@ -24,7 +27,8 @@ private slots: public slots: void printMessage(QString message, int severity); + void setFileInfo(QString name, QStringList textures, int vertices, int triangle); signals: - void loadFile(const char*); + void loadFile(QString); }; diff --git a/QtMeshViewer/Header/MshFile.h b/QtMeshViewer/Header/MshFile.h index cef8dc0..79a2bb6 100644 --- a/QtMeshViewer/Header/MshFile.h +++ b/QtMeshViewer/Header/MshFile.h @@ -20,7 +20,7 @@ enum ModelTyp { class MshFile : public FileInterface { public: - explicit MshFile(const char* path, QObject *parent = Q_NULLPTR); + explicit MshFile(QString path, QObject *parent = Q_NULLPTR); virtual ~MshFile(); private: diff --git a/QtMeshViewer/Header/OglViewerWidget.h b/QtMeshViewer/Header/OglViewerWidget.h index 0973d1f..91b8c38 100644 --- a/QtMeshViewer/Header/OglViewerWidget.h +++ b/QtMeshViewer/Header/OglViewerWidget.h @@ -22,7 +22,7 @@ public: ~OglViewerWidget(); signals: - void loadFile(const char*); + void loadFile(QString); private: struct { diff --git a/QtMeshViewer/Header/tga.h b/QtMeshViewer/Header/tga.h index 7011a2d..0c560bd 100644 --- a/QtMeshViewer/Header/tga.h +++ b/QtMeshViewer/Header/tga.h @@ -5,14 +5,14 @@ #include -QImage loadTga(const char* filePath, bool &success) +QImage loadTga(QString filePath, bool &success) { QImage img; if (!img.load(filePath)) { // open the file - std::fstream fsPicture(filePath, std::ios::in | std::ios::binary); + std::fstream fsPicture(filePath.toStdString().c_str(), std::ios::in | std::ios::binary); if (!fsPicture.is_open()) { diff --git a/QtMeshViewer/Source/GeometryEngine.cpp b/QtMeshViewer/Source/GeometryEngine.cpp index 83ada29..2c82955 100644 --- a/QtMeshViewer/Source/GeometryEngine.cpp +++ b/QtMeshViewer/Source/GeometryEngine.cpp @@ -4,6 +4,7 @@ #include "..\Header\MainWindow.h" #include "..\Header\tga.h" #include +#include ///////////////////////////////////////////////////////////////////////// @@ -25,106 +26,19 @@ GeometryEngine::~GeometryEngine() ///////////////////////////////////////////////////////////////////////// // private functions -void GeometryEngine::loadFile(const char* filePath) -{ - // cleanup old stuff and recreate buffers - clearData(); - m_arrayBuf.create(); - m_indexBuf.create(); - - //reset view - emit requestResetView(); - emit sendMessage("loading file..", 0); - - try - { - QVector* models; - QVector* textureNames; - QVector vertexData; - QVector indexData; - - // open file and get the information - MshFile file(filePath, this); - - models = file.getModels(); - textureNames = file.getTextureNames(); - m_boundings = file.getBoundingBox(); - - // collect data - unsigned int indexOffset(0); - unsigned int vertexOffset(0); - for (auto& modelIterator : *models) - { - for (auto& segmentIterator : modelIterator->segmList) - { - // get draw information - DrawInformation new_info; - new_info.offset = indexOffset; - new_info.size = segmentIterator->indices.size(); - new_info.textureIndex = segmentIterator->textureIndex; - new_info.modelMatrix = modelIterator->m4x4Translation; - new_info.modelMatrix.rotate(modelIterator->quadRotation); - - // add offset to indices, no need to do it for the first one (maybe it's very big) - if(vertexOffset != 0) - for (auto& it : segmentIterator->indices) - it += vertexOffset; - - // save data - vertexData += segmentIterator->vertices; - indexData += segmentIterator->indices; - m_drawList.push_back(new_info); - - // update offset - indexOffset += new_info.size; - vertexOffset += segmentIterator->vertices.size(); - } - } - - // Transfer vertex data to VBO 0 - m_arrayBuf.bind(); - m_arrayBuf.allocate(vertexData.data(), vertexData.size() * sizeof(VertexData)); - - // Transfer index data to VBO 1 - m_indexBuf.bind(); - m_indexBuf.allocate(indexData.data(), indexData.size() * sizeof(GLuint)); - - // get textures path - std::string path = filePath; - - while (path.back() != '/' && path.back() != '\\') - path.pop_back(); - - emit sendMessage("loading textures..", 0); - // load the textures - for(auto& it : *textureNames) - loadTexture(path.c_str(), it.c_str()); - - loadTexture("", ""); - - emit requestUpdate(); - emit sendMessage("done..", 0); - } - catch (std::invalid_argument e) - { - clearData(); - emit sendMessage(QString(e.what()), 2); - } -} - -void GeometryEngine::loadTexture(const char* filePath, const char* fileName) +void GeometryEngine::loadTexture(QString filePath, QString fileName) { bool loadSuccess(false); QImage img; - if (!strcmp(fileName, "")) + if (fileName.isEmpty()) { loadSuccess = true; img = QImage(1, 1, QImage::Format_RGB32); img.fill(Qt::red); } else - img = loadTga((std::string(filePath) + std::string(fileName)).c_str(), loadSuccess); + img = loadTga(filePath + "/" + fileName, loadSuccess); if (!loadSuccess) emit sendMessage("WARNING: texture not found or corrupted: " + QString(fileName), 1); @@ -160,7 +74,91 @@ void GeometryEngine::clearData() ///////////////////////////////////////////////////////////////////////// -// public functions +// public slots + +void GeometryEngine::loadFile(QString filePath) +{ + // cleanup old stuff and recreate buffers + clearData(); + m_arrayBuf.create(); + m_indexBuf.create(); + + //reset view + emit requestResetView(); + emit sendMessage("loading file..", 0); + + try + { + QVector* models; + QStringList* textureNames; + QVector vertexData; + QVector indexData; + + // open file and get the information + MshFile file(filePath, this); + + models = file.getModels(); + textureNames = file.getTextureNames(); + m_boundings = file.getBoundingBox(); + + // collect data + unsigned int indexOffset(0); + unsigned int vertexOffset(0); + for (auto& modelIterator : *models) + { + for (auto& segmentIterator : modelIterator->segmList) + { + // get draw information + DrawInformation new_info; + new_info.offset = indexOffset; + new_info.size = segmentIterator->indices.size(); + new_info.textureIndex = segmentIterator->textureIndex; + new_info.modelMatrix = modelIterator->m4x4Translation; + new_info.modelMatrix.rotate(modelIterator->quadRotation); + + // add offset to indices, no need to do it for the first one (maybe it's very big) + if (vertexOffset != 0) + for (auto& it : segmentIterator->indices) + it += vertexOffset; + + // save data + vertexData += segmentIterator->vertices; + indexData += segmentIterator->indices; + m_drawList.push_back(new_info); + + // update offset + indexOffset += new_info.size; + vertexOffset += segmentIterator->vertices.size(); + } + } + + // Transfer vertex data to VBO 0 + m_arrayBuf.bind(); + m_arrayBuf.allocate(vertexData.data(), vertexData.size() * sizeof(VertexData)); + + // Transfer index data to VBO 1 + m_indexBuf.bind(); + m_indexBuf.allocate(indexData.data(), indexData.size() * sizeof(GLuint)); + + emit sendMessage("loading textures..", 0); + + // load the textures + int split = filePath.lastIndexOf(QRegExp("/|\\\\")); + for (auto& it : *textureNames) + loadTexture(filePath.left(split), it); + + loadTexture("", ""); + + emit requestUpdate(); + emit sendMessage("done..", 0); + emit sendFileInfo(filePath.right(filePath.size() - split - 1), QStringList(*textureNames), vertexData.size(), indexData.size() / 3); + } + catch (std::invalid_argument e) + { + clearData(); + emit sendMessage(QString(e.what()), 2); + } +} void GeometryEngine::drawGeometry(QOpenGLShaderProgram *program) { diff --git a/QtMeshViewer/Source/MainWindow.cpp b/QtMeshViewer/Source/MainWindow.cpp index b4ca5b2..6dc14b5 100644 --- a/QtMeshViewer/Source/MainWindow.cpp +++ b/QtMeshViewer/Source/MainWindow.cpp @@ -3,10 +3,11 @@ #include #include #include -#include #include #include #include +#include +#include #include "..\Header\FileInterface.h" #define WINDOW_NAME "Mesh Viewer" @@ -28,6 +29,8 @@ MainWindow::MainWindow(QWidget *parent) setupWidgets(); ui->statusBar->showMessage("MeshViewer by Anakin", 0); + + m_fileInfo += "Filename: -\nMaterials: -\nVertices: -\nTriangle: -\nNo file is open"; } MainWindow::~MainWindow() @@ -38,7 +41,8 @@ MainWindow::~MainWindow() void MainWindow::openFile() { QString fileName = QFileDialog::getOpenFileName(this, "Open File", "", "Mesh (*.msh)"); - emit loadFile(fileName.toStdString().c_str()); + if(!fileName.isEmpty()) + emit loadFile(fileName); } void MainWindow::setupWidgets() @@ -91,14 +95,17 @@ void MainWindow::setupWidgets() void MainWindow::aboutFile() { - QMessageBox* dialog = new QMessageBox(QMessageBox::Information, + QMessageBox* dialog = new QMessageBox(QMessageBox::NoIcon, WINDOW_NAME, - "When i find some time, i'll add some information about\nthe file in the detailed text", + QString(m_fileInfo.left(m_fileInfo.indexOf(""))), QMessageBox::StandardButton::Close, this, Qt::Dialog | Qt::MSWindowsFixedSizeDialogHint); - dialog->setDetailedText("This is the cool detailed text\n"); + + dialog->setStyleSheet("QLabel{min-width: 200px;}"); + dialog->setDetailedText(QString(m_fileInfo.right(m_fileInfo.size() - m_fileInfo.indexOf("") - 8))); dialog->exec(); + delete dialog; } void MainWindow::aboutTool() @@ -111,13 +118,36 @@ void MainWindow::aboutTool() QString(file.readAll()), QMessageBox::StandardButton::Close, this, - Qt::Dialog | Qt::MSWindowsFixedSizeDialogHint - ); + Qt::Dialog | Qt::MSWindowsFixedSizeDialogHint); - //dialog->setDetailedText(QString(file.readAll())); file.close(); dialog->exec(); + + delete dialog; +} + +void MainWindow::setFileInfo(QString name, QStringList textures, int vertices, int triangle) +{ + m_fileInfo = QByteArray("Filename: "); + m_fileInfo += name; + m_fileInfo += "\nMaterials: "; + m_fileInfo += QByteArray::number(textures.size()); + m_fileInfo += "\nVertices: "; + m_fileInfo += QByteArray::number(vertices); + m_fileInfo += "\nTriangle: "; + m_fileInfo += QByteArray::number(triangle); + m_fileInfo += ""; + + int count(0); + for (auto& it : textures) + { + m_fileInfo += "Material "; + m_fileInfo += QByteArray::number(count++); + m_fileInfo += " - "; + m_fileInfo += it; + m_fileInfo += "\n"; + } } void MainWindow::printMessage(QString message, int severity) diff --git a/QtMeshViewer/Source/MshFile.cpp b/QtMeshViewer/Source/MshFile.cpp index 761c01f..00ed57b 100644 --- a/QtMeshViewer/Source/MshFile.cpp +++ b/QtMeshViewer/Source/MshFile.cpp @@ -8,7 +8,7 @@ ///////////////////////////////////////////////////////////////////////// // public constructor/destructor -MshFile::MshFile(const char * path, QObject * parent) +MshFile::MshFile(QString path, QObject * parent) : FileInterface(path, parent) { import(); @@ -497,21 +497,13 @@ void MshFile::analyseClthChunks(Model * dataDestination, std::list // search if it is already known bool tmp_found(false); - for (unsigned int i = 0; i < m_textureNames->size(); i++) - { - if (!strcmp(buffer, m_textureNames->at(i).c_str())) - { - // if found, save the index and stop searching - new_segment->textureIndex = i; - tmp_found = true; - break; - } - } - // if it was not found add the texturename to the list - if (!tmp_found) + int index = m_textureNames->indexOf(QString::fromStdString(buffer)); + if (index != -1) + new_segment->textureIndex = index; + else { - m_textureNames->push_back(std::string(buffer)); + m_textureNames->push_back(QString::fromStdString(buffer)); new_segment->textureIndex = m_textureNames->size() - 1; } diff --git a/QtMeshViewer/Source/OglViewerWidget.cpp b/QtMeshViewer/Source/OglViewerWidget.cpp index 4b363ec..22185f4 100644 --- a/QtMeshViewer/Source/OglViewerWidget.cpp +++ b/QtMeshViewer/Source/OglViewerWidget.cpp @@ -135,7 +135,7 @@ void OglViewerWidget::dragEnterEvent(QDragEnterEvent *e) void OglViewerWidget::dropEvent(QDropEvent * e) { - emit loadFile(e->mimeData()->urls().first().toLocalFile().toStdString().c_str()); + emit loadFile(e->mimeData()->urls().first().toLocalFile()); } void OglViewerWidget::keyPressEvent(QKeyEvent *e) @@ -226,10 +226,12 @@ void OglViewerWidget::initShaders() void OglViewerWidget::setConnections() { connect(m_dataEngine, &GeometryEngine::requestResetView, this, &OglViewerWidget::resetView); - connect(parentWidget(), SIGNAL(loadFile(const char*)), m_dataEngine, SLOT(loadFile(const char*))); - connect(this, SIGNAL(loadFile(const char*)), m_dataEngine, SLOT(loadFile(const char*))); + connect(parentWidget(), 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(sendFileInfo(QString, QStringList, int, int)), parentWidget(), SLOT(setFileInfo(QString, QStringList, int, int))); + }