Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTamito Kajiyama <rd6t-kjym@asahi-net.or.jp>2012-06-17 01:15:50 +0400
committerTamito Kajiyama <rd6t-kjym@asahi-net.or.jp>2012-06-17 01:15:50 +0400
commit742e180a764de20cfe6dff82fbf94b5a7e679c44 (patch)
tree7ca473046b79058cf512279bd84efa4a6b6d9f57 /source/blender/freestyle/intern/view_map/SilhouetteGeomEngine.cpp
parent004e38a44eff3b2987771aef8c7427f8c15a6494 (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/blender/freestyle/intern/view_map/SilhouetteGeomEngine.cpp')
-rwxr-xr-xsource/blender/freestyle/intern/view_map/SilhouetteGeomEngine.cpp12
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;
}