aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/intersect/intersect.cpp20
-rw-r--r--src/raytracer/raytracer.cpp64
-rw-r--r--src/vec4ops/transform4d.cpp12
-rw-r--r--src/vec4ops/vec4ops.h4
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