From fb0c2084ca9512e27c2f90275c6b3de29fe9b08e Mon Sep 17 00:00:00 2001
From: Ansgar Philippsen <ansgar.philippsen@gmail.com>
Date: Wed, 12 Jan 2011 11:14:04 -0500
Subject: [PATCH] tweaked non-tube trace rendering

---
 modules/gfx/src/impl/cartoon_renderer.cc | 21 ++++++++++++---------
 1 file changed, 12 insertions(+), 9 deletions(-)

diff --git a/modules/gfx/src/impl/cartoon_renderer.cc b/modules/gfx/src/impl/cartoon_renderer.cc
index b9607fc84..0f76e247d 100644
--- a/modules/gfx/src/impl/cartoon_renderer.cc
+++ b/modules/gfx/src/impl/cartoon_renderer.cc
@@ -452,12 +452,14 @@ void CartoonRenderer::RebuildSplineObj(IndexedVertexArray& va,
     double psized=static_cast<double>(psize);
     float of=static_cast<float>(psize)/(2.0*M_PI);
     for (; sc<slist.size(); ++sc) {
-      //double dd=geom::Dot(slist.at(sc-1).normal,slist.at(sc).normal);
-      geom::Vec3 dir=slist.at(sc).position-slist.at(sc-1).position;
-      double ang=-geom::SignedAngle(geom::Cross(slist.at(sc-1).normal,dir),
-                                    geom::Cross(slist.at(sc).normal,dir),
-                                    dir);
-      size_t offset=psize+static_cast<size_t>(round(ang*of)+psized);
+      size_t offset=0;
+      if(slist.at(sc).type==0) {
+        geom::Vec3 dir=slist.at(sc).position-slist.at(sc-1).position;
+        double ang=-geom::SignedAngle(geom::Cross(slist.at(sc-1).normal,dir),
+                                      geom::Cross(slist.at(sc).normal,dir),
+                                      dir);
+        offset=psize+static_cast<size_t>(round(ang*of)+psized);
+      }
       if(slist.at(sc).type==3) {
         if(slist.at(sc-1).type!=3) {
           // boundary to arrow
@@ -718,9 +720,10 @@ namespace {
   for(unsigned int i=0;i<d4;++i) {
     unsigned int p1=(d4+i-1)%d4;
     unsigned int p2=(i+1)%d4;
-    float dx=prof[p2].v[0]-prof[p1].v[0];
-    float dy=prof[p2].v[1]-prof[p1].v[1];
-    prof[i].n=geom::Normalize(geom::Vec3(dy,-dx,0.0));
+    float f1=geom::Length2(prof[p1].v-prof[i].v);
+    float f2=geom::Length2(prof[p2].v-prof[i].v);
+    geom::Vec3 s = f2*(prof[p2].v-prof[i].v)-f1*(prof[p1].v-prof[i].v);
+    prof[i].n=geom::Normalize(geom::Vec3(s[1],-s[0],0.0));
   }
   return prof;
 }
-- 
GitLab