diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/camera/camera.cpp | 31 | ||||
-rw-r--r-- | src/camera/camera.h | 3 | ||||
-rw-r--r-- | src/mainwindow.cpp | 73 | ||||
-rw-r--r-- | src/mainwindow.h | 5 | ||||
-rw-r--r-- | src/settings.h | 1 |
5 files changed, 75 insertions, 38 deletions
diff --git a/src/camera/camera.cpp b/src/camera/camera.cpp index 62e8021..b63164b 100644 --- a/src/camera/camera.cpp +++ b/src/camera/camera.cpp @@ -1,5 +1,6 @@ #include <stdexcept> #include "camera.h" +#include "4dvecops/vec4ops.h" Camera::Camera(SceneCameraData cameraData) : m_pos(cameraData.pos), @@ -7,33 +8,11 @@ Camera::Camera(SceneCameraData cameraData) : m_focalLength(cameraData.focalLength), m_aperture(cameraData.aperture) { - // VIEW MATRIX INTIALIZATION - // cast to 3 for dots & cross - glm::vec3 look3{cameraData.look.x, cameraData.look.y, cameraData.look.z}; - glm::vec3 up3{cameraData.up.x, cameraData.up.y, cameraData.up.z}; + m_viewMatrix = Vec4Ops::getViewMatrix4(cameraData.pos, glm::vec4(0.f), cameraData.up, cameraData.look); + m_translationVector = glm::vec4{-cameraData.pos.x, -cameraData.pos.y, -cameraData.pos.z, -cameraData.pos.w}; - // calculate new basis - glm::vec3 e0 = -glm::normalize(look3); - glm::vec3 e1 = glm::normalize(up3 - glm::dot(up3, e0) * e0); - glm::vec3 e2 = glm::cross(e1, e0); - - glm::mat4 alignment - { - e2.x, e1.x, e0.x, 0.f, - e2.y, e1.y, e0.y, 0.f, - e2.z, e1.z, e0.z, 0.f, - 0.f, 0.f, 0.f, 1.f - }; - glm::mat4 translation - { - 1.f, 0.f, 0.f, 0.f, - 0.f, 1.f, 0.f, 0.f, - 0.f, 0.f, 1.f, 0.f, - -cameraData.pos.x, -cameraData.pos.y, -cameraData.pos.z, 1.f - }; - - m_viewMatrix = alignment * translation; - m_inverse = glm::inverse(m_viewMatrix); + m_inverseViewMatrix = glm::inverse(m_viewMatrix); + m_inverseTranslationVector = -m_translationVector; } diff --git a/src/camera/camera.h b/src/camera/camera.h index e0cd013..4fa9ab0 100644 --- a/src/camera/camera.h +++ b/src/camera/camera.h @@ -45,5 +45,8 @@ private: float m_focalLength; float m_aperture; + + glm::vec4 m_translationVector; + glm::vec4 m_inverseTranslationVector; }; diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 5da720b..088fa1c 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -43,6 +43,9 @@ void MainWindow::initialize() { QLabel *zw_label = new QLabel(); // ZW label zw_label->setText("ZW value:"); zw_label->setFont(font); + QLabel *w_label = new QLabel(); // W label + w_label->setText("W value:"); + w_label->setFont(font); QLabel *rotation_label = new QLabel(); // Rotation label rotation_label->setText("Rotation value:"); @@ -61,12 +64,12 @@ void MainWindow::initialize() { xySlider = new QSlider(Qt::Orientation::Horizontal); // XY value slider xySlider->setTickInterval(1); - xySlider->setMinimum(-36000); + xySlider->setMinimum(0); xySlider->setMaximum(36000); xySlider->setValue(0); xyBox = new QDoubleSpinBox(); - xyBox->setMinimum(-360.0f); + xyBox->setMinimum(0.0f); xyBox->setMaximum(360.f); xyBox->setSingleStep(1.f); xyBox->setValue(0.f); @@ -81,12 +84,12 @@ void MainWindow::initialize() { xzSlider = new QSlider(Qt::Orientation::Horizontal); // XY value slider xzSlider->setTickInterval(1); - xzSlider->setMinimum(-36000); + xzSlider->setMinimum(0); xzSlider->setMaximum(36000); xzSlider->setValue(0); xzBox = new QDoubleSpinBox(); - xzBox->setMinimum(-360.0f); + xzBox->setMinimum(0.0f); xzBox->setMaximum(360.f); xzBox->setSingleStep(1.f); xzBox->setValue(0.f); @@ -101,12 +104,12 @@ void MainWindow::initialize() { xwSlider = new QSlider(Qt::Orientation::Horizontal); // XY value slider xwSlider->setTickInterval(1); - xwSlider->setMinimum(-36000); + xwSlider->setMinimum(0); xwSlider->setMaximum(36000); xwSlider->setValue(0); xwBox = new QDoubleSpinBox(); - xwBox->setMinimum(-360.0f); + xwBox->setMinimum(0.0f); xwBox->setMaximum(360.f); xwBox->setSingleStep(1.f); xwBox->setValue(0.f); @@ -121,12 +124,12 @@ void MainWindow::initialize() { yzSlider = new QSlider(Qt::Orientation::Horizontal); // XY value slider yzSlider->setTickInterval(1); - yzSlider->setMinimum(-36000); + yzSlider->setMinimum(0); yzSlider->setMaximum(36000); yzSlider->setValue(0); yzBox = new QDoubleSpinBox(); - yzBox->setMinimum(-360.0f); + yzBox->setMinimum(0.0f); yzBox->setMaximum(360.f); yzBox->setSingleStep(1.f); yzBox->setValue(0.f); @@ -141,12 +144,12 @@ void MainWindow::initialize() { ywSlider = new QSlider(Qt::Orientation::Horizontal); // XY value slider ywSlider->setTickInterval(1); - ywSlider->setMinimum(-36000); + ywSlider->setMinimum(0); ywSlider->setMaximum(36000); ywSlider->setValue(0); ywBox = new QDoubleSpinBox(); - ywBox->setMinimum(-360.0f); + ywBox->setMinimum(0.0f); ywBox->setMaximum(360.f); ywBox->setSingleStep(1.f); ywBox->setValue(0.f); @@ -161,12 +164,12 @@ void MainWindow::initialize() { zwSlider = new QSlider(Qt::Orientation::Horizontal); // XY value slider zwSlider->setTickInterval(1); - zwSlider->setMinimum(-36000); + zwSlider->setMinimum(0); zwSlider->setMaximum(36000); zwSlider->setValue(0); zwBox = new QDoubleSpinBox(); - zwBox->setMinimum(-360.0f); + zwBox->setMinimum(0.0f); zwBox->setMaximum(360.f); zwBox->setSingleStep(1.f); zwBox->setValue(0.f); @@ -200,6 +203,27 @@ void MainWindow::initialize() { rotateNegative->setText(QStringLiteral("Reverse Rotation")); rotateNegative->setChecked(false); + // w Slider + QGroupBox *wLayout = new QGroupBox(); // horizonal w slider alignment + QHBoxLayout *lw = new QHBoxLayout(); + + wSlider = new QSlider(Qt::Orientation::Horizontal); // XY value slider + wSlider->setTickInterval(1); + wSlider->setMinimum(-5000); + wSlider->setMaximum(5000); + wSlider->setValue(0); + + wBox = new QDoubleSpinBox(); + wBox->setMinimum(-50.0f); + wBox->setMaximum(50.f); + wBox->setSingleStep(1.f); + wBox->setValue(0.f); + + lw->addWidget(wSlider); + lw->addWidget(wBox); + wLayout->setLayout(lw); + + vLayout->addWidget(uploadFile); vLayout->addWidget(saveImage); vLayout->addWidget(xy_label); @@ -214,11 +238,14 @@ void MainWindow::initialize() { vLayout->addWidget(ywLayout); vLayout->addWidget(zw_label); vLayout->addWidget(zwLayout); + vLayout->addWidget(w_label); + vLayout->addWidget(wLayout); vLayout->addWidget(rotation_label); vLayout->addWidget(rotationLayout); vLayout->addWidget(rotateNegative); + connectUIElements(); onValChangexyBox(0.0f); @@ -228,6 +255,7 @@ void MainWindow::initialize() { onValChangeywBox(0.0f); onValChangezwBox(0.0f); onValChangeRotationBox(1.0f); + onValChangeWBox(0.0f); } void MainWindow::finish() { @@ -252,6 +280,7 @@ void MainWindow::connectUIElements() { connect(rayTracer, &RayTracer::yzRotationChanged, this, &MainWindow::updateYzSlider); connect(rayTracer, &RayTracer::ywRotationChanged, this, &MainWindow::updateYwSlider); connect(rayTracer, &RayTracer::zwRotationChanged, this, &MainWindow::updateZwSlider); + connectW(); } void MainWindow::connectUploadFile() { @@ -308,6 +337,12 @@ void MainWindow::connectNegativeRotation() { connect(rotateNegative, &QCheckBox::clicked, this, &MainWindow::onRotateNegative); } +void MainWindow::connectW() { + connect(wSlider, &QSlider::valueChanged, this, &MainWindow::onValChangeWSlider); + connect(wBox, static_cast<void(QDoubleSpinBox::*)(double)>(&QDoubleSpinBox::valueChanged), + this, &MainWindow::onValChangeWBox); +} + void MainWindow::onUploadFile() { // Get abs path of scene file QString configFilePath = QFileDialog::getOpenFileName(this, tr("Upload File"), @@ -449,6 +484,20 @@ void MainWindow::onValChangeRotationBox(double newValue) { rayTracer->settingsChanged(imageLabel); } +void MainWindow::onValChangeWSlider(int newValue) { + //wSlider->setValue(newValue); + wBox->setValue(newValue/100.f); + settings.w = wBox->value(); + rayTracer->settingsChanged(imageLabel); +} + +void MainWindow::onValChangeWBox(double newValue) { + wSlider->setValue(int(newValue*100.f)); + //wBox->setValue(newValue); + settings.w = wBox->value(); + rayTracer->settingsChanged(imageLabel); +} + void MainWindow::onRotateNegative() { settings.negative = !settings.negative; } diff --git a/src/mainwindow.h b/src/mainwindow.h index 35498ee..986a911 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -32,6 +32,7 @@ private: void connectzw(); void connectRotationSlider(); void connectNegativeRotation(); + void connectW(); RayTracer *rayTracer; AspectRatioWidget *aspectRatioWidget; @@ -52,6 +53,8 @@ private: QSlider *rotationSlider; QDoubleSpinBox *rotationBox; QCheckBox *rotateNegative; + QSlider *wSlider; + QDoubleSpinBox *wBox; private slots: @@ -78,4 +81,6 @@ private slots: void updateYzSlider(double newValue); void updateYwSlider(double newValue); void updateZwSlider(double newValue); + void onValChangeWSlider(int newValue); + void onValChangeWBox(double newValue); }; diff --git a/src/settings.h b/src/settings.h index f114226..0bf4dcc 100644 --- a/src/settings.h +++ b/src/settings.h @@ -14,6 +14,7 @@ struct Settings { float zw = 0.f; float rotation = 1.f; bool negative = false; + float w = 0.f; }; |