diff --git a/QtMeshViewer/Header/GeometryEngine.h b/QtMeshViewer/Header/GeometryEngine.h index f3bf36f..c115b9b 100644 --- a/QtMeshViewer/Header/GeometryEngine.h +++ b/QtMeshViewer/Header/GeometryEngine.h @@ -1,5 +1,6 @@ #pragma once #include "..\Header\FileInterface.h" +#include #include #include #include @@ -13,8 +14,10 @@ struct DrawInformation { QMatrix4x4 modelMatrix; }; -class GeometryEngine : protected QOpenGLFunctions +class GeometryEngine : public QObject, protected QOpenGLFunctions { + Q_OBJECT + public: GeometryEngine(); virtual ~GeometryEngine(); @@ -26,9 +29,14 @@ private: QVector m_drawList; void loadTexture(const char* filePath); + void clearData(); -public: +public slots: void loadFile(const char* filePath); void drawGeometry(QOpenGLShaderProgram *program); + +signals: + void requestResetView(); + }; diff --git a/QtMeshViewer/Header/MainWindow.h b/QtMeshViewer/Header/MainWindow.h index a4a5302..d13c3c7 100644 --- a/QtMeshViewer/Header/MainWindow.h +++ b/QtMeshViewer/Header/MainWindow.h @@ -19,4 +19,6 @@ private slots: void aboutFile(); void aboutTool(); +signals: + void loadFile(const char*); }; diff --git a/QtMeshViewer/Header/OglViewerWidget.h b/QtMeshViewer/Header/OglViewerWidget.h index 47d26f5..ccf64f1 100644 --- a/QtMeshViewer/Header/OglViewerWidget.h +++ b/QtMeshViewer/Header/OglViewerWidget.h @@ -50,9 +50,7 @@ protected: private: void initShaders(); -public: - void openFile(const char* filePath); - - +private slots: + void resetView(); }; diff --git a/QtMeshViewer/Resources/prgmExeIcon.rc b/QtMeshViewer/Resources/prgmExeIcon.rc new file mode 100644 index 0000000..bb10963 --- /dev/null +++ b/QtMeshViewer/Resources/prgmExeIcon.rc @@ -0,0 +1 @@ +IDI_ICON1 ICON DISCARDABLE "icon.ico" \ No newline at end of file diff --git a/QtMeshViewer/Source/GeometryEngine.cpp b/QtMeshViewer/Source/GeometryEngine.cpp index 2d1717e..4cf5e4a 100644 --- a/QtMeshViewer/Source/GeometryEngine.cpp +++ b/QtMeshViewer/Source/GeometryEngine.cpp @@ -10,23 +10,12 @@ GeometryEngine::GeometryEngine() { initializeOpenGLFunctions(); - // Generate 2 VBOs - m_arrayBuf.create(); - m_indexBuf.create(); - - // Initializes cube geometry and transfers it to VBOs - loadFile("..\\Release\\Msh\\ic_helmet.msh"); + loadFile("..\\Release\\Msh\\4-Poly.msh"); } GeometryEngine::~GeometryEngine() { - m_arrayBuf.destroy(); - m_indexBuf.destroy(); - - for (auto it : m_textures) - delete it; - m_textures.clear(); - m_drawList.clear(); + clearData(); } @@ -35,6 +24,14 @@ GeometryEngine::~GeometryEngine() void GeometryEngine::loadFile(const char* filePath) { + // cleanup old stuff and recreate buffers + clearData(); + m_arrayBuf.create(); + m_indexBuf.create(); + + //reset view + emit requestResetView(); + try { //TODO normalize @@ -134,12 +131,28 @@ void GeometryEngine::loadTexture(const char* filePath) 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()) + return; + // Setup // Tell OpenGL which VBOs to use m_arrayBuf.bind(); diff --git a/QtMeshViewer/Source/MainWindow.cpp b/QtMeshViewer/Source/MainWindow.cpp index ed963de..14038f4 100644 --- a/QtMeshViewer/Source/MainWindow.cpp +++ b/QtMeshViewer/Source/MainWindow.cpp @@ -26,7 +26,6 @@ MainWindow::MainWindow(QWidget *parent) QSurfaceFormat::setDefaultFormat(format); setCentralWidget(new OglViewerWidget(this)); - } MainWindow::~MainWindow() @@ -37,7 +36,7 @@ MainWindow::~MainWindow() void MainWindow::openFile() { QString fileName = QFileDialog::getOpenFileName(this, "Open File", "../Release/Msh", "Mesh (*.msh)"); - dynamic_cast(centralWidget())->openFile(fileName.toStdString().c_str()); + emit loadFile(fileName.toStdString().c_str()); } void MainWindow::aboutFile() diff --git a/QtMeshViewer/Source/MshFile.cpp b/QtMeshViewer/Source/MshFile.cpp index 10e7353..d308afd 100644 --- a/QtMeshViewer/Source/MshFile.cpp +++ b/QtMeshViewer/Source/MshFile.cpp @@ -476,7 +476,7 @@ void MshFile::analyseSegmChunks(Model * dataDestination, std::list for (unsigned int tri = 0; tri < tmp_multiPolySize - 2; tri++) // ..calculate the edge indices for (int triEdge = 0; triEdge < 3; triEdge++) - new_segment->indices.push_back((GLuint)(tri + triEdge - ((tri % 2) * (triEdge - 1) * 2))); + new_segment->indices.push_back((GLuint)tmp_buffer[(tri + triEdge - ((tri % 2) * (triEdge - 1) * 2))]); } else { diff --git a/QtMeshViewer/Source/OglViewerWidget.cpp b/QtMeshViewer/Source/OglViewerWidget.cpp index ad77b63..6970a8b 100644 --- a/QtMeshViewer/Source/OglViewerWidget.cpp +++ b/QtMeshViewer/Source/OglViewerWidget.cpp @@ -1,5 +1,5 @@ #include "..\Header\OglViewerWidget.h" - +#include "..\Header\MainWindow.h" #include #include #include @@ -19,6 +19,7 @@ OglViewerWidget::OglViewerWidget(QWidget *parent) : setFocus(); m_translation.setZ(DEFAULT_Z_DISTANCE); setAcceptDrops(true); + } OglViewerWidget::~OglViewerWidget() @@ -101,14 +102,12 @@ void OglViewerWidget::keyPressEvent(QKeyEvent *e) { if (e->key() == Qt::Key_Space) { - m_rotation = QQuaternion(); - m_translation = { 0.0, 0.0, DEFAULT_Z_DISTANCE }; + resetView(); } else if (e->key() == Qt::Key_Escape) { parentWidget()->close(); } - update(); } void OglViewerWidget::initializeGL() @@ -126,6 +125,8 @@ void OglViewerWidget::initializeGL() glEnable(GL_CULL_FACE); m_dataEngine = new GeometryEngine; + connect(m_dataEngine, &GeometryEngine::requestResetView, this, &OglViewerWidget::resetView); + connect(parentWidget(), SIGNAL(loadFile(const char*)), m_dataEngine, SLOT(loadFile(const char*))); } @@ -186,9 +187,11 @@ void OglViewerWidget::initShaders() ///////////////////////////////////////////////////////////////////////// -// public functions +// private slots -void OglViewerWidget::openFile(const char * filePath) +void OglViewerWidget::resetView() { - m_dataEngine->loadFile(filePath); -} \ No newline at end of file + m_rotation = QQuaternion(); + m_translation = { 0.0, 0.0, DEFAULT_Z_DISTANCE }; + update(); +} diff --git a/Release/Msh/texture32R.tga b/Release/Msh/texture32R.tga index 6b996ed..b54937f 100644 Binary files a/Release/Msh/texture32R.tga and b/Release/Msh/texture32R.tga differ