From 742e180a764de20cfe6dff82fbf94b5a7e679c44 Mon Sep 17 00:00:00 2001 From: Tamito Kajiyama Date: Sat, 16 Jun 2012 21:15:50 +0000 Subject: Fix for NaN's in the Z component of projected points by SilhouetteGeomEngine::ProjectSilhouette(). This issue arises when the Z depth of the bounding box of the scene being rendered is zero. --- .../freestyle/intern/view_map/SilhouetteGeomEngine.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) (limited to 'source/blender/freestyle/intern/view_map/SilhouetteGeomEngine.cpp') diff --git a/source/blender/freestyle/intern/view_map/SilhouetteGeomEngine.cpp b/source/blender/freestyle/intern/view_map/SilhouetteGeomEngine.cpp index c0817189bc2..6327956ca80 100755 --- a/source/blender/freestyle/intern/view_map/SilhouetteGeomEngine.cpp +++ b/source/blender/freestyle/intern/view_map/SilhouetteGeomEngine.cpp @@ -113,13 +113,15 @@ void SilhouetteGeomEngine::ProjectSilhouette(vector& ioVertices) // real min=HUGE; // real max=-HUGE; vector::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); - 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]; @@ -142,8 +144,10 @@ void SilhouetteGeomEngine::ProjectSilhouette(SVertex* ioVertex) // real min=HUGE; // real max=-HUGE; vector::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); - 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); } @@ -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); - 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; } -- cgit v1.2.3