aboutsummaryrefslogtreecommitdiff
path: root/src/raytracer
diff options
context:
space:
mode:
authorDavid Doan <daviddoan@Davids-MacBook-Pro-70.local>2023-12-07 21:57:21 -0500
committerDavid Doan <daviddoan@Davids-MacBook-Pro-70.local>2023-12-07 21:57:21 -0500
commit940a2361da8f51ab2547f1b7bfd42dc1c8645642 (patch)
tree5916cfed50ae675ae10275c1134fc522ee59bae3 /src/raytracer
parentcaa765bff49d54217b75aaf0e7acf4e5392a11e4 (diff)
added a GUI
Diffstat (limited to 'src/raytracer')
-rw-r--r--src/raytracer/raytracer.cpp62
-rw-r--r--src/raytracer/raytracer.h26
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;
+
};