diff --git a/FinalProject/FinalProject.vcxproj b/FinalProject/FinalProject.vcxproj
index d35a107..fa35487 100644
--- a/FinalProject/FinalProject.vcxproj
+++ b/FinalProject/FinalProject.vcxproj
@@ -114,6 +114,7 @@
+
@@ -127,6 +128,7 @@
+
@@ -157,8 +159,10 @@
+
+
@@ -167,7 +171,7 @@
-
+
diff --git a/FinalProject/FinalProject.vcxproj.filters b/FinalProject/FinalProject.vcxproj.filters
index 31e4ab0..9409877 100644
--- a/FinalProject/FinalProject.vcxproj.filters
+++ b/FinalProject/FinalProject.vcxproj.filters
@@ -174,6 +174,12 @@
Source Files\OpenGL Abstractions
+
+ Source Files\Qt Widgets\GUI Components
+
+
+ Source Files\Qt Widgets\Pages\Scene Editor\Object Setter
+
@@ -212,9 +218,6 @@
Header Files\Utils
-
- Header Files\Qt Widgets\Pages\Scene Editor\Object Setter
-
Header Files\OpenGL Abstractions
@@ -274,6 +277,15 @@
Header Files\Qt Widgets\Pages\Scene Editor\Object Selector
+
+ Header Files\Qt Widgets\Pages\Scene Editor\Object Setter
+
+
+ Header Files\Qt Widgets\GUI Components
+
+
+ Header Files\Qt Widgets\Pages\Scene Editor\Object Setter
+
diff --git a/FinalProject/modelsetter.cpp b/FinalProject/modelsetter.cpp
index 6f70f09..9c4c1c1 100644
--- a/FinalProject/modelsetter.cpp
+++ b/FinalProject/modelsetter.cpp
@@ -1 +1,532 @@
-#pragma once
+#include "modelsetter.h"
+
+ModelSetter::ModelSetter(QWidget* parent) : ModelSetter(nullptr, parent) {}
+
+ModelSetter::ModelSetter(Renderable* object, QWidget* parent) :
+ QWidget(parent), _object(object)
+{
+ // Set background color and border radius
+ setAttribute(Qt::WA_StyledBackground, true);
+
+ // Create main layout
+ _mainLayout = new QHBoxLayout(this);
+ _mainLayout->setContentsMargins(12, 8, 12, 8);
+ _mainLayout->setSpacing(8);
+ setLayout(_mainLayout);
+
+ // Create Object Settings Panel
+ {
+ // Create container widget
+ QWidget* _objectSettingPanel = new QWidget(this);
+ _objectSettingPanel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+ _mainLayout->addWidget(_objectSettingPanel);
+ _objectSettingPanel->show();
+
+ // Create container widget layout
+ _objectSettingLayout = new QVBoxLayout(_objectSettingPanel);
+ _objectSettingLayout->setContentsMargins(0, 0, 0, 0);
+ _objectSettingLayout->setSpacing(4);
+ _objectSettingPanel->setLayout(_objectSettingLayout);
+
+ // Create attribute adjusters
+ _scale = new ModelAttributeSlide("Scale", 0.1, 10, 100, _objectSettingPanel);
+ _rotateX = new ModelAttributeSlide("RotateX", 0, 360, 3600, _objectSettingPanel);
+ _rotateY = new ModelAttributeSlide("RotateY", 0, 360, 3600, _objectSettingPanel);
+ _rotateZ = new ModelAttributeSlide("RotateZ", 0, 360, 3600, _objectSettingPanel);
+
+ // Add attribute adjusters to layout
+ _objectSettingLayout->addWidget(_scale);
+ _objectSettingLayout->addWidget(_rotateX);
+ _objectSettingLayout->addWidget(_rotateY);
+ _objectSettingLayout->addWidget(_rotateZ);
+ _scale->show();
+ _rotateX->show();
+ _rotateY->show();
+ _rotateZ->show();
+
+ // Connect
+ connect(_scale, &ModelAttributeSlide::onChangeStart, this, &ModelSetter::onAdjustStart);
+ connect(_scale, &ModelAttributeSlide::onChangeEnd, this, &ModelSetter::onAdjustEnd);
+ connect(_scale, &ModelAttributeSlide::onChanged, this, [=]() {
+ if (_object != nullptr) {
+ _object->setScale(_scale->val());
+ emit onAdjust();
+ }
+ });
+ connect(_scale, &ModelAttributeSlide::onChangeEnd, this, [=]() {
+ if (_object != nullptr) {
+ _object->updateBoundary();
+ }
+ });
+
+ connect(_rotateX, &ModelAttributeSlide::onChangeStart, this, &ModelSetter::onAdjustStart);
+ connect(_rotateX, &ModelAttributeSlide::onChangeEnd, this, &ModelSetter::onAdjustEnd);
+ connect(_rotateX, &ModelAttributeSlide::onChanged, this, [=]() {
+ if (_object != nullptr) {
+ setRotate();
+ emit onAdjust();
+ }
+ });
+ connect(_rotateX, &ModelAttributeSlide::onChangeEnd, this, [=]() {
+ if (_object != nullptr) {
+ _object->updateBoundary();
+ }
+ });
+
+ connect(_rotateY, &ModelAttributeSlide::onChangeStart, this, &ModelSetter::onAdjustStart);
+ connect(_rotateY, &ModelAttributeSlide::onChangeEnd, this, &ModelSetter::onAdjustEnd);
+ connect(_rotateY, &ModelAttributeSlide::onChanged, this, [=]() {
+ if (_object != nullptr) {
+ setRotate();
+ emit onAdjust();
+ }
+ });
+ connect(_rotateY, &ModelAttributeSlide::onChangeEnd, this, [=]() {
+ if (_object != nullptr) {
+ _object->updateBoundary();
+ }
+ });
+
+ connect(_rotateZ, &ModelAttributeSlide::onChangeStart, this, &ModelSetter::onAdjustStart);
+ connect(_rotateZ, &ModelAttributeSlide::onChangeEnd, this, &ModelSetter::onAdjustEnd);
+ connect(_rotateZ, &ModelAttributeSlide::onChanged, this, [=]() {
+ if (_object != nullptr) {
+ setRotate();
+ emit onAdjust();
+ }
+ });
+ connect(_rotateZ, &ModelAttributeSlide::onChangeEnd, this, [=]() {
+ if (_object != nullptr) {
+ _object->updateBoundary();
+ }
+ });
+ }
+
+ // Create light switches
+ {
+ // Create container widget
+ _lightSwitchPanel = new QWidget(this);
+ _lightSwitchPanel->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Expanding);
+ _lightSwitchPanel->setMinimumWidth(36);
+ _mainLayout->addWidget(_lightSwitchPanel);
+ _lightSwitchPanel->show();
+
+ // Create container widget layout
+ _lightSwitchLayout = new QVBoxLayout(_lightSwitchPanel);
+ _lightSwitchLayout->setContentsMargins(0, 0, 0, 0);
+ _lightSwitchLayout->setAlignment(Qt::AlignCenter);
+ _lightSwitchLayout->setSpacing(4);
+ _lightSwitchPanel->setLayout(_lightSwitchLayout);
+
+ // Create light switches
+ _lightSwitch = new PushButton(nullptr, _lightSwitchPanel);
+ _lightSwitch->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Expanding);
+ _lightSwitch->setIndicatorPosition(PushButton::LUI_BTN_POS_BOTTOM);
+ _lightSwitchIcon = new QLabel(_lightSwitch);
+ _lightSwitchIcon->setFont(QFont("Font Awesome 6 Free Regular", 12));
+ _lightSwitchIcon->setText("\uf0eb");
+ _lightSwitchIcon->setAlignment(Qt::AlignCenter);
+ _lightSwitch->setChildWidget(_lightSwitchIcon);
+
+ _lightColorPanel = new PushButton(nullptr, _lightSwitchPanel);
+ _lightColorPanel->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Expanding);
+ _lightColorPanel->setIndicatorPosition(PushButton::LUI_BTN_POS_BOTTOM);
+ _lightColorPanelIcon = new QLabel(_lightColorPanel);
+ _lightColorPanelIcon->setFont(QFont("Font Awesome 6 Free Solid", 12));
+ _lightColorPanelIcon->setText("\uf53f");
+ _lightColorPanelIcon->setAlignment(Qt::AlignCenter);
+ _lightColorPanel->setStyleSheet("QWidget#indicator{border: 1px solid #5c5c5c;}");
+ _lightColorPanel->setChildWidget(_lightColorPanelIcon);
+
+ // Add light switches to layout
+ _lightSwitchLayout->addWidget(_lightSwitch);
+ _lightSwitchLayout->addWidget(_lightColorPanel);
+ _lightSwitch->show();
+ _lightColorPanel->show();
+
+ // Connect
+ connect(_lightSwitch, &PushButton::onClick, this, [=]() {
+ if (_object != nullptr && _object->hasLight()) {
+ // Disable light
+ _object->disposeLight();
+ _lightSwitch->deselect();
+ _lightSwitchIcon->setFont(QFont("Font Awesome 6 Free Regular", 12));
+ _lightColorPanel->setEnabled(false);
+ _lightDistance->setEnabled(false);
+ _lightRotateTheta->setEnabled(false);
+ _lightRotatePhi->setEnabled(false);
+ _lightCutoffAngle->setEnabled(false);
+ _lightR->setEnabled(false);
+ _lightG->setEnabled(false);
+ _lightB->setEnabled(false);
+ _lightColorPanel->deselect();
+ _lightSettingPanel->show();
+ _lightColorSettingPanel->hide();
+ _colorPaletteOn = false;
+ emit onAdjust();
+ }
+ else if (_object != nullptr) {
+ // Enable light
+ _object->makeLight();
+ _lightSwitch->select();
+ _lightSwitchIcon->setFont(QFont("Font Awesome 6 Free Solid", 12));
+ _lightColorPanel->setEnabled(true);
+ _lightColorPanel->setColorScheme(QColor(_object->originalLight()->lightColor().x, _object->originalLight()->lightColor().y, _object->originalLight()->lightColor().z));
+ _lightDistance->setEnabled(true);
+ _lightCutoffAngle->setEnabled(true);
+ _lightR->setEnabled(true);
+ _lightG->setEnabled(true);
+ _lightB->setEnabled(true);
+ _lightR->setValue(_object->originalLight()->lightColor().r * 255.0f);
+ _lightG->setValue(_object->originalLight()->lightColor().g * 255.0f);
+ _lightB->setValue(_object->originalLight()->lightColor().b * 255.0f);
+ _lightColorPanel->setColorScheme(QColor(
+ _object->originalLight()->lightColor().r * 255.0f,
+ _object->originalLight()->lightColor().g * 255.0f,
+ _object->originalLight()->lightColor().b * 255.0f
+ ));
+ _lightColorPanel->select();
+ _lightDistance->setValue(_object->originalLight()->idealDistance());
+ _lightRotateTheta->setValue(glm::degrees(glm::acos(_object->originalLight()->lightDirection().y)));
+ _lightRotatePhi->setValue(glm::degrees(glm::atan(_object->originalLight()->lightDirection().x / _object->originalLight()->lightDirection().z)));
+ _lightCutoffAngle->setValue(_object->originalLight()->cutOffAngle());
+ if (_lightCutoffAngle->val() != 180.0f) {
+ _lightRotateTheta->setEnabled(true);
+ _lightRotatePhi->setEnabled(true);
+ }
+ else {
+ _lightRotateTheta->setEnabled(false);
+ _lightRotatePhi->setEnabled(false);
+ }
+ emit onAdjust();
+ }
+ });
+ connect(_lightColorPanel, &PushButton::onClick, this, [=]() {
+ if (_object != nullptr && _object->hasLight()) {
+ if (!_colorPaletteOn) {
+ _lightSettingPanel->hide();
+ _lightColorSettingPanel->show();
+ _colorPaletteOn = true;
+ }
+ else {
+ _lightSettingPanel->show();
+ _lightColorSettingPanel->hide();
+ _colorPaletteOn = false;
+ }
+ }
+ });
+ }
+
+ // Create light setting panel
+ {
+ // Create container widget
+ _lightSettingPanel = new QWidget(this);
+ _lightSettingPanel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+ _mainLayout->addWidget(_lightSettingPanel);
+ _lightSettingPanel->show();
+
+ // Create container widget layout
+ _lightSettingLayout = new QVBoxLayout(_lightSettingPanel);
+ _lightSettingLayout->setContentsMargins(0, 0, 0, 0);
+ _lightSettingLayout->setSpacing(4);
+ _lightSettingPanel->setLayout(_lightSettingLayout);
+
+ // Create attribute adjusters
+ _lightDistance = new ModelAttributeSlide("Distance", 10, 3025, 145, _lightSettingPanel);
+ _lightDistance->setTransformation(
+ [](float x) {
+ float y;
+ if (x <= 90) {
+ y = 10 + x;
+ }
+ else {
+ y = 100 + glm::pow(x - 90, 2.0f);
+ }
+ return y;
+ },
+ [](float y) {
+ float x;
+ if (y <= 100) {
+ x = y - 10;
+ }
+ else {
+ x = glm::sqrt(y - 100) + 90;
+ }
+ return x;
+ }
+ );
+ _lightRotateTheta = new ModelAttributeSlide("Rotate\u03B8", 0, 360, 3600, _lightSettingPanel);
+ _lightRotatePhi = new ModelAttributeSlide("Rotate\u03C6", 0, 360, 3600, _lightSettingPanel);
+ _lightCutoffAngle = new ModelAttributeSlide("Cutoff", 0, 180, 1800, _lightSettingPanel);
+
+ // Add attribute adjusters to layout
+ _lightSettingLayout->addWidget(_lightDistance);
+ _lightSettingLayout->addWidget(_lightRotateTheta);
+ _lightSettingLayout->addWidget(_lightRotatePhi);
+ _lightSettingLayout->addWidget(_lightCutoffAngle);
+ _lightDistance->show();
+ _lightRotateTheta->show();
+ _lightRotatePhi->show();
+ _lightCutoffAngle->show();
+
+ // Connect
+ connect(_lightDistance, &ModelAttributeSlide::onChanged, this, [=]() {
+ if (_object != nullptr && _object->hasLight()) {
+ _object->originalLight()->setIdealDistance(_lightDistance->val());
+ emit onAdjust();
+ }
+ });
+ connect(_lightRotateTheta, &ModelAttributeSlide::onChanged, this, [=]() {
+ if (_object != nullptr && _object->hasLight()) {
+ setLightDir();
+ emit onAdjust();
+ }
+ });
+ connect(_lightRotatePhi, &ModelAttributeSlide::onChanged, this, [=]() {
+ if (_object != nullptr && _object->hasLight()) {
+ setLightDir();
+ emit onAdjust();
+ }
+ });
+ connect(_lightCutoffAngle, &ModelAttributeSlide::onChanged, this, [=]() {
+ if (_object != nullptr && _object->hasLight()) {
+ _object->originalLight()->setCutOffAngle(_lightCutoffAngle->val());
+ if (_lightCutoffAngle->val() != 180.0f) {
+ _lightRotateTheta->setEnabled(true);
+ _lightRotatePhi->setEnabled(true);
+ }
+ else {
+ _lightRotateTheta->setEnabled(false);
+ _lightRotatePhi->setEnabled(false);
+ }
+ emit onAdjust();
+ }
+ });
+ }
+
+ // Create color setting panel
+ {
+ // Create container widget
+ _lightColorSettingPanel = new QWidget(this);
+ _lightColorSettingPanel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+ _mainLayout->addWidget(_lightColorSettingPanel);
+ _lightColorSettingPanel->show();
+
+ // Create container widget layout
+ _lightColorSettingPanelLayout = new QVBoxLayout(_lightColorSettingPanel);
+ _lightColorSettingPanelLayout->setContentsMargins(0, 0, 0, 0);
+ _lightColorSettingPanelLayout->setSpacing(8);
+ _lightColorSettingPanel->setLayout(_lightColorSettingPanelLayout);
+
+ // Create color adjusters
+ _lightR = new ModelAttributeSlide("R", 0, 255, 2550, _lightColorSettingPanel);
+ _lightG = new ModelAttributeSlide("G", 0, 255, 2550, _lightColorSettingPanel);
+ _lightB = new ModelAttributeSlide("B", 0, 255, 2550, _lightColorSettingPanel);
+
+ // Add color adjusters to layout
+ _lightColorSettingPanelLayout->addWidget(_lightR);
+ _lightColorSettingPanelLayout->addWidget(_lightG);
+ _lightColorSettingPanelLayout->addWidget(_lightB);
+ _lightR->show();
+ _lightG->show();
+ _lightB->show();
+
+ // Connect
+ connect(_lightR, &ModelAttributeSlide::onChanged, this, [=]() {
+ if (_object != nullptr && _object->hasLight()) {
+ setLightColor();
+ _lightColorPanel->setColorScheme(QColor(_lightR->val(), _lightG->val(), _lightB->val()));
+ emit onAdjust();
+ }
+ });
+ connect(_lightG, &ModelAttributeSlide::onChanged, this, [=]() {
+ if (_object != nullptr && _object->hasLight()) {
+ setLightColor();
+ _lightColorPanel->setColorScheme(QColor(_lightR->val(), _lightG->val(), _lightB->val()));
+ emit onAdjust();
+ }
+ });
+ connect(_lightB, &ModelAttributeSlide::onChanged, this, [=]() {
+ if (_object != nullptr && _object->hasLight()) {
+ setLightColor();
+ _lightColorPanel->setColorScheme(QColor(_lightR->val(), _lightG->val(), _lightB->val()));
+ emit onAdjust();
+ }
+ });
+ }
+
+ // Create delete button
+ {
+ _deleteBtn = new PushButton(nullptr, this);
+ _deleteBtn->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
+ _deleteIcon = new QLabel(_deleteBtn);
+ _deleteIcon->setFont(QFont("Font Awesome 6 Free Regular", 12));
+ _deleteIcon->setText("\uf2ed");
+ _deleteIcon->setAlignment(Qt::AlignCenter);
+ _deleteBtn->setChildWidget(_deleteIcon);
+ _deleteBtn->setColorScheme(QColor(171, 59, 58));
+ _deleteBtn->setIndicatorColor(QColor(171, 59, 58, 0));
+
+ // Add delete button to layout
+ _mainLayout->addWidget(_deleteBtn);
+ _deleteBtn->show();
+
+ // Connect
+ connect(_deleteBtn, &PushButton::onClick, this, [=]() {
+ emit onDeleteObject();
+ });
+ }
+
+ // Update values
+ update(_object);
+}
+
+ModelSetter::~ModelSetter() {}
+
+void ModelSetter::setRotate() {
+ if (_object == nullptr) {
+ return;
+ }
+ // Around X-axis
+ _object->setRotation(glm::vec3(1.0f, 0.0f, 0.0f), _rotateX->val());
+ // Around Y-axis
+ _object->rotate(glm::vec3(0.0f, 1.0f, 0.0f), _rotateY->val());
+ // Around Z-axis
+ _object->rotate(glm::vec3(0.0f, 0.0f, 1.0f), _rotateZ->val());
+}
+
+void ModelSetter::setLightDir() {
+ if (_object == nullptr || !_object->hasLight()) {
+ return;
+ }
+ _object->originalLight()->setLightDirection(glm::normalize(glm::vec3(
+ cos(glm::radians(_lightRotateTheta->val())) * sin(glm::radians(_lightRotatePhi->val())),
+ sin(glm::radians(_lightRotateTheta->val())),
+ cos(glm::radians(_lightRotateTheta->val())) * cos(glm::radians(_lightRotatePhi->val()))
+ )));
+}
+
+void ModelSetter::setLightColor() {
+ if (_object == nullptr || !_object->hasLight()) {
+ return;
+ }
+ _object->originalLight()->setLightColor(glm::vec3(_lightR->val() / 255.0f, _lightG->val() / 255.0f, _lightB->val() / 255.0f));
+}
+
+void ModelSetter::update(Renderable* object) {
+ // Update settings panel by object's real value
+ if (object == nullptr) {
+ // Disable all settings
+ _scale->setEnabled(false);
+ _rotateX->setEnabled(false);
+ _rotateY->setEnabled(false);
+ _rotateZ->setEnabled(false);
+ _lightDistance->setEnabled(false);
+ _lightRotateTheta->setEnabled(false);
+ _lightRotatePhi->setEnabled(false);
+ _lightCutoffAngle->setEnabled(false);
+ _lightR->setEnabled(false);
+ _lightG->setEnabled(false);
+ _lightB->setEnabled(false);
+ _lightSwitch->setEnabled(false);
+ _lightColorPanel->setEnabled(false);
+ _deleteBtn->setEnabled(false);
+ _lightSwitchIcon->setFont(QFont("Font Awesome 6 Free Regular", 12));
+ _lightSwitch->deselect();
+ _lightColorPanel->deselect();
+ _deleteBtn->setEnabled(false);
+ }
+ else {
+ // Update settings
+ if (_object == nullptr) {
+ _scale->setEnabled();
+ }
+ _scale->setValue(object->scaleVal().x);
+
+ if (_object == nullptr) {
+ _rotateX->setEnabled();
+ _rotateY->setEnabled();
+ _rotateZ->setEnabled();
+ }
+ // Extract x, y, z axis rotation from rotation matrix
+ glm::mat4 rotationMatrix = object->rotation();
+ float rotateX = glm::degrees(glm::asin(-rotationMatrix[1][2]));
+ float rotateY = glm::degrees(glm::atan(rotationMatrix[0][2] / rotationMatrix[2][2]));
+ float rotateZ = glm::degrees(glm::atan(rotationMatrix[1][0] / rotationMatrix[1][1]));
+ _rotateX->setValue(rotateX);
+ _rotateY->setValue(rotateY);
+ _rotateZ->setValue(rotateZ);
+
+ if (_object == nullptr) {
+ _lightSwitch->setEnabled();
+ }
+ if (object->hasLight()) {
+ _lightSwitch->select();
+ }
+ else {
+ _lightSwitch->deselect();
+ }
+
+ if (object->hasLight()) {
+ if (_object == nullptr || !_object->hasLight()) {
+ // Enable light related settings
+ _lightDistance->setEnabled();
+ _lightRotateTheta->setEnabled();
+ _lightRotatePhi->setEnabled();
+ _lightCutoffAngle->setEnabled();
+ _lightR->setEnabled();
+ _lightG->setEnabled();
+ _lightB->setEnabled();
+ _lightColorPanel->setEnabled();
+ _lightSwitchIcon->setFont(QFont("Font Awesome 6 Free Solid", 12));
+ }
+ // Update light related settings
+ _lightDistance->setValue(object->originalLight()->idealDistance());
+ _lightRotateTheta->setValue(glm::degrees(glm::acos(object->originalLight()->lightDirection().y)));
+ _lightRotatePhi->setValue(glm::degrees(glm::atan(object->originalLight()->lightDirection().x / object->originalLight()->lightDirection().z)));
+ _lightCutoffAngle->setValue(object->originalLight()->cutOffAngle());
+ if (_lightCutoffAngle->val() != 180.0f) {
+ _lightRotateTheta->setEnabled(true);
+ _lightRotatePhi->setEnabled(true);
+ }
+ else {
+ _lightRotateTheta->setEnabled(false);
+ _lightRotatePhi->setEnabled(false);
+ }
+ _lightR->setValue(object->originalLight()->lightColor().r * 255.0f);
+ _lightG->setValue(object->originalLight()->lightColor().g * 255.0f);
+ _lightB->setValue(object->originalLight()->lightColor().b * 255.0f);
+ _lightColorPanel->select();
+ _lightColorPanel->setColorScheme(QColor(
+ object->originalLight()->lightColor().r * 255.0f,
+ object->originalLight()->lightColor().g * 255.0f,
+ object->originalLight()->lightColor().b * 255.0f
+ ));
+ }
+ else {
+ if (_object != nullptr && _object->hasLight()) {
+ // Disable light related settings
+ _lightDistance->setEnabled(false);
+ _lightRotateTheta->setEnabled(false);
+ _lightRotatePhi->setEnabled(false);
+ _lightCutoffAngle->setEnabled(false);
+ _lightR->setEnabled(false);
+ _lightG->setEnabled(false);
+ _lightB->setEnabled(false);
+ _lightColorPanel->setEnabled(false);
+ _lightSwitchIcon->setFont(QFont("Font Awesome 6 Free Regular", 12));
+ _lightSwitch->deselect();
+ _lightColorPanel->deselect();
+ }
+ }
+ _deleteBtn->setEnabled();
+ }
+
+ if (_object != object || _object == nullptr) {
+ _colorPaletteOn = false;
+ _lightColorSettingPanel->hide();
+ _lightSettingPanel->show();
+ }
+
+ _object = object;
+}
diff --git a/FinalProject/modelsetter.h b/FinalProject/modelsetter.h
index 71fd808..7a65ae3 100644
--- a/FinalProject/modelsetter.h
+++ b/FinalProject/modelsetter.h
@@ -1,3 +1,73 @@
#pragma once
#include
+#include
+#include
+
+#include "renderable.h"
+#include "pushbutton.h"
+#include "modelattrslide.h"
+
+class ModelSetter : public QWidget
+{
+ Q_OBJECT
+
+public:
+ ModelSetter(QWidget* parent = 0);
+ ModelSetter(Renderable* object, QWidget* parent = 0);
+ ~ModelSetter();
+
+private:
+ // UI Elemenets
+ QHBoxLayout* _mainLayout;
+
+ QWidget* _objectSettingPanel;
+ QVBoxLayout* _objectSettingLayout;
+
+ QWidget* _lightSettingButtons;
+ QVBoxLayout* _lightSettingsButtonsLayout;
+
+ QWidget* _lightSettingPanel;
+ QVBoxLayout* _lightSettingLayout;
+
+ QWidget* _lightColorSettingPanel;
+ QVBoxLayout* _lightColorSettingPanelLayout;
+
+ ModelAttributeSlide* _scale;
+ ModelAttributeSlide* _rotateX;
+ ModelAttributeSlide* _rotateY;
+ ModelAttributeSlide* _rotateZ;
+ ModelAttributeSlide* _lightDistance;
+ ModelAttributeSlide* _lightRotateTheta;
+ ModelAttributeSlide* _lightRotatePhi;
+ ModelAttributeSlide* _lightCutoffAngle;
+ ModelAttributeSlide* _lightR;
+ ModelAttributeSlide* _lightG;
+ ModelAttributeSlide* _lightB;
+ QWidget* _lightSwitchPanel;
+ QVBoxLayout* _lightSwitchLayout;
+ PushButton* _lightSwitch;
+ QLabel* _lightSwitchIcon;
+ PushButton* _lightColorPanel;
+ QLabel* _lightColorPanelIcon;
+ PushButton* _deleteBtn;
+ QLabel* _deleteIcon;
+
+ // State
+ Renderable* _object = nullptr;
+ bool _colorPaletteOn = false;
+
+private:
+ void setRotate();
+ void setLightDir();
+ void setLightColor();
+
+public:
+ void update(Renderable* object);
+
+signals:
+ void onAdjustStart();
+ void onAdjustEnd();
+ void onAdjust();
+ void onDeleteObject();
+};