aboutsummaryrefslogtreecommitdiff
path: root/src/raytracer/raytracer.cpp
diff options
context:
space:
mode:
authorDavid Doan <daviddoan@Davids-MacBook-Pro-193.local>2023-12-13 03:58:13 -0500
committerDavid Doan <daviddoan@Davids-MacBook-Pro-193.local>2023-12-13 03:58:13 -0500
commiteaea332f31d8f14caf2f4675779241ad30655fc3 (patch)
tree27171231562e677ce72e7c0daeda707f2e6f93d6 /src/raytracer/raytracer.cpp
parent87e614254bc0b1ad0f2ac28a5092c97caab09d7a (diff)
camera movement
Diffstat (limited to 'src/raytracer/raytracer.cpp')
-rw-r--r--src/raytracer/raytracer.cpp85
1 files changed, 42 insertions, 43 deletions
diff --git a/src/raytracer/raytracer.cpp b/src/raytracer/raytracer.cpp
index d6fa14f..3a06910 100644
--- a/src/raytracer/raytracer.cpp
+++ b/src/raytracer/raytracer.cpp
@@ -26,6 +26,14 @@ RayTracer::RayTracer(QWidget *parent) : QWidget(parent) {
m_depth = 500;
m_image = QImage(m_width, m_height, QImage::Format_RGBX8888);
+// m_camera = nullptr;
+}
+
+glm::vec4 getPt(glm::vec3 n1 , glm::vec3 n2 , float perc )
+{
+ glm::vec3 diff = n2 - n1;
+
+ return glm::vec4(n1 + ( diff * perc ), 0.0f);
}
// updated to use 4D
@@ -79,6 +87,7 @@ void RayTracer::render(RGBA *imageData, const RayTraceScene &scene) {
emit settingsChanged(m_imageLabel); // emit to allow the UI to update then render the next frame
}
}
+ emit cameraPositionChanged(m_metaData.cameraData.pos);
}
@@ -219,12 +228,44 @@ void RayTracer::settingsChanged(QLabel* imageLabel) {
image.fill(Qt::black);
RGBA *data = reinterpret_cast<RGBA *>(image.bits());
- RayTraceScene rtScene{ width, height, m_metaData };
+ RayTraceScene rtScene{ m_width, m_height, m_metaData, m_depth };
+ Camera camera = rtScene.getCamera();
+ if (m_controlPointIndex % 3 == 0) {
+ m_controlPoints = camera.m_controlPoints;
+ }
+
+ auto P1 = m_controlPoints[m_controlPointIndex];
+ auto P2 = m_controlPoints[m_controlPointIndex];
+ auto P3 = m_controlPoints[m_controlPointIndex];
+ auto P4 = m_controlPoints[m_controlPointIndex];
+
+ glm::vec4 xa = getPt(P1, P2, settings.currentTime);
+ glm::vec4 xb = getPt(P2, P3, settings.currentTime);
+ glm::vec4 xc = getPt(P3, P4, settings.currentTime);
+
+ // Calculate points on the lines between the above points
+ glm::vec4 xm = getPt(xa, xb, settings.currentTime);
+ glm::vec4 xn = getPt(xb, xc, settings.currentTime);
+
+ // Calculate the final point on the Bezier curve
+ glm::vec4 pointOnCurve = getPt(xm, xn, settings.currentTime);
+ m_metaData.cameraData.pos = pointOnCurve;
+
+ settings.xy += 4.f;
+ if (m_controlPointIndex % 1 == 0) {
+ settings.xz += 8.f;
+ }
+ if (m_controlPointIndex % 3 == 0){
+ settings.yz += 8.f;
+ }
this->render(data, rtScene);
QImage flippedImage = image.mirrored(false, false);
flippedImage = flippedImage.scaled(width, height, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
imageLabel->setPixmap(QPixmap::fromImage(flippedImage));
+ m_controlPointIndex++;
+
+
// QTimer::singleShot(3500, this, [this, imageLabel]() {
// // This code will be executed after a 2-second delay
// emit rotationChanged(settings.rotation);
@@ -232,48 +273,6 @@ void RayTracer::settingsChanged(QLabel* imageLabel) {
m_image = image;
}
-glm::vec4 getPt(glm::vec3 n1 , glm::vec3 n2 , float perc )
-{
- glm::vec3 diff = n2 - n1;
-
- return glm::vec4(n1 + ( diff * perc ), 0.0f);
-}
-
-void RayTracer::wSliderChanged(QLabel* imageLabel) {
- // auto P1 = cameraControlPoints[0];
- // auto P2 = scene.getCamera().controlPoints[1];
- // auto P3 = scene.getCamera().controlPoints[2];
- // auto P4 = scene.getCamera().controlPoints[3];
- // for( float i = 0 ; i < 1 ; i += 0.01 )
- // {
- // glm::vec3 xa = getPt(P1, P2, i);
- // glm::vec3 xb = getPt(P2, P3, i);
- // glm::vec3 xc = getPt(P3, P4, i);
-
- // // Calculate points on the lines between the above points
- // glm::vec3 xm = getPt(xa, xb, i);
- // glm::vec3 xn = getPt(xb, xc, i);
-
- // // Calculate the final point on the Bezier curve
- // glm::vec3 pointOnCurve = getPt(xm, xn, i);
-
- // // update the camera position
- // m_metaData.cameraData.pos = pointOnCurve;
- // RayTraceScene rtScene{ m_width, m_height, m_metaData, m_depth };
- // this->render(m_imageData, rtScene);
- // QTimer::singleShot(3500, this, [this, imageLabel]() {
- // // This code will be executed after a 2-second delay
- // // emit rotationChanged(settings.rotation);
- // QImage flippedImage = m_image.mirrored(false, false);
- // flippedImage = flippedImage.scaled(m_width, m_height, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
- // imageLabel->setPixmap(QPixmap::fromImage(flippedImage));
- // });
- // }
-
- // emit cameraPositionChanged(m_metaData.cameraData.pos);
-
-}
-
void RayTracer::keyPressEvent(QKeyEvent *event) {
m_keyMap[Qt::Key(event->key())] = true;
std::cout << "key pressed" << std::endl;