[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [16074] branches/soc-2008-jaguarandi/ source/blender/blenkernel/intern: fixed a bug related with "cullfaces" option on shrinkwrap

André Pinto andresusanopinto at gmail.com
Wed Aug 13 03:38:14 CEST 2008


Revision: 16074
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=16074
Author:   jaguarandi
Date:     2008-08-13 03:38:13 +0200 (Wed, 13 Aug 2008)

Log Message:
-----------
fixed a bug related with "cullfaces" option on shrinkwrap
enabled openmp during the tree queries (before it was only enabled during tree building)

Modified Paths:
--------------
    branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/modifier.c
    branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/shrinkwrap.c

Modified: branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/modifier.c
===================================================================
--- branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/modifier.c	2008-08-12 22:12:24 UTC (rev 16073)
+++ branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/modifier.c	2008-08-13 01:38:13 UTC (rev 16074)
@@ -7258,8 +7258,13 @@
 	CustomDataMask dataMask = 0;
 
 	/* ask for vertexgroups if we need them */
-	if(smd->vgroup_name[0]) dataMask |= (1 << CD_MDEFORMVERT);
+	if(smd->vgroup_name[0])
+		dataMask |= (1 << CD_MDEFORMVERT);
 
+	if(smd->shrinkType == MOD_SHRINKWRAP_PROJECT
+	&& smd->projAxis == MOD_SHRINKWRAP_PROJECT_OVER_NORMAL)
+		dataMask |= (1 << CD_MVERT);
+		
 	return dataMask;
 }
 

Modified: branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/shrinkwrap.c
===================================================================
--- branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/shrinkwrap.c	2008-08-12 22:12:24 UTC (rev 16073)
+++ branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/shrinkwrap.c	2008-08-13 01:38:13 UTC (rev 16074)
@@ -215,12 +215,12 @@
 void shrinkwrap_calc_nearest_vertex(ShrinkwrapCalcData *calc)
 {
 	int i;
-	int vgroup		= get_named_vertexgroup_num(calc->ob, calc->smd->vgroup_name);
+	const int vgroup		 = get_named_vertexgroup_num(calc->ob, calc->smd->vgroup_name);
+	MDeformVert *const dvert = calc->original ? calc->original->getVertDataArray(calc->original, CD_MDEFORMVERT) : NULL;
 
 	BVHTreeFromMesh treeData = NULL_BVHTreeFromMesh;
 	BVHTreeNearest  nearest  = NULL_BVHTreeNearest;
 
-	MDeformVert *dvert = calc->original ? calc->original->getVertDataArray(calc->original, CD_MDEFORMVERT) : NULL;
 
 	BENCH(bvhtree_from_mesh_verts(&treeData, calc->target, 0.0, 2, 6));
 	if(treeData.tree == NULL) return OUT_OF_MEMORY();
@@ -229,7 +229,7 @@
 	nearest.index = -1;
 	nearest.dist = FLT_MAX;
 
-//#pragma omp parallel for private(i) private(nearest) schedule(static)
+#pragma omp parallel for default(none) private(i) firstprivate(nearest) shared(treeData,calc) schedule(static)
 	for(i = 0; i<calc->numVerts; ++i)
 	{
 		float *co = calc->vertexCos[i];
@@ -315,8 +315,8 @@
 	{
 		float dot = INPR( dir, hit_tmp.no);
 
-		if(((options & MOD_SHRINKWRAP_CULL_TARGET_FRONTFACE) && dot < 0)
-		|| ((options & MOD_SHRINKWRAP_CULL_TARGET_BACKFACE) && dot > 0))
+		if(((options & MOD_SHRINKWRAP_CULL_TARGET_FRONTFACE) && dot <= 0.0f)
+		|| ((options & MOD_SHRINKWRAP_CULL_TARGET_BACKFACE) && dot >= 0.0f))
 			return FALSE; //Ignore hit
 
 
@@ -341,13 +341,13 @@
 	int i;
 
 	//Options about projection direction
-	char use_normal    = calc->smd->shrinkOpts;
+	const char use_normal    = calc->smd->shrinkOpts;
 	float proj_axis[3] = {0.0f, 0.0f, 0.0f};
 	MVert *vert  = NULL; //Needed in case of vertex normal
 
 	//Vertex group data
-	int vgroup		   = get_named_vertexgroup_num(calc->ob, calc->smd->vgroup_name);
-	MDeformVert *dvert = calc->original ? calc->original->getVertDataArray(calc->original, CD_MDEFORMVERT) : NULL;
+	const int vgroup		   = get_named_vertexgroup_num(calc->ob, calc->smd->vgroup_name);
+	const MDeformVert *dvert = calc->original ? calc->original->getVertDataArray(calc->original, CD_MDEFORMVERT) : NULL;
 
 
 	//Raycast and tree stuff
@@ -405,8 +405,7 @@
 
 
 	//Now, everything is ready to project the vertexs!
-
-//#pragma omp parallel for private(i) private(hit) schedule(static)
+//#pragma omp parallel for private(i,hit) schedule(static)
 	for(i = 0; i<calc->numVerts; ++i)
 	{
 		float *co = calc->vertexCos[i];
@@ -477,8 +476,8 @@
 {
 	int i;
 
-	const int vgroup		 = get_named_vertexgroup_num(calc->ob, calc->smd->vgroup_name);
-	const MDeformVert *dvert = calc->original ? calc->original->getVertDataArray(calc->original, CD_MDEFORMVERT) : NULL;
+	const int vgroup = get_named_vertexgroup_num(calc->ob, calc->smd->vgroup_name);
+	const MDeformVert *const dvert = calc->original ? calc->original->getVertDataArray(calc->original, CD_MDEFORMVERT) : NULL;
 
 	BVHTreeFromMesh treeData = NULL_BVHTreeFromMesh;
 	BVHTreeNearest  nearest  = NULL_BVHTreeNearest;
@@ -495,49 +494,55 @@
 
 
 	//Find the nearest vertex 
-//#pragma omp parallel for private(i) private(nearest) schedule(static)
+#pragma omp parallel for default(none) private(i) firstprivate(nearest) shared(calc,treeData) schedule(static)
 	for(i = 0; i<calc->numVerts; ++i)
 	{
 		float *co = calc->vertexCos[i];
-		int index;
 		float tmp_co[3];
 		float weight = vertexgroup_get_vertex_weight(dvert, i, vgroup);
 		if(weight == 0.0f) continue;
 
+		//Convert the vertex to tree coordinates
 		VECCOPY(tmp_co, co);
 		space_transform_apply(&calc->local2target, tmp_co);
 
+		//Use local proximity heuristics (to reduce the nearest search)
+		//
+		//If we already had an hit before.. we assume this vertex is going to have a close hit to that other vertex
+		//so we can initiate the "nearest.dist" with the expected value to that last hit.
+		//This will lead in prunning of the search tree.
 		if(nearest.index != -1)
-		{
 			nearest.dist = squared_dist(tmp_co, nearest.co);
-		}
-		else nearest.dist = FLT_MAX;
+		else
+			nearest.dist = FLT_MAX;
 
-		index = BLI_bvhtree_find_nearest(treeData.tree, tmp_co, &nearest, treeData.nearest_callback, &treeData);
+		BLI_bvhtree_find_nearest(treeData.tree, tmp_co, &nearest, treeData.nearest_callback, &treeData);
 
-		if(index != -1)
+		//Found the nearest vertex
+		if(nearest.index)
 		{
 			if(calc->smd->shrinkOpts & MOD_SHRINKWRAP_KEPT_ABOVE_SURFACE)
 			{
+				//Make the vertex stay on the front side of the face
 				VECADDFAC(tmp_co, nearest.co, nearest.no, calc->keptDist);
 			}
 			else
 			{
+				//Adjusting the vertex weight, so that after interpolating it kepts a certain distance from the nearest position
 				float dist = sasqrt( nearest.dist );
 				if(dist > FLT_EPSILON)
-				{
 					VecLerpf(tmp_co, tmp_co, nearest.co, (dist - calc->keptDist)/dist);	//linear interpolation
-				}
 				else
-				{
 					VECCOPY( tmp_co, nearest.co );
-				}
 			}
+
+			//Convert the coordinates back to mesh coordinates
 			space_transform_invert(&calc->local2target, tmp_co);
 			VecLerpf(co, co, tmp_co, weight);	//linear interpolation
 		}
 	}
 
+
 	free_bvhtree_from_mesh(&treeData);
 }
 





More information about the Bf-blender-cvs mailing list