Using QString now,

fileinfo works now
This commit is contained in:
Anakin 2017-01-07 15:59:16 +01:00
parent 8c2ca44f20
commit f5ee8a973d
10 changed files with 157 additions and 129 deletions

View File

@ -3,6 +3,7 @@
#include <QVector>
#include <QVector2D>
#include <QVector3D>
#include <QStringList>
#include <QMatrix4x4>
#include <QQuaternion>
#include <QOpenGLFunctions>
@ -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<Model*>)
, m_textureNames(new QVector<std::string>)
, 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<MainWindow*>(parent->parent()->parent());
if(tmp != NULL)
@ -87,14 +88,14 @@ public:
protected:
QVector<Model*>* m_models;
std::fstream m_file;
QVector<std::string>* m_textureNames;
QStringList* m_textureNames;
BoundingBox m_sceneBbox;
virtual void import() = 0;
public:
virtual QVector<Model*>* getModels() const { return m_models; };
virtual QVector<std::string>* getTextureNames() const { return m_textureNames; };
virtual QStringList* getTextureNames() const { return m_textureNames; };
virtual BoundingBox getBoundingBox() const { return m_sceneBbox; };
signals:

View File

@ -29,16 +29,17 @@ private:
QVector<DrawInformation> 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);
};

View File

@ -1,6 +1,8 @@
#pragma once
#include <QtWidgets/QMainWindow>
#include <QByteArray>
#include <QStringList>
#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);
};

View File

@ -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:

View File

@ -22,7 +22,7 @@ public:
~OglViewerWidget();
signals:
void loadFile(const char*);
void loadFile(QString);
private:
struct {

View File

@ -5,14 +5,14 @@
#include <iostream>
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())
{

View File

@ -4,6 +4,7 @@
#include "..\Header\MainWindow.h"
#include "..\Header\tga.h"
#include <cmath>
#include <QRegExp>
/////////////////////////////////////////////////////////////////////////
@ -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<Model*>* models;
QVector<std::string>* textureNames;
QVector<VertexData> vertexData;
QVector<GLuint> 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<Model*>* models;
QStringList* textureNames;
QVector<VertexData> vertexData;
QVector<GLuint> 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)
{

View File

@ -3,10 +3,11 @@
#include <QSurfaceFormat>
#include <QMessageBox>
#include <QFileDialog>
#include <QFile>
#include <QPalette>
#include <QAction>
#include <QSignalMapper>
#include <QFile>
#include <QSizePolicy>
#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: -\n<detail>No 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("<detail>"))),
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("<detail>") - 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 += "<detail>";
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)

View File

@ -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<ChunkHeader*>
// 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;
}

View File

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