diff options
author | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2016-09-18 14:06:15 +0300 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2016-09-18 14:38:20 +0300 |
commit | 0552d5820b70d2bc60a703af23cdea6828317ab4 (patch) | |
tree | 7d6f1b4ba3c2a9486f4fa24ae033ab4ac96dc497 /intern | |
parent | 40247ee491fbe7517a4de3920c3616c9329cde6d (diff) |
Fix T49384: crash in tangent space calculation with NaN mesh vertices.
Diffstat (limited to 'intern')
-rw-r--r-- | intern/mikktspace/mikktspace.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/intern/mikktspace/mikktspace.c b/intern/mikktspace/mikktspace.c index 7e5861ea9ed..8d51816b132 100644 --- a/intern/mikktspace/mikktspace.c +++ b/intern/mikktspace/mikktspace.c @@ -579,11 +579,10 @@ static void MergeVertsFast(int piTriList_in_and_out[], STmpVert pTmpVert[], cons { // make bbox int c=0, l=0, channel=0; - float fvMin[3], fvMax[3]; + float fvMin[3] = {INFINITY, INFINITY, INFINITY}; + float fvMax[3] = {-INFINITY, -INFINITY, -INFINITY}; float dx=0, dy=0, dz=0, fSep=0; - for (c=0; c<3; c++) - { fvMin[c]=pTmpVert[iL_in].vert[c]; fvMax[c]=fvMin[c]; } - for (l=(iL_in+1); l<=iR_in; l++) + for (l=iL_in; l<=iR_in; l++) for (c=0; c<3; c++) if (fvMin[c]>pTmpVert[l].vert[c]) fvMin[c]=pTmpVert[l].vert[c]; else if (fvMax[c]<pTmpVert[l].vert[c]) fvMax[c]=pTmpVert[l].vert[c]; @@ -598,6 +597,10 @@ static void MergeVertsFast(int piTriList_in_and_out[], STmpVert pTmpVert[], cons fSep = 0.5f*(fvMax[channel]+fvMin[channel]); + // stop if all vertices are NaNs + if (!isfinite(fSep)) + return; + // terminate recursion when the separation/average value // is no longer strictly between fMin and fMax values. if (fSep>=fvMax[channel] || fSep<=fvMin[channel]) |