[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [25777] trunk/blender/source/blender/ blenkernel: Fix #20519: shrinkwrap modifier doesnt work with subsurface modifier.

Brecht Van Lommel brecht at blender.org
Wed Jan 6 13:05:46 CET 2010


Revision: 25777
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=25777
Author:   blendix
Date:     2010-01-06 13:05:46 +0100 (Wed, 06 Jan 2010)

Log Message:
-----------
Fix #20519: shrinkwrap modifier doesnt work with subsurface modifier.
Fix #20516: subsurf modiefier+pressing add for smoke sims results in crash.
Fix retopo not working correct on subsurf mesh.

Various deforming modifiers were not correctly taking into account that a
derivedmesh is not necessarily a CDDerivedMesh, made utility functions for
this now.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_DerivedMesh.h
    trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c
    trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.c
    trunk/blender/source/blender/blenkernel/intern/modifier.c
    trunk/blender/source/blender/blenkernel/intern/subsurf_ccg.c

Modified: trunk/blender/source/blender/blenkernel/BKE_DerivedMesh.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_DerivedMesh.h	2010-01-06 12:00:53 UTC (rev 25776)
+++ trunk/blender/source/blender/blenkernel/BKE_DerivedMesh.h	2010-01-06 12:05:46 UTC (rev 25777)
@@ -78,6 +78,12 @@
 	int rotation[4];
 } DMGridAdjacency;
 
+typedef enum DerivedMeshType {
+	DM_TYPE_CDDM,
+	DM_TYPE_EDITMESH,
+	DM_TYPE_CCGDM
+} DerivedMeshType;
+
 typedef struct DerivedMesh DerivedMesh;
 struct DerivedMesh {
 	/* Private DerivedMesh data, only for internal DerivedMesh use */
@@ -87,6 +93,7 @@
 	int deformedOnly; /* set by modifier stack if only deformed from original */
 	BVHCache bvhCache;
 	struct GPUDrawObject *drawObject;
+	DerivedMeshType type;
 
 	/* Misc. Queries */
 
@@ -329,12 +336,14 @@
  * of vertices, edges and faces (doesn't allocate memory for them, just
  * sets up the custom data layers)
  */
-void DM_init(DerivedMesh *dm, int numVerts, int numEdges, int numFaces);
+void DM_init(DerivedMesh *dm, DerivedMeshType type,
+             int numVerts, int numEdges, int numFaces);
 
 /* utility function to initialise a DerivedMesh for the desired number
  * of vertices, edges and faces, with a layer setup copied from source
  */
 void DM_from_template(DerivedMesh *dm, DerivedMesh *source,
+                      DerivedMeshType type,
                       int numVerts, int numEdges, int numFaces);
 
 /* utility function to release a DerivedMesh's layers

Modified: trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c	2010-01-06 12:00:53 UTC (rev 25776)
+++ trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c	2010-01-06 12:05:46 UTC (rev 25777)
@@ -184,9 +184,10 @@
 	bvhcache_init(&dm->bvhCache);
 }
 
-void DM_init(DerivedMesh *dm,
+void DM_init(DerivedMesh *dm, DerivedMeshType type,
              int numVerts, int numEdges, int numFaces)
 {
+	dm->type = type;
 	dm->numVertData = numVerts;
 	dm->numEdgeData = numEdges;
 	dm->numFaceData = numFaces;
@@ -196,7 +197,7 @@
 	dm->needsFree = 1;
 }
 
-void DM_from_template(DerivedMesh *dm, DerivedMesh *source,
+void DM_from_template(DerivedMesh *dm, DerivedMesh *source, DerivedMeshType type,
                       int numVerts, int numEdges, int numFaces)
 {
 	CustomData_copy(&source->vertData, &dm->vertData, CD_MASK_DERIVEDMESH,
@@ -206,6 +207,7 @@
 	CustomData_copy(&source->faceData, &dm->faceData, CD_MASK_DERIVEDMESH,
 	                CD_CALLOC, numFaces);
 
+	dm->type = type;
 	dm->numVertData = numVerts;
 	dm->numEdgeData = numEdges;
 	dm->numFaceData = numFaces;
@@ -336,16 +338,25 @@
 
 void *DM_get_vert_data_layer(DerivedMesh *dm, int type)
 {
+	if(type == CD_MVERT)
+		return dm->getVertArray(dm);
+
 	return CustomData_get_layer(&dm->vertData, type);
 }
 
 void *DM_get_edge_data_layer(DerivedMesh *dm, int type)
 {
+	if(type == CD_MEDGE)
+		return dm->getEdgeArray(dm);
+
 	return CustomData_get_layer(&dm->edgeData, type);
 }
 
 void *DM_get_face_data_layer(DerivedMesh *dm, int type)
 {
+	if(type == CD_MFACE)
+		return dm->getFaceArray(dm);
+
 	return CustomData_get_layer(&dm->faceData, type);
 }
 
@@ -1450,7 +1461,7 @@
 {
 	EditMeshDerivedMesh *emdm = MEM_callocN(sizeof(*emdm), "emdm");
 
-	DM_init(&emdm->dm, BLI_countlist(&em->verts),
+	DM_init(&emdm->dm, DM_TYPE_EDITMESH, BLI_countlist(&em->verts),
 	                 BLI_countlist(&em->edges), BLI_countlist(&em->faces));
 
 	emdm->dm.getMinMax = emDM_getMinMax;

Modified: trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.c	2010-01-06 12:00:53 UTC (rev 25776)
+++ trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.c	2010-01-06 12:05:46 UTC (rev 25777)
@@ -1406,7 +1406,7 @@
 	CDDerivedMesh *cddm = cdDM_create("CDDM_new dm");
 	DerivedMesh *dm = &cddm->dm;
 
-	DM_init(dm, numVerts, numEdges, numFaces);
+	DM_init(dm, DM_TYPE_CDDM, numVerts, numEdges, numFaces);
 
 	CustomData_add_layer(&dm->vertData, CD_ORIGINDEX, CD_CALLOC, NULL, numVerts);
 	CustomData_add_layer(&dm->edgeData, CD_ORIGINDEX, CD_CALLOC, NULL, numEdges);
@@ -1432,7 +1432,7 @@
 
 	/* this does a referenced copy, with an exception for fluidsim */
 
-	DM_init(dm, mesh->totvert, mesh->totedge, mesh->totface);
+	DM_init(dm, DM_TYPE_CDDM, mesh->totvert, mesh->totedge, mesh->totface);
 
 	dm->deformedOnly = 1;
 
@@ -1565,7 +1565,7 @@
 	source->getFaceDataArray(source, CD_ORIGINDEX);
 
 	/* this initializes dm, and copies all non mvert/medge/mface layers */
-	DM_from_template(dm, source, numVerts, numEdges, numFaces);
+	DM_from_template(dm, source, DM_TYPE_CDDM, numVerts, numEdges, numFaces);
 	dm->deformedOnly = source->deformedOnly;
 
 	CustomData_copy_data(&source->vertData, &dm->vertData, 0, 0, numVerts);
@@ -1591,7 +1591,7 @@
 	DerivedMesh *dm = &cddm->dm;
 
 	/* this does a copy of all non mvert/medge/mface layers */
-	DM_from_template(dm, source, numVerts, numEdges, numFaces);
+	DM_from_template(dm, source, DM_TYPE_CDDM, numVerts, numEdges, numFaces);
 
 	/* now add mvert/medge/mface layers */
 	CustomData_add_layer(&dm->vertData, CD_MVERT, CD_CALLOC, NULL, numVerts);

Modified: trunk/blender/source/blender/blenkernel/intern/modifier.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/modifier.c	2010-01-06 12:00:53 UTC (rev 25776)
+++ trunk/blender/source/blender/blenkernel/intern/modifier.c	2010-01-06 12:05:46 UTC (rev 25777)
@@ -144,12 +144,15 @@
 	return 0;
 }
 
-static DerivedMesh *get_original_dm(Scene *scene, Object *ob, float (*vertexCos)[3], int orco)
+/* returns a derived mesh if dm == NULL, for deforming modifiers that need it */
+static DerivedMesh *get_dm(Scene *scene, Object *ob, EditMesh *em, DerivedMesh *dm, float (*vertexCos)[3], int orco)
 {
-	DerivedMesh *dm= NULL;
+	if(dm)
+		return dm;
 
 	if(ob->type==OB_MESH) {
-		dm = CDDM_from_mesh((Mesh*)(ob->data), ob);
+		if(em) dm= CDDM_from_editmesh(em, ob->data);
+		else dm = CDDM_from_mesh((Mesh*)(ob->data), ob);
 
 		if(vertexCos) {
 			CDDM_apply_vert_coords(dm, vertexCos);
@@ -185,6 +188,26 @@
 	return dm;
 }
 
+/* returns a cdderivedmesh if dm == NULL or is another type of derivedmesh */
+static DerivedMesh *get_cddm(Scene *scene, Object *ob, EditMesh *em, DerivedMesh *dm, float (*vertexCos)[3])
+{
+	if(dm && dm->type == DM_TYPE_CDDM)
+		return dm;
+
+	if(!dm) {
+		dm= get_dm(scene, ob, em, dm, vertexCos, 0);
+	}
+	else {
+		dm= CDDM_copy(dm);
+		CDDM_apply_vert_coords(dm, vertexCos);
+	}
+
+	if(dm)
+		CDDM_calc_normals(dm);
+	
+	return dm;
+}
+
 /***/
 
 static int noneModifier_isDisabled(ModifierData *md, int userRenderParams)
@@ -3770,37 +3793,26 @@
 					 ModifierData *md, Object *ob, DerivedMesh *derivedData,
       float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc)
 {
-	DerivedMesh *dm;
+	DerivedMesh *dm= get_cddm(md->scene, ob, NULL, derivedData, vertexCos);
 
-	if(derivedData) dm = CDDM_copy(derivedData);
-	else if(ob->type==OB_MESH) dm = CDDM_from_mesh(ob->data, ob);
-	else return;
-
-	CDDM_apply_vert_coords(dm, vertexCos);
-	CDDM_calc_normals(dm);
-
 	displaceModifier_do((DisplaceModifierData *)md, ob, dm,
 			     vertexCos, numVerts);
 
-	dm->release(dm);
+	if(dm != derivedData)
+		dm->release(dm);
 }
 
 static void displaceModifier_deformVertsEM(
 					   ModifierData *md, Object *ob, EditMesh *editData,
 	DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts)
 {
-	DerivedMesh *dm;
+	DerivedMesh *dm= get_cddm(md->scene, ob, editData, derivedData, vertexCos);
 
-	if(derivedData) dm = CDDM_copy(derivedData);
-	else dm = CDDM_from_editmesh(editData, ob->data);
-
-	CDDM_apply_vert_coords(dm, vertexCos);
-	CDDM_calc_normals(dm);
-
 	displaceModifier_do((DisplaceModifierData *)md, ob, dm,
 			     vertexCos, numVerts);
 
-	dm->release(dm);
+	if(dm != derivedData)
+		dm->release(dm);
 }
 
 /* UVProject */
@@ -4447,36 +4459,26 @@
 				       ModifierData *md, Object *ob, DerivedMesh *derivedData,
 	   float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc)
 {
-	DerivedMesh *dm;
+	DerivedMesh *dm= get_dm(md->scene, ob, NULL, derivedData, NULL, 0);
 
-	if(derivedData) dm = CDDM_copy(derivedData);
-	else dm = CDDM_from_mesh(ob->data, ob);
-
-	CDDM_apply_vert_coords(dm, vertexCos);
-	CDDM_calc_normals(dm);
-
 	smoothModifier_do((SmoothModifierData *)md, ob, dm,
 			   vertexCos, numVerts);
 
-	dm->release(dm);
+	if(dm != derivedData)
+		dm->release(dm);
 }
 
 static void smoothModifier_deformVertsEM(
 					 ModifierData *md, Object *ob, EditMesh *editData,
       DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts)
 {
-	DerivedMesh *dm;
+	DerivedMesh *dm= get_dm(md->scene, ob, editData, derivedData, NULL, 0);
 
-	if(derivedData) dm = CDDM_copy(derivedData);
-	else dm = CDDM_from_editmesh(editData, ob->data);
-
-	CDDM_apply_vert_coords(dm, vertexCos);
-	CDDM_calc_normals(dm);
-
 	smoothModifier_do((SmoothModifierData *)md, ob, dm,
 			   vertexCos, numVerts);
 
-	dm->release(dm);
+	if(dm != derivedData)
+		dm->release(dm);
 }
 
 /* Cast */
@@ -5027,38 +5029,34 @@
 				     ModifierData *md, Object *ob, DerivedMesh *derivedData,
 	 float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc)
 {
-	DerivedMesh *dm = derivedData;
+	DerivedMesh *dm = get_dm(md->scene, ob, NULL, derivedData, NULL, 0);
 	CastModifierData *cmd = (CastModifierData *)md;
 
-	if (!dm && ob->type == OB_MESH)
-		dm = CDDM_from_mesh(ob->data, ob);
-
 	if (cmd->type == MOD_CAST_TYPE_CUBOID) {
 		castModifier_cuboid_do(cmd, ob, dm, vertexCos, numVerts);
 	} else { /* MOD_CAST_TYPE_SPHERE or MOD_CAST_TYPE_CYLINDER */
 		castModifier_sphere_do(cmd, ob, dm, vertexCos, numVerts);
 	}
 
-	if (!derivedData && dm) dm->release(dm);
+	if(dm != derivedData)
+		dm->release(dm);
 }
 
 static void castModifier_deformVertsEM(
 				       ModifierData *md, Object *ob, EditMesh *editData,
 	   DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts)
 {
-	DerivedMesh *dm = derivedData;
+	DerivedMesh *dm = get_dm(md->scene, ob, editData, derivedData, NULL, 0);
 	CastModifierData *cmd = (CastModifierData *)md;
 
-	if (!dm && ob->type == OB_MESH)
-		dm = CDDM_from_editmesh(editData, ob->data);
-
 	if (cmd->type == MOD_CAST_TYPE_CUBOID) {

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list