[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