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