aboutsummaryrefslogtreecommitdiff
path: root/src/accelerate/myqtconcurrent.cpp
diff options
context:
space:
mode:
authorsotech117 <michael_foiani@brown.edu>2023-12-07 16:23:20 -0500
committersotech117 <michael_foiani@brown.edu>2023-12-07 16:23:20 -0500
commitcaa765bff49d54217b75aaf0e7acf4e5392a11e4 (patch)
tree9b92914dfb88b99599e8e60e4512e9e9ea9a25db /src/accelerate/myqtconcurrent.cpp
parenta9274459443f1d560d7580a162deb581549980cb (diff)
upload base code
Diffstat (limited to 'src/accelerate/myqtconcurrent.cpp')
-rw-r--r--src/accelerate/myqtconcurrent.cpp80
1 files changed, 80 insertions, 0 deletions
diff --git a/src/accelerate/myqtconcurrent.cpp b/src/accelerate/myqtconcurrent.cpp
new file mode 100644
index 0000000..1dff0e0
--- /dev/null
+++ b/src/accelerate/myqtconcurrent.cpp
@@ -0,0 +1,80 @@
+
+#include <QList>
+#include <QtConcurrent>
+#include "raytracer/raytracer.h"
+
+struct pixelRoutineArgs {
+ glm::vec4 pCamera;
+ glm::vec4 dCamera;
+ const RayTraceScene &scene;
+ RayTracer rt;
+};
+static RGBA pixelRoutine(pixelRoutineArgs args);
+
+void RayTracer::renderParallel(RGBA *imageData, const RayTraceScene &scene)
+{
+ Camera camera = scene.getCamera();
+ float cameraDepth = 1.f;
+ float viewplaneHeight = 2.f*cameraDepth*std::tan(camera.getHeightAngle() / 2.f);
+ float viewplaneWidth = cameraDepth*viewplaneHeight*((float)scene.width()/(float)scene.height());
+
+ QList<pixelRoutineArgs> l{};
+ for (int imageRow = 0; imageRow < scene.height(); imageRow++) {
+ for (int imageCol = 0; imageCol < scene.width(); imageCol++) {
+ float xCameraSpace = viewplaneWidth *
+ (-.5f + (imageCol + .5f) / scene.width());
+ float yCameraSpace = viewplaneHeight *
+ (-.5f + (imageRow + .5f) / scene.height());
+
+ glm::vec4 pixelDirCamera{xCameraSpace, -yCameraSpace, -cameraDepth, 0.f}; //w=0 for dir
+ glm::vec4 eyeCamera{0.f, 0.f, 0.f, 1.f}; // w=1.f for point
+ l.append({
+ eyeCamera, // eye
+ pixelDirCamera, // direction
+ scene,
+ *this
+ });
+
+ }
+ }
+ QList<RGBA> pixels = QtConcurrent::blockingMapped(l, pixelRoutine);
+ QtConcurrent::blockingMap(l, pixelRoutine);
+ int index = 0;
+ for (RGBA p : pixels) {
+ imageData[index++] = p;
+ }
+
+ if (m_config.enableAntiAliasing)
+ {
+ filterBlur(imageData, scene.width(), scene.height());
+ }
+}
+
+
+RGBA pixelRoutine(pixelRoutineArgs args)
+{
+ auto eyeCamera = args.pCamera;
+ auto pixelDirCamera = args.dCamera;
+ auto scene = args.scene;
+ auto rt = args.rt;
+
+ // convert camera space to world space
+ auto inv = scene.getCamera().getInverseViewMatrix();
+ glm::vec4 pWorld = inv * eyeCamera;
+ glm::vec4 dWorld = glm::normalize(inv * pixelDirCamera);
+
+ if (rt.m_config.enableDepthOfField)
+ {
+ // if we're doing depth of field, we need to shoot multiple rays, see camera.cpp
+ return RayTracer::toRGBA(rt.secondaryRays(pWorld, dWorld, scene));
+ }
+ if (rt.m_config.enableSuperSample)
+ {
+ // if we're doing super sampling, we need to shoot multiple rays, see raytracer.cpp
+ return rt.superSample(eyeCamera, pixelDirCamera, scene);
+ }
+
+ // shoot ray!
+ RGBA pixel = RayTracer::toRGBA(rt.getPixelFromRay(pWorld, dWorld, scene, 0));
+ return pixel;
+}