Manta Interactive Ray Tracer Development Mailing List

Text archives Help


[MANTA] r1548 - trunk/Model/Lights


Chronological Thread 
  • From: boulos@sci.utah.edu
  • To: manta@sci.utah.edu
  • Subject: [MANTA] r1548 - trunk/Model/Lights
  • Date: Tue, 24 Jul 2007 19:11:33 -0600 (MDT)

Author: boulos
Date: Tue Jul 24 19:11:33 2007
New Revision: 1548

Modified:
   trunk/Model/Lights/AreaLight.cc
   trunk/Model/Lights/PointLight.cc
Log:
Model/Lights/AreaLight.cc

 Improving 1-sided check to set color to 0.

 AreaLight now sets minT to be len - T_EPSILON to avoid incorrect
 shadowing.

Model/Lights/PointLight.cc

 Same len - T_EPSILON change (though it wouldn't have mattered unless
 geometry was placed exactly at the point light)


Modified: trunk/Model/Lights/AreaLight.cc
==============================================================================
--- trunk/Model/Lights/AreaLight.cc     (original)
+++ trunk/Model/Lights/AreaLight.cc     Tue Jul 24 19:11:33 2007
@@ -31,11 +31,18 @@
       // Generate a point on the light
       Vector dir = positions.get(i) - sourceRays.getHitPosition(i);
       Real len = dir.normalize();
-      Real cosine = SCIRun::Max(-Dot(dir, normals.get(i)), Real(0));
-      Real solid_pdf = pdfs.get(i) * (len * len / cosine);
+      Real cosine = -Dot(dir, normals.get(i));
       destRays.setDirection(i, dir);
-      destRays.setColor(i, color / solid_pdf);
-      destRays.overrideMinT(i, len);
+      destRays.overrideMinT(i, len - T_EPSILON);
+      if (cosine <= Real(0)) {
+        // Wrong side of the light
+        destRays.setColor(i, Color::black());
+      } else {
+        // pdf = (dist^2 / cosine) * inv_area, which we assume is in
+        // pdfs(i)
+        Real solid_pdf = pdfs.get(i) * (len * len);
+        destRays.setColor(i, (cosine / solid_pdf) * color);
+      }
     }
   } else {
     int i = sourceRays.rayBegin;
@@ -43,11 +50,18 @@
       // Generate a point on the light
       Vector dir = positions.get(i) - sourceRays.getHitPosition(i);
       Real len = dir.normalize();
-      Real cosine = SCIRun::Max(-Dot(dir, normals.get(i)), Real(0));
-      Real solid_pdf = pdfs.get(i) * (len * len / cosine);
+      Real cosine = -Dot(dir, normals.get(i));
       destRays.setDirection(i, dir);
-      destRays.setColor(i, color / solid_pdf);
-      destRays.overrideMinT(i, len);
+      destRays.overrideMinT(i, len - T_EPSILON);
+      if (cosine <= Real(0)) {
+        // Wrong side of the light
+        destRays.setColor(i, Color::black());
+      } else {
+        // pdf = (dist^2 / cosine) * inv_area, which we assume is in
+        // pdfs(i)
+        Real solid_pdf = pdfs.get(i) * (len * len);
+        destRays.setColor(i, (cosine / solid_pdf) * color);
+      }
     }
     RayPacketData* sourceData = sourceRays.data;
     RayPacketData* destData = destRays.data;
@@ -91,17 +105,24 @@
       _mm_store_ps(&destData->color[2][i],
                    _mm_div_ps(_mm_set1_ps(color[2]), solid_pdf));
 
-      _mm_store_ps(&destData->minT[i], len);
+      _mm_store_ps(&destData->minT[i], _mm_sub_ps(len, 
_mm_set1_ps(T_EPSILON)));
     }
     for(;i<sourceRays.rayEnd;i++){
       // Generate a point on the light
       Vector dir = positions.get(i) - sourceRays.getHitPosition(i);
       Real len = dir.normalize();
-      Real cosine = SCIRun::Max(-Dot(dir, normals.get(i)), Real(0));
-      Real solid_pdf = pdfs.get(i) * (len * len / cosine);
+      Real cosine = -Dot(dir, normals.get(i));
       destRays.setDirection(i, dir);
-      destRays.setColor(i, color / solid_pdf);
-      destRays.overrideMinT(i, len);
+      destRays.overrideMinT(i, len - T_EPSILON);
+      if (cosine <= Real(0)) {
+        // Wrong side of the light
+        destRays.setColor(i, Color::black());
+      } else {
+        // pdf = (dist^2 / cosine) * inv_area, which we assume is in
+        // pdfs(i)
+        Real solid_pdf = pdfs.get(i) * (len * len);
+        destRays.setColor(i, (cosine / solid_pdf) * color);
+      }
     }
   }
 #else
@@ -109,11 +130,18 @@
     // Generate a point on the light
     Vector dir = positions.get(i) - sourceRays.getHitPosition(i);
     Real len = dir.normalize();
-    Real cosine = SCIRun::Max(-Dot(dir, normals.get(i)), Real(0));
-    Real solid_pdf = pdfs.get(i) * (len * len / cosine);
+    Real cosine = -Dot(dir, normals.get(i));
     destRays.setDirection(i, dir);
-    destRays.setColor(i, color / solid_pdf);
-    destRays.overrideMinT(i, len);
+    destRays.overrideMinT(i, len - T_EPSILON);
+    if (cosine <= Real(0)) {
+      // Wrong side of the light
+      destRays.setColor(i, Color::black());
+    } else {
+      // pdf = (dist^2 / cosine) * inv_area, which we assume is in
+      // pdfs(i)
+      Real solid_pdf = pdfs.get(i) * (len * len);
+      destRays.setColor(i, (cosine / solid_pdf) * color);
+    }
   }
 #endif
 }

Modified: trunk/Model/Lights/PointLight.cc
==============================================================================
--- trunk/Model/Lights/PointLight.cc    (original)
+++ trunk/Model/Lights/PointLight.cc    Tue Jul 24 19:11:33 2007
@@ -28,14 +28,14 @@
       for(int i = sourceRays.begin(); i < sourceRays.end(); i++){
         destRays.setColor(i, color);
         destRays.setDirection(i, position - sourceRays.getHitPosition(i));
-        destRays.overrideMinT(i, 1);
+        destRays.overrideMinT(i, 1 - T_EPSILON);
       }
     } else {
       int i = sourceRays.rayBegin;
       for(;i<b;i++){
         destRays.setColor(i, color);
         destRays.setDirection(i, position - sourceRays.getHitPosition(i));
-        destRays.overrideMinT(i, 1);
+        destRays.overrideMinT(i, 1 - T_EPSILON);
       }
       RayPacketData* sourceData = sourceRays.data;
       RayPacketData* destData = destRays.data;
@@ -46,19 +46,19 @@
         _mm_store_ps(&destData->direction[0][i], 
_mm_sub_ps(_mm_set1_ps(position[0]), 
_mm_load_ps(&sourceData->hitPosition[0][i])));
         _mm_store_ps(&destData->direction[1][i], 
_mm_sub_ps(_mm_set1_ps(position[1]), 
_mm_load_ps(&sourceData->hitPosition[1][i])));
         _mm_store_ps(&destData->direction[2][i], 
_mm_sub_ps(_mm_set1_ps(position[2]), 
_mm_load_ps(&sourceData->hitPosition[2][i])));
-        _mm_store_ps(&destData->minT[i], _mm_set1_ps(1));
+        _mm_store_ps(&destData->minT[i], _mm_set1_ps(1 - T_EPSILON));
       }
       for(;i<sourceRays.rayEnd;i++){
         destRays.setColor(i, color);
         destRays.setDirection(i, position - sourceRays.getHitPosition(i));
-        destRays.overrideMinT(i, 1);
+        destRays.overrideMinT(i, 1 - T_EPSILON);
       }
     }
 #else
     for(int i = sourceRays.begin(); i < sourceRays.end(); i++){
       destRays.setColor(i, color);
       destRays.setDirection(i, position - sourceRays.getHitPosition(i));
-      destRays.overrideMinT(i, 1);
+      destRays.overrideMinT(i, 1 - T_EPSILON);
     }
 #endif
 }




  • [MANTA] r1548 - trunk/Model/Lights, boulos, 07/24/2007

Archive powered by MHonArc 2.6.16.

Top of page