aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/accelerate/bvh.cpp12
-rw-r--r--src/mainwindow.cpp15
-rw-r--r--src/mainwindow.h1
-rw-r--r--src/raytracer/raytracer.cpp5
-rw-r--r--src/raytracer/raytracer.h1
-rw-r--r--src/settings.h2
-rw-r--r--src/utils/sceneparser.cpp24
-rw-r--r--src/utils/sceneparser.h3
8 files changed, 55 insertions, 8 deletions
diff --git a/src/accelerate/bvh.cpp b/src/accelerate/bvh.cpp
index ce104a0..19f9390 100644
--- a/src/accelerate/bvh.cpp
+++ b/src/accelerate/bvh.cpp
@@ -83,6 +83,18 @@ float intersectRegion(
return tMin;
}
+void updateAfterCollision(RenderShapeData& objA, RenderShapeData& objB) {
+ glm::vec3 vA_prime = ((objA.mass - objB.mass) * objA.velocity + 2 * objB.mass * objB.velocity) / (objA.mass + objB.mass);
+ glm::vec3 vB_prime = ((objB.mass - objA.mass) * objB.velocity + 2 * objA.mass * objA.velocity) / (objA.mass + objB.mass);
+
+ objA.velocity = glm::vec4(vA_prime, 0.f);
+ objB.velocity = glm::vec4(vB_prime, 0.f);
+
+ objA.position += objA.velocity;
+ objB.position += objB.velocity;
+
+}
+
float RayTracer::traverseBVH(
glm::vec4 p,
glm::vec4 d,
diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp
index 959862d..fbbfa02 100644
--- a/src/mainwindow.cpp
+++ b/src/mainwindow.cpp
@@ -48,7 +48,7 @@ void MainWindow::initialize() {
w_label->setFont(font);
QLabel *rotation_label = new QLabel(); // Rotation label
- rotation_label->setText("Rotation value:");
+ rotation_label->setText("Time value:");
rotation_label->setFont(font);
@@ -190,9 +190,9 @@ void MainWindow::initialize() {
rotationBox = new QDoubleSpinBox();
rotationBox->setMinimum(0.0f);
- rotationBox->setMaximum(180.f);
+ rotationBox->setMaximum(600.f);
rotationBox->setSingleStep(1.f);
- rotationBox->setValue(1.f);
+ rotationBox->setValue(settings.rotation);
lrotation->addWidget(rotationSlider);
lrotation->addWidget(rotationBox);
@@ -253,7 +253,7 @@ void MainWindow::initialize() {
void MainWindow::finish() {
// realtime->finish();
-// delete(realtime);
+// delete(rayTracer);
}
void MainWindow::connectUIElements() {
@@ -273,6 +273,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);
+ connect(rayTracer, &RayTracer::rotationChanged, this, &MainWindow::updateRotationSlider);
connectW();
}
@@ -529,4 +530,10 @@ void MainWindow::updateZwSlider(double value) {
zwSlider->setValue(int(value*100.f));
zwBox->setValue(value);
rayTracer->settingsChanged(imageLabel);
+}
+
+void MainWindow::updateRotationSlider(float value) {
+ rotationSlider->setValue(int(value*100.f));
+ rotationBox->setValue(value);
+ rayTracer->settingsChanged(imageLabel);
} \ No newline at end of file
diff --git a/src/mainwindow.h b/src/mainwindow.h
index 8d46dd4..d6a929b 100644
--- a/src/mainwindow.h
+++ b/src/mainwindow.h
@@ -80,6 +80,7 @@ private slots:
void updateYzSlider(double newValue);
void updateYwSlider(double newValue);
void updateZwSlider(double newValue);
+ void updateRotationSlider(float newValue);
void onValChangeWSlider(int newValue);
void onValChangeWBox(double newValue);
};
diff --git a/src/raytracer/raytracer.cpp b/src/raytracer/raytracer.cpp
index acb229a..2e47ec7 100644
--- a/src/raytracer/raytracer.cpp
+++ b/src/raytracer/raytracer.cpp
@@ -63,6 +63,7 @@ void RayTracer::render(RGBA *imageData, const RayTraceScene &scene) {
}
}
}
+ settings.rotation += 0.5f;
}
@@ -230,6 +231,10 @@ void RayTracer::settingsChanged(QLabel* imageLabel) {
QImage flippedImage = image.mirrored(false, false);
flippedImage = flippedImage.scaled(width, height, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
imageLabel->setPixmap(QPixmap::fromImage(flippedImage));
+ // QTimer::singleShot(3500, this, [this, imageLabel]() {
+ // // This code will be executed after a 2-second delay
+ // emit rotationChanged(settings.rotation);
+ // });
}
void RayTracer::keyPressEvent(QKeyEvent *event) {
diff --git a/src/raytracer/raytracer.h b/src/raytracer/raytracer.h
index 9bbeb5c..f1fb697 100644
--- a/src/raytracer/raytracer.h
+++ b/src/raytracer/raytracer.h
@@ -174,5 +174,6 @@ signals:
void yzRotationChanged(float value);
void ywRotationChanged(float value);
void zwRotationChanged(float value);
+ void rotationChanged(float value);
};
diff --git a/src/settings.h b/src/settings.h
index 0bf4dcc..1d9e358 100644
--- a/src/settings.h
+++ b/src/settings.h
@@ -12,7 +12,7 @@ struct Settings {
float xw = 0.f;
float yw = 0.f;
float zw = 0.f;
- float rotation = 1.f;
+ float rotation = 0.f;
bool negative = false;
float w = 0.f;
};
diff --git a/src/utils/sceneparser.cpp b/src/utils/sceneparser.cpp
index 009873b..bc39109 100644
--- a/src/utils/sceneparser.cpp
+++ b/src/utils/sceneparser.cpp
@@ -38,9 +38,8 @@ TextureData loadTextureFromFile(const QString &file) {
// helper to handle recursive creation of tree
void initTree(SceneNode* currentNode, std::vector<RenderShapeData> *shapes, std::vector<SceneLightData> *lights, glm::mat4 currentCTM, glm::vec4 currentTranslation4d) {
if (currentNode->transformations.size() == 0) {
- // ScenePa.rser::translate4(currentTranslation4d, glm::vec4(0.f, 0.f, 0.f, settings.w));
- // convert currentTranslation4d to a 4x4 matrix
- currentCTM = glm::translate(glm::mat4(1.0f), glm::vec3(currentTranslation4d));
+ SceneParser::translate4(currentTranslation4d, glm::vec4(0.f, -0.0098f * settings.rotation, 0.f, settings.w));
+ // currentCTM = glm::translate(glm::mat4(1.0f), glm::vec3(currentTranslation4d));
currentCTM *= SceneParser::getRotationMatrix4(1.f, glm::vec3(settings.xy, settings.xz, settings.yz), glm::vec3(settings.xw, settings.yw, settings.zw));
}
@@ -74,14 +73,33 @@ void initTree(SceneNode* currentNode, std::vector<RenderShapeData> *shapes, std:
for(auto primitive : currentNode->primitives) {
// primitive->material.textureData = loadTextureFromFile(QString::fromStdString(primitive->material.textureMap.filename));
+ // float unitMass = 1.f;
+ // switch (primitive->type)
+ // {
+ // case PrimitiveType::PRIMITIVE_CUBE:
+ // unitMass = 0.5f * 0.5f * 0.5f;
+ // break;
+ // case PrimitiveType::PRIMITIVE_SPHERE:
+ // unitMass = 4.f / 3.f * 3.14159f * 0.5f * 0.5f * 0.5f;
+ // break;
+ // case PrimitiveType::PRIMITIVE_CONE:
+ // unitMass = 1.f / 3.f * 3.14159f * 0.5f * 0.5f * 0.5f;
+ // break;
+ // case PrimitiveType::PRIMITIVE_CYLINDER:
+ // unitMass = 3.14159f * 0.5f * 0.5f * 0.5f;
+ // break;
RenderShapeData rsd = {
.primitive = *primitive,
.ctm = currentCTM,
.translation4d = currentTranslation4d,
.inverseCTM = glm::inverse(currentCTM),
.inverseTranslation4d = -currentTranslation4d,
+ // .position = glm::vec4(0.f, 0.f, 0.f, 1.f),
+ // .velocity = glm::vec4(0.f, 0.f, 0.f, 0.f),
+ // .mass = unitMass,
};
shapes->push_back(rsd);
+ // }
}
// add the lights
diff --git a/src/utils/sceneparser.h b/src/utils/sceneparser.h
index 130156a..3ab93a8 100644
--- a/src/utils/sceneparser.h
+++ b/src/utils/sceneparser.h
@@ -12,6 +12,9 @@ struct RenderShapeData {
glm::vec4 translation4d; // appended to the right of the ctm (for 4d translation)
glm::mat4 inverseCTM;
glm::vec4 inverseTranslation4d; // appended to the right of the inverse ctm (for 4d translation)
+ glm::vec4 position;
+ glm::vec4 velocity;
+ float mass;
};
// Struct which contains all the data needed to render a scene