added scenes/trans-boxes.fart, changed Scene to consider all back-faces as front-faces by inverting the normal vector, fixed bug in Scene::calculateLightContribution() which was messing up shadow values and back-face intensities for transparent objects

git-svn-id: svn://anubis/fart/trunk@187 7f9b0f55-74a9-4bce-be96-3c2cd072584d
This commit is contained in:
Josh Holtrop 2009-03-06 19:12:26 +00:00
parent b50c4de1bc
commit 24ef1eca3c
3 changed files with 57 additions and 2 deletions

1
.todo
View File

@ -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()

View File

@ -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> 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;

46
scenes/trans-boxes.fart Normal file
View File

@ -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 }
}
}