Manta Interactive Ray Tracer Development Mailing List

Text archives Help


[MANTA] r1052 - trunk/Model/Cameras


Chronological Thread 
  • From: sparker@sci.utah.edu
  • To: manta@sci.utah.edu
  • Subject: [MANTA] r1052 - trunk/Model/Cameras
  • Date: Tue, 9 May 2006 16:15:59 -0600 (MDT)

Author: sparker
Date: Tue May  9 16:15:55 2006
New Revision: 1052

Modified:
   trunk/Model/Cameras/PinholeCamera.cc
   trunk/Model/Cameras/PinholeCamera.h
Log:
Vectorize PinholeCamera when normalizing rays


Modified: trunk/Model/Cameras/PinholeCamera.cc
==============================================================================
--- trunk/Model/Cameras/PinholeCamera.cc        (original)
+++ trunk/Model/Cameras/PinholeCamera.cc        Tue May  9 16:15:55 2006
@@ -126,19 +126,58 @@
 void PinholeCamera::makeRays(RayPacket& rays) const
 {
   ASSERT(rays.getFlag(RayPacket::HaveImageCoordinates));
+  ASSERT(rays.getFlag(RayPacket::ConstantEye));
   rays.setFlag(RayPacket::ConstantOrigin);
 
-  if(normalizeRays)
-    {
-    Vector stereo_eye[2];
-    stereo_eye[0] = (eye - (v*stereo_offset));
-    stereo_eye[1] = (eye + (v*stereo_offset));
-    
-    for(int i=rays.begin();i<rays.end();i++){
+  if(normalizeRays) {
+#ifdef MANTA_SSE
+    int b = (rays.rayBegin + 3) & (~3);
+    int e = rays.rayEnd & (~3);
+    if(b == e){
+      for(int i = rays.begin(); i < rays.end(); i++){
+        Vector raydir(v*rays.getImageCoordinates(i, 
0)+u*rays.getImageCoordinates(i, 1)+direction);
+        raydir.normalize();
+        rays.setRay(i, eye, raydir);
+      }
+    } else {
+      int i = rays.rayBegin;
+      for(;i<b;i++){
+        Vector raydir(v*rays.getImageCoordinates(i, 
0)+u*rays.getImageCoordinates(i, 1)+direction);
+        raydir.normalize();
+        rays.setRay(i, eye, raydir);
+      }
+      RayPacketData* data = rays.data;
+      for(;i<e;i+=4){
+        __m128 imagev = _mm_load_ps(&data->image[0][i]);
+        __m128 imageu = _mm_load_ps(&data->image[1][i]);
+        __m128 xd = _mm_add_ps(_mm_add_ps(_mm_mul_ps(_mm_set1_ps(v[0]), 
imagev), _mm_mul_ps(_mm_set1_ps(u[0]), imageu)), _mm_set1_ps(direction[0]));
+        __m128 yd = _mm_add_ps(_mm_add_ps(_mm_mul_ps(_mm_set1_ps(v[1]), 
imagev), _mm_mul_ps(_mm_set1_ps(u[1]), imageu)), _mm_set1_ps(direction[1]));
+        __m128 zd = _mm_add_ps(_mm_add_ps(_mm_mul_ps(_mm_set1_ps(v[2]), 
imagev), _mm_mul_ps(_mm_set1_ps(u[2]), imageu)), _mm_set1_ps(direction[2]));
+        __m128 length2 = _mm_add_ps(_mm_add_ps(_mm_mul_ps(xd, xd), 
_mm_mul_ps(yd, yd)), _mm_mul_ps(zd, zd));
+        __m128 scale =  _mm_rsqrt_ps(length2);
+        // Do one newton-raphson iteration to get the accuracy we need
+        scale = _mm_mul_ps(_mm_mul_ps(scale, _mm_sub_ps(_mm_set1_ps(3.f), 
_mm_mul_ps(length2, _mm_mul_ps(scale, scale)))), _mm_set1_ps(0.5f));
+        _mm_store_ps(&data->direction[0][i], _mm_mul_ps(xd, scale));
+        _mm_store_ps(&data->direction[1][i], _mm_mul_ps(yd, scale));
+        _mm_store_ps(&data->direction[2][i], _mm_mul_ps(zd, scale));
+
+        _mm_store_ps(&data->origin[0][i], _mm_set1_ps(eye[0]));
+        _mm_store_ps(&data->origin[1][i], _mm_set1_ps(eye[1]));
+        _mm_store_ps(&data->origin[2][i], _mm_set1_ps(eye[2]));
+      }
+      for(;i<rays.rayEnd;i++){
+        Vector raydir(v*rays.getImageCoordinates(i, 
0)+u*rays.getImageCoordinates(i, 1)+direction);
+        raydir.normalize();
+        rays.setRay(i, eye, raydir);
+      }
+    }
+#else
+    for(int i = rays.begin(); i < rays.end(); i++){
       Vector raydir(v*rays.getImageCoordinates(i, 
0)+u*rays.getImageCoordinates(i, 1)+direction);
       raydir.normalize();
-      rays.setRay(i, stereo_eye[rays.getWhichEye(i)], raydir);
+      rays.setRay(i, eye, raydir);
     }
+#endif
     rays.setFlag(RayPacket::NormalizedDirections);
   } else {
 #if MANTA_SSE

Modified: trunk/Model/Cameras/PinholeCamera.h
==============================================================================
--- trunk/Model/Cameras/PinholeCamera.h (original)
+++ trunk/Model/Cameras/PinholeCamera.h Tue May  9 16:15:55 2006
@@ -43,6 +43,8 @@
 
     virtual void setup();
   protected:
+    Vector direction;
+    Vector u,v;
     Vector eye;
     Vector lookat;
     Vector up;
@@ -51,9 +53,6 @@
                                             // width and height of image 
plane
                                             // distance from eye to image 
plane
     bool   normalizeRays;
-
-    Vector direction;
-    Vector u,v;
   };
 }
 




  • [MANTA] r1052 - trunk/Model/Cameras, sparker, 05/09/2006

Archive powered by MHonArc 2.6.16.

Top of page