[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [57718] trunk/blender/source/blender/ freestyle/intern/stroke/StrokeRep.cpp: Fix for invalid zero-length orientation vectors.

Tamito Kajiyama rd6t-kjym at asahi-net.or.jp
Tue Jun 25 00:48:00 CEST 2013


Revision: 57718
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=57718
Author:   kjym3
Date:     2013-06-24 22:48:00 +0000 (Mon, 24 Jun 2013)
Log Message:
-----------
Fix for invalid zero-length orientation vectors.
Problem report by flokkievids in the BA Freestyle thread, thanks!

Also made changes to suppress warnings in strip creation when Freestyle debugging is disabled.

Modified Paths:
--------------
    trunk/blender/source/blender/freestyle/intern/stroke/StrokeRep.cpp

Modified: trunk/blender/source/blender/freestyle/intern/stroke/StrokeRep.cpp
===================================================================
--- trunk/blender/source/blender/freestyle/intern/stroke/StrokeRep.cpp	2013-06-24 22:41:40 UTC (rev 57717)
+++ trunk/blender/source/blender/freestyle/intern/stroke/StrokeRep.cpp	2013-06-24 22:48:00 UTC (rev 57718)
@@ -31,6 +31,8 @@
 #include "StrokeRenderer.h"
 #include "StrokeRep.h"
 
+#include "BKE_global.h"
+
 using namespace std;
 
 namespace Freestyle {
@@ -109,7 +111,9 @@
 {
 	//computeParameterization();
 	if (iStrokeVertices.size() < 2) {
-		cerr << "Warning: strip has less than 2 vertices" << endl;
+		if (G.debug & G_DEBUG_FREESTYLE) {
+			cout << "Warning: strip has less than 2 vertices" << endl;
+		}
 		return;
 	}
 	_vertices.reserve(2 * iStrokeVertices.size());
@@ -123,6 +127,7 @@
 
 	vector<StrokeVertex *>::const_iterator v, vend, v2, vPrev;
 	StrokeVertex *sv, *sv2, *svPrev;
+	int orientationErrors = 0;
 
 	//special case of first vertex
 	v = iStrokeVertices.begin();
@@ -138,11 +143,15 @@
 	// check whether the orientation was user defined
 	if (sv->attribute().isAttributeAvailableVec2f("orientation")) {
 		Vec2r userDir = sv->attribute().getAttributeVec2f("orientation");
-		userDir.normalize();
-		real dp = userDir * orthDir;
-		if (dp < 0)
-		userDir = userDir * (-1.0f);
-		stripDir = userDir;
+		if (userDir.norm() > 1e-6) {
+			userDir.normalize();
+			real dp = userDir * orthDir;
+			if (dp < 0)
+				userDir = userDir * (-1.0f);
+			stripDir = userDir;
+		} else {
+			++orientationErrors;
+		}
 	}
 	const float *thickness = sv->attribute().getThickness();
 	_vertices.push_back(new StrokeVertexRep(sv->getPoint() + thickness[1] * stripDir));
@@ -192,11 +201,15 @@
 		Vec2r stripDir = orthDir;
 		if (sv->attribute().isAttributeAvailableVec2f("orientation")) {
 			Vec2r userDir = sv->attribute().getAttributeVec2f("orientation");
-			userDir.normalize();
-			real dp = userDir * orthDir;
-			if (dp < 0)
-				userDir = userDir * (-1.0f);
-			stripDir = userDir;
+			if (userDir.norm() > 1e-6) {
+				userDir.normalize();
+				real dp = userDir * orthDir;
+				if (dp < 0)
+					userDir = userDir * (-1.0f);
+				stripDir = userDir;
+			} else {
+				++orientationErrors;
+			}
 		}
 
 		//direction and orthogonal vector to the previous segment
@@ -207,11 +220,15 @@
 		Vec2r stripDirPrev = orthDirPrev;
 		if (svPrev->attribute().isAttributeAvailableVec2f("orientation")) {
 			Vec2r userDir = svPrev->attribute().getAttributeVec2f("orientation");
-			userDir.normalize();
-			real dp = userDir * orthDir;
-			if (dp < 0)
-				userDir = userDir * (-1.0f);
-			stripDirPrev = userDir;
+			if (userDir.norm() > 1e-6) {
+				userDir.normalize();
+				real dp = userDir * orthDir;
+				if (dp < 0)
+					userDir = userDir * (-1.0f);
+				stripDirPrev = userDir;
+			} else {
+				++orientationErrors;
+			}
 		}
 
 		const float *thickness = sv->attribute().getThickness();
@@ -279,11 +296,15 @@
 	// check whether the orientation was user defined
 	if (sv->attribute().isAttributeAvailableVec2f("orientation")) {
 		Vec2r userDir = sv->attribute().getAttributeVec2f("orientation");
-		userDir.normalize();
-		real dp = userDir * orthDir;
-		if (dp < 0)
-			userDir = userDir * (-1.0f);
-		stripDirLast = userDir;
+		if (userDir.norm() > 1e-6) {
+			userDir.normalize();
+			real dp = userDir * orthDir;
+			if (dp < 0)
+				userDir = userDir * (-1.0f);
+			stripDirLast = userDir;
+		} else {
+			++orientationErrors;
+		}
 	}
 	const float *thicknessLast = sv->attribute().getThickness();
 	_vertices.push_back(new StrokeVertexRep(sv->getPoint() + thicknessLast[1] * stripDirLast));
@@ -322,9 +343,18 @@
 	if (iStrokeVertices.size() < 3)
 		_averageThickness = 0.5 * (thicknessLast[1] + thicknessLast[0] + thickness[0] + thickness[1]);
 
-	if (i != 2 * (int)iStrokeVertices.size())
-		cerr << "Warning: problem with stripe size\n";
+	if (orientationErrors > 0) {
+		if (G.debug & G_DEBUG_FREESTYLE) {
+			cout << "Warning: " << orientationErrors <<" invalid zero-length orientation vector(s) found.\n";
+		}
+	}
 
+	if (i != 2 * (int)iStrokeVertices.size()) {
+		if (G.debug & G_DEBUG_FREESTYLE) {
+			cout << "Warning: problem with stripe size\n";
+		}
+	}
+
 	cleanUpSingularities (iStrokeVertices);
 }
 
@@ -338,7 +368,9 @@
 
 	for (k = 0; k < sizeStrip; k++) {
 		if (notValid(_vertices[k]->point2d())) {
-			cerr << "Warning: strip vertex " << k << " non valid" << endl;
+			if (G.debug & G_DEBUG_FREESTYLE) {
+				cout << "Warning: strip vertex " << k << " non valid" << endl;
+			}
 			return;
 		}
 	}
@@ -437,7 +469,9 @@
 
 	for (k = 0; k < sizeStrip; k++) {
 		if (notValid(_vertices[k]->point2d())) {
-			cerr << "Warning: strip vertex " << k << " non valid after cleanup" << endl;
+			if (G.debug & G_DEBUG_FREESTYLE) {
+				cout << "Warning: strip vertex " << k << " non valid after cleanup" << endl;
+			}
 			return;
 		}
 	}




More information about the Bf-blender-cvs mailing list