Fix for NaN's in the Z component of projected points by SilhouetteGeomEngine::Project...
authorTamito Kajiyama <rd6t-kjym@asahi-net.or.jp>
Sat, 16 Jun 2012 21:15:50 +0000 (21:15 +0000)
committerTamito Kajiyama <rd6t-kjym@asahi-net.or.jp>
Sat, 16 Jun 2012 21:15:50 +0000 (21:15 +0000)
This issue arises when the Z depth of the bounding box of the scene being rendered is zero.

source/blender/freestyle/intern/view_map/SilhouetteGeomEngine.cpp

index c0817189bc2db0992d6aa4e6572b34f171e788fd..6327956ca804a66267ff16a89a37cb3f3651bfbb 100755 (executable)
@@ -113,13 +113,15 @@ void SilhouetteGeomEngine::ProjectSilhouette(vector<SVertex*>& ioVertices)
   //  real min=HUGE;
   //  real max=-HUGE;
   vector<SVertex*>::iterator sv, svend;
   //  real min=HUGE;
   //  real max=-HUGE;
   vector<SVertex*>::iterator sv, svend;
+  const real depth = _zfar - _znear;
+  const real fac = (depth < 1e-6) ? 1.0 : 1.0 / depth;
   
   for(sv=ioVertices.begin(), svend=ioVertices.end();
       sv!=svend;
       sv++)
     {
       GeomUtils::fromWorldToImage((*sv)->point3D(), newPoint, _modelViewMatrix, _projectionMatrix, _viewport);
   
   for(sv=ioVertices.begin(), svend=ioVertices.end();
       sv!=svend;
       sv++)
     {
       GeomUtils::fromWorldToImage((*sv)->point3D(), newPoint, _modelViewMatrix, _projectionMatrix, _viewport);
-      newPoint[2] = (-newPoint[2]-_znear)/(_zfar-_znear); // normalize Z between 0 and 1
+      newPoint[2] = (-newPoint[2]-_znear) * fac; // normalize Z between 0 and 1
       (*sv)->setPoint2D(newPoint);  
       //cerr << (*sv)->point2d().z() << "  ";
       //      real d=(*sv)->point2d()[2];
       (*sv)->setPoint2D(newPoint);  
       //cerr << (*sv)->point2d().z() << "  ";
       //      real d=(*sv)->point2d()[2];
@@ -142,8 +144,10 @@ void SilhouetteGeomEngine::ProjectSilhouette(SVertex* ioVertex)
   //  real min=HUGE;
   //  real max=-HUGE;
   vector<SVertex*>::iterator sv, svend;
   //  real min=HUGE;
   //  real max=-HUGE;
   vector<SVertex*>::iterator sv, svend;
+  const real depth = _zfar - _znear;
+  const real fac = (depth < 1e-6) ? 1.0 : 1.0 / depth;
   GeomUtils::fromWorldToImage(ioVertex->point3D(), newPoint, _modelViewMatrix, _projectionMatrix, _viewport);
   GeomUtils::fromWorldToImage(ioVertex->point3D(), newPoint, _modelViewMatrix, _projectionMatrix, _viewport);
-  newPoint[2] = (-newPoint[2]-_znear)/(_zfar-_znear); // normalize Z between 0 and 1
+  newPoint[2] = (-newPoint[2]-_znear) * fac; // normalize Z between 0 and 1
   ioVertex->setPoint2D(newPoint);  
 }
 
   ioVertex->setPoint2D(newPoint);  
 }
 
@@ -257,9 +261,11 @@ Vec3r SilhouetteGeomEngine::WorldToImage(const Vec3r& M)
 
 {
 
 
 {
 
+  const real depth = _zfar - _znear;
+  const real fac = (depth < 1e-6) ? 1.0 : 1.0 / depth;
   Vec3r newPoint;
   GeomUtils::fromWorldToImage(M, newPoint, _transform, _viewport);
   Vec3r newPoint;
   GeomUtils::fromWorldToImage(M, newPoint, _transform, _viewport);
-  newPoint[2] = (-newPoint[2]-_znear)/(_zfar-_znear); // normalize Z between 0 and 1
+  newPoint[2] = (-newPoint[2]-_znear) * fac; // normalize Z between 0 and 1
   return newPoint;
 
 }
   return newPoint;
 
 }