diff --git a/QtMeshViewer/Header/OglViewerWidget.h b/QtMeshViewer/Header/OglViewerWidget.h index 0480a09..8c43835 100644 --- a/QtMeshViewer/Header/OglViewerWidget.h +++ b/QtMeshViewer/Header/OglViewerWidget.h @@ -23,19 +23,19 @@ 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 }; + QVector4D m_backgroundColorOn; + QVector4D m_backgroundColorOff; - bool m_wireframe = false; - bool m_lightOn = false; - bool m_backfaceCulling = false; + bool m_wireframe; + bool m_lightOn; + bool m_backfaceCulling; struct { - QVector4D position = { 1,1,1,0 }; - QVector3D intensities = { 1.0,1.0,1.0 }; - float attenuationFactor = 0.0f; - float ambientCoefficient = 0.005f; - bool headlight = false; + QVector4D position; + QVector3D intensities; + float attenuationFactor; + float ambientCoefficient; + bool headlight; } m_light; struct { @@ -51,6 +51,7 @@ private: // functions private: + void setDefaultValues(); void initShaders(); void resetView(); void updateLightPosition(); @@ -89,5 +90,10 @@ public slots: void setHeadlight(bool value); void setBackfaceCulling(bool value); +// signals +signals: + void lightChanged(bool value); + + }; diff --git a/QtMeshViewer/Header/SettingsManager.h b/QtMeshViewer/Header/SettingsManager.h new file mode 100644 index 0000000..06ac7a7 --- /dev/null +++ b/QtMeshViewer/Header/SettingsManager.h @@ -0,0 +1,72 @@ +#pragma once +#include +#include +#include +#include + + +class SettingsManager : public QObject +{ + Q_OBJECT + +private: + SettingsManager(QObject *parent = Q_NULLPTR); + +public: + SettingsManager(SettingsManager const&) = delete; + void operator=(SettingsManager const&) = delete; + + ~SettingsManager(); + + static SettingsManager* getInstance(QObject *parent = Q_NULLPTR); + +// attributes +private: + QFile file; + + QVector3D m_bgColorOn = { 5, 5, 5 }; + QVector3D m_bgColorOff = { 128, 204, 255 }; + bool m_bfCulling = false; + bool m_light = false; + + int m_lightType = 1; // 1 = direct, 2 = point + QVector3D m_lightColor = { 255,255,255 }; + float m_attenuation = 0.0f; + float m_ambient = 0.005f; + bool m_headlight = false; + bool m_autoColor = true; + +// functions +private: + void readFromFile(); + void writeToFile(); + +public: + QVector3D getBgColorOn() const; + QVector3D getBgColorOff() const; + bool isBfCulling() const; + bool isLight() const; + + int getLightType() const; + QVector3D getLightColor() const; + float getAttenuation() const; + float getAmbient() const; + bool isHeadlight() const; + bool isAutoColor() const; + + +// slots +public: + void setBgColorOn(QVector3D value); + void setBgColorOff(QVector3D value); + void setBfCulling(bool value); + void setLight(bool value); + + void setLightType(int value); + void setLightColor(QVector3D value); + void setAttenuation(double value); + void setAmbient(double value); + void setHeadlight(bool value); + void setAutoColor(int value); + +}; \ No newline at end of file diff --git a/QtMeshViewer/Header/SettingsWindow.h b/QtMeshViewer/Header/SettingsWindow.h index e7fe472..f2da665 100644 --- a/QtMeshViewer/Header/SettingsWindow.h +++ b/QtMeshViewer/Header/SettingsWindow.h @@ -9,7 +9,7 @@ class SettingsWindow : public QWidget Q_OBJECT public: - SettingsWindow(QVector3D bgOffColor, QVector3D bgOnColor, QVector3D lightColor, bool autoColor, double ambCoef, double attFac, int lightType, QWidget * parent = Q_NULLPTR); + SettingsWindow(QWidget * parent = Q_NULLPTR); ~SettingsWindow(); private: @@ -33,5 +33,6 @@ signals: void sendHeadlight(bool value); void sendBackfaceCulling(bool value); void sendZommSpeed(int percent); + void changeLightType(int value); }; \ No newline at end of file diff --git a/QtMeshViewer/Source/OglViewerWidget.cpp b/QtMeshViewer/Source/OglViewerWidget.cpp index 9399da8..7f0c4f9 100644 --- a/QtMeshViewer/Source/OglViewerWidget.cpp +++ b/QtMeshViewer/Source/OglViewerWidget.cpp @@ -3,6 +3,7 @@ #include "..\Header\FreeCamera.h" #include "..\Header\OrbitCamera.h" #include "..\Header\MoveCamera.h" +#include "..\Header\SettingsManager.h" #include #include #include @@ -24,7 +25,8 @@ OglViewerWidget::OglViewerWidget(QWidget *parent) setAcceptDrops(true); // settings window - 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); + setDefaultValues(); + m_settings = new SettingsWindow(this); connect(m_settings, &SettingsWindow::updateBGColorOff, this, &OglViewerWidget::setBGColorOff); connect(m_settings, &SettingsWindow::updateBGColorOn, this, &OglViewerWidget::setBGColorOn); @@ -52,6 +54,30 @@ OglViewerWidget::~OglViewerWidget() ///////////////////////////////////////////////////////////////////////// // functions +void OglViewerWidget::setDefaultValues() +{ + SettingsManager* sm = SettingsManager::getInstance(this); + + m_backgroundColorOn = QVector4D(sm->getBgColorOn() / 255, 1.0f); + m_backgroundColorOff = QVector4D(sm->getBgColorOff() / 255, 1.0f); + + m_wireframe = false; + m_lightOn = sm->isLight(); + m_backfaceCulling = sm->isBfCulling(); + + if (sm->getLightType() == 1) // directional + m_light.position = { 0.0,0.0,0.0,0.0 }; + else // point + m_light.position = { 0.0,0.0,0.0,1.0 }; + m_light.intensities = sm->getLightColor() / 255; + m_light.attenuationFactor = sm->getAttenuation(); + m_light.ambientCoefficient = sm->getAmbient(); + m_light.headlight = sm->isHeadlight(); + + connect(this, &OglViewerWidget::lightChanged, sm, &SettingsManager::setLight); + +} + void OglViewerWidget::initShaders() { // Compile vertex shader @@ -371,6 +397,8 @@ void OglViewerWidget::toggleLight() m_backgroundColorOff[3] = 1.0; } + emit lightChanged(m_lightOn); + update(); } diff --git a/QtMeshViewer/Source/SettingsManager.cpp b/QtMeshViewer/Source/SettingsManager.cpp new file mode 100644 index 0000000..db3a623 --- /dev/null +++ b/QtMeshViewer/Source/SettingsManager.cpp @@ -0,0 +1,223 @@ +#include "..\Header\SettingsManager.h" + +#include + +///////////////////////////////////////////////////////////////////////// +// constructor/destructor + +SettingsManager::SettingsManager(QObject *parent) + : QObject(parent) +{ + file.setFileName("meshviewer.config"); + readFromFile(); +} + +SettingsManager::~SettingsManager() +{ + writeToFile(); +} + +SettingsManager* SettingsManager::getInstance(QObject *parent) +{ + static SettingsManager* instance = new SettingsManager(parent); + return instance; +} + + +///////////////////////////////////////////////////////////////////////// +// functions + +void SettingsManager::readFromFile() +{ + if (file.open(QIODevice::ReadOnly)) + { + + QByteArray stream = file.readAll(); + QList lines = stream.split('\n'); + + for (auto& it : lines) + { + if (it.startsWith("")) + { + QList values = it.right(it.size() - it.indexOf('>') - 1).split(';'); + + for (int i = 0; i < 3; i++) + m_bgColorOn[i] = values[i].toFloat(); + } + else if (it.startsWith("")) + { + QList values = it.right(it.size() - it.indexOf('>') - 1).split(';'); + + for (int i = 0; i < 3; i++) + m_bgColorOff[i] = values[i].toFloat(); + } + else if (it.startsWith("")) + { + QList values = it.right(it.size() - it.indexOf('>') - 1).split(';'); + + for (int i = 0; i < 3; i++) + m_lightColor[i] = values[i].toFloat(); + } + else if (it.startsWith("")) + { + m_bfCulling = it.right(it.size() - it.indexOf('>') - 1).toInt(); + } + else if (it.startsWith("")) + { + m_light = it.right(it.size() - it.indexOf('>') - 1).toInt(); + } + else if (it.startsWith("")) + { + m_headlight = it.right(it.size() - it.indexOf('>') - 1).toInt(); + } + else if (it.startsWith("")) + { + m_autoColor = it.right(it.size() - it.indexOf('>') - 1).toInt(); + } + else if (it.startsWith("")) + { + m_lightType = it.right(it.size() - it.indexOf('>') - 1).toInt(); + } + else if (it.startsWith("")) + { + m_attenuation = it.right(it.size() - it.indexOf('>') - 1).toFloat(); + } + else if (it.startsWith("")) + { + m_ambient = it.right(it.size() - it.indexOf('>') - 1).toFloat(); + } + + } + file.close(); + } +} + +void SettingsManager::writeToFile() +{ + file.open(QIODevice::WriteOnly); + + file.write(QString("%1;%2;%3\n").arg(m_bgColorOn.x()).arg(m_bgColorOn.y()).arg(m_bgColorOn.z()).toUtf8()); + file.write(QString("%1;%2;%3\n").arg(m_bgColorOff.x()).arg(m_bgColorOff.y()).arg(m_bgColorOff.z()).toUtf8()); + file.write(QString("%1;%2;%3\n").arg(m_lightColor.x()).arg(m_lightColor.y()).arg(m_lightColor.z()).toUtf8()); + + file.write(QString("%1\n").arg(m_bfCulling).toUtf8()); + file.write(QString("%1\n").arg(m_light).toUtf8()); + file.write(QString("%1\n").arg(m_headlight).toUtf8()); + file.write(QString("%1\n").arg(m_autoColor).toUtf8()); + + file.write(QString("%1\n").arg(m_lightType).toUtf8()); + file.write(QString("%1\n").arg(m_attenuation).toUtf8()); + file.write(QString("%1\n").arg(m_ambient).toUtf8()); + + file.close(); +} + +// getter /////////////////////////////////////////////////////////////// + +QVector3D SettingsManager::getBgColorOn() const +{ + return m_bgColorOn; +} + +QVector3D SettingsManager::getBgColorOff() const +{ + return m_bgColorOff; +} + +bool SettingsManager::isBfCulling() const +{ + return m_bfCulling; +} + +bool SettingsManager::isLight() const +{ + return m_light; +} + +int SettingsManager::getLightType() const +{ + return m_lightType; +} + +QVector3D SettingsManager::getLightColor() const +{ + return m_lightColor; +} + +float SettingsManager::getAttenuation() const +{ + return m_attenuation; +} + +float SettingsManager::getAmbient() const +{ + return m_ambient; +} + +bool SettingsManager::isHeadlight() const +{ + return m_headlight; +} + +bool SettingsManager::isAutoColor() const +{ + return m_autoColor; +} + + +///////////////////////////////////////////////////////////////////////// +// slots + +void SettingsManager::setBgColorOn(QVector3D value) +{ + m_bgColorOn = value; +} + +void SettingsManager::setBgColorOff(QVector3D value) +{ + m_bgColorOff = value; +} + +void SettingsManager::setBfCulling(bool value) +{ + m_bfCulling = value; +} + +void SettingsManager::setLight(bool value) +{ + m_light = value; +} + +void SettingsManager::setLightType(int value) +{ + m_lightType = value; +} + +void SettingsManager::setLightColor(QVector3D value) +{ + m_lightColor = value; +} + +void SettingsManager::setAttenuation(double value) +{ + m_attenuation = value; +} + +void SettingsManager::setAmbient(double value) +{ + m_ambient = value; +} + +void SettingsManager::setHeadlight(bool value) +{ + m_headlight = value; +} + +void SettingsManager::setAutoColor(int value) +{ + if (value == 0) + m_autoColor = false; + else + m_autoColor = true; +} + diff --git a/QtMeshViewer/Source/SettingsWindow.cpp b/QtMeshViewer/Source/SettingsWindow.cpp index 763e88d..54ff54c 100644 --- a/QtMeshViewer/Source/SettingsWindow.cpp +++ b/QtMeshViewer/Source/SettingsWindow.cpp @@ -1,10 +1,11 @@ #include "..\Header\SettingsWindow.h" +#include "..\Header\SettingsManager.h" ///////////////////////////////////////////////////////////////////////// // constructor/destructor -SettingsWindow::SettingsWindow(QVector3D bgOffColor, QVector3D bgOnColor, QVector3D lightColor, bool autoColor, double ambCoef, double attFac, int lightType, QWidget * parent) +SettingsWindow::SettingsWindow(QWidget * parent) : QWidget(parent) , ui(new Ui::SettingsWindow) { @@ -15,24 +16,41 @@ SettingsWindow::SettingsWindow(QVector3D bgOffColor, QVector3D bgOnColor, QVecto setupConnections(); // set default values - ui->lightOff_R_SB->setValue((int)bgOffColor[0]); - ui->lightOff_G_SB->setValue((int)bgOffColor[1]); - ui->lightOff_B_SB->setValue((int)bgOffColor[2]); + SettingsManager* sm = SettingsManager::getInstance(this); - ui->lightOn_R_SB->setValue((int)bgOnColor[0]); - ui->lightOn_G_SB->setValue((int)bgOnColor[1]); - ui->lightOn_B_SB->setValue((int)bgOnColor[2]); + ui->lightOff_R_SB->setValue((int)(sm->getBgColorOff()[0])); + ui->lightOff_G_SB->setValue((int)(sm->getBgColorOff()[1])); + ui->lightOff_B_SB->setValue((int)(sm->getBgColorOff()[2])); - ui->light_R_SB->setValue((int)lightColor[0]); - ui->light_G_SB->setValue((int)lightColor[1]); - ui->light_B_SB->setValue((int)lightColor[2]); + ui->lightOn_R_SB->setValue((int)(sm->getBgColorOn()[0])); + ui->lightOn_G_SB->setValue((int)(sm->getBgColorOn()[1])); + ui->lightOn_B_SB->setValue((int)(sm->getBgColorOn()[2])); - ui->ambCoef->setValue(ambCoef); - ui->attFac->setValue(attFac); + ui->light_R_SB->setValue((int)(sm->getLightColor()[0])); + ui->light_G_SB->setValue((int)(sm->getLightColor()[1])); + ui->light_B_SB->setValue((int)(sm->getLightColor()[2])); - ui->checkAutoColor->setChecked(autoColor); - if (lightType == 1) + ui->ambCoef->setValue(sm->getAmbient()); + ui->attFac->setValue(sm->getAttenuation()); + + ui->checkBackfaceCulling->setChecked(sm->isBfCulling()); + ui->checkAutoColor->setChecked(sm->isAutoColor()); + ui->checkHeadlight->setChecked(sm->isHeadlight()); + + if (sm->getLightType() == 1) ui->radioDirectLight->setChecked(true); + else + ui->radioPointLight->setChecked(true); + + connect(this, &SettingsWindow::updateBGColorOff, sm, &SettingsManager::setBgColorOff); + connect(this, &SettingsWindow::updateBGColorOn, sm, &SettingsManager::setBgColorOn); + connect(this, &SettingsWindow::updateLightColor, sm, &SettingsManager::setLightColor); + connect(this, &SettingsWindow::updateAttFac, sm, &SettingsManager::setAttenuation); + connect(this, &SettingsWindow::updateAmbCoef, sm, &SettingsManager::setAmbient); + connect(this, &SettingsWindow::sendHeadlight, sm, &SettingsManager::setHeadlight); + connect(this, &SettingsWindow::sendBackfaceCulling, sm, &SettingsManager::setBfCulling); + connect(ui->checkAutoColor, &QCheckBox::stateChanged, sm, &SettingsManager::setAutoColor); + connect(this, &SettingsWindow::changeLightType, sm, &SettingsManager::setLightType); } @@ -133,10 +151,12 @@ void SettingsWindow::radioToggled() { ui->attFac->setValue(0.0); ui->attFac->setEnabled(false); + emit changeLightType(1); } else { ui->attFac->setEnabled(true); + emit changeLightType(2); } }