[Bf-blender-cvs] [a2a7316] master: Fix T48366: Freestyle will unnecessary exclude some linked objects.

Tamito Kajiyama noreply at git.blender.org
Fri Aug 5 15:25:39 CEST 2016


Commit: a2a7316d92082230b292e91a6fb579eef9d7c8d4
Author: Tamito Kajiyama
Date:   Fri Aug 5 22:21:43 2016 +0900
Branches: master
https://developer.blender.org/rBa2a7316d92082230b292e91a6fb579eef9d7c8d4

Fix T48366: Freestyle will unnecessary exclude some linked objects.

Group membership testing for including/excluding feature lines was not
accounting for object names possibly further qualified by library file
paths.

Also fixed a few potential (but unlikely) references of uninitialized
variables.

A big thank to Bastien Montagne for the insight on the cause of the
problem and how to fix it.

===================================================================

M	release/scripts/freestyle/modules/parameter_editor.py
M	source/blender/freestyle/intern/blender_interface/BlenderFileLoader.cpp
M	source/blender/freestyle/intern/python/BPy_ViewShape.cpp
M	source/blender/freestyle/intern/scene_graph/Rep.h
M	source/blender/freestyle/intern/view_map/Silhouette.h
M	source/blender/freestyle/intern/view_map/ViewMap.h
M	source/blender/freestyle/intern/view_map/ViewMapBuilder.cpp
M	source/blender/freestyle/intern/winged_edge/WEdge.cpp
M	source/blender/freestyle/intern/winged_edge/WEdge.h
M	source/blender/freestyle/intern/winged_edge/WXEdgeBuilder.cpp

===================================================================

diff --git a/release/scripts/freestyle/modules/parameter_editor.py b/release/scripts/freestyle/modules/parameter_editor.py
index 082ce13..93305cb 100644
--- a/release/scripts/freestyle/modules/parameter_editor.py
+++ b/release/scripts/freestyle/modules/parameter_editor.py
@@ -914,14 +914,25 @@ class QuantitativeInvisibilityRangeUP1D(UnaryPredicate1D):
         return self.qi_start <= qi <= self.qi_end
 
 
+def getQualifiedObjectName(ob):
+    if ob.library is not None:
+        return ob.library.filepath + '/' + ob.name
+    return ob.name
+
+
 class ObjectNamesUP1D(UnaryPredicate1D):
     def __init__(self, names, negative):
         UnaryPredicate1D.__init__(self)
         self.names = names
         self.negative = negative
 
+    def getViewShapeName(self, vs):
+        if vs.library_path is not None:
+            return vs.library_path + '/' + vs.name
+        return vs.name
+
     def __call__(self, viewEdge):
-        found = viewEdge.viewshape.name in self.names
+        found = self.getViewShapeName(viewEdge.viewshape) in self.names
         if self.negative:
             return not found
         return found
@@ -1256,7 +1267,7 @@ def process(layer_name, lineset_name):
     # prepare selection criteria by group of objects
     if lineset.select_by_group:
         if lineset.group is not None:
-            names = {ob.name: True for ob in lineset.group.objects}
+            names = {getQualifiedObjectName(ob): True for ob in lineset.group.objects}
             upred = ObjectNamesUP1D(names, lineset.group_negation == 'EXCLUSIVE')
             selection_criteria.append(upred)
     # prepare selection criteria by image border
diff --git a/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.cpp b/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.cpp
index ea5a557..1f5e2b6 100644
--- a/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.cpp
+++ b/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.cpp
@@ -807,6 +807,7 @@ void BlenderFileLoader::insertShapeNode(ObjectInstanceRen *obi, int id)
 	// sets the id of the rep
 	rep->setId(Id(id, 0));
 	rep->setName(obi->ob->id.name + 2);
+	rep->setLibraryPath(obi->ob->id.lib ? obi->ob->id.lib->name : NULL);
 
 	const BBox<Vec3r> bbox = BBox<Vec3r>(Vec3r(ls.minBBox[0], ls.minBBox[1], ls.minBBox[2]),
 	                                     Vec3r(ls.maxBBox[0], ls.maxBBox[1], ls.maxBBox[2]));
diff --git a/source/blender/freestyle/intern/python/BPy_ViewShape.cpp b/source/blender/freestyle/intern/python/BPy_ViewShape.cpp
index 253bf27..f2f5315 100644
--- a/source/blender/freestyle/intern/python/BPy_ViewShape.cpp
+++ b/source/blender/freestyle/intern/python/BPy_ViewShape.cpp
@@ -296,6 +296,19 @@ static PyObject *ViewShape_name_get(BPy_ViewShape *self, void *UNUSED(closure))
 	return PyUnicode_FromString(self->vs->getName());
 }
 
+PyDoc_STRVAR(ViewShape_library_path_doc,
+"The library path of the ViewShape.\n"
+"\n"
+":type: str, or None if the ViewShape is not part of a library");
+
+static PyObject *ViewShape_library_path_get(BPy_ViewShape *self, void *UNUSED(closure))
+{
+	const char *name = self->vs->getLibraryPath();
+	if (!name)
+		Py_RETURN_NONE;
+	return PyUnicode_FromString(name);
+}
+
 PyDoc_STRVAR(ViewShape_id_doc,
 "The Id of this ViewShape.\n"
 "\n"
@@ -313,6 +326,7 @@ static PyGetSetDef BPy_ViewShape_getseters[] = {
 	                     (char *)ViewShape_vertices_doc, NULL},
 	{(char *)"edges", (getter)ViewShape_edges_get, (setter)ViewShape_edges_set, (char *)ViewShape_edges_doc, NULL},
 	{(char *)"name", (getter)ViewShape_name_get, (setter)NULL, (char *)ViewShape_name_doc, NULL},
+	{(char *)"library_path", (getter)ViewShape_library_path_get, (setter)NULL, (char *)ViewShape_library_path_doc, NULL},
 	{(char *)"id", (getter)ViewShape_id_get, (setter)NULL, (char *)ViewShape_id_doc, NULL},
 	{NULL, NULL, NULL, NULL, NULL}  /* Sentinel */
 };
diff --git a/source/blender/freestyle/intern/scene_graph/Rep.h b/source/blender/freestyle/intern/scene_graph/Rep.h
index ce30dc9..773eb2d 100644
--- a/source/blender/freestyle/intern/scene_graph/Rep.h
+++ b/source/blender/freestyle/intern/scene_graph/Rep.h
@@ -48,6 +48,8 @@ public:
 	inline Rep() : BaseObject()
 	{
 		_Id = 0;
+		_Name = 0;
+		_LibraryPath = 0;
 		_FrsMaterial = 0;
 	}
 
@@ -55,6 +57,7 @@ public:
 	{
 		_Id = iBrother._Id;
 		_Name = iBrother._Name;
+		_LibraryPath = iBrother._LibraryPath;
 		if (0 == iBrother._FrsMaterial)
 			_FrsMaterial = 0;
 		else
@@ -68,6 +71,7 @@ public:
 		std::swap(_BBox, ioOther._BBox);
 		std::swap(_Id, ioOther._Id);
 		std::swap(_Name, ioOther._Name);
+		std::swap(_LibraryPath, ioOther._LibraryPath);
 		std::swap(_FrsMaterial, ioOther._FrsMaterial);
 	}
 
@@ -76,6 +80,7 @@ public:
 		if (&iBrother != this) {
 			_Id = iBrother._Id;
 			_Name = iBrother._Name;
+			_LibraryPath = iBrother._LibraryPath;
 			if (0 == iBrother._FrsMaterial) {
 				_FrsMaterial = 0;
 			}
@@ -132,6 +137,11 @@ public:
 		return _Name;
 	}
 
+	inline const char *getLibraryPath() const
+	{
+		return _LibraryPath;
+	}
+
 	inline const FrsMaterial *frs_material() const
 	{
 		return _FrsMaterial;
@@ -153,6 +163,11 @@ public:
 		_Name = name;
 	}
 
+	inline void setLibraryPath(const char *path)
+	{
+		_LibraryPath = path;
+	}
+
 	inline void setFrsMaterial(const FrsMaterial& iMaterial)
 	{
 		_FrsMaterial = new FrsMaterial(iMaterial);
@@ -162,6 +177,7 @@ private:
 	BBox<Vec3f> _BBox;
 	Id _Id;
 	const char *_Name;
+	const char *_LibraryPath;
 	FrsMaterial *_FrsMaterial;
 };
 
diff --git a/source/blender/freestyle/intern/view_map/Silhouette.h b/source/blender/freestyle/intern/view_map/Silhouette.h
index b9924e6..9d37310 100644
--- a/source/blender/freestyle/intern/view_map/Silhouette.h
+++ b/source/blender/freestyle/intern/view_map/Silhouette.h
@@ -1416,6 +1416,7 @@ private:
 	vector<FEdge*> _edgesList;       // list of all edges
 	Id _Id;
 	const char *_Name;
+	const char *_LibraryPath;
 	BBox<Vec3r> _BBox;
 	vector<FrsMaterial> _FrsMaterials;  
 
@@ -1436,6 +1437,7 @@ public:
 		_importance = 0.0f;
 		_ViewShape = NULL;
 		_Name = NULL;
+		_LibraryPath = NULL;
 	}
 
 	/*! Copy constructor */
@@ -1444,6 +1446,7 @@ public:
 		userdata = NULL;
 		_Id = iBrother._Id;
 		_Name = iBrother._Name;
+		_LibraryPath = iBrother._LibraryPath;
 		_BBox = iBrother.bbox();
 		_FrsMaterials = iBrother._FrsMaterials;
 		_importance = iBrother._importance;
@@ -1893,6 +1896,12 @@ public:
 		return _Name;
 	}
 
+	/*! Returns the library path of the Shape. */
+	inline const char *getLibraryPath() const
+	{
+		return _LibraryPath;
+	}
+
 	/* Modififers */
 	/*! Sets the Id of the shape.*/
 	inline void setId(Id id)
@@ -1906,6 +1915,12 @@ public:
 		_Name = name;
 	}
 
+	/*! Sets the library path of the shape.*/
+	inline void setLibraryPath(const char *path)
+	{
+		_LibraryPath = path;
+	}
+
 	/*! Sets the list of materials for the shape */
 	inline void setFrsMaterials(const vector<FrsMaterial>& iMaterials)
 	{
diff --git a/source/blender/freestyle/intern/view_map/ViewMap.h b/source/blender/freestyle/intern/view_map/ViewMap.h
index 74297e1..8b73c8a 100644
--- a/source/blender/freestyle/intern/view_map/ViewMap.h
+++ b/source/blender/freestyle/intern/view_map/ViewMap.h
@@ -1565,12 +1565,18 @@ public:
 		return _SShape->getId();
 	}
 
-	/*! Returns the ViewShape id. */
+	/*! Returns the ViewShape name. */
 	inline const char *getName() const
 	{
 		return _SShape->getName();
 	}
 
+	/*! Returns the ViewShape library path. */
+	inline const char *getLibraryPath() const
+	{
+		return _SShape->getLibraryPath();
+	}
+
 	/* modifiers */
 	/*! Sets the SShape on top of which the ViewShape is built. */
 	inline void setSShape(SShape *iSShape)
diff --git a/source/blender/freestyle/intern/view_map/ViewMapBuilder.cpp b/source/blender/freestyle/intern/view_map/ViewMapBuilder.cpp
index 9ca0214..77beb1d 100644
--- a/source/blender/freestyle/intern/view_map/ViewMapBuilder.cpp
+++ b/source/blender/freestyle/intern/view_map/ViewMapBuilder.cpp
@@ -1204,6 +1204,7 @@ void ViewMapBuilder::computeInitialViewEdges(WingedEdge& we)
 		psShape = new SShape;
 		psShape->setId((*it)->GetId());
 		psShape->setName((*it)->getName());
+		psShape->setLibraryPath((*it)->getLibraryPath());
 		psShape->setFrsMaterials((*it)->frs_materials()); // FIXME
 
 		// create the view shape
diff --git a/source/blender/freestyle/intern/winged_edge/WEdge.cpp b/source/blender/freestyle/intern/winged_edge/WEdge.cpp
index 99aa2d2..7bec5ba 100644
--- a/source/blender/freestyle/intern/winged_edge/WEdge.cpp
+++ b/source/blender/freestyle/intern/winged_edge/WEdge.cpp
@@ -471,6 +471,7 @@ WShape::WShape(WShape& iBrother)
 {
 	_Id = iBrother.GetId();
 	_Name = iBrother._Name;
+	_LibraryPath = iBrother._LibraryPath;
 	_FrsMaterials = iBrother._FrsMaterials;
 #if 0
 	_meanEdgeSize = iBrother._meanEdgeSize;
diff --git a/source/blender/freestyle/intern/winged_edge/WEdge.h b/source/blender/freestyle/intern/winged_edge/WEdge.h
index 8001342..14109fb 100644
--- a/source/blender/freestyle/intern/winged_edge/WEdge.h
+++ b/source/blender/freestyle/intern/winged_edge/WEdge.h
@@ -1025,6 +1025,7 @@ protected:
 	vector<WFace *> _FaceList;
 	int _Id;
 	const char *_Name;
+	const char *_LibraryPath;
 	static unsigned _SceneCurrentId;
 #if 0
 	Vec3f _min;
@@ -1043,6 +1044,8 @@ public:
 #endif
 		_Id = _SceneCurrentId;
 		_SceneCurrentId++;
+		_Name = 0;
+		_LibraryPath = 0;
 	}
 
 	/*! copy constructor */
@@ -1127,6 +1130,11 @@ public:
 		return _Name;
 	}
 
+	inline const char *getLibraryPath() const
+	{
+		return _LibraryPath;
+	}
+
 	/*! modifiers */
 	static inline void setCurrentId(const unsigned id)
 	{
@@ -1176,6 +1184,11 @@ public:
 		_Name = name;
 	}
 
+	inline void setLibraryPath(const char *path)
+	{
+		_LibraryPath = path;
+	}
+
 	/*! designed to build a specialized WFace for use in MakeFace */
 	virtual WFace *instanciateFace() const
 	{
diff --git a/source/blender/freestyle/intern/winged_edge/WXEdgeBuilder.cpp b/source/blender/freestyle/intern/winged_edge/WXEdgeBuilder.cpp
index 78773a9..dfdeede 100644
--- a/source/blender/freestyle/intern/winged_edge/WXEdgeBuilder.cpp
+++ b/source/blender/freestyle/intern/winged_edge/WXEdgeBuilder.cpp
@@ -42,6 +42,7 @@

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list