diff options
author | Tamito Kajiyama <rd6t-kjym@asahi-net.or.jp> | 2016-04-05 10:08:45 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2016-04-05 12:34:50 +0300 |
commit | 63e0d3a47fdae8a42cd584f13d0530ea57ca0e6f (patch) | |
tree | 6db9ce9a7be3cb2ddf7d7621afd35d71b9314ecc /source | |
parent | 249077901320a006398a8ad55a73cb6717d5df39 (diff) |
Fix T47705: Freestyle line glitch.
The addressed issue is a regression from Blender 2.75, after the internal
switch from double to single precision floating-point numbers in the
Freestyle code base. Face normal calculations require the higher
precision during the computations, even though the results can be stored
as single precision numbers.
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/freestyle/intern/winged_edge/WEdge.cpp | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/source/blender/freestyle/intern/winged_edge/WEdge.cpp b/source/blender/freestyle/intern/winged_edge/WEdge.cpp index 87ca3a4235f..99aa2d22239 100644 --- a/source/blender/freestyle/intern/winged_edge/WEdge.cpp +++ b/source/blender/freestyle/intern/winged_edge/WEdge.cpp @@ -640,18 +640,19 @@ WFace *WShape::MakeFace(vector<WVertex *>& iVertexList, vector<bool>& iFaceEdgeM vector<WVertex *>::iterator it; // compute the face normal (v1v2 ^ v1v3) - WVertex *v1, *v2, *v3; + // Double precision numbers are used here to avoid truncation errors [T47705] + Vec3r v1, v2, v3; it = iVertexList.begin(); - v1 = *it; + v1 = (*it)->GetVertex(); it++; - v2 = *it; + v2 = (*it)->GetVertex(); it++; - v3 = *it; + v3 = (*it)->GetVertex(); - Vec3f vector1(v2->GetVertex() - v1->GetVertex()); - Vec3f vector2(v3->GetVertex() - v1->GetVertex()); + Vec3r vector1(v2 - v1); + Vec3r vector2(v3 - v1); - Vec3f normal(vector1 ^ vector2); + Vec3r normal(vector1 ^ vector2); normal.normalize(); face->setNormal(normal); |