[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [15292] branches/soc-2008-jaguarandi/ source/blender: Added cut-plane option.

André Pinto andresusanopinto at gmail.com
Fri Jun 20 23:10:25 CEST 2008


Revision: 15292
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15292
Author:   jaguarandi
Date:     2008-06-20 23:10:16 +0200 (Fri, 20 Jun 2008)

Log Message:
-----------
Added cut-plane option.
Its now possible to project 2 planes over a model and get a cloth..
Tought it still has a few issues.. related with distance to kept from mesh.

Modified Paths:
--------------
    branches/soc-2008-jaguarandi/source/blender/blenkernel/BKE_shrinkwrap.h
    branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/modifier.c
    branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/shrinkwrap.c
    branches/soc-2008-jaguarandi/source/blender/makesdna/DNA_modifier_types.h
    branches/soc-2008-jaguarandi/source/blender/src/buttons_editing.c

Modified: branches/soc-2008-jaguarandi/source/blender/blenkernel/BKE_shrinkwrap.h
===================================================================
--- branches/soc-2008-jaguarandi/source/blender/blenkernel/BKE_shrinkwrap.h	2008-06-20 20:54:29 UTC (rev 15291)
+++ branches/soc-2008-jaguarandi/source/blender/blenkernel/BKE_shrinkwrap.h	2008-06-20 21:10:16 UTC (rev 15292)
@@ -54,7 +54,7 @@
 	ShrinkwrapModifierData *smd;	//shrinkwrap modifier data
 
 	struct Object *ob;				//object we are applying shrinkwrap to
-	struct DerivedMesh *original;	//mesh before shrinkwrap
+	struct DerivedMesh *original;	//mesh before shrinkwrap (TODO clean this variable.. we don't really need it)
 	struct DerivedMesh *final;		//initially a copy of original mesh.. mesh thats going to be shrinkwrapped
 
 	struct DerivedMesh *target;		//mesh we are shrinking to

Modified: branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/modifier.c
===================================================================
--- branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/modifier.c	2008-06-20 20:54:29 UTC (rev 15291)
+++ branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/modifier.c	2008-06-20 21:10:16 UTC (rev 15292)
@@ -7022,6 +7022,9 @@
 	smd->shrinkOpts = MOD_SHRINKWRAP_ALLOW_DEFAULT_NORMAL;
 	smd->keptDist	= 0.0f;
 	smd->mergeDist	= 0.0f;
+
+	smd->target = 0;
+	smd->cutPlane = 0;
 }
 
 static void shrinkwrapModifier_copyData(ModifierData *md, ModifierData *target)
@@ -7045,6 +7048,7 @@
 	ShrinkwrapModifierData *smd = (ShrinkwrapModifierData*) md;
 
 	walk(userData, ob, &smd->target);
+	walk(userData, ob, &smd->cutPlane);
 }
 
 static DerivedMesh *shrinkwrapModifier_applyModifier(ModifierData *md, Object *ob, DerivedMesh *derivedData, int useRenderParams, int isFinalCalc)
@@ -7061,12 +7065,11 @@
 {
 	ShrinkwrapModifierData *smd = (ShrinkwrapModifierData*) md;
 
-	if (smd->target) {
-		DagNode *curNode = dag_get_node(forest, smd->target);
+	if (smd->target)
+		dag_add_relation(forest, dag_get_node(forest, smd->target),   obNode, DAG_RL_OB_DATA | DAG_RL_DATA_DATA, "Shrinkwrap Modifier");
 
-		dag_add_relation(forest, curNode, obNode, DAG_RL_OB_DATA | DAG_RL_DATA_DATA,
-			"Shrinkwrap Modifier");
-	}
+	if (smd->cutPlane)
+		dag_add_relation(forest, dag_get_node(forest, smd->cutPlane), obNode, DAG_RL_OB_DATA | DAG_RL_DATA_DATA, "Shrinkwrap Modifier");
 }
 
 

Modified: branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/shrinkwrap.c
===================================================================
--- branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/shrinkwrap.c	2008-06-20 20:54:29 UTC (rev 15291)
+++ branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/shrinkwrap.c	2008-06-20 21:10:16 UTC (rev 15292)
@@ -894,7 +894,74 @@
 	calc->final = new;
 }
 
+void shrinkwrap_projectToCutPlane(ShrinkwrapCalcData *calc_data)
+{
+	if(calc_data->smd->cutPlane && calc_data->moved)
+	{
+		int i;
+		int unmoved = 0;
+		int numVerts= 0;
+		MVert *vert = NULL;
+		MVert *vert_unmoved = NULL;
 
+		ShrinkwrapCalcData calc;
+		memcpy(&calc, calc_data, sizeof(calc));
+
+		calc.moved = 0;
+
+		if(calc.smd->cutPlane)
+		{
+			calc.target = (DerivedMesh *)calc.smd->cutPlane->derivedFinal;
+
+			if(!calc.target)
+			{
+				return;
+			}
+
+			Mat4Invert (calc.smd->cutPlane->imat, calc.smd->cutPlane->obmat);	//inverse is outdated
+			Mat4MulSerie(calc.local2target, calc.smd->cutPlane->imat, calc.ob->obmat, 0, 0, 0, 0, 0, 0);
+			Mat4Invert(calc.target2local, calc.local2target);
+	
+			calc.keptDist = 0;
+		}
+
+
+		//Make a mesh with the points we want to project
+		numVerts = calc_data->final->getNumVerts(calc_data->final);
+
+		unmoved = 0;
+		for(i=0; i<numVerts; i++)
+			if(!bitset_get(calc_data->moved, i))
+				unmoved++;
+
+		calc.final = CDDM_new(unmoved, 0, 0);
+		if(!calc.final) return;
+
+
+		vert = calc_data->final->getVertDataArray(calc_data->final, CD_MVERT);
+		vert_unmoved = calc.final->getVertDataArray(calc.final, CD_MVERT);
+
+		for(i=0; i<numVerts; i++)
+			if(!bitset_get(calc_data->moved, i))
+				memcpy(vert_unmoved++, vert+i, sizeof(*vert_unmoved));
+
+		//use shrinkwrap projection
+		shrinkwrap_calc_normal_projection(&calc);
+
+		//Copy the points back to the mesh
+		vert = calc_data->final->getVertDataArray(calc_data->final, CD_MVERT);
+		vert_unmoved = calc.final->getVertDataArray(calc.final, CD_MVERT);
+		for(i=0; i<numVerts; i++)
+			if(!bitset_get(calc_data->moved, i))
+				memcpy(vert+i, vert_unmoved++, sizeof(*vert_unmoved) );
+
+		//free memory
+		calc.final->release(calc.final);
+	}	
+
+}
+
+
 /* Main shrinkwrap function */
 DerivedMesh *shrinkwrapModifier_do(ShrinkwrapModifierData *smd, Object *ob, DerivedMesh *dm, int useRenderParams, int isFinalCalc)
 {
@@ -951,11 +1018,29 @@
 			break;
 
 			case MOD_SHRINKWRAP_NORMAL:
+
+				if(calc.smd->shrinkOpts & MOD_SHRINKWRAP_REMOVE_UNPROJECTED_FACES)
+					calc.moved = bitset_new( calc.final->getNumVerts(calc.final), "shrinkwrap bitset data");
+
 				BENCH(shrinkwrap_calc_normal_projection(&calc));
 //				BENCH(shrinkwrap_calc_foreach_vertex(&calc, bruteforce_shrinkwrap_calc_normal_projection));
+
+				if(calc.moved)
+				{
+					//Adjust vertxs that didn't moved (project to cut plane)
+					shrinkwrap_projectToCutPlane(&calc);
+
+					//Destroy faces, edges and stuff
+					shrinkwrap_removeUnused(&calc);
+
+					//Merge points that didn't moved
+					derivedmesh_mergeNearestPoints(calc.final, calc.smd->mergeDist, calc.moved);
+					bitset_free(calc.moved);
+				}
 			break;
 
 			case MOD_SHRINKWRAP_NEAREST_VERTEX:
+
 				BENCH(shrinkwrap_calc_nearest_vertex(&calc));
 //				BENCH(shrinkwrap_calc_foreach_vertex(&calc, bruteforce_shrinkwrap_calc_nearest_vertex));
 			break;
@@ -963,22 +1048,8 @@
 
 	}
 
-	if(calc.moved)
-	{
-		//Destroy faces, edges and stuff
-		shrinkwrap_removeUnused(&calc);
-
-		if(calc.moved)
-			derivedmesh_mergeNearestPoints(calc.final, calc.smd->mergeDist, calc.moved);
-	}
-
 	CDDM_calc_normals(calc.final);
 
-	//clean memory
-	if(calc.moved)
-		bitset_free(calc.moved);
-
-
 	return calc.final;
 }
 
@@ -1083,9 +1154,6 @@
 	vert	= calc->final->getVertDataArray(calc->final, CD_MVERT);	
 	dvert	= calc->final->getVertDataArray(calc->final, CD_MDEFORMVERT);
 
-	if(calc->smd->shrinkOpts & MOD_SHRINKWRAP_REMOVE_UNPROJECTED_FACES)
-		calc->moved = bitset_new(numVerts, "shrinkwrap bitset data");
-
 	for(i=0; i<numVerts; i++)
 	{
 		float dist = FLT_MAX;

Modified: branches/soc-2008-jaguarandi/source/blender/makesdna/DNA_modifier_types.h
===================================================================
--- branches/soc-2008-jaguarandi/source/blender/makesdna/DNA_modifier_types.h	2008-06-20 20:54:29 UTC (rev 15291)
+++ branches/soc-2008-jaguarandi/source/blender/makesdna/DNA_modifier_types.h	2008-06-20 21:10:16 UTC (rev 15292)
@@ -493,6 +493,7 @@
 	ModifierData modifier;
 
 	struct Object *target;	/* shrink target */
+	struct Object *cutPlane;/* shrink target */
 	char vgroup_name[32];	/* optional vertexgroup name */
 	float keptDist;			/* distance offset from mesh/projection point */
 	float mergeDist;		/* distance to merge vertexs */

Modified: branches/soc-2008-jaguarandi/source/blender/src/buttons_editing.c
===================================================================
--- branches/soc-2008-jaguarandi/source/blender/src/buttons_editing.c	2008-06-20 20:54:29 UTC (rev 15291)
+++ branches/soc-2008-jaguarandi/source/blender/src/buttons_editing.c	2008-06-20 21:10:16 UTC (rev 15292)
@@ -1830,7 +1830,7 @@
 			ShrinkwrapModifierData *smd = (ShrinkwrapModifierData*) md;
 			height = 86;
 			if (smd->shrinkType == MOD_SHRINKWRAP_NORMAL)
-				height += 19*6;
+				height += 19*7;
 		}
 							/* roundbox 4 free variables: corner-rounding, nop, roundbox type, shade */
 		uiDefBut(block, ROUNDBOX, 0, "", x-10, y-height-2, width, height-2, NULL, 5.0, 0.0, 12, 40, ""); 
@@ -2462,6 +2462,7 @@
 				uiDefButBitS(block, TOG, MOD_SHRINKWRAP_CULL_TARGET_FRONTFACE, B_MODIFIER_RECALC, "Cull frontfaces",	lx,(cy-=19),buttonWidth,19, &smd->shrinkOpts, 0, 0, 0, 0, "Controls whether a vertex can be projected to a front face on target");
 				uiDefButBitS(block, TOG, MOD_SHRINKWRAP_CULL_TARGET_BACKFACE,  B_MODIFIER_RECALC, "Cull backfaces",	lx,(cy-=19),buttonWidth,19, &smd->shrinkOpts, 0, 0, 0, 0, "Controls whether a vertex can be projected to a back face on target");
 				uiDefButF(block, NUM, B_MODIFIER_RECALC, "Merge Dist:",	lx,(cy-=19),buttonWidth,19, &smd->mergeDist, 0.0f, 0.01f, 0.01f, 0.01f, "Specify merge distance");
+				uiDefIDPoinBut(block, modifier_testMeshObj, ID_OB, B_CHANGEDEP, "Cut: ",	lx, (cy-=19), buttonWidth,19, &smd->cutPlane, "Target to project points that didn't got projected over target");
 			}
 
 			but=uiDefBut(block, TEX, B_MODIFIER_RECALC, "VGroup: ",		lx, (cy-=19), buttonWidth,19, &smd->vgroup_name, 0, 31, 0, 0, "Vertex Group name");





More information about the Bf-blender-cvs mailing list