--- vtkRenderer.cxx.orig	2009-11-03 11:45:12.068780533 +0800
+++ vtkRenderer.cxx	2009-11-03 11:49:17.931781921 +0800
@@ -1127,19 +1127,14 @@
       }
     }
   
-  // Do not let the range behind the camera throw off the calculation.
-  if (range[0] < 0.0)
-    {
-    range[0] = 0.0;
-    }
-
   // Give ourselves a little breathing room
   range[0] = 0.99*range[0] - (range[1] - range[0])*0.5;
   range[1] = 1.01*range[1] + (range[1] - range[0])*0.5;
 
-  // Make sure near is not bigger than far
-  range[0] = (range[0] >= range[1])?(0.01*range[1]):(range[0]);
-
+  // Fix the range for perspective projections only.
+  // Otherwise, parallel projections will clip on the near plane.
+  if (!this->ActiveCamera->GetParallelProjection())
+    {
   // Make sure near is at least some fraction of far - this prevents near
   // from being behind the camera or too close in front. How close is too
   // close depends on the resolution of the depth buffer
@@ -1156,13 +1151,26 @@
       }
     }
   
+  // Do not let the range behind the camera throw off the calculation.
+  if (range[0] < 0.0)
+    {
+    range[0] = 0.0;
+    }
+
+    // Make sure near is not bigger than far
+    if (range[0] >= range[1])
+      {
+      range[0] = this->NearClippingPlaneTolerance*range[1];
+      }
+
   // make sure the front clipping range is not too far from the far clippnig
   // range, this is to make sure that the zbuffer resolution is effectively
   // used
-  if (range[0] < this->NearClippingPlaneTolerance*range[1])
+  else if (range[0] < this->NearClippingPlaneTolerance*range[1])
     {
     range[0] = this->NearClippingPlaneTolerance*range[1];
     }
+    }
   
   this->ActiveCamera->SetClippingRange( range );
 }
