Text archives Help
- 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.