From f5ee8a973d0f92dd3f59a4a94f438420a3c15ca1 Mon Sep 17 00:00:00 2001 From: Anakin Date: Sat, 7 Jan 2017 15:59:16 +0100 Subject: [PATCH] Using QString now, fileinfo works now --- QtMeshViewer/Header/FileInterface.h | 13 +-- QtMeshViewer/Header/GeometryEngine.h | 5 +- QtMeshViewer/Header/MainWindow.h | 6 +- QtMeshViewer/Header/MshFile.h | 2 +- QtMeshViewer/Header/OglViewerWidget.h | 2 +- QtMeshViewer/Header/tga.h | 4 +- QtMeshViewer/Source/GeometryEngine.cpp | 120 ++++++++++++------------ QtMeshViewer/Source/MainWindow.cpp | 46 +++++++-- QtMeshViewer/Source/MshFile.cpp | 20 ++-- QtMeshViewer/Source/OglViewerWidget.cpp | 8 +- 10 files changed, 127 insertions(+), 99 deletions(-) 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,7 +26,57 @@ GeometryEngine::~GeometryEngine() ///////////////////////////////////////////////////////////////////////// // private functions -void GeometryEngine::loadFile(const char* filePath) +void GeometryEngine::loadTexture(QString filePath, QString fileName) +{ + bool loadSuccess(false); + QImage img; + + if (fileName.isEmpty()) + { + loadSuccess = true; + img = QImage(1, 1, QImage::Format_RGB32); + img.fill(Qt::red); + } + else + img = loadTga(filePath + "/" + fileName, loadSuccess); + + if (!loadSuccess) + emit sendMessage("WARNING: texture not found or corrupted: " + QString(fileName), 1); + + // Load image to OglTexture + QOpenGLTexture* new_texture = new QOpenGLTexture(img.mirrored()); + + // Set nearest filtering mode for texture minification + new_texture->setMinificationFilter(QOpenGLTexture::Nearest); + + // Set bilinear filtering mode for texture magnification + new_texture->setMagnificationFilter(QOpenGLTexture::Linear); + + // Wrap texture coordinates by repeating + // f.ex. texture coordinate (1.1, 1.2) is same as (0.1, 0.2) + new_texture->setWrapMode(QOpenGLTexture::Repeat); + + m_textures.push_back(new_texture); +} + +void GeometryEngine::clearData() +{ + if (m_arrayBuf.isCreated()) + m_arrayBuf.destroy(); + if (m_indexBuf.isCreated()) + m_indexBuf.destroy(); + + for (auto it : m_textures) + delete it; + m_textures.clear(); + m_drawList.clear(); +} + + +///////////////////////////////////////////////////////////////////////// +// public slots + +void GeometryEngine::loadFile(QString filePath) { // cleanup old stuff and recreate buffers clearData(); @@ -39,7 +90,7 @@ void GeometryEngine::loadFile(const char* filePath) try { QVector* models; - QVector* textureNames; + QStringList* textureNames; QVector vertexData; QVector indexData; @@ -66,7 +117,7 @@ void GeometryEngine::loadFile(const char* filePath) 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) + if (vertexOffset != 0) for (auto& it : segmentIterator->indices) it += vertexOffset; @@ -89,21 +140,18 @@ void GeometryEngine::loadFile(const char* filePath) 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()); + 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) { @@ -112,56 +160,6 @@ void GeometryEngine::loadFile(const char* filePath) } } -void GeometryEngine::loadTexture(const char* filePath, const char* fileName) -{ - bool loadSuccess(false); - QImage img; - - if (!strcmp(fileName, "")) - { - 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); - - if (!loadSuccess) - emit sendMessage("WARNING: texture not found or corrupted: " + QString(fileName), 1); - - // Load image to OglTexture - QOpenGLTexture* new_texture = new QOpenGLTexture(img.mirrored()); - - // Set nearest filtering mode for texture minification - new_texture->setMinificationFilter(QOpenGLTexture::Nearest); - - // Set bilinear filtering mode for texture magnification - new_texture->setMagnificationFilter(QOpenGLTexture::Linear); - - // Wrap texture coordinates by repeating - // f.ex. texture coordinate (1.1, 1.2) is same as (0.1, 0.2) - new_texture->setWrapMode(QOpenGLTexture::Repeat); - - m_textures.push_back(new_texture); -} - -void GeometryEngine::clearData() -{ - if (m_arrayBuf.isCreated()) - m_arrayBuf.destroy(); - if (m_indexBuf.isCreated()) - m_indexBuf.destroy(); - - for (auto it : m_textures) - delete it; - m_textures.clear(); - m_drawList.clear(); -} - - -///////////////////////////////////////////////////////////////////////// -// public functions - void GeometryEngine::drawGeometry(QOpenGLShaderProgram *program) { if (!m_arrayBuf.isCreated() || !m_indexBuf.isCreated()) 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))); + } -- GitLab