Manta Interactive Ray Tracer Development Mailing List

Text archives Help


[Manta] r1811 - in trunk: Engine/Control Engine/Shadows Interface Model/Cameras Model/Materials


Chronological Thread 
  • From: boulos@sci.utah.edu
  • To: manta@sci.utah.edu
  • Subject: [Manta] r1811 - in trunk: Engine/Control Engine/Shadows Interface Model/Cameras Model/Materials
  • Date: Sun, 4 Nov 2007 13:48:22 -0700 (MST)

Author: boulos
Date: Sun Nov  4 13:48:19 2007
New Revision: 1811

Modified:
   trunk/Engine/Control/RTRT.cc
   trunk/Engine/Shadows/HardShadows.cc
   trunk/Interface/FrameState.h
   trunk/Interface/RayPacket.h
   trunk/Model/Cameras/PinholeCamera.cc
   trunk/Model/Materials/AmbientOcclusion.cc
   trunk/Model/Materials/Dielectric.cc
   trunk/Model/Materials/MetalMaterial.cc
   trunk/Model/Materials/Phong.cc
   trunk/Model/Materials/ThinDielectric.cc
   trunk/Model/Materials/Transparent.cc
Log:
Interface/FrameState.h

 Adding shutter_open and shutter_close to the FrameState to support
 Motion Blur.

Engine/Control/RTRT.cc

 Filling shutter_open and shutter_close with "reasonable" values.

Interface/RayPacket.h

 Adding time, getTime and setTime to RayPacket to support motion blur.

Engine/Shadows/HardShadows.cc
Model/Cameras/PinholeCamera.cc
Model/Materials/AmbientOcclusion.cc
Model/Materials/Dielectric.cc
Model/Materials/MetalMaterial.cc
Model/Materials/Phong.cc
Model/Materials/ThinDielectric.cc
Model/Materials/Transparent.cc

 Setting the time value wherever necessary.


Modified: trunk/Engine/Control/RTRT.cc
==============================================================================
--- trunk/Engine/Control/RTRT.cc        (original)
+++ trunk/Engine/Control/RTRT.cc        Sun Nov  4 13:48:19 2007
@@ -160,6 +160,8 @@
   running=false;
   animFrameState.frameNumber = 0;
   animFrameState.frameTime = 0;
+  animFrameState.shutter_open = 0;
+  animFrameState.shutter_close = 0;
   timeMode = MantaInterface::RealTime;
   timeScale = 1;
   frameRate = 15;
@@ -617,10 +619,14 @@
       animFrameState.frameNumber++;
       switch(timeMode){
       case RealTime:
+        animFrameState.shutter_open = animFrameState.shutter_close;
         animFrameState.frameTime = Time::currentSeconds() * timeScale;
+        animFrameState.shutter_close = animFrameState.frameTime;
         break;
       case FixedRate:
+        animFrameState.shutter_open = animFrameState.shutter_close;
         animFrameState.frameTime = 
static_cast<double>(animFrameState.frameNumber) / frameRate;
+        animFrameState.shutter_close = animFrameState.frameTime;
         break;
       case Static:
         break;

Modified: trunk/Engine/Shadows/HardShadows.cc
==============================================================================
--- trunk/Engine/Shadows/HardShadows.cc (original)
+++ trunk/Engine/Shadows/HardShadows.cc Sun Nov  4 13:48:19 2007
@@ -86,6 +86,7 @@
         Vector dir = shadowRays.getDirection(i);
         if(Dot(dir, sourceRays.getFFNormal(i)) > 0) {
           shadowRays.setOrigin(i, sourceRays.getHitPosition(i));
+          shadowRays.setTime(i, sourceRays.getTime(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
@@ -104,6 +105,7 @@
         Vector dir = shadowRays.getDirection(i);
         if(Dot(dir, sourceRays.getFFNormal(i)) > 0) {
           shadowRays.setOrigin(i, sourceRays.getHitPosition(i));
+          shadowRays.setTime(i, sourceRays.getTime(i));
           // See comment above.
           shadowRays.setHitMaterial(i, NULL);
           last = i;
@@ -142,6 +144,8 @@
         _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]));
 
+        _mm_store_ps(&shadowData->time[i], 
_mm_load_ps(&sourceData->time[i]));
+
         if(_mm_movemask_ps(mask) != 0xf){
           last = i+3;
           if (first < 0)
@@ -153,6 +157,7 @@
         Vector dir = shadowRays.getDirection(i);
         if(Dot(dir, sourceRays.getFFNormal(i)) > 0) {
           shadowRays.setOrigin(i, sourceRays.getHitPosition(i));
+          shadowRays.setTime(i, sourceRays.getTime(i));
           // See comment above.
           shadowRays.setHitMaterial(i, NULL);
           last = i;
@@ -170,6 +175,7 @@
       Vector dir = shadowRays.getDirection(i);
       if(Dot(dir, sourceRays.getFFNormal(i)) > 0) {
         shadowRays.setOrigin(i, sourceRays.getHitPosition(i));
+        shadowRays.setTime(i, sourceRays.getTime(i));
         // See comment above.
         shadowRays.setHitMaterial(i, NULL);
         last = i;

Modified: trunk/Interface/FrameState.h
==============================================================================
--- trunk/Interface/FrameState.h        (original)
+++ trunk/Interface/FrameState.h        Sun Nov  4 13:48:19 2007
@@ -6,6 +6,8 @@
   struct FrameState {
     long frameNumber;
     double frameTime;
+    Real shutter_open;
+    Real shutter_close;
   };
 }
 

Modified: trunk/Interface/RayPacket.h
==============================================================================
--- trunk/Interface/RayPacket.h (original)
+++ trunk/Interface/RayPacket.h Sun Nov  4 13:48:19 2007
@@ -94,6 +94,7 @@
     MANTA_ALIGN(16) Real inverseDirection[3][MaxSize];
     MANTA_ALIGN(16) Real minT[MaxSize];
     MANTA_ALIGN(16) Real corner_dir[3][4];
+    MANTA_ALIGN(16) Real time[MaxSize]; // Time for this ray in [0,1)
 
     MANTA_ALIGN(16) Real image[2][MaxSize];
     MANTA_ALIGN(16) Real normal[3][MaxSize];
@@ -470,6 +471,15 @@
     {
       data->minT[which] = minT;
     }
+
+    // Time for motion blur.
+    Real& getTime(int which) const {
+      return data->time[which];
+    }
+    void setTime(int which, Real new_time) {
+      data->time[which] = new_time;
+    }
+
     bool hit(int which, Real t, const Material* matl, const Primitive* prim,
              const TexCoordMapper* tex) {
       if(t > T_EPSILON && t < data->minT[which]){

Modified: trunk/Model/Cameras/PinholeCamera.cc
==============================================================================
--- trunk/Model/Cameras/PinholeCamera.cc        (original)
+++ trunk/Model/Cameras/PinholeCamera.cc        Sun Nov  4 13:48:19 2007
@@ -6,6 +6,7 @@
 #include <Interface/Context.h>
 #include <Interface/MantaInterface.h>
 #include <Interface/RayPacket.h>
+#include <Interface/SampleGenerator.h>
 #include <Interface/Scene.h>
 #include <Core/Geometry/BBox.h>
 #include <Core/Geometry/AffineTransform.h>
@@ -168,6 +169,16 @@
       makeRaysSpecialized<false, true>(rays);
     else
       makeRaysSpecialized<false, false>(rays);
+
+  // TODO(boulos): Provide SSE version and somehow avoid this overhead
+  // when people don't need time? rays.computeTimeValues would work
+  // for the first bounce, but if we don't compute it by then, we'll
+  // need to have some sort of "tree of parents" that we can follow up
+  Packet<Real> time_seeds;
+  context.sample_generator->nextSeeds(context, time_seeds, rays);
+  for (int i = rays.begin(); i < rays.end(); i++) {
+    rays.data->time[i] = time_seeds.get(i);
+  }
 }
 
 template <bool NORMALIZE_RAYS, bool CREATE_CORNER_RAYS>
@@ -326,7 +337,7 @@
           max_u = SCIRun::Max(max_u, u_imageCoord);
       }
     }
-    
+
     if (CREATE_CORNER_RAYS) {
       Vector raydir[4] = { v*min_v + u*min_u + direction,
                            v*min_v + u*max_u + direction,

Modified: trunk/Model/Materials/AmbientOcclusion.cc
==============================================================================
--- trunk/Model/Materials/AmbientOcclusion.cc   (original)
+++ trunk/Model/Materials/AmbientOcclusion.cc   Sun Nov  4 13:48:19 2007
@@ -97,6 +97,7 @@
                             directions[r][1]*V +
                             directions[r][2]*W);
         occlusion_rays.setRay(r, rays.getHitPosition(i), trans_dir);
+        occlusion_rays.setTime(i, rays.getTime(i));
         // set max distance
         occlusion_rays.resetHit(r, cutoff);
       }

Modified: trunk/Model/Materials/Dielectric.cc
==============================================================================
--- trunk/Model/Materials/Dielectric.cc (original)
+++ trunk/Model/Materials/Dielectric.cc Sun Nov  4 13:48:19 2007
@@ -138,6 +138,7 @@
       Color refl_importance = in_importance * beers_color;
       if(refl_importance.luminance() > cutoff){
         reflected_rays.setImportance(num_refl, refl_importance);
+        reflected_rays.setTime(num_refl, rays.getTime(i));
         reflected_rays.setRay(num_refl, hitpos, refl_dir);
         refl_source[num_refl] = i;
         refl_attenuation[num_refl] = beers_color;
@@ -175,6 +176,7 @@
       Color refl_importance = in_importance * refl_attenuation[num_refl];
       if(refl_importance.luminance() > cutoff){
         reflected_rays.setImportance(num_refl, refl_importance);
+        reflected_rays.setTime(num_refl, rays.getTime(i));
         reflected_rays.setRay(num_refl, hitpos, refl_dir);
         refl_source[num_refl] = i;
         num_refl++;
@@ -186,6 +188,7 @@
       Color refr_importance = in_importance * refr_attenuation[num_refr];
       if(refr_importance.luminance() > cutoff){
         refracted_rays.setImportance(num_refr, refr_importance);
+        refracted_rays.setTime(num_refr, rays.getTime(i));
         Vector refr_dir = (eta_inverse * rayD +
                            (eta_inverse * costheta - costheta2) * normal);
         refracted_rays.setRay(num_refr, hitpos, refr_dir);

Modified: trunk/Model/Materials/MetalMaterial.cc
==============================================================================
--- trunk/Model/Materials/MetalMaterial.cc      (original)
+++ trunk/Model/Materials/MetalMaterial.cc      Sun Nov  4 13:48:19 2007
@@ -26,10 +26,10 @@
    specular_reflectance = new Constant<Color>(specular);
 }
 
-MetalMaterial::MetalMaterial(const Texture<Color>* specular_reflectance, 
-                            int phong_exponent)
+MetalMaterial::MetalMaterial(const Texture<Color>* specular_reflectance,
+                             int phong_exponent)
   : specular_reflectance(specular_reflectance), 
phong_exponent(phong_exponent)
-{  
+{
 }
 
 MetalMaterial::~MetalMaterial()
@@ -44,19 +44,20 @@
     rays.computeFFNormals(context);
     Packet<Color> specular;
     specular_reflectance->mapValues(specular, context, rays);
-  
+
     rays.computeHitPositions();
     RayPacketData rdata;
     RayPacket refl_rays(rdata, RayPacket::UnknownShape, rays.begin(), 
rays.end(),
                         rays.getDepth()+1, RayPacket::NormalizedDirections);
-    for(int i=rays.begin();i<rays.end();i++) {  
+    for(int i=rays.begin();i<rays.end();i++) {
       Vector rayD = rays.getDirection(i);
       Vector normal = rays.getFFNormal(i);
       Vector refl_dir = rayD - normal*(2*Dot(normal, rayD));
       refl_rays.setRay(i, rays.getHitPosition(i),  refl_dir);
       refl_rays.setImportance(i, rays.getImportance(i));
+      refl_rays.setTime(i, rays.getTime(i));
     }
-    
+
     refl_rays.resetHits();
     context.renderer->traceRays(context, refl_rays);
     for(int i=rays.begin();i<rays.end();i++) {
@@ -78,7 +79,7 @@
     }
   } else {
     // Stuff black in it.
-    for(int i=rays.begin();i<rays.end();i++) 
+    for(int i=rays.begin();i<rays.end();i++)
       rays.setColor(i, Color::black());
   }
 }

Modified: trunk/Model/Materials/Phong.cc
==============================================================================
--- trunk/Model/Materials/Phong.cc      (original)
+++ trunk/Model/Materials/Phong.cc      Sun Nov  4 13:48:19 2007
@@ -442,6 +442,7 @@
                            rays.getFFNormal(i)*(2*Dot(rays.getFFNormal(i), 
rays.getDirection(i) )));
         refl_rays.setRay(i, rays.getHitPosition(i), refl_dir);
         refl_rays.setImportance(i, rays.getImportance(i) * refl.data[i]);
+        refl_rays.setTime(i, rays.getTime(i));
       }
     } else {
       int i = rays.rayBegin;
@@ -450,6 +451,7 @@
                            rays.getFFNormal(i)*(2*Dot(rays.getFFNormal(i), 
rays.getDirection(i) )));
         refl_rays.setRay(i, rays.getHitPosition(i), refl_dir);
         refl_rays.setImportance(i, rays.getImportance(i) * refl.data[i]);
+        refl_rays.setTime(i, rays.getTime(i));
       }
       RayPacketData* data = rays.data;
       RayPacketData* refldata = refl_rays.data;
@@ -476,12 +478,15 @@
         _mm_store_ps(&refldata->importance[0][i], 
_mm_mul_ps(_mm_load_ps(&data->importance[0][i]), r));
         _mm_store_ps(&refldata->importance[1][i], 
_mm_mul_ps(_mm_load_ps(&data->importance[1][i]), r));
         _mm_store_ps(&refldata->importance[2][i], 
_mm_mul_ps(_mm_load_ps(&data->importance[2][i]), r));
+
+        _mm_store_ps(&refldata->time[i], _mm_load_ps(&data->time[i]));
       }
       for(;i<rays.rayEnd;i++){
         Vector refl_dir = (rays.getDirection(i) -
                            rays.getFFNormal(i)*(2*Dot(rays.getFFNormal(i), 
rays.getDirection(i) )));
         refl_rays.setRay(i, rays.getHitPosition(i), refl_dir);
         refl_rays.setImportance(i, rays.getImportance(i) * refl.data[i]);
+        refl_rays.setTime(i, rays.getTime(i));
       }
     }
 #else // ifdef MANTA_SSE
@@ -490,6 +495,7 @@
                          rays.getFFNormal(i)*(2*Dot(rays.getFFNormal(i), 
rays.getDirection(i) )));
       refl_rays.setRay(i, rays.getHitPosition(i), refl_dir);
       refl_rays.setImportance(i, rays.getImportance(i) * refl.data[i]);
+      refl_rays.setTime(i, rays.getTime(i));
     }
 #endif // ifdef MANTA_SSE
     context.sample_generator->setupChildPacket(context, rays, refl_rays);

Modified: trunk/Model/Materials/ThinDielectric.cc
==============================================================================
--- trunk/Model/Materials/ThinDielectric.cc     (original)
+++ trunk/Model/Materials/ThinDielectric.cc     Sun Nov  4 13:48:19 2007
@@ -144,7 +144,7 @@
       } else {
         refl = SchlickReflection(costheta, costheta2, eta_inverse);
       }
-      
+
       if (debugFlag) {
         Real schlick_refl, fresnel_refl;
         if (doSchlick) {
@@ -178,6 +178,7 @@
         Vector refr_dir = RefractRay(rayD, normal,
                                      eta_inverse, costheta, costheta2);
         refracted_rays.setImportance(num_refr, refr_importance);
+        refracted_rays.setTime(num_refr, rays.getTime(i));
         Vector refr_orig = hitpos + refr_dir * refraction_ray_length;
         refracted_rays.setRay(num_refr, refr_orig, rayD);
         if (debugFlag) { cerr << "refr_dir.length() = 
"<<refr_dir.length()<<"\n"; }
@@ -194,6 +195,7 @@
       Color refl_importance = in_importance; // * beers_color = 
Color::white();
       if(refl_importance.luminance() > cutoff){
         reflected_rays.setImportance(num_refl, refl_importance);
+        reflected_rays.setTime(num_refl, rays.getTime(i));
         reflected_rays.setRay(num_refl, hitpos, refl_dir);
         refl_source[num_refl] = i;
         refl_attenuation[num_refl] = Color::white();

Modified: trunk/Model/Materials/Transparent.cc
==============================================================================
--- trunk/Model/Materials/Transparent.cc        (original)
+++ trunk/Model/Materials/Transparent.cc        Sun Nov  4 13:48:19 2007
@@ -128,13 +128,14 @@
   RayPacketData secondaryData;
   RayPacket secondaryRays(secondaryData, RayPacket::UnknownShape, 0, 0, 
rays.getDepth(), 0);
   int map[RayPacket::MaxSize];
-  
+
   // Shoot a secondary ray for all 1.0 alpha values.
   int size = 0;
   for (int i=rays.begin();i<rays.end();++i) {
     if (alpha_values.data[i] < (ColorComponent)1.0) {
       secondaryRays.setOrigin   ( size, rays.getHitPosition( i ) );
       secondaryRays.setDirection( size, rays.getDirection  ( i ) );
+      secondaryRays.setTime     ( size, rays.getTime       ( i ) );
       map[size] = i;
       ++size;
     }
@@ -146,7 +147,7 @@
 
   // Blend the result of each secondary ray.
   for (int i=secondaryRays.begin();i<secondaryRays.end();++i) {
-    
+
     Color second = secondaryRays.getColor( i );
     Color first  = rays.getColor( map[i] );
 
@@ -155,5 +156,5 @@
                    (second*((ColorComponent)1.0-alpha_values.data[map[i]])) +
                    (first*(alpha_values.data[map[i]])));
   }
-  
+
 }




  • [Manta] r1811 - in trunk: Engine/Control Engine/Shadows Interface Model/Cameras Model/Materials, boulos, 11/04/2007

Archive powered by MHonArc 2.6.16.

Top of page