diff options
author | Tamito Kajiyama <rd6t-kjym@asahi-net.or.jp> | 2012-06-17 01:15:50 +0400 |
---|---|---|
committer | Tamito Kajiyama <rd6t-kjym@asahi-net.or.jp> | 2012-06-17 01:15:50 +0400 |
commit | 742e180a764de20cfe6dff82fbf94b5a7e679c44 (patch) | |
tree | 7ca473046b79058cf512279bd84efa4a6b6d9f57 /source | |
parent | 004e38a44eff3b2987771aef8c7427f8c15a6494 (diff) |
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.
Diffstat (limited to 'source')
-rwxr-xr-x | source/blender/freestyle/intern/view_map/SilhouetteGeomEngine.cpp | 12 |
1 files changed, 9 insertions, 3 deletions
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<SVertex*>& ioVertices) // 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); - 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<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); - 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; } |