diff options
| author | David Doan <daviddoan@Davids-MacBook-Pro-70.local> | 2023-12-07 21:57:21 -0500 |
|---|---|---|
| committer | David Doan <daviddoan@Davids-MacBook-Pro-70.local> | 2023-12-07 21:57:21 -0500 |
| commit | 940a2361da8f51ab2547f1b7bfd42dc1c8645642 (patch) | |
| tree | 5916cfed50ae675ae10275c1134fc522ee59bae3 /src/raytracer | |
| parent | caa765bff49d54217b75aaf0e7acf4e5392a11e4 (diff) | |
added a GUI
Diffstat (limited to 'src/raytracer')
| -rw-r--r-- | src/raytracer/raytracer.cpp | 62 | ||||
| -rw-r--r-- | src/raytracer/raytracer.h | 26 |
2 files changed, 80 insertions, 8 deletions
diff --git a/src/raytracer/raytracer.cpp b/src/raytracer/raytracer.cpp index c3466cf..93f5225 100644 --- a/src/raytracer/raytracer.cpp +++ b/src/raytracer/raytracer.cpp @@ -3,16 +3,19 @@ #include <iostream> #include "raytracer.h" #include "raytracescene.h" +#include "settings.h" +#include "mainwindow.h" //struct Ray { // glm::vec3 p; // glm::vec3 d; //}; -RayTracer::RayTracer(const Config &config) : m_config(config) {} +// RayTracer::RayTracer(const Config &config) : m_config(config) {} +RayTracer::RayTracer(QWidget *parent) : QWidget(parent) {} void RayTracer::render(RGBA *imageData, const RayTraceScene &scene) { - if(m_config.enableParallelism) + if(m_enableParallelism) { renderParallel(imageData, scene); return; @@ -53,7 +56,7 @@ glm::vec4 RayTracer::getPixelFromRay( const RayTraceScene &scene, int depth) { - if (depth > m_config.maxRecursiveDepth) + if (depth > m_maxRecursiveDepth) { return glm::vec4(0.f); } @@ -63,7 +66,7 @@ glm::vec4 RayTracer::getPixelFromRay( glm::vec4 closestIntersectionWorld; RenderShapeData intersectedShape; - if (m_config.enableAcceleration) + if (m_enableAcceleration) { float tWorld = traverseBVH(pWorld, dWorld, intersectedShape, scene.m_bvh); if (tWorld == FINF) @@ -147,4 +150,53 @@ glm::vec4 RayTracer::secondaryRays(glm::vec4 pWorld, glm::vec4 dWorld, RayTraceS } return illumination / (float) TIMES; -}
\ No newline at end of file +} + +void RayTracer::sceneChanged(QLabel* imageLabel) { + // RenderData metaData; + + bool success = SceneParser::parse(settings.sceneFilePath, m_metaData); + + if (!success) { + std::cerr << "Error loading scene: \"" << settings.sceneFilePath << "\"" << std::endl; + return; + } + + int width = 576; + int height = 432; + + // render the scene + QImage image = QImage(width, height, QImage::Format_RGBX8888); + image.fill(Qt::black); + RGBA *data = reinterpret_cast<RGBA *>(image.bits()); + + + + // RayTracer raytracer{ rtConfig }; + + RayTraceScene rtScene{ width, height, m_metaData }; + this->render(data, rtScene); + + QImage flippedImage = image.mirrored(false, false); + // make the image larger + flippedImage = flippedImage.scaled(2*width, 2*height, Qt::IgnoreAspectRatio, Qt::SmoothTransformation); + imageLabel->setPixmap(QPixmap::fromImage(flippedImage)); +} + +void RayTracer::settingsChanged(QLabel* imageLabel) { + int width = 576; + int height = 432; + + QImage image = QImage(width, height, QImage::Format_RGBX8888); + image.fill(Qt::black); + RGBA *data = reinterpret_cast<RGBA *>(image.bits()); + + RayTraceScene rtScene{ width, height, m_metaData }; + this->render(data, rtScene); + + QImage flippedImage = image.mirrored(false, false); + flippedImage = flippedImage.scaled(2*width, 2*height, Qt::IgnoreAspectRatio, Qt::SmoothTransformation); + imageLabel->setPixmap(QPixmap::fromImage(flippedImage)); +} + + diff --git a/src/raytracer/raytracer.h b/src/raytracer/raytracer.h index 6a16cdf..5fbe907 100644 --- a/src/raytracer/raytracer.h +++ b/src/raytracer/raytracer.h @@ -6,6 +6,8 @@ #include "raytracescene.h" #include "accelerate/kdtree.h" #include "accelerate/bvh.h" +#include <QOpenGLWidget> +#include <QLabel> // A forward declaration for the RaytraceScene class @@ -31,12 +33,12 @@ struct Config { bool onlyRenderNormals = false; }; -class RayTracer +class RayTracer : public QWidget { public: // constructor for the config - explicit RayTracer(const Config &config); - const Config &m_config; + RayTracer(QWidget *parent = nullptr); +// const Config &m_config; // Renders the scene synchronously. // The ray-tracer will render the scene and fill imageData in-place. @@ -136,5 +138,23 @@ public: // depth of field glm::vec4 secondaryRays(glm::vec4 pWorld, glm::vec4 dWorld, RayTraceScene &scene); + + // Old m_config + + bool m_enableShadow = true; + bool m_enableReflection = true; + bool m_enableRefraction = false; + bool m_enableTextureMap = false; + bool m_enableAcceleration = true; + bool m_enableParallelism = true; + int m_maxRecursiveDepth = 4; + bool m_enableAntiAliasing = false; + bool m_enableDepthOfField = false; + bool m_enableSuperSample = false; + + void sceneChanged(QLabel* imageLabel); + void settingsChanged(QLabel* imageLabel); + RenderData m_metaData; + }; |
