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 | |
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.
-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); |