[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [15764] branches/soc-2008-jaguarandi/ source/blender: Converted shrinkwrap to a DeformOnly modifier

André Pinto andresusanopinto at gmail.com
Fri Jul 25 20:48:24 CEST 2008


Revision: 15764
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15764
Author:   jaguarandi
Date:     2008-07-25 20:48:24 +0200 (Fri, 25 Jul 2008)

Log Message:
-----------
Converted shrinkwrap to a DeformOnly modifier

*the options "remove faces", "merge" points were removed
*made shrinkwrap work with CVs (curves and nurbs surfaces)
*cleanup shrinkwrap code.. (removed bruteforces and raytree methods)

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-07-25 18:28:47 UTC (rev 15763)
+++ branches/soc-2008-jaguarandi/source/blender/blenkernel/BKE_shrinkwrap.h	2008-07-25 18:48:24 UTC (rev 15764)
@@ -53,7 +53,8 @@
 
 } SpaceTransform;
 
-void space_transform_setup(SpaceTransform *data, struct Object *local, struct Object *target);
+void space_transform_from_matrixs(SpaceTransform *data, float local[][4], float target[][4]);
+#define space_transform_setup(data, local, target) space_transform_from_matrixs(data, (local)->obmat, (target)->obmat)
 
 void space_transform_apply (const SpaceTransform *data, float *co);
 void space_transform_invert(const SpaceTransform *data, float *co);
@@ -93,9 +94,8 @@
 // Builds a bvh tree where nodes are the faces of the given mesh. And configures BVHMesh if one is given.
 struct BVHTree* bvhtree_from_mesh_faces(struct BVHTreeFromMesh *data, struct DerivedMesh *mesh, float epsilon, int tree_type, int axis);
 
+int normal_projection_project_vertex(char options, const float *vert, const float *dir, const SpaceTransform *transf, BVHTree *tree, BVHTreeRayHit *hit, BVHTree_RayCastCallback callback, void *userdata);
 
-
-
 /* Shrinkwrap stuff */
 struct Object;
 struct DerivedMesh;
@@ -109,18 +109,15 @@
 	ShrinkwrapModifierData *smd;	//shrinkwrap modifier data
 
 	struct Object *ob;				//object we are applying shrinkwrap to
-	struct DerivedMesh *original;	//mesh before shrinkwrap (TODO clean this variable.. we don't really need it)
-	struct BVHTree *original_tree;	//BVHTree build with the original mesh (to be used on kept volume)
-	struct BVHMeshCallbackUserdata *callback;
+	struct DerivedMesh *original;	//mesh before shrinkwrap
 
-	struct DerivedMesh *final;		//initially a copy of original mesh.. mesh thats going to be shrinkwrapped
+	float (*vertexCos)[3];			//vertexs being shrinkwraped
+	int numVerts;
 
-	struct DerivedMesh *target;		//mesh we are shrinking to
-	
-	SpaceTransform local2target;
+	struct DerivedMesh *target;		//mesh we are shrinking to	
+	SpaceTransform local2target;	//transform to move bettwem local and target space
 
 	float keptDist;					//Distance to kept from target (units are in local space)
-	//float *weights;				//weights of vertexs
 	BitSet moved;					//BitSet indicating if vertex has moved
 
 } ShrinkwrapCalcData;
@@ -130,6 +127,7 @@
 void shrinkwrap_calc_nearest_surface_point(ShrinkwrapCalcData *data);
 
 struct DerivedMesh *shrinkwrapModifier_do(struct ShrinkwrapModifierData *smd, struct Object *ob, struct DerivedMesh *dm, int useRenderParams, int isFinalCalc);
+void shrinkwrapModifier_deform(struct ShrinkwrapModifierData *smd, struct Object *ob, struct DerivedMesh *dm, float (*vertexCos)[3], int numVerts);
 
 
 #endif

Modified: branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/modifier.c
===================================================================
--- branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/modifier.c	2008-07-25 18:28:47 UTC (rev 15763)
+++ branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/modifier.c	2008-07-25 18:48:24 UTC (rev 15764)
@@ -7198,7 +7198,6 @@
 	smd->shrinkType = MOD_SHRINKWRAP_NEAREST_SURFACE;
 	smd->shrinkOpts = MOD_SHRINKWRAP_ALLOW_DEFAULT_NORMAL;
 	smd->keptDist	= 0.0f;
-	smd->mergeDist	= 0.0f;
 
 	smd->target = 0;
 	smd->cutPlane = 0;
@@ -7213,7 +7212,6 @@
 	tsmd->cutPlane = smd->cutPlane;
 	strcpy(tsmd->vgroup_name, smd->vgroup_name);
 	tsmd->keptDist = smd->keptDist;
-	tsmd->mergeDist = smd->mergeDist;
 	tsmd->shrinkType = smd->shrinkType;
 	tsmd->shrinkOpts = smd->shrinkOpts;
 }
@@ -7243,7 +7241,7 @@
 	walk(userData, ob, &smd->target);
 	walk(userData, ob, &smd->cutPlane);
 }
-
+/*
 static DerivedMesh *shrinkwrapModifier_applyModifier(ModifierData *md, Object *ob, DerivedMesh *derivedData, int useRenderParams, int isFinalCalc)
 {
 	return shrinkwrapModifier_do((ShrinkwrapModifierData*)md,ob,derivedData,useRenderParams,isFinalCalc);
@@ -7253,7 +7251,27 @@
 {
 	return shrinkwrapModifier_do((ShrinkwrapModifierData*)md,ob,derivedData,0,0);
 }
+*/
+static void shrinkwrapModifier_deformVerts(ModifierData *md, Object *ob, DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts)
+{
+	shrinkwrapModifier_deform((ShrinkwrapModifierData*)md, ob, derivedData, vertexCos, numVerts);
+}
 
+static void shrinkwrapModifier_deformVertsEM(ModifierData *md, Object *ob, EditMesh *editData, DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts)
+{
+	DerivedMesh *dm;
+
+	if(!derivedData && ob->type == OB_MESH)
+		dm = CDDM_from_editmesh(editData, ob->data);
+	else
+		dm = CDDM_copy(derivedData);	//TODO: this is only needed if derevedData doenst supports getVertexArray
+
+	shrinkwrapModifier_deform((ShrinkwrapModifierData*)md, ob, dm, vertexCos, numVerts);
+
+	if(dm != derivedData)
+		dm->release(dm);
+}
+
 static void shrinkwrapModifier_updateDepgraph(ModifierData *md, DagForest *forest, Object *ob, DagNode *obNode)
 {
 	ShrinkwrapModifierData *smd = (ShrinkwrapModifierData*) md;
@@ -7645,8 +7663,9 @@
 		mti->applyModifier = explodeModifier_applyModifier;
 
 		mti = INIT_TYPE(Shrinkwrap);
-		mti->type = eModifierTypeType_Nonconstructive;
+		mti->type = eModifierTypeType_OnlyDeform;
 		mti->flags = eModifierTypeFlag_AcceptsMesh
+				| eModifierTypeFlag_AcceptsCVs
 				| eModifierTypeFlag_SupportsEditmode
 				| eModifierTypeFlag_EnableInEditmode;
 
@@ -7655,8 +7674,8 @@
 		mti->requiredDataMask = shrinkwrapModifier_requiredDataMask;
 		mti->isDisabled = shrinkwrapModifier_isDisabled;
 		mti->foreachObjectLink = shrinkwrapModifier_foreachObjectLink;
-		mti->applyModifier = shrinkwrapModifier_applyModifier;
-		mti->applyModifierEM = shrinkwrapModifier_applyModifierEM;
+		mti->deformVerts = shrinkwrapModifier_deformVerts;
+		mti->deformVertsEM = shrinkwrapModifier_deformVertsEM;
 		mti->updateDepgraph = shrinkwrapModifier_updateDepgraph;
 
 		mti = INIT_TYPE(SimpleDeform);

Modified: branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/shrinkwrap.c
===================================================================
--- branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/shrinkwrap.c	2008-07-25 18:28:47 UTC (rev 15763)
+++ branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/shrinkwrap.c	2008-07-25 18:48:24 UTC (rev 15764)
@@ -136,10 +136,11 @@
 }
 
 /* Space transform */
-void space_transform_setup(SpaceTransform *data, struct Object *local, struct Object *target)
+void space_transform_from_matrixs(SpaceTransform *data, float local[4][4], float target[4][4])
 {
-	Mat4Invert(target->imat, target->obmat); //Invserse might be outdated
-	Mat4MulSerie(data->local2target, target->imat, local->obmat, 0, 0, 0, 0, 0, 0);
+	float itarget[4][4];
+	Mat4Invert(itarget, target); //Invserse might be outdated
+	Mat4MulSerie(data->local2target, itarget, local, 0, 0, 0, 0, 0, 0);
 	Mat4Invert(data->target2local, data->local2target);
 }
 
@@ -348,144 +349,11 @@
 		t3 = NULL;
 
 	} while(t2);
-
-	//return hit->dist;
 }
 
-/*
- * Raytree from mesh
- */
-static MVert *raytree_from_mesh_verts = NULL;
-static MFace *raytree_from_mesh_faces = NULL;
 
-static int raytree_check_always(Isect *is, int ob, RayFace *face)
-{
-	return TRUE;
-}
 
-static void raytree_from_mesh_get_coords(RayFace *face, float **v1, float **v2, float **v3, float **v4)
-{
-	MFace *mface= raytree_from_mesh_faces + (int)face/2 - 1 ;
-
-	if(face == (RayFace*)(-1))
-	{
-		*v1 = NULL;
-		*v2 = NULL;
-		*v3 = NULL;
-		*v4 = NULL;
-		return;
-	}
-
-	//Nasty quad splitting
-	if(((int)face) & 1)	// we want the 2 triangle of the quad
-	{
-		*v1= raytree_from_mesh_verts[mface->v1].co;
-		*v2= raytree_from_mesh_verts[mface->v3].co;
-		*v3= raytree_from_mesh_verts[mface->v4].co;
-		*v4= NULL;
-	}
-	else
-	{
-		*v1= raytree_from_mesh_verts[mface->v1].co;
-		*v2= raytree_from_mesh_verts[mface->v2].co;
-		*v3= raytree_from_mesh_verts[mface->v3].co;
-		*v4= NULL;
-	}
-}
-
 /*
- * Creates a raytree from the given mesh
- * No copy of the mesh is done, so it must exist and remain
- * imutable as long the tree is intended to be used
- *
- * No more than 1 raytree can exist.. since this code uses a static variable
- * to pass data to raytree_from_mesh_get_coords
- */
-static RayTree* raytree_create_from_mesh(DerivedMesh *mesh)
-{
-	int i;
-	float min[3], max[3];
-
-	RayTree*tree= NULL;
-
-	int numFaces= mesh->getNumFaces(mesh);
-	MFace *face = mesh->getFaceDataArray(mesh, CD_MFACE);
-	int numVerts= mesh->getNumVerts(mesh);
-
-	//Initialize static vars
-	raytree_from_mesh_verts = mesh->getVertDataArray(mesh, CD_MVERT);
-	raytree_from_mesh_faces = face;
-
-
-	//calculate bounding box
-	INIT_MINMAX(min, max);
-
-	for(i=0; i<numVerts; i++)
-		DO_MINMAX(raytree_from_mesh_verts[i].co, min, max);
-	
-	tree = RE_ray_tree_create(64, numFaces, min, max, raytree_from_mesh_get_coords, raytree_check_always, NULL, NULL);
-	if(tree == NULL)
-		return NULL;
-
-	//Add faces to the RayTree (RayTree uses face=0, with some special value to setup things)
-	for(i=1; i<=numFaces; i++)
-	{
-		RE_ray_tree_add_face(tree, 0, (RayFace*)(i*2) );
-
-		 //Theres some nasty thing with non-coplanar quads (that I can't find the issue)
-		 //so we split quads (an odd numbered face represents the second triangle of the quad)
-		if(face[i-1].v4)
-			RE_ray_tree_add_face(tree, 0, (RayFace*)(i*2+1));
-	}
-
-	RE_ray_tree_done(tree);
-
-	return tree;
-}
-
-static void free_raytree_from_mesh(RayTree *tree)
-{
-	raytree_from_mesh_verts = NULL;
-	RE_ray_tree_free(tree);
-}
-
-/*
- * Cast a ray on the specified direction
- * Returns the distance the ray must travel until intersect something
- * Returns FLT_MAX in case of nothing intersection
- * if facenormal is given, it will be overwritted with the normal of the face the ray collided with
- */
-static float raytree_cast_ray(RayTree *tree, const float *coord, const float *direction, float *facenormal)
-{
-	Isect isec;
-	float *v1, *v2, *v3, *v4;
-
-	/* Setup intersection */
-	isec.mode		= RE_RAY_MIRROR; /* We want closest intersection */
-	isec.lay		= -1;
-	isec.face_last	= NULL;
-	isec.faceorig	= (RayFace*)(-1);
-	isec.labda		= 1e10f;
-
-	VECCOPY(isec.start, coord);
-	VECCOPY(isec.vec, direction);
-	VECADDFAC(isec.end, isec.start, isec.vec, isec.labda);
-
-	if(!RE_ray_tree_intersect(tree, &isec))
-		return FLT_MAX;
-
-	if(facenormal)
-	{

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list