diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/accelerate/bvh.cpp | 12 | ||||
-rw-r--r-- | src/mainwindow.cpp | 15 | ||||
-rw-r--r-- | src/mainwindow.h | 1 | ||||
-rw-r--r-- | src/raytracer/raytracer.cpp | 5 | ||||
-rw-r--r-- | src/raytracer/raytracer.h | 1 | ||||
-rw-r--r-- | src/settings.h | 2 | ||||
-rw-r--r-- | src/utils/sceneparser.cpp | 24 | ||||
-rw-r--r-- | src/utils/sceneparser.h | 3 |
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 b393d40..fa949eb 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; } @@ -227,6 +228,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 f8b3721..0943e0d 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 |