예제 #1
0
        private static void NegativeNearClippingHelper(double near_dist, double far_dist, ViewportInfo vp)
        {
            double n = near_dist;
            double f = far_dist;

            double min_near_dist = 0.000100;
            if ( double.IsNaN(min_near_dist) || min_near_dist < 1.0e-6 )
                min_near_dist = 1.0e-6;
            if ( vp.IsParallelProjection && n < min_near_dist )
            {
                // move camera back in ortho projection so everything shows
                double d = 1.00001*min_near_dist - n;
                if ( d < 0.005 )
                    d = 0.005;
                n += d;
                f  += d;
                if (   double.IsNaN(d)
                    || d <= 0.0
                    || double.IsNaN(n)
                    || double.IsNaN(f)
                    || n < min_near_dist
                    || f <= n
                    )
                {
                    // Just give up but ... refuse to accept garbage
                    n = 0.005;
                    f = 1000.0;
                }
                else
                {
                    Rhino.Geometry.Point3d new_loc = vp.CameraLocation + d*vp.CameraZ;
                    vp.SetCameraLocation( new_loc );
                }
                near_dist = n;
                far_dist = f;
            }
        }