diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/intersect/intersect.cpp | 20 | ||||
-rw-r--r-- | src/raytracer/raytracer.cpp | 64 | ||||
-rw-r--r-- | src/vec4ops/transform4d.cpp | 12 | ||||
-rw-r--r-- | src/vec4ops/vec4ops.h | 4 |
4 files changed, 56 insertions, 44 deletions
diff --git a/src/intersect/intersect.cpp b/src/intersect/intersect.cpp index 3e8493c..2addca4 100644 --- a/src/intersect/intersect.cpp +++ b/src/intersect/intersect.cpp @@ -11,8 +11,11 @@ glm::vec4 intersectCircle( glm::vec4 p, glm::vec4 d, - const RenderShapeData& shape) + const RenderShapeData& shape, + bool &isHit + ) { + isHit = false; // implicit: x^2 + y^2 + z^2 - r^2 = 0, all directions float radius = 0.5f; float a = d.x*d.x + d.y*d.y + d.z*d.z + d[3] * d[3]; @@ -32,11 +35,14 @@ glm::vec4 intersectCircle( return glm::vec4(0.f); } else if (t1 <= 0) // t2 in front of camera { + isHit = true; return p + t2*d; } else if (t2 <= 0) // t1 in front of camera { + isHit = true; return p + t1*d; } else { + isHit = true; float t = std::min(t1, t2); return p + t*d; // want best intersection point } @@ -289,17 +295,19 @@ glm::vec4 intersectCube ( glm::vec4 RayTracer::findIntersection( glm::vec4 p, glm::vec4 d, - const RenderShapeData& shape) + const RenderShapeData& shape, + bool &isHit + ) { switch(shape.primitive.type) { case PrimitiveType::PRIMITIVE_SPHERE: - return intersectCircle(p, d, shape); + return intersectCircle(p, d, shape, isHit); case PrimitiveType::PRIMITIVE_CONE: - return intersectCone(p, d, shape); + return intersectCone(p, d, shape, isHit); case PrimitiveType::PRIMITIVE_CYLINDER: - return intersectCylinder(p, d, shape); + return intersectCylinder(p, d, shape, isHit); case PrimitiveType::PRIMITIVE_CUBE: - return intersectCube(p, d, shape); + return intersectCube(p, d, shape, isHit); case PrimitiveType::PRIMITIVE_MESH: break; } diff --git a/src/raytracer/raytracer.cpp b/src/raytracer/raytracer.cpp index fa949eb..0746225 100644 --- a/src/raytracer/raytracer.cpp +++ b/src/raytracer/raytracer.cpp @@ -83,51 +83,39 @@ glm::vec4 RayTracer::getPixelFromRay( glm::vec4 closestIntersectionWorld; RenderShapeData intersectedShape; - if (m_enableAcceleration) - { - float tWorld = traverseBVH(pWorld, dWorld, intersectedShape, scene.m_bvh); - if (tWorld == FINF) + float minDist = FINF; + // shoot a ray at each shape + for (const RenderShapeData &shape : scene.getShapes()) { + glm::vec4 pObject = Vec4Ops::inverseTransformPoint4(pWorld, shape.inverseCTM, shape.translation4d); + glm::vec4 dObject = glm::normalize(Vec4Ops::transformDir4(dWorld, shape.inverseCTM)); + std::cout << "pObject: " << pObject.w << std::endl; + bool isHit = false; + glm::vec4 newIntersectionObj = findIntersection(pObject, dObject, shape, isHit); + if (!isHit) // no hit { - return glm::vec4(0.f); - } - closestIntersectionWorld = pWorld + tWorld * dWorld; - closestIntersectionObj = intersectedShape.inverseCTM * closestIntersectionWorld; - } - else - { - float minDist = FINF; - // shoot a ray at each shape - for (const RenderShapeData &shape : scene.getShapes()) { - glm::vec4 pObject = shape.inverseCTM * pWorld; - glm::vec4 dObject = glm::normalize(shape.inverseCTM * dWorld); - std::cout << "pObject: " << pObject.w << std::endl; - glm::vec4 newIntersectionObj = findIntersection(pObject, dObject, shape); - if (newIntersectionObj.w == 0) // no hit - { - continue; - } - - auto newIntersectionWorld = shape.ctm * newIntersectionObj; - float newDist = glm::distance(newIntersectionWorld, pWorld); - if ( - newDist < minDist // closer intersection - && !floatEquals(newDist, 0) // and not a self intersection - ) - { - minDist = newDist; - - intersectedShape = shape; - closestIntersectionObj = newIntersectionObj; - closestIntersectionWorld = newIntersectionWorld; - } + continue; } - if (minDist == FINF) // no hit + auto newIntersectionWorld = shape.ctm * newIntersectionObj; + float newDist = glm::distance(newIntersectionWorld, pWorld); + if ( + newDist < minDist // closer intersection + && !floatEquals(newDist, 0) // and not a self intersection + ) { - return glm::vec4(0.f); + minDist = newDist; + + intersectedShape = shape; + closestIntersectionObj = newIntersectionObj; + closestIntersectionWorld = newIntersectionWorld; } } + if (minDist == FINF) // no hit + { + return glm::vec4(0.f); + } + glm::vec4 normalObject = glm::normalize(getNormal(closestIntersectionObj, intersectedShape, scene)); // update glm::vec4 normalWorld = glm::inverse(glm::transpose(intersectedShape.ctm)) * glm::vec4(normalObject); diff --git a/src/vec4ops/transform4d.cpp b/src/vec4ops/transform4d.cpp index 5cc51f3..66ca8e3 100644 --- a/src/vec4ops/transform4d.cpp +++ b/src/vec4ops/transform4d.cpp @@ -15,4 +15,16 @@ glm::vec4 Vec4Ops::inverseTransformPoint4(glm::vec4 point4, glm::mat4 inverseTr point4 += inverseTranslationPointVector; point4 = inverseTranslationPointVector * point4; return point4; +} + +glm::vec4 Vec4Ops::transformDir4(glm::vec4 dir4, glm::mat4 transformDirectionMatrix) { + // do the direction + dir4 = transformDirectionMatrix * dir4; + return dir4; +} + +glm::vec4 Vec4Ops::inverseTransformDir4(glm::vec4 dir4, glm::mat4 inverseTransformDirectionMatrix) { + // do the direction + dir4 = inverseTransformDirectionMatrix * dir4; + return dir4; }
\ No newline at end of file diff --git a/src/vec4ops/vec4ops.h b/src/vec4ops/vec4ops.h index d1c3ac8..f48dcff 100644 --- a/src/vec4ops/vec4ops.h +++ b/src/vec4ops/vec4ops.h @@ -32,6 +32,10 @@ public: static glm::vec4 dot4(glm::vec4 u, glm::vec4 v); static glm::mat4 getViewMatrix4(glm::vec4 fromPoint, glm::vec4 toPoint, glm::vec4 upVector, glm::vec4 lookVector); + + static glm::vec4 transformDir4(glm::vec4 dir4, glm::mat4 transformDirectionMatrix); + + glm::vec4 inverseTransformDir4(glm::vec4 dir4, glm::mat4 inverseTransformDirectionMatrix); }; #endif //PROJECTS_RAY_VEC4OPS_H |