diff --git a/.todo b/.todo index f3b4ce2..7c87e6c 100644 --- a/.todo +++ b/.todo @@ -4,3 +4,4 @@ FART To-Do List - Continue for transparency - Scan for cameras before scene items - Test subtractions of subtractions +- Add built-in timing around Scene::render() diff --git a/main/Scene.cc b/main/Scene.cc index 4aa3a26..3e13f12 100644 --- a/main/Scene.cc +++ b/main/Scene.cc @@ -158,6 +158,13 @@ Color Scene::traceRayRecurse(const Ray & ray, int depth, double factor) Vector surfacePoint = ray[hit.dist]; Vector surfaceNormal = hit.shape->getNormalAt(surfacePoint); + /* check for backfaces */ + if (ray.getDirection() % surfaceNormal > 0.0) + { + /* if dot product is positive, this is a back-face */ + surfaceNormal = -surfaceNormal; + } + color = computePhong(material, ray, surfacePoint, @@ -215,7 +222,6 @@ Scene::ShapeDistance Scene::getRayClosestHit(const Ray & ray) { refptr shape = intersections[i].shape; const Vector & isect_point = intersections[i].vector; - Vector normal = shape->getNormalAt(isect_point); double intersect_dist = (isect_point - ray.getOrigin()).mag(); if (foundOne == false || intersect_dist < hit.dist) { @@ -313,7 +319,9 @@ double Scene::calculateLightContribution(const Ray & toLight, if ( contrib < SCENE_FACTOR_THRESHOLD ) break; - dist_so_far += hit.dist + 0.0001; + double offset = hit.dist + 0.0001; + dist_so_far += offset; + currentRay = currentRay.shift(offset); } return contrib; diff --git a/scenes/trans-boxes.fart b/scenes/trans-boxes.fart new file mode 100644 index 0000000..95195f7 --- /dev/null +++ b/scenes/trans-boxes.fart @@ -0,0 +1,46 @@ + +scene +{ + options + { + width 800 + height 600 + multisample 3 + } + + camera + { + position <3, -4, 4> + look_at <0, 0, 0> + up <0, 0, 1> + } + + light { position <5, -2, 5> } + + plane + { + position <0, 0, 1>, 0 + material { color <0.8, 0.8, 0.8> } + } + + box + { + size <1, 1, 1> + translate <0, -1.5, 0.6> + material { color <0, 0, 1> transparency 0.8 } + } + + box + { + size <1, 1, 1> + translate <0, 0, 0.6> + material { color <0, 0, 1> transparency 0.4 } + } + + box + { + size <1, 1, 1> + translate <0, 1.5, 0.6> + material { color <0, 0, 1> transparency 0.1 } + } +}