Text archives Help
- From: bigler@sci.utah.edu
- To: manta@sci.utah.edu
- Subject: [MANTA] r1413 - in trunk: Engine/Shadows Interface Model/Lights
- Date: Sun, 10 Jun 2007 01:33:20 -0600 (MDT)
Author: bigler
Date: Sun Jun 10 01:33:19 2007
New Revision: 1413
Modified:
trunk/Engine/Shadows/HardShadows.cc
trunk/Interface/RayPacket.cc
trunk/Model/Lights/PointLight.cc
Log:
Engine/Shadows/HardShadows.cc
Get shadows to work properly for the new Light API.
SSE turned back on.
Interface/RayPacket.cc
Always scale minT when doing actualNormalizeDirections.
Model/Lights/PointLight.cc
Forgot a parameter to overrideMinT.
Modified: trunk/Engine/Shadows/HardShadows.cc
==============================================================================
--- trunk/Engine/Shadows/HardShadows.cc (original)
+++ trunk/Engine/Shadows/HardShadows.cc Sun Jun 10 01:33:19 2007
@@ -19,10 +19,6 @@
using namespace Manta;
using std::cerr;
-#ifdef MANTA_SSE
-#undef MANTA_SSE
-#endif
-
ShadowAlgorithm* HardShadows::create(const vector<string>& args)
{
return new HardShadows(args);
@@ -88,7 +84,7 @@
for(int i = sourceRays.begin(); i < sourceRays.end(); i++){
Vector dir = shadowRays.getDirection(i);
if(Dot(dir, sourceRays.getFFNormal(i)) > 0) {
- shadowRays.setOrigin(sourceRays.getHitPosition(i));
+ shadowRays.setOrigin(i, sourceRays.getHitPosition(i));
// This is a version of resetHit that only sets the material
// to NULL and doesn't require us to also modify the hit
// distance which was set for us by the call to
@@ -106,7 +102,7 @@
for(;i<b;i++){
Vector dir = shadowRays.getDirection(i);
if(Dot(dir, sourceRays.getFFNormal(i)) > 0) {
- shadowRays.setOrigin(sourceRays.getHitPosition(i));
+ shadowRays.setOrigin(i, sourceRays.getHitPosition(i));
// See comment above.
shadowRays.setHitMaterial(i, NULL);
last = i;
@@ -125,9 +121,9 @@
__m128 dx = _mm_load_ps(&shadowData->direction[0][i]);
__m128 dy = _mm_load_ps(&shadowData->direction[1][i]);
__m128 dz = _mm_load_ps(&shadowData->direction[2][i]);
- __m128 dir = _mm_add_ps(_mm_add_ps(_mm_mul_ps(dx, normalx),
_mm_mul_ps(dy, normaly)), _mm_mul_ps(dz, normalz));
+ __m128 dot = _mm_add_ps(_mm_add_ps(_mm_mul_ps(dx, normalx),
_mm_mul_ps(dy, normaly)), _mm_mul_ps(dz, normalz));
- __m128 mask = _mm_cmple_ps(dir, _mm_setzero_ps());
+ __m128 mask = _mm_cmple_ps(dot, _mm_setzero_ps());
#ifdef __x86_64
_mm_store_ps((float*)&shadowData->hitMatl[i], _mm_unpacklo_ps(mask,
mask));
_mm_store_ps((float*)&shadowData->hitMatl[i+2],
_mm_unpackhi_ps(mask, mask));
@@ -137,37 +133,21 @@
if(_mm_movemask_ps(mask) != 0xf){
// Mask is inverted to make our life easier. 1 means do not
compute shadow ray
- // Normalize and compute length.
-
- __m128 length2 = _mm_add_ps(_mm_add_ps(_mm_mul_ps(dx, dx),
_mm_mul_ps(dy, dy)), _mm_mul_ps(dz, dz));
- __m128 inv_length = _mm_rsqrt_ps(length2);
- inv_length = _mm_mul_ps(_mm_mul_ps(inv_length,
_mm_sub_ps(_mm_set1_ps(3.f), _mm_mul_ps(length2, _mm_mul_ps(inv_length,
inv_length)))), _mm_set1_ps(0.5f));
- __m128 length = _mm_rcp_ps(inv_length);
- length = _mm_mul_ps(length, _mm_sub_ps(_mm_set1_ps(2.f),
_mm_mul_ps(inv_length, length)));
-
- // Populate the shadow ray.
- _mm_store_ps(&shadowData->direction[0][i], _mm_mul_ps(dx,
inv_length));
- _mm_store_ps(&shadowData->direction[1][i], _mm_mul_ps(dy,
inv_length));
- _mm_store_ps(&shadowData->direction[2][i], _mm_mul_ps(dz,
inv_length));
_mm_store_ps(&shadowData->origin[0][i],
_mm_load_ps(&sourceData->hitPosition[0][i]));
_mm_store_ps(&shadowData->origin[1][i],
_mm_load_ps(&sourceData->hitPosition[1][i]));
_mm_store_ps(&shadowData->origin[2][i],
_mm_load_ps(&sourceData->hitPosition[2][i]));
- // Reset the hits
- // We want length if mask is false, or -maxt if mask is true
- __m128 combo = _mm_or_ps(_mm_andnot_ps(mask, length),
_mm_and_ps(_mm_set1_ps(-MAXT), mask));
- _mm_store_ps(&shadowData->minT[i], combo);
+ // The materials have already been set by the code above.
+ // Don't touch minT.
last = i+3;
if (first < 0)
first = i;
- } else {
- _mm_store_ps(&shadowData->minT[i], _mm_set1_ps(-MAXT));
}
}
for(;i<sourceRays.rayEnd;i++){
Vector dir = shadowRays.getDirection(i);
if(Dot(dir, sourceRays.getFFNormal(i)) > 0) {
- shadowRays.setOrigin(sourceRays.getHitPosition(i));
+ shadowRays.setOrigin(i, sourceRays.getHitPosition(i));
// See comment above.
shadowRays.setHitMaterial(i, NULL);
last = i;
@@ -184,12 +164,8 @@
Vector dir = shadowRays.getDirection(i);
if(Dot(dir, sourceRays.getFFNormal(i)) > 0) {
shadowRays.setOrigin(i, sourceRays.getHitPosition(i));
-#if 1
- shadowRays.resetHit(i, sourceRays.getMinT(i));
-#else
// See comment above.
shadowRays.setHitMaterial(i, NULL);
-#endif
last = i;
if (first < 0)
first = i;
Modified: trunk/Interface/RayPacket.cc
==============================================================================
--- trunk/Interface/RayPacket.cc (original)
+++ trunk/Interface/RayPacket.cc Sun Jun 10 01:33:19 2007
@@ -15,8 +15,7 @@
for(int j=0;j<3;j++)
sum += data->direction[j][i] * data->direction[j][i];
Real length = SCIRun::Sqrt(sum);
- if(data->hitMatl[i] != 0)
- data->minT[i] *= length;
+ data->minT[i] *= length;
Real scale = 1/length;
for(int j=0;j<3;j++)
data->direction[j][i] *= scale;
@@ -28,8 +27,7 @@
for(int j=0;j<3;j++)
sum += data->direction[j][i] * data->direction[j][i];
Real length = SCIRun::Sqrt(sum);
- if(data->hitMatl[i] != 0)
- data->minT[i] *= length;
+ data->minT[i] *= length;
Real scale = 1/length;
for(int j=0;j<3;j++)
data->direction[j][i] *= scale;
@@ -53,8 +51,7 @@
for(int j=0;j<3;j++)
sum += data->direction[j][i] * data->direction[j][i];
Real length = SCIRun::Sqrt(sum);
- if(data->hitMatl[i] != 0)
- data->minT[i] *= length;
+ data->minT[i] *= length;
Real scale = 1/length;
for(int j=0;j<3;j++)
data->direction[j][i] *= scale;
@@ -66,9 +63,7 @@
for(int j=0;j<3;j++)
sum += data->direction[j][i] * data->direction[j][i];
Real length = SCIRun::Sqrt(sum);
- if(data->hitMatl[i] != 0) {
- data->minT[i] *= length;
- }
+ data->minT[i] *= length;
Real scale = 1/length;
for(int j=0;j<3;j++)
data->direction[j][i] *= scale;
Modified: trunk/Model/Lights/PointLight.cc
==============================================================================
--- trunk/Model/Lights/PointLight.cc (original)
+++ trunk/Model/Lights/PointLight.cc Sun Jun 10 01:33:19 2007
@@ -58,7 +58,7 @@
for(int i = sourceRays.begin(); i < sourceRays.end(); i++){
destRays.setColor(i, color);
destRays.setDirection(i, position - sourceRays.getHitPosition(i));
- destRays.overrideMinT(1);
+ destRays.overrideMinT(i, 1);
}
#endif
}
- [MANTA] r1413 - in trunk: Engine/Shadows Interface Model/Lights, bigler, 06/10/2007
Archive powered by MHonArc 2.6.16.