forked from bartvdbraak/blender
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.
This commit is contained in:
parent
004e38a44e
commit
742e180a76
@ -113,13 +113,15 @@ void SilhouetteGeomEngine::ProjectSilhouette(vector<SVertex*>& ioVertices)
|
|||||||
// real min=HUGE;
|
// real min=HUGE;
|
||||||
// real max=-HUGE;
|
// real max=-HUGE;
|
||||||
vector<SVertex*>::iterator sv, svend;
|
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();
|
for(sv=ioVertices.begin(), svend=ioVertices.end();
|
||||||
sv!=svend;
|
sv!=svend;
|
||||||
sv++)
|
sv++)
|
||||||
{
|
{
|
||||||
GeomUtils::fromWorldToImage((*sv)->point3D(), newPoint, _modelViewMatrix, _projectionMatrix, _viewport);
|
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);
|
(*sv)->setPoint2D(newPoint);
|
||||||
//cerr << (*sv)->point2d().z() << " ";
|
//cerr << (*sv)->point2d().z() << " ";
|
||||||
// real d=(*sv)->point2d()[2];
|
// real d=(*sv)->point2d()[2];
|
||||||
@ -142,8 +144,10 @@ void SilhouetteGeomEngine::ProjectSilhouette(SVertex* ioVertex)
|
|||||||
// real min=HUGE;
|
// real min=HUGE;
|
||||||
// real max=-HUGE;
|
// real max=-HUGE;
|
||||||
vector<SVertex*>::iterator sv, svend;
|
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;
|
Vec3r newPoint;
|
||||||
GeomUtils::fromWorldToImage(M, newPoint, _transform, _viewport);
|
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;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user