text in FileInfoWindow can be marked and copied,
code cleaning
This commit is contained in:
parent
121f5c47f1
commit
96b7d6f736
|
@ -47,6 +47,9 @@ Triangles: -</string>
|
||||||
<property name="alignment">
|
<property name="alignment">
|
||||||
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
|
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="textInteractionFlags">
|
||||||
|
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
||||||
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
#include <QWidget>
|
#include <QWidget>
|
||||||
#include <QString>
|
|
||||||
#include "ui_FileInfoWindow.h"
|
#include "ui_FileInfoWindow.h"
|
||||||
|
|
||||||
class FileInfoWindow : public QWidget
|
class FileInfoWindow : public QWidget
|
||||||
|
@ -8,13 +7,21 @@ class FileInfoWindow : public QWidget
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
FileInfoWindow(QWidget *parent = Q_NULLPTR);
|
FileInfoWindow(QWidget *parent = Q_NULLPTR)
|
||||||
~FileInfoWindow();
|
: QWidget(parent)
|
||||||
|
, ui(new Ui::FileInfoWindow)
|
||||||
|
{
|
||||||
|
ui->setupUi(this);
|
||||||
|
setWindowFlags(Qt::Tool | Qt::NoDropShadowWindowHint);
|
||||||
|
ui->scrollArea->widget()->setStyleSheet("background-color: #ffffff");
|
||||||
|
};
|
||||||
|
|
||||||
|
~FileInfoWindow() { delete ui; };
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Ui::FileInfoWindow* ui;
|
Ui::FileInfoWindow* ui;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
void setBasicText(QString text);
|
void setBasicText(QString text) { ui->basic->setText(text); };
|
||||||
void setDetailText(QString text);
|
void setDetailText(QString text) { ui->detail->setText(text); };
|
||||||
};
|
};
|
|
@ -1,17 +1,13 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
#include <QObject>
|
||||||
|
#include <QOpenGlTexture>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <QVector>
|
#include <QVector>
|
||||||
#include <QVector2D>
|
#include <QVector2D>
|
||||||
#include <QVector3D>
|
|
||||||
#include <QMatrix4x4>
|
#include <QMatrix4x4>
|
||||||
#include <QQuaternion>
|
#include <QQuaternion>
|
||||||
#include <QOpenGLFunctions>
|
|
||||||
#include <QOpenGlTexture>
|
|
||||||
#include <QObject>
|
|
||||||
#include <QOpenGLTexture>
|
|
||||||
#include <QRegExp>
|
#include <QRegExp>
|
||||||
#include <..\Header\MainWindow.h>
|
#include "MainWindow.h"
|
||||||
|
|
||||||
|
|
||||||
struct BoundingBox {
|
struct BoundingBox {
|
||||||
QQuaternion rotation;
|
QQuaternion rotation;
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
#include "..\Header\FileInterface.h"
|
|
||||||
#include <QObject>
|
#include <QObject>
|
||||||
#include <QOpenGLFunctions>
|
#include <QOpenGLFunctions>
|
||||||
#include <QOpenGLShaderProgram>
|
#include <QOpenGLShaderProgram>
|
||||||
#include <QOpenGLBuffer>
|
#include <QOpenGLBuffer>
|
||||||
#include <QOpenGLTexture>
|
|
||||||
#include <QVector>
|
#include <QVector>
|
||||||
|
#include "FileInterface.h"
|
||||||
|
|
||||||
|
|
||||||
struct DrawInformation {
|
struct DrawInformation {
|
||||||
unsigned int offset;
|
unsigned int offset;
|
||||||
|
@ -22,20 +22,28 @@ public:
|
||||||
GeometryEngine(QObject *parent = Q_NULLPTR);
|
GeometryEngine(QObject *parent = Q_NULLPTR);
|
||||||
virtual ~GeometryEngine();
|
virtual ~GeometryEngine();
|
||||||
|
|
||||||
|
// attributes
|
||||||
private:
|
private:
|
||||||
QOpenGLBuffer m_arrayBuf;
|
QOpenGLBuffer m_arrayBuf;
|
||||||
QOpenGLBuffer m_indexBuf;
|
QOpenGLBuffer m_indexBuf;
|
||||||
QVector<Material>* m_materials = Q_NULLPTR;
|
QVector<Material>* m_materials = Q_NULLPTR;
|
||||||
QVector<DrawInformation> m_drawList;
|
|
||||||
BoundingBox m_boundings;
|
|
||||||
Material* m_defaultMaterial;
|
Material* m_defaultMaterial;
|
||||||
|
BoundingBox m_boundings;
|
||||||
|
QVector<DrawInformation> m_drawList;
|
||||||
|
|
||||||
|
// functions
|
||||||
|
private:
|
||||||
void clearData();
|
void clearData();
|
||||||
|
|
||||||
public slots:
|
public:
|
||||||
void loadFile(QString filePath);
|
|
||||||
void drawGeometry(QOpenGLShaderProgram *program, bool wireframe);
|
void drawGeometry(QOpenGLShaderProgram *program, bool wireframe);
|
||||||
|
|
||||||
|
// slots
|
||||||
|
public slots:
|
||||||
|
void loadFile(QString filePath);
|
||||||
|
|
||||||
|
|
||||||
|
// signals
|
||||||
signals:
|
signals:
|
||||||
void requestResetView();
|
void requestResetView();
|
||||||
void sendMessage(QString message, int severity);
|
void sendMessage(QString message, int severity);
|
||||||
|
|
|
@ -1,12 +1,11 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <QtWidgets/QMainWindow>
|
#include <QtWidgets/QMainWindow>
|
||||||
#include <qwidget.h>
|
#include <QWidget>
|
||||||
#include <QByteArray>
|
|
||||||
#include <QStringList>
|
|
||||||
#include <QLabel>
|
|
||||||
#include "ui_MainWindow.h"
|
#include "ui_MainWindow.h"
|
||||||
#include "..\Header\FileInfoWindow.h"
|
#include "FileInfoWindow.h"
|
||||||
|
#include <QByteArray>
|
||||||
|
#include <QLabel>
|
||||||
|
|
||||||
|
|
||||||
struct Material;
|
struct Material;
|
||||||
|
|
||||||
|
@ -18,27 +17,32 @@ public:
|
||||||
MainWindow(QWidget *parent = Q_NULLPTR);
|
MainWindow(QWidget *parent = Q_NULLPTR);
|
||||||
~MainWindow();
|
~MainWindow();
|
||||||
|
|
||||||
|
// attributes
|
||||||
private:
|
private:
|
||||||
Ui::MainWindowClass* ui;
|
Ui::MainWindowClass* ui;
|
||||||
int m_curSeverity;
|
|
||||||
void setupWidgets();
|
|
||||||
QByteArray m_fileInfo;
|
QByteArray m_fileInfo;
|
||||||
QLabel* m_output;
|
QLabel* m_output;
|
||||||
|
int m_curSeverity;
|
||||||
|
|
||||||
FileInfoWindow* m_infoWindow;
|
FileInfoWindow* m_infoWindow;
|
||||||
|
|
||||||
|
// functions
|
||||||
private:
|
private:
|
||||||
|
void setupWidgets();
|
||||||
void openFile();
|
void openFile();
|
||||||
void aboutFile();
|
|
||||||
void aboutTool();
|
|
||||||
void takeScreenShot();
|
void takeScreenShot();
|
||||||
|
void aboutTool();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void resizeEvent(QResizeEvent * e) Q_DECL_OVERRIDE;
|
virtual void resizeEvent(QResizeEvent * e) Q_DECL_OVERRIDE;
|
||||||
|
|
||||||
|
// slots
|
||||||
public slots:
|
public slots:
|
||||||
void printMessage(QString message, int severity);
|
void printMessage(QString message, int severity);
|
||||||
void setFileInfo(QString name, QVector<Material>* materials, int vertices, int triangle);
|
void setFileInfo(QString name, QVector<Material>* materials, int vertices, int triangle);
|
||||||
|
|
||||||
|
// signals
|
||||||
signals:
|
signals:
|
||||||
void loadFile(QString);
|
void loadFile(QString);
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,14 +1,10 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "geometryengine.h"
|
|
||||||
#include "..\Header\SettingsWindow.h"
|
|
||||||
#include <QOpenGLWidget>
|
#include <QOpenGLWidget>
|
||||||
#include <QOpenGLFunctions>
|
#include <QOpenGLFunctions>
|
||||||
#include <QMatrix4x4>
|
|
||||||
#include <QQuaternion>
|
|
||||||
#include <QVector2D>
|
|
||||||
#include <QBasicTimer>
|
|
||||||
#include <QOpenGLShaderProgram>
|
#include <QOpenGLShaderProgram>
|
||||||
|
#include <QMatrix4x4>
|
||||||
|
#include "GeometryEngine.h"
|
||||||
|
#include "SettingsWindow.h"
|
||||||
|
|
||||||
|
|
||||||
class GeometryEngine;
|
class GeometryEngine;
|
||||||
|
@ -21,10 +17,26 @@ public:
|
||||||
explicit OglViewerWidget(QWidget *parent = 0);
|
explicit OglViewerWidget(QWidget *parent = 0);
|
||||||
~OglViewerWidget();
|
~OglViewerWidget();
|
||||||
|
|
||||||
signals:
|
// attributes
|
||||||
void loadFile(QString);
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
QOpenGLShaderProgram m_program;
|
||||||
|
GeometryEngine *m_dataEngine;
|
||||||
|
|
||||||
|
QVector4D m_backgroundColorOn = { 0.02f, 0.02f, 0.02f, 1.0f };
|
||||||
|
QVector4D m_backgroundColorOff = { 0.5f, 0.8f, 1.0f, 1.0f };
|
||||||
|
|
||||||
|
bool m_wireframe = false;
|
||||||
|
bool m_lightOn = false;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
QVector4D position = { 1,1,1,0 };
|
||||||
|
QVector3D intensities = { 1.0,1.0,1.0 };
|
||||||
|
float attenuationFactor = 0.0f;
|
||||||
|
float ambientCoefficient = 0.005f;
|
||||||
|
} m_light;
|
||||||
|
|
||||||
|
SettingsWindow* m_settings;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
bool left = false;
|
bool left = false;
|
||||||
bool right = false;
|
bool right = false;
|
||||||
|
@ -37,53 +49,37 @@ private:
|
||||||
bool z = true;
|
bool z = true;
|
||||||
} m_rotDirections;
|
} m_rotDirections;
|
||||||
|
|
||||||
struct {
|
|
||||||
QVector4D position = { 1,1,1,0 };
|
|
||||||
QVector3D intensities = { 1.0,1.0,1.0 };
|
|
||||||
float attenuationFactor = 0.0f;
|
|
||||||
float ambientCoefficient = 0.005f;
|
|
||||||
} m_light;
|
|
||||||
|
|
||||||
SettingsWindow* m_settings;
|
|
||||||
|
|
||||||
QVector4D m_backgroundColorOn = {0.02f, 0.02f, 0.02f, 1.0f};
|
|
||||||
QVector4D m_backgroundColorOff = { 0.5f, 0.8f, 1.0f, 1.0f };
|
|
||||||
|
|
||||||
QOpenGLShaderProgram m_program;
|
|
||||||
GeometryEngine *m_dataEngine;
|
|
||||||
|
|
||||||
QMatrix4x4 m_projection;
|
QMatrix4x4 m_projection;
|
||||||
QVector3D m_translation;
|
QVector3D m_translation;
|
||||||
QQuaternion m_rotation;
|
QQuaternion m_rotation;
|
||||||
|
|
||||||
bool m_wireframe = false;
|
|
||||||
bool m_lightOn = false;
|
|
||||||
|
|
||||||
double m_zSpeed = 1.0;
|
double m_zSpeed = 1.0;
|
||||||
|
|
||||||
protected:
|
// functions
|
||||||
void mousePressEvent(QMouseEvent *e) Q_DECL_OVERRIDE;
|
private:
|
||||||
void mouseReleaseEvent(QMouseEvent *e) Q_DECL_OVERRIDE;
|
void initShaders();
|
||||||
void mouseMoveEvent(QMouseEvent *e) Q_DECL_OVERRIDE;
|
void setConnections();
|
||||||
void wheelEvent(QWheelEvent *e) Q_DECL_OVERRIDE;
|
void resetView();
|
||||||
void dragEnterEvent(QDragEnterEvent *e) Q_DECL_OVERRIDE;
|
void updateLightPosition();
|
||||||
void dropEvent(QDropEvent * event) Q_DECL_OVERRIDE;
|
|
||||||
void keyPressEvent(QKeyEvent *e) Q_DECL_OVERRIDE;
|
|
||||||
|
|
||||||
|
protected:
|
||||||
void initializeGL() Q_DECL_OVERRIDE;
|
void initializeGL() Q_DECL_OVERRIDE;
|
||||||
void resizeGL(int w, int h) Q_DECL_OVERRIDE;
|
void resizeGL(int w, int h) Q_DECL_OVERRIDE;
|
||||||
void paintGL() Q_DECL_OVERRIDE;
|
void paintGL() Q_DECL_OVERRIDE;
|
||||||
|
|
||||||
private:
|
void mousePressEvent(QMouseEvent *e) Q_DECL_OVERRIDE;
|
||||||
void initShaders();
|
void mouseReleaseEvent(QMouseEvent *e) Q_DECL_OVERRIDE;
|
||||||
void setConnections();
|
void mouseMoveEvent(QMouseEvent *e) Q_DECL_OVERRIDE;
|
||||||
void updateLightPosition();
|
void wheelEvent(QWheelEvent *e) Q_DECL_OVERRIDE;
|
||||||
|
|
||||||
private slots:
|
void keyPressEvent(QKeyEvent *e) Q_DECL_OVERRIDE;
|
||||||
void resetView();
|
|
||||||
|
|
||||||
|
void dragEnterEvent(QDragEnterEvent *e) Q_DECL_OVERRIDE;
|
||||||
|
void dropEvent(QDropEvent * event) Q_DECL_OVERRIDE;
|
||||||
|
|
||||||
|
// slots
|
||||||
public slots:
|
public slots:
|
||||||
void changeDirection(int direction);
|
void toggleAxis(int axis);
|
||||||
void toggleWireframe();
|
void toggleWireframe();
|
||||||
void toggleLight();
|
void toggleLight();
|
||||||
void showSettings();
|
void showSettings();
|
||||||
|
@ -93,7 +89,9 @@ public slots:
|
||||||
void setAttFac(double value);
|
void setAttFac(double value);
|
||||||
void setAmbCoef(double value);
|
void setAmbCoef(double value);
|
||||||
|
|
||||||
|
// signals
|
||||||
signals:
|
signals:
|
||||||
void sendMessage(QString message, int severity);
|
void sendMessage(QString message, int severity);
|
||||||
|
void loadFile(QString);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
#include "ui_SettingsWindow.h"
|
#include "ui_SettingsWindow.h"
|
||||||
#include <QVector3D>
|
#include <QVector3D>
|
||||||
|
|
||||||
|
|
||||||
class SettingsWindow : public QWidget
|
class SettingsWindow : public QWidget
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
|
@ -3,7 +3,6 @@
|
||||||
#include <QImage>
|
#include <QImage>
|
||||||
#include <QColor>
|
#include <QColor>
|
||||||
|
|
||||||
#include <iostream>
|
|
||||||
|
|
||||||
QImage loadTga(QString filePath, bool &success)
|
QImage loadTga(QString filePath, bool &success)
|
||||||
{
|
{
|
||||||
|
@ -67,7 +66,7 @@ QImage loadTga(QString filePath, bool &success)
|
||||||
int valb = vui8Pixels.at(y * ui32Width * ui32BpP / 8 + x * ui32BpP / 8);
|
int valb = vui8Pixels.at(y * ui32Width * ui32BpP / 8 + x * ui32BpP / 8);
|
||||||
|
|
||||||
QColor value(valr, valg, valb);
|
QColor value(valr, valg, valb);
|
||||||
img.setPixelColor(x, ui32Width - 1 - y, value);
|
img.setPixel(x, ui32Width - 1 - y, value.rgba());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -97,7 +96,7 @@ QImage loadTga(QString filePath, bool &success)
|
||||||
else
|
else
|
||||||
color.setRgb(qRgb(tempData[2], tempData[1], tempData[0]));
|
color.setRgb(qRgb(tempData[2], tempData[1], tempData[0]));
|
||||||
|
|
||||||
img.setPixelColor(tmp_pixelIndex % ui32Width, ui32Height - 1 - (tmp_pixelIndex / ui32Width), color);
|
img.setPixel(tmp_pixelIndex % ui32Width, ui32Height - 1 - (tmp_pixelIndex / ui32Width), color.rgba());
|
||||||
tmp_pixelIndex++;
|
tmp_pixelIndex++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -117,7 +116,7 @@ QImage loadTga(QString filePath, bool &success)
|
||||||
else
|
else
|
||||||
color.setRgb(qRgb(tempData[2], tempData[1], tempData[0]));
|
color.setRgb(qRgb(tempData[2], tempData[1], tempData[0]));
|
||||||
|
|
||||||
img.setPixelColor(tmp_pixelIndex % ui32Width, ui32Height - 1 - (tmp_pixelIndex / ui32Width), color);
|
img.setPixel(tmp_pixelIndex % ui32Width, ui32Height - 1 - (tmp_pixelIndex / ui32Width), color.rgba());
|
||||||
tmp_pixelIndex++;
|
tmp_pixelIndex++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,9 @@
|
||||||
|
QLabel#output {
|
||||||
|
color : white;
|
||||||
|
min-width: 400px;
|
||||||
|
min-height: 50px;
|
||||||
|
}
|
||||||
|
|
||||||
QToolButton {
|
QToolButton {
|
||||||
image: url(:/images/toolbar/placeholder.png);
|
image: url(:/images/toolbar/placeholder.png);
|
||||||
border-style: none;
|
border-style: none;
|
||||||
|
|
|
@ -1,29 +0,0 @@
|
||||||
#include "..\Header\FileInfoWindow.h"
|
|
||||||
#include <QIcon>
|
|
||||||
|
|
||||||
FileInfoWindow::FileInfoWindow(QWidget *parent)
|
|
||||||
: QWidget(parent)
|
|
||||||
, ui(new Ui::FileInfoWindow)
|
|
||||||
{
|
|
||||||
ui->setupUi(this);
|
|
||||||
|
|
||||||
setWindowFlags(Qt::Tool | Qt::NoDropShadowWindowHint);
|
|
||||||
|
|
||||||
ui->scrollArea->widget()->setStyleSheet("background-color: #ffffff");
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
FileInfoWindow::~FileInfoWindow()
|
|
||||||
{
|
|
||||||
delete ui;
|
|
||||||
}
|
|
||||||
|
|
||||||
void FileInfoWindow::setBasicText(QString text)
|
|
||||||
{
|
|
||||||
ui->basic->setText(text);
|
|
||||||
}
|
|
||||||
|
|
||||||
void FileInfoWindow::setDetailText(QString text)
|
|
||||||
{
|
|
||||||
ui->detail->setText(text);
|
|
||||||
}
|
|
|
@ -2,20 +2,18 @@
|
||||||
#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 <cmath>
|
|
||||||
#include <QRegExp>
|
#include <QRegExp>
|
||||||
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////
|
||||||
// public constructor/destructor
|
// constructor/destructor
|
||||||
|
|
||||||
GeometryEngine::GeometryEngine(QObject *parent)
|
GeometryEngine::GeometryEngine(QObject *parent)
|
||||||
: QObject(parent)
|
: QObject(parent)
|
||||||
, m_indexBuf(QOpenGLBuffer::IndexBuffer)
|
, m_indexBuf(QOpenGLBuffer::IndexBuffer)
|
||||||
|
, m_defaultMaterial(FileInterface::getDefaultMaterial())
|
||||||
{
|
{
|
||||||
initializeOpenGLFunctions();
|
initializeOpenGLFunctions();
|
||||||
|
|
||||||
m_defaultMaterial = FileInterface::getDefaultMaterial();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
GeometryEngine::~GeometryEngine()
|
GeometryEngine::~GeometryEngine()
|
||||||
|
@ -27,7 +25,7 @@ GeometryEngine::~GeometryEngine()
|
||||||
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////
|
||||||
// private functions
|
// functions
|
||||||
|
|
||||||
void GeometryEngine::clearData()
|
void GeometryEngine::clearData()
|
||||||
{
|
{
|
||||||
|
@ -52,9 +50,100 @@ void GeometryEngine::clearData()
|
||||||
m_drawList.clear();
|
m_drawList.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GeometryEngine::drawGeometry(QOpenGLShaderProgram *program, bool wireframe)
|
||||||
|
{
|
||||||
|
if (!m_arrayBuf.isCreated() || !m_indexBuf.isCreated())
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Setup
|
||||||
|
// Tell OpenGL which VBOs to use
|
||||||
|
m_arrayBuf.bind();
|
||||||
|
m_indexBuf.bind();
|
||||||
|
|
||||||
|
// Allways normalize by this
|
||||||
|
QMatrix4x4 normMatrix;
|
||||||
|
float maxExtent = std::max(std::max(m_boundings.extents[0], m_boundings.extents[1]), m_boundings.extents[2]);
|
||||||
|
normMatrix.scale(1 / maxExtent);
|
||||||
|
normMatrix.translate(-m_boundings.center[0], -m_boundings.center[1], -m_boundings.center[2]);
|
||||||
|
program->setUniformValue("norm_matrix", normMatrix);
|
||||||
|
|
||||||
|
// Allways use texture unit 0
|
||||||
|
program->setUniformValue("texture", 0);
|
||||||
|
|
||||||
|
// Offset for position
|
||||||
|
quintptr offset = 0;
|
||||||
|
|
||||||
|
// Tell OpenGL programmable pipeline how to locate vertex position data
|
||||||
|
int vertexLocation = program->attributeLocation("a_position");
|
||||||
|
program->enableAttributeArray(vertexLocation);
|
||||||
|
program->setAttributeBuffer(vertexLocation, GL_FLOAT, offset, 3, sizeof(VertexData));
|
||||||
|
|
||||||
|
// Offset for texture coordinate
|
||||||
|
offset += sizeof(QVector3D);
|
||||||
|
|
||||||
|
// Tell OpenGL programmable pipeline how to locate vertex texture coordinate data
|
||||||
|
int texcoordLocation = program->attributeLocation("a_texcoord");
|
||||||
|
program->enableAttributeArray(texcoordLocation);
|
||||||
|
program->setAttributeBuffer(texcoordLocation, GL_FLOAT, offset, 2, sizeof(VertexData));
|
||||||
|
|
||||||
|
//Offset for normal
|
||||||
|
offset += sizeof(QVector2D);
|
||||||
|
|
||||||
|
// Tell OpenGL programmable pipeline how to locate vertex normal data
|
||||||
|
int normLocation = program->attributeLocation("a_normal");
|
||||||
|
program->enableAttributeArray(normLocation);
|
||||||
|
program->setAttributeBuffer(normLocation, GL_FLOAT, offset, 3, sizeof(VertexData));
|
||||||
|
|
||||||
|
// Paint
|
||||||
|
|
||||||
|
for (auto& it : m_drawList)
|
||||||
|
{
|
||||||
|
bool tmp_transparent(false);
|
||||||
|
bool tmp_specular(false);
|
||||||
|
float shininess(0.0);
|
||||||
|
QVector3D specularColor;
|
||||||
|
|
||||||
|
// bind the correct texture
|
||||||
|
if (it.textureIndex < (unsigned)m_materials->size() && m_materials->at(it.textureIndex).texture0 != Q_NULLPTR)
|
||||||
|
{
|
||||||
|
m_materials->at(it.textureIndex).texture0->bind();
|
||||||
|
tmp_transparent = m_materials->at(it.textureIndex).transparent;
|
||||||
|
tmp_specular = m_materials->at(it.textureIndex).flags[7];
|
||||||
|
shininess = m_materials->at(it.textureIndex).shininess;
|
||||||
|
specularColor = m_materials->at(it.textureIndex).specularColor.toVector3D();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_defaultMaterial->texture0->bind();
|
||||||
|
tmp_transparent = m_defaultMaterial->transparent;
|
||||||
|
}
|
||||||
|
// Set model matrix
|
||||||
|
program->setUniformValue("m_matrix", it.modelMatrix);
|
||||||
|
|
||||||
|
// Set normal matrix
|
||||||
|
program->setUniformValue("n_matrix", (normMatrix * it.modelMatrix).normalMatrix());
|
||||||
|
|
||||||
|
// set some more values
|
||||||
|
program->setUniformValue("b_transparent", tmp_transparent);
|
||||||
|
program->setUniformValue("b_specular", tmp_specular);
|
||||||
|
|
||||||
|
// set some material attributes
|
||||||
|
program->setUniformValue("materialShininess", shininess);
|
||||||
|
program->setUniformValue("materialSpecularColor", specularColor);
|
||||||
|
|
||||||
|
// Draw cube geometry using indices from VBO 1
|
||||||
|
if (wireframe)
|
||||||
|
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
|
||||||
|
|
||||||
|
glDrawElements(GL_TRIANGLES, it.size, GL_UNSIGNED_INT, (void*)(it.offset * sizeof(GLuint)));
|
||||||
|
|
||||||
|
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////
|
||||||
// public slots
|
// slots
|
||||||
|
|
||||||
void GeometryEngine::loadFile(QString filePath)
|
void GeometryEngine::loadFile(QString filePath)
|
||||||
{
|
{
|
||||||
|
@ -134,94 +223,3 @@ void GeometryEngine::loadFile(QString filePath)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void GeometryEngine::drawGeometry(QOpenGLShaderProgram *program, bool wireframe)
|
|
||||||
{
|
|
||||||
if (!m_arrayBuf.isCreated() || !m_indexBuf.isCreated())
|
|
||||||
return;
|
|
||||||
|
|
||||||
// Setup
|
|
||||||
// Tell OpenGL which VBOs to use
|
|
||||||
m_arrayBuf.bind();
|
|
||||||
m_indexBuf.bind();
|
|
||||||
|
|
||||||
// Allways normalize by this
|
|
||||||
QMatrix4x4 normMatrix;
|
|
||||||
float maxExtent = std::max(std::max(m_boundings.extents[0], m_boundings.extents[1]), m_boundings.extents[2]);
|
|
||||||
normMatrix.scale(1 / maxExtent);
|
|
||||||
normMatrix.translate(-m_boundings.center[0], -m_boundings.center[1], -m_boundings.center[2]);
|
|
||||||
program->setUniformValue("norm_matrix", normMatrix);
|
|
||||||
|
|
||||||
// Allways use texture unit 0
|
|
||||||
program->setUniformValue("texture", 0);
|
|
||||||
|
|
||||||
// Offset for position
|
|
||||||
quintptr offset = 0;
|
|
||||||
|
|
||||||
// Tell OpenGL programmable pipeline how to locate vertex position data
|
|
||||||
int vertexLocation = program->attributeLocation("a_position");
|
|
||||||
program->enableAttributeArray(vertexLocation);
|
|
||||||
program->setAttributeBuffer(vertexLocation, GL_FLOAT, offset, 3, sizeof(VertexData));
|
|
||||||
|
|
||||||
// Offset for texture coordinate
|
|
||||||
offset += sizeof(QVector3D);
|
|
||||||
|
|
||||||
// Tell OpenGL programmable pipeline how to locate vertex texture coordinate data
|
|
||||||
int texcoordLocation = program->attributeLocation("a_texcoord");
|
|
||||||
program->enableAttributeArray(texcoordLocation);
|
|
||||||
program->setAttributeBuffer(texcoordLocation, GL_FLOAT, offset, 2, sizeof(VertexData));
|
|
||||||
|
|
||||||
//Offset for normal
|
|
||||||
offset += sizeof(QVector2D);
|
|
||||||
|
|
||||||
// Tell OpenGL programmable pipeline how to locate vertex normal data
|
|
||||||
int normLocation = program->attributeLocation("a_normal");
|
|
||||||
program->enableAttributeArray(normLocation);
|
|
||||||
program->setAttributeBuffer(normLocation, GL_FLOAT, offset, 3, sizeof(VertexData));
|
|
||||||
|
|
||||||
// Paint
|
|
||||||
|
|
||||||
for (auto& it : m_drawList)
|
|
||||||
{
|
|
||||||
bool tmp_transparent(false);
|
|
||||||
bool tmp_specular(false);
|
|
||||||
float shininess(0.0);
|
|
||||||
QVector3D specularColor;
|
|
||||||
|
|
||||||
// bind the correct texture
|
|
||||||
if (it.textureIndex < (unsigned) m_materials->size() && m_materials->at(it.textureIndex).texture0 != Q_NULLPTR)
|
|
||||||
{
|
|
||||||
m_materials->at(it.textureIndex).texture0->bind();
|
|
||||||
tmp_transparent = m_materials->at(it.textureIndex).transparent;
|
|
||||||
tmp_specular = m_materials->at(it.textureIndex).flags[7];
|
|
||||||
shininess = m_materials->at(it.textureIndex).shininess;
|
|
||||||
specularColor = m_materials->at(it.textureIndex).specularColor.toVector3D();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
m_defaultMaterial->texture0->bind();
|
|
||||||
tmp_transparent = m_defaultMaterial->transparent;
|
|
||||||
}
|
|
||||||
// Set model matrix
|
|
||||||
program->setUniformValue("m_matrix", it.modelMatrix);
|
|
||||||
|
|
||||||
// Set normal matrix
|
|
||||||
program->setUniformValue("n_matrix", (normMatrix * it.modelMatrix).normalMatrix());
|
|
||||||
|
|
||||||
// set some more values
|
|
||||||
program->setUniformValue("b_transparent", tmp_transparent);
|
|
||||||
program->setUniformValue("b_specular", tmp_specular);
|
|
||||||
|
|
||||||
// set some material attributes
|
|
||||||
program->setUniformValue("materialShininess", shininess);
|
|
||||||
program->setUniformValue("materialSpecularColor", specularColor);
|
|
||||||
|
|
||||||
// Draw cube geometry using indices from VBO 1
|
|
||||||
if(wireframe)
|
|
||||||
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
|
|
||||||
|
|
||||||
glDrawElements(GL_TRIANGLES, it.size, GL_UNSIGNED_INT, (void*)(it.offset * sizeof(GLuint)));
|
|
||||||
|
|
||||||
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
@ -1,32 +1,37 @@
|
||||||
#include "..\Header\MainWindow.h"
|
#include "..\Header\MainWindow.h"
|
||||||
#include "..\Header\OglViewerWidget.h"
|
#include "..\Header\OglViewerWidget.h"
|
||||||
#include <QSurfaceFormat>
|
|
||||||
#include <QMessageBox>
|
|
||||||
#include <QFileDialog>
|
|
||||||
#include <QPalette>
|
|
||||||
#include <QAction>
|
|
||||||
#include <QSignalMapper>
|
|
||||||
#include <QFile>
|
|
||||||
#include <QSizePolicy>
|
|
||||||
#include <QFont>
|
|
||||||
#include <QResizeEvent>
|
|
||||||
#include <QToolButton>
|
|
||||||
#include "..\Header\FileInterface.h"
|
#include "..\Header\FileInterface.h"
|
||||||
|
#include <QSurfaceFormat>
|
||||||
|
#include <QSignalMapper>
|
||||||
|
#include <QToolButton>
|
||||||
|
#include <QFile>
|
||||||
|
#include <QFileDialog>
|
||||||
|
#include <QMessageBox>
|
||||||
|
#include <QPalette>
|
||||||
|
#include <QResizeEvent>
|
||||||
|
|
||||||
#define WINDOW_NAME "Mesh Viewer"
|
#define WINDOW_NAME "Mesh Viewer"
|
||||||
|
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////
|
||||||
|
// constructor/destructor
|
||||||
|
|
||||||
MainWindow::MainWindow(QWidget *parent)
|
MainWindow::MainWindow(QWidget *parent)
|
||||||
: QMainWindow(parent)
|
: QMainWindow(parent)
|
||||||
, ui(new Ui::MainWindowClass)
|
, ui(new Ui::MainWindowClass)
|
||||||
, m_curSeverity(0)
|
|
||||||
, m_output(new QLabel(this))
|
, m_output(new QLabel(this))
|
||||||
|
, m_curSeverity(0)
|
||||||
, m_infoWindow(new FileInfoWindow(this))
|
, m_infoWindow(new FileInfoWindow(this))
|
||||||
{
|
{
|
||||||
|
// setup window
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
|
|
||||||
setWindowTitle(WINDOW_NAME);
|
setWindowTitle(WINDOW_NAME);
|
||||||
setWindowIcon(QIcon(":/images/icon.ico"));
|
setWindowIcon(QIcon(":/images/icon.ico"));
|
||||||
|
|
||||||
|
printMessage("MeshViewer by Anakin", 0);
|
||||||
|
|
||||||
|
// setup opengl things
|
||||||
QSurfaceFormat format;
|
QSurfaceFormat format;
|
||||||
format.setDepthBufferSize(24);
|
format.setDepthBufferSize(24);
|
||||||
format.setMajorVersion(2);
|
format.setMajorVersion(2);
|
||||||
|
@ -34,12 +39,13 @@ MainWindow::MainWindow(QWidget *parent)
|
||||||
format.setProfile(QSurfaceFormat::NoProfile);
|
format.setProfile(QSurfaceFormat::NoProfile);
|
||||||
QSurfaceFormat::setDefaultFormat(format);
|
QSurfaceFormat::setDefaultFormat(format);
|
||||||
|
|
||||||
|
// set default text to file info
|
||||||
|
m_fileInfo = "Filename: -\nMaterials: -\nVertices: -\nTriangle: -<detail>No file is open";
|
||||||
|
|
||||||
|
// add widgets to the window
|
||||||
setupWidgets();
|
setupWidgets();
|
||||||
|
|
||||||
printMessage("MeshViewer by Anakin", 0);
|
// load stylesheet
|
||||||
|
|
||||||
m_fileInfo += "Filename: -\nMaterials: -\nVertices: -\nTriangle: -<detail>No file is open";
|
|
||||||
|
|
||||||
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());
|
||||||
|
@ -52,35 +58,37 @@ MainWindow::~MainWindow()
|
||||||
delete m_infoWindow;
|
delete m_infoWindow;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::openFile()
|
|
||||||
{
|
/////////////////////////////////////////////////////////////////////////
|
||||||
QString fileName = QFileDialog::getOpenFileName(this, "Open File", "", "Mesh (*.msh)");
|
// functions
|
||||||
if(!fileName.isEmpty())
|
|
||||||
emit loadFile(fileName);
|
|
||||||
}
|
|
||||||
|
|
||||||
void MainWindow::setupWidgets()
|
void MainWindow::setupWidgets()
|
||||||
{
|
{
|
||||||
|
// Ogl Viewer
|
||||||
OglViewerWidget* viewer = new OglViewerWidget(this);
|
OglViewerWidget* viewer = new OglViewerWidget(this);
|
||||||
setCentralWidget(viewer);
|
setCentralWidget(viewer);
|
||||||
connect(viewer, &OglViewerWidget::sendMessage, this, &MainWindow::printMessage);
|
connect(viewer, &OglViewerWidget::sendMessage, this, &MainWindow::printMessage);
|
||||||
|
|
||||||
|
// open file
|
||||||
QToolButton *openFile = new QToolButton(this);
|
QToolButton *openFile = new QToolButton(this);
|
||||||
openFile->setObjectName("openFile");
|
openFile->setObjectName("openFile");
|
||||||
openFile->setToolTip("open file");
|
openFile->setToolTip("open file");
|
||||||
connect(openFile, &QToolButton::pressed, this, &MainWindow::openFile);
|
connect(openFile, &QToolButton::pressed, this, &MainWindow::openFile);
|
||||||
ui->mainToolBar->addWidget(openFile);
|
ui->mainToolBar->addWidget(openFile);
|
||||||
|
|
||||||
|
// screenshot
|
||||||
QToolButton *screenshot = new QToolButton(this);
|
QToolButton *screenshot = new QToolButton(this);
|
||||||
screenshot->setObjectName("screenshot");
|
screenshot->setObjectName("screenshot");
|
||||||
screenshot->setToolTip("take screenshot");
|
screenshot->setToolTip("take screenshot");
|
||||||
connect(screenshot, &QToolButton::pressed, this, &MainWindow::takeScreenShot);
|
connect(screenshot, &QToolButton::pressed, this, &MainWindow::takeScreenShot);
|
||||||
ui->mainToolBar->addWidget(screenshot);
|
ui->mainToolBar->addWidget(screenshot);
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////
|
||||||
ui->mainToolBar->addSeparator();
|
ui->mainToolBar->addSeparator();
|
||||||
|
|
||||||
QSignalMapper* signalMapper = new QSignalMapper(this);
|
QSignalMapper* signalMapper = new QSignalMapper(this);
|
||||||
|
|
||||||
|
// X
|
||||||
QToolButton *x = new QToolButton(this);
|
QToolButton *x = new QToolButton(this);
|
||||||
x->setObjectName("x");
|
x->setObjectName("x");
|
||||||
x->setToolTip("x-direction");
|
x->setToolTip("x-direction");
|
||||||
|
@ -88,6 +96,7 @@ void MainWindow::setupWidgets()
|
||||||
x->setChecked(true);
|
x->setChecked(true);
|
||||||
ui->mainToolBar->addWidget(x);
|
ui->mainToolBar->addWidget(x);
|
||||||
|
|
||||||
|
// Y
|
||||||
QToolButton *y = new QToolButton(this);
|
QToolButton *y = new QToolButton(this);
|
||||||
y->setObjectName("y");
|
y->setObjectName("y");
|
||||||
y->setToolTip("y-direction");
|
y->setToolTip("y-direction");
|
||||||
|
@ -95,6 +104,7 @@ void MainWindow::setupWidgets()
|
||||||
y->setChecked(true);
|
y->setChecked(true);
|
||||||
ui->mainToolBar->addWidget(y);
|
ui->mainToolBar->addWidget(y);
|
||||||
|
|
||||||
|
// Z
|
||||||
QToolButton *z = new QToolButton(this);
|
QToolButton *z = new QToolButton(this);
|
||||||
z->setObjectName("z");
|
z->setObjectName("z");
|
||||||
z->setToolTip("z-direction");
|
z->setToolTip("z-direction");
|
||||||
|
@ -110,10 +120,12 @@ void MainWindow::setupWidgets()
|
||||||
signalMapper->setMapping(y, 2);
|
signalMapper->setMapping(y, 2);
|
||||||
signalMapper->setMapping(z, 3);
|
signalMapper->setMapping(z, 3);
|
||||||
|
|
||||||
connect(signalMapper, SIGNAL(mapped(int)), viewer, SLOT(changeDirection(int)));
|
connect(signalMapper, SIGNAL(mapped(int)), viewer, SLOT(toggleAxis(int)));
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////
|
||||||
ui->mainToolBar->addSeparator();
|
ui->mainToolBar->addSeparator();
|
||||||
|
|
||||||
|
// wireframe
|
||||||
QToolButton *wireframe = new QToolButton(this);
|
QToolButton *wireframe = new QToolButton(this);
|
||||||
wireframe->setObjectName("wireframe");
|
wireframe->setObjectName("wireframe");
|
||||||
wireframe->setToolTip("wireframe");
|
wireframe->setToolTip("wireframe");
|
||||||
|
@ -122,6 +134,7 @@ void MainWindow::setupWidgets()
|
||||||
connect(wireframe, &QToolButton::pressed, viewer, &OglViewerWidget::toggleWireframe);
|
connect(wireframe, &QToolButton::pressed, viewer, &OglViewerWidget::toggleWireframe);
|
||||||
ui->mainToolBar->addWidget(wireframe);
|
ui->mainToolBar->addWidget(wireframe);
|
||||||
|
|
||||||
|
// light
|
||||||
QToolButton *light = new QToolButton(this);
|
QToolButton *light = new QToolButton(this);
|
||||||
light->setObjectName("light");
|
light->setObjectName("light");
|
||||||
light->setToolTip("toggle light");
|
light->setToolTip("toggle light");
|
||||||
|
@ -130,48 +143,52 @@ void MainWindow::setupWidgets()
|
||||||
connect(light, &QToolButton::pressed, viewer, &OglViewerWidget::toggleLight);
|
connect(light, &QToolButton::pressed, viewer, &OglViewerWidget::toggleLight);
|
||||||
ui->mainToolBar->addWidget(light);
|
ui->mainToolBar->addWidget(light);
|
||||||
|
|
||||||
|
// settings
|
||||||
QToolButton *settings = new QToolButton(this);
|
QToolButton *settings = new QToolButton(this);
|
||||||
settings->setObjectName("settings");
|
settings->setObjectName("settings");
|
||||||
settings->setToolTip("settings");
|
settings->setToolTip("settings");
|
||||||
connect(settings, &QToolButton::pressed, viewer, &OglViewerWidget::showSettings);
|
connect(settings, &QToolButton::pressed, viewer, &OglViewerWidget::showSettings);
|
||||||
ui->mainToolBar->addWidget(settings);
|
ui->mainToolBar->addWidget(settings);
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////
|
||||||
ui->mainToolBar->addSeparator();
|
ui->mainToolBar->addSeparator();
|
||||||
|
|
||||||
|
// fileinfo
|
||||||
QToolButton *fileInfo = new QToolButton(this);
|
QToolButton *fileInfo = new QToolButton(this);
|
||||||
fileInfo->setObjectName("fileInfo");
|
fileInfo->setObjectName("fileInfo");
|
||||||
fileInfo->setToolTip("file info");
|
fileInfo->setToolTip("file info");
|
||||||
connect(fileInfo, &QToolButton::pressed, this, &MainWindow::aboutFile);
|
connect(fileInfo, &QToolButton::pressed, m_infoWindow, &FileInfoWindow::show);
|
||||||
ui->mainToolBar->addWidget(fileInfo);
|
ui->mainToolBar->addWidget(fileInfo);
|
||||||
|
|
||||||
|
// help
|
||||||
QToolButton *help = new QToolButton(this);
|
QToolButton *help = new QToolButton(this);
|
||||||
help->setObjectName("help");
|
help->setObjectName("help");
|
||||||
help->setToolTip("help");
|
help->setToolTip("help");
|
||||||
connect(help, &QToolButton::pressed, this, &MainWindow::aboutTool);
|
connect(help, &QToolButton::pressed, this, &MainWindow::aboutTool);
|
||||||
ui->mainToolBar->addWidget(help);
|
ui->mainToolBar->addWidget(help);
|
||||||
|
|
||||||
|
// output on screen
|
||||||
m_output->setObjectName("output");
|
m_output->setObjectName("output");
|
||||||
m_output->setStyleSheet("QLabel#output{color : white; min-width: 400px; min-height: 50px;}");
|
|
||||||
m_output->setAlignment(Qt::AlignTop);
|
m_output->setAlignment(Qt::AlignTop);
|
||||||
m_output->setText("Name: -\nMaterials: -\nVertice: -\nTriangle: -");
|
m_output->setText(m_fileInfo.left(m_fileInfo.indexOf("<detail>")));
|
||||||
m_output->raise();
|
m_output->raise();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::aboutFile()
|
void MainWindow::openFile()
|
||||||
{
|
{
|
||||||
/*QMessageBox* dialog = new QMessageBox(QMessageBox::NoIcon,
|
QString fileName = QFileDialog::getOpenFileName(this, "Open File", "", "Mesh (*.msh)");
|
||||||
WINDOW_NAME,
|
if(!fileName.isEmpty())
|
||||||
QString(m_fileInfo.left(m_fileInfo.indexOf("<detail>"))),
|
emit loadFile(fileName);
|
||||||
QMessageBox::StandardButton::Close,
|
}
|
||||||
this,
|
|
||||||
Qt::Dialog | Qt::MSWindowsFixedSizeDialogHint);
|
|
||||||
|
|
||||||
dialog->setStyleSheet("QLabel{min-width: 200px;}");
|
void MainWindow::takeScreenShot()
|
||||||
dialog->setDetailedText(QString(m_fileInfo.right(m_fileInfo.size() - m_fileInfo.indexOf("<detail>") - 8)));
|
{
|
||||||
dialog->exec();
|
QString destination = QFileDialog::getSaveFileName(this, "Save as...", "", "PNG (*.png);; BMP (*.bmp);;TIFF (*.tiff, *.tif);;JPEG (*.jpg *jpeg)");
|
||||||
delete dialog;*/
|
|
||||||
m_infoWindow->show();
|
OglViewerWidget* viewer = dynamic_cast<OglViewerWidget*>(centralWidget());
|
||||||
|
if (!destination.isEmpty() && viewer != NULL)
|
||||||
|
viewer->grab().save(destination);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::aboutTool()
|
void MainWindow::aboutTool()
|
||||||
|
@ -193,22 +210,48 @@ void MainWindow::aboutTool()
|
||||||
delete dialog;
|
delete dialog;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::takeScreenShot()
|
|
||||||
{
|
|
||||||
QString destination = QFileDialog::getSaveFileName(this, "Save as...", "", "PNG (*.png);; BMP (*.bmp);;TIFF (*.tiff, *.tif);;JPEG (*.jpg *jpeg)");
|
|
||||||
|
|
||||||
OglViewerWidget* viewer = dynamic_cast<OglViewerWidget*>(centralWidget());
|
|
||||||
if (!destination.isEmpty() && viewer != NULL)
|
|
||||||
viewer->grab().save(destination);
|
|
||||||
}
|
|
||||||
|
|
||||||
void MainWindow::resizeEvent(QResizeEvent * e)
|
void MainWindow::resizeEvent(QResizeEvent * e)
|
||||||
{
|
{
|
||||||
m_output->move(40, e->size().height() - 80);
|
m_output->move(40, e->size().height() - 80);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////
|
||||||
|
// slots
|
||||||
|
|
||||||
|
void MainWindow::printMessage(QString message, int severity)
|
||||||
|
{
|
||||||
|
if (!ui->statusBar->currentMessage().isEmpty() && severity < m_curSeverity)
|
||||||
|
return;
|
||||||
|
|
||||||
|
m_curSeverity = severity;
|
||||||
|
int time(0);
|
||||||
|
QPalette palette;
|
||||||
|
|
||||||
|
switch (severity)
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
time = 3000;
|
||||||
|
palette.setColor(QPalette::WindowText, Qt::darkYellow);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
time = 3000;
|
||||||
|
palette.setColor(QPalette::WindowText, Qt::red);
|
||||||
|
break;
|
||||||
|
case 0:
|
||||||
|
default:
|
||||||
|
time = 2000;
|
||||||
|
palette.setColor(QPalette::WindowText, Qt::black);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
ui->statusBar->setPalette(palette);
|
||||||
|
ui->statusBar->showMessage(message, time);
|
||||||
|
}
|
||||||
|
|
||||||
void MainWindow::setFileInfo(QString name, QVector<Material>* materials, int vertices, int triangle)
|
void MainWindow::setFileInfo(QString name, QVector<Material>* materials, int vertices, int triangle)
|
||||||
{
|
{
|
||||||
|
// save basic file information
|
||||||
m_fileInfo = QByteArray("Filename: ");
|
m_fileInfo = QByteArray("Filename: ");
|
||||||
m_fileInfo += name;
|
m_fileInfo += name;
|
||||||
m_fileInfo += "\nMaterials: ";
|
m_fileInfo += "\nMaterials: ";
|
||||||
|
@ -219,6 +262,7 @@ void MainWindow::setFileInfo(QString name, QVector<Material>* materials, int ver
|
||||||
m_fileInfo += QByteArray::number(triangle);
|
m_fileInfo += QByteArray::number(triangle);
|
||||||
m_fileInfo += "<detail>";
|
m_fileInfo += "<detail>";
|
||||||
|
|
||||||
|
// add detailed information
|
||||||
for (auto& it : *materials)
|
for (auto& it : *materials)
|
||||||
{
|
{
|
||||||
m_fileInfo += it.name;
|
m_fileInfo += it.name;
|
||||||
|
@ -307,39 +351,11 @@ void MainWindow::setFileInfo(QString name, QVector<Material>* materials, int ver
|
||||||
m_fileInfo += "-----------------------------------------------------------------\n";
|
m_fileInfo += "-----------------------------------------------------------------\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// print basic information on screen
|
||||||
m_output->setText(m_fileInfo.left(m_fileInfo.indexOf("<detail>")));
|
m_output->setText(m_fileInfo.left(m_fileInfo.indexOf("<detail>")));
|
||||||
|
|
||||||
|
// print basic and detailed information on info window
|
||||||
m_infoWindow->setBasicText(QString(m_fileInfo.left(m_fileInfo.indexOf("<detail>"))));
|
m_infoWindow->setBasicText(QString(m_fileInfo.left(m_fileInfo.indexOf("<detail>"))));
|
||||||
m_infoWindow->setDetailText(QString(m_fileInfo.right(m_fileInfo.size() - m_fileInfo.indexOf("<detail>") - 8)));
|
m_infoWindow->setDetailText(QString(m_fileInfo.right(m_fileInfo.size() - m_fileInfo.indexOf("<detail>") - 8)));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::printMessage(QString message, int severity)
|
|
||||||
{
|
|
||||||
if (!ui->statusBar->currentMessage().isEmpty() && severity < m_curSeverity)
|
|
||||||
return;
|
|
||||||
|
|
||||||
m_curSeverity = severity;
|
|
||||||
int time(0);
|
|
||||||
QPalette palette;
|
|
||||||
|
|
||||||
switch (severity)
|
|
||||||
{
|
|
||||||
case 1:
|
|
||||||
time = 3000;
|
|
||||||
palette.setColor(QPalette::WindowText, Qt::darkYellow);
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
time = 3000;
|
|
||||||
palette.setColor(QPalette::WindowText, Qt::red);
|
|
||||||
break;
|
|
||||||
case 0:
|
|
||||||
default:
|
|
||||||
time = 2000;
|
|
||||||
palette.setColor(QPalette::WindowText, Qt::black);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
ui->statusBar->setPalette(palette);
|
|
||||||
ui->statusBar->showMessage(message, time);
|
|
||||||
}
|
|
|
@ -1,23 +1,20 @@
|
||||||
#include "..\Header\OglViewerWidget.h"
|
#include "..\Header\OglViewerWidget.h"
|
||||||
#include "..\Header\MainWindow.h"
|
|
||||||
#include <QMouseEvent>
|
#include <QMouseEvent>
|
||||||
#include <QDropEvent>
|
#include <QDropEvent>
|
||||||
#include <QMimeData>
|
#include <QMimeData>
|
||||||
#include <math.h>
|
|
||||||
#include <iostream>
|
|
||||||
|
|
||||||
#define DEFAULT_Z_DISTANCE -4.0
|
#define DEFAULT_Z_DISTANCE -4.0
|
||||||
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////
|
||||||
// public constructor/destructor
|
// constructor/destructor
|
||||||
|
|
||||||
OglViewerWidget::OglViewerWidget(QWidget *parent)
|
OglViewerWidget::OglViewerWidget(QWidget *parent)
|
||||||
: QOpenGLWidget(parent)
|
: QOpenGLWidget(parent)
|
||||||
, m_dataEngine(0)
|
, m_dataEngine(0)
|
||||||
{
|
{
|
||||||
setFocus();
|
setFocus();
|
||||||
m_translation.setZ(DEFAULT_Z_DISTANCE);
|
|
||||||
setAcceptDrops(true);
|
setAcceptDrops(true);
|
||||||
|
|
||||||
m_settings = new SettingsWindow(m_backgroundColorOff.toVector3D() * 255, m_backgroundColorOn.toVector3D() * 255, m_light.intensities * 255, true, m_light.ambientCoefficient, m_light.attenuationFactor, 1, this);
|
m_settings = new SettingsWindow(m_backgroundColorOff.toVector3D() * 255, m_backgroundColorOn.toVector3D() * 255, m_light.intensities * 255, true, m_light.ambientCoefficient, m_light.attenuationFactor, 1, this);
|
||||||
|
@ -42,7 +39,135 @@ OglViewerWidget::~OglViewerWidget()
|
||||||
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////
|
||||||
// protected functions
|
// functions
|
||||||
|
|
||||||
|
void OglViewerWidget::initShaders()
|
||||||
|
{
|
||||||
|
// Compile vertex shader
|
||||||
|
if (!m_program.addShaderFromSourceFile(QOpenGLShader::Vertex, ":/shaders/vshader.glsl"))
|
||||||
|
close();
|
||||||
|
|
||||||
|
// Compile fragment shader
|
||||||
|
if (!m_program.addShaderFromSourceFile(QOpenGLShader::Fragment, ":/shaders/fshader.glsl"))
|
||||||
|
close();
|
||||||
|
|
||||||
|
// Link shader pipeline
|
||||||
|
if (!m_program.link())
|
||||||
|
close();
|
||||||
|
|
||||||
|
// Bind shader pipeline for use
|
||||||
|
if (!m_program.bind())
|
||||||
|
close();
|
||||||
|
}
|
||||||
|
|
||||||
|
void OglViewerWidget::setConnections()
|
||||||
|
{
|
||||||
|
connect(m_dataEngine, &GeometryEngine::requestResetView, this, &OglViewerWidget::resetView);
|
||||||
|
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, QVector<Material>*, int, int)), parentWidget(), SLOT(setFileInfo(QString, QVector<Material>*, int, int)));
|
||||||
|
}
|
||||||
|
|
||||||
|
void OglViewerWidget::resetView()
|
||||||
|
{
|
||||||
|
m_rotation = QQuaternion();
|
||||||
|
m_translation = { 0.0, 0.0, DEFAULT_Z_DISTANCE };
|
||||||
|
m_zSpeed = 1;
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
|
void OglViewerWidget::updateLightPosition()
|
||||||
|
{
|
||||||
|
QMatrix4x4 rotateBack;
|
||||||
|
rotateBack.rotate(m_rotation.inverted());
|
||||||
|
QVector3D cameraPosition = rotateBack * (-m_translation);
|
||||||
|
|
||||||
|
m_light.position.setX(cameraPosition.x());
|
||||||
|
m_light.position.setY(cameraPosition.y());
|
||||||
|
m_light.position.setZ(cameraPosition.z());
|
||||||
|
}
|
||||||
|
|
||||||
|
// OpenGL ///////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
void OglViewerWidget::initializeGL()
|
||||||
|
{
|
||||||
|
initializeOpenGLFunctions();
|
||||||
|
initShaders();
|
||||||
|
|
||||||
|
// Enable depth buffer
|
||||||
|
glEnable(GL_DEPTH_TEST);
|
||||||
|
|
||||||
|
//TODO: make this optional
|
||||||
|
// Enable back face culling
|
||||||
|
//glEnable(GL_CULL_FACE);
|
||||||
|
|
||||||
|
// Enable transparency
|
||||||
|
glEnable(GL_BLEND);
|
||||||
|
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||||
|
|
||||||
|
m_dataEngine = new GeometryEngine(this);
|
||||||
|
setConnections();
|
||||||
|
}
|
||||||
|
|
||||||
|
void OglViewerWidget::resizeGL(int w, int h)
|
||||||
|
{
|
||||||
|
// Calculate aspect ratio
|
||||||
|
qreal aspect = qreal(w) / qreal(h ? h : 1);
|
||||||
|
|
||||||
|
// Set near plane to 3.0, far plane to 7.0, field of view 45 degrees
|
||||||
|
const qreal zNear = 0.1, zFar = 100.0, fov = 45.0;
|
||||||
|
|
||||||
|
// Reset projection
|
||||||
|
m_projection.setToIdentity();
|
||||||
|
|
||||||
|
// Set perspective projection
|
||||||
|
m_projection.perspective(fov, aspect, zNear, zFar);
|
||||||
|
}
|
||||||
|
|
||||||
|
void OglViewerWidget::paintGL()
|
||||||
|
{
|
||||||
|
// set background color, last value is dirtybit
|
||||||
|
if (m_lightOn && m_backgroundColorOn[3] == 1.0)
|
||||||
|
{
|
||||||
|
glClearColor(m_backgroundColorOn[0], m_backgroundColorOn[1], m_backgroundColorOn[2], 0.0000f);
|
||||||
|
m_backgroundColorOn[3] = 0.0;
|
||||||
|
}
|
||||||
|
else if (!m_lightOn && m_backgroundColorOff[3] == 1.0)
|
||||||
|
{
|
||||||
|
glClearColor(m_backgroundColorOff[0], m_backgroundColorOff[1], m_backgroundColorOff[2], 0.0000f);
|
||||||
|
m_backgroundColorOff[3] = 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clear color and depth buffer
|
||||||
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
|
|
||||||
|
// Calculate view transformation
|
||||||
|
QMatrix4x4 view;
|
||||||
|
view.translate(m_translation);
|
||||||
|
view.rotate(m_rotation);
|
||||||
|
|
||||||
|
// Set view-projection matrix
|
||||||
|
m_program.setUniformValue("vp_matrix", m_projection * view);
|
||||||
|
|
||||||
|
// Set Light values
|
||||||
|
m_program.setUniformValue("b_light", m_lightOn);
|
||||||
|
m_program.setUniformValue("light.position", m_light.position);
|
||||||
|
m_program.setUniformValue("light.intensities", m_light.intensities);
|
||||||
|
m_program.setUniformValue("light.attenuationFactor", m_light.attenuationFactor);
|
||||||
|
m_program.setUniformValue("light.ambientCoefficient", m_light.ambientCoefficient);
|
||||||
|
|
||||||
|
// Set camera position
|
||||||
|
QMatrix4x4 rotateBack;
|
||||||
|
rotateBack.rotate(m_rotation.inverted());
|
||||||
|
m_program.setUniformValue("cameraPosition", rotateBack * (-m_translation));
|
||||||
|
|
||||||
|
// Draw cube geometry
|
||||||
|
m_dataEngine->drawGeometry(&m_program, m_wireframe);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Inputs ///////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
void OglViewerWidget::mousePressEvent(QMouseEvent *e)
|
void OglViewerWidget::mousePressEvent(QMouseEvent *e)
|
||||||
{
|
{
|
||||||
|
@ -74,11 +199,13 @@ void OglViewerWidget::mouseMoveEvent(QMouseEvent *e)
|
||||||
// update the new position
|
// update the new position
|
||||||
m_mouse.position = QVector2D(e->localPos());
|
m_mouse.position = QVector2D(e->localPos());
|
||||||
|
|
||||||
// calculate the rotation axis and rotate
|
// calculate the rotations depending on the active axis
|
||||||
|
// XYZ
|
||||||
if (m_rotDirections.x && m_rotDirections.y && m_rotDirections.z)
|
if (m_rotDirections.x && m_rotDirections.y && m_rotDirections.z)
|
||||||
{
|
{
|
||||||
m_rotation = QQuaternion::fromAxisAndAngle(QVector3D(diff.y(), diff.x(), 0.0).normalized(), diff.length() * 0.5) * m_rotation;
|
m_rotation = QQuaternion::fromAxisAndAngle(QVector3D(diff.y(), diff.x(), 0.0).normalized(), diff.length() * 0.5) * m_rotation;
|
||||||
}
|
}
|
||||||
|
// XY
|
||||||
else if (m_rotDirections.x && m_rotDirections.y && !m_rotDirections.z)
|
else if (m_rotDirections.x && m_rotDirections.y && !m_rotDirections.z)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -96,18 +223,22 @@ void OglViewerWidget::mouseMoveEvent(QMouseEvent *e)
|
||||||
m_rotation = QQuaternion::fromEulerAngles(pitch, yaw, roll);
|
m_rotation = QQuaternion::fromEulerAngles(pitch, yaw, roll);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
// X
|
||||||
else if (m_rotDirections.x && !m_rotDirections.y && !m_rotDirections.z)
|
else if (m_rotDirections.x && !m_rotDirections.y && !m_rotDirections.z)
|
||||||
{
|
{
|
||||||
m_rotation = QQuaternion::fromAxisAndAngle(QVector3D(0.0, 1.0, 0.0).normalized(), diff.x() * 0.5) * m_rotation;
|
m_rotation = QQuaternion::fromAxisAndAngle(QVector3D(0.0, 1.0, 0.0).normalized(), diff.x() * 0.5) * m_rotation;
|
||||||
}
|
}
|
||||||
|
// Y
|
||||||
else if (!m_rotDirections.x && m_rotDirections.y && !m_rotDirections.z)
|
else if (!m_rotDirections.x && m_rotDirections.y && !m_rotDirections.z)
|
||||||
{
|
{
|
||||||
m_rotation = QQuaternion::fromAxisAndAngle(QVector3D(1.0, 0.0, 0.0).normalized(), diff.y() * 0.5) * m_rotation;
|
m_rotation = QQuaternion::fromAxisAndAngle(QVector3D(1.0, 0.0, 0.0).normalized(), diff.y() * 0.5) * m_rotation;
|
||||||
}
|
}
|
||||||
|
// Z
|
||||||
else if (!m_rotDirections.x && !m_rotDirections.y && m_rotDirections.z)
|
else if (!m_rotDirections.x && !m_rotDirections.y && m_rotDirections.z)
|
||||||
{
|
{
|
||||||
m_rotation = QQuaternion::fromAxisAndAngle(QVector3D(0.0, 0.0, 1.0).normalized(), diff.x() * 0.5) * m_rotation;
|
m_rotation = QQuaternion::fromAxisAndAngle(QVector3D(0.0, 0.0, 1.0).normalized(), diff.x() * 0.5) * m_rotation;
|
||||||
}
|
}
|
||||||
|
// XZ
|
||||||
else if (m_rotDirections.x && !m_rotDirections.y && m_rotDirections.z)
|
else if (m_rotDirections.x && !m_rotDirections.y && m_rotDirections.z)
|
||||||
{
|
{
|
||||||
float pitch, yaw, roll;
|
float pitch, yaw, roll;
|
||||||
|
@ -117,6 +248,7 @@ void OglViewerWidget::mouseMoveEvent(QMouseEvent *e)
|
||||||
|
|
||||||
m_rotation = QQuaternion::fromEulerAngles(pitch, yaw, roll);
|
m_rotation = QQuaternion::fromEulerAngles(pitch, yaw, roll);
|
||||||
}
|
}
|
||||||
|
// YZ
|
||||||
else if (!m_rotDirections.x && m_rotDirections.y && m_rotDirections.z)
|
else if (!m_rotDirections.x && m_rotDirections.y && m_rotDirections.z)
|
||||||
{
|
{
|
||||||
float pitch, yaw, roll;
|
float pitch, yaw, roll;
|
||||||
|
@ -132,7 +264,6 @@ void OglViewerWidget::mouseMoveEvent(QMouseEvent *e)
|
||||||
m_rotation = QQuaternion::fromEulerAngles(pitch, yaw, roll);
|
m_rotation = QQuaternion::fromEulerAngles(pitch, yaw, roll);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// request an update
|
// request an update
|
||||||
update();
|
update();
|
||||||
}
|
}
|
||||||
|
@ -158,20 +289,6 @@ void OglViewerWidget::wheelEvent(QWheelEvent *e)
|
||||||
update();
|
update();
|
||||||
}
|
}
|
||||||
|
|
||||||
void OglViewerWidget::dragEnterEvent(QDragEnterEvent *e)
|
|
||||||
{
|
|
||||||
if (e->mimeData()->hasUrls())
|
|
||||||
if(e->mimeData()->urls().size() == 1)
|
|
||||||
if(e->mimeData()->urls().first().toLocalFile().endsWith(".msh"))
|
|
||||||
e->acceptProposedAction();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void OglViewerWidget::dropEvent(QDropEvent * e)
|
|
||||||
{
|
|
||||||
emit loadFile(e->mimeData()->urls().first().toLocalFile());
|
|
||||||
}
|
|
||||||
|
|
||||||
void OglViewerWidget::keyPressEvent(QKeyEvent *e)
|
void OglViewerWidget::keyPressEvent(QKeyEvent *e)
|
||||||
{
|
{
|
||||||
if (e->key() == Qt::Key_Space)
|
if (e->key() == Qt::Key_Space)
|
||||||
|
@ -200,147 +317,27 @@ void OglViewerWidget::keyPressEvent(QKeyEvent *e)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void OglViewerWidget::initializeGL()
|
void OglViewerWidget::dragEnterEvent(QDragEnterEvent *e)
|
||||||
{
|
{
|
||||||
initializeOpenGLFunctions();
|
if (e->mimeData()->hasUrls())
|
||||||
|
if(e->mimeData()->urls().size() == 1)
|
||||||
//glClearColor(0.5000f, 0.8000f, 1.0000f, 0.0000f);
|
if(e->mimeData()->urls().first().toLocalFile().endsWith(".msh"))
|
||||||
|
e->acceptProposedAction();
|
||||||
initShaders();
|
|
||||||
|
|
||||||
// Enable depth buffer
|
|
||||||
glEnable(GL_DEPTH_TEST);
|
|
||||||
|
|
||||||
// Enable back face culling
|
|
||||||
//glEnable(GL_CULL_FACE);
|
|
||||||
|
|
||||||
// Enable transparency
|
|
||||||
glEnable(GL_BLEND);
|
|
||||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
|
||||||
|
|
||||||
m_dataEngine = new GeometryEngine(this);
|
|
||||||
setConnections();
|
|
||||||
}
|
|
||||||
|
|
||||||
void OglViewerWidget::resizeGL(int w, int h)
|
|
||||||
{
|
|
||||||
// Calculate aspect ratio
|
|
||||||
qreal aspect = qreal(w) / qreal(h ? h : 1);
|
|
||||||
|
|
||||||
// Set near plane to 3.0, far plane to 7.0, field of view 45 degrees
|
|
||||||
const qreal zNear = 0.1, zFar = 100.0, fov = 45.0;
|
|
||||||
|
|
||||||
// Reset projection
|
|
||||||
m_projection.setToIdentity();
|
|
||||||
|
|
||||||
// Set perspective projection
|
|
||||||
m_projection.perspective(fov, aspect, zNear, zFar);
|
|
||||||
}
|
|
||||||
|
|
||||||
void OglViewerWidget::paintGL()
|
|
||||||
{
|
|
||||||
if (m_lightOn && m_backgroundColorOn[3] == 1.0)
|
|
||||||
{
|
|
||||||
glClearColor(m_backgroundColorOn[0], m_backgroundColorOn[1], m_backgroundColorOn[2], 0.0000f);
|
|
||||||
m_backgroundColorOn[3] = 0.0;
|
|
||||||
}
|
|
||||||
else if(!m_lightOn && m_backgroundColorOff[3] == 1.0)
|
|
||||||
{
|
|
||||||
glClearColor(m_backgroundColorOff[0], m_backgroundColorOff[1], m_backgroundColorOff[2], 0.0000f);
|
|
||||||
m_backgroundColorOff[3] = 0.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Clear color and depth buffer
|
|
||||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
|
||||||
|
|
||||||
// Calculate model view transformation
|
|
||||||
QMatrix4x4 view;
|
|
||||||
view.translate(m_translation);
|
|
||||||
view.rotate(m_rotation);
|
|
||||||
|
|
||||||
// Set view-projection matrix
|
|
||||||
m_program.setUniformValue("vp_matrix", m_projection * view);
|
|
||||||
|
|
||||||
// Set Light values
|
|
||||||
m_program.setUniformValue("b_light", m_lightOn);
|
|
||||||
m_program.setUniformValue("light.position", m_light.position);
|
|
||||||
m_program.setUniformValue("light.intensities", m_light.intensities);
|
|
||||||
m_program.setUniformValue("light.attenuationFactor", m_light.attenuationFactor);
|
|
||||||
m_program.setUniformValue("light.ambientCoefficient", m_light.ambientCoefficient);
|
|
||||||
|
|
||||||
// Set camera position
|
|
||||||
QMatrix4x4 rotateBack;
|
|
||||||
rotateBack.rotate(m_rotation.inverted());
|
|
||||||
m_program.setUniformValue("cameraPosition", rotateBack * (-m_translation));
|
|
||||||
|
|
||||||
// Draw cube geometry
|
|
||||||
m_dataEngine->drawGeometry(&m_program, m_wireframe);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////
|
|
||||||
// private functions
|
|
||||||
|
|
||||||
void OglViewerWidget::initShaders()
|
|
||||||
{
|
|
||||||
// Compile vertex shader
|
|
||||||
if (!m_program.addShaderFromSourceFile(QOpenGLShader::Vertex, ":/shaders/vshader.glsl"))
|
|
||||||
close();
|
|
||||||
|
|
||||||
// Compile fragment shader
|
|
||||||
if (!m_program.addShaderFromSourceFile(QOpenGLShader::Fragment, ":/shaders/fshader.glsl"))
|
|
||||||
close();
|
|
||||||
|
|
||||||
// Link shader pipeline
|
|
||||||
if (!m_program.link())
|
|
||||||
close();
|
|
||||||
|
|
||||||
// Bind shader pipeline for use
|
|
||||||
if (!m_program.bind())
|
|
||||||
close();
|
|
||||||
}
|
|
||||||
|
|
||||||
void OglViewerWidget::setConnections()
|
|
||||||
{
|
|
||||||
connect(m_dataEngine, &GeometryEngine::requestResetView, this, &OglViewerWidget::resetView);
|
|
||||||
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, QVector<Material>*, int, int)), parentWidget(), SLOT(setFileInfo(QString, QVector<Material>*, int, int)));
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void OglViewerWidget::updateLightPosition()
|
void OglViewerWidget::dropEvent(QDropEvent * e)
|
||||||
{
|
{
|
||||||
QMatrix4x4 rotateBack;
|
emit loadFile(e->mimeData()->urls().first().toLocalFile());
|
||||||
rotateBack.rotate(m_rotation.inverted());
|
|
||||||
QVector3D cameraPosition = rotateBack * (-m_translation);
|
|
||||||
|
|
||||||
m_light.position.setX(cameraPosition.x());
|
|
||||||
m_light.position.setY(cameraPosition.y());
|
|
||||||
m_light.position.setZ(cameraPosition.z());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////
|
|
||||||
// private slots
|
|
||||||
|
|
||||||
void OglViewerWidget::resetView()
|
|
||||||
{
|
|
||||||
m_rotation = QQuaternion();
|
|
||||||
m_translation = { 0.0, 0.0, DEFAULT_Z_DISTANCE };
|
|
||||||
m_zSpeed = 1;
|
|
||||||
update();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////
|
||||||
// public slots
|
// public slots
|
||||||
|
|
||||||
void OglViewerWidget::changeDirection(int direction)
|
void OglViewerWidget::toggleAxis(int axis)
|
||||||
{
|
{
|
||||||
switch (direction)
|
switch (axis)
|
||||||
{
|
{
|
||||||
case 1:
|
case 1:
|
||||||
m_rotDirections.x = !m_rotDirections.x;
|
m_rotDirections.x = !m_rotDirections.x;
|
||||||
|
@ -356,13 +353,13 @@ void OglViewerWidget::changeDirection(int direction)
|
||||||
|
|
||||||
void OglViewerWidget::toggleWireframe()
|
void OglViewerWidget::toggleWireframe()
|
||||||
{
|
{
|
||||||
m_wireframe = 1 - m_wireframe;
|
m_wireframe = !m_wireframe;
|
||||||
update();
|
update();
|
||||||
}
|
}
|
||||||
|
|
||||||
void OglViewerWidget::toggleLight()
|
void OglViewerWidget::toggleLight()
|
||||||
{
|
{
|
||||||
m_lightOn = 1 - m_lightOn;
|
m_lightOn = !m_lightOn;
|
||||||
|
|
||||||
if (m_lightOn)
|
if (m_lightOn)
|
||||||
{
|
{
|
||||||
|
@ -373,6 +370,7 @@ void OglViewerWidget::toggleLight()
|
||||||
{
|
{
|
||||||
m_backgroundColorOff[3] = 1.0;
|
m_backgroundColorOff[3] = 1.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
update();
|
update();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
#include "..\Header\SettingsWindow.h"
|
#include "..\Header\SettingsWindow.h"
|
||||||
#include <QString>
|
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////
|
||||||
|
// constructor/destructor
|
||||||
|
|
||||||
SettingsWindow::SettingsWindow(QVector3D bgOffColor, QVector3D bgOnColor, QVector3D lightColor, bool autoColor, double ambCoef, double attFac, int lightType, QWidget * parent)
|
SettingsWindow::SettingsWindow(QVector3D bgOffColor, QVector3D bgOnColor, QVector3D lightColor, bool autoColor, double ambCoef, double attFac, int lightType, QWidget * parent)
|
||||||
: QWidget(parent)
|
: QWidget(parent)
|
||||||
|
@ -38,6 +41,10 @@ SettingsWindow::~SettingsWindow()
|
||||||
delete ui;
|
delete ui;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////
|
||||||
|
// functions
|
||||||
|
|
||||||
void SettingsWindow::setupConnections()
|
void SettingsWindow::setupConnections()
|
||||||
{
|
{
|
||||||
// light off
|
// light off
|
||||||
|
@ -87,8 +94,8 @@ void SettingsWindow::setupConnections()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////
|
||||||
// connection slots
|
// slots
|
||||||
|
|
||||||
void SettingsWindow::autoColorToggled()
|
void SettingsWindow::autoColorToggled()
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,8 +1,6 @@
|
||||||
#include "Header\MainWindow.h"
|
#include "Header\MainWindow.h"
|
||||||
#include <QtWidgets/QApplication>
|
#include <QtWidgets/QApplication>
|
||||||
|
|
||||||
// TODO: add glow/emissive
|
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
QApplication a(argc, argv);
|
QApplication a(argc, argv);
|
||||||
|
|
Loading…
Reference in New Issue