Manta Interactive Ray Tracer Development Mailing List

Text archives Help


[MANTA] r1413 - in trunk: Engine/Shadows Interface Model/Lights


Chronological Thread 
  • 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.

Top of page